繁体   English   中英

S3 存储桶的 ListObjectsV2 操作的访问被拒绝

[英]AccessDenied for ListObjectsV2 operation for S3 bucket

在 GitlabCi 期间,我得到:“致命错误:调用 ListObjectsV2 操作时发生错误(AccessDenied):拒绝访问”

我的存储桶策略:

{
"Version": "2008-10-17",
"Statement": [
    {
        "Sid": "AllowPublicRead",
        "Effect": "Allow",
        "Principal": {
            "AWS": "*"
        },
        "Action": "s3:*",
        "Resource": "arn:aws:s3:::BUCKET-NAME/*"
    }
]

}

在 gitlabCI 设置中设置:

  • AWS_ACCESS_KEY_ID:您的 AWS-ACCESS-KEY-ID
  • AWS_SECRET_ACCESS_KEY:您的 AWS-SECRET-ACCESS-KEY
  • S3_BUCKET_NAME:您的 S3-BUCKET-NAME
  • DISTRIBUTION_ID:CLOUDFRONT-DISTRIBUTION-ID

我的.gitlab-ci.yml

image: docker:latest

stages:
  - build
  - deploy

build:
  stage: build
  image: node:8.11.3
script:
  - export API_URL="d144iew37xsh40.cloudfront.net"
  - npm install
  - npm run build
  - echo "BUILD SUCCESSFULLY"
artifacts:
   paths:
    - public/
expire_in: 20 mins
environment:
name: production
only:
   - master
deploy:
  stage: deploy
  image: python:3.5
dependencies:
   - build
script:
  - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
  - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
  - export S3_BUCKET_NAME=$S3_BUCKET_NAME
  - export DISTRIBUTION_ID=$DISTRIBUTION_ID
  - pip install awscli --upgrade --user
  - export PATH=~/.local/bin:$PATH
  - aws s3 sync --acl public-read --delete public $S3_BUCKET_NAME
  - aws cloudfront create-invalidation --distribution-id 
$DISTRIBUTION_ID --paths '/*'
  - echo "DEPLOYED SUCCESSFULLY"

environment:
   name: production
only:
  - master

我不确定接受的答案实际上是否可以接受,因为它只是允许对存储桶进行所有操作 此外,Sid 具有误导性... ;-)

这篇 AWS 文章提到了aws s3 sync所需的权限。

这是相应政策的样子:

{
"Version": "version_id",
"Statement": [
    {
        "Sid": "AllowBucketSync",
        "Effect": "Allow",
        "Action": [
            "s3:GetObject", 
            "s3:PutObject", 
            "s3:ListBucket"
        ],
        "Resource": [
            "arn:aws:s3:::BUCKET-NAME",
            "arn:aws:s3:::BUCKET-NAME/*"
        ]
    }
] }

我最近遇到了这个问题。 无论我做了什么,无论我提供了什么权限,在运行aws s3 ls <bucket>时,我一直收到“调用 ListObjectsV2 操作时发生错误(AccessDenied):拒绝访问”

我忘记了在我的环境中配置了多个 aws 配置文件。 aws 命令使用的是默认配置文件,该配置文件具有一组不同的访问密钥。 我必须为命令指定 --profile 标志:

aws s3 ls <bucket> --profile <correct profile>

那奏效了。 这是一个利基情况,但也许它会帮助某人。

尝试将您的存储桶策略更新为:

{
"Version": "version_id",
"Statement": [
    {
        "Sid": "AllowPublicRead",
        "Effect": "Allow",
        "Action": [
            "s3:*"
        ],
        "Resource": [
            "arn:aws:s3:::BUCKET-NAME",
            "arn:aws:s3:::BUCKET-NAME/*"
        ]
    }
] }

我希望你明白这是非常不安全的。

即使政策是正确的,我也收到了“AccessDenied”错误。 尽管我只配置了一个(默认)凭据,但我尝试了 mrbranden 的解决方案。 你瞧,

$ aws s3 ls <bucket> --profile=default

让它工作!

我的 aws --version 是 aws-cli/1.18.69 Python/3.8.5 Linux/5.4.0-1035-aws botocore/1.16.19

现在需要原则,它应该是这样的:

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

}

当我错误地使用带有s3://前缀的完整域名来选择要操作的存储桶时,我收到了一条相当具有误导性的错误消息,例如s3://s3.amazonaws.com/bucket_name 切换到s3://bucket_name解决了这个问题。

对于启用了 MFA 的亚马逊用户,请使用: aws s3 ls s3://bucket-name --profile mfa

并首先通过运行aws sts get-session-token --serial-number arn:aws:iam::123456789012:mfa/user-name --token-code 797395 --duration 129600准备配置文件mfa (替换 123456789012、用户名和 797395)。 在此处输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM