AWS 계정 간에 AWS Secrets Manager 보안을 공유하려면 어떻게 해야 하나요?

최종 업데이트 날짜: 2020년 10월 14일

다른 AWS 계정에서 내 AWS Secrets Manager 보안을 공유하고 싶습니다. 어떻게 해야 하나요?

간략한 설명

이 예제에서 Security_Account 사용자는 사용자 자격 증명을 사용하고, Dev_Account 사용자는 개발자에 의해 사용됩니다. Dev_Account의 Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스에서 실행 중인 AWS Identity and Access Management(IAM) 사용자 또는 애플리케이션은 Security_Account 사용자 계정에서 보안을 검색합니다. 보안에 대해 리소스 기반 정책을 사용할 수 있습니다. 이를 통해 보안에 권한 정책을 연결할 수 있습니다. 이 정책을 사용하면 Dev_Account의 IAM 엔터티에서 Security_Account의 보안에 액세스할 수 있습니다.

Security_Account에서 이름이 DevSecret인 보안은 CMK(고객 마스터 키) DevSecretCMK를 사용하여 암호화됩니다. 그런 다음, 보안은 Dev_Account와 공유됩니다.

참고: 계정의 CMK 기본 키는 사용할 수 없습니다. CMK 기본 키는 AWS Key Management Service(KMS)에서 실행되는 AWS 서비스에서 자동으로 생성, 관리 및 사용됩니다. CMK 기본 키는 AWS 계정 및 리전에 고유합니다. AWS 관리형 CMK를 생성하는 서비스만 해당 기본 키를 사용할 수 있습니다. 자세한 내용은 고객 마스터 키(CMK)를 참조하세요.

해결 방법

1.    보안이 없는 경우 기본 보안 정보 생성 지침을 따릅니다. 비밀에 대한 KMS 키 ID 파라미터에 KMS CMK ARN(Amazon 리소스 이름)을 지정해야 합니다.

2.    별칭을 사용하는 기존 보안 암호가 있는 경우 보안 암호 수정 지침을 따릅니다. KMS 키 ID 파라미터에서 KMS CMK ARN을 지정해야 합니다.

참고: 다른 AWS 계정의 보안에 액세스하려면 전체 KMS 키 ARN을 사용해야 합니다.

3.    다음과 비슷하게 IAM 자격 증명에 권한을 연결합니다.

참고: your-region을 해당 AWS 리전으로 대체합니다.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowGetSecretValue",
            "Effect": "Allow",
            "Action": [
                "secretsmanager:GetSecretValue"
            ],
            "Resource": [
                "arn:aws:secretsmanager:your-region:Security_Account:secret:DevSecret-??????"
            ]
        },
        {
            "Sid": "AllowKMSDecrypt",
            "Effect": "Allow",
            "Action": [
                "kms:Decrypt"
            ],
            "Resource": [
                "arn:aws:kms:your-region:Security_Account:key/DevSecretCMK_id"
            ]
        }
    ]
}

Dev_Account의 IAM 사용자 SecretsUser에서 보안을 검색합니다. SecretsUser에는 secretsmanager:GetSecretValue에 대한 권한이 필요합니다. SecretsUser에는 AWS decrypt 권한도 필요합니다. DevSecret은 DevSecretKey를 사용하여 암호화되기 때문입니다.

4.    CMK의 키 정책에 권한을 부여합니다. Secrets Manager는 기본적으로 보안을 암호화합니다. 이러한 보안을 검색하는 자격 증명에는 암호 해독 권한이 필요합니다. DevSecret는 DevSecretCMK를 사용하여 암호화되므로 다음 권한을 추가하여 키 정책을 변경해야 합니다.

참고: your-region을 해당 AWS 리전으로 대체합니다.

{
    "Sid": "AllowUseOfTheKey",
    "Effect": "Allow",
    "Principal": {
        "AWS": "arn:aws:iam::Dev_Account:user/SecretsUser"
    },
    "Action": [
        "kms:Decrypt"
    ],
    "Resource": "*",
    "Condition": {
        "StringEquals": {
            "kms:ViaService": "secretsmanager.your-region.amazonaws.com"
        },
        "StringLike": {
            "kms:EncryptionContext:SecretARN": "arn:aws:secretsmanager:your-region:Security_Account:secret:DevSecret-??????"
        }
    }
}

이 정책은 SecretsUser에 DevSecretCMK를 사용할 권한을 부여합니다. 또한 이 정책은 DevSecretCMK에서 decrypte 및 describe-key 명령을 사용하는 기능도 SecretsUser에 부여합니다.

5.    IAM 엔터티에서 보안에 액세스하는 권한을 허용합니다. Security_Account의 경우 SecretsUser에 대해 DevSecret을 검색할 권한을 부여하는 리소스 기반 정책을 연결합니다.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowUseOfTheKey",
            "Effect": "Allow",
            "Action": "secretsmanager:GetSecretValue",
            "Principal" : {
              "AWS" : "arn:aws:iam::Dev_Account:user/SecretsUser"
            },
            "Resource": "*",
            "Condition": {
                "ForAnyValue:StringEquals": {
                    "secretsmanager:VersionStage": "AWSCURRENT"
                }
            }
        }
    ]
}

6.    SecretsUser로 보안을 검색합니다.

참고: 5단계의 정책에는 AWSCurrent 버전 단계에 대한 참조가 명시적으로 필요합니다. 다음과 유사한 SecretsUser가 암호를 검색할 때마다 이 암호를 명시적으로 요구해야 합니다.

$ aws secretsmanager get-secret-value --secret-id arn:aws:secretsmanager:your-region:Security_Account:secret:DevSecret --version-stage AWSCURRENT

모든 IAM 엔터티에 대해 이 지침을 사용할 수 있습니다. 예를 들어, Amazon EC2 인스턴스 프로파일 또는 역할의 경우 리소스 정책에서 ARN을 대체하거나 추가하고 IAM 엔터티에 연결된 권한을 편집합니다.