일반 사용자와 달리 서비스 계정은 비밀번호가 없습니다. 대신 서비스 계정은 인증을 위해 ECDSA 키 쌍을 사용합니다. RSA 키 쌍의 비공개 키를 사용하면 서비스 계정으로 인증할 수 있으므로 비공개 키에 대한 액세스 권한은 사용자 비밀번호를 알고 있는 것과 유사합니다. 비공개 키를 서비스 계정 키라고 합니다. 서비스 계정 키를 신중하게 관리하지 않으면 보안 위험이 발생할 수 있습니다.
서비스 계정 키와 관련된 주요 위협은 다음과 같습니다.
사용자 인증 정보 유출: 서비스 계정 키가 잘못되어 원래 의도하지 않은 장소에 저장될 수 있습니다. 악의적인 행위자가 유출된 서비스 계정 키를 사용해서 인증을 수행하고 사용자 환경에 액세스할 수 있습니다.
권한 에스컬레이션: 악의적인 행위자가 안전하지 않은 서비스 계정 키에 액세스하게 되면 이 키를 사용하여 권한을 에스컬레이션할 수 있습니다.
정보 공개: 서비스 계정 키로 인해 잘못해서 기밀 데이터가 공개될 수 있습니다.
부인 방지: 서비스 계정 키를 사용하여 인증하고 서비스 계정이 사용자를 대신하여 작업을 수행할 수 있도록 하면 악의적인 행위자가 해당 ID 및 작업을 숨길 수 있습니다.
이 페이지에서는 서비스 계정 키를 관리, 사용, 보호하기 위한 권장사항을 제시합니다.
사용자 인증 정보 유출 방지
사용자 이름 및 비밀번호와 마찬가지로 서비스 계정 키도 한 가지 형태의 사용자 인증 정보입니다. 사용자가 유효한 서비스 계정 키에 액세스할 수 있으면 해당 키를 사용해 인증을 수행하고 해당 서비스 계정에 액세스 권한이 부여된 리소스에 액세스할 수 있습니다.
악의적인 행위자는 유출된 비밀번호보다 서비스 계정 키를 더 유용하게 생각할 수 있습니다. 예를 들어 사용자 계정이 2단계 인증과 로그인 본인 확인 요청을 사용하도록 구성된 경우 유출된 비밀번호를 사용하여 로그인을 시도하는 것은 성공할 가능성이 낮습니다. 반면에, 서비스 계정에는 추가적인 로그인 인증을 거치지 않으므로 유출된 서비스 계정 키를 사용하여 인증하는 것이 성공할 가능성이 높습니다.
악의적인 행위자는 다음과 같은 방법으로 서비스 계정 키를 찾을 수 있습니다.
- 오픈소스 프로젝트의 소스 코드 저장소
- 위반된 서비스의 공개 데이터 덤프
악의적인 행위자는 공개 위치 외에도 도용된 비공개 위치에서 서비스 계정 키를 찾을 수 있습니다. 예를 들면 다음과 같습니다.
- 이메일 받은편지함
- 파일 공유
- 백업 스토리지
- 임시 파일 시스템 디렉터리
서비스 계정 키 유출 위험을 낮추는 한 가지 효과적인 방법은 순환되는 키 수를 줄이고 새로운 키 생성을 억제하는 것입니다. 다음 섹션에서는 순환되는 서비스 계정 키 개수를 제한하는 방법과 서비스 계정 유출 위험을 줄이는 데 도움이 되는 기타 방법들을 설명합니다.
임시 위치에 서비스 계정 키를 남겨두지 않기
서비스 계정 키를 만들 때 키를 보관하려는 위치로 즉시 이동합니다. 다운로드 폴더 또는 컴퓨터의 휴지통에 실수로 사본을 남겨두지 않았는지 확인하세요.
사용자 간에 서비스 계정 키를 전달하면 안 됨
서비스 계정 키가 필요한 애플리케이션을 배포할 때 사용자에게 서비스 계정 키 자체를 만들기 위한 권한이 없을 수 있습니다. 대신 다른 사람에게 서비스 계정 키를 만들도록 요청해야 할 수 있습니다.
소스 코드 저장소에 서비스 계정 키를 제출하면 안 됨
서비스 계정 키는 사용자 인증 정보이며 무단 액세스로부터 보호되어야 합니다. 서비스 계정 키를 소스 코드 저장소에 제출할 경우 승인되지 않은 사용자 및 악의적인 행위자들이 키에 액세스할 수 있는 위험이 증가합니다.
악의적인 행위자는 공개 소스 저장소의 소스 코드에서 유출된 키를 스캔할 수 있습니다.
이후에 사용자가 키를 먼저 확인하지 않고 비공개 소스 저장소를 공개 저장소로 전환할 수도 있습니다.
다른 팀 멤버가 소스 코드의 복사본을 자신의 워크스테이션에 저장할 수 있습니다.
서비스 계정 키를 사용하는 코드를 작할 때는 항상 키가 소스 저장소에 제출될 위험을 줄이기 위해 소스 코드와 서비스 계정 키를 분리해서 저장해야 합니다. 많은 경우에 개발 중 서비스 계정 키를 전혀 사용하지 않고 서비스 계정 키 대신 개인 사용자 인증 정보를 사용하면 이러한 위험을 더욱 줄일 수 있습니다.
프로그램 바이너리에 서비스 계정 키를 삽입하면 안 됨
서비스 계정 키는 특정 패턴과 일치하는 문자열이며, 다른 파일 또는 바이너리에 삽입하더라도 식별될 수 있습니다. 악의적인 행위자가 바이너리에 액세스할 수 있으면 바이너리에 삽입된 서비스 계정 키를 추출할 수 있습니다.
서버 측 애플리케이션의 프로그램 바이너리가 아티팩트 저장소에 호스팅되거나 디버깅 목적으로 개발자 워크스테이션에 복사될 수 있습니다. 서비스 계정 키를 프로그램 바이너리와 구분하면 바이너리에 액세스할 수 있는 사용자가 암시적으로 서비스 계정 사용자 인증 정보에 액세스하지 못하도록 방지하는 데 도움이 됩니다.
- 도구, 데스크톱 프로그램, 모바일 앱과 같은 클라이언트 측 애플리케이션의 경우 서비스 계정을 사용하지 마세요.
- 서버 측 애플리케이션의 경우 서비스 계정 키를 바이너리에 삽입하지 마세요. 대신 키를 애플리케이션 바이너리와 구분해서 관리합니다.
서비스 계정 키를 순환하여 유출된 키로 인한 보안 위험 감소
서비스 계정 키가 실수로 유출될 가능성을 줄일 수 있지만 이러한 위험 자체를 완전히 없애는 것은 어려울 수 있습니다.
키 순환은 기존 키를 새 키로 바꾼 다음 교체된 키를 무효화하는 프로세스입니다. 서비스 계정 키를 포함하여 관리하는 모든 키를 정기적으로 순환하는 것이 좋습니다.
서비스 계정 키를 순환하면 유출되거나 도난당한 키로 인한 위험을 줄일 수 있습니다. 키가 유출되면 악의적인 행위자가 키를 찾는 데 며칠 또는 몇 주가 걸릴 수 있습니다. 서비스 계정 키를 정기적으로 순환하면 악의적인 행위자가 키를 획득할 때까지 유출된 키가 무효화될 가능성이 높습니다.
만료 시간을 사용하여 키 자동 만료 허용
기본적으로 생성하는 서비스 계정 키의 만료 시간은 1년이며 삭제할 때까지 유효한 상태로 유지됩니다. 만료 시간을 직접 설정할 수도 있습니다. 서비스 계정 키의 만료 시간을 설정하면 영구 사용자 인증 정보의 수명을 줄여 보안 위험을 억제할 수 있습니다. 그러나 만료 시간을 설정하면 키가 만료되었을 때 워크로드가 실패할 수 있는 경우와 같이 만료 시간 설정에 따른 다른 위험이 있습니다.
서비스 계정 키가 필요한 시스템에 임시로 액세스해야 하는 경우 만료 시간을 사용하세요. 예를 들어 다음 작업을 수행할 때 만료 시간을 사용합니다.
- 서비스 계정 키로만 인증할 수 있는 애플리케이션을 위해 비프로덕션 환경에서 코드 개발
- 서비스 계정 키로만 인증할 수 있는 서드 파티 도구 사용
다음 시나리오에서는 만료 시간을 사용하지 마세요.
- 프로덕션 워크로드. 프로덕션 환경에서 서비스 계정 키가 만료되면 우발적인 서비스 중단이 발생할 수 있습니다. 대신 만료되지 않는 키를 사용하고 키 순환으로 수명 주기를 관리하세요.
- 지속적 통합(CI) 파이프라인과 같은 영구 액세스가 필요한 비프로덕션 워크로드
- 지정된 시간이 지난 후 키가 사용되지 않도록 방지하는 키 순환 시스템.
서비스 계정 키의 유효 기간을 제한하려면 프로젝트, 폴더, 조직에서 새로 생성되는 키에 만료 시간을 구성하면 됩니다. 기존 키에는 만료 시간이 적용되지 않습니다.
서비스 계정 키를 순환하는 프로세스를 설정하면 서비스 계정 키가 손상된 것으로 의심되는 경우 빠르게 조치를 취할 수 있습니다.
애플리케이션을 실행하는 각 머신에 전용 키 사용
의심스러운 활동에 대한 잠재적 요인을 줄이려면 애플리케이션 사본마다 개별 키를 만듭니다. 이렇게 하면 많은 서비스들이 감사 로그 기록을 추가하는 serviceAccountKeyName
필드를 사용하여 활동이 발생한 머신을 구별할 수 있습니다.