IAM を使用した組織のアクセス制御

Google Cloud には Identity and Access Management(IAM)機能があり、特定の Google Cloud リソースに対するアクセス権を詳細に設定できるため、他のリソースへの不要なアクセスを防ぐことができます。IAM を使用すると、セキュリティにおける最小権限の原則を導入してリソースに対する必要なアクセス権のみを付与できます。

IAM では、IAM ポリシーを設定して、誰(どのユーザー)に、どのリソースに対するどのアクセス権(役割)を付与するかを制御することができます。IAM ポリシーは、特定のロールをユーザーに付与することで、そのユーザーに特定の権限を付与します。

このページでは、組織レベルで使用可能な IAM ロールについて説明し、さらに、Resource Manager API を使用して組織の IAM ポリシーを作成して管理する方法について説明します。IAM の詳細については、IAM のドキュメントをご覧ください。 特に、アクセス権の付与、変更、取り消しをご覧ください。

権限と役割

IAM で Google Cloud のメソッドを呼び出すには、API リクエストを実行するアカウントに、そのリソースにアクセスするための適切な権限が付与されている必要があります。権限により、Cloud リソースに対して特定のアクションを行うことがユーザーに許可されます。たとえば、resourcemanager.organizations.list 権限を持つユーザーは、所有する組織を一覧表示できます。

呼び出し元が組織メソッドを呼び出す際に必要となる権限のリストを次の表に示します。

方法 必要な権限
cloudresourcemanager.organizations.get() resourcemanager.organizations.get
cloudresourcemanager.organizations.search() ユーザーが resourcemanager.organizations.get 権限を持つすべての組織が返されます。
cloudresourcemanager.organizations.getIamPolicy() resourcemanager.organizations.getIamPolicy
cloudresourcemanager.organizations.setIamPolicy() resourcemanager.organizations.setIamPolicy
cloudresourcemanager.organizations.testIamPermissions() 権限は不要です。

ユーザーには権限を直接付与するのではなく、役割を割り当てます。役割には、1 つ以上の権限が組み込まれています。

同じリソースに 1 つ以上の役割を付与できます。

事前定義済みの役割の使用

次の表に、組織のプロパティへのアクセス権を付与できる役割、この役割が行う操作の説明、この役割に組み込まれている権限を示します。

役割 説明 権限
roles/
resourcemanager.organizationAdmin
組織に属するすべてのリソースを管理するアクセス権デフォルトでは、この役割に請求または組織役割の管理権限は含まれません。
  • orgpolicy.policy.get
  • resourcemanager.folders.get
  • resourcemanager.folders.getIamPolicy
  • resourcemanager.folders.list
  • resourcemanager.folders.setIamPolicy
  • resourcemanager.organizations.get
  • resourcemanager.organizations.getIamPolicy
  • resourcemanager.organizations.setIamPolicy
  • resourcemanager.projects.get
  • resourcemanager.projects.getIamPolicy
  • resourcemanager.projects.list
  • resourcemanager.projects.setIamPolicy
roles/
resourcemanager.organizationViewer
組織の表示名を表示するアクセス権。このロールを付与されたユーザーは、組織内のすべてのリソースを表示するアクセス権がなくても、Google Cloud Console で組織を表示できます。
  • resourcemanager.organizations.get
roles/
orgpolicy.policyAdmin
組織のポリシーを設定することで、クラウド リソースの設定に課す制限を定義する権限を付与します。
  • orgpolicy.*
roles/
browser
組織内のリソースを参照するためのアクセス権
  • resourcemanager.folders.get
  • resourcemanager.folders.list
  • resourcemanager.organizations.get
  • resourcemanager.projects.get
  • resourcemanager.projects.getIamPolicy
  • resourcemanager.projects.list

カスタム役割の作成

