서비스 계정 이해

배경 정보

서비스 계정은 개별 최종 사용자가 아닌 애플리케이션 또는 가상 머신에 속한 특별한 유형의 Google 계정입니다. 애플리케이션이 서비스 계정 ID를 사용하여 Google API를 호출하므로 사용자가 직접 관여하지 않습니다. 서비스 계정은 Google에 인증하는 데 사용되는 서비스 계정 키의 쌍을 0개 이상 보유할 수 있습니다.

서비스 계정을 사용하기로 한 경우 다음 질문을 통해 서비스 계정의 용도를 이해할 수 있습니다.

  • 서비스 계정은 어떤 리소스에 액세스할 수 있나요?
  • 서비스 계정에 어떤 권한이 필요한가요?
  • 서비스 계정 ID를 사용하는 코드가 실행되는 곳은 Google Cloud Platform과 온프레미스 환경 중 어디인가요?

다음 플로 차트를 사용하여 위 질문에 대한 대답을 알아보세요.

서비스 계정 플로차트

IAM 서비스 계정의 특징 중 하나는 이를 리소스이자 ID로 취급할 수 있다는 점입니다.

서비스 계정을 ID로 취급하는 경우 서비스 계정에 역할을 부여하여 프로젝트와 같은 리소스에 액세스하도록 지원할 수 있습니다.

서비스 계정을 리소스로 취급하는 경우 사용자에게 해당 서비스 계정에 액세스할 권한을 부여할 수 있습니다. 사용자가 해당 서비스 계정에 액세스할 수 있도록 소유자, 편집자, 뷰어, 서비스 계정 사용자 역할을 부여할 수 있습니다.

서비스 계정에 액세스 권한 부여

리소스에 액세스하도록 서비스 계정에 액세스 권한을 부여하는 것은 다른 ID에 대한 액세스 권한을 부여하는 것과 유사합니다. 예를 들어 Google Compute Engine에서 실행 중인 애플리케이션에 Google Cloud Storage에 객체를 생성할 권한 부여하려면 해당 애플리케이션에 서비스 계정을 만들고 저장소 객체 생성자 역할을 부여합니다. 이 예를 다이어그램으로 나타내면 다음과 같습니다.

서비스 계정 플로차트

서비스 계정에 역할 부여하기에 대해 자세히 알아보세요.

서비스 계정 권한으로 작업

예를 들어 장기 실행 중인 작업이 있으며 직원에게 이를 시작할 권한이 있다고 가정해보겠습니다. 작업을 마지막으로 시작한 직원이 퇴사할 때 작업이 종료되는 일이 발생해서는 안 됩니다.

이 문제를 해결하는 방법은 작업을 시작하고 중지할 서비스 계정을 만드는 것입니다. 이를 위해 수행해야 하는 단계는 다음과 같습니다.

  1. 서비스 계정을 만듭니다.

  2. 작업을 시작할 권한이 필요한 직원에게 해당 서비스 계정의 서비스 계정 사용자(iam.serviceAccountUser) 역할을 부여합니다. 이 시나리오에서 서비스는 리소스입니다.

  3. 같은 직원에게 Compute 인스턴스 관리자(roles/compute.instanceAdmin.v1) 역할을 부여합니다.

  4. 이제 직원은 해당 서비스 계정을 실행하는 Compute Engine 인스턴스를 만들고 연결하고 서비스 계정을 사용하여 작업을 시작할 수 있습니다. 예:

    gcloud compute instances create my-instance --scopes=cloud-platform \
    --service-account=my-service-account@test9q.iam.gserviceaccount.com \
    --zone=us-central1-a
    

자세한 내용은 serviceAccountUser 역할을 참조하세요.

Google Cloud Platform으로 데이터 이전

다른 클라우드 제공업체를 통해 일부 데이터를 처리하며, 처리된 데이터를 Google Cloud Platform으로 이전하려고 한다고 가정해보겠습니다. 외부 클라우드의 가상 머신에서 서비스 계정을 사용하여 Google Cloud Platform으로 데이터를 내보낼 수 있습니다. 이를 위해서는 서비스 계정을 만들 때 서비스 계정 키를 만들고 다운로드한 다음 외부 프로세스에서 해당 키를 사용하여 Cloud Platform API를 호출해야 합니다.

서비스 계정 상태 확인

시간이 지남에 따라 더 많은 서비스 계정이 생겨나면 어떤 서비스 계정이 어떤 용도로 사용되는지 파악하기 어려울 수 있습니다.

서비스 계정의 표시 이름은 서비스 계정의 목적이나 서비스 계정 담당자와 같이 서비스 계정에 대한 추가 정보를 파악하는 데 유용한 방법입니다. 새로운 서비스 계정의 경우 서비스 계정을 만들 때 표시 이름을 입력할 수 있습니다. 기존 서비스 계정의 경우 serviceAccounts.update() 메소드를 사용하여 표시 이름을 수정합니다.

서비스 계정에 최소한의 권한 부여

서비스 계정에는 목표를 달성하는 데 필요한 최소한의 권한 모음만 부여해야 합니다. 특정 리소스를 위해 서비스 계정에 역할 부여하기에 대해 자세히 알아보세요.

사용자에게 서비스 계정 액세스 권한을 부여하는 경우 해당 사용자가 서비스 계정에 권한이 부여된 모든 리소스에 액세스할 수 있음에 유의하세요. 따라서 서비스 계정의 권한은 신중히 구성해야 합니다. 즉, 팀원 중 누가 서비스 계정 권한으로 작업할지를 엄격하게 관리해야 합니다.

