일부 Google Cloud 리소스의 경우 리소스에서 기본 ID로 사용하는 사용자 관리 서비스 계정을 지정할 수 있습니다. 이 프로세스는 서비스 계정을 리소스에 연결하거나 서비스 계정과 리소스를 연결한다고 알려져 있습니다. 리소스에서 실행되는 코드는 Google Cloud 서비스와 리소스에 액세스할 때 리소스에 연결된 서비스 계정을 ID로 사용합니다. 예를 들어 서비스 계정을 Compute Engine 인스턴스에 연결하고 인스턴스의 애플리케이션에서 클라이언트 라이브러리를 사용하여 Google Cloud API를 호출하는 경우 애플리케이션은 인증과 승인에 연결된 서비스 계정을 자동으로 사용합니다.
이 페이지에서는 리소스에 연결할 수 있도록 서비스 계정을 구성하는 방법을 설명합니다.
시작하기 전에
Enable the IAM and Resource Manager APIs.
IAM에서 서비스 계정 작동 방법을 이해해야 합니다.
필요한 역할
서비스 계정을 리소스에 연결하는 데 필요한 권한을 얻으려면 관리자에게 서비스 계정에 대한 서비스 계정 사용자(roles/iam.serviceAccountUser
) IAM 역할을 부여해달라고 요청하세요.
역할 부여에 대한 자세한 내용은 프로젝트, 폴더, 조직에 대한 액세스 관리를 참조하세요.
이 사전 정의된 역할에는 서비스 계정을 리소스에 연결하는 데 필요한 iam.serviceAccounts.actAs
권한이 포함되어 있습니다.
커스텀 역할이나 다른 사전 정의된 역할을 사용하여 이 권한을 부여받을 수도 있습니다.
리소스에 서비스 계정 연결
대부분의 경우 리소스를 만들 때 서비스 계정을 리소스에 연결해야 합니다. 리소스를 만든 후에는 리소스에 연결된 서비스 계정을 변경할 수 없습니다. Compute Engine 인스턴스에는 이 규칙이 적용되지 않습니다. 필요에 따라 인스턴스에 연결된 서비스 계정을 변경할 수 있습니다.
리소스에 서비스 계정을 연결하기 전에 서비스 계정을 구성해야 합니다. 이 프로세스는 서비스 계정과 리소스가 같은 프로젝트에 있는지 아니면 다른 프로젝트에 있는지에 따라 다릅니다. 서비스 계정을 구성한 후에는 리소스를 만들고 해당 리소스에 서비스 계정을 연결할 수 있습니다.
동일한 프로젝트의 리소스 구성
동일한 프로젝트의 다른 리소스에 서비스 계정을 연결하기 전에 다른 주 구성원에게 역할을 부여하는 것처럼 서비스 계정에 역할을 부여하여 적절한 리소스에 액세스할 수 있도록 합니다.
다른 프로젝트의 리소스 구성
경우에 따라 다른 프로젝트에 있는 리소스에 서비스 계정을 연결해야 할 수도 있습니다. 예를 들어 단일 프로젝트의 모든 서비스 계정을 생성하는 경우 서비스 계정 중 하나를 다른 프로젝트의 새 리소스에 연결해야 할 수 있습니다.
다른 프로젝트의 리소스에 서비스 계정을 연결하기 전에 다음을 수행하세요.
- 서비스 계정이 있는 프로젝트에서 이 페이지의 단계에 따라 프로젝트 간 서비스 계정 연결을 사용 설정합니다.
- 리소스를 만들 프로젝트를 식별합니다.
서비스 계정을 연결할 리소스 유형과 해당 유형의 리소스를 소유한 서비스를 확인합니다.
예를 들어 Pub/Sub 구독을 만드는 경우 Pub/Sub는 리소스를 소유한 서비스입니다.
서비스에 대한 서비스 에이전트의 이메일 주소를 찾습니다.
서비스마다 다른 서비스 에이전트가 사용됩니다. 자세한 내용은 서비스 에이전트를 참조하세요.
서비스 에이전트에 서비스 계정 토큰 생성자 역할(
roles/iam.serviceAccountTokenCreator
)을 부여합니다.콘솔
Google Cloud Console에서 서비스 계정 페이지로 이동합니다.
리소스에 연결할 서비스 계정을 소유한 프로젝트를 선택합니다.
리소스에 연결할 서비스 계정의 이메일 주소를 클릭합니다.
권한 탭으로 이동하고 이 서비스 계정에 대한 액세스 권한이 있는 주 구성원 섹션을 찾습니다.
액세스 권한 부여를 클릭한 후 서비스 에이전트의 이메일 주소를 입력합니다.
역할 선택을 클릭하고
Service Account Token Creator
를 입력한 후 역할을 클릭합니다.저장을 클릭하여 변경사항을 저장합니다.
선택사항: 다른 서비스 에이전트에 역할을 부여해야 하는 경우 이전 단계를 반복합니다.
gcloud
gcloud iam service-accounts add-iam-policy-binding
명령어를 사용합니다.gcloud iam service-accounts add-iam-policy-binding \ SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com \ --member=serviceAccount:SERVICE_AGENT_EMAIL \ --role=roles/iam.serviceAccountTokenCreator
다음 값을 바꿉니다.
SERVICE_ACCOUNT_NAME
: 리소스에 연결할 사용자 관리 서비스 계정의 이름.PROJECT_ID
: 사용자 관리 서비스 계정이 있는 프로젝트 ID.SERVICE_AGENT_EMAIL
: 서비스 에이전트의 이메일 주소.
이 명령어는 사용자 관리 서비스 계정의 업데이트된 허용 정책을 출력합니다.
선택사항: 다른 서비스 에이전트에 역할을 부여해야 하는 경우 명령어를 다시 실행합니다.
REST
이 역할을 부여하려면 읽기-수정-쓰기 패턴을 사용하여 사용자 관리 서비스 계정의 허용 정책을 업데이트합니다.
먼저 사용자 관리 서비스 계정의 허용 정책을 읽습니다.
projects.serviceAccounts.getIamPolicy
메서드는 서비스 계정에 대한 허용 정책을 반환합니다.요청 데이터를 사용하기 전에 다음을 바꿉니다.
PROJECT_ID
: Google Cloud 프로젝트 ID. 프로젝트 ID는my-project
같은 영숫자 문자열입니다.-
USER_SA_NAME
: 리소스에 바인딩할 사용자 관리 서비스 계정의 이름.
HTTP 메서드 및 URL:
POST https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts/USER_SA_NAME@PROJECT_ID.iam.gserviceaccount.com:getIamPolicy
JSON 요청 본문:
{ "requestedPolicyVersion": 3 }
요청을 보내려면 다음 옵션 중 하나를 펼칩니다.
다음과 비슷한 JSON 응답이 표시됩니다.
{ "version": 1, "etag": "BwWl3KCTUMY=", "bindings": [ { "role": "roles/iam.serviceAccountUser", "members": [ "serviceAccount:my-service-account@my-project.iam.gserviceaccount.com" ] } ] }
다음으로 서비스 계정 토큰 서비스 생성자 역할을 서비스 에이전트에 부여하도록 허용 정책을 수정합니다.
{ "version": 1, "etag": "BwWl3KCTUMY=", "bindings": [ { "role": "roles/iam.serviceAccountTokenCreator", "members": [ "serviceAccount:SERVICE_AGENT_EMAIL" ] }, { "role": "roles/iam.serviceAccountUser", "members": [ "serviceAccount:SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com" ] } ] }
다음을 바꿉니다.
SERVICE_AGENT_EMAIL
: 서비스 에이전트의 이메일 주소.SERVICE_ACCOUNT_NAME
: 사용자 관리 서비스 계정의 이름.PROJECT_ID
: 사용자 관리 서비스 계정이 있는 프로젝트 ID.
마지막으로 업데이트된 허용 정책을 작성합니다.
projects.serviceAccounts.setIamPolicy
메서드는 서비스 계정에 대한 허용 정책을 업데이트합니다.요청 데이터를 사용하기 전에 다음을 바꿉니다.
PROJECT_ID
: Google Cloud 프로젝트 ID. 프로젝트 ID는my-project
같은 영숫자 문자열입니다.-
USER_SERVICE_ACCOUNT_NAME
: 리소스에 바인딩할 사용자 관리 서비스 계정의 이름. -
SERVICE_AGENT_EMAIL
: 사용자 관리 서비스 계정의 액세스 토큰을 만들 서비스 에이전트의 이메일 주소.
HTTP 메서드 및 URL:
POST https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts/SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com:setIamPolicy
JSON 요청 본문:
{ "policy": { "version": 1, "etag": "BwWl3KCTUMY=", "bindings": [ { "role": "roles/iam.serviceAccountTokenCreator", "members": [ "serviceAccount:SERVICE_AGENT_EMAIL" ] }, { "role": "roles/iam.serviceAccountUser", "members": [ "serviceAccount:SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com" ] } ] } }
요청을 보내려면 다음 옵션 중 하나를 펼칩니다.
다음과 비슷한 JSON 응답이 표시됩니다.
{ "version": 1, "etag": "BwWo331TkHE=", "bindings": [ { "role": "roles/iam.serviceAccountTokenCreator", "members": [ "serviceAccount:SERVICE_AGENT_EMAIL" ] }, { "role": "roles/iam.serviceAccountUser", "members": [ "serviceAccount:my-service-account@my-project.iam.gserviceaccount.com" ] } ] }
새 리소스에 서비스 계정 연결
사용자 관리 서비스 계정을 구성한 후에는 새 리소스를 만들고 해당 리소스에 서비스 계정을 연결할 수 있습니다. 적절한 프로젝트에 새 리소스를 만들어야 합니다.
만들려는 리소스 유형에 대한 안내를 참조하세요.
리소스를 만들 때 서비스 계정 연결 | |
---|---|
AI Platform Prediction | 모델 버전 |
AI Platform Training | 작업 |
App Engine 표준 환경 | 앱 버전 |
App Engine 가변형 환경 | 앱 버전 |
Cloud Composer | 환경 |
Cloud Run Functions | Cloud Run 함수 |
Cloud Life Sciences | 파이프라인 |
Cloud Run | 서비스 |
Cloud Scheduler | 작업 |
Cloud Source Repositories | |
Compute Engine | |
Dataflow | 작업 |
Datalab | 인스턴스 |
Dataproc | 클러스터 |
Eventarc | 트리거 |
Google Kubernetes Engine | |
Notebooks | 메모장 인스턴스 |
Pub/Sub | 구독 |
Vertex AI | |
워크플로 | Workflows |
리소스를 만들고 서비스 계정을 리소스에 연결한 후 서비스 계정에 역할을 부여하여 해당 리소스에 액세스할 수 있습니다. 이 프로세스는 다른 주 구성원에 역할을 부여하는 것과 동일합니다.
역할 부여 방법을 알아보려면 리소스 액세스 권한 부여, 변경, 취소를 참조하세요.
다른 프로젝트의 리소스에 서비스 계정 연결
기본적으로 한 프로젝트에서 서비스 계정을 만들어 다른 프로젝트의 리소스에 연결할 수 없습니다. 한 프로젝트의 모든 서비스 계정을 유지하려면 해당 프로젝트의 조직 정책을 업데이트해야 합니다.
프로젝트 간 서비스 계정 연결 사용 설정
사용자가 한 프로젝트의 서비스 계정을 다른 프로젝트의 리소스에 연결할 수 있도록 하려면 서비스 계정이 있는 프로젝트의 조직 정책에서 다음 부울 제약조건을 확인합니다.
프로젝트에
iam.disableCrossProjectServiceAccountUsage
부울 제약조건이 적용되지 않는지 확인합니다.이 부울 제약조건은 서비스 계정을 다른 프로젝트의 리소스에 연결할 수 있는지 여부를 제어합니다. 기본적으로 제약조건은 적용됩니다.
이 제약조건이 적용되지 않으면 IAM은 프로젝트 삭제를 방지하는 프로젝트 선취권을 추가합니다. 이 선취권에는 원본
iam.googleapis.com/cross-project-service-accounts
가 있습니다. 이 선취권을 삭제하지 않는 것이 좋습니다.권장사항: 프로젝트에
iam.restrictCrossProjectServiceAccountLienRemoval
부울 제약조건이 적용되어 있는지 확인합니다.이 부울 제약조건은 주 구성원이 조직 수준의
resourcemanager.projects.updateLiens
권한이 있는 경우에만 프로젝트 선취권을 삭제할 수 있도록 합니다. 이 제약조건이 적용되지 않은 경우 주 구성원이 프로젝트 수준에서 이 권한을 가지고 있으면 프로젝트 선취권을 삭제할 수 있습니다.
조직 정책에서 불리언 제약조건을 보거나 변경하는 방법을 알아보려면 조직 정책 만들기 및 관리를 참조하세요.
프로젝트 간 서비스 계정 연결 사용 중지
이전에 프로젝트 간 서비스 계정 연결을 사용 설정한 경우, 특히 프로덕션 환경에서 이 기능을 사용 중지하는 것이 좋습니다.
특히 서비스 계정이 있는 프로젝트에서는 다음을 변경해서는 안 됩니다.
iam.disableCrossProjectServiceAccountUsage
불리언 제약 조건을 적용하기 위해 프로젝트의 조직 정책을 업데이트하지 마세요.iam.restrictCrossProjectServiceAccountLienRemoval
불리언 제약 조건을 적용하지 않기 위해 프로젝트의 조직 정책을 업데이트하지 마세요.- 프로젝트가 삭제되지 않도록 원본
iam.googleapis.com/cross-project-service-accounts
가 있는 프로젝트 선취권을 삭제하지 마세요. - 프로젝트를 삭제하지 마세요.
이 기능을 사용 중지할 위험을 감수하려는 경우 프로젝트 간에 사용 중인 서비스 계정을 사용 중지한 후 문제에 대해 Google Cloud 환경을 모니터링하여 위험을 줄일 수 있습니다. 문제가 발생하면 서비스 계정을 다시 사용 설정할 수 있습니다. 문제가 발생하지 않으면 다른 프로젝트의 서비스 계정을 사용하는 Google Cloud 리소스가 없는 것일 수 있습니다.
서비스 계정 연결에 대한 감사 로그
주 구성원이 iam.serviceAccounts.actAs
권한을 사용하여 서비스 계정을 리소스에 연결하면 IAM에서 감사 로그를 생성합니다. 이 감사 로그에는 다음 정보가 포함됩니다.
- 서비스 계정을 리소스에 연결한 주 구성원의 이메일 주소
- 리소스에 연결된 서비스 계정에 대한 세부정보
서비스 계정을 연결할 수 있는 리소스 목록은 이 페이지의 새 리소스에 서비스 계정 연결을 참조하세요.
이 유형의 감사 로그 예시는 iam.serviceAccounts.actAs
권한 사용에 대한 로그를 참조하세요. 감사 로그에 대한 일반적인 정보는 Cloud 감사 로그 개요를 참조하세요.
다음 단계
- Compute Engine 인스턴스에 서비스 계정 연결 방법 알아보기
- 서비스 계정 보안을 위한 권장사항 검토 및 적용
- IAM의 감사 로깅에 대해 자세히 알아보기