programing tip

하나의 버킷 만 보거나 액세스하도록 액세스를 제한하는 S3 정책이 있습니까?

itbloger 2020. 7. 27. 07:38
반응형

하나의 버킷 만 보거나 액세스하도록 액세스를 제한하는 S3 정책이 있습니까?


images.mysite.comS3 및 백업 등을 포함하는 다른 버킷과 같은 간단한 버킷이 있습니다.

특정 사용자가 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을 거부해도 버킷이 나열되지 않습니다.

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

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

장점 : 설정 용이

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

(2) 클라이언트 특정 폴더와 함께 하나의 버킷을 사용하십시오.

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

장점 : 설정이 쉽고 AWS 아이디어와 함께 제공

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

(3) ListAllMyBuckets에 대한 액세스 권한을 부여하지 않습니다

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

단점 : 고객이 자신의 버킷을 볼 수 없습니다. S3Browser에는 멋진 "할 수 없음"메시지가 표시되고 버킷 이름을 입력하라는 메시지가 표시됩니다. 루트에 연결할 때 S3Fox에서 오류 메시지가 표시되지만 버킷 이름을 알고있는 경우 클라이언트 버킷으로 직접 탐색 할 수 있습니다. Amazon S3 콘솔이 전혀 작동하지 않습니다.

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


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

필자의 경우 (그리고 미래의 독자 일 수도 있음) 허용되는 대안은 로그인 할 때 사용자가보고자하는 버킷으로 직접 사용자를 리디렉션하는 것입니다.

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

전체 로그인 URL ( 별칭버킷 이름 대체 ) :

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

IAM 정책 ( bucket-name 교체 ) :

{
    "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이며 사용자는 모든 버킷을 볼 수 있습니다. 이 권한이 없으면 콘솔을 사용할 수 없게됩니다.


사용자가 다른 버킷에 대한 지식을 구성하지 않고도 특정 버킷에 액세스 할 수있는 좋은 방법이 있습니다. 아래와 같은 그룹 정책을 통해 사용자는 "버킷 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/) 읽기 전용을 버킷의 내용에 CRUD 작전을하지만, 여전히 수 있습니다 ( arn:aws:s3:::your_bucket_here/*).

{
  "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 저장소를 브라우저하는 클라이언트를 사용하는 경우 매우 유용합니다. 클라이언트가 버킷이 아닌 상점에 직접 액세스하는 경우 루트의 버킷 목록에 액세스해야합니다.


아마도 가장 간단한 사용 사례 :

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

AWS Organizations를 사용하여이를 수행하는 쉬운 방법이나 해결 방법이 있습니다. AWS 조직에서는 여러 사용자 계정을 보유 할 수 있습니다. 기본 계정에는 여러 AWS 계정 (하위)이있을 수 있으며 해당 서비스 만 볼 수있는 AWS 계정에 추가 된 서비스 (s3 / EC2 / *)가 있습니다.

참조하시기 바랍니다 https://aws.amazon.com/blogs/aws/aws-organizations-policy-based-management-for-multiple-aws-accounts/ https://aws.amazon.com/organizations/을

내 계정 페이지의 조직


위에서 설명한 것처럼 콘솔에 하나의 버킷 만 나열 할 수 없습니다. 그러나 S3 버킷의 액세스가 IAM에 연결되어 있으면 버킷에 대한 URL을 사용할 수있는 경우 IAM이 버킷에 직접 액세스 할 수 있습니다. S3 버킷 URL은 다음과 같습니다.

https://s3.console.aws.amazon.com/s3/buckets/BucketName

여기서 BucketName은 IAM이 액세스 할 수있는 버킷의 이름입니다.


이 솔루션을 찾았습니다.
AWS FLOW :
AWS 흐름

버킷 정책 :

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Deny",
      "Principal": "*",
      "Action": "s3:*",
      "Resource": [
        "arn:aws:s3:::MyExampleBucket",
        "arn:aws:s3:::MyExampleBucket/*"
      ],
      "Condition": {
        "StringNotLike": {
          "aws:userId": [
            "AROAEXAMPLEID:*", #Role ID
            "111111111111" #AccountID
          ]
        }
      }
    }
  ]
}

