서비스 계정 명의 도용 관리

이 페이지에서는 구성원 또는 리소스가 ID 및 액세스 관리(IAM) 서비스 계정을 가장하거나 IAM 서비스 계정으로 작동하도록 허용하는 방법을 설명합니다. 또한 제공된 IAM 서비스 계정을 가장할 수 있는 구성원을 확인하는 방법도 설명합니다.

시작하기 전에

IAM에서 서비스 계정 작동 방법을 이해해야 합니다.

구성원의 서비스 계정 가장 허용

구성원이 서비스 계정을 가장하도록 허용하는 사전 정의된 역할이 몇 가지 있습니다.

  • 서비스 계정 사용자(roles/iam.serviceAccountUser): 서비스 계정으로 액세스할 수 있는 모든 리소스에 구성원이 간접적으로 액세스하도록 허용합니다. 예를 들어 구성원에게 서비스 계정에 대해 서비스 계정 사용자 역할이 있고 서비스 계정에 프로젝트에 대해 Cloud SQL 관리자 역할(roles/cloudsql.admin)이 있으면 구성원이 서비스 계정을 가장하여 Cloud SQL 인스턴스를 만들 수 있습니다.

    이 역할은 또한 이 페이지에 설명된 것처럼 구성원이 서비스 계정을 리소스에 결합하도록 허용합니다.

  • 서비스 계정 토큰 생성자(roles/iam.serviceAccountTokenCreator): 구성원이 서비스 계정을 가장하여 OAuth 2.0 액세스 토큰을 만들고, 인증에 사용할 수 있도록 JSON 웹 토큰(JWT)을 서명하고, 바이너리 blob을 서명하도록 허용합니다. 자세한 내용은 단기 서비스 계정 사용자 인증 정보 만들기를 참조하세요.

  • 워크로드 아이덴티티 사용자(roles/iam.workloadIdentityUser): 구성원이 GKE 워크로드에서 서비스 계정을 가장하도록 허용합니다. 이 역할은 개별 서비스 계정에 부여될 수 없지만, 프로젝트, 폴더, 조직에 부여될 수 있습니다.

또는 사전 정의된 역할이나 이러한 역할과 동일한 권한을 갖는 다른 커스텀 역할을 부여할 수 있습니다.

다음 섹션에서는 프로젝트, 폴더, 조직에 이러한 역할을 부여하는 방법과 개별 서비스 계정에 부여하는 방법을 설명합니다. 부여하려는 액세스 권한의 양에 따라 수준을 선택합니다.

구성원이 여러 서비스 계정을 가장하도록 허용

구성원이 프로젝트, 폴더, 조직에 생성된 모든 서비스 계정을 가장하도록 허용하려면 프로젝트, 폴더, 조직에 역할을 부여합니다.

Console

  1. Cloud Console에서 IAM 페이지로 이동합니다.

    IAM 페이지로 이동

  2. 페이지 상단의 프로젝트 선택기에서 역할을 부여하려는 프로젝트, 폴더, 조직을 선택합니다.

  3. 추가를 클릭합니다.

  4. 구성원의 이메일 주소를 입력합니다.

  5. 구성원이 서비스 계정을 가장하도록 허용하는 역할을 선택합니다. 서비스 계정 가장을 위한 역할 목록을 참조하세요.

  6. 저장을 클릭합니다.

gcloud 명령어

