서비스 계정에 역할 부여

IAM 역할을 부여할 때 서비스 계정을 리소스 또는 ID로 취급할 수도 있습니다.

애플리케이션에서는 서비스 계정을 ID로 사용하여 Google Cloud Platform 서비스에 인증합니다. 예를 들어 특정 서비스 계정으로 Compute Engine 가상 머신(VM)을 실행하는 경우 프로젝트(리소스)의 서비스 계정(ID)에 편집자 역할을 부여할 수 있습니다.

이와 동시에 VM을 시작할 수 있는 사용자를 제어할 수도 있습니다. 사용자(ID)에게 서비스 계정(리소스)에 대한 serviceAccountUser 역할을 부여하면 됩니다.

서비스 계정에 대한 자세한 내용과 서비스 계정을 리소스와 ID로 사용하는 예시를 확인하려면 서비스 계정을 참조하세요.

이 가이드의 기본 요건

  • 이 가이드의 명령줄 예시를 사용하려면 gcloud 명령줄 도구를 설치합니다.

  • 역할 이해를 참조하여 서비스 계정에 부여할 수 있는 사전 정의된 역할 목록을 확인합니다.

서비스 계정에 특정 리소스에 대한 역할 부여

서비스 계정이 Cloud Platform 프로젝트에 속한 리소스에 대해 특정 작업을 완료할 수 있는 권한을 갖도록 서비스 계정에 역할을 부여합니다. 예를 들어 서비스 계정에서 Google Cloud Storage의 객체와 버킷을 제어하도록 서비스 계정에 storage.admin 역할을 부여할 수 있습니다.

서비스 계정에 역할을 부여하려면 아래 방법 중 하나를 사용합니다.

Console

프로젝트에서 사용자의 역할을 관리하는 방법과 동일한 방법으로 서비스 계정의 역할을 관리할 수 있습니다.

  1. Cloud Console에서 IAM 및 관리자 페이지를 엽니다.

    IAM 및 관리자 페이지 열기

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

  3. 역할을 추가할 서비스 계정을 찾습니다.

    • 구성원 목록에 서비스 계정이 아직 없다면 해당 계정에 어떠한 역할도 할당되지 않은 것입니다. 추가를 클릭하고 서비스 계정의 이메일 주소를 클릭합니다.
    • 서비스 계정이 구성원 목록에 이미 있는 경우 기존 역할이 있는 것입니다. 서비스 계정의 역할을 수정하려면 수정 버튼을 클릭합니다.
  4. 서비스 계정에 적용할 역할을 하나 이상 선택합니다.

  5. 저장을 클릭하여 서비스 계정에 역할을 적용합니다.

gcloud

단일 서비스 계정에 역할을 추가합니다.

gcloud projects add-iam-policy-binding my-project-123 \
      --member serviceAccount:my-sa-123@my-project-123.iam.gserviceaccount.com \
      --role roles/editor
    

명령어를 실행하면 업데이트된 정책이 출력됩니다.

bindings:
    - members:
      - user:email1@example.com
      role: roles/owner
    - members:
      - serviceAccount:our-project-123@appspot.gserviceaccount.com
      - serviceAccount:123456789012-compute@developer.gserviceaccount.com
      - serviceAccount:my-sa-123@my-project-123.iam.gserviceaccount.com
      - user:email3@example.com
      role: roles/editor
    - members:
      - user:email2@example.com
      role: roles/viewer
    etag: BwUm38GGAQk=
    version: 1
    

서비스 계정을 프로젝트의 ID로 취급하여 액세스 권한을 부여하는 방법은 프로젝트 구성원에 대한 액세스 권한 부여, 변경, 취소를 참조하세요.

API

다음 POST 요청에서는 projects.setIamPolicy() 메서드를 사용하여 my-project-123 프로젝트의 편집자 액세스 권한을 서비스 계정 my-sa-123에 부여합니다. 요청 본문에는 서비스 계정에 권한을 부여하는 새 정책이 포함되어야 합니다. 각 역할은 여러 구성원을 가질 수 있습니다.

POST https://cloudresourcemanager.googleapis.com/v1/projects/my-project-123:setIamPolicy

    {
        "policy":
        {
            "version": 1,
            "etag": "BwUqMvZQGfo=",
            "bindings": [
            {
                "role": "roles/editor",
                "members": [
                    "serviceAccount:my-sa-123@my-project-123.iam.gserviceaccount.com",
                    "user:alice@example.com"
                ]
            },
            {
                "role":"roles/owner",
                "members":
                [
                    "user:bob@example.com",
                ]
            },
            {
                "role":"roles/viewer",
                "members":
                [
                    "user:john@example.com",
                ]
            },
            {
                "role":"roles/iam.serviceAccountUser",
                "members":
                [
                    "user:alice@example.com"
                ]
            },
            ]
        },
    }
    