App Engine 및 Compute Engine 인스턴스(예: App Engine 배포자 또는 Compute Instance 관리자)를 업데이트하기 위한 IAM 역할이 있는 사용자는 이러한 인스턴스 실행에 사용되는 서비스 계정으로 코드를 효과적으로 실행할 수 있으며 서비스 계정이 액세스할 수 있는 모든 리소스에 간접적으로 액세스할 수 있습니다. 마찬가지로 Compute Engine 인스턴스에 대한 SSH 액세스 역시 해당 인스턴스로 코드를 실행할 수 있는 기능을 제공할 수 있습니다.

서비스 계정 키 관리

서비스 계정 키에는 다음 두 가지 유형이 있습니다.

  • GCP 관리 키. 이 키는 App Engine 및 Compute Engine과 같은 Cloud Platform 서비스에서 사용됩니다. 이 키는 다운로드할 수 없습니다. 해당 키는 Google에서 보관하며 대략 1주일 주기로 키를 순환합니다.

  • 사용자 관리 키. 이 키는 사용자가 만들고 다운로드하고 관리합니다. 해당 키는 만들어진 후 10년이 지나면 만료됩니다.

사용자 관리 키의 경우 다음과 같은 키 관리 요구사항을 처리할 프로세스를 갖추고 있는지 확인해야 합니다.

  • 키 저장
  • 키 배포
  • 키 해지
  • 키 순환
  • 키 무단 사용 방지
  • 키 복구

키에 액세스할 수 있는 사용자는 누구나 서비스 계정을 통해 리소스에 액세스할 수 있습니다. 항상 개발자가 소스 코드에 키를 추가하거나 이를 다운로드 디렉토리에 남겨두지 않도록 하세요.

키 보안을 강화하려면 아래의 안내를 따릅니다.

  • IAM 서비스 계정 API를 사용하여 서비스 계정 키를 자동으로 순환합니다. 새로운 키를 만든 후 애플리케이션에서 새로운 키를 사용하도록 전환한 다음 이전 키를 삭제하여 키를 순환할 수 있습니다. 자동으로 순환하도록 하려면 serviceAccount.keys.create()serviceAccount.keys.delete() 메소드를 함께 사용하세요. GCP 관리 키는 대략 1주일 주기로 순환합니다.

  • serviceAccount.keys.list() 메소드를 사용하여 서비스 계정 및 키를 감사합니다.

Compute Engine에서 서비스 계정 사용

Compute Engine 인스턴스는 다른 Cloud Platform 리소스에 액세스할 수 있도록 서비스 계정으로 실행해야 합니다. Compute Engine 인스턴스의 보안을 위해 다음 사항을 고려하세요.

  • 같은 프로젝트에 서비스 계정이 서로 다른 가상 머신을 만들 수 있습니다. 이미 만들어진 가상 머신 서비스 계정을 변경하려면 instances.setServiceAccount 메소드를 사용하세요.

  • 서비스 계정에 IAM 역할을 부여하여 서비스 계정에서 액세스할 수 있는 항목을 정의할 수 있습니다. 많은 경우 더 이상 범위에 의존할 필요가 없습니다. 이렇게 하면 인스턴스를 다시 만들지 않고도 가상 머신 서비스 계정의 권한을 수정할 수 있는 장점이 있습니다.

  • 인스턴스는 Cloud Platform 리소스에 액세스하기 위해 서비스 계정에 의존하므로, 실행 중인 인스턴스에서 아직 서비스 계정을 사용 중이라면 해당 계정을 삭제하지 마세요. 서비스 계정을 삭제하면 인스턴스가 작업에 실패할 수 있습니다.

권장사항

  • 서비스 계정 권한으로 작업할 사용자를 제한합니다. 서비스 계정 사용자 역할이 있는 사용자는 서비스 계정이 액세스할 수 있는 모든 리소스에 간접적으로 액세스할 수 있습니다. 따라서 사용자에게 서비스 계정 사용자 역할을 부여할 때는 주의해야 합니다.

  • 목표를 달성하는 데 필요한 최소한의 권한 모음만 서비스 계정에 부여합니다. 특정 리소스를 위해 서비스 계정에 역할 부여하기에 대해 자세히 알아보세요.

  • 서비스별로 필요한 권한만 부여하여 각각 서비스 계정을 만듭니다.

  • 서비스 계정의 표시 이름을 사용하여 서비스 계정을 추적합니다. 서비스 계정을 만들 때 서비스 계정의 목적을 나타내는 표시 이름을 입력하세요.

  • 서비스 계정의 이름 지정 규칙을 정의합니다.

  • 사용자 관리 서비스 계정 키의 순환을 자동화하는 프로세스를 구현합니다.

  • IAM 서비스 계정 API를 활용하여 키 순환을 구현합니다.

  • serviceAccount.keys.list() 메소드 또는 콘솔의 로그 뷰어 페이지를 사용하여 서비스 계정 및 키를 감사합니다.

  • Google App Engine 또는 Google Compute Engine에서 실행 중인 인스턴스에서 사용 중인 서비스 계정은 삭제하지 않습니다.

이 페이지가 도움이 되었나요? 평가를 부탁드립니다.

다음에 대한 의견 보내기...

Cloud IAM 문서