구성원이 서비스 계정을 가장하도록 허용하는 역할을 구성원에게 부여하려면 프로젝트, 폴더, 조직에 대해 IAM 정책을 수정합니다.

  1. 리소스에 대한 IAM 정책을 읽습니다.

    gcloud resource get-iam-policy resource-id \
        --format=json > policy.json
    

    다음 값을 바꿉니다.

    • resource: 정책을 설정하려는 리소스 유형입니다. 이 값은 projects, resource-manager folders, organizations 중 하나여야 합니다.
    • resource-id: 정책을 설정하려는 리소스의 ID입니다.

    이 명령어는 리소스의 정책을 policy.json 파일에 저장합니다.

    정책이 리소스에 이미 설정되어 있으면 policy.json 파일이 다음과 비슷합니다.

    {
      "bindings": [
        {
          "members": [
            "user:hollis@example.com"
          ],
          "role": "roles/owner"
        }
      ],
      "etag": "BwUqLaVeua8=",
      "version": 1
    }
    

    리소스에 정책이 없으면 policy.json 파일에 기본 etag만 포함됩니다.

    기존 정책이 없으면 다음 단계에서 JSON을 템플릿으로 사용해서 정책을 만듭니다.

  2. 적절한 역할을 구성원에 부여하도록 정책을 수정합니다. 역할을 부여하려면 다음 중 하나를 수행합니다.

    • 역할에 대해 binding이 존재하지 않으면 부여하려는 역할 및 이를 부여할 구성원을 나타내는 bindings 배열에 객체를 추가합니다.
    • binding이 역할에 대해 존재하면 기존 구성원 목록에 새 구성원을 추가합니다. 또한 정책에 조건부 역할 binding이 포함된 경우 구성원을 추가하기 전 binding의 조건이 적절한지 확인합니다.

    bindings 배열이 존재하지 않으면 만들 수 있습니다.

    예시

    서비스 계정 사용자 역할(roles/iam.serviceAccountUser)을 robin@example.com에 부여하려면 이전 단계에 표시된 예시를 다음과 같이 변경합니다.

    {
      "bindings": [
        {
          "role": "roles/iam.serviceAccountUser",
          "members": [
            "user:robin@example.com"
          ]
        },
        {
          "role": "roles/owner",
          "members": [
            "user:hollis@example.com"
          ]
        }
      ],
      "etag": "BwUqLaVeua8=",
      "version": 1
    }
    
  3. 업데이트된 정책을 작성합니다.

    gcloud resource set-iam-policy resource-id \
        policy-file
    

    다음 값을 바꿉니다.

    • resource: 정책을 설정하려는 리소스 유형입니다. 이 값은 projects, resource-manager folders, organizations 중 하나여야 합니다.
    • resource-id: 정책을 설정하려는 리소스의 ID입니다.
    • policy-file: 업데이트된 정책이 포함된 파일의 경로입니다.

    이 명령어는 업데이트된 etag 값으로 업데이트된 정책을 출력합니다.

REST API

Resource Manager REST API를 사용하여 역할을 부여하려면 프로젝트, 폴더, 조직에 대해 현재 IAM 정책을 읽고, 원하는 역할을 부여하도록 정책을 수정하고, 업데이트된 정책을 기록해야 합니다.

리소스에 대한 IAM 정책을 읽습니다.

리소스가 현재 정책을 읽을 수 있도록 getIamPolicy() 메서드를 호출합니다.

POST https://cloudresourcemanager.googleapis.com/api-version/resource/resource-id:getIamPolicy

다음 값을 바꿉니다.

  • api-version: 사용할 API 버전입니다. 프로젝트 및 조직에 v1을 사용합니다. 폴더에는 v2를 사용합니다.
  • resource: 정책을 설정하려는 리소스 유형입니다. 이 값은 projects, resource-manager folders, organizations 중 하나여야 합니다.
  • resource-id: 정책을 설정하려는 리소스의 ID입니다.

요청 본문은 비어 있어야 합니다.

응답 본문은 다음 중 하나와 비슷한 현재 정책을 포함합니다.

  • 정책이 리소스에 이미 설정되어 있으면 응답 본문이 다음과 비슷합니다.

    {
      "version": 1,
      "etag": "BwUqLaVeua8=",
      "bindings": [
        {
          "members": [
            "user:hollis@example.com"
          ],
          "role": "roles/owner"
        }
      ]
    }
    
  • 리소스에 설정된 정책이 없으면 응답 본문에 기본 etag만 포함됩니다.

기존 정책이 없으면 다음 단계에서 JSON을 템플릿으로 사용해서 정책을 만듭니다.

적절한 역할을 구성원에 부여하도록 정책을 수정합니다.

역할을 부여하려면 다음 중 하나를 수행합니다.

  • 역할에 대해 binding이 존재하지 않으면 부여하려는 역할 및 이를 부여할 구성원을 나타내는 bindings 배열에 객체를 추가합니다.
  • binding이 역할에 대해 존재하면 기존 구성원 목록에 새 구성원을 추가합니다.

bindings 배열이 존재하지 않으면 만들 수 있습니다.

예를 들면 다음과 같습니다.

서비스 계정 사용자 역할(roles/iam.serviceAccountUser)을 robin@example.com에 부여하려면 이전 단계에 표시된 예시를 다음과 같이 변경합니다.