このトピックで説明した事前定義の役割を使用するだけでなく、必要に応じて権限を調整してカスタム役割を作成することもできます。Resource Manager で使用するカスタム役割を作成する場合には、次の点に注意してください。
  • resourcemanager.projects.get/list などのリスト権限と取得権限は、必ずペアで付与する必要があります。
  • カスタム役割に folders.list 権限と folders.get 権限を含める場合は、projects.listprojects.get も含める必要があります。
  • 組織、フォルダ、プロジェクトに setIamPolicy 権限を使用すると、ユーザーに他のすべての権限も付与されます。この権限を割り当てる場合には十分に注意してください。

組織に対する既存のアクセス権の表示

組織に対してどのような役割がユーザーに付与されているかを確認するには、組織レベルの IAM ポリシーを取得します。Cloud Console、gcloud コマンドライン ツール、または getIamPolicy() メソッドで組織のポリシーを表示できます。

コンソール

組織レベルで付与されたロールを Cloud Console を使用して表示するには:

  1. Cloud Console の [リソースの管理] ページに移動します。

    [リソースの管理] ページを開く

  2. [組織] プルダウン リストで組織を選択します。

  3. 組織リソースのチェックボックスをオンにします。

  4. 右側の [情報パネル] の [権限] で、役割をクリックして展開しその役割を持つすべてのユーザーを表示します。

gcloud

get-iam-policy コマンドを使用して組織の IAM ポリシーを取得します。

gcloud alpha organizations get-iam-policy [ORGANIZATION_ID] --format json >
[FILENAME.JSON]

このコマンドは、次のようなポリシーを出力します。

bindings:
- members:
  - user:testuser1@gcp-test.com
  role: roles/editor
- members:
  - user:admin@gcp-test.com
  role:roles/resourcemanager.organizationAdmin
- members:
  - user:testuser2@gcp-test.com
  role: roles/resourcemanager.projectCreator
etag": "BwU1aRxWk30="

API

コード スニペット https://cloudresourcemanager.googleapis.com/v1/organizations/12345 により、組織リソースのポリシーが返されます。

リクエスト:

POST
https://cloudresourcemanager.googleapis.com/v1/organizations/12345:getIamPolicy

レスポンス:

 {
    "bindings": [
    {
        "role": "roles/resourcemanager.organizationAdmin",
        "members": [
        "user:email1@gmail.com"
    ]
    },
    {
        "role": "roles/resourcemanager.projectCreator",
        "members": [
            "user:email2@gmail.com",
            "user:email3@gmail.com",
            "serviceAccount:my-other-app@appspot.gserviceaccount.com"
        ]
    }
    ]
    "etag": "BwUjHYKHHiQ="
}

Python

メソッド getIamPolicy() を使用して、以前に設定されたポリシーを取得できます。

...

crm = discovery.build(
    'cloudresourcemanager', 'v1', http=creds.authorize(httplib2.Http()))
policy = crm.organizations().getIamPolicy(
    resource=flags.organizationId, body={}).execute()
print json.dumps(policy, indent=2)

...

組織に対するアクセス権の付与

組織管理者は IAM の役割をチームメンバーに付与することにより、組織のリソースおよび API に対するアクセス権をチームメンバーに付与できます。Google アカウントのメールアドレス、Google グループ、サービス アカウント、または G Suite のドメインに役割を付与できます。ロールの付与には、Cloud Console、gcloud ツール、または setIamPolicy() メソッドを使用します。

コンソール

Cloud Console を使用して組織レベルのアクセス制御を設定するには:

  1. Cloud Console の [リソースの管理] ページに移動します。

    [リソースの管理] ページを開く

  2. [組織] プルダウン リストで組織を選択します。

  3. 組織リソースのチェックボックスをオンにします。フォルダ リソースがない場合、組織リソースは表示されません。続行するには、IAM ページでロールを付与する手順をご覧ください。

  4. 右側の [情報パネル] が表示されていない場合は、右上隅にある [情報パネルを表示] をクリックします。

  5. [情報パネル] ペインの [権限] タブで、[メンバーを追加] をクリックします。

  6. [新しいメンバー] フィールドに、追加するチームメンバーを入力します。Google アカウント メール、Google グループ、サービス アカウント、または G Suite ドメインを指定できます。

  7. [役割を選択] プルダウン リストで、チームメンバーに付与する役割を選択します。

  8. [追加] をクリックします。

