[amazon-s3] 하나의 버킷 만보고 액세스하도록 액세스를 제한하는 S3 정책이 있습니까?

images.mysite.com내 S3 및 백업 등이 포함 된 다른 버킷 처럼 보이는 간단한 버킷이 있습니다.

images.mysite.com이미지를 업로드하기 위해 특정 사용자가 버킷에 액세스 할 수 있도록 허용하고 싶습니다 . 그러나 나는 그가 다른 버킷을 보지 않기를 바랍니다. 존재한다는 사실조차도.

나는 이것을하는 정책을 만들 수 없었다. 제한적인 것을 시도 할 때마다 버킷 목록이 차단됩니다.



답변

나는 이것을 한동안 시도해 왔고 마침내 작동하는 해결책을 찾았습니다. 수행하는 작업의 종류에 따라 다른 “리소스”를 사용해야합니다. 또한 이전 답변에 누락 된 작업 (예 :)을 포함하고 일부를 DeleteObject제한 (예 PutBucketAcl:)했습니다.

다음 IAM 정책이 현재 저에게 효과적입니다.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:ListBucket",
        "s3:GetBucketLocation",
        "s3:ListBucketMultipartUploads"
      ],
      "Resource": "arn:aws:s3:::itnighq",
      "Condition": {}
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:AbortMultipartUpload",
        "s3:DeleteObject",
        "s3:DeleteObjectVersion",
        "s3:GetObject",
        "s3:GetObjectAcl",
        "s3:GetObjectVersion",
        "s3:GetObjectVersionAcl",
        "s3:PutObject",
        "s3:PutObjectAcl",
        "s3:PutObjectVersionAcl"
      ],
      "Resource": "arn:aws:s3:::itnighq/*",
      "Condition": {}
    },
    {
      "Effect": "Allow",
      "Action": "s3:ListAllMyBuckets",
      "Resource": "*",
      "Condition": {}
    }
  ]
}

버킷과 객체에 관한 작업은 서로 다른 arn을 가져야합니다.


답변

사용 사례 : 클라이언트가 공통 S3 도구를 사용하여 직접 액세스 할 수있는 클라우드 애플리케이션의 클라이언트를위한 백업 공간을 제공합니다. 물론 어떤 클라이언트도 다른 클라이언트가 가지고있는 것을 볼 수 없습니다.

cloudberryman은 “모든 버킷을 나열하거나 나열하지 않을 수 있습니다.”라고 설명 했으므로 해결 방법을 찾아야합니다. 배경:

AWS S3 콘솔 또는 S3Fox가 오류 메시지없이 연결되도록 사용자에게 ListAllMyBuckets 권한을 부여해야합니다. 그러나 ListAllMyBuckets는 할당 된 리소스와 관련하여 모든 버킷을 나열합니다 (실제로는 arn : … ::: * 만 작동 함). 저에게 물어 보면 심각한 버그입니다. Btw. ListBucket은 버킷의 콘텐츠를 나열 할 수있는 권한을 부여하므로 모든 버킷에 대해 ListBucket을 거부해도 나열되지 않습니다.

해결 방법으로 고려한 세 가지 가능성이 있습니다. 마지막을 선택했습니다.

(1) 암호 버킷 이름 (예 : GUID) 사용

장점 : 간편한 설치

단점 : 특히 클라이언트의 경우 관리가 어렵습니다. (수천 명에 달하는 특정 GUID를 찾는다고 상상해보십시오.) 또한 버킷 수 = 백업 서비스를 사용하는 클라이언트 수를 보여줍니다.

(2) 클라이언트 별 폴더와 함께 하나의 버킷 사용

이것이 Amazon이 S3 / IAM 예제에서 특정 사용자 또는 사용자 그룹 만 액세스 할 수있는 공간을 제공하도록 제안하는 방법입니다. 참조 :
AWS 예제 IAM 정책

장점 : 설정이 매우 쉬우 며 AWS 아이디어와 함께 사용

단점 : 모든 버킷의 존재를 공개해야하므로 클라이언트가 “홈”버킷을 찾을 수 있습니다. AWS 계정은 버킷 사용 통계를 제공하지만 폴더 사용 통계는 제공하지 않으므로 클라이언트별로 비용을 계산하기가 어렵습니다.

(3) ListAllMyBuckets에 대한 액세스 권한을 부여하지 마십시오.

장점 : 원하는 것을 얻을 수 있습니다. 클라이언트는 다른 클라이언트의 버킷을 볼 수 없습니다.

단점 : 클라이언트는 자신의 버킷을 볼 수 없습니다. S3Browser는 멋진 “cannot do”메시지와 함께 제공되며 버킷 이름을 입력하도록 요청합니다. S3Fox는 루트에 연결할 때 오류 메시지를 표시하지만 버킷 이름이 알려진 경우 클라이언트의 버킷에 대한 직접 탐색을 허용합니다. Amazon S3 콘솔이 전혀 작동하지 않습니다.

이것이 필요에 따라 S3 IAM을 처리하는 데 도움이 되었기를 바랍니다.


답변

ListAllMyBuckets권한 을 부여하지 않으면 S3 콘솔에 대한 액세스를 제공 할 수 없습니다.

필자의 경우 (그리고 아마도 미래의 독자 인 여러분도) 수용 가능한 대안은 로그인시 사용자를보고 싶은 버킷으로 직접 리디렉션하는 것입니다.

이를 수행하려면 IAM 로그인 URL에 다음을 추가하십시오.
/s3/?bucket=bucket-name

전체 로그인 URL ( your-aliasbucket-name 대체 ) :

https://your-alias.signin.aws.amazon.com/console/s3/?bucket=bucket-name