응답에는 새 정책이 포함됩니다.

{
        "version": 1,
        "etag": "BwUqMvZQGfo=",
        "bindings": [
        {
            "role": "roles/editor",
            "members": [
                "serviceAccount:my-sa-123@my-project-123.iam.gserviceaccount.com",
                "user:alice@example.com"
            ]
        },
        {
            "role":"roles/owner",
            "members":
            [
                "user:bob@example.com",
            ]
        },
        {
            "role":"roles/viewer",
            "members":
            [
                "user:john@example.com",
            ]
        },
        {
            "role":"roles/iam.serviceAccountUser",
            "members":
            [
                "user:alice@example.com"
            ]
        },
        ]
    }
    

서비스 계정에 부여된 역할보기

프로젝트에서 사용자의 역할을 보는 방법과 동일한 방법으로 서비스 계정의 역할을 볼 수 있습니다.

  • Cloud Console에서 IAM 페이지를 엽니다.

    IAM 페이지 열기

  • 프로젝트 선택을 클릭합니다.
  • 프로젝트를 선택하고 열기를 클릭합니다.
  • 프로젝트와 연결된 구성원 목록에서 서비스 계정을 찾습니다. 서비스 계정의 역할이 역할 열에 나열됩니다.

서비스 계정 소유권 및 액세스 구성

서비스 계정을 ID가 아닌 리소스로 취급하여 특정 사용자에게 서비스 계정에 대한 소유권과 액세스 권한을 부여할 수 있습니다. 이 섹션의 단계에서는 서비스 계정을 리소스로 취급합니다. 각 사용 유형의 차이점에 대한 자세한 내용은 서비스 계정 주제를 참조하세요.

기본 프로젝트 소유자 및 프로젝트 편집자 역할이 있는 사용자는 이미 서비스 계정을 수정할 수 있지만, 일부 사용자가 서비스 계정 리소스에 대한 특정 작업만 수행할 수 있도록 허용하기를 원할 수 있습니다.

사용자에게 서비스 계정에 대한 권한을 부여하려면 아래 방법 중 하나를 사용합니다.

Console

  1. Cloud Console에서 IAM 및 관리자 페이지를 엽니다.

    IAM 및 관리자 페이지 열기

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

  3. 왼쪽 탐색 메뉴에서 서비스 계정을 클릭합니다.

  4. 서비스 계정을 선택한 다음 정보 패널 표시를 클릭합니다. 해당 서비스 계정에 액세스할 수 있는 모든 사용자가 표시됩니다.

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

  6. 프로젝트 구성원의 이메일 주소를 추가합니다.

  7. 구성원의 역할을 선택하여 해당 구성원이 서비스 계정에 대해 수행할 수 있는 작업을 정의합니다.

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

gcloud

전체 정책 업데이트:

먼저 수정할 정책을 가져오고 JSON 파일에 씁니다. --format 플래그를 사용하여 출력 형식을 선택할 수 있습니다. 사용 가능한 출력 형식은 JSON, YAML, 텍스트입니다. 이 페이지의 다른 예시에서는 기본 텍스트 출력 형식을 사용하지만 이 예시에서는 출력을 JSON 파일(policy.json)에 쓰고 기존 정책을 수정한 후에 설정합니다.

gcloud iam service-accounts get-iam-policy \
      my-sa-123@my-project-123.iam.gserviceaccount.com \
      --format json > policy.json
    

이 명령어는 서비스 계정 자체에 설정된 정책만 반환합니다. 서비스 계정에 설정된 기존 정책이 없으면 JSON 파일 콘텐츠는 다음과 유사합니다.

{
      "etag": "ACAB"
    }
    

기존 정책이 없는 경우 아래 단계를 수행하여 단일 binding으로 새 정책을 설정하거나 다음 단계의 JSON을 템플릿으로 사용하여 정책을 직접 만들 수 있습니다.

이미 적용 중인 정책이 있으면 출력된 policy.json 파일의 콘텐츠는 다음과 유사합니다.

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

다음으로 텍스트 편집기에서 그룹 구성원과 역할을 정의하는 bindings 배열에 새로운 객체를 추가하여 policy.json 파일을 수정합니다. bindings 배열이 아직 없으면 이 배열을 만듭니다. alice@example.comserviceAccountUser 역할을 부여하려면 위의 예시를 다음과 같이 변경해야 합니다.

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

다음 명령어를 실행하여 정책을 업데이트합니다.

gcloud iam service-accounts set-iam-policy \
      my-sa-123@my-project-123.iam.gserviceaccount.com policy.json
    

