서비스 계정


이 페이지에서는 Compute Engine에서 서비스 계정의 작동 방법을 설명합니다.

가상 머신(VM) 인스턴스에 서비스 계정을 연결하는 방법에 대한 단계별 절차는 다음 문서 중 하나를 참조하세요.

서비스 계정을 만들고 관리하기 위한 권장사항은 서비스 계정 작업 권장사항 문서를 읽어보세요.

직접 사용해 보기

Google Cloud를 처음 사용하는 경우 계정을 만들어 실제 시나리오에서 Compute Engine의 성능을 평가할 수 있습니다. 신규 고객에게는 워크로드를 실행, 테스트, 배포할 수 있는 무료 크레딧 $300가 제공됩니다.

Compute Engine 무료로 사용해 보기

서비스 계정이란 무엇인가요?

서비스 계정은 사용자 대신 애플리케이션 또는 컴퓨팅 워크로드에 사용되는 특별한 유형의 계정입니다. 서비스 계정은 Identity and Access Management(IAM)에 따라 관리됩니다.

VM에서 서비스 계정을 사용할 때는 다음 사항에 유의하세요.

  • 동일한 서비스 계정을 여러 VM에 연결할 수 있지만 단일 VM에는 하나의 서비스 계정만 연결할 수 있습니다.
  • 동일한 서비스 계정을 여러 VM에 연결하는 경우 나중에 서비스 계정을 변경하면 서비스 계정을 사용하는 모든 VM이 영향을 받습니다. 이러한 변경에는 서비스 계정에 부여된 IAM 역할의 변경도 포함됩니다. 예를 들어 역할을 삭제하면 서비스 계정을 사용하는 모든 VM에서 이 역할로 부여된 권한이 손실됩니다.

Compute Engine의 서비스 계정 사용 방법

Compute Engine은 두 가지 유형의 서비스 계정을 사용합니다.

사용자가 관리하는 서비스 계정을 Compute Engine 인스턴스에 연결하면 인스턴스에서 실행 중인 애플리케이션에 사용자 인증 정보를 제공할 수 있습니다. 이러한 사용자 인증 정보는 애플리케이션에서 Google Cloud API에 인증하고 Google Cloud 리소스 액세스를 승인하는 데 사용됩니다. 사용자 관리 서비스 계정만 인스턴스에 연결할 수 있으며 인스턴스에는 서비스 계정을 하나만 연결할 수 있습니다. 인스턴스에 연결된 서비스 계정을 생성 시 또는 나중에 변경할 수 있습니다.

Google 관리 서비스 계정은 인스턴스에서 사용자를 대신하여 내부 프로세스에 액세스하는 데 사용됩니다.

또한 각 인스턴스에 연결한 서비스 계정에 따라 인스턴스와 주고받는 트래픽을 허용하거나 거부하는 방화벽 규칙을 만들 수 있습니다.

승인 확인 방법

Compute Engine 인스턴스에서 호스팅되는 애플리케이션에 제공되는 승인은 두 가지 개별 구성으로 제한됩니다. 하나는 연결된 서비스 계정에 부여된 역할이고, 다른 하나는 인스턴스에 설정된 액세스 범위입니다. 두 가지 구성 모두 액세스를 허용해야 인스턴스에서 실행되는 애플리케이션이 리소스에 액세스할 수 있습니다.

Cloud Storage에서 파일을 읽고 쓰는 앱이 잇고 Cloud Storage API에 먼저 인증해야 한다고 가정해보세요. cloud-platform 범위로 인스턴스를 만들고 서비스 계정을 인스턴스에 연결할 수 있습니다. 그 다음 Identity and Access Management(IAM) 역할을 서비스 계정에 부여하여 적절한 리소스에 대한 액세스 권한을 앱에 부여할 수 있습니다. 앱은 인스턴스, 이미지, 앱 코드에 보안 비밀 키 또는 사용자 인증 정보를 포함하지 않고 서비스 계정 사용자 인증 정보를 사용해서 Cloud Storage API에 인증을 수행합니다. 앱은 또한 서비스 계정에서 IAM 역할로 제공된 승인을 사용해서 리소스에 액세스합니다. 승인에 대한 자세한 내용은 이 페이지에서 승인을 참조하세요.