{
  "version": 1,
  "etag": "BwUqLaVeua8=",
  "bindings": [
    {
      "role": "roles/iam.serviceAccountUser",
      "members": [
        "user:robin@example.com"
      ]
    },
    {
      "role": "roles/owner",
      "members": [
        "user:hollis@example.com"
      ]
    }
  ]
}

업데이트된 정책을 작성합니다.

리소스가 업데이트된 정책을 작성할 수 있도록 setIamPolicy() 메서드를 호출합니다.

POST https://iam.googleapis.com/api-version/resource/resource-id:setIamPolicy

다음 값을 바꿉니다.

  • api-version: 사용할 API 버전입니다. 프로젝트 및 조직에 v1을 사용합니다. 폴더에는 v2를 사용합니다.
  • resource: 정책을 설정하려는 리소스 유형입니다. 이 값은 projects, resource-manager folders, organizations 중 하나여야 합니다.
  • resource-id: 정책을 설정하려는 리소스의 ID입니다.

요청 본문에는 다음과 같이 업데이트된 정책이 포함되어 있어야 합니다.

{
  "policy": {
    "etag": "BwUqLaVeua8=",
    "bindings": [
      {
        "role": "roles/iam.serviceAccountUser",
        "members": [
          "user:robin@example.com"
        ]
      },
      {
        "role": "roles/owner",
        "members": [
          "user:hollis@example.com"
        ]
      }
    ]
  }
}

응답에는 업데이트된 정책이 포함됩니다.

단일 서비스 계정을 가장하도록 구성원 허용

구성원이 단일 서비스 계정을 가장하도록 허용하려면 서비스 계정에 역할을 부여합니다.

Console

  1. Cloud Console에서 서비스 계정 페이지로 이동합니다.

    서비스 계정 페이지로 이동

  2. 프로젝트 선택을 클릭하고 프로젝트를 선택한 후 열기를 클릭합니다.

  3. 서비스 계정을 선택합니다. 정보 패널이 아직 표시되지 않았으면 정보 패널 표시를 클릭합니다. 서비스 계정에 부여된 역할 목록이 패널에 표시됩니다.

  4. 구성원 추가를 클릭합니다.

  5. 구성원의 이메일 주소를 입력합니다.

  6. 구성원에게 서비스 계정 가장 권한을 부여하는 역할을 선택합니다. 서비스 계정 가장을 위한 역할 목록을 참조하세요.

  7. 추가를 클릭하여 프로젝트 구성원에게 역할을 적용합니다.

여러 서비스 계정에 대해 역할을 부여하려면 각 서비스 계정에 대해 이 단계를 반복합니다.

gcloud 명령어

