본문 바로가기

DevOps/AWS

[AHSS 1주차] AWS S3 보안 (2)

cloudNet@ 팀의 가시다 님이 진행하는 AWS 보안 스터디 1주차 정리입니다.

[ AWS 보안  ] 

S3는 어떻게  관리해야 할까요? 

 

✅  S3 접근 통제 방법

  • 객체 ACL ( 권장 x ) 
  • 버킷 ACL ( 권장 x )
  • 버킷 정책
  • IAM 정책 

 

이전 포스팅에서는 S3 버킷의 권한을 통제하는 4가지 방법중 먼저 시간에 잘 권장하지 않는 ACL 정책에 대해서 학습 및 정리 하였으며

  • 객체 ACL ( 권장 x ) 
  • 버킷 ACL ( 권장 x )

이번 포스팅에서는 S3 버킷 정책 과 관련된 여러가지 실습들을 해본다.

  • S3 서명된 URL 
  • HTTPS 만 허용 
  • 서버사이드 암호화 (KMS)

 


✅  S3 Pre-signed url & 버킷 생성

서명된 URL 

 

[자신의 PC] IAM 자격 증명 설정 되어 있는 상태 

  • 서명된 URL (만료된 날짜) 로 AWS 보안 자격증명이나 권한이 없어도 , 업로드 다운로드 가능 
# S3 버킷 생성
NICKNAME=<자신의닉네임>
NICKNAME=쿠
aws s3 mb s3://ahss-$NICKNAME-presign --region ap-northeast-2

# 확인
aws s3 ls
aws s3api get-public-access-block --bucket ahss-$NICKNAME-presign | jq

# 그림파일 다운로드
curl https://www.nasa.gov/sites/default/files/thumbnails/image/main_image_star-forming_region_carina_nircam_final-5mb.jpg -o jameswebb.jpg

# S3로 업로드
aws s3 cp jameswebb.jpg s3://ahss-$NICKNAME-presign

# 파일 확인
aws s3 ls s3://ahss-$NICKNAME-presign --human-readable
aws s3api list-objects --bucket ahss-$NICKNAME-presign | jq

 

[EC2] IAM 자격 증명 없는 상태 

#
NICKNAME=<자신의닉네임>
NICKNAME=쿠
aws s3 ls s3://ahss-$NICKNAME-presign --human-readable --no-sign-request

# 객체URL로 웹 접근 시도
lynx --dump https://ahss-$NICKNAME-presign.s3.ap-northeast-2.amazonaws.com/jameswebb.jpg

AccessDeniedAccess

 

[자신의 PC] IAM 자격증명 설정 되어 있는 상태

# 사전 서명된 URL 생성 : 600초(10분)
aws s3 presign s3://ahss-$NICKNAME-presign/jameswebb.jpg --expires-in 600
https://cass-s3bucket4-koo.s3.ap-northeast-2.amazonaws.com/jameswebb.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIA5ILF2FJIZTA7DFWL%2F20220820%2Fap-northeast-2%2Fs3%2Faws4_request&X-Amz-Date=20220820T014507Z&X-Amz-Expires=600&X-Amz-SignedHeaders=host&X-Amz-Signature=9237238b5c0a54210c116b4003f3aa89e984069a8f8fa116fea3f111d3c4a252

 

[EC2] IAM 자격 증명 없는 상태 

# 변수 지정
URL='<서명된 URL>'
URL='https://ahss-koo-presign.s3.ap-northeast-2.amazonaws.com/jameswebb.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAWZIY5UIEWT6XWCXL%2F20230829%2Fap-northeast-2%2Fs3%2Faws4_request&X-Amz-Date=20230829T064355Z&X-Amz-Expires=600&X-Amz-SignedHeaders=host&X-Amz-Signature=1e0f1dc00707adc9a03030e9ef90447c928310e71cac860d90591f35876915e0'
# 서명된 URL 접속 확인
curl -O $URL
ls -al *.jpg

 

서명된 URL 주소를 10분 이내에 아무 단말/PC의 웹 브라우저에서 접속 가능!


✅  Require HTTPS - 링크

HTTPS 권장
  • [ 내 PC ]  IAM 자격증명 설정 되어 있는 상태

# object's metadata 정보 확인 : ServerSideEncryption 확인 - default AES256 
aws s3api head-object help
aws s3api head-object --bucket ahss-$NICKNAME-presign --key jameswebb.jpg | jq

