LoginSignup
0
0

More than 3 years have passed since last update.

【ハマり】S3事前署名で発行されたURLがAccessDeniedで弾かれる事象について

Posted at

説明

個人開発中にS3の事前署名URL関連でハマった。

本当にクソしょーもないハマり方なので、記事にするべきか判断に迷いました。
でも塵も積もればということで。

先言っておくと、原因はバケットポリシー関連のやらかしです。

事象説明

Node.js。

zizen.js
    //事前署名URL取得
    var params = {
        Bucket: 'バケット名',
        Expires: 3600,
        Key: 'test.png',
        ContentType: 'image/png'
      };

    var res = await new Promise((resolve, reject)=>{
    S3.getSignedUrl('putObject', params, (err,url)=> {
        if(err){
            logger.level='error';
            logger.error(err);
            return reject(err);
        }
        else{
            logger.info(url);
            return resolve(url)
        }
          });    
    })  

    const response={'statusCode':'200',
        'body':JSON.stringify({'sign_url':res }),
        'headers': {'Content-Type':'application/json'},
    };

    callback(null,response);

https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#getSignedUrl-property
上記の公式リファレンスに沿ってPutObjectオペレーションに対して、3600秒の有効期限を持った事前署名urlを発行。
そして、3600秒以内に以下のコマンドでtest.pngのアップロードを試みるも

curl -H "Content-Type: image/png" --data-binary "@test.png" -X PUT "発行されたURL"

AccessDeniedが返ってくる。
image.png

(^ω))))))))^<なんで~っ

結論

パケットポリシーで明示的にPutObjectを禁止していると、事前署名Urlに対してのアクションも禁止されます。
されました。
この明示的禁止ポリシーを削除する事で無事アップロードに成功します。
image.png

デフォルトでも禁止なのですが、バケットポリシーの明示的禁止とデフォルトの禁止には違いがあるようです。
https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/example-bucket-policies.html

明示的な拒否は、ACL やユーザーポリシーなどの他の方法を使用して examplebucket バケット内のオブジェクトに付与したすべてのアクセス許可よりも優先されます。

へ~…ふ~ん…そうなんすか…

以上です。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0