이전 버전의 IAM 허용 정책 복원

이 페이지에서는 실수로 변경하거나 삭제한 후 이전 버전의 IAM 허용 정책을 복원하는 방법을 설명합니다.

이전 IAM 정책을 복원하려면 변경 또는 삭제 전 마지막으로 성공한 setIamPolicy를 찾아 이를 사용하여 정책을 복원합니다.

Cloud 애셋 인벤토리를 사용하여 IAM 변경 기록을 찾고 이를 사용하여 정책을 복원할 수도 있습니다.

필요한 역할

이전 허용 정책을 복원하는 데 필요한 권한을 얻으려면 관리자에게 프로젝트, 폴더 또는 조직에 대한 다음 IAM 역할을 부여해 달라고 요청하세요.

역할 부여에 대한 자세한 내용은 프로젝트, 폴더, 조직에 대한 액세스 관리를 참조하세요.

setIamPolicy로 허용 정책을 복원할 때는 조직 및 폴더 수준 허용 정책에 조직 관리자 역할이 필요하고 프로젝트 수준 허용 정책에 소유자 역할이 필요합니다.

커스텀 역할이나 다른 사전 정의된 역할을 사용하여 이 권한을 부여받을 수도 있습니다.

마지막으로 성공한 setIamPolicy 인스턴스로 허용 정책 복원

허용 정책을 이전 버전으로 복원하려면 변경 또는 삭제 전 마지막으로 성공한 setIamPolicy 인스턴스의 감사 로그를 검토하고 해당 인스턴스의 정보를 사용하여 정책을 복원하면 됩니다. 이 프로세스는 다음 단계를 포함합니다.

  1. 허용 정책의 마지막 성공적인 setIamPolicy 인스턴스를 식별하고 insertId을 검색합니다.
  2. setIamPolicy 요청의 insertId를 사용하여 허용 정책을 YAML 또는 JSON 형식으로 내보냅니다.
  3. 이전 작업 허용 정책과 일치하도록 출력 파일을 수정하고 현재 허용 정책을 재정의합니다.

마지막으로 성공한 setIamPolicy 인스턴스를 식별하고 insertId을 가져옵니다.

setIamPolicy의 마지막 성공적인 인스턴스를 식별하고 isertId를 검색하려면 Google Cloud 콘솔 또는 gcloud CLI를 사용하여 감사 로그를 검토하세요.

콘솔

  1. Google Cloud 콘솔에서 로그 탐색기 페이지로 이동합니다.

    로그 탐색기로 이동

  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: 감사 로그를 나열하는 리소스 유형입니다. 유효한 값은 projects, folders, organizations입니다.
      • RESOURCE_ID: Google Cloud 프로젝트, 폴더, 조직 ID입니다. 프로젝트 ID는 my-project와 같은 영숫자입니다. 폴더 및 조직 ID는 123456789012와 같은 숫자입니다.
      • EMAIL_ADDRESS: 사용자 또는 서비스 계정의 이메일 주소(예: example-service-account@example-project.iam.gserviceaccount.com)
  3. 쿼리를 실행하기 위해 쿼리 실행을 클릭합니다.

  4. 타임라인 선택기를 사용하여 쿼리의 적합한 기간을 지정합니다. 또는 타임스탬프 표현식을 쿼리 편집기에 직접 추가할 수 있습니다. 자세한 내용은 시간 범위별 로그 보기를 참조하세요.

  5. 변경 또는 삭제 전 마지막으로 성공한 setIamPolicy 인스턴스에서 insertId를 복사합니다.

gcloud

gcloud logging read 명령어는 로그 항목을 읽습니다.