구성원이 서비스 계정을 가장하도록 허용하는 역할을 부여하려면 서비스 계정에 대해 IAM 정책을 수정합니다.

  1. service-accounts get-iam-policy 명령어를 사용하여 현재 정책을 읽습니다.

    gcloud iam service-accounts get-iam-policy sa-id \
        --format=json > policy.json
    

    다음 값을 바꿉니다.

    • sa-id: 서비스 계정의 ID입니다. sa-name@project-id.iam.gserviceaccount.com 형식의 서비스 계정 이메일 주소 또는 서비스 계정의 고유한 숫자 ID일 수 있습니다.

    이 명령어는 서비스 계정의 정책을 policy.json 파일에 저장합니다.

    정책이 서비스 계정에 이미 설정되어 있으면 policy.json 파일이 다음과 비슷합니다.

    {
      "bindings": [
        {
          "members": [
            "user:hollis@example.com"
          ],
          "role": "roles/iam.serviceAccountAdmin"
        }
      ],
      "etag": "BwUqLaVeua8=",
      "version": 1
    }
    

    서비스 계정에 설정된 정책이 없으면 policy.json 파일에 기본 etag만 포함됩니다.

    기존 정책이 없으면 다음 단계에서 JSON을 템플릿으로 사용해서 정책을 만듭니다.

  2. 텍스트 편집기에서 구성원에 적절한 역할을 부여하도록 policy.json 파일에서 binding 배열을 수정합니다. 역할을 부여하려면 다음 중 하나를 수행합니다.

    • 역할에 대해 binding이 존재하지 않으면 부여하려는 역할 및 이를 부여할 구성원을 정의하는 bindings 배열에 새 객체를 추가합니다.
    • binding이 역할에 대해 존재하면 기존 구성원 목록에 새 구성원을 추가합니다. 또한 정책에 조건부 역할 binding이 포함된 경우 구성원을 추가하기 전 binding의 조건이 적절한지 확인합니다.

    bindings 배열이 존재하지 않으면 만들 수 있습니다.

    예시

    서비스 계정 사용자 역할(roles/iam.serviceAccountUser)을 robin@example.com에 부여하려면 이전 단계에 표시된 예시를 다음과 같이 변경합니다.

    {
      "bindings": [
        {
          "role": "roles/iam.serviceAccountUser",
          "members": [
            "user:robin@example.com"
          ]
        },
        {
          "role": "roles/iam.serviceAccountAdmin",
          "members": [
            "user:hollis@example.com"
          ]
        }
      ],
      "etag": "BwUqLaVeua8=",
      "version": 1
    }
    
  3. service-accounts set-iam-policy 명령어를 사용하여 업데이트된 정책을 기록합니다.

    gcloud iam service-accounts set-iam-policy sa-id \
        policy-file
    

    다음 값을 바꿉니다.

    • sa-id: 서비스 계정의 ID입니다. sa-name@project-id.iam.gserviceaccount.com 형식의 서비스 계정 이메일 주소 또는 서비스 계정의 고유한 숫자 ID일 수 있습니다.
    • policy-file: 업데이트된 정책이 포함된 파일의 경로입니다.

    이 명령어는 업데이트된 etag 값으로 업데이트된 정책을 출력합니다.

REST API

IAM REST API를 사용하여 역할을 부여하려면 서비스 계정의 현재 IAM 정책을 읽고, 원하는 역할을 부여하도록 이를 수정하고, 업데이트된 정책을 기록해야 합니다.

서비스 계정의 IAM 정책을 읽습니다.

getIamPolicy() 메서드를 호출하여 현재 정책을 읽습니다.

POST https://iam.googleapis.com/v1/projects/project-id/serviceAccounts/sa-id:getIamPolicy

다음 값을 바꿉니다.

  • project-id: Google Cloud 프로젝트의 ID입니다.
  • sa-id: 서비스 계정의 ID입니다. sa-name@project-id.iam.gserviceaccount.com 형식의 서비스 계정 이메일 주소 또는 서비스 계정의 고유한 숫자 ID일 수 있습니다.

요청 본문은 비어 있어야 합니다.

응답 본문은 다음 중 하나와 비슷한 현재 정책을 포함합니다.

  • 정책이 서비스 계정에 이미 설정되어 있으면 응답 본문이 다음과 비슷합니다.

    {
      "version": 1,
      "etag": "BwUqLaVeua8=",
      "bindings": [
        {
          "members": [
            "user:hollis@example.com"
          ],
          "role": "roles/iam.serviceAccountAdmin"
        }
      ]
    }
    
  • 서비스 계정에 설정된 정책이 없으면 응답 본문에 기본 etag만 포함됩니다.

기존 정책이 없으면 다음 단계에서 JSON을 템플릿으로 사용해서 정책을 만듭니다.

적절한 역할을 구성원에 부여하도록 정책을 수정합니다.

텍스트 편집기에서 응답 본문의 binding 배열을 수정하여 구성원에 적절한 역할을 부여합니다. 역할을 부여하려면 다음 중 하나를 수행합니다.

  • 역할에 대해 binding이 존재하지 않으면 부여하려는 역할 및 이를 부여할 구성원을 정의하는 bindings 배열에 새 객체를 추가합니다.
  • binding이 역할에 대해 존재하면 기존 구성원 목록에 새 구성원을 추가합니다.

bindings 배열이 존재하지 않으면 만들 수 있습니다.

예를 들면 다음과 같습니다.

서비스 계정 사용자 역할(roles/iam.serviceAccountUser)을 robin@example.com에 부여하려면 이전 단계에 표시된 예시를 다음과 같이 변경합니다.

{
  "version": 1,
  "etag": "BwUqLaVeua8=",
  "bindings": [
    {
      "role": "roles/iam.serviceAccountUser",
      "members": [
        "user:robin@example.com"
      ]
    },
    {
      "role": "roles/iam.serviceAccountAdmin",
      "members": [
        "user:hollis@example.com"
      ]
    }
  ]
}

