IAM 許可ポリシーの以前の版を復元する

このページでは、誤って変更したり、誤って削除したりした後に、IAM 許可ポリシーの以前のバージョンを復元する方法について説明します。

以前の IAM ポリシーを復元するには、変更または削除前の最後の成功した setIamPolicy を見つけて、それを使用してポリシーを復元します。

必要なロール

以前の許可ポリシーを復元するために必要な権限を取得するには、プロジェクト、フォルダ、または組織に対する次の IAM ロールを付与するよう管理者に依頼します。

ロールの付与については、プロジェクト、フォルダ、組織へのアクセス権の管理をご覧ください。

setIamPolicy を使用して許可ポリシーを復元する場合、組織レベルとフォルダレベルの許可ポリシーには組織管理者ロールが必要で、プロジェクト レベルの許可ポリシーにはオーナーロールが必要です。

カスタムロールや他の事前定義ロールを使用して、これらの権限を取得することもできます。

最後に成功した setIamPolicy インスタンスを使用して許可ポリシーを復元する

許可ポリシーを以前のバージョンに復元するには、変更または削除前の setIamPolicy の最後の成功インスタンスの監査ログを確認し、そのインスタンスの情報を使用してポリシーを復元します。このプロセスには、次のステップが含まれます。

  1. 許可ポリシーの最後の成功した setIamPolicy インスタンスを特定し、insertId を取得します。
  2. setIamPolicy リクエストの insertId を使用して、許可ポリシーを YAML 形式または JSON 形式でエクスポートします。
  3. 出力ファイルを変更して、以前の動作中の許可ポリシーと一致させ、現在の許可ポリシーをオーバーライドします。

setIamPolicy の最後の成功したインスタンスを特定し、insertId を取得します。

setIamPolicy の最後の成功したインスタンスを特定して isertId を取得するには、 Cloud de Confiance コンソールまたは gcloud CLI を使用して監査ログを確認します。

コンソール

  1. Cloud de Confiance コンソールで、[ログ エクスプローラ] ページに移動します。

    [ログ エクスプローラ] に移動

  2. クエリエディタで、次のいずれかのクエリを入力します。次のクエリは、監査ログで protoPayloadmethodName フィールドに SetIamPolicy を含むエントリを検索します。

    • リソースで行われたすべての許可ポリシーの変更のログを取得するには、次のクエリを使用します。

      logName="RESOURCE_TYPE/RESOURCE_ID/logs/cloudaudit.googleapis.com%2Factivity"
      protoPayload.methodName:SetIamPolicy
      
    • 特定のユーザーまたはサービス アカウントに関連する許可ポリシーの変更のログを取得するには、次のクエリを使用します。

      logName="RESOURCE_TYPE/RESOURCE_ID/logs/cloudaudit.googleapis.com%2Factivity"
      protoPayload.methodName:SetIamPolicy
      protoPayload.serviceData.policyDelta.bindingDeltas.member:"EMAIL_ADDRESS"
      

      次のように置き換えます。

      • RESOURCE_TYPE: 監査ログを一覧表示するリソースタイプ。有効な値は projectsfoldersorganizations です。
      • RESOURCE_ID: Cloud de Confiance プロジェクト、フォルダ、または組織の ID。プロジェクト ID は英数字です(例: my-project)。フォルダ ID と組織 ID は数値です(例: 123456789012)。
      • EMAIL_ADDRESS: ユーザーまたはサービス アカウントのメールアドレス(例: example-service-account@example-project.s3ns.iam.gserviceaccount.com)。
  3. [クエリを実行] をクリックして、このクエリを実行します。

  4. タイムライン セレクタを使用して、クエリに適した期間を指定します。また、クエリエディタにタイムスタンプ式を直接追加することもできます。詳細については、期間を指定してログを表示するをご覧ください。

  5. 変更または削除前の setIamPolicy の最後の成功したインスタンスから insertId をコピーします。

gcloud

gcloud logging read コマンドは、ログエントリを読み取ります。

