Ssoon

S3 Security Exercises - Public ACL 차단 / S3 Public 액세스 차단 본문

AWS Hacking & Security Study

S3 Security Exercises - Public ACL 차단 / S3 Public 액세스 차단

구구달스 2023. 8. 30. 03:34
CloudNet@가시다님이 진행하는 "AWS Hacking & Security Study" 1기 스터디입니다.
# AWS Storage Immersion Day - S3 Security Best Practices 를 참조하였습니다.

Public ACL 차단 

 S3 > Buckets > sid-security-xxxx 

 Permission > Bucket policy > Edit  

 버킷 정책을 복사하여 버킷 정책 편집기에 붙여넣습니다.

  • BUCKET_NAME = sid-security-20230829
{
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": [
                "s3:PutObject",
                "s3:PutObjectAcl"
            ],
            "Resource": "arn:aws:s3:::BUCKET_NAME/*",
            "Condition": {
                "StringEquals": {
                    "s3:x-amz-acl": "private"
                }
            }
        }
    ]
}
  • "s3:PutObject":
    • S3 버킷에 새로운 객체(파일)를 업로드할 수 있는 액션을 나타냅니다.
    • 데이터를 버킷에 저장하는 작업을 허용합니다.
  • "s3:PutObjectAcl"
    • 객체의 액세스 제어 목록 (ACL)을 변경할 수 있는 액션을 나타냅니다.

  • "StringEquals"
    • 조건의 유형을 나타냅니다.
    • 문자열이 정확하게 일치하는지 확인하는 조건 유형을 사용하고 있습니다.
  • "s3:x-amz-acl"
    • 조건 키(key)
    • S3 객체의 액세스 제어 목록 (ACL)에 대한 조건을 나타냅니다.
  • "private"
    • 비교하려는 값(value)
    • S3 객체의 액세스 제어 목록 (ACL) 값이 "private"와 정확하게 일치해야 조건이 참으로 평가됩니다.

만약 객체의 액세스 제어 목록 (ACL) 값이 "private"와 정확하게 일치할 경우에만 해당 조건이 참으로 평가됩니다. 즉, 객체가 비공개로 설정된 경우에만 액세스를 허용합니다.

EC2 인스턴스 에서 다음 명령어를 실행합니다.

aws s3api put-object --key text01 --body textfile --profile user1 --bucket sid-security-20230829

 객체 ACL의 기본값은 비공개 "private" 이므로 요청이 성공합니다.

아래의 요청도 성공합니다. 왜 아직 액세스 권한이 있을까요?

  • 현재 버킷 정책은 비공개 ACL을 허용하지만 아무것도 거부하지 않습니다. 
  • 버킷에 대한 작업을 제한하려고 할 때 작업을 허용하지 않고 방지하는 정책을 작성하는 것이 중요합니다. 
  • 현재 버킷 정책에서는 보안 주체가 와일드카드이기 때문에 의도치 않게 버킷에 대한 퍼블릭 액세스도 허용합니다
aws s3api put-object --key text02 --body textfile --acl public-read --profile user1 --bucket sid-security-20230829
  • --acl public-read
    • 업로드된 객체에 대한 액세스 제어 목록(ACL)을 설정하는 부분
    • 객체를 업로드한 후, 해당 객체에 대한 읽기 액세스 권한을 "모든 사용자"에게 허용하겠다는 것을 나타냅니다.
    • 이렇게 설정된 객체는 누구나 해당 객체의 내용을 읽을 수 있게 됩니다.

 기존 정책을 다음 정책으로 바꿉니다.

{
    "Statement": [
        {
            "Effect": "Deny",
            "Principal": "*",
            "Action": [
                    "s3:PutObject",
                    "s3:PutObjectAcl"
                    ],
            "Resource": "arn:aws:s3:::BUCKET_NAME/*",
            "Condition": {
                "StringEquals": {
                    "s3:x-amz-acl": [
                           "public-read",
                           "public-read-write",
                           "authenticated-read"
                    ]
                }
            }
        }
    ]
}
  • ["public-read", "public-read-write", "authenticated-read"]
    • 비교하려는 값(value)
    • S3 객체의 액세스 제어 목록 (ACL) 값이 "public-read", "public-read-write", "authenticated-read" 중 하나와 정확하게 일치해야 조건이 참으로 평가됩니다.

 EC2 인스턴스 에서 다음 명령어를 실행합니다.

aws s3api put-object --key text04 --body textfile --profile user1 --bucket sid-security-20230829

 EC2 인스턴스 에서 다음 명령어를 실행합니다.

  • 버킷 정책이 공개 읽기 ACL을 제한하므로 요청이 실패합니다.
aws s3api put-object --key text02 --body textfile --acl public-read --profile user1 --bucket sid-security-20230829

 

S3 Public 액세스 차단

 S3 > Buckets > sid-security-xxxx 

 Permission > Bucket policy > Delete

 Permission > Bucket policy > Block public access (bucket settings) > Edit

 Block public access to buckets and objects granted through new access control lists (ACLs) 선택합니다.

  • Block Public Access to Buckets and Objects Granted Through New Access Control Lists (ACLs)
    • 새로운 액세스 제어 목록(ACL)을 사용하여 버킷 또는 객체에 공개 액세스를 설정하려고 할 때 차단됩니다.
    • 새로운 ACL을 통해 공개 액세스를 설정해도, 이 옵션이 액세스를 차단하여 실제로는 액세스 권한이 적용되지 않습니다.
    • 이미 공개 액세스가 설정된 기존의 액세스 제어 목록(ACL)에는 영향을 주지 않습니다. 이 옵션은 새로운 ACL에만 적용됩니다.

 EC2 인스턴스 에서 다음 명령어를 실행합니다.

aws s3api put-object --key text06 --body textfile --profile user1 --bucket sid-security-20230829

 객체 ACL의 기본값은 private 이므로 요청이 성공합니다.

 EC2 인스턴스 에서 다음 명령어를 실행합니다.

aws s3api put-object --key text07 --body textfile --acl public-read --profile user1 --bucket sid-security-20230829

 버킷 정책이 public-read ACL 을 제한하므로 요청이 실패합니다.

 Block public access to buckets and objects granted through new access control lists (ACLs) 해지합니다.

Comments