# object's metadata 정보 확인 : endpoint-url 옵션 설정
aws s3api head-object --bucket ahss-$NICKNAME-presign --key jameswebb.jpg --endpoint-url http://s3.ap-northeast-2.amazonaws.com
aws s3api head-object --bucket ahss-$NICKNAME-presign --key jameswebb.jpg --endpoint-url https://s3.ap-northeast-2.amazonaws.com
  • [AWS 콘솔] 버킷 정책 설정 - 아래 내용 입력
{
	"Id": "S3-Security-Deny-unless-HTTPS",
	"Version": "2012-10-17",
	"Statement": [{
		"Action": "s3:*",
		"Effect": "Deny",
		"Principal": "*",
		"Resource": "arn:aws:s3:::ahss-koo-presign/*",
		"Condition": {
			"Bool": {
				"aws:SecureTransport": false
			}
		}
	}]
}

  버킷정책을 HTTPS만 허용하도록 변경 하니  다음과 같이 권한이 변경되었음

mzc01-kook@MZC01-KOOK Downloads % aws s3api head-object --bucket ahss-$NICKNAME-presign --key jameswebb.jpg --endpoint-url http://s3.ap-northeast-2.amazonaws.com


An error occurred (403) when calling the HeadObject operation: Forbidden

✅  Require SSE-KMS

SSE - Server Side Encryption (서버사이드 암호화 )

✔️ 서버 측 암호화의 종류

  • S3 관리 키 (SSE-S3)
  • KMS 관리 키 (SSE-KMS)
  • 고객측에 제공된 키 (SSE-C)

 

✔️ 실습으로 알아보자.

  • [자신의 PC] IAM 자격증명 설정 되어 있는 상태
# 캑체 버킷에 업로드
# default bucket encryption to SSE-KMS(AES256) to encrypt your data at rest and enforce encryption with a bucket policy.

echo "123456789abcdefg" > textfile
aws s3api put-object --key text01 --body textfile --bucket ahss-$NICKNAME-presign


{
    "ETag": "\"3ca451faac980583cffaadf8b63e6820\"",
    "ServerSideEncryption": "AES256"
}

# 
aws s3api head-object --bucket ahss-$NICKNAME-presign --key text01 | jq



{
  "AcceptRanges": "bytes",
  "LastModified": "2023-08-29T08:27:35+00:00",
  "ContentLength": 17,
  "ETag": "\"3ca451faac980583cffaadf8b63e6820\"",
  "ContentType": "binary/octet-stream",
  "ServerSideEncryption": "AES256",
  "Metadata": {}
}
  • [AWS 콘솔] 버킷 속성 → 기본 암호화 (편집) : AWS KMS(SSE-KMS), AWS KMS키 중 선택(s3), 버킷 키(활성화)

  • 버킷 암호화 속성 변경 후 확인
# object's metadata 정보 확인 : ServerSideEncryption 확인 > AES256
aws s3api head-object --bucket ahss-$NICKNAME-presign --key jameswebb.jpg | jq

# 캑체 버킷에 업로드
# default bucket encryption to SSE-KMS(AES256) to encrypt your data at rest and enforce encryption with a bucket policy.
echo "abcdef" > textfile2

aws s3api put-object --key text02 --body textfile2 --bucket ahss-$NICKNAME-presign | jq

{
  "ETag": "\"5559a9d6011e50e33430453c4f076c00\"",
  "ServerSideEncryption": "aws:kms",
  "SSEKMSKeyId": "arn:aws:kms:ap-northeast-2:466593096201:key/5f86da6a-bf0d-4c54-9a4e-92e8f178e58f",
  "BucketKeyEnabled": true
}
  • ServerSideEncryption": "aws:kms"

정리의 시간

 

버킷 정책 은  S3 작업, 요청자, 리소스 및 요청의 여러 측면(예: IP 주소)를 비롯한 다양한 조건을 기반으로 버킷 및 객체에 대한 중앙 집중식 액세스 제어를 제공 

  • 정책은 액세스 정책 언어로 표현되며 중앙 집중식 권한 관리를 가능
  • 버킷에 연결되는 권한은 해당 버킷의 모든 객체에 적용
  • 개별 객체에 대해서만 권한을 추가(부여) 할 수 있는 액세스 제어 목록 (ACL )과 달리, 정책은 버킷 내 모든 객체 또는 객체의 하위 세트에 대해 권한을 추가 또는 거부 가능
  • 버킷에 포함된 임의 개수의 객체에 대한 권한 설정 
  • 버킷 소유자만 정책을 버킷에 연결
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "PublicReadGetObject",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::ahss-닉네임/*"
        }
    ]
}

✔️Resource : arn으로 리소스 특정

✔️Action : S3 버킷 작업 및 객체 작업 ( s3:GetObject )

✔️Effect : Allow or Deny

✔️조건 :  Condition

		"Condition": {
			"Bool": {
				**"aws:SecureTransport": false**
			}

 

'DevOps > AWS' 카테고리의 다른 글

[AHSS 2주차] AWS IAM 보안 (1)  (0) 2023.09.04
[AHSS 1주차] AWS S3 보안 (3)  (0) 2023.08.31
[AHSS 1주차] AWS S3 보안 (1)  (0) 2023.08.28
AWS Config  (0) 2023.06.06
[AWS] S3 사용방법  (0) 2022.06.22