1. ホーム
  2. amazon-web-services

[解決済み] s3 - HeadObject 操作を呼び出すときに、エラーが発生しました (403)。Forbidden

2022-02-04 15:15:10

質問

回答 役に立たなかった


s3バケットのリソースポリシー bucket1 です。

{
    "Version": "2012-10-17",
    "Statement": [{
            "Effect": "Deny",
            "Principal": "*",
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::bucket1/*",
            "Condition": {
                "Bool": {
                    "aws:SecureTransport": "false"
                }
            }
        },
        {
            "Effect": "Deny",
            "Principal": "*",
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::bucket1/*",
            "Condition": {
                "StringNotEquals": {
                    "s3:x-amz-server-side-encryption": "AES256"
                }
            }
        },
        {
            "Effect": "Deny",
            "Principal": "*",
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::bucket1/*",
            "Condition": {
                "Null": {
                    "s3:x-amz-server-side-encryption": "true"
                }
            }
        }
    ]
}


のIAMポリシー bucket1 があります。

   {
        "Action": [
            "s3:GetObject"
        ],
        "Resource": [
            "arn:aws:s3:::bucket1",
            "arn:aws:s3:::bucket1/*"
        ],
        "Effect": "Allow"       
   }


s3Upload() 正常に動作する

を実行するとエラーが発生します。 aws s3 cp s3://url . ファイルをローカルフォルダにコピーしているとき

これは、S3のIAMポリシーとリソースポリシーの間のコンフリクトです。


リソースポリシーで実行を許可する方法 aws s3 cp ?

解決方法は?

ここでいくつかの問題があります。まず、バケツポリシーのドキュメントが有効な json でないことですが、これはコピー中に発生したエラーだと思われます。

aws s3 cp s3://url が動作しないのは、バケツ・ポリシーがブロックしているからです。明示的な拒否は常に勝つことに注意してください。HTTP リクエストにサーバー側の暗号化ヘッダーがない場合、Bucket Policy はアップロードを拒否します。IAM ポリシーをどのように定義しても、明示的な拒否のため、そのユーザはこのコマンドをそのまま使用することはできません。

CLIコマンドでサーバサイドの暗号化を指定したい場合は、適切なフラグを使用する必要があります。 --sse AES256 (s3バケットにオブジェクトをアップロードする場合も同様です)。

aws s3 cp s3://url --sse AES256

その他、気がついたこと。

この部分

"Effect": "Deny",
"Principal": "*",
"Action": "s3:*",
"Resource": "arn:aws:s3:::bucket1/*”,
"Condition": {
    "Bool": {
        "aws:SecureTransport": "false"
    }
}

HTTPS を使用していないリクエストで、そのバケット内のオブジェクトのみを指定した場合、すべての S3 アクションを拒否しています -。 "Resource": "arn:aws:s3:::bucket1/*” バケツそのものではなく "Resource": "arn:aws:s3:::bucket1” したがって、あなたの発言は、オブジェクトレベルの操作にのみ適用されます。これは意図した動作なのでしょうか?HTTPS を使用していないオブジェクトレベルの操作とバケツレベルの操作の両方を拒否したい場合は、現在の Resource に変更します。

"Effect": "Deny",
"Principal": "*",
"Action": "s3:*",
"Resource": [
    "arn:aws:s3:::bucket1”,
    "arn:aws:s3:::bucket1/*”
],
"Condition": {
    "Bool": {
        "aws:SecureTransport": "false"
    }
}

そして、このセクションで

  {
        "Action": [
            "s3:GetObject"
        ],
        "Resource": [
            "arn:aws:s3:::bucket1",
            "arn:aws:s3:::bucket1/*"
        ],
        "Effect": "Allow"       
   }

の中のこの行は Resource - "arn:aws:s3:::bucket1" は完全に冗長であるため "s3:GetObject" アクションはオブジェクトレベルの操作であり、あなたのステートメントにはバケツレベルの操作は含まれていません。自由に削除してかまいません。というわけで、以下のような感じになります。

   {
        "Action": [
            "s3:GetObject"
        ],
        "Resource": "arn:aws:s3:::bucket1/*",
        "Effect": "Allow"       
   }

アップデイト

オブジェクトを取得する場合、BucketのURLだけでなく、何らかのオブジェクトを指定するようにしてください。

これは動作します

aws s3 cp s3://bucket/file.txt .

これは403エラーで失敗します

aws s3 cp s3://bucket .

上記のコマンドで複数のファイルを同時にダウンロードする場合、2つのことが必要になります。まず、IAMパーミッションを更新して、以下のものを含める必要があります。 s3:ListBucket をバケットに追加します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::bucket/*"
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:::bucket"
        }
    ]
}

2つ目は --recursive フラグを cp コマンドを使用します。

aws s3 cp s3://bucket . --recursive