사용자 관리 서비스 계정

사용자 관리 서비스 계정에는 사용자가 명시적으로 만드는 신규 서비스 계정과 Compute Engine 기본 서비스 계정이 포함됩니다.

신규 서비스 계정

IAM을 사용하여 자체 서비스 계정을 만들고 관리할 수 있습니다. 계정을 만든 후 계정에 IAM 역할을 부여하고, 서비스 계정으로 실행되도록 인스턴스를 설정합니다. 연결된 서비스 계정을 사용하여 인스턴스에서 실행되는 앱은 계정의 사용자 인증 정보를 사용해서 다른 Google API에 요청을 수행할 수 있습니다.

새 서비스 계정을 만들고 설정하려면 사용자 관리 서비스 계정을 사용하는 VM 만들기를 참조하세요.

Compute Engine 기본 서비스 계정

Compute Engine API가 사용 설정된 새 프로젝트에는 다음 이메일이 포함된 Compute Engine 기본 서비스 계정이 있습니다.

PROJECT_NUMBER-compute@developer.gserviceaccount.com

Compute Engine 기본 서비스 계정에는 다음과 같은 속성이 있습니다.

  • 자동으로 생성된 이름 및 이메일 주소로 스스로 만들어지며, Compute Engine API를 사용 설정할 때 프로젝트에 추가됩니다. 사용자는 계정을 완전히 제어할 수 있습니다.
  • 이 동작을 사용 중지하지 않은 경우 IAM 기본 편집자 역할이 자동으로 부여됩니다. 서비스 계정의 역할을 수정하여 Google API에 대한 서비스 계정의 액세스 권한을 제어할 수 있습니다.
  • Google Cloud CLI 또는 Google Cloud 콘솔을 사용하여 만든 모든 VM에 기본적으로 연결됩니다. VM을 만들 때 다른 서비스 계정을 지정하거나 VM에 서비스 계정을 연결하지 않도록 명시적으로 지정하여 이 동작을 재정의할 수 있습니다.

이 서비스 계정을 프로젝트에서 사용 중지하거나 삭제할 수 있지만 이렇게 하면 서비스 계정의 사용자 인증 정보를 사용하는 모든 애플리케이션이 실패할 수 있습니다. 실수로 Compute Engine 기본 서비스 계정을 삭제한 경우 30일 이내에 계정을 복구할 수 있습니다. 자세한 내용은 서비스 계정 삭제 및 삭제 취소를 참조하세요.

Compute Engine 기본 서비스 계정이 삭제된 지 30일이 초과되었으면 기본 서비스 계정 문제 해결의 절차에 따라 서비스 계정을 복구할 수 있습니다.

Google 관리형 서비스 계정

이러한 서비스 계정(서비스 에이전트라고도 함)은 Google에서 생성 및 관리되고 프로젝트에 자동으로 할당됩니다. 이러한 계정은 서로 다른 Google 서비스를 나타내며 각 계정에는 Google Cloud 프로젝트에 대한 일정 수준의 액세스 권한이 포함됩니다.

Google 관리 서비스 계정은 Compute Engine 인스턴스에 연결할 수 없습니다.

Google API 서비스 에이전트

기본 서비스 계정과는 별도로, Compute Engine으로 사용 설정된 모든 프로젝트에는 다음 이메일로 식별 가능한 Google API 서비스 에이전트가 제공됩니다.

PROJECT_NUMBER@cloudservices.gserviceaccount.com