IAM 정책 :

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Deny",
      "Principal": "*",
      "Action": "s3:*",
      "Resource": [
        "arn:aws:s3:::MyExampleBucket",
        "arn:aws:s3:::MyExampleBucket/*"
      ],
      "Condition": {
        "StringNotLike": {
          "aws:userId": [
            "AROAEXAMPLEID:*",  #Role ID
            "AIDAEXAMPLEID",  #UserID
            "111111111111"  #AccountID
          ]
        }
      }
    }
  ]
}

aws iam get-user -– 사용자 이름 USER-NAME --profile = Example 프로필

aws iam get-role --role-name ROLE-NAME --profile = Example 프로필

출처 : https://aws.amazon.com/blogs/security/how-to-restrict-amazon-s3-bucket-access-to-a-specific-iam-role/

추신 버킷 정책에주의, 당신은 권한없이 유지 할 수 있습니다


나는 다음 작업을 수행했습니다. 다른 버킷을 나열하면 액세스 거부 메시지가 수신되었음을 의미합니다. 그러나 버킷 이름을 경로로 설정하여 연결하면 원하는 버킷을 여전히 볼 수있었습니다.

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

이 연결을 테스트하기 위해 Cyberduck을 사용하고있었습니다.


s3:ListAllMyBuckets특정 버킷으로 작업 을 제한 할 수는 없지만 해결 방법은 특정 버킷에 대한 콘솔 URL을 보낼 수 있습니다 (예 :

  • https://s3.console.aws.amazon.com/s3/buckets/BUCKET_NAME/

출처 : S3 콘솔에서 S3 버킷 목록 제한

그러려면 주어진 사용자 또는 그룹에 대해 다음 정책 문서를 지정해야합니다.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:GetBucketLocation",
                "s3:ListBucketMultipartUploads"
            ],
            "Resource": [
                "arn:aws:s3:::my-bucket-1",
                "arn:aws:s3:::my-bucket-2"
            ]
        },
        {
            "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:::my-bucket-1/*",
                "arn:aws:s3:::my-bucket-2/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListAllMyBuckets"
            ],
            "Resource": "arn:aws:s3:::*"
        }
    ]
}

경우 my-bucket-1와는 my-bucket-2읽기 및 쓰기 액세스 권한을 부여하는 당신의 버킷입니다.

관련 :


이 정책을 시도하십시오. 사용자는 버킷을 나열 할 수 없으며 허용 된 버킷에 직접 링크를 사용해야합니다.

예를 들면 다음과 같습니다. s3.console.aws.amazon.com/s3/buckets/bucketname/?region=us-east-1&tab=overview

{
  "Statement": [
    {
      "Action": [
        "s3:ListBucket"
      ],
      "Effect": "Allow",
      "Resource": [
        "arn:aws:s3:::bucketname"
      ]
    },
    {
      "Action": [
        "s3:PutObject",
        "s3:GetObject"
      ],
      "Effect": "Allow",
      "Resource": [
        "arn:aws:s3:::bucketname*"
      ]
    },

  ],
  "Version": "2012-10-17"
}

솔루션 벨로우즈가 나를 위해 일했습니다. 특정 버킷 my-s3-bucket 의 특정 사용자 my_iam_user 에 대한 액세스 권한을 부여하는 정책이 필요했습니다 .

이 정책을 통해 사용자는 특정 s3 버킷에서 파일을 나열, 삭제 및 가져올 수 있습니다.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "ListBucket",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::123456789012:user/my_iam_user"
            },
            "Action": [
                "s3:ListBucket"
            ],
            "Resource": "arn:aws:s3:::my-s3-bucket"
        },
        {
            "Sid": "AddDeleteFiles",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::123456789012:user/my_iam_user"
            },
            "Action": [
                "s3:DeleteObject",
                "s3:GetObject",
                "s3:PutObject"
            ],
            "Resource": "arn:aws:s3:::my-s3-bucket/*"
        }
    ]
}

나는 이것에 의해 해결 된 비슷한 요구를 추가한다.

{
  "Version": "2012-10-17",
  "Statement": [
    {
        "Effect": "Allow",
        "Action": [
            "s3:Get*",
            "s3:Put*",
            "s3:DeleteObject",
            "s3:ListBucket"
        ],
        "Resource": [
            "arn:aws:s3:::my-bucket-name",
            "arn:aws:s3:::my-bucket-name/*"
        ]
    }
  ]
}

