권한이 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/*"
        ]
    }
] }

나는 할 수 있도록 변화해야 할 사항은 무엇 copyls성공적으로?


1
필자의 경우 aws한 사용자에 대해 구성 하고 다른 사용자의 cronjob이라는 bash 스크립트 내에서 사용했습니다. 즉, 액세스 키와 액세스 토큰이 잘못 / 설정 해제되었음을 의미합니다. 내 해결책은 여기에 설명 된대로 자격 증명 ( AWS_ACCESS_KEY_IDAWS_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 작업 목록을보고 원하는 정책을 작성하는 것은 정말 쉽지만.
Mark B

4
태그하지 않았습니다. OP는 복사 및 ls에 필요한 것을 요청했습니다. 버킷 레벨 arn의 부족이 포함되었지만 액션을 조정하지 않았습니다 ... 따라서 내 의견.
dom farr

1
EC3에 적절한 역할을 직접 할당하는 것이 좋습니다. :)
ChikuMiku

6
또한 없습니다 쓰기에 반드시 "Resource": [ "arn:aws:s3:::bucketname/", "arn:aws:s3:::bucketname/*" ]내가 (즉, 당신은 단지 앞에 슬래시를 원하는처럼 *) -이 실수 내 모든 원인 실현하기 위해 나에게 4 오랜 시간이 걸렸다 listObjects실패 전화를 ...
다니엘 Kis이-나기

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 버킷의 영역이어야하며 해당 버킷의 하위 디렉토리로만 목록을 제한하려면 "s3 : prefix"값을 편집 할 수 있습니다.

이 정책의 두 번째 문장은 버킷 내의 객체를 특정 하위 디렉토리로 가져올 수 있도록합니다. 이것은 "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
실제로 하위 ListBucket
키로

알려 주셔서 감사합니다. 현재 진행중인 프로젝트 중 일부에서 시도해 보겠습니다.
Robert Smith

감사. 첫번째 답변이 아닌 답변이 도움이 될 것이라고 생각하지 마십시오
Vyacheslav Tsivina

실제로 가능합니다, aws.amazon.com/blogs/security/…
citynorman

특정 하위 폴더 아래에있는 객체 목록을 제한하는 조건을 포함하도록 답변을 편집했습니다. 도와 주셔서 감사합니다!
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
정확히 같은 문제입니다. 이 증상은 한 사용자가 다른 사용자가 동일한 EC2 노드에서 할 수없는 것에 액세스 할 수 있다는 것입니다.
Doc Kaos

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" 을 추가하여 수정했습니다 .

{
"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 : ListBucket" 작업을 추가하여 " S3 버킷의 ListObjects에 대한 AccessDenied"문제를 해결해야했습니다.


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

이 정책은 프로그래밍 방식의 쓰기-삭제 액세스 권한을 부여하며 두 부분으로 구분됩니다.
ListBucket작업은 버킷 수준에 대한 권한을 제공하고 다른 PutObject/DeleteObject작업에는 버킷 내부의 객체에 대한 권한이 필요합니다.

첫 번째 Resource 요소 는 애플리케이션이 버킷의 모든 객체를 나열 할 수 있도록 작업에 arn:aws:s3:::<Bucket-Name>대해 지정합니다 ListBucket.

두 번째 Resource 요소 는 응용 프로그램이 버킷의 객체를 쓰거나 삭제할 수 있도록 및 작업에 arn:aws:s3:::<Bucket-Name>/*대해 지정합니다 .PutObjectDeletObject

버킷 수준 및 객체 수준의 세분화 된 권한을 지정하려면 보안상의 이유로 두 가지 '원'으로 분리하는 것이 중요합니다.

GetObject두 번째 블록 에만 지정 하면 프로그래밍 방식 액세스의 경우 다음과 같은 오류가 발생합니다.

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 : //.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.