web-dev-qa-db-ja.com

AWS CLIを使用してAmazon S3からダウンロードするときにAccess Deniedが発生する原因は何ですか?

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

これまでに行ったこと:

  • My-userというユーザーを作成しました(例)
  • ユーザー用に生成されたアクセスキーをEC2インスタンスの〜/ .awsに配置
  • My-userにアクセス権を付与したいバケットポリシーを作成しました
  • コマンドを実行しました_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/*"
    }
  ]
}
_

同じ結果。

59
Josh Gagnon

私もこれに苦労していましたが、ここで答えを見つけました 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

41
Sergio

同じ問題に直面したとき、AWSではサーバー側の暗号化を有効にする必要があることがわかりました。したがって、次のコマンドは私にとってうまくいきました:

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

Jamesが述べた「Any authentication AWS user」オプションはお勧めしません。

そうすることで、任意のAWSアカウント(IAMユーザーだけでなく)がそのバケットのリスト/削除/変更-aclsを行えるようにするバケットレベルのACLが追加されます。

つまり、awsアカウントを持っている人は誰でも読み書きできます。

5
Andrew

私はなんとかしてポリシーを書くことなくこれを修正しました-S3コンソール(web ui)からバケットを選択し、許可タブで "Any Authenticated AWS User"を選択してすべてのボックスにチケットを発行しました。

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

3
James Dunmore

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

Aws cliを使用してMFAを設定する方法については、すでにいくつかの良い説明があります。

基本的に、あなたはあなたのMFAデバイスのアドレスに到達する必要があり、そして一時的なトークンを得るためにあなたのデバイスからのコードでそれを送る必要があります。

2
Mark Chackerian

私は単にwebUIをオンにしてバケットをクリックし、権限に移動してから、ポリシーに移動しました。私がそれを開いたとき、私は単に削除をクリックしました。これも構成だったと思うので、これを行いました。

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

私がaws-cliでそれをやったときでも

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

とにかく、それは私のために働いたものです。権限に関するポリシーにより、バケットを削除できません。

0
Spencer Davis

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

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

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

0
Jeff Diederiks

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

0
yunus