権限のテスト

ほとんどの Google Cloud リソースは testIamPermissions() メソッドを公開しています。このメソッドを使用すると、現在認証されている呼び出し元に対して、リソースに対する特定の IAM 権限が付与されているかどうかをプログラムによって確認できます。testIamPermissions() メソッドに入力パラメータとしてリソース ID と特定の権限を指定すると、呼び出し元に許可されている権限が返されます。

testIamPermissions() メソッドを使用して、ウェブ アプリケーションの管理ツールにアクセスできるかどうかを判断します。たとえば、このメソッドを使用して、ユーザーの権限に基づいて、Google Cloud リソースに関する詳細情報を表示するかどうかを決定できます。

たとえば、現在認証されているユーザーにプロジェクトを削除する権限があるかどうかを確認するには、プロジェクト ID(foo-project など)と resourcemanager.projects.delete 権限を入力パラメータとして指定して projects.testIamPermissions() メソッドを呼び出します。呼び出し元に resourcemanager.projects.delete 権限が付与されている場合は、レスポンス本文にその権限が表示されます。呼び出し元にこの権限がない場合、レスポンス本文に権限は表示されません。

testIamPermissions() メソッドを使用すると、サードパーティのグラフィック ユーザー インターフェース(GUI)で、認証されたユーザーが持つ表示権限に応じて Google Cloud リソースが表示されます。たとえば、コンソールでは内部的に testIamPermissions() メソッドを使用して、認証後に表示するリソースと機能を特定します。通常、付与されている権限はそれぞれのユーザーで異なるため、コンソールでは表示されるアイテムと隠されるアイテムがユーザーごとに異なります。

始める前に

  • Resource Manager API を有効にします。

    API を有効にする

必要なロール

権限のテストに IAM ロールは必要ありません。

権限のテスト方法

次の例は、Google Cloud プロジェクトresourcemanager.projects.get 権限と resourcemanager.projects.delete 権限をテストする方法を示しています。他の Google Cloud リソースの権限をテストする場合は、各リソースが公開している testIamPermissions() メソッドを呼び出します。たとえば、Cloud Storage バケットの IAM 権限をテストできます。

REST

この例では、プロジェクトに関する情報を取得できる IAM のロールがユーザーに付与されていますが、プロジェクトを削除する権限は付与されていません。

Resource Manager API の projects.testIamPermissions メソッドは、権限のリストを受け入れ、プリンシパルがどの権限を持っているかをテストします。

リクエストのデータを使用する前に、次のように置き換えます。

  • PROJECT_ID: Google Cloud プロジェクト ID。プロジェクト ID は英数字からなる文字列です(例: my-project)。

HTTP メソッドと URL:

POST https://cloudresourcemanager.googleapis.com/v1/projects/PROJECT_ID:testIamPermissions

JSON 本文のリクエスト:

{
  "permissions":  [
    "resourcemanager.projects.get",
    "resourcemanager.projects.delete"
  ]
}

リクエストを送信するには、次のいずれかのオプションを展開します。

次のような JSON レスポンスが返されます。

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

C++

IAM のクライアント ライブラリをインストールして使用する方法については、IAM クライアント ライブラリをご覧ください。詳細については、IAM C++ API のリファレンス ドキュメントをご覧ください。

namespace iam = ::google::cloud::iam;
[](std::string const& name, std::vector<std::string> const& permissions) {
  iam::IAMClient client(iam::MakeIAMConnection());
  auto response = client.TestIamPermissions(name, permissions);
  if (!response) throw std::runtime_error(response.status().message());
  std::cout << "Permissions successfully tested: " << response->DebugString()
            << "\n";
}

C#

IAM のクライアント ライブラリをインストールして使用する方法については、IAM クライアント ライブラリをご覧ください。詳細については、IAM C# API のリファレンス ドキュメントをご覧ください。

IAM は、認証情報の生成に使用されるサービス アカウントの権限をテストします。

using System;
using System.Collections.Generic;
using Google.Apis.Auth.OAuth2;
using Google.Apis.CloudResourceManager.v1;
using Google.Apis.CloudResourceManager.v1.Data;

