Ssoon

S3 Security Exercises - HTTPS 필요 / SSE-S3 암호화 필요 본문

AWS Hacking & Security Study

S3 Security Exercises - HTTPS 필요 / SSE-S3 암호화 필요

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

HTTPS 필요

 HTTPS를 사용하기 위해 연결이 필요한 S3 버킷 정책을 생성합니다.

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

  • BUCKET_NAME = sid-security-20230829
{
"Statement": [
{
   "Action": "s3:*",
   "Effect": "Deny",
   "Principal": "*",
   "Resource": "arn:aws:s3:::BUCKET_NAME/*",
   "Condition": {
       "Bool": {
        "aws:SecureTransport": false
        }
    }
    }
  ]
}
  • "Action"
    • 허용되거나 거부되는 작업(액션)을 정의
    • "s3:*"로 지정되어 있으며, 모든 S3 작업을 나타냅니다.
  • "Effect"
    • "Action"에 대한 허용 또는 거부를 정의
    • "Deny"로 지정되어 있으므로 해당 작업이 거부됩니다.
  • "Principal"
    • 해당 정책에 적용되는 주체(사용자 또는 역할)
    • "*"로 지정되어 있어 모든 주체에게 적용됩니다. 따라서 모든 주체에 대한 액세스가 거부됩니다.
  • "Resource"
    • 액션을 적용할 리소스
    • "arn:aws:s3:::BUCKET_NAME/*"로 지정되어 있는데, 여기서 "BUCKET_NAME"을 실제 S3 버킷 이름으로 대체
    • 해당 버킷 내의 모든 리소스(파일 및 객체)에 대한 액세스가 거부됩니다.
  • "Condition"
    • 액션에 대한 추가적인 조건을 정의
    • "aws:SecureTransport" 조건이 사용되며, 이 조건은 액세스 시에 안전한 트랜스포트(HTTPS)를 사용하는지 여부를 확인합니다.
    • 조건 값이 "false"로 지정되어 있으므로, HTTPS를 사용하지 않는 액세스 요청에 대해 거부됩니다.

모든 주체에 대해 해당 S3 버킷의 모든 액세스 요청을 거부하되, HTTPS를 사용하지 않는 요청에 대해서만 적용됩니다.

endpoint-url이 HTTP이므로 명령에서 403 오류를 반환합니다.

  • aws s3api head-object
    • AWS Command Line Interface (CLI)를 사용하여 Amazon S3의 객체의 메타데이터를 조회합니다
  • --key Hello.txt
    • 조회하려는 객체의 이름입니다.
  • --endpoint-url http://s3.amazonaws.com
    • S3 서비스의 엔드포인트 URL을 지정하는 것을 의미합니다. 엔드포인트는 서비스에 연결되는 주소입니다.
  • --profile user1
    • AWS CLI 프로파일을 지정합니다. 프로파일은 여러 AWS 계정 또는 환경을 관리하기 위해 사용됩니다.
  • --bucket sid-security-20230829
    • 조회하려는 객체가 있는 버킷의 이름을 나타냅니다.

 endpoint-url이 버킷 정책에 필요한 HTTPS를 사용하기 때문에 명령을 실행합니다.

SSE-S3 암호화 필요

 저장 데이터 암호화를 요구하는 S3 버킷 정책을 생성합니다.

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

  • BUCKET_NAME = sid-security-20230829
{
    "Statement": [
        {
            "Effect": "Deny",
            "Principal": "*",
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::BUCKET_NAME/*",
            "Condition": {
                "StringNotEquals": {
                    "s3:x-amz-server-side-encryption": "AES256"
                }
            }
        }
    ]
}
  • "StringNotEquals"
    • 조건의 유형을 나타냅니다. 여기서는 문자열이 서로 같지 않은지를 확인하는 조건 유형을 사용하고 있습니다.
  • "s3:x-amz-server-side-encryption"
    • 조건 키(key)로 사용됩니다. 여기서는 S3 객체의 서버 측 암호화 여부를 확인하는데 사용됩니다.
서버 측 암호화(Server-Side Encryption)란?

Amazon S3에서 데이터를 저장할 때 데이터 자체를 암호화하여 보안을 강화하는 메커니즘
데이터가 S3에 업로드될 때, S3는 데이터를 암호화하여 저장하고, 데이터를 다운로드할 때는 자동으로 복호화하여 제공합니다.
  • 서버 측 암호화 옵션설명
SSE-S3 S3가 데이터를 암호화 및 복호화하며 관리합니다.
SSE-KMS AWS Key Management Service (KMS)를 사용하여 키로 데이터를 암호화하고 관리합니다.
SSE-C 사용자가 직접 제공한 키를 사용하여 데이터를 암호화하고 관리합니다.
  • "AES256"
    • 비교하려는 값(value)입니다. 여기서는 S3 객체가 AES256 암호화로 서버 측에 암호화되어야 한다는 조건을 나타냅니다.

 textfile 을 생성합니다.

개체를 버킷에 넣도록 다음 명령어를 실행합니다.

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

  • 개체가 버킷 정책에 필요한 SSE-S3 암호화를 사용하여 암호화되지 않았기 때문에 요청이 실패합니다.

 SSE-S3 암호화를 사용하여 SSH 세션에서 다음 명령을 실행합니다.

aws s3api put-object --key text01 --body textfile --server-side-encryption AES256 --profile user1 --bucket sid-security-20230829

 콘솔에서 해당 버킷에 업로드된 파일을 확인할 수 있습니다.

 

 
Comments