IAM 정책 ( 버킷 이름 교체 ) :

{
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:ListAllMyBuckets",
            "Resource": "arn:aws:s3:::*"
        },
        {
            "Effect": "Allow",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::bucket-name",
                "arn:aws:s3:::bucket-name/*"
            ]
        }
    ]
}

사용자에 대한 버킷 별 권한을 생성하는 방법에 대한 자세한 내용은 다음 블로그를 참조하십시오. http://mikeferrier.com/2011/10/27/granting-access-to-a-single-s3-bucket-using-amazon-iam /


답변

이 정책을 시도하십시오. 또한 사용자가 선택한 버킷 만 나열 할 수있는 방법이 없음을 고려하십시오. 모든 버킷을 나열하거나 나열하지 않을 수 있습니다.

{
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:GetObjectAcl",
                "s3:PutObjectAcl",
                "s3:ListBucket",
                "s3:GetBucketAcl",
                "s3:PutBucketAcl",
                "s3:GetBucketLocation"
            ],
            "Resource": "arn:aws:s3:::your_bucket_here/*",
            "Condition": {}
        },
        {
            "Effect": "Allow",
            "Action": "s3:ListAllMyBuckets",
            "Resource": "*",
            "Condition": {}
        }
    ]
}


답변

이 질문을 “다른 버킷에 액세스 할 수 없어 보이지 않는 한 버킷에 대한 액세스를 허용 할 수 있습니까?”라고 해석하고 있습니다. 액세스 권한이 부여되지 않은 버킷의 이름을 표시하는 것은 여전히 ​​정보 유출과 동일하기 때문입니다.

그리고 정답은 아니오입니다. 필요한 권한은 사용자가 모든 버킷을 볼 수 있도록 허용하는 ListAllMyBuckets입니다. 이 권한을 남겨두면 콘솔을 사용할 수 없게됩니다.


답변

사용자가 다른 버킷에 대한 지식을 구성하지 않고도 특정 버킷에 액세스 할 수 있도록하는 좋은 방법이 있습니다. 아래와 같은 그룹 정책은 사용자가 “bucket a”만 볼 수 있도록 허용합니다. 유일한 문제는 사용자가 주어진 버킷 엔드 포인트에 연결하는 경우에만 버킷에 액세스 할 수 있다는 것입니다. 아래 예에서는 bucket-a.s3.amazonaws.com이됩니다. 버킷에 “인증 된 사용자”가 허용되어야 할 수도 있습니다.

{
    "Statement": [
     {
         "Sid": "<EXAMPLE_SID>",
         "Action": [
           "s3:ListBucket",
           "s3:GetBucketLocation"
          ],
         "Effect": "Allow",
         "Resource": [
           "arn:aws:s3:::bucket-a"
         ]
     },
     {
      "Sid": "<EXAMPLE_SID>",
      "Action": "s3:*",
      "Effect": "Allow",
      "Resource": [
        "arn:aws:s3:::bucket-a/*"
      ]
     }
   ]
}

이 방법은 Mac OS / X의 Cyberduck에서 s3cmd 패키지를 사용하여 테스트되었습니다.

./s3cmd ls s3://bucket-a --access_key=ACCESS_KEY --secret_key=SECRET_KEY --bucket-locat
ion=ap-southeast-2


답변

답변이 확인되지 않은 이유가 궁금하십니까?

위의 솔루션에서 각 정책 설명을 분석해 보겠습니다.

이 정책 성명 에서이 벅 자체 버킷의 내용에 적용하지만. 이것은 아마 하지 당신이 양동이에 무엇을 볼 수 없기 때문에 질문을 위해 무엇을 요구.

{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:GetObjectAcl",
"s3:PutObjectAcl",
"s3:ListBucket",
"s3:GetBucketAcl",
"s3:PutBucketAcl",
"s3:GetBucketLocation"
],
"Resource": "arn:aws:s3:::your_bucket_here/*",
"Condition": {}
}

에서 파생 된 이 두 문 정책 은 ( arn:aws:s3:::your_bucket_here/) readonly 에서 버킷에 대한 읽기 전용 액세스 권한을 부여 하지만 버킷 콘텐츠 ( arn:aws:s3:::your_bucket_here/*) 에 대한 CRUD 작업은 계속 허용 합니다.

{
  "Effect": "Allow",
  "Action": [
    "s3:ListBucket",
    "s3:GetBucketLocation",
    "s3:ListBucketMultipartUploads"
  ],
  "Resource": "arn:aws:s3:::your_bucket_here",
  "Condition": {}
},
{
  "Effect": "Allow",
  "Action": [
    "s3:AbortMultipartUpload",
    "s3:DeleteObject",
    "s3:DeleteObjectVersion",
    "s3:GetObject",
    "s3:GetObjectAcl",
    "s3:GetObjectVersion",
    "s3:GetObjectVersionAcl",
    "s3:PutObject",
    "s3:PutObjectAcl",
    "s3:PutObjectAclVersion"
  ],
  "Resource": "arn:aws:s3:::your_bucket_here/*",
  "Condition": {}
}

그러나 정책에는 사용자가 엔드 포인트에서 모든 버킷을 볼 수 있도록 허용하는 아래 설명이 포함되어 있습니다. 이것은 아마도 질문이 요구 한 것이 아닐 것 입니다.

{
"Effect": "Allow",
"Action": "s3:ListAllMyBuckets",
"Resource": "*",
"Condition": {}
}

그러나 위의 내용은 S3 스토어를 브라우저하는 클라이언트를 사용하는 경우 매우 유용합니다. 클라이언트가 버킷이 아닌 저장소에 직접 액세스하는 경우 루트의 버킷 목록에 액세스해야합니다.