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

Google Cloud Platform の Cloud Identity and Access Management(IAM)を使用すると、特定の Google Cloud Platform リソースに対するアクセス権を詳細に設定でき、他のリソースへの不要なアクセスを防止できます。IAM を使用すると、セキュリティに関する最小権限の原則を導入できるため、リソースに対する必要なアクセス権のみ付与できます。

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

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

権限と役割

Google Cloud Platform では、メソッドを使用して API リクエストを発行するアカウントに、リソースを使用するための適切な権限が Cloud Identity and Access Management で付与されている必要があります。権限により、Cloud リソースに対して特定のアクションを行うことがユーザーに許可されます。たとえば、resourcemanager.organizations.list 権限を持つユーザーは所有する組織を一覧表示でき、resourcemanager.organizations.update 権限を持つユーザーは組織のメタデータを更新できます。

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

方法 必要な権限
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.organizations.update
  • resourcemanager.projectInvites.get
  • resourcemanager.projects.get
  • resourcemanager.projects.getIamPolicy
  • resourcemanager.projects.list
  • resourcemanager.projects.setIamPolicy
roles/
resourcemanager.organizationViewer
組織の表示名を表示するアクセス権。この役割が付与されたユーザーは、組織内のすべてのリソースを表示するアクセス権がなくても、Cloud Console で組織を表示できます。
  • resourcemanager.organizations.get
roles/
browser
組織内のリソースを参照するためのアクセス権
  • resourcemanager.folders.get
  • resourcemanager.folders.list
  • resourcemanager.organizations.get
  • resourcemanager.projectInvites.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 Platform Console、gcloud コマンドライン ツール、getIamPolicy() メソッドで組織のポリシーを確認できます。

Console

Google Cloud Platform Console を使用して、組織レベルで許可された役割を表示するには:

  1. GCP 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 に対するアクセス権をチームメンバーに付与できます。Cloud Platform Console、gcloud ツールまたは setIamPolicy() メソッドでチームメンバーに役割を付与できます。

Console

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

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

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

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

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

  4. 右側の [情報パネル] が表示されていない場合は、右上の [情報パネルを表示] ボタンを選択します。

  5. 右側の [情報パネル] の [権限] で、追加するメンバーのメールアドレスを入力します。

  6. [役割を選択] プルダウン リストで、このユーザーに付与する役割を選択します。

  7. [追加] をクリックします。ダイアログが開き、メンバーの新しい役割の追加または更新が確認されます。

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() メソッドを使用すると、Cloud IAM ポリシーを組織に適用することによって、ユーザーに役割を付与できます。Cloud IAM ポリシーとは、誰がどの種類のアクセス権を持つかを定義するステートメントの集合です。

読み取り - 変更 - 書き込み: リソースのメタデータ(Policy など)を更新するための一般的なパターンです。メタデータの現在の状態を読み取り、データをローカルに更新した後、変更したデータを書き込みのために送信します。このような処理は、2 つ以上の独立したプロセスが一連の操作を同時に試行する場合に競合を引き起こすことがあります。たとえば、ある 1 つのプロジェクトにオーナーが 2 人おり、両者が同時にポリシーに対して競合する変更を行おうとする場合があります。この場合、一方のプロジェクト オーナーによって行われた変更が失敗する可能性があります。Cloud Identity Access Management では、この問題を Cloud IAM ポリシーの etag プロパティを使用して解決します。このプロパティは、ポリシーが最後のリクエスト以降に変更されているかどうか確認するために使用されます。etag 値を保持している Cloud IAM にリクエストを出すと、Cloud 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() メソッドを使用して、組織に対するユーザーの Cloud IAM 権限をテストできます。このメソッドは、テストするリソース URL と権限のセットを入力パラメータとして受け取り、ユーザーがアクセスできる権限のサブセットを返します。

通常、Cloud Platform Console で権限を直接管理している場合には testIamPermission() を呼び出しません。testIamPermissions() は、カスタマイズしたグラフィック ユーザー インターフェースなど、専用のソフトウェアとの統合のために使用することを意図しています。たとえば、Cloud Platform Console では内部で testIamPermissions() を使用して、ユーザーのログインにどの UI を使用するかを決定します。

API

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

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

Request:

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

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

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)

...
このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

Resource Manager のドキュメント