IAM 정책에서 사용자 또는 역할이 AWS KMS의 KMS 키에 액세스하도록 허용하는 것을 방지하려면 어떻게 해야 하나요?

3분 분량
0

AWS Identity and Access Management(AWS IAM) 자격 증명을 사용한 액세스로부터 AWS Key Management Service(AWS KMS) KMS 키를 보호하려고 합니다. 하지만 기본 KMS 키 정책에서는 계정의 IAM 자격 증명이 IAM 권한으로 KMS 키에 액세스할 수 있도록 허용합니다.

간략한 설명

기본 KMS 키 정책에는 다음 명령문이 포함됩니다.

{
    "Sid": "Enable IAM User Permissions",
    "Effect": "Allow",
    "Principal": {
        "AWS": "arn:aws:iam::111122223333:root"
    },
    "Action": "kms:*",
    "Resource": "*"
}

이전 예시에서 효과보안 주체 요소는 AWS 루트 사용자 계정을 참조하지 않습니다. Amazon 리소스 이름(ARN)은 이 IAM 정책을 통해 KMS 키에 대한 권한을 허용합니다. 필요한 권한을 IAM 엔터티에 연결하면 AWS 계정 111122223333의 모든 보안 주체는 KMS 키에 대한 루트 액세스 권한을 가집니다.

해결 방법

IAM 엔터티가 KMS 키에 액세스하는 것을 금지하고 루트 사용자 계정이 키를 관리하도록 허용할 수 있습니다. 이렇게 하면 루트 사용자 계정이 KMS 키에 대한 액세스 권한을 잃는 것도 방지합니다.

기본 KMS 키 정책의 'IAM 사용자 권한 활성화' Sid를 '루트 액세스 활성화 및 권한 위임 방지'라는 Sid로 교체합니다. 또한 다음 정책에 있는 것과 유사한 Condition 요소를 추가하세요.

중요: 계정 111122223333을 자체 계정 번호로 바꾸고 조건 키 aws:PrincipalTypeAccount으로 설정되어 있는지 확인하세요.

{
    "Sid": "EnableRootAccessAndPreventPermissionDelegation",
    "Effect": "Allow",
    "Principal": {
        "AWS": "arn:aws:iam::111122223333:root"
    },
    "Action": "kms:*",
    "Resource": "*",
    "Condition": {
        "StringEquals": {
            "aws:PrincipalType": "Account"
        }
    }
}

Sid 'Key Administrator에 대한 액세스 허용'을 사용하여 명령문에서 키 관리를 허용할 키 관리자 IAM 사용자 또는 역할을 추가할 수 있습니다. 또한 IAM 사용자 또는 역할이 암호화 작업 및 다른 AWS 서비스에 키를 사용하도록 허용할 수 있습니다. '키 사용 허용' 및 '영구 리소스 연결 허용'이라는 Sid를 사용하여 명령문에 IAM 사용자 또는 역할 ARN을 추가합니다.

참고: 루트 사용자 계정으로 수정된 정책으로 키를 생성해야 합니다. 또는 'Key Administrator의 액세스 허용' 문장에서 허용된 보안 주체를 사용하세요. 이렇게 하면 'MalformedPolicyDocumentException' 정책 오류가 발생하지 않습니다.

수정된 기본 KMS 키 정책은 다음과 유사합니다.

{
    "Id": "key-consolepolicy-1",
    "Version": "2012-10-17",
    "Statement":
    [
        {
            "Sid": "EnableRootAccessAndPreventPermissionDelegation",
            "Effect": "Allow",
            "Principal":
            {
                "AWS": "arn:aws:iam::111122223333:root"
            },
            "Action": "kms:*",
            "Resource": "*",
            "Condition":
            {
                "StringEquals":
                {
                    "aws:PrincipalType": "Account"
                }
            }
        },
        {
            "Sid": "Allow access for Key Administrators",
            "Effect": "Allow",
            "Principal":
            {
                "AWS":
                [
                    "arn:aws:iam::111122223333:user/KMSAdminUser",
                    "arn:aws:iam::111122223333:role/KMSAdminRole"
                ]
            },
            "Action":
            [
                "kms:Create*",
                "kms:Describe*",
                "kms:Enable*",
                "kms:List*",
                "kms:Put*",
                "kms:Update*",
                "kms:Revoke*",
                "kms:Disable*",
                "kms:Get*",
                "kms:Delete*",
                "kms:TagResource",
                "kms:UntagResource",
                "kms:ScheduleKeyDeletion",
                "kms:CancelKeyDeletion"
            ],
            "Resource": "*"
        },
        {
            "Sid": "Allow use of the key",
            "Effect": "Allow",
            "Principal":
            {
                "AWS":
                [
                    "arn:aws:iam::111122223333:user/ExampleUser",
                    "arn:aws:iam::111122223333:role/ExampleRole"
                ]
            },
            "Action":
            [
                "kms:Encrypt",
                "kms:Decrypt",
                "kms:ReEncrypt*",
                "kms:GenerateDataKey*",
                "kms:DescribeKey"
            ],
            "Resource": "*"
        },
        {
            "Sid": "Allow attachment of persistent resources",
            "Effect": "Allow",
            "Principal":
            {
                "AWS":
                [
                    "arn:aws:iam::111122223333:user/ExampleUser",
                    "arn:aws:iam::111122223333:role/ExampleRole"
                ]
            },
            "Action":
            [
                "kms:CreateGrant",
                "kms:ListGrants",
                "kms:RevokeGrant"
            ],
            "Resource": "*",
            "Condition":
            {
                "Bool":
                {
                    "kms:GrantIsForAWSResource": "true"
                }
            }
        }
    ]
}

키 정책은 다음 권한을 허용합니다.

  • AWS 루트 사용자 계정은 키에 대한 전체 액세스 권한을 가집니다.
  • 보안 주체 KMSAdminUser 및 KMSAdminRole은 키에 대한 관리 작업을 수행합니다.
  • 키를 사용할 보안 주체 ExampleUser 및 ExampleRole.

관련 정보

AWS 액세스 키 관리를 위한 모범 사례

AWS KMS 키

AWS 공식
AWS 공식업데이트됨 일 년 전