아래의 명령어 데이터를 사용하기 전에 다음을 바꿉니다.

  • RESOURCE_TYPE: 감사 로그를 나열하는 리소스 유형입니다. projects, folders, organizations 값을 사용합니다.
  • RESOURCE_ID: Google Cloud프로젝트, 조직, 폴더 ID입니다. 프로젝트 ID는 my-project와 같은 영숫자 문자열입니다. 폴더 및 조직 ID는 123456789012와 같은 숫자입니다.
  • TIME_PERIOD: 감사 로그를 나열하는 기간입니다. 이 값보다 오래된 항목은 반환되지 않습니다. 지정하지 않을 경우 기본값은 1d입니다. 시간 형식에 대한 자세한 내용은 gcloud topic datetimes를 참조하세요.
  • RESOURCE_TYPE_SINGULAR: 감사 로그를 나열하는 리소스 유형입니다. project, folder, 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.json 또는 previous_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.json 또는 previous_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: 허용 정책을 가져오려는 리소스의 유형입니다. 유효한 값은 projects, resource-manager folders 또는 organizations입니다.

    • RESOURCE_ID: Google Cloud 프로젝트, 폴더, 조직 ID입니다. 프로젝트 ID는 my-project와 같은 영숫자입니다. 폴더 및 조직 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: 정책을 관리할 리소스 유형. projects, folders, organizations 값을 사용합니다.
    • RESOURCE_ID: Google Cloud프로젝트, 조직, 폴더 ID입니다. 프로젝트 ID는 my-project와 같은 영숫자 문자열입니다. 폴더 및 조직 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": [
            "user:my-user@example.com"
          ]
        }
      ]
    }
    

    적절한 유형의 파일로 응답을 저장합니다(json 또는 yaml).

  3. 현재 허용 정책에서 etag 값을 복사합니다.

  4. 출력 파일의 etag 값을 현재 허용 정책에서 복사한 etag 값으로 바꿉니다. 새 setIamPolicy 요청을 시작하려면 출력 파일의 etag가 현재 etag와 일치해야 합니다. etag의 간격이 출력 파일에서 변경되지 않았는지 확인합니다.

  5. 파일을 검토하여 이전의 작동하는 허용 정책과 일치하는지 확인합니다. 새 프로젝트를 만들고 정책을 적용하여 의도한 대로 작동하는지 확인하는 것이 좋습니다.

  6. 허용 정책을 설정하여 생성한 출력 파일의 정책으로 현재 허용 정책을 재정의합니다.

    gcloud

    gcloud set-iam-policy 명령어는 요청의 정책을 프로젝트, 폴더 또는 조직의 새 허용 정책으로 설정합니다.

    아래의 명령어 데이터를 사용하기 전에 다음을 바꿉니다.

    • RESOURCE_TYPE: 허용 정책을 설정하려는 리소스 유형입니다. 유효한 값은 projects, resource-manager folders, organizations입니다.

    • RESOURCE_ID: Google Cloud 프로젝트, 폴더, 조직 ID입니다. 프로젝트 ID는 my-project와 같은 영숫자입니다. 폴더 및 조직 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: 정책을 관리할 리소스 유형. projects, folders, organizations 값을 사용합니다.
    • RESOURCE_ID: Google Cloud프로젝트, 조직, 폴더 ID입니다. 프로젝트 ID는 my-project와 같은 영숫자 문자열입니다. 폴더 및 조직 ID는 123456789012와 같은 숫자입니다.
    • POLICY: 설정하려는 정책의 JSON 표현입니다. 정책 형식에 대한 자세한 내용은 정책 참조를 확인하세요.

    HTTP 메서드 및 URL:

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

    JSON 요청 본문:

    {
      "policy": POLICY
    }
    

    요청을 보내려면 다음 옵션 중 하나를 펼칩니다.

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

Cloud 애셋 인벤토리로 허용 정책 복원

허용 정책을 이전 버전으로 복원하려면 Cloud 애셋 인벤토리를 사용하여 리소스의 허용 정책 변경 기록을 확인하고 이 정보를 사용하여 정책을 복원하면 됩니다. 이 프로세스는 다음과 같은 단계로 진행됩니다.

  1. Cloud 애셋 인벤토리를 사용하여 허용 정책의 변경 기록을 검토하고 복원할 허용 정책을 식별합니다.
  2. 허용 정책을 복사하고 JSON 형식으로 새 파일을 만듭니다.
  3. 현재 허용 정책을 새 파일의 정책으로 재정의합니다.

Cloud 애셋 인벤토리로 허용 정책 변경 내역 검토

콘솔

  1. Google Cloud 콘솔에서 애셋 인벤토리 페이지로 이동합니다.

    애셋 인벤토리로 이동

  2. IAM 정책 탭을 클릭합니다.

  3. 필터 필드에서 다음 쿼리를 실행합니다.

    Resource : RESOURCE_ID

    RESOURCE_ID를 Google Cloud프로젝트, 폴더 또는 조직 ID로 바꿉니다. 프로젝트 ID는 my-project와 같은 영숫자입니다. 폴더 및 조직 ID는 123456789012와 같은 숫자입니다.

  4. 리소스 허용 정책의 변경 내역을 보려면 리소스 이름을 클릭한 후 변경 내역 탭을 선택합니다.

  5. 리소스의 허용 정책에 대한 변경사항을 비교하려면 비교할 레코드 선택 메뉴에서 두 가지 서로 다른 타임스탬프 레코드를 선택합니다.

gcloud

gcloud asset get-history 명령어는 어느 한 애셋에서 특정 기간과 겹치는 허용 정책의 업데이트된 기록을 가져옵니다.