이 서비스 계정은 사용자를 대신하여 내부 Google 프로세스를 실행하도록 특별히 설계되었습니다. 이 계정은 Google이 소유하므로 Google Cloud 콘솔의 서비스 계정 섹션에 나열되지 않습니다. 기본적으로 이 계정에는 프로젝트에 대한 프로젝트 편집자 역할이 자동으로 부여되며 계정은 Google Cloud 콘솔의 IAM 섹션에 나열됩니다. 이 서비스 계정은 프로젝트가 삭제될 때만 삭제됩니다. 그러나 이 계정에 부여된 역할을 변경할 수 있으며 프로젝트에 대한 모든 액세스 권한을 취소할 수 있습니다.

일부 리소스는 이 서비스 계정과 이 서비스 계정에 부여된 기본 편집자 권한에 의존합니다. 예를 들어 관리형 인스턴스 그룹과 자동 확장은 이 계정의 사용자 인증 정보를 사용하여 인스턴스를 만들고 삭제하고 관리합니다. 서비스 계정의 권한을 취소하거나 인스턴스 생성 권한을 부여하지 않도록 권한을 수정할 경우, 관리형 인스턴스 그룹과 자동 확장이 작동을 멈추게 됩니다.

따라서 역할 권장사항에서 명시적으로 수정하라고 제안하지 않는 한 이 서비스 계정의 역할을 수정하지 않는 것이 좋습니다.

Compute Engine 서비스 에이전트

Compute Engine API가 사용 설정된 모든 프로젝트에는 다음 이메일이 포함된 Compute Engine 서비스 에이전트가 있습니다.

service-PROJECT_NUMBER@compute-system.iam.gserviceaccount.com

이 서비스 계정은 Compute Engine이 프로젝트에서 서비스 업무를 수행하도록 특별히 설계되었습니다. 이 계정은 Google Cloud 프로젝트에 부여되는 서비스 에이전트 IAM 정책에 의존합니다. 또한 이 계정은 Compute Engine이 VM 인스턴스에서 고객이 소유한 서비스 계정에 액세스할 때 사용하는 서비스 계정이기도 합니다. Google 소유 계정이더라도 이 계정은 프로젝트에 따라 달라집니다. Google에서 제공하는 역할 부여 포함을 선택하지 않으면 이 계정은 콘솔의 IAM 페이지에 표시되지 않습니다. 기본적으로 이 계정은 프로젝트에서 compute.serviceAgent 역할을 자동으로 부여받습니다.

이 서비스 계정은 프로젝트를 삭제할 때만 삭제됩니다. 이 계정에 부여된 역할을 변경할 수 있으며 프로젝트에 대한 계정의 모든 액세스 권한을 취소할 수 있습니다. 이 서비스 계정의 권한을 취소하거나 변경하면 Compute Engine이 VM에서 사용자 서비스 계정의 ID에 액세스하지 못하게 되며 VM 내부에서 실행되는 소프트웨어가 중단될 수 있습니다.

따라서 이 서비스 계정의 역할을 최대한 수정하지 않는 것이 좋습니다.

서비스 계정을 인스턴스에 연결

애플리케이션에 불필요하게 많은 권한이 제공되지 않도록, 사용자가 관리하는 서비스 계정을 만들고 애플리케이션이 올바르게 작동하는 데 필요한 역할만 부여한 후 Compute Engine 인스턴스에 연결하는 것이 좋습니다. 그런 다음 코드에서 애플리케이션 기본 사용자 인증 정보를 사용하여 서비스 계정이 제공하는 사용자 인증 정보로 인증할 수 있습니다.

인스턴스를 만들 때 또는 나중에 Compute Engine 계정에 서비스 계정을 연결할 수 있습니다. 서비스 계정은 인스턴스에 한 번에 하나만 연결할 수 있습니다. 서비스 계정이 이미 연결된 인스턴스에 서비스 계정을 연결할 경우 이전 서비스 계정이 해당 인스턴스에 더 이상 사용되지 않습니다.

