権限がs3:*の場合、S3バケットのListObjectsのAccessDenied


134

私は得ています:

ListObjects操作を呼び出すときにエラーが発生しました(AccessDenied):アクセスが拒否されました

S3バケットからフォルダーを取得しようとしたとき。

このコマンドを使用する:

aws s3 cp s3://bucket-name/data/all-data/ . --recursive

バケットのIAM権限は次のようになります。

{
"Version": "version_id",
"Statement": [
    {
        "Sid": "some_id",
        "Effect": "Allow",
        "Action": [
            "s3:*"
        ],
        "Resource": [
            "arn:aws:s3:::bucketname/*"
        ]
    }
] }

私のことができるように変更するには何が必要ですcopyし、ls成功しましたか?


1
私の場合、私はaws1人のユーザー用に構成し、それを別のユーザーからのcronjobと呼ばれるbashスクリプト内で使用しました。つまり、アクセスキーとアクセストークンが間違っているか、設定されていませんでした。私の解決策は、ここで説明するように、資格情報(AWS_ACCESS_KEY_IDおよびAWS_SECRET_ACCESS_KEY)をbashスクリプトファイルに直接挿入することでした。
Uwe Keim

回答:


199

S3バケット内のオブジェクトに対してコマンドを実行する権限を付与しましたが、バケット自体に対してアクションを実行する権限を付与していません。

ポリシーを少し変更すると、次のようになります。

{
  "Version": "version_id",
  "Statement": [
    {
        "Sid": "some_id",
        "Effect": "Allow",
        "Action": [
            "s3:*"
        ],
        "Resource": [
            "arn:aws:s3:::bucketname",
            "arn:aws:s3:::bucketname/*"
        ]
    }
  ] 
}

ただし、おそらく必要以上の許可が与えられます。最小特権付与するAWS IAMベストプラクティスに従うと、次のようになります。

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

40
これはアクションリストが広すぎます。リストとコピー権について、あなたが提案するのは必要なアクションです。
dom farr

6
@domfarr OPのポリシーを調整して彼のために機能させるために、最小限のことを行っていました。特定の質問がある場合は、コメントでこの質問にタグ付けするのではなく、このサイトに別の質問として投稿してください。S3アクションのリストを見て、必要なポリシーを作成するのは本当に簡単なはずですが。
マークB

4
私はタグ付けしていませんでした。OPは、コピーとlsに必要なものを要求しました。バケットレベルのarnの不足が含まれていましたが、アクションを調整していませんでした...私のコメントです。
dom farr

1
おそらく、適切な役割をEC3に直接割り当てることができます。:)
ChikuMiku、2018年

6
また、ない書き込みに必ず"Resource": [ "arn:aws:s3:::bucketname/", "arn:aws:s3:::bucketname/*" ]私は(つまり、あなたが唯一の前にスラッシュを望んでなかったように*) -このミスはすべて私の原因を実現するために私に4長い時間を要したlistObjectsが失敗への呼び出しを...
ダニエル・キシュナジ

35

前述のように、コマンド「aws s3 cp s3:// bucket-name / data / all-data /。--recursive」を使用してすべてのs3バケットオブジェクトをコピーする場合は、安全で最小限のポリシーを次に示します。

{
  "Version": "2012-10-17",
  "Statement": [
      {
          "Effect": "Allow",
          "Action": [
              "s3:ListBucket"
          ],
          "Resource": [
              "arn:aws:s3:::bucket-name"
          ],
          "Condition": {
              "StringLike": {
                  "s3:prefix": "data/all-data/*"
              }
          }
      },
      {
          "Effect": "Allow",
          "Action": [
              "s3:GetObject"
          ],
          "Resource": [
              "arn:aws:s3:::bucket-name/data/all-data/*"
          ]
      }
  ]
}

このポリシーの最初のステートメントでは、特定のバケットのサブディレクトリ内のオブジェクトを一覧表示できます。リソースはS3バケットのarnである必要があり、リストをそのバケット内のサブディレクトリのみに制限するには、「s3:prefix」値を編集できます。