後述のコマンドデータを使用する前に、次のように置き換えます。

  • RESOURCE_TYPE: 監査ログを一覧表示するリソースタイプ。値 projectsfolders、または organizations を使用します。
  • RESOURCE_ID: Cloud de Confianceプロジェクト、組織、またはフォルダ ID。プロジェクト ID は英数字からなる文字列です(例: my-project)。フォルダ ID と組織 ID は数値です(例: 123456789012)。
  • TIME_PERIOD: 監査ログを一覧表示する期間。この値より古くないエントリが返されます。指定しない場合、デフォルト値は 1d です。時刻形式については、gcloud topic datetimes をご覧ください。
  • RESOURCE_TYPE_SINGULAR: 監査ログを一覧表示するリソースタイプ。値 projectfolder、または organization を使用します。

次のコマンドを実行します。

Linux、macOS、Cloud Shell

gcloud logging read \
    'logName:RESOURCE_TYPE/RESOURCE_ID/logs/cloudaudit.googleapis.com%2Factivity
    AND protoPayload.methodName=SetIamPolicy' \
    --freshness=TIME_PERIOD \
    --RESOURCE_TYPE_SINGULAR=RESOURCE_ID

Windows(PowerShell)

gcloud logging read `
    'logName:RESOURCE_TYPE/RESOURCE_ID/logs/cloudaudit.googleapis.com%2Factivity
    AND protoPayload.methodName=SetIamPolicy' `
    --freshness=TIME_PERIOD `
    --RESOURCE_TYPE_SINGULAR=RESOURCE_ID

Windows(cmd.exe)

gcloud logging read ^
    'logName:RESOURCE_TYPE/RESOURCE_ID/logs/cloudaudit.googleapis.com%2Factivity
    AND protoPayload.methodName=SetIamPolicy' ^
    --freshness=TIME_PERIOD ^
    --RESOURCE_TYPE_SINGULAR=RESOURCE_ID

変更または削除前の setIamPolicy の最後の成功したインスタンスから insertId をコピーします。

insertId を使用して許可ポリシーをエクスポートする

setIamPolicy の最後に成功したインスタンスから取得した insertId を使用して、gcloud CLI で次のコマンドを実行し、JSON または YAML 形式で許可ポリシーをエクスポートします。組織とプロジェクトの許可ポリシーをエクスポートできます。

組織レベル

gcloud logging read コマンドは、ログエントリを読み取ります。

後述のコマンドデータを使用する前に、次のように置き換えます。

  • ORGANIZATION_ID: 許可ポリシーを表示してエクスポートする組織。
  • INSERT_ID: setIamPolicy リクエストの insertId
  • FORMAT: レスポンスの形式。json または yaml を使用します。
  • TIME_PERIOD: 監査ログを一覧表示する期間。この値より古くないエントリが返されます。指定しない場合、デフォルト値は 1d です。時刻形式については、gcloud topic datetimes をご覧ください。
  • OUTPUT_FILE: 出力のファイル名と拡張子。たとえば、previous_policy.jsonprevious_policy.yaml です。

次のコマンドを実行します。

Linux、macOS、Cloud Shell

gcloud logging read organizations/ORGANIZATION_ID/logs/cloudaudit.googleapis.com
insertId="INSERT_ID"'
--organization=ORGANIZATION_ID
--format="FORMAT(protoPayload.request.policy)"
--freshness=TIME_PERIOD > OUTPUT_FILE

Windows(PowerShell)

gcloud logging read organizations/ORGANIZATION_ID/logs/cloudaudit.googleapis.com
insertId="INSERT_ID"'
--organization=ORGANIZATION_ID
--format="FORMAT(protoPayload.request.policy)"
--freshness=TIME_PERIOD > OUTPUT_FILE

Windows(cmd.exe)

gcloud logging read organizations/ORGANIZATION_ID/logs/cloudaudit.googleapis.com
insertId="INSERT_ID"'
--organization=ORGANIZATION_ID
--format="FORMAT(protoPayload.request.policy)"
--freshness=TIME_PERIOD > OUTPUT_FILE

プロジェクト レベル

gcloud logging read コマンドは、ログエントリを読み取ります。

後述のコマンドデータを使用する前に、次のように置き換えます。

  • INSERT_ID: setIamPolicy リクエストの insertId
  • TIME_PERIOD: 監査ログを一覧表示する期間。この値より古くないエントリが返されます。指定しない場合、デフォルト値は 1d です。時刻形式については、gcloud topic datetimes をご覧ください。
  • FORMAT: レスポンスの形式。json または yaml を使用します。
  • OUTPUT_FILE: 出力を保存するファイルの名前(例: previous_policy.jsonprevious_policy.yaml)。

次のコマンドを実行します。

Linux、macOS、Cloud Shell

gcloud logging read \
'protoPayload.methodName="SetIamPolicy" AND insertId="INSERT_ID"' \
--freshness=TIME_PERIOD \
--format="FORMAT(protoPayload.request.policy)" > OUTPUT_FILE

Windows(PowerShell)

gcloud logging read `
'protoPayload.methodName="SetIamPolicy" AND insertId="INSERT_ID"' `
--freshness=TIME_PERIOD `
--format="FORMAT(protoPayload.request.policy)" > OUTPUT_FILE

