세분화된 IAM 작업을 사용하도록 스크립트를 사용하여 정책을 대량으로 마이그레이션 - AWS 대금 청구

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

세분화된 IAM 작업을 사용하도록 스크립트를 사용하여 정책을 대량으로 마이그레이션

참고

다음 AWS Identity and Access Management (IAM) 작업은 2023년 7월에 표준 지원이 종료되었습니다.

  • aws-portal 네임스페이스

  • purchase-orders:ViewPurchaseOrders

  • purchase-orders:ModifyPurchaseOrders

를 사용하는 AWS Organizations경우 대량 정책 마이그레이션 스크립트 또는 대량 정책 마이그레이션기를 사용하여 지급인 계정에서 정책을 업데이트할 수 있습니다. 또한 기존 작업-세분화 작업 매핑 참조를 사용하여 추가해야 하는 IAM 작업을 확인할 수 있습니다.

2023년 3월 6일 오전 11시 (PDT) 또는 그 이후에 AWS Organizations 생성된 콘텐츠가 있거나 해당 콘텐츠에 참여하고 있는 경우, 세분화된 조치가 이미 조직에 적용되고 있습니다. AWS 계정

세분화된 작업이라는 새 작업을 사용하도록 IAM 정책을 마이그레이션하려면 AWS  샘플 웹 사이트에서 스크립트를 사용할 수 있습니다.

해당 조직의 지급인 계정에서 제공되는 이러한 스크립트를 실행하여 이전 IAM 작업을 사용하는 조직에서 다음과 같은 영향을 받는 정책을 식별하세요.

  • 고객 관리형 IAM 정책

  • 역할, 그룹 및 사용자 IAM 인라인 정책

  • 서비스 제어 정책(SCP)(지급인 계정에만 적용)

  • 권한 세트

스크립트는 정책에 사용된 기존 작업에 대응되는 새로운 작업에 대한 제안을 생성합니다. 그런 다음 제안 사항을 검토하고 스크립트를 사용하여 조직에 있는 영향을 받는 모든 정책에 새로운 작업을 추가합니다. AWS 관리형 정책 또는 AWS 관리형 SCP (예: 및 SCP) 는 업데이트할 필요가 없습니다. AWS Control Tower AWS Organizations

이러한 스크립트를 사용하여 다음을 수행할 수 있습니다.

  • 정책 업데이트를 간소화하여 지급인 계정에서 영향을 받는 정책을 관리할 수 있습니다.

  • 정책을 업데이트하기 위해 필요한 시간을 단축합니다. 각 멤버 계정에 로그인하여 정책을 수동으로 업데이트할 필요가 없습니다.

  • 서로 다른 멤버 계정의 동일한 정책을 함께 그룹으로 묶습니다. 그리고 나면 업데이트를 하나씩 검토하는 대신 모든 동일한 정책 전반에서 같은 업데이트를 검토하고 적용할 수 있습니다.

  • 2023년 7월 6일에 기존 IAM 작업을 AWS 중단한 후에도 사용자 액세스가 영향을 받지 않도록 하십시오.

정책 및 서비스 제어 정책(SCP)에 대한 자세한 내용은 다음 주제를 참조하세요.

개요

이 주제에 따라 다음 단계를 완료하세요.

사전 조건 

시작하기 전에 반드시 다음을 준비해야 합니다.

  • Python 3 다운로드 및 설치

  • 지급인 계정에 로그인하여 다음의 IAM 권한을 가진 IAM 보안 주체가 있는지 확인하세요.

    "iam:GetAccountAuthorizationDetails", "iam:GetPolicy", "iam:GetPolicyVersion", "iam:GetUserPolicy", "iam:GetGroupPolicy", "iam:GetRole", "iam:GetRolePolicy", "iam:CreatePolicyVersion", "iam:DeletePolicyVersion", "iam:ListAttachedRolePolicies", "iam:ListPolicyVersions", "iam:PutUserPolicy", "iam:PutGroupPolicy", "iam:PutRolePolicy", "iam:SetDefaultPolicyVersion", "organizations:ListAccounts", "organizations:ListPolicies", "organizations:DescribePolicy", "organizations:UpdatePolicy", "organizations:DescribeOrganization", "sso:DescribePermissionSet", "sso:DescribePermissionSetProvisioningStatus", "sso:GetInlinePolicyForPermissionSet", "sso:ListInstances", "sso:ListPermissionSets", "sso:ProvisionPermissionSet", "sso:PutInlinePolicyToPermissionSet", "sts:AssumeRole"