このポリシーの2番目のステートメントでは、特定のサブディレクトリにあるバケット内のオブジェクトを取得できます。これは、「s3:// bucket-name / data / all-data /」パス内のすべてをコピーできることを意味します。これでは、「s3:// bucket-name / data /」などの親パスからコピーできないことに注意してください。

このソリューションは、AWS CLIコマンドの使用を制限するためのものです。AWSコンソールまたはAPIを介してS3アクセスを制限する必要がある場合は、より多くのポリシーが必要になります。こちらをご覧になることをお勧めします:https : //aws.amazon.com/blogs/security/writing-iam-policies-grant-access-to-user-specific-folders-in-an-amazon-s3-bucket/

これと同様の問題がここにあり、私が与えている解決策に私を導きました。 https://github.com/aws/aws-cli/issues/2408

お役に立てれば!


1
実際、サブキーに制限できるようですListBucketstackoverflow.com/a/35952877/89218
paleozogt

お知らせいただきありがとうございます。現在のプロジェクトのいくつかでこれを試します!
Robert Smith

ありがとう。最初ではない答えが私に役立つかもしれないとは決して思っていません
でし

実際に可能です。aws.amazon.com
blogs / security /

回答を編集して、特定のサブフォルダーの下にあるオブジェクトのリストを制限する条件を含めました。助けてくれてありがとう!
Robert Smith、

8

「arn:aws:3 ::: bucketname」または「arn:aws:3 ::: bucketname *」を使用してバケットのリソースを指定する必要があります。後者はバケットのオブジェクトの操作も可能にするため、推奨されます。スラッシュがないことに注意してください!

オブジェクトの一覧表示は、バケットに対する操作です。したがって、アクション「s3:ListBucket」が必要です。バケットへのオブジェクトの追加は、オブジェクトに対する操作です。したがって、アクション "s3:PutObject"が必要です。もちろん、必要に応じて他のアクションを追加することもできます。

{
"Version": "version_id",
"Statement": [
    {
        "Sid": "some_id",
        "Effect": "Allow",
        "Action": [
            "s3:ListBucket",
            "s3:PutObject"
        ],
        "Resource": [
            "arn:aws:s3:::bucketname*"
        ]
    }
] 
}

21
の問題arn:aws:s3:::bucketname*は、アクセスも許可することですarn:aws:s3:::bucketname-with-suffix
Guss

1
書かれているように、これは悪い方針です。使用しないでください。arn:aws:s3 ::: bucketnameに対してs3:ListBucketを許可し、arn:aws:s3 ::: bucketname / *に対してs3:PutObjectを許可する必要があります
jarmod

7

S3にアクセスできませんでした。

  • 最初にインスタンスにキーアクセスを設定しました(起動後にロールをアタッチすることは不可能でした)
  • 数ヶ月忘れた
  • インスタンスに添付されたロール
  • アクセスしようとしました。構成されたキーはロールよりも優先度が高く、必要なS3権限がユーザーに付与されていないため、アクセスが拒否されました。

解決策:rm -rf .aws/credentials、次にaws役割を使用します。


1
まったく同じ問題。この症状は、1人のユーザーが同じEC2ノードで別のユーザーがアクセスできないものにアクセスできることです。
Doc Kaos 2017

6

以下のようにポリシーを使用すると同じエラーが発生しましたが、s3:ListObjectsオペレーションに「s3:ListBucket」があります。

{
"Version": "2012-10-17",
"Statement": [
    {
        "Action": [
            "s3:ListBucket",
            "s3:GetObject",
            "s3:GetObjectAcl"
        ],
        "Resource": [
            "arn:aws:s3:::<bucketname>/*",
            "arn:aws:s3:::*-bucket/*"
        ],
        "Effect": "Allow"
    }
  ]
 }

次に、「arn:aws:s3 ::: bucketname」という 1行を追加して修正しました

