スキップしてコンテンツを表示

クロスアカウントユーザーが AWS KMS カスタマーマネージドキーで暗号化した Amazon S3 オブジェクトにアクセスすると、Access Denied エラーが発生する理由を教えてください

所要時間2分
0

ユーザーが別の AWS アカウントから Amazon Simple Storage Service (Amazon S3) バケットにアクセスしたときに表示される "Access Denied" エラーを解決したいと考えています。Amazon S3 バケットを AWS Key Management Service (AWS KMS) のカスタマーマネージドキーで暗号化しています。

概要

注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI で発生したエラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。

このエラーは、次の理由により発生します。

  • AWS Identity and Access Management (IAM) ユーザーまたはロールには、s3:GetBucketPolicy API コールと s3:PutBucketPolicy API コールに対するアクセス許可がない。
  • バケットポリシーが、s3:GetBucketPolicys3:PutBucketPolicyに対する IAM ID アクセス許可を拒否している。
  • バケットの Amazon S3 パブリックアクセスブロック機能を有効化した。
  • AWS Organizations のサービスコントロールポリシーが Amazon S3 へのアクセスを許可していない。

エラーを解決するには、IAM ユーザーまたはロールに、バケットポリシーを表示するための s3:Get:BucketPolicy アクセス許可と、バケットポリシーを編集するためのs3:PutBucketPolicy アクセス許可を付与します。アクセスを許可する IAM ユーザーポリシーがない場合は、追加してください。必要なアクセス許可がない場合は、バケットアクセス許可を持つ別の IAM ID を使用して、バケットポリシーを編集します。バケットポリシーに誰もアクセスできない場合は、delete-bucket-policy AWS CLI コマンドを使用してポリシーを削除してから再作成してください。

パブリック読み取りポリシーを追加する必要がある場合は、バケットの Amazon S3 パブリックアクセスブロック機能を無効にします。AWS Organizations を使用する場合は、Amazon S3 アクションを明示的に拒否するサービスコントロールポリシーがないことを確認します。また、操作に例外を追加できることを確認してください。

解決方法

s3:GetBucketPolicy と s3:PutBucketPolicy に対するアクセス許可を確認する

アクセス許可を確認するには、次の手順を実行します。

  1. IAM コンソールを開く。
  2. バケットポリシーへのアクセスに使用する ID を、[ユーザー] や [ロール] などで選択します。
  3. バケットポリシーへのアクセスに使用する IAM ID 名を選択します。
  4. IAM ID の [アクセス許可] タブで各ポリシーを展開し、その JSON ポリシードキュメントを表示します。
  5. JSON ポリシードキュメントで、Amazon S3 アクセスに関連するポリシーを検索してください。次に、バケットに対する s3:GetBucketPolicy アクションと s3:PutBucketPolicy アクションに対するアクセス許可があることを確認します。
    次の IAM ポリシーの例では、IAM ID が DOC-EXAMPLE-BUCKET に対して s3:GetBucketPolicy アクションと s3:PutBucketPolicy アクションの実行を許可しています。
    {  "Version": "2012-10-17",  
      "Statement": [  
        {  
          "Sid": "ModifyBucketPolicy",  
          "Action": [  
            "s3:GetBucketPolicy",  
            "s3:PutBucketPolicy"  
          ],  
          "Effect": "Allow",  
          "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET"  
        },  
        {  
          "Sid": "AccessS3Console",  
          "Action": [  
            "s3:GetBucketLocation",  
            "s3:ListAllMyBuckets"  
          ],  
          "Effect": "Allow",  
          "Resource": "arn:aws:s3:::*"  
        }  
      ]  
    }
    注: 前述の IAM ポリシーの AccessS3console ステートメントは、Amazon S3 にコンソールへのアクセスを許可しています。バケットポリシーの変更に固有のものではありません。
  6. JSON ポリシードキュメントから、以下を含むステートメントを検索します。"Effect": "Deny"。次に、これらのステートメントが s3:GetBucketPolicy または s3:PutBucketPolicy への IAM ID アクセスを拒否していないことを確認します。
  7. ポリシーの [リソース] セクションには、バケットの Amazon リソースネーム (ARN) を必ず含めてください。前の例では、ARN は aws:s3:::DOC-EXAMPLE-BUCKET です。
    ** 注: **これは、s3:GetBucketPolicys3:PutBucketPolicy がバケットレベルのアクションであるためです。
  8. s3:GetBucketPolicys3:PutBucketPolicy アクションを制限する aws:SourceIP などのグローバル条件を IAM ポリシーに適用していないかどうかを確認します。条件によってアクセスが制限される場合は、それらの条件を削除または更新してください。