작은 정보

시작하려면 계정의 하위 집합(예: 테스트 계정)을 사용하여 제안된 변경 사항이 예상되는지 확인하는 것이 좋습니다.

그리고 나면 조직의 나머지 계정에 대해 스크립트를 다시 실행할 수 있습니다.

1단계: 환경 설정

시작하려면 필수 파일들을 AWS  샘플 웹 사이트에서 다운로드하세요. 그런 다음 명령을 실행하여 환경을 설정하세요.

환경을 설정하려면
  1. AWS  샘플 웹 사이트에서 리포지토리를 복제하세요. 명령줄 창에서 다음 명령을 사용할 수 있습니다.

    git clone https://github.com/aws-samples/bulk-policy-migrator-scripts-for-account-cost-billing-consoles.git
  2. 파일을 다운로드한 디렉터리로 이동합니다. 다음 명령을 사용할 수 있습니다.

    cd bulk-policy-migrator-scripts-for-account-cost-billing-consoles

    리포지토리에서 다음과 같은 스크립트 및 리소스를 확인할 수 있습니다.

    • billing_console_policy_migrator_role.json— 조직의 구성원 계정에 BillingConsolePolicyMigratorRole IAM 역할을 생성하는 CloudFormation 템플릿입니다. 이 역할은 스크립트에서 역할을 맡은 다음 영향을 받는 정책을 읽고 업데이트할 수 있게 해줍니다.

    • action_mapping_config.json— 이전 작업을 새 작업에 one-to-many 매핑한 내용이 들어 있습니다. 스크립트는 이 파일을 사용하여 이전 작업이 포함되어 있고 영향 받는 각 정책에 대하여 새로운 작업을 제안합니다.

      이전 작업은 각각 여러 개의 세분화된 작업에 대응됩니다. 파일에 제안된 새 작업을 통해 사용자는 마이그레이션 AWS 서비스 전에 동일한 작업에 액세스할 수 있습니다.

    • identify_affected_policies.py – 조직에서 영향을 받는 정책을 검사하고 식별합니다. 이 스크립트는 영향을 받는 정책을 제안된 새로운 작업과 함께 나열하는 affected_policies_and_suggestions.json 파일을 생성합니다.

      동일한 이전 작업 세트를 사용하는 영향을 받는 정책은 JSON 파일에 함께 그룹으로 묶입니다. 따라서 제안된 새로운 작업을 검토하거나 업데이트할 수 있습니다.

    • update_affected_policies.py – 조직에서 영향을 받는 정책을 업데이트합니다. 스크립트는 affected_policies_and_suggestions.json 파일을 입력한 다음 정책에 제안된 새로운 작업을 추가합니다.

    • rollback_affected_policies.py – (선택 사항) 영향을 받는 정책에 대한 변경 사항을 되돌립니다. 이 스크립트는 영향을 받는 정책에서 세분화된 새로운 작업을 제거합니다.

  3. 다음 명령을 실행하여 가상 환경을 설정하고 활성화합니다.

    python3 -m venv venv
    source venv/bin/activate
  4. 다음 명령을 실행하여 AWS SDK for Python (Boto3) 종속 항목을 설치합니다.

    pip install -r requirements.txt
    참고

    AWS Command Line Interface (AWS CLI) 를 사용하도록 AWS 자격 증명을 구성해야 합니다. 자세한 정보는 AWS SDK for Python (Boto3)을 참조하세요.

자세한 내용은 README.md 파일을 참조하세요.

2단계: 만들기 CloudFormation StackSet

다음 절차에 따라 CloudFormation 스택 세트를 생성합니다. 그러면 이 스택 세트에서 조직의 모든 멤버 계정에 대한 BillingConsolePolicyMigratorRole IAM 역할이 생성됩니다.

참고

이 단계는 관리 계정(지급인 계정)에서 한 번만 수행하는 것으로 충분합니다.

생성하려면 CloudFormation StackSet
  1. 텍스트 편집기에서 billing_console_policy_migrator_role.json 파일을 열고 <management_account>의 각 인스턴스를 지급인 계정의 계정 ID(예: 123456789012)로 바꿉니다.

  2. 파일을 저장합니다.

  3. AWS Management Console 지급인 계정으로 로그인합니다.

  4. CloudFormation 콘솔에서 업데이트한 billing_console_policy_migrator_role.json 파일로 스택 세트를 생성합니다.

    자세한 내용은 AWS CloudFormation 사용 설명서의 AWS CloudFormation 콘솔에서 스택 세트 만들기를 참조하십시오.