public partial class AccessManager
{
    public static IList<String> TestIamPermissions(string projectId)
    {
        var credential = GoogleCredential.GetApplicationDefault()
            .CreateScoped(CloudResourceManagerService.Scope.CloudPlatform);
        var service = new CloudResourceManagerService(
            new CloudResourceManagerService.Initializer
            {
                HttpClientInitializer = credential
            });

        TestIamPermissionsRequest requestBody = new TestIamPermissionsRequest();
        var permissions = new List<string>() { "resourcemanager.projects.get", "resourcemanager.projects.delete" };
        requestBody.Permissions = new List<string>(permissions);
        var returnedPermissions = service.Projects.TestIamPermissions(requestBody, projectId).Execute().Permissions;

        return returnedPermissions;
    }
}

Java

IAM のクライアント ライブラリをインストールして使用する方法については、IAM クライアント ライブラリをご覧ください。詳細については、IAM Java API のリファレンス ドキュメントをご覧ください。

IAM は、認証情報の生成に使用されるサービス アカウントの権限をテストします。
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.services.cloudresourcemanager.v3.CloudResourceManager;
import com.google.api.services.cloudresourcemanager.v3.model.TestIamPermissionsRequest;
import com.google.api.services.cloudresourcemanager.v3.model.TestIamPermissionsResponse;
import com.google.api.services.iam.v1.IamScopes;
import com.google.auth.http.HttpCredentialsAdapter;
import com.google.auth.oauth2.GoogleCredentials;
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public class TestPermissions {

  // Tests if the caller has the listed permissions.
  public static void testPermissions(String projectId) {
    // projectId = "my-project-id"

    CloudResourceManager service = null;
    try {
      service = createCloudResourceManagerService();
    } catch (IOException | GeneralSecurityException e) {
      System.out.println("Unable to initialize service: \n" + e.toString());
      return;
    }

    List<String> permissionsList =
        Arrays.asList("resourcemanager.projects.get", "resourcemanager.projects.delete");

    TestIamPermissionsRequest requestBody =
        new TestIamPermissionsRequest().setPermissions(permissionsList);
    try {
      TestIamPermissionsResponse testIamPermissionsResponse =
          service.projects().testIamPermissions(projectId, requestBody).execute();

      System.out.println(
          "Of the permissions listed in the request, the caller has the following: "
              + testIamPermissionsResponse.getPermissions().toString());
    } catch (IOException e) {
      System.out.println("Unable to test permissions: \n" + e.toString());
    }
  }

  public static CloudResourceManager createCloudResourceManagerService()
      throws IOException, GeneralSecurityException {
    // Use the Application Default Credentials strategy for authentication. For more info, see:
    // https://cloud.google.com/docs/authentication/production#finding_credentials_automatically
    GoogleCredentials credential =
        GoogleCredentials.getApplicationDefault()
            .createScoped(Collections.singleton(IamScopes.CLOUD_PLATFORM));

    CloudResourceManager service =
        new CloudResourceManager.Builder(
                GoogleNetHttpTransport.newTrustedTransport(),
                JacksonFactory.getDefaultInstance(),
                new HttpCredentialsAdapter(credential))
            .setApplicationName("service-accounts")
            .build();
    return service;
  }
}

Python

IAM のクライアント ライブラリをインストールして使用する方法については、IAM クライアント ライブラリをご覧ください。詳細については、IAM Python API のリファレンス ドキュメントをご覧ください。

IAM は、認証情報の生成に使用されるサービス アカウントの権限をテストします。
def test_permissions(project_id):
    """Tests IAM permissions of the caller"""

    credentials = service_account.Credentials.from_service_account_file(
        filename=os.environ["GOOGLE_APPLICATION_CREDENTIALS"],
        scopes=["https://www.googleapis.com/auth/cloud-platform"],
    )
    service = googleapiclient.discovery.build(
        "cloudresourcemanager", "v1", credentials=credentials
    )

    permissions = {
        "permissions": [
            "resourcemanager.projects.get",
            "resourcemanager.projects.delete",
        ]
    }

    request = service.projects().testIamPermissions(
        resource=project_id, body=permissions
    )
    returnedPermissions = request.execute()
    print(returnedPermissions)
    return returnedPermissions

次のステップ

プリンシパルへのアクセス権の付与、変更、取り消しを行う方法を確認する。