명령어를 실행하면 업데이트된 정책이 출력됩니다.

bindings:
    - members:
      - user:alice@example.com
      role: roles/iam.serviceAccountUser
    - members:
      - bob@example.com
      role: roles/owner
    etag: BwUjMhXbSPU=
    version: 1
    

단일 binding 추가:

다음 명령어를 실행하여 새 정책이나 기존 정책에 단일 binding을 추가할 수 있습니다.

gcloud iam service-accounts add-iam-policy-binding \
      my-sa-123@my-project-123.iam.gserviceaccount.com \
      --member='user:jane@example.com' --role='roles/editor'
    

명령어를 실행하면 업데이트된 정책이 출력됩니다.

bindings:
    - members:
      - user:alice@example.com
      role: roles/iam.serviceAccountUser
    - members:
      - user:bob@example.com
      role: roles/owner
    - members:
      - user:jane@example.com
      role: roles/editor
    etag: BwUqKjVeua8=
    version: 1
    

단일 binding 삭제:

다음 명령어를 실행하여 기존 정책에서 단일 binding을 삭제할 수 있습니다.

gcloud iam service-accounts remove-iam-policy-binding \
        my-sa-123@my-project-123.iam.gserviceaccount.com \
        --member='user:jane@example.com' --role='roles/editor'
    

명령어를 실행하면 업데이트된 정책이 출력됩니다.

bindings:
    - members:
      - user:alice@example.com
      role: roles/iam.serviceAccountUser
    - members:
      - user:bob@example.com
      role: roles/owner
    etag: BwUqNkVeua8=
    version: 1
    

API

요청:

POST https://iam.googleapis.com/v1/projects/my-project-123/serviceAccounts/my-sa-123@my-project-123.iam.gserviceaccount.com:setIamPolicy
    

요청 본문은 부여할 정책을 포함해야 합니다.

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

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

{
        "etag": "BwUqMqbViM8=",
        "bindings": [
        {
            "role": "roles/iam.serviceAccountUser",
            "members": [
                "user:alice@example.com"
            ]
        },
        {
            "role": "roles/owner",
            "members": [
            "user:bob@example.com"
            ]
        }
        ]
    }
    

서비스 계정의 기존 역할 보기

서비스 계정은 리소스로 취급될 수 있으므로 다른 Google Cloud 리소스와 마찬가지로 Cloud IAM 정책이 있습니다. 따라서 특정 서비스 계정에서 역할이 부여된 구성원을 확인하려면 serviceAccounts.getIamPolicy() 메서드, Cloud Console, gcloud 도구를 사용하여 서비스 계정의 Cloud IAM 정책을 가져옵니다.

Console

  1. Cloud Console에서 IAM 및 관리자 페이지를 엽니다.

    IAM 및 관리자 페이지 열기

  2. 프로젝트 선택을 클릭하고 프로젝트를 선택한 후 열기를 클릭합니다. 이 프로젝트의 모든 사용자와 해당 역할이 페이지에 표시됩니다.

  3. 왼쪽 탐색 메뉴에서 서비스 계정을 클릭합니다.

  4. 원하는 서비스 계정 옆의 체크박스를 선택한 다음 정보 패널 표시를 클릭합니다. 서비스 계정에 부여된 역할 목록이 나타납니다. 각 역할을 펼쳐 서비스 계정에서 해당 역할을 부여받은 구성원을 확인합니다.

gcloud

서비스 계정의 정책을 가져오려면 다음 명령을 실행합니다.

gcloud iam service-accounts get-iam-policy \
        my-sa-123@my-project-123.iam.gserviceaccount.com
    

다음과 유사하게 정책이 출력됩니다.

bindings:
    - members:
      - user:bob@example.com
      role: roles/owner
    - members:
      - user:alice@example.com
      role: roles/iam.serviceAccountUser
    etag: BwUqLaVeua8=
    version: 1
    

서비스 계정에 역할을 할당하지 않은 경우 다음과 같이 출력에 etag 값만 표시됩니다.

etag: ACAB
    

API

다음 코드 스니펫은 서비스 계정 my-sa-123@my-project-123.iam.gserviceaccount.com의 IAM 정책을 가져옵니다.

요청:

POST https://iam.googleapis.com/v1/projects/my-project-123/serviceAccounts/my-sa-123@my-project-123.iam.gserviceaccount.com:getIamPolicy
    
Response:

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

서비스 계정에 역할을 할당하지 않았으면 다음과 같이 응답에 etag 값만 포함됩니다.

{
      "etag": "ACAB"
    }
    

IAM 정책에 대한 자세한 내용은 정책을 참조하세요.