【S3】Curl로 파일을 업로드할 때 소유자나 버킷 정책 문제

9986 단어 S3AWS

처음에



어드벤트 캘린더 기사의 두 번째

최근 S3의 Object OwnerShip이 출시되었으므로 소유자 문제가 해결되었으므로,
사용하기 쉽고 이전에 업로드 한 객체의 대응에 대해 씁니다.

개요



외부에서 S3에 업로드한 데이터의 소유자는 업로드한 사람이었지만,
curl 등으로 업로드하면 게스트 사용자(?)가 되므로 기본적으로 객체를 공개하게 됩니다.
버킷 소유자는 객체 권한도 갖고 있지 않으므로 IAM 권한이 있어도 액세스 및 삭제 등을 할 수 없습니다.

이 기사는 S3의 Object OwnerShip에서 업로드한 항목의 소유자를 강제 변경하면,
Object OwnerShip을 설정하기 전에 업로드된 객체의 소유자를 변경하는 방법을 소개합니다.

S3의 Object OwnerShip 구성 절차



1. 버킷 만들기



콘솔에서 적절하게 생성
방법은 할애

2. 버킷 정책 설정


  • 특정 IP만 액세스 허용
  • PutObject에서 ACL을 bucket-owner-full-control로 설정한 요청 만 허용합니다.
  • 소유자는 버킷 소유자가 되기 때문에, Deny 정책 없이도 공개는 하지 않기 때문에 불필요합니다
  • 수요에 따라 설정해도 괜찮습니다


  • {
        "Version": "2012-10-17",
        "Id": "test_policy",
        "Statement": [
            {
                "Sid": "get",
                "Effect": "Allow",
                "Principal": "*",
                "Action": "s3:GetObject",
                "Resource": "arn:aws:s3:::{バケット名}/*",
                "Condition": {
                    "IpAddress": {
                        "aws:SourceIp": [
                            "1.1.1.1/32"
                        ]
                    }
                }
            },
            {
                "Sid": "put",
                "Effect": "Allow",
                "Principal": "*",
                "Action": [
                    "s3:PutObject",
                    "s3:PutObjectAcl"
                ],
                "Resource": "arn:aws:s3:::{バケット名}/*",
                "Condition": {
                    "StringEquals": {
                        "s3:x-amz-acl": "bucket-owner-full-control"
                    },
                    "IpAddress": {
                        "aws:SourceIp": [
                            "1.1.1.1/32"
                        ]
                    }
                }
            }
        ]
    }
    

    3. S3 Object Ownership 설정


  • S3 Object Ownership 옵션을 켭니다



  • Curl에서 객체를 업로드하는 방법


    $ curl -XPUT -H "x-amz-acl:bucket-owner-full-control" -T {ファイル名} https://{バケット名}.s3-ap-northeast-1.amazonaws.com/{ファイル名}
    

    검증


    # curl -XPUT -T test.txt https://${バケット名}.s3-ap-northeast-1.amazonaws.com/test.txt
    <?xml version="1.0" encoding="UTF-8"?>
    <Error><Code>AccessDenied</Code><Message>Access Denied</Message><RequestId>829150681872CD3C</RequestId><HostId>W1sEi85Oa03yMlm8SSwFKvSv2RY7B1FhnhEQhspvsBX0VCPND0esPhg7hunsUpJoWiIHuik5r+k=</HostId></Error>
    'bucket-owner-full-control' のヘッダーがないので、失敗
    
    # curl -XPUT -H "x-amz-acl:bucket-owner-full-control" -T test.txt https://${バケット名}.s3-ap-northeast-1.amazonaws.com/test.txt
    エラーが出ないので、成功
    

    소유자


  • bucket-owner-full-control가 붙지 않은 채 업로드 한 것
  • bucket-owner-full-control가 올린 업로드
  • 제대로 소유자를 변경했습니다




  • 개체의 소유자를 변경하는 방법



    1. 버킷의 모든 객체 가져오기


  • 필요한 경우 --prefix를 사용하여 특정 접두사를 지정할 수 있습니다
  • .
  • 건수가 많으면 한 번에 전체 건 표시 할 수없는 경우가 있으므로, NextToken를 취득해, --starting-token를 붙여 계속을 취득합시다

  • # aws s3api list-objects-v2 --bucket ${バケット名} --query Contents[*].[Key] --output text >> /tmp/key.txt
    

    2. 객체의 ACL 변경


  • 1에서 취한 목록을 기반으로 객체의 ACL을 변경합니다
  • # cat key.txt | xargs -I KEY aws s3api put-object-acl --bucket ${バケット名} --key KEY --acl bucket-owner-full-control --no-sign-request
    

    3. 객체의 소유자 변경


  • 1에서 가져온 목록을 기반으로 개체의 소유자를 변경합니다.
  • # cat key.txt |xargs -I KEY aws s3 cp s3://${バケット名}/KEY s3://${バケット名}/KEY --metadata-directive REPLACE
    

    마지막으로



    S3의 Object OwnerShip이 출시한 것에 오랜 세월에 어려움을 겪었습니다.
    감사합니다!

    이 기사도 모두의 고민을 해결할 수 있다면 기쁩니다.

    좋은 웹페이지 즐겨찾기