AccessDenied cho ListObjects cho nhóm S3 khi quyền là s3: *


134

Tôi đang nhận được:

Đã xảy ra lỗi (AccessDenied) khi gọi hoạt động ListObjects: Truy cập bị từ chối

Khi tôi cố gắng lấy thư mục từ thùng S3 của mình.

Sử dụng lệnh này:

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

Các quyền IAM cho nhóm trông như thế này:

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

Tôi cần thay đổi những gì để có thể copylsthành công?


1
Trong trường hợp của tôi, tôi đã định cấu hình awscho một người dùng và sử dụng nó trong tập lệnh bash được gọi là cronjob từ một người dùng khác, nghĩa là khóa truy cập và mã thông báo truy cập bị sai / không được đặt. Giải pháp của tôi là trực tiếp đưa thông tin đăng nhập ( AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY) vào tệp tập lệnh bash của tôi như được mô tả ở đây .
Uwe Keim

Câu trả lời:


199

Bạn đã cho phép thực hiện các lệnh trên các đối tượng bên trong nhóm S3, nhưng bạn chưa được phép thực hiện bất kỳ hành động nào trên chính nhóm đó.

Sửa đổi một chút chính sách của bạn sẽ như thế này:

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

Tuy nhiên, điều đó có thể cho phép nhiều hơn mức cần thiết. Theo thông lệ tốt nhất của AWS IAM về Cấp đặc quyền tối thiểu sẽ trông giống như thế này:

{
  "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
Đây là một danh sách hành động quá rộng. Đối với quyền liệt kê và sao chép, những gì bạn muốn đề xuất là những hành động cần thiết.
dom farr

6
@domfarr Tôi chỉ làm tối thiểu có thể để điều chỉnh chính sách OP để làm cho nó hoạt động cho anh ta. Nếu bạn có một câu hỏi cụ thể, bạn nên đăng nó dưới dạng một câu hỏi riêng biệt trên trang web này thay vì gắn thẻ lên câu hỏi này với các bình luận. Mặc dù thật dễ dàng để xem danh sách các hành động S3 và xây dựng chính sách bạn muốn.
Đánh dấu B

4
Tôi đã không gắn thẻ. OP đã yêu cầu những gì cần thiết cho bản sao và ls. Việc thiếu arn cấp xô đã được đưa vào, nhưng bạn đã không điều chỉnh Hành động ... do đó tôi nhận xét.
dom farr

1
Có lẽ trực tiếp gán một vai trò thích hợp cho EC3 nên hoạt động. :)
ChikuMiku

6
Ngoài ra, hãy chắc chắn không viết "Resource": [ "arn:aws:s3:::bucketname/", "arn:aws:s3:::bucketname/*" ]như tôi đã làm (tức là bạn chỉ muốn một dấu gạch chéo trước *) - tôi mất 4 giờ để nhận ra lỗi này khiến tất cả các listObjectscuộc gọi của tôi đều thất bại ...
Dániel Kis-Nagy

35

Nếu bạn muốn sao chép tất cả các đối tượng nhóm s3 bằng lệnh "aws s3 cp s3: // xô-name / data / all-data /. --Recursive" như bạn đã đề cập, đây là một chính sách an toàn và tối thiểu để thực hiện điều đó:

{
  "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/*"
          ]
      }
  ]
}

Câu lệnh đầu tiên trong chính sách này cho phép liệt kê các đối tượng trong thư mục con của một nhóm cụ thể. Tài nguyên cần phải là arn của nhóm S3 và để giới hạn danh sách chỉ trong một thư mục con trong nhóm đó, bạn có thể chỉnh sửa giá trị "s3: tiền tố".

Câu lệnh thứ hai trong chính sách này cho phép lấy các đối tượng bên trong nhóm tại một thư mục con cụ thể. Điều này có nghĩa là bất cứ điều gì bên trong đường dẫn "s3: // xô tên / dữ liệu / tất cả dữ liệu /" bạn sẽ có thể sao chép. Xin lưu ý rằng điều này không cho phép bạn sao chép từ các đường dẫn chính, chẳng hạn như "s3: // tên xô / dữ liệu /".

Giải pháp này là cụ thể để hạn chế sử dụng cho các lệnh AWS CLI; nếu bạn cần giới hạn quyền truy cập S3 thông qua bảng điều khiển AWS hoặc API, thì sẽ cần nhiều chính sách hơn. Tôi khuyên bạn nên xem tại đây: https://aws.amazon.com/bloss/security/wr-iam-polaho-grant-access-to-user-specific- Folders-in-an-amazon-s3-bucket / .

Một vấn đề tương tự như vậy có thể được tìm thấy ở đây dẫn tôi đến giải pháp tôi đang đưa ra. https://github.com/aws/aws-cli/issues/2408

Hi vọng điêu nay co ich!


1
Trên thực tế, có vẻ như bạn có thể giới hạn ListBucketở một khóa con: stackoverflow.com/a353952877/89218
paleozogt

Cảm ơn đã cho tôi biết, tôi sẽ thử điều này trên một số dự án hiện tại của tôi!
Robert Smith

Cảm ơn. Đừng bao giờ nghĩ rằng câu trả lời không phải đầu tiên có thể giúp tôi
Vyacheslav Tsivina

Điều đó thực sự có thể, aws.amazon.com/bloss/security/ từ
citynorman

Tôi đã chỉnh sửa câu trả lời để bao gồm một điều kiện để giới hạn các đối tượng liệt kê trong thư mục con cụ thể. Cảm ơn đã giúp đỡ!
Robert Smith