gcloud

gcloud コマンドで組織の IAM ポリシーを設定するには:

  1. get-iam-policy コマンドを使用して組織の IAM ポリシーを取得し、そのポリシーを JSON ファイルに出力します。

    gcloud alpha organizations get-iam-policy [ORGANIZATION_ID]
    --format json > [FILENAME.JSON]
    
  2. JSON ファイルの内容は次のようになります。

    {
        "bindings": [
        {
            "members": [
                "user:testuser1@gcp-test.com"
            ],
            "role": "roles/editor"
        },
        {
            "members": [
                "user:admin@gcp-test.com",
            ],
            "role": "roles/resourcemanager.organizationAdmin"
        },
        {
            "members": [
                "user:testuser2@gcp-test.com"
            ],
            "role": "roles/resourcemanager.projectCreator"
        },
        ],
        "etag": "BwU1aRxWk30="
    }
    
  3. テキスト エディタで JSON ファイルを開き、組織管理者を定義する bindings 配列に新しいエントリを追加します。たとえば、anotheradmin@gcp-test.com を組織管理者にするには、上記の例を次のように変更します。

    {
        "bindings": [
        {
            "members": [
                "user:testuser1@gcp-test.com"
            ],
            "role": "roles/editor"
        },
        {
            "members": [
                "user:admin@gcp-test.com",
                "user:anotheradmin@gcp-test.com"
            ],
            "role": "roles/resourcemanager.organizationAdmin"
        },
        {
            "members": [
                "user:testuser20@gcp-test.com"
            ],
            "role": "roles/resourcemanager.projectCreator"
        },
        ],
        "etag": "BwU1aRxWk30="
    }
    
  4. 次のコマンドを実行し、組織のポリシーを更新します。

    gcloud alpha organizations set-iam-policy [ORGANIZATION_ID] policy.json
    

API

リクエスト:

POST https://cloudresourcemanager.googleapis.com/v1/organizations/12345:setIamPolicy
{
    "policy": {
    "version": "0",
    "bindings": [
    {
        "role": "roles/resourcemanager.organizationAdmin",
        "members": [
            "user:email1@gmail.com"
        ]
    },
    {
        "role": "roles/resourcemanager.projectCreator",
        "members": [
        "user:email2@gmail.com",
        "user:email3@gmail.com",
        "serviceAccount:my-other-app@appspot.gserviceaccount.com"
        ]
    }
    ]
    "etag": "BwUjHYKHHiQ="
    }
}

レスポンス:

{
    "bindings": [
    {
        "role": "roles/resourcemanager.organizationAdmin",
        "members": [
            "user:email1@gmail.com"
        ]
    },
    {
        "role": "roles/resourcemanager.projectCreator",
        "members": [
            "user:email2@gmail.com",
            "user:email3@gmail.com",
            "serviceAccount:my-other-app@appspot.gserviceaccount.com"
        ]
    }
    ]
    "etag": "BwUjHYKJUiQ="
}

setIamPolicy() メソッドを使用すると、IAM ポリシーを組織にアタッチすることによって、ユーザーにロールを付与できます。IAM ポリシーとは、誰がどの種類のアクセス権を持つかを定義するステートメントの集合です。

読み取り - 変更 - 書き込み: リソースのメタデータ(Policy など)を更新するための一般的なパターンです。メタデータの現在の状態を読み取り、データをローカルに更新した後、変更したデータを書き込みのために送信します。このような処理は、2 つ以上の独立したプロセスが一連の操作を同時に試行する場合に競合を引き起こすことがあります。たとえば、ある 1 つのプロジェクトにオーナーが 2 人おり、両者が同時にポリシーに対して競合する変更を行おうとする場合があります。この場合、一方のプロジェクト オーナーによって行われた変更が失敗する可能性があります。IAM は、IAM ポリシーの etag プロパティを使用してこの問題を解決します。このプロパティは、最後のリクエスト以降にポリシーが変更されたかどうかを確認するために使用します。etag 値を保持している IAM にリクエストを送信する際に、IAM はリクエスト内の etag 値と、ポリシーに関連付けられている既存の etag 値を比較し、etag 値が一致した場合にのみポリシーを書き込みます。

