aws cliを使用してAmazon S3からダウンロードするときにアクセスが拒否される原因は何ですか?


57

私はここで何が欠けているのかを理解しようとして、AWSで実際に動き回っています。IAMユーザーがS3バケットからファイルをダウンロードできるようにしたい-ファイルを完全に公開するだけでなく-アクセスが拒否されています。誰もがオフになっているものを見つけることができれば、私は興奮します。

これまでにやったこと:

  • my-userという名前のユーザーを作成しました(例のため)
  • ユーザーのアクセスキーを生成し、EC2インスタンスの〜/ .awsに配置します
  • 私のユーザーにアクセスを許可したいバケットポリシーを作成しました
  • コマンドを実行しました aws s3 cp --profile my-user s3://my-bucket/thing.zip .

バケットポリシー:

{
  "Id": "Policy1384791162970",
  "Statement": [
    {
      "Sid": "Stmt1384791151633",
      "Action": [
        "s3:GetObject"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::my-bucket/*",
      "Principal": {
        "AWS": "arn:aws:iam::111122223333:user/my-user"
      }
    }
  ]
}

その結果A client error (AccessDenied) occurred: Access Denied、同じコマンドとデフォルト(ルートアカウント?)アクセスキーを使用してダウンロードできます。

ユーザーポリシーも追加してみました。なぜそれが必要になるのかはわかりませんが、痛くないと思ったので、これをユーザーに添付しました。

{
  "Statement": [
    {
      "Sid": "Stmt1384889624746",
      "Action": "s3:*",
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::my-bucket/*"
    }
  ]
}

同じ結果。

回答:


39

私もこれに苦労していましたが、https://stackoverflow.com/a/17162973/1750869でこの問題の解決に役立つ答えを見つけました。以下に回答を再投稿します。


全員に許可を与える必要はありません。IAMユーザーを使用して、あるアカウントのバケットから別のアカウントにコピーするために、ソースおよび宛先で以下のバケットポリシーを使用します

コピー元のバケット– SourceBucket

コピー先のバケット– DestinationBucket

ソースAWSアカウントID-XXXX–XXXX-XXXX

ソースIAMユーザー-src–iam-user

以下のポリシーは、IAMユーザー-XXXX–XXXX-XXXX:src–iam-userがSourceBucket / *でs3:ListBucketおよびs3:GetObject特権を持ち、DestinationBucket / *でs3:ListBucketおよびs3:PutObject特権を持っていることを意味します。

SourceBucketでは、ポリシーは次のようになります。

{
"Id": "Policy1357935677554",
"Statement": [
    {
        "Sid": "Stmt1357935647218",
        "Action": [
            "s3:ListBucket"
        ],
        "Effect": "Allow",
        "Resource": "arn:aws:s3:::SourceBucket",
        "Principal": {"AWS": "arn:aws:iam::XXXXXXXXXXXX:user/src–iam-user"}
    },
    {
        "Sid": "Stmt1357935676138",
        "Action": ["s3:GetObject"],
        "Effect": "Allow",
        "Resource": "arn:aws:s3::: SourceBucket/*",
        "Principal": {"AWS": "arn:aws:iam::XXXXXXXXXXXX:user/src–iam-user"}
   }
]
}

DestinationBucketでは、ポリシーは次のようになります。

{
"Id": "Policy1357935677554",
"Statement": [
    {
        "Sid": "Stmt1357935647218",
        "Action": [
            "s3:ListBucket"
        ],
        "Effect": "Allow",
        "Resource": "arn:aws:s3::: DestinationBucket",
        "Principal": {"AWS": "arn:aws:iam::XXXXXXXXXXXX:user/src–iam-user"}
    },
    {
        "Sid": "Stmt1357935676138",
        "Action": ["s3:PutObject"],
        "Effect": "Allow",
        "Resource": "arn:aws:s3::: DestinationBucket/*",
        "Principal": {"AWS": "arn:aws:iam::XXXXXXXXXXXX:user/src–iam-user"}
   }
]
}

実行するコマンドは s3cmd cp s3://SourceBucket/File1 s3://DestinationBucket/File1


1
ああ、あなたは私のヒーローです。バケットレベルでListBucket権限が不足していました。バケットからオブジェクトをcpするためにバケットをlsする必要がある理由はまだわかりませんが、大丈夫です。たぶんそれはawsコマンドを使用するだけの癖でしょうか?
ジョシュ

ええ、それはかなり奇妙です。健全性テストには、s3:*(ただし安全ではないかもしれません)という単一のポリシーがあれば十分だと思います。
セルジオ

fml、そのListBucketの許可のために2日間の無駄。良いキャッチ
-chaqke

多くの時間を費やしました。これが必要な答えでした。ListBucket-バケット名、GetObject-バケット名/ *
rsmoorthy

12

同じ問題に直面したとき、AWSでサーバー側の暗号化を有効にする必要があることがわかりました。だから、次のコマンドは私のために正常に機能しました:

aws s3 cp test.txt s3://my-s3-bucket --sse AES256

3
ありがとう!私の場合、それはだった--sse aws:kms...バケツ「デフォルト」を使用する
マイケルユ・

デフォルト以外のKMSキーを使用している場合は、それも渡す必要があります:--sse-kms-key-id 0123-abc-etc ただし、明確ではない部分は、独自のKMSキーを使用するにはIAM権限が必要です。そうしないと、kms:GenerateDataKeyアクセスが拒否されます。
digarok

質問はダウンロードについてです。暗号化されたS3にアップロードするため、キーが必要です。
イリカス

4

Jamesが言及した「認証されたAWSユーザー」オプションはお勧めしません。

これにより、バケットレベルのACLが追加され、IAMユーザーだけでなく、AWSアカウントがそのバケットのリスト/削除/変更-aclsを許可されます。

すなわち、awsアカウントを持つすべての人のためのパブリック読み取り/書き込み。


これをテストしましたか?私は、AWSアカウントは実際には組織内のすべてのエンティティ、つまりユーザー、EC2インスタンス、IAMロールを意味するが、別のアカウントの誰かを意味しないという印象を受けました。間違っている可能性があります。その場合は、投稿を編集し、バケットをすばやく監査します。ありがとう。
ジェームズダンモア

1
うん。S3 ACLの「認証済みユーザー」被付与者とは、すべてのAWSアカウントを意味します。署名されたリクエストを強制しますが、それ以上のものはありません。参考文献は次のとおりです。リンク
アンドリュー

3

ポリシーを作成せずにこれを修正することができました-S3コンソール(web ui)からバケットを選択し、権限タブで「Any Authenticated AWS User」を選択し、すべてのボックスをチケットします。

更新:コメントで指摘されているように、「Any Authenticated AWS User」はアカウントのユーザーだけでなく、すべてのAWS認証ユーザーです。慎重に使用してください


それがあなたのためのポリシーを作成していると思います。すべてのボックスにチェックマークを付けると、ListBucketなどを取得できます。
ジョシュガ

私はちょうど書き込みポリシーは痛みをすることができることを知って、これらのダニボックスはあなたにもう少しけど素敵なクイックフィックスを与える可能性-私はそれがあると確信している
ジェームズ・ダンモア

2

IAMポリシーが正しく設定されている場合でもAn error occurred (AccessDenied) when calling the <OPERATION-NAME> operation: Access Denied、資格情報のMFA(多要素認証)要件などのエラーが発生する可能性があります。既にAWSコンソールにログインしている場合、認証情報は正常に機能しているように見え、aws cliからのアクセス許可拒否エラーメッセージは特に役に立たないため、これらは不意を突く可能性があります。

aws cliでMFAを設定する方法については、すでにいくつかの適切な指示があります。

基本的に、MFAデバイスのアドレスにアクセスし、デバイスからのコードとともに送信して一時トークンを取得する必要があります。


あなたは私の仲間を救った!
shintaroid

ヤス、それが理由です!AWSがこの理由を出力に表示しなかったのはなぜですか?
tommy.qichang

0

私は単にwebUIにアクセスしてバケットをクリックし、許可に移動してからポリシーに移動しました。開いたら、削除をクリックしました。私もこれが構成だったと思うのでこれをしました。

メインのs3ページに戻り、バケットをクリックして削除しようとすると、うまくいきました。

aws-cliを使用して実行した場合でも

$ aws s3 rb s3://bucket-name --force  

とにかく、それは私のために働いたものです。許可に関するポリシーにより、バケットの削除が禁止されています。


0

実行しようとするだけでこのエラーが発生した場合:

aws s3 cp s3://[bucketName]/[fileName] .

権限のないフォルダに。馬鹿げていますが、先に進む前に自分が自分のフォルダの所有者であることを確認してください!


0

無効なリソースまたはオブジェクト名を挿入すると問題が発生します。boto3でも同じ問題が発生しました(私の場合は無効なバケット名でした)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.