{
"Version": "2012-10-17",
"Statement": [
    {
        "Action": [
            "s3:ListBucket",
            "s3:GetObject",
            "s3:GetObjectAcl"
        ],
        "Resource": [
             "arn:aws:s3:::<bucketname>",
            "arn:aws:s3:::<bucketname>/*",
            "arn:aws:s3:::*-bucket/*"
        ],
        "Effect": "Allow"
    }
 ]
}

4

エラーは「s3:ListObjects」アクションが原因であると考えていましたが、 S3バケットのListObjectsの AccessDenied」という問題を解決するには、アクション「s3:ListBucket」を追加する必要がありました 。


4

私は同じ問題に直面しました。資格情報の設定を追加しました:

aws_access_key_id = your_aws_access_key_id
aws_secret_access_key = your_aws_secret_access_key

「〜/ .aws /資格証明書」 +は、デフォルトのプロファイル用の端末再起動してください。

マルチプロファイルの場合--profile argを追加する必要があります:

aws s3 sync ./localDir s3://bucketName --profile=${PROFILE_NAME}

ここで、PROFILE_NAME

.bash_profile ( or .bashrc) -> export PROFILE_NAME="yourProfileName"

資格情報とマルチプロファイルの構成方法の詳細については、こちらをご覧ください。


2

私は以下を試しました:

aws s3 ls s3.console.aws.amazon.com/s3/buckets/{bucket name}

これは私にエラーを与えました:

An error occurred (AccessDenied) when calling the ListObjectsV2 operation: Access Denied

このフォームを使用するとうまくいきました:

aws s3 ls {bucket name}

0

受け入れられた回答と同じ方向の回答を追加しますが、小さな(重要な)違いを追加し、詳細を追加します。

以下の構成を検討してください。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": ["s3:ListBucket"],
      "Resource": ["arn:aws:s3:::<Bucket-Name>"]
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:PutObject",
        "s3:DeleteObject"
      ],
      "Resource": ["arn:aws:s3:::<Bucket-Name>/*"]
    }
  ]
}

このポリシーは、プログラムによる書き込みと削除のアクセスを許可し、2つの部分に分かれています
ListBucketアクションはバケットレベルの権限を提供し、他のPutObject/DeleteObjectアクションはバケット内のオブジェクトの権限を必要とします。

最初のResource要素arn:aws:s3:::<Bucket-Name>は、ListBucketアプリケーションがバケット内のすべてのオブジェクトをリストできるようにアクションを指定します。

2番目のResource要素arn:aws:s3:::<Bucket-Name>/*PutObjectDeletObjectアプリケーションがバケット内のオブジェクトを書き込んだり削除したりできるように、アクションを指定します。

バケットレベルとオブジェクトレベルのきめ細かい権限を指定するために、セキュリティ上の理由から2つの異なるarnに分離することが重要です。

GetObject2番目のブロックだけを指定した場合、プログラムによるアクセスの場合、次のようなエラーが発生することに注意してください。

Upload failed: <file-name> to <bucket-name>:<path-in-bucket> An error occurred (AccessDenied) when calling the PutObject operation: Access Denied


-1

同様の問題に遭遇しましたが、私にとっての問題は、bash_profileに異なるAWSキーが設定されていることでした。

私はここで同様の質問に答えました:https : //stackoverflow.com/a/57317494/11871462

bash_profileに競合するAWSキーがある場合、AWS CLIはデフォルトでこれらを使用します。


-1

ユーザーに特定のパスへの書き込みを許可したかったので、この問題が発生しました

{
            "Sid": "raspiiotallowspecificBucket",
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::<bucketname>/scripts",
                "arn:aws:s3:::<bucketname>/scripts/*"
            ]
        },

この問題で問題が解決しました

{
            "Sid": "raspiiotallowspecificBucket",
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::<bucketname>",
                "arn:aws:s3:::<bucketname>/*"
            ]
        },
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.