暗号化された AWS Secrets Manager シークレットにアクセスする問題を解決するにはどうすればよいですか?

最終更新日時: 2022 年 3 月 23 日

AWS Secrets Manager のシークレットを取得またはアクセスしようとしましたが、次のようなエラーが表示されました。

  • 「デフォルトの KMS サービスキーでシークレットを暗号化すると、別の AWS アカウントからシークレットにアクセスすることはできません。」
  • 「KMS へのアクセスは許可されていません」、 「InternalFailure」、または「不明なエラーが発生しました」
  • 「KMS へのアクセスは許可されていません」このバージョンのシークレットは、現在の KMS キーでは暗号化されません。

解決方法

注意: AWS Command Line Interface (AWS CLI) コマンドの実行中にエラーが発生した場合は、AWS CLI の最新バージョンを使用していることを確認してください

別のアカウントのシークレットにアクセスするときに、AWS Key Management Service (AWS KMS) が管理するキーでシークレットが暗号化されていないことを確認します。

AWS マネージドキーポリシーは読み取り専用なので編集できませんが、AWS マネージドキーとカスタマーマネージドキーポリシーは表示できます。AWS マネージド KMS キーポリシーは編集できないため、これらのキーポリシーについてクロスアカウント許可を付与することもできません。また、AWS マネージド KMS キーを使用して暗号化されたSecrets Manager シークレットに、他の AWS アカウントからアクセスすることはできません。

クロスアカウントの場合、アイデンティティベースのポリシーとリソースベースのポリシーによって、プリンシパルが KMS キーにアクセスできることを確認します。

ID ポリシーでは、以下のように KMS キーへのアクセスをプリンシパルに許可する必要があります。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "kms:Decrypt",
      "Resource": "arn:aws:kms:Region:AccountID:key/EncryptionKey"
    }
  ]
}

リソースベースのポリシーでは、以下のように KMS キーへのアクセスをプリンシパルに許可する必要があります。

{
  "Effect": "Allow",
  "Principal": {
    "AWS": [
      "arn:aws:iam::AccountID:user/UserName",
      "arn:aws:iam::AccountID:role/RoleName"
    ]
  },
  "Action": [
    "kms:Decrypt",
    "kms:DescribeKey"
  ],
  "Resource": "*"
}

KMS キーを更新したら、シークレットが新しい KMS キーで暗号化されていることを確認します。

AWS CLI を使用して Secrets Manager シークレットに関連付けられた KMS キーを更新しても、現在または以前のバージョンのシークレットは新しい KMS キーで再暗号化されません。つまり、外部アカウント (クロスアカウントとも呼ばれます) は、シークレットが新しい KMS キーで再暗号化されていないことから、シークレットにアクセスできません。クロスアカウントからシークレット値を取得するには、新しい AWS KMS キーを使用してシークレットを再暗号化する必要があります。

注意: Secrets Manager コンソールを使用してデフォルトでシークレットに関連付けられた KMS キーを変更すると、シークレットの新しいバージョンが作成され、新しい KMS キーで暗号化されます。詳細については、シークレットの暗号化と復号化を参照してください。

新しい KMS キーでシークレットを再暗号化します。

AWS マネジメントコンソールまたは AWS CLI を使用して、新しい KMS キーでシークレットを再暗号化するには、次の手順に従います。

AWS マネジメントコンソール

1.    Secrets Manager コンソールを開きます。

2.    [Secret name] で、シークレットを選択します。

3.    [アクション] を選択し、ドロップダウンリストを選択して KMS キーを選択し、[新しい暗号化キーを使用してシークレットの新しいバージョンを作成する] チェックボックスをオンにして、[保存] を選択します。

AWS CLI

シークレットが存在するソースアカウントから以下の手順を実行します。

1.    以下のような AWS CLI コマンド get-secret-value を実行します。

$ aws secretsmanager get-secret-value --secret-id arn:aws:secretsmanager:us-east-1:123456789012:secret:cross-account --query SecretString --output text

    {"CrossAccount":"DefaultEncryption"}

2.    creds.txt という名前のファイルを作成します。

$ cat creds.txt

    {"CrossAccount":"DefaultEncryption"}

3.    AWS CLI の update-secret コマンドを実行して、以下のような暗号化キーを再暗号化します。

$ aws secretsmanager update-secret --secret-id arn:aws:secretsmanager:us-east-1:123456789012:secret:cross-account --secret-string file://creds.txt

    {
    "ARN": "arn:aws:secretsmanager:us-east-1:123456789012:cross-account",
    "Name": "cross-account",
    "VersionId": "f68246e8-1cfb-4c3b-952b-17c9298d3462"
    }

4.    クロスアカウントから AWS CLI コマンド get-secret-value を次のように実行します。

$ aws secretsmanager get-secret-value --secret-id arn:aws:secretsmanager:us-east-1:123456789012:secret:cross-account --version-stage AWSCURRENT --profile

    {"CrossAccount":"DefaultEncryption"}