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 |