バケットポリシーが存在しない場合は追加する

s3:GetBucketPolicy または s3:PutBucketPolicy のアクセス許可を付与するポリシーが見つからない場合は、IAM ID にそれらのアクセス許可を付与するポリシーを追加します。s3:GetBucketPolicy または s3:PutBucketPolicy へのアクセスを拒否するポリシーが見つかった場合は、それらのポリシーを削除します。IAM アクセス許可を更新する手順については、「IAM ユーザーのアクセス許可を変更する」を参照してください。

バケットへのアクセス許可を持つ別の IAM ID を使用してバケットポリシーを変更する

バケットポリシーを確認するには、次の手順を実行します。

  1. Amazon S3 コンソールを開きます。
  2. バケットのリストから、変更するバケットポリシーを含むバケットを開きます。
  3. [アクセス許可] タブを選択します。
  4. [バケットポリシー] を選択します。
  5. 以下のステートメントを検索します。"Effect": "Deny"
  6. バケットポリシーを編集し、"Effect": "Deny" ステートメント (IAM ID による s3:GetBucketPolicy または s3:PutBucketPolicy へのアクセスを拒否するすべての同ステートメント) を更新します。手順については、「Amazon S3 コンソールを使用したバケットポリシーの追加」の「バケットポリシーを作成または編集するには」セクションを参照してください。
  7. バケットポリシーに、IAM エンティティに対する s3:GetBucketPolicy アクションと s3:PutBucketPolicy アクションを制限する aws:PrincipalARN などの条件が含まれているかどうかを確認します。条件によってアクセスが制限される場合は、それらの条件を削除または更新してください。

どのユーザーからのアクセスも拒否するバケットポリシーは削除して再作成する

s3:GetBucketPolicys3:PutBucketPolicy、またはすべての Amazon S3 アクション (s3:*) へのアクセスをどのユーザーに対しても拒否しているバケットポリシーは、削除します。誤ってバケットからロックアウトされてバケットポリシーを削除できない場合は、バケットへのアクセスを回復してください。バケットポリシーを削除したら、新しいポリシーを作成できます。

Amazon S3 パブリックアクセスブロックを無効にする

バケットポリシーでパブリックアクセスが許可されている場合は、バケットの Amazon S3 パブリックアクセスブロックをオフにします。詳細については、「Amazon S3 ストレージへのパブリックアクセスのブロック」と「『パブリック』の意味」を参照してください。

注: プライベートバケットへのパブリックアクセスを防ぐには、AWS アカウントレベルで非アクティブにする前に、バケットの Amazon S3 パブリックアクセスブロックを有効にしてください。

AWS Organizations の場合は、Amazon S3 へのアクセスを許可しないサービスコントロールポリシーを削除する

AWS Organizations を使用している場合は、サービスコントロールポリシー (SCP) を確認してください。s3:PutBucketPolicy アクションまたはその他の Amazon S3 ポリシーアクションを明示的に拒否するステートメントを検索してください。組織がポリシーを必要としない場合は、s3:* アクションに拒否効果を適用する SCP を削除します。

次のポリシー例では、すべての Amazon S3 アクションへのアクセスを拒否します。

{  "Version": "2012-10-17",  
  "Statement": [  
    {  
      "Effect": "Deny",  
      "Action": "s3:*",  
      "Resource": "*"  
    }  
  ]  
}
コメントはありません

関連するコンテンツ