스택 세트를 CloudFormation 생성한 후에는 조직의 각 구성원 계정에 BillingConsolePolicyMigratorRole IAM 역할이 부여됩니다.

IAM 역할에는 다음과 같은 권한이 포함됩니다.

"iam:GetAccountAuthorizationDetails", "iam:GetPolicy", "iam:GetPolicyVersion", "iam:GetUserPolicy", "iam:GetGroupPolicy", "iam:GetRolePolicy", "iam:CreatePolicyVersion", "iam:DeletePolicyVersion", "iam:ListPolicyVersions", "iam:PutUserPolicy", "iam:PutGroupPolicy", "iam:PutRolePolicy", "iam:SetDefaultPolicyVersion"
참고
  • 스크립트는 각 구성원 계정에 대해 AssumeRoleAPI 작업을 호출하여 BillingConsolePolicyMigratorRole IAM 역할을 수임하기 위한 임시 자격 증명을 가져옵니다.

  • 스크립트는 ListAccountsAPI 작업을 호출하여 모든 멤버 계정을 가져옵니다.

  • 또한 스크립트는 IAM API 작업을 호출하여 정책에 대한 읽기 및 쓰기 권한을 수행합니다.

3단계: 영향을 받는 정책 파악

스택 세트를 만들고 파일을 다운로드한 후 identify_affected_policies.py 스크립트를 실행하세요. 이 스크립트는 각 멤버 계정의 BillingConsolePolicyMigratorRole IAM 역할을 맡은 후 영향을 받는 정책을 파악합니다.

영향을 받는 정책을 파악하려면
  1. 스크립트를 다운로드한 디렉터리로 이동합니다.

    cd policy_migration_scripts/scripts
  2. identify_affected_policies.py스크립트 실행.

다음 입력 파라미터를 사용할 수 있습니다.

  • AWS 계정 스크립트로 스캔하려는 내용. 계정을 지정하려면 다음과 같은 입력 파라미터를 사용하세요.

    • --all – 조직의 모든 멤버 계정을 검사합니다.

      python3 identify_affected_policies.py --all
    • --accounts – 조직에 있는 멤버 계정의 서브셋을 검사합니다.

      python3 identify_affected_policies.py --accounts 111122223333, 444455556666, 777788889999
    • --exclude-accounts – 조직에 있는 특정한 멤버 계정을 제외합니다.

      python3 identify_affected_policies.py --all --exclude-accounts 111111111111, 222222222222, 333333333333
  • –-action-mapping-config-file – (선택 사항) action_mapping_config.json 파일의 경로를 지정합니다. 스크립트는 이 파일을 사용하여 영향을 받는 정책에 대한 제안된 업데이트를 생성합니다. 경로를 지정하지 않으면 스크립트에서 폴더의 action_mapping_config.json 파일을 사용합니다.

    python3 identify_affected_policies.py –-action-mapping-config-file c:\Users\username\Desktop\Scripts\action_mapping_config.json –-all
참고

이 스크립트를 사용해서 조직 단위(OU)를 지정할 수는 없습니다.

스크립트를 실행한 후에는 Affected_Policies_<Timestamp> 폴더에 두 개의 JSON 파일이 만들어집니다.

  • affected_policies_and_suggestions.json

  • detailed_affected_policies.json

affected_policies_and_suggestions.json

영향을 받는 정책을 제안된 새로운 작업과 함께 나열합니다. 동일한 이전 작업 세트를 사용하는 영향을 받는 정책은 파일에서 함께 그룹화됩니다.

이 파일은 다음 섹션을 포함하고 있습니다.

  • 다음 사항을 포함하여 스크립트에서 지정한 계정을 개략적으로 설명하는 메타데이터

    • 검사한 계정과 identify_affected_policies.py 스크립트에 사용된 입력 파라미터

    • 영향을 받는 계정 수

    • 영향을 받는 정책 수

    • 유사한 정책 그룹 수

  • 유사 정책 그룹 – 다음과 같은 섹션을 포함하여 계정과 정책 세부 정보 목록을 포함합니다.

    • ImpactedPolicies – 영향을 받고 그룹에 포함되는 정책을 지정합니다.

    • ImpactedPolicyStatements – 현재 영향을 받는 정책에서 이전 작업을 사용하는 Sid 블록에 대한 정보를 제공합니다. 이 섹션에는 이전 작업과 Effect, Principal, NotPrincipalNotAction 및Condition과 같은  IAM 요소가 포함되어 있습니다.

  • SuggestedPolicyStatementsToAppend – 새로운 SID 블록으로 추가되는 제안된 새 작업을 제공합니다.

    정책을 업데이트할 경우 이 블록이 정책 끝부분에 추가됩니다.