아래의 명령어 데이터를 사용하기 전에 다음을 바꿉니다.

  • RESOURCE_TYPE: 감사 로그를 나열하는 리소스 유형입니다. project, folder, organization 값을 사용합니다.
  • RESOURCE_ID: Google Cloud프로젝트, 조직, 폴더 ID입니다. 프로젝트 ID는 my-project와 같은 영숫자 문자열입니다. 폴더 및 조직 ID는 123456789012와 같은 숫자입니다.
  • ASSET_NAME: 허용 정책 기록을 확인하려는 리소스에 대해 쉼표로 구분된 형식 지정된 리소스 이름 목록입니다. 예를 들면 //cloudresourcemanager.googleapis.com/projects/my-project입니다. 이러한 리소스는 허용 정책을 수락하는 모든 리소스 유형일 수 있습니다.
  • START_TIME: 기간의 시작 지점입니다. 최대 기간은 7일입니다. 값은 현재 시간 또는 35일 이내의 과거 시간이어야 합니다. 시간 형식에 대한 자세한 내용은 gcloud topic datetimes를 참조하세요.
  • END_TIME: 선택사항. 기간의 종료 지점입니다. 최대 기간은 7일입니다. 값은 현재 시간 또는 35일 이내의 과거 시간이어야 합니다. 제공하지 않으면 종료 시간이 현재 시간으로 간주됩니다. 시간 형식에 대한 자세한 내용은 gcloud topic datetimes를 참조하세요.

다음 명령어를 실행합니다.

Linux, macOS 또는 Cloud Shell

gcloud asset get-history \
    --RESOURCE_TYPE=RESOURCE_ID \
    --asset-names=ASSET_NAME_1,ASSET_NAME_2,... \
    --content-type=iam-policy \
    --start-time=START_TIME \
    --end-time=END_TIME

Windows(PowerShell)

gcloud asset get-history `
    --RESOURCE_TYPE=RESOURCE_ID `
    --asset-names=ASSET_NAME_1,ASSET_NAME_2,... `
    --content-type=iam-policy `
    --start-time=START_TIME `
    --end-time=END_TIME

Windows(cmd.exe)

gcloud asset get-history ^
    --RESOURCE_TYPE=RESOURCE_ID ^
    --asset-names=ASSET_NAME_1,ASSET_NAME_2,... ^
    --content-type=iam-policy ^
    --start-time=START_TIME ^
    --end-time=END_TIME

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

새 허용 정책 파일 만들기

허용 정책 기록을 검토하고 복원할 허용 정책을 확인한 후 다음 단계를 완료합니다.

  1. "bindings" 줄부터 "etag" 줄까지 복원하려는 허용 정책을 복사합니다.

  2. 복사한 허용 정책을 새 파일에 붙여넣고 중괄호({})를 사용하여 정책을 묶습니다. 예를 들어 허용 정책은 다음과 같을 수 있습니다.

     {
      "bindings": [
        {
          "role": "roles/resourcemanager.organizationAdmin",
          "members": [
            "user:mike@example.com",
            "group:admins@example.com",
            "domain:google.com",
            "serviceAccount:my-service-account@my-project.iam.gserviceaccount.com"
          ]
        },
        {
          "role": "roles/resourcemanager.organizationViewer",
          "members": [
            "user:eve@example.com"
          ],
          "condition": {
            "title": "expirable access",
            "description": "Does not grant access after Sep 2020",
            "expression": "request.time < timestamp('2020-10-01T00:00:00.000Z')",
          }
        }
      ],
      "etag": "BwWWja0YfJA=",
     }
    
  3. 파일을 JSON 형식으로 저장합니다. 예를 들어 새 파일 이름을 previous_iam_policy.json로 지정할 수 있습니다.

새 허용 정책 설정

허용 정책을 설정하여 생성한 출력 파일의 정책으로 현재 허용 정책을 재정의합니다.

gcloud

gcloud set-iam-policy 명령어는 요청의 정책을 프로젝트, 폴더 또는 조직의 새 허용 정책으로 설정합니다.

아래의 명령어 데이터를 사용하기 전에 다음을 바꿉니다.

  • RESOURCE_TYPE: 허용 정책을 설정하려는 리소스 유형입니다. 유효한 값은 projects, resource-manager folders, organizations입니다.

  • RESOURCE_ID: Google Cloud 프로젝트, 폴더, 조직 ID입니다. 프로젝트 ID는 my-project와 같은 영숫자입니다. 폴더 및 조직 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: 정책을 관리할 리소스 유형. projects, folders, organizations 값을 사용합니다.
  • RESOURCE_ID: Google Cloud프로젝트, 조직, 폴더 ID입니다. 프로젝트 ID는 my-project와 같은 영숫자 문자열입니다. 폴더 및 조직 ID는 123456789012와 같은 숫자입니다.
  • POLICY: 설정하려는 정책의 JSON 표현입니다. 정책 형식에 대한 자세한 내용은 정책 참조를 확인하세요.

HTTP 메서드 및 URL:

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

JSON 요청 본문:

{
  "policy": POLICY
}

요청을 보내려면 다음 옵션 중 하나를 펼칩니다.

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