다음 내용을 사용하여 다른 사용자의 버킷 내용을 숨 깁니다. 이렇게하면 하나의 버킷을 만들 때 다른 버킷 (ListAllMyBuckets를 사용하지 않음)뿐만 아니라 동일한 버킷에있는 폴더를 숨기는 데 도움이되지만 하위 폴더가 있어야 IAM 사용자 / 하위 폴더에 적절한 권한을 할당 할 수 있습니다.

다음 정책이 IAM 그룹에 적용되며 모든 사용자가이 그룹에 있습니다. aws:userid버킷에서 이름이 같은 하위 폴더 를 가져 와서 만들어야합니다.

UserID는 다음과 같습니다 : aws iam get-user --user-name "user_name_for_folder_access":

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

우리가 생각 해낸 좋은 간단한 해결책은 사용자가 루트 디렉토리에 로그인하는 것을 차단하는 것입니다. 따라서 원격 경로를 원하는 폴더로 설정하여 로그인해야합니다.

 {
"Statement": [
    {
        "Effect": "Allow",
        "Action": "s3:*",
        "Resource": "arn:aws:s3:::folder-name*",
        "Condition": {}
    }
]
}

아니요, 현재 사용자가 루트 나 다른 곳에서 선택적 버킷을 보도록 제한 할 수는 없습니다. 지금은이 세 가지 옵션 만 있습니다.

클라이언트에게 버킷 이름을 명시 적으로 사용하도록 요청했습니다.


자세한 내용은 http://blogs.aws.amazon.com/security/post/Tx3VRSWZ6B3SHAV/Writing-IAM-Policies-How-to-grant-access-to-an-Amazon-S3-bucket 에서 자세히 설명합니다.


이것은 나를 위해 완벽하게 작동했습니다. 사용자는 파일 목록을 업로드, 다운로드 및 가져올 수 있지만 다른 버킷에서 파일을 볼 수는 없습니다.

 {    

"Statement": [    

{
    "Effect": "Allow",
    "Action": [
        "s3:GetObject",
        "s3:PutObject",
        "s3:GetObjectAcl",
        "s3:PutObjectAcl",
        "s3:ListBucket",
        "s3:GetBucketAcl",
        "s3:PutBucketAcl",
        "s3:GetBucketLocation"
    ],
    "Resource": "arn:aws:s3:::mybucketname/*",
    "Condition": {}
},
{
    "Effect": "Allow",
    "Action": "s3:ListAllMyBuckets",
    "Resource": "*",
    "Condition": {}
},
{
    "Effect": "Deny",
    "Action": [
        "s3:DeleteBucket",
        "s3:DeleteBucketPolicy",
        "s3:DeleteBucketWebsite",
        "s3:DeleteObject",
        "s3:DeleteObjectVersion"
    ],
    "Resource": "arn:aws:s3:::mybucketname/*",    

    "Condition": {}    

}
]
}      

Deny액세스하지 않을 버킷에 대한 절을 추가하십시오 . 그것들은 여전히 ​​나열 될 수 있지만 그 안의 내용에 액세스 할 수는 없습니다.

{
    "버전": "2012-10-17",
    "명명 서": [
        {
            "효과": "허용",
            "조치": "s3 : *",
            "자원": "*"
        },
        {
            "효과": "거부",
            "조치": "s3 : *",
            "자원": [
                "arn : aws : s3 ::: bucket-name",
                "arn : aws : s3 ::: bucket-name / *"
            ]
        }
    ]
}

  • 사용자를 작성하십시오.
  • IAM 관리 화면에서 생성 된 사용자를 클릭하십시오.
  • 권한 추가를 클릭하십시오.
  • 기존 정책을 직접 첨부를 클릭하십시오.
  • 정책 만들기를 클릭하십시오.
  • json을 선택하고 아래에 붙여 넣습니다. json replace bucket_name을 버킷 이름으로 바꿉니다.
  • 이를 통해 특정 사용자는 해당 버킷의 객체 만보고, 넣고, 가져올 수 있습니다.

{

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

}

참고 URL : https://stackoverflow.com/questions/6615168/is-there-an-s3-policy-for-limiting-access-to-only-see-access-one-bucket

반응형