ポリシーを更新するときには、最初に getIamPolicy() を使用してポリシーを取得し、ポリシーを更新してから setIamPolicy() を使用してそのポリシーを書き込みます。ポリシーを設定するときに etag 値を使用するのは、GetPolicyResponse 内の対応するポリシーに etag 値が含まれている場合のみです。

Python

setIamPolicy() メソッドを使用すると、ポリシーをリソースに接続できます。setIamPolicy メソッドでは、設定するポリシーとそのポリシーを接続するリソースが含まれている SetIamPolicyRequest が使用されます。これにより、結果のポリシーが返されます。setIamPolicy() を使用してポリシーを更新する場合は、read-modify-write パターンに従うことをおすすめします。

組織のポリシーを設定するサンプルコードを次に示します。

...

crm = discovery.build(
    'cloudresourcemanager', 'v1', http=creds.authorize(httplib2.Http()))
policy = crm.organizations().getIamPolicy(
    resource=flags.organizationId, body={}).execute()

admin_binding = next(
    (binding
        for binding in policy['bindings']
        if binding['role'] == 'roles/resourcemanager.organizationAdmin'),
        None)

# Add an empty Organization Admin binding if not present.
if not admin_binding:
    admin_binding = {
        'role': 'roles/resourcemanager.organizationAdmin',
        'members': []
    }
policy['bindings'].append(admin_binding)

# Add the new Admin (if necessary).
new_admin = 'user:' + flags.adminEmail
if new_admin not in admin_binding['members']:
    admin_binding['members'].append(new_admin)
policy = crm.organizations().setIamPolicy(
    resource=flags.organizationId,
    body={
        'resource': flags.organizationId,
        'policy': policy
    }).execute()

print json.dumps(policy, indent=2)

...

権限のテスト

testIamPermissions() メソッドを使用して、組織に対するユーザーの IAM 権限をテストできます。このメソッドは、テストするリソース URL と権限のセットを入力パラメータとして受け取り、ユーザーがアクセスできる権限のサブセットを返します。

一般的に、Cloud Console を使用して権限を直接管理している場合、testIamPermission() は呼び出しません。testIamPermissions() は、カスタマイズされたグラフィカル ユーザー インターフェースなど、お客様独自のソフトウェアとの統合を目的としています。たとえば、Cloud Console は内部で testIamPermissions() を使用して、ログイン ユーザーが使用できる UI を決定します。

API

testIamPermissions() メソッドを使用して、特定のリソースに対する呼び出し元の権限を確認できます。このメソッドは、パラメータとしてリソース名と一連の権限を取得し、発信者が持っている権限のサブセットを返します。

組織に対する権限をテストするためのサンプルコードを以下に示します。

Request:

POST https://cloudresourcemanager.googleapis.com/v1/organization/12345:testIamPermissions

{
    "permissions":  [
        "resourcemanager.organizations.get",
        "resourcemanager.organizations.setIamPolicy"
    ]
}

Response:

{
    "permissions": [
        "resourcemanager.organizations.get"
    ]
}

Python

...

crm = discovery.build(
    'cloudresourcemanager', 'v1', http=creds.authorize(httplib2.Http()))

response = crm.organizations().testIamPermissions(
    resource=flags.organizationId,
    body={
        'resource': flags.organizationId,
        'permissions': [
            'resourcemanager.organizations.setIamPolicy',
            'resourcemanager.projects.update'
        ]
    }).execute()

print json.dumps(response, indent=2)

...