업데이트된 정책을 작성합니다.

setIamPolicy() 메서드를 호출하여 업데이트된 정책을 기록합니다.

POST https://iam.googleapis.com/v1/projects/project-id/serviceAccounts/sa-id:setIamPolicy

다음 값을 바꿉니다.

  • project-id: Google Cloud 프로젝트의 ID입니다.
  • sa-id: 서비스 계정의 ID입니다. sa-name@project-id.iam.gserviceaccount.com 형식의 서비스 계정 이메일 주소 또는 서비스 계정의 고유한 숫자 ID일 수 있습니다.

요청 본문에는 다음과 같이 업데이트된 정책이 포함되어 있어야 합니다.

{
  "policy": {
    "version": 1,
    "etag": "BwUqLaVeua8=",
    "bindings": [
      {
        "role": "roles/iam.serviceAccountUser",
        "members": [
          "user:robin@example.com"
        ]
      },
      {
        "role": "roles/iam.serviceAccountAdmin",
        "members": [
          "user:hollis@example.com"
        ]
      }
    ]
  }
}

응답에는 업데이트된 정책이 포함됩니다.

서비스 계정에 액세스할 수 있는 구성원 나열

Cloud Console을 사용하여 서비스 계정에 부여된 역할 또는 프로젝트, 폴더, 조직에 부여된 역할로 인해 서비스 계정에 액세스할 수 있는 모든 구성원을 볼 수 있습니다.

  1. Cloud Console에서 서비스 계정 페이지로 이동합니다.

    서비스 계정 페이지로 이동

  2. 프로젝트 선택을 클릭하고 프로젝트를 선택한 후 열기를 클릭합니다.

  3. 원하는 서비스 계정 옆에 있는 체크박스를 선택합니다.

  4. 정보 패널이 아직 표시되지 않았으면 정보 패널 표시를 클릭합니다. 서비스 계정에 부여된 역할 목록이 나타납니다.

  5. 각 역할을 펼쳐 서비스 계정에서 역할을 부여받은 구성원을 확인합니다.

서비스 계정을 리소스에 결합

일부 Google Cloud 리소스의 경우 리소스가 기본 ID로 사용하는 사용자 관리 서비스 계정을 지정할 수 있습니다. 이 프로세스를 리소스에 서비스 계정을 결합하거나 리소스에 서비스 계정을 연결하는 프로세스라고 부릅니다.

리소스가 다른 Google Cloud 서비스 및 리소스에 액세스해야 하는 경우 리소스에 결합된 서비스 계정을 가정합니다. 예를 들어 서비스 계정을 Compute Engine 인스턴스에 결합할 경우, 인스턴스의 애플리케이션은 Google Cloud APIs를 호출할 때 이 서비스 계정을 자동으로 사용합니다.

대부분의 경우 이 리소스를 만들 때 리소스에 서비스 계정을 결합해야 합니다. 리소스가 생성된 다음에는 서비스 계정 binding을 추가, 변경, 삭제할 수 없습니다. Compute Engine 인스턴스는 이 규칙이 적용되지 않습니다. 필요에 따라 서비스 계정 binding을 업데이트할 수 있습니다.

만들려는 리소스 유형에 대한 안내를 참조하세요.

리소스를 만들 때 서비스 계정 결합
AI Platform

모델 버전

--config 매개변수에 서비스 계정을 지정합니다.

AI Platform Notebooks 메모장 인스턴스
Cloud Composer 환경
Cloud Functions Cloud 함수
Cloud Life Sciences 파이프라인
Cloud Run 서비스
Cloud Scheduler 작업
Cloud Source Repositories
Compute Engine
Dataflow 작업
Datalab 인스턴스
Dataproc 클러스터
Google Kubernetes Engine
Pub/Sub 구독

리소스를 만들고 서비스 계정을 이 리소스에 결합한 후에는 적절한 리소스에 액세스할 수 있도록 서비스 계정에 역할을 부여할 수 있습니다. 이 프로세스는 다른 구성원에 역할을 부여하는 것과 동일합니다.

역할 부여 방법을 알아보려면 리소스 액세스 권한 부여, 변경, 취소를 참조하세요.

다음 단계