AWS アカウント間で AWS Secrets Manager のシークレットを共有するにはどうすればよいですか?

最終更新日: 2021 年 11 月 11 日

自分の AWS Secrets Manager のシークレットを別の AWS アカウントと共有したいと考えています。これを行うにはどうすればよいですか?

簡単な説明

この例では、Security_Account ユーザーは認証情報を管理し、Dev_Account ユーザーは開発者が使用します。AWS Identity and Access Management (IAM) ユーザーまたはお使いの Dev_Account の Amazon Elastic Compute Cloud (Amazon EC2) で実行されているアプリケーションは、Security_Account ユーザーアカウントでシークレットを取得します。リソースベースのポリシーを使用することができます。これにより、シークレットにアクセス許可ポリシーをアタッチすることができます。このポリシーを使用して、Dev_Account の IAM エンティティが Security_Account でシークレットにアクセスすることができます。

Security_Account の DevSecret という名前のシークレットが、AWS KMS キー DevSecretKMS を使用して暗号化されます。その後、シークレットが Dev_Account と共有されます。

注意: アカウントに KMS デフォルトキーを使用することはできません。KMS デフォルトキーは、AWS Key Management Service (KMS) で実行される AWS のサービスが、ユーザーに代わって作成、管理、および使用します。KMS デフォルトキーは、AWS アカウントおよびリージョンに一意です。AWS マネージドキーを使用できるのは、それを作成したサービスだけです。詳細については、「AWS KMS keys」を参照してください。

解決方法

1.    シークレットがない場合は、シークレットの作成の手順に従ってください。シークレットの KMS キー ID パラメータには、Amazon リソースネーム (ARN) を指定するようにしてください。

2.    エイリアスを使用した既存のシークレットがある場合は、「シークレットの変更」の手順に従ってください。シークレットの KMS キー ID パラメータには、KMS キー ARN を指定するようにしてください。

注意: 別の AWS アカウントからのシークレットにアクセスするには、完全な KMS キー ARN を使用する必要があります。

3.    次のように、IAM ID にアクセス許可を添付します。

注: リージョン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/DevSecretKMS_id"
            ]
        }
    ]
}

Dev_Account で、IAM ユーザー SecretsUser はシークレットを取得します。SecretsUser は secretsmanager に対する許可を持っている必要があります: GetSecretValue。DevSecret は DevSecretKey を使って暗号化されるため、SecretsUser に AWS 復号化アクセス許可が必要です。

4.    KMS キーのキーポリシーで許可を付与します。Secrets Manager は、デフォルトでシークレットを暗号化します。これらのシークレットを取得するアイデンティティには、復号化を行うためのアクセス権が必要です。DevSecret は DevSecretKMS を使用して暗号化されているため、以下の許可を追加してキーポリシーを変更する必要があります。

注: [リージョン] を [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-??????"
        }
    }
}

このポリシーは、DevSecretKMS を使用するための許可を SecretsUser に付与します。このポリシーは、DevSecretKMS で decrypt コマンドと describe-key コマンドを使用する能力も SecretsUser に付与します。

5.    IAM エンティティにシークレットへのアクセスを許可します。Security_Account から、SecretsUser が DevSecret を取得できる許可を付与するリソースベースのポリシーをアタッチします。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::Account2:role/ApplicationRole"
      },
      "Action": "secretsmanager:GetSecretValue",
      "Resource": "*"
    }
  ]
}

6.    以下のようにシークレットを 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 エンティティにアタッチされたアクセス許可を編集します。