8

Bạn phải chỉ định Tài nguyên cho nhóm qua "arn: aws: 3 ::: buckname" hoặc "arn: aws: 3 ::: buckname *". Cái thứ hai được ưa thích vì nó cũng cho phép thao tác trên các đối tượng của thùng. Thông báo không có dấu gạch chéo!

Các đối tượng liệt kê là một hoạt động trên Xô. Do đó, hành động "s3: ListBucket" là bắt buộc. Thêm một đối tượng vào Nhóm là một hoạt động trên Object. Do đó, hành động "s3: PutObject" là cần thiết. Chắc chắn, bạn có thể muốn thêm các hành động khác khi bạn yêu cầu.

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

21
vấn đề arn:aws:s3:::bucketname*là nó cũng cho phép truy cập vàoarn:aws:s3:::bucketname-with-suffix
Guss

1
Như đã viết, đây là một chính sách tồi; đừng dùng nó Nó sẽ cho phép s3: ListBucket chống lại arn: aws: s3 ::: buckname và s3: PutObject chống lại arn: aws: s3 ::: buckname / *
jarmod

7

Tôi không thể truy cập S3 vì

  • Đầu tiên tôi định cấu hình truy cập khóa trên ví dụ (không thể đính kèm vai trò sau khi khởi chạy sau đó)
  • quên nó trong vài tháng
  • vai trò gắn liền với ví dụ
  • đã cố gắng truy cập. Khóa được định cấu hình có mức độ ưu tiên cao hơn vai trò và quyền truy cập bị từ chối vì người dùng không được cấp quyền S3 cần thiết.

Giải pháp : rm -rf .aws/credentials, sau đó awssử dụng vai trò.


1
Chính xác vấn đề tương tự. Một triệu chứng của điều này sẽ là một người dùng có thể truy cập vào những thứ mà người dùng khác không thể có trên cùng một nút EC2.
Doc Kaos

6

Tôi đã gặp lỗi tương tự khi sử dụng chính sách như dưới đây, mặc dù tôi có "s3: ListBucket" cho hoạt động s3: ListObjects.

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

Sau đó, tôi đã sửa nó bằng cách thêm một dòng "arn: aws: s3 ::: buckname"

{
"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

Tôi đã nghĩ rằng lỗi là do hành động "s3: ListObjects" nhưng tôi đã phải thêm hành động "s3: ListBucket" để giải quyết vấn đề "AccessDenied cho ListObjects cho nhóm S3"


4

Tôi phải đối mặt với cùng một vấn đề. Tôi vừa thêm thông tin cấu hình:

aws_access_key_id = your_aws_access_key_id
aws_secret_access_key = your_aws_secret_access_key

vào "~ / .aws / thông tin đăng nhập" + khởi động lại thiết bị đầu cuối cho cấu hình mặc định.

Trong trường hợp hồ sơ đa --profile nhu cầu arg được thêm vào:

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

nơi PROFILE_NAME :

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

Thông tin thêm về cách cấu hình thông tin đăng nhập và nhiều hồ sơ có thể được tìm thấy ở đây


2

Tôi đã thử như sau:

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

Điều này đã cho tôi lỗi:

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

Sử dụng hình thức này đã làm việc:

aws s3 ls {bucket name}

0

Tôi đang thêm một câu trả lời có cùng hướng với câu trả lời được chấp nhận nhưng với sự khác biệt nhỏ (quan trọng) và thêm chi tiết.

Hãy xem xét cấu hình dưới đây:

{
  "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>/*"]
    }
  ]
}

Chính sách cấp theo chương trình ghi-xóa truy cập và được chia thành hai phần:
Các ListBuckethành động cung cấp quyền truy cập vào các mức xô và một PutObject/DeleteObjecthành động đòi hỏi quyền truy cập vào các đối tượng bên trong xô.

Các quy định cụ thể các yếu tố tài nguyên đầu tiên arn:aws:s3:::<Bucket-Name>cho ListBuckethành động để ứng dụng có thể liệt kê tất cả các đối tượng trong xô.

Phần tử tài nguyên thứ hai chỉ định arn:aws:s3:::<Bucket-Name>/*cho PutObjectDeletObjectcác hành động để các ứng dụng có thể viết hoặc xóa bất kỳ đối tượng nào trong nhóm.

Việc tách thành hai 'arns' khác nhau rất quan trọng từ các lý do bảo mật để chỉ định các quyền truy cập chi tiết ở cấp độ xô và mức đối tượng.

Lưu ý rằng nếu tôi đã chỉ định GetObjecttrong khối 2 thì điều gì sẽ xảy ra là trong các trường hợp truy cập theo chương trình, tôi sẽ nhận được một lỗi như:

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


-1

Gặp phải một vấn đề tương tự, đối với tôi, vấn đề là tôi đã cài đặt các khóa AWS khác nhau trong bash_profile của mình.

Tôi đã trả lời một câu hỏi tương tự ở đây: https://stackoverflow.com/a/57317494/11871462

Nếu bạn có các khóa AWS xung đột trong bash_profile của mình, AWS CLI sẽ mặc định các khóa này thay thế.


-1

Tôi gặp vấn đề này yêu cầu của tôi, tôi muốn cho phép người dùng viết vào đường dẫn cụ thể

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

và vấn đề đã được giải quyết với sự thay đổi này

{
            "Sid": "raspiiotallowspecificBucket",
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::<bucketname>",
                "arn:aws:s3:::<bucketname>/*"
            ]
        },
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.