Compute Engine 인스턴스에 서비스 계정을 연결할 때는 또한 인스턴스에 설정된 범위가 올바른지 확인해야 합니다. 그렇지 않으면 앱이 필요한 모든 앱에 액세스하지 못할 수 있습니다. 자세한 내용은 이 페이지의 액세스 범위를 참조하세요.

Compute Engine 인스턴스에 서비스 계정을 연결하는 방법에 대한 단계별 절차는 다음 문서 중 하나를 참조하세요.

승인

인스턴스가 서비스 계정으로 실행되도록 설정하면 서비스 계정에 부여한 IAM 역할에 따라 서비스 계정의 액세스 수준이 결정됩니다. 서비스 계정에 IAM 역할이 없으면 해당 인스턴스에서 서비스 계정을 사용하여 리소스에 액세스할 수 없습니다.

또한 인스턴스의 액세스 범위는 인스턴스에서 클라이언트 라이브러리 및 gcloud CLI를 통해 수행되는 요청의 기본 OAuth 범위를 지정합니다. 따라서 액세스 범위는 OAuth를 통해 인증할 때 API 메서드에 대한 액세스 권한을 잠재적으로 더 제한합니다. 하지만 gRPC와 같은 다른 인증 프로토콜로 확장되지는 않습니다.

인스턴스에 전체 cloud-platform 액세스 범위를 설정한 후 IAM 역할을 사용하여 서비스 계정의 액세스 권한을 제어하는 방법이 권장됩니다.

기본적으로,

  • IAM은 서비스 계정에 부여된 IAM 역할에 따라 API에 대한 액세스 권한을 제한합니다.
  • 액세스 범위는 API 메서드에 대한 액세스를 잠재적으로 더 제한합니다.

액세스 범위와 IAM 역할에 대한 자세한 내용은 아래 섹션을 참조하세요.

IAM 역할

서비스 계정에서 관련 API 메서드에 액세스하려면 서비스 계정에 적절한 IAM 역할을 부여해야 합니다.

예를 들어 Cloud Storage 객체 관리 또는 Cloud Storage 버킷 관리 또는 이 두 가지를 모두 관리할 수 있도록 서비스 계정에 IAM 역할을 부여하면 계정은 이러한 역할에서 부여된 권한으로 제한됩니다.

서비스 계정에 IAM 역할을 부여하면 해당 서비스 계정이 연결된 인스턴스에서 실행되는 모든 애플리케이션은 해당 역할이 승인하는 권한을 갖게 됩니다.

유의사항:

  • 일부 IAM 역할은 베타 버전입니다.

    원하는 액세스 수준에 대해 사전 정의된 역할이 없으면 커스텀 역할을 만들고 부여할 수 있습니다.

  • 액세스를 승인하려면 인스턴스에 액세스 범위를 설정해야 합니다.

    서비스 계정의 액세스 수준은 서비스 계정에 부여된 역할에 따라 결정되는 반면, 인스턴스의 액세스 범위는 인스턴스에서 클라이언트 라이브러리 및 gcloud CLI를 통해 수행되는 요청의 기본 OAuth 범위를 지정합니다. 따라서 액세스 범위는 OAuth를 통해 인증할 때 API 메서드에 대한 액세스 권한을 잠재적으로 더 제한합니다.

액세스 범위

액세스 범위는 인스턴스에 승인을 지정하는 기존 방법입니다. gcloud CLI 또는 클라이언트 라이브러리의 요청에 사용되는 기본 OAuth 범위를 정의합니다. (액세스 범위는 gRPC를 사용하여 수행된 호출에 적용되지 않습니다.)

액세스 범위는 인스턴스별로 적용됩니다. 인스턴스를 만들 때 액세스 범위를 설정합니다. 액세스 범위는 인스턴스 수명 동안에만 유지됩니다.

일반적으로 각 API 메서드 문서에는 메서드에 필요한 범위가 나열되어 있습니다. 예를 들어 instances.insert 메서드는 승인 섹션에 유효한 범위의 목록을 제공합니다.

서비스 계정이 속한 프로젝트에서 관련 API를 사용 설정하지 않았으면 액세스 범위가 적용되지 않습니다. 예를 들어 가상 머신 인스턴스에서 Cloud Storage에 액세스 범위를 부여하면 프로젝트에서 Cloud Storage API를 사용 설정한 경우에만 인스턴스가 Cloud Storage API를 호출할 수 있습니다.

기본 범위

새 Compute Engine 인스턴스를 만들면 자동으로 다음 액세스 범위가 구성됩니다.

  • Cloud Storage에 대한 읽기 전용 액세스:
    https://www.googleapis.com/auth/devstorage.read_only
  • Compute Engine 로그를 작성할 수 있는 쓰기 액세스:
    https://www.googleapis.com/auth/logging.write
  • Google Cloud 프로젝트에 측정항목 데이터를 게시할 수 있는 쓰기 액세스:
    https://www.googleapis.com/auth/monitoring.write
  • Google Cloud Endpoints(알파)에 필요한 Service Management 기능에 대한 읽기 전용 액세스:
    https://www.googleapis.com/auth/service.management.readonly
  • Google Cloud Endpoints(알파)에 필요한 Service Control 기능에 대한 읽기/쓰기 액세스:
    https://www.googleapis.com/auth/servicecontrol
  • VM에서 실행되는 애플리케이션이 프로젝트에 trace 데이터를 쓸 수 있는 Cloud Trace에 대한 쓰기 액세스 권한.
    https://www.googleapis.com/auth/trace.append

범위 권장사항

다양한 액세스 범위 중에서 선택할 수 있지만, 권장되는 방법은 Google Cloud에 대한 OAuth 범위인 cloud-platform 액세스 범위를 설정한 후 IAM 역할을 부여하여 서비스 계정의 액세스 권한을 제어하는 것입니다.

https://www.googleapis.com/auth/cloud-platform

범위 예시

범위 권장사항에 따라 인스턴스에서 cloud-platform 액세스 범위를 사용 설정한 후 다음과 같은 사전 정의된 IAM 역할을 부여했습니다.

  • roles/compute.instanceAdmin.v1
  • roles/storage.objectViewer
  • roles/compute.networkAdmin

그러면 서비스 계정은 이러한 세 가지 역할에 포함된 권한만 갖습니다. 해당 서비스 계정을 가장하는 애플리케이션은 Google Cloud 액세스 범위에 관계없이 해당 역할에서 벗어나는 작업을 수행할 수 없습니다.

반면 Cloud Storage 읽기 전용 범위(https://www.googleapis.com/auth/devstorage.read_only)와 같은 더 제한적인 범위를 인스턴스에 부여하고 roles/storage.objectAdmin 관리자 역할을 서비스 계정에 설정하면 기본적으로 gcloud CLI와 클라이언트 라이브러리의 요청에서는 서비스 계정에 roles/storage.ObjectAdmin 역할을 부여한 경우에도 해당 인스턴스의 Cloud Storage 객체를 관리할 수 없습니다. 이는 Cloud Storage 읽기 전용 범위가 인스턴스의 Cloud Storage 데이터 조작을 승인하지 않기 때문입니다.

액세스 범위의 예시는 다음과 같습니다.

  • https://www.googleapis.com/auth/cloud-platform. 지정된 Google Cloud 프로젝트의 Google Cloud 서비스에서 데이터를 보고 관리합니다.
  • https://www.googleapis.com/auth/compute. Compute Engine 메서드에 대한 전체 제어 액세스 권한입니다.
  • https://www.googleapis.com/auth/compute.readonly. Compute Engine 메서드에 대한 읽기 전용 액세스 권한입니다.
  • https://www.googleapis.com/auth/devstorage.read_only. Cloud Storage에 대한 읽기 전용 액세스 권한입니다.
  • https://www.googleapis.com/auth/logging.write. Compute Engine 로그에 대한 쓰기 액세스 권한입니다.

다음 단계