예시 affected_policies_and_suggestions.json 파일

이 파일은 다음과 같은 기준에 따라 비슷한 정책을 그룹화합니다.

  • 같은 이전 작업 사용 – 모든 SID 블록 전반에서 같은 이전 작업을 포함하는 정책입니다.

  • 일치하는 세부 정보 – 정책에는 영향을 받는 작업 외에도 다음과 같은 동일한 IAM 요소가 있습니다.

    • Effect (Allow/Deny)

    • Principal(액세스가 허용되거나 거부된 사용자)

    • NotAction(허용되지 않는 작업)

    • NotPrincipal(액세스가 명시적으로 거부된 사용자)

    • Resource(정책이 적용되는 AWS 리소스)

    • Condition(정책이 적용되는 구체적인 조건)

참고

자세한 정보는 IAM 정책 예시을 참조하세요.

예: affected_policies_and_suggestions.json
[{ "AccountsScanned": [ "111111111111", "222222222222" ], "TotalAffectedAccounts": 2, "TotalAffectedPolicies": 2, "TotalSimilarPolicyGroups": 2 }, { "GroupName": "Group1", "ImpactedPolicies": [{ "Account": "111111111111", "PolicyType": "UserInlinePolicy", "PolicyName": "Inline-Test-Policy-Allow", "PolicyIdentifier": "1111111_1-user:Inline-Test-Policy-Allow" }, { "Account": "222222222222", "PolicyType": "UserInlinePolicy", "PolicyName": "Inline-Test-Policy-Allow", "PolicyIdentifier": "222222_1-group:Inline-Test-Policy-Allow" } ], "ImpactedPolicyStatements": [ [{ "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "aws-portal:ViewAccounts" ], "Resource": "*" }] ], "SuggestedPolicyStatementsToAppend": [{ "Sid": "BillingConsolePolicyMigrator0", "Effect": "Allow", "Action": [ "account:GetAccountInformation", "account:GetAlternateContact", "account:GetChallengeQuestions", "account:GetContactInformation", "billing:GetContractInformation", "billing:GetIAMAccessPreference", "billing:GetSellerOfRecord", "payments:ListPaymentPreferences" ], "Resource": "*" }] }, { "GroupName": "Group2", "ImpactedPolicies": [{ "Account": "111111111111", "PolicyType": "UserInlinePolicy", "PolicyName": "Inline-Test-Policy-deny", "PolicyIdentifier": "1111111_2-user:Inline-Test-Policy-deny" }, { "Account": "222222222222", "PolicyType": "UserInlinePolicy", "PolicyName": "Inline-Test-Policy-deny", "PolicyIdentifier": "222222_2-group:Inline-Test-Policy-deny" } ], "ImpactedPolicyStatements": [ [{ "Sid": "VisualEditor0", "Effect": "deny", "Action": [ "aws-portal:ModifyAccount" ], "Resource": "*" }] ], "SuggestedPolicyStatementsToAppend": [{ "Sid": "BillingConsolePolicyMigrator1", "Effect": "Deny", "Action": [ "account:CloseAccount", "account:DeleteAlternateContact", "account:PutAlternateContact", "account:PutChallengeQuestions", "account:PutContactInformation", "billing:PutContractInformation", "billing:UpdateIAMAccessPreference", "payments:UpdatePaymentPreferences" ], "Resource": "*" }] } ]
detailed_affected_policies.json

identify_affected_policies.py 스크립트에서 멤버 계정에 대해 식별한 영향을 받는 모든 정책에 대한 정의를 포함하고 있습니다.

파일은 비슷한 정책을 그룹화합니다. 이 파일을 참조로 사용하여 각 멤버 계정에 로그인하고 개별 정책 및 계정에 대한 업데이트를 각각 검토할 필요 없이 정책 변경 내용을 검토하고 관리할 수 있습니다.

파일에서 정책 이름(예: YourCustomerManagedReadOnlyAccessBillingUser)을 검색하고 영향을 받는 정책 정의를 검토할 수 있습니다.

예제: detailed_affected_policies.json
[{ "Account": "111111111111", "PolicyType": "CustomerManagedPolicy", "PolicyName": "AwsPortalviewAccount", "PolicyIdentifier": "arn:aws:iam::111111111111:policy/AwsPortalviewAccount", "PolicyDocument": { "Version": "2012-10-17", "Statement": [{ "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "aws-portal:ViewAccount" ], "Resource": "*" }] } }, { "Account": "222222222222", "PolicyType": "CustomerManagedPolicy", "PolicyName": "AwsPortalviewAccount", "PolicyIdentifier": "arn:aws:iam::222222222222:policy/AwsPortalviewAccount", "PolicyDocument": { "Version": "2012-10-17", "Statement": [{ "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "aws-portal:ViewAccount" ], "Resource": "*" }] } }, { "Account": "111111111111", "PolicyType": "CustomerManagedPolicy", "PolicyName": "AwsPortalModifyAccount", "PolicyIdentifier": "arn:aws:iam::111111111111:policy/AwsPortalModifyAccount", "PolicyDocument": { "Version": "2012-10-17", "Statement": [{ "Sid": "VisualEditor0", "Effect": "Deny", "Action": [ "aws-portal:ModifyAccount" ], "Resource": "*" }] } }, { "Account": "222222222222", "PolicyType": "CustomerManagedPolicy", "PolicyName": "AwsPortalModifyAccount", "PolicyIdentifier": "arn:aws:iam::222222222222:policy/AwsPortalModifyAccount", "PolicyDocument": { "Version": "2012-10-17", "Statement": [{ "Sid": "VisualEditor0", "Effect": "Deny", "Action": [ "aws-portal:ModifyAccount" ], "Resource": "*" }] } } ]

4단계: 제안된 변경 내용 검토

스크립트에서 affected_policies_and_suggestions.json 파일이 생성되면 해당 파일을 검토하고 변경하세요.

영향을 받는 정책을 검토하려면
  1. 텍스트 편집기에서 affected_policies_and_suggestions.json 파일을 엽니다.

  2. AccountsScanned 섹션에서 검사한 계정 전반에서 식별된 비슷한 그룹의 수가 예상되는지 확인하세요.

  3. 영향을 받는 정책에 추가될 예정인 제안된 세분화된 작업을 검토합니다.

  4. 필요에 따라 파일을 업데이트한 다음 저장하세요.

예 1: action_mapping_config.json 파일 업데이트

action_mapping_config.json에서 제안된 매핑을 업데이트할 수 있습니다. 파일을 업데이트한 후 identify_affected_policies.py 스크립트를 다시 실행할 수 있습니다. 이 스크립트에서는 영향을 받는 정책에 대한 업데이트된 제안을 생성합니다.

action_mapping_config.json 파일의 버전을 여러 개 만들어 다른 권한을 가진 여러 개의 계정에 대한 정책을 변경할 수 있습니다. 예를 들어, 이름이 action_mapping_config_testing.json인 파일을 하나 만들어 테스트 계정과 action_mapping_config_production.json 프로덕션 계정에 대한 권한을 마이그레이션할 수 있습니다.

예 2: affected_policies_and_suggestions.json 파일 업데이트

영향을 받는 특정 정책 그룹에 대해 제안된 교체를 변경하려면 affected_policies_and_suggestions.json 파일 안에서 제안된 교체 섹션을 직접 편집할 수 있습니다.

이 섹션에서 변경한 사항은 영향을 받는 특정 정책 그룹 안에 있는 모든 정책에 적용됩니다.

예 3: 특정 정책 사용자 지정

영향을 받는 정책 그룹 내에서 제안된 업데이트와 다르게 변경해야 할 정책을 발견할 경우 다음과 같은 작업을 수행할 수 있습니다.

  • identify_affected_policies.py 스크립트에서 특정 계정을 제외하세요. 그리고 나서 제외된 해당 계정을 별도로 검토할 수 있습니다.

  • 영향을 받는 정책과 다른 권한이 필요한 계정을 제거하여 영향을 받는 Sid 블록을 업데이트합니다. 특정 계정만 포함하거나 영향을 받는 현재 업데이트 정책 실행에서 제외하는 JSON 블록을 만드세요.

    identify_affected_policies.py 스크립트를 다시 실행할 경우 업데이트된 블록에 관련 계정만 표시됩니다. 그러면 해당 특정 Sid 블록에 대해 제안된 교체 항목을  수정할 수 있습니다.

5단계: 영향을 받는 정책 업데이트

제안된 교체를 검토하고 수정하고 나면 update_affected_policies.py 스크립트를 실행하세요. 스크립트는 입력으로 affected_policies_and_suggestions.json 파일을 사용합니다. 이 스크립트는 BillingConsolePolicyMigratorRole IAM 역할을 맡아 affected_policies_and_suggestions.json 파일에 나열된 영향을 받는 정책을 업데이트합니다.

영향을 받는 정책을 업데이트하려면
  1. 아직 수행하지 않은 경우,  AWS CLI에 대한 명령줄 창을 여세요.

  2. 다음 명령을 입력하여 update_affected_policies.py 스크립트를 실행합니다. 다음과 같은 입력 파라미터를 입력할 수 있습니다.

  • 업데이트할 영향을 받는 정책의 목록이 포함된 affected_policies_and_suggestions.json 파일의 디렉터리 경로입니다. 이 파일은 이전 단계의 출력입니다.

python3 update_affected_policies.py --affected-policies-directory Affected_Policies_<Timestamp>

update_affected_policies.py 스크립트에서는 제안된 새로운 작업을 사용하여 affected_policies_and_suggestions.json 파일 안에 있는 영향을 받는 정책을 업데이트합니다. 스크립트는 BillingConsolePolicyMigrator#(으)로 식별된 정책에 Sid 블록을 추가합니다. 여기서 #은 증분 카운터(예: 1, 2, 3)에 대응됩니다.

예를 들어 영향을 받는 정책에 이전 작업을 사용하는 Sid 블록이 여러 개 있는 경우 스크립트는 각 Sid 블록에 대응되는 BillingConsolePolicyMigrator#(으)로 나타나는 복수의 Sid 블록을 추가합니다.

중요
  • 스크립트는 정책에서 이전 IAM 작업을 제거하거나 정책의 기존 Sid 블록을 변경하지 않습니다. 스크립트는 그 대신 Sid 블록을 만들고 이를 정책 끝에 추가합니다. 이러한 새 Sid 블록에는 JSON 파일에서 제안된 새로운 작업이 포함되어 있습니다. 이 작업은 원래 정책의 권한이 변경되지 않도록 합니다.

  • 변경 사항을 되돌려야 하는 경우에 대비해 BillingConsolePolicyMigrator# Sid 블록의 이름을 변경하지 않는 것을 권장합니다.

예: 추가된 Sid 블록이 있는 정책

BillingConsolePolicyMigrator1 및 BillingConsolePolicyMigrator2 블록에서 추가된 Sid 블록을 확인하세요.

{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": [ "ce:*", "aws-portal:ViewAccount" ], "Resource": "*", "Principal": { "AWS": "arn:aws:iam::111111111111:BillingRole" }, "Condition": { "BoolIfExists": { "aws:MultiFactorAuthPresent": "true" } } }, { "Sid": "BillingConsolePolicyMigrator1", "Effect": "Allow", "Action": [ "account:GetAccountInformation", "account:GetAlternateContact", "account:GetChallengeQuestions", "account:GetContactInformation", "billing:GetContractInformation", "billing:GetIAMAccessPreference", "billing:GetSellerOfRecord", "payments:ListPaymentPreferences" ], "Resource": "*", "Principal": { "AWS": "arn:aws:iam::111111111111:BillingRole" }, "Condition": { "BoolIfExists": { "aws:MultiFactorAuthPresent": "true" } } }, { "Sid": "BillingConsolePolicyMigrator2", "Effect": "Deny", "Action": [ "account:CloseAccount", "account:DeleteAlternateContact", "account:PutAlternateContact", "account:PutChallengeQuestions", "account:PutContactInformation", "billing:PutContractInformation", "billing:UpdateIAMAccessPreference", "payments:UpdatePaymentPreferences" ], "Resource": "*" } ] }

스크립트는 실패한 작업이 포함된 상태 보고서를 생성하고 JSON 파일을 로컬로 출력합니다.

예: 상태 보고서
[{ "Account": "111111111111", "PolicyType": "Customer Managed Policy" "PolicyName": "AwsPortalViewPaymentMethods", "PolicyIdentifier": "identifier", "Status": "FAILURE", // FAILURE or SKIPPED "ErrorMessage": "Error message details" }]
중요
  • identify_affected_policies.py 및 update_affected_policies.py 스크립트를 다시 실행할 경우 해당 스크립트는 BillingConsolePolicyMigratorRole#Sid 블록이 포함된 모든 정책을 건너뜁니다. 스크립트는 해당 정책이 이전에 검사 및 업데이트되었으며 추가 업데이트가 필요하지 않다고 가정합니다. 그 결과 스크립트가 정책에서 동일한 작업을 중복 수행하는 것을 예방할 수 있습니다.

  • 영향을 받는 정책을 업데이트하면 영향을 받는 정책 도구를 사용하여 새 IAM을 사용할 수 있습니다. 문제를 발견할 경우 해당 도구를 사용하여 이전 작업으로 다시 전환할 수 있습니다. 또한 스크립트를 사용하여 정책 업데이트를 되돌릴 수도 있습니다.

    자세한 내용은 AWS 청구, 비용 관리 영향을 받는 정책 도구를 사용하는 방법 및 계정 콘솔 권한 변경 블로그 게시물을 참조하십시오.

  • 업데이트를 관리하려면 다음과 같이 할 수 있습니다.

    • 각 계정에 대해 개별적으로 스크립트를 실행합니다.

    • 비슷한 계정(예: 테스트, QA, 프로덕션 계정)에 대해 스크립트를 일괄 실행합니다.

    • 모든 계정에 대해 스크립트를 실행합니다.

    • 몇몇 계정을 일괄 업데이트한 다음 다른 계정을 개별적으로 업데이트하는 방법 중에서 선택할 수 있습니다.

6단계: 변경 내용 되돌리기(선택 사항)

rollback_affected_policies.py 스크립트에서는 특정 계정의 영향을 받는 각 정책에 적용된 변경 내용을 되돌립니다. 스크립트에서는 update_affected_policies.py 스크립트가 추가한 모든 Sid 블록을 제거합니다. 이러한 Sid 블록의 형식은 BillingConsolePolicyMigratorRole#입니다.

변경 사항을 되돌리려면
  1. 아직 수행하지 않은 경우,  AWS CLI에 대한 명령줄 창을 여세요.

  2. 다음 명령을 입력하여 rollback_affected_policies.py 스크립트를 실행합니다. 다음 입력 파라미터를 입력할 수 있습니다.

  • --accounts

    • 롤백에 포함하려는 AWS 계정 ID의 쉼표로 구분된 목록을 지정합니다.

    • 다음 예제에서는 지정된 정책을 스캔하고 해당 블록이 있는 모든 AWS 계정명령문을 제거합니다. BillingConsolePolicyMigrator# Sid

      python3 rollback_affected_policies.py –-accounts 111122223333, 555555555555, 666666666666
  • --all

    • 조직의 모든 AWS 계정 ID를 포함합니다.

    • 다음 예제에서는 조직에 있는 정책을 모두 검사하고 BillingConsolePolicyMigratorRole# Sid 블록을 사용하여 모든 명령문을 제거합니다.

    python3 rollback_affected_policies.py –-all
  • --exclude-accounts

    • 롤백에서 제외하려는 AWS 계정 ID의 쉼표로 구분된 목록을 지정합니다.

      --all 파라미터도 지정하는 경우에만 이 파라미터를 사용할 수 있습니다.

    • 다음 예제는 지정된 계정을 제외하고 조직 AWS 계정 내 모든 정책을 스캔합니다.

      python3 rollback_affected_policies.py --all --exclude-accounts 777777777777, 888888888888, 999999999999

IAM 정책 예시

정책은 다음 사항이 동일한 경우 비슷한 것으로 간주됩니다.

  • 모든 Sid 블록에서 영향을 받은 작업

  • 다음 IAM 요소에 대한 세부 정보:

    • Effect (Allow/Deny)

    • Principal(액세스가 허용되거나 거부된 사용자)

    • NotAction(허용되지 않는 작업)

    • NotPrincipal(액세스가 명시적으로 거부된 사용자)

    • Resource(정책이 적용되는 AWS 리소스)

    • Condition(정책이 적용되는 구체적인 조건)

다음 예제는 IAM이 차이점을 기반으로 비슷하다고 판단하거나 비슷하지 않다고 간주할 수 있는 정책을 보여줍니다.

예 1: 정책을 비슷하다고 간주

각 정책 유형은 다르지만 두 정책 모두에 같은 영향을 받는 Action이 있는 Sid 블록 하나가 포함되어 있습니다.

Policy 1: Group inline IAM policy
{ "Version": "2012-10-17", "Statement": [{ "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "aws-portal:ViewAccount", "aws-portal:*Billing" ], "Resource": "*" }] }
Policy 2: Customer managed IAM policy
{ "Version": "2012-10-17", "Statement": [{ "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "aws-portal:ViewAccount", "aws-portal:*Billing" ], "Resource": "*" }] }
예 2: 정책을 비슷하다고 간주

두 정책에는 모두 같은 영향을 받는 Sid가 있는 Action 블록이 하나 포함되어 있습니다. 정책 2에는 추가 작업이 포함되지만 이러한 작업은 영향을 받지 않습니다.

Policy 1
{ "Version": "2012-10-17", "Statement": [{ "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "aws-portal:ViewAccount", "aws-portal:*Billing" ], "Resource": "*" }] }
Policy 2
{ "Version": "2012-10-17", "Statement": [{ "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "aws-portal:ViewAccount", "aws-portal:*Billing", "athena:*" ], "Resource": "*" }] }
예 3: 정책을 비슷하다고 간주하지 않음

두 정책에는 모두 같은 영향을 받는 Sid가 있는 Action 블록이 하나 포함되어 있습니다. 하지만 정책 2에는 정책 1에 없는 Condition 요소가 포함되어 있습니다.

Policy 1
{ "Version": "2012-10-17", "Statement": [{ "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "aws-portal:ViewAccount", "aws-portal:*Billing" ], "Resource": "*" }] }
Policy 2
{ "Version": "2012-10-17", "Statement": [{ "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "aws-portal:ViewAccount", "aws-portal:*Billing", "athena:*" ], "Resource": "*", "Condition": { "BoolIfExists": { "aws:MultiFactorAuthPresent": "true" } } }] }
예 4: 정책을 비슷하다고 간주

정책 1에는 영향을 받는 Action이 있는 단일 Sid 블록이  있습니다. 정책 2에는 Sid 블록이 여러 개 있지만 영향을 받는 Action은 하나의 블록에만 나타납니다.

Policy 1
{ "Version": "2012-10-17", "Statement": [{ "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "aws-portal:View*" ], "Resource": "*" }] }}
Policy 2
{ "Version": "2012-10-17", "Statement": [{ "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "aws-portal:View*" ], "Resource": "*" }, { "Sid": "VisualEditor1", "Effect": "Allow", "Action": [ "cloudtrail:Get*" ], "Resource": "*" } ] }
예 5: 정책을 비슷하다고 간주하지 않음

정책 1에는 영향을 받는 Action이 있는 단일 Sid 블록이  있습니다. 정책 2에는 Sid 블록이 여러 개 있고 영향을 받는 Action이 여러 개의 블록에 나타납니다.

Policy 1
{ "Version": "2012-10-17", "Statement": [{ "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "aws-portal:View*" ], "Resource": "*" }] }
Policy 2
{ "Version": "2012-10-17", "Statement": [{ "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "aws-portal:View*" ], "Resource": "*" }, { "Sid": "VisualEditor1", "Effect": "Deny", "Action": [ "aws-portal:Modify*" ], "Resource": "*" } ] }
예 6: 정책을 비슷하다고 간주

두 정책 모두에 복수의 Sid 블록이 있고 각 Sid 블록마다 같은 영향을 받는 Action이 있습니다.

Policy 1
{ "Version": "2012-10-17", "Statement": [{ "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "aws-portal:*Account", "iam:Get*" ], "Resource": "*" }, { "Sid": "VisualEditor1", "Effect": "Deny", "Action": [ "aws-portal:Modify*", "iam:Update*" ], "Resource": "*" } ] }
Policy 2
{ "Version": "2012-10-17", "Statement": [{ "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "aws-portal:*Account", "athena:Get*" ], "Resource": "*" }, { "Sid": "VisualEditor1", "Effect": "Deny", "Action": [ "aws-portal:Modify*", "athena:Update*" ], "Resource": "*" } ] }
예제 7

다음과 같은 두 정책은 비슷한 것으로 간주되지 않습니다.

정책 1에는 영향을 받는 Action이 있는 단일 Sid 블록이  있습니다. 정책 2에도 같은 영향을 받는 Action이 있는 Sid 블록이  있습니다. 하지만 정책 2에는 서로 다른 작업이 있는 또 다른 Sid 블록도 포함되어 있습니다.

Policy 1
{ "Version": "2012-10-17", "Statement": [{ "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "aws-portal:*Account", "iam:Get*" ], "Resource": "*" }, { "Sid": "VisualEditor1", "Effect": "Deny", "Action": [ "aws-portal:Modify*", "iam:Update*" ], "Resource": "*" } ] }
Policy 2
{ "Version": "2012-10-17", "Statement": [{ "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "aws-portal:*Account", "athena:Get*" ], "Resource": "*" }, { "Sid": "VisualEditor1", "Effect": "Deny", "Action": [ "aws-portal:*Billing", "athena:Update*" ], "Resource": "*" } ] }