Windows(cmd.exe)

gcloud logging read ^
'protoPayload.methodName="SetIamPolicy" AND insertId="INSERT_ID"' ^
--freshness=TIME_PERIOD ^
--format="FORMAT(protoPayload.request.policy)" > OUTPUT_FILE

出力ファイルを変更して現在の許可ポリシーをオーバーライドする

出力ファイルを次の方法で変更し、現在の許可ポリシーをオーバーライドします。

  1. プログラムまたはテキスト エディタを使用して、次の行を削除して出力ファイルを変更します。

     ---
     protoPayload:
        request:
          policy:
    

    生成されるファイルは auditConfigs: で始まります。

  2. 現在の許可ポリシーを取得します。

    gcloud

    gcloud get-iam-policy コマンドは、プロジェクト、フォルダ、または組織の許可ポリシーを取得します。

    後述のコマンドデータを使用する前に、次のように置き換えます。

    • RESOURCE_TYPE: 許可ポリシーを取得するリソースのタイプ。有効な値は projectsresource-manager foldersorganizations です。

    • RESOURCE_ID: Cloud de Confiance プロジェクト、フォルダ、または組織の ID。プロジェクト ID は英数字です(例: my-project)。フォルダ ID と組織 ID は数値です(例: 123456789012)。

    • FORMAT: 許可ポリシーの形式。json または yaml を使用します。

    • PATH: 許可ポリシーの新しい出力ファイルのパス。

    次のコマンドを実行します。

    Linux、macOS、Cloud Shell

    gcloud RESOURCE_TYPE get-iam-policy RESOURCE_ID --format=FORMAT > PATH

    Windows(PowerShell)

    gcloud RESOURCE_TYPE get-iam-policy RESOURCE_ID --format=FORMAT > PATH

    Windows(cmd.exe)

    gcloud RESOURCE_TYPE get-iam-policy RESOURCE_ID --format=FORMAT > PATH

    たとえば、次のコマンドはプロジェクト my-project の許可ポリシーを取得し、JSON 形式でホーム ディレクトリに保存します。

    gcloud projects get-iam-policy my-project --format json > ~/policy.json

    C#

    Resource Manager に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、始める前にをご覧ください。

    Resource Manager 用のクライアント ライブラリをインストールして使用する方法については、Resource Manager クライアント ライブラリをご覧ください。

    次の例は、プロジェクトの許可ポリシーを取得する方法を示しています。フォルダまたは組織の許可ポリシーを取得する方法については、ご使用のプログラミング言語の Resource Manager クライアント ライブラリのドキュメントをご覧ください。

    
    using Google.Apis.Auth.OAuth2;
    using Google.Apis.CloudResourceManager.v1;
    using Google.Apis.CloudResourceManager.v1.Data;
    
    public partial class AccessManager
    {
        public static Policy GetPolicy(string projectId)
        {
            var credential = GoogleCredential.GetApplicationDefault()
                .CreateScoped(CloudResourceManagerService.Scope.CloudPlatform);
            var service = new CloudResourceManagerService(
                new CloudResourceManagerService.Initializer
                {
                    HttpClientInitializer = credential
                });
    
            var policy = service.Projects.GetIamPolicy(new GetIamPolicyRequest(),
                projectId).Execute();
            return policy;
        }
    }
    

    Java

    Resource Manager に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、始める前にをご覧ください。

    Resource Manager 用のクライアント ライブラリをインストールして使用する方法については、Resource Manager クライアント ライブラリをご覧ください。

    次の例は、プロジェクトの許可ポリシーを取得する方法を示しています。フォルダまたは組織の許可ポリシーを取得する方法については、ご使用のプログラミング言語の Resource Manager クライアント ライブラリのドキュメントをご覧ください。

    import com.google.cloud.resourcemanager.v3.ProjectsClient;
    import com.google.iam.admin.v1.ProjectName;
    import com.google.iam.v1.GetIamPolicyRequest;
    import com.google.iam.v1.Policy;
    import java.io.IOException;
    
    public class GetProjectPolicy {
      public static void main(String[] args) throws IOException {
        // TODO(developer): Replace the variables before running the sample.
        // TODO: Replace with your project ID.
        String projectId = "your-project-id";
    
        getProjectPolicy(projectId);
      }
    
      // Gets a project's policy.
      public static Policy getProjectPolicy(String projectId) throws IOException {
        // Initialize client that will be used to send requests.
        // This client only needs to be created once, and can be reused for multiple requests.
        try (ProjectsClient projectsClient = ProjectsClient.create()) {
          GetIamPolicyRequest request = GetIamPolicyRequest.newBuilder()
                  .setResource(ProjectName.of(projectId).toString())
                  .build();
          return projectsClient.getIamPolicy(request);
        }
      }
    }

    Python

    Resource Manager に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、始める前にをご覧ください。

    Resource Manager 用のクライアント ライブラリをインストールして使用する方法については、Resource Manager クライアント ライブラリをご覧ください。

    次の例は、プロジェクトの許可ポリシーを取得する方法を示しています。フォルダまたは組織の許可ポリシーを取得する方法については、ご使用のプログラミング言語の Resource Manager クライアント ライブラリのドキュメントをご覧ください。

    from google.cloud import resourcemanager_v3
    from google.iam.v1 import iam_policy_pb2, policy_pb2
    
    
    def get_project_policy(project_id: str) -> policy_pb2.Policy:
        """Get policy for project.
    
        project_id: ID or number of the Google Cloud project you want to use.
        """
    
        client = resourcemanager_v3.ProjectsClient()
        request = iam_policy_pb2.GetIamPolicyRequest()
        request.resource = f"projects/{project_id}"
    
        policy = client.get_iam_policy(request)
        print(f"Policy retrieved: {policy}")
    
        return policy

    REST

    Resource Manager API の get-iam-policy メソッドは、プロジェクト、フォルダ、または組織の許可ポリシーを取得します。

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

    • API_VERSION: 使用する API のバージョン。プロジェクトと組織の場合は、v1 を使用します。フォルダの場合は、v2 を使用します。
    • RESOURCE_TYPE: ポリシーを管理するリソースタイプ。値 projectsfolders、または organizations を使用します。
    • RESOURCE_ID: Cloud de Confianceプロジェクト、組織、またはフォルダ ID。プロジェクト ID は英数字からなる文字列です(例: my-project)。フォルダ ID と組織 ID は数値です(例: 123456789012)。
    • POLICY_VERSION: 返されるポリシー バージョン。リクエストでは、最新のポリシー バージョン(ポリシー バージョン 3)を指定する必要があります。詳細については、ポリシーの取得時にポリシー バージョンを指定するをご覧ください。

    HTTP メソッドと URL:

    POST https://cloudresourcemanager.googleapis.com/API_VERSION/RESOURCE_TYPE/RESOURCE_ID:getIamPolicy

    リクエストの本文(JSON):

    {
      "options": {
        "requestedPolicyVersion": POLICY_VERSION
      }
    }
    

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

    レスポンスには、リソースの許可ポリシーが含まれます。次に例を示します。

    {
      "version": 1,
      "etag": "BwWKmjvelug=",
      "bindings": [
        {
          "role": "roles/owner",
          "members": [
            "principal://iam.googleapis.com/locations/global/workforcePools/my-pool/subject/my-user@example.com"
          ]
        }
      ]
    }
    

    レスポンスを適切なタイプ(json または yaml)のファイルに保存します。

  3. 現在の許可ポリシーから etag の値をコピーします。

  4. 出力ファイルの etag 値を、現在の許可ポリシーからコピーした etag 値に置き換えます。出力ファイルの etag は、新しい setIamPolicy リクエストを開始するために現在の etag と一致している必要があります。出力ファイルで etag の間隔が変更されていないことを確認します。

  5. ファイルを確認して、以前の動作中の許可ポリシーと一致していることを確認します。新しいプロジェクトを作成してポリシーを適用し、意図したとおりに動作することを確認することをおすすめします。

  6. 許可ポリシーを設定して、作成した出力ファイルのポリシーで現在の許可ポリシーをオーバーライドします。

    gcloud

    gcloud set-iam-policy コマンドは、リクエストのポリシーをプロジェクト、フォルダ、組織の新しい許可ポリシーとして設定します。

    後述のコマンドデータを使用する前に、次のように置き換えます。

    • RESOURCE_TYPE: 許可ポリシーを設定するリソースのタイプ。有効な値は projectsresource-manager foldersorganizations です。

    • RESOURCE_ID: Cloud de Confiance プロジェクト、フォルダ、または組織の ID。プロジェクト ID は英数字です(例: my-project)。フォルダ ID と組織 ID は数値です(例: 123456789012)。

    • PATH: 新しい許可ポリシーを含むファイルのパス。

    次のコマンドを実行します。

    Linux、macOS、Cloud Shell

    gcloud RESOURCE_TYPE set-iam-policy RESOURCE_ID PATH

    Windows(PowerShell)

    gcloud RESOURCE_TYPE set-iam-policy RESOURCE_ID PATH

    Windows(cmd.exe)

    gcloud RESOURCE_TYPE set-iam-policy RESOURCE_ID PATH

    レスポンスには、更新された許可ポリシーが含まれます。

    たとえば、次のコマンドは、policy.json に保存されている許可ポリシーをプロジェクト my-project の許可ポリシーとして設定します。

    gcloud projects set-iam-policy my-project ~/policy.json

    C#

    
    using Google.Apis.Auth.OAuth2;
    using Google.Apis.CloudResourceManager.v1;
    using Google.Apis.CloudResourceManager.v1.Data;
    
    public partial class AccessManager
    {
        public static Policy SetPolicy(string projectId, Policy policy)
        {
            var credential = GoogleCredential.GetApplicationDefault()
                .CreateScoped(CloudResourceManagerService.Scope.CloudPlatform);
            var service = new CloudResourceManagerService(
                new CloudResourceManagerService.Initializer
                {
                    HttpClientInitializer = credential
                });
    
            return service.Projects.SetIamPolicy(new SetIamPolicyRequest
            {
                Policy = policy
            }, projectId).Execute();
        }
    }
    

    Java

    Resource Manager に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、始める前にをご覧ください。

    Resource Manager 用のクライアント ライブラリをインストールして使用する方法については、Resource Manager クライアント ライブラリをご覧ください。

    次の例は、プロジェクトの許可ポリシーを設定する方法を示しています。フォルダまたは組織の許可ポリシーを設定する方法については、ご使用のプログラミング言語の Resource Manager クライアント ライブラリのドキュメントをご覧ください。

    import com.google.cloud.resourcemanager.v3.ProjectsClient;
    import com.google.iam.admin.v1.ProjectName;
    import com.google.iam.v1.Policy;
    import com.google.iam.v1.SetIamPolicyRequest;
    import com.google.protobuf.FieldMask;
    import java.io.IOException;
    import java.util.Arrays;
    import java.util.List;
    
    public class SetProjectPolicy {
      public static void main(String[] args) throws IOException {
        // TODO(developer): Replace the variables before running the sample.
        // TODO: Replace with your project ID.
        String projectId = "your-project-id";
        // TODO: Replace with your policy, GetPolicy.getPolicy(projectId, serviceAccount).
        Policy policy = Policy.newBuilder().build();
    
        setProjectPolicy(policy, projectId);
      }
    
      // Sets a project's policy.
      public static Policy setProjectPolicy(Policy policy, String projectId)
              throws IOException {
    
        // Initialize client that will be used to send requests.
        // This client only needs to be created once, and can be reused for multiple requests.
        try (ProjectsClient projectsClient = ProjectsClient.create()) {
          List<String> paths = Arrays.asList("bindings", "etag");
          SetIamPolicyRequest request = SetIamPolicyRequest.newBuilder()
                  .setResource(ProjectName.of(projectId).toString())
                  .setPolicy(policy)
                  // A FieldMask specifying which fields of the policy to modify. Only
                  // the fields in the mask will be modified. If no mask is provided, the
                  // following default mask is used:
                  // `paths: "bindings, etag"`
                  .setUpdateMask(FieldMask.newBuilder().addAllPaths(paths).build())
                  .build();
    
          return projectsClient.setIamPolicy(request);
        }
      }
    }

    Python

    Resource Manager に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、始める前にをご覧ください。

    Resource Manager 用のクライアント ライブラリをインストールして使用する方法については、Resource Manager クライアント ライブラリをご覧ください。

    次の例は、プロジェクトの許可ポリシーを設定する方法を示しています。フォルダまたは組織の許可ポリシーを設定する方法については、ご使用のプログラミング言語の Resource Manager クライアント ライブラリのドキュメントをご覧ください。

    from google.cloud import resourcemanager_v3
    from google.iam.v1 import iam_policy_pb2, policy_pb2
    
    
    def set_project_policy(
        project_id: str, policy: policy_pb2.Policy, merge: bool = True
    ) -> policy_pb2.Policy:
        """
        Set policy for project. Pay attention that previous state will be completely rewritten.
        If you want to update only part of the policy follow the approach read->modify->write.
        For more details about policies check out https://cloud.google.com/iam/docs/policies
    
        project_id: ID or number of the Google Cloud project you want to use.
        policy: Policy which has to be set.
        merge: The strategy to be used forming the request. CopyFrom is clearing both mutable and immutable fields,
        when MergeFrom is replacing only immutable fields and extending mutable.
        https://googleapis.dev/python/protobuf/latest/google/protobuf/message.html#google.protobuf.message.Message.CopyFrom
        """
        client = resourcemanager_v3.ProjectsClient()
    
        request = iam_policy_pb2.GetIamPolicyRequest()
        request.resource = f"projects/{project_id}"
        current_policy = client.get_iam_policy(request)
    
        # Etag should as fresh as possible to lower chance of collisions
        policy.ClearField("etag")
        if merge:
            current_policy.MergeFrom(policy)
        else:
            current_policy.CopyFrom(policy)
    
        request = iam_policy_pb2.SetIamPolicyRequest()
        request.resource = f"projects/{project_id}"
    
        # request.etag field also will be merged which means you are secured from collision,
        # but it means that request may fail and you need to leverage exponential retries approach
        # to be sure policy has been updated.
        request.policy.CopyFrom(current_policy)
    
        policy = client.set_iam_policy(request)
        return policy
    
    

    REST

    Resource Manager API の set-iam-policy メソッドを使用して、プロジェクト、フォルダまたは組織の新しい許可ポリシーとしてリクエストのポリシーを設定します。

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

    • API_VERSION: 使用する API のバージョン。プロジェクトと組織の場合は、v1 を使用します。フォルダの場合は、v2 を使用します。
    • RESOURCE_TYPE: ポリシーを管理するリソースタイプ。値 projectsfolders、または organizations を使用します。
    • RESOURCE_ID: Cloud de Confianceプロジェクト、組織、またはフォルダ ID。プロジェクト ID は英数字からなる文字列です(例: my-project)。フォルダ ID と組織 ID は数値です(例: 123456789012)。
    • POLICY: 設定するポリシーの JSON 表現。ポリシーの形式については、ポリシー リファレンスをご覧ください。

    HTTP メソッドと URL:

    POST https://cloudresourcemanager.googleapis.com/API_VERSION/RESOURCE_TYPE/RESOURCE_ID:setIamPolicy

    リクエストの本文(JSON):

    {
      "policy": POLICY
    }
    

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

    レスポンスには、更新された許可ポリシーが含まれます。