cloudNet@ 팀의 가시다 님이 진행하는 AWS 보안 스터디 1주차 정리입니다.
[ AWS 보안 ]
S3는 어떻게 관리해야 할까요?
✅ S3 접근 통제 방법
S3 접근 통제 방법은 아래 4가지로 나뉩니다.
하지만, ACL 정책인 객체 ACL과 버킷 ACL은 권장하지 않는다고 하네요! 왜 그럴까요?
이부분을 생각해보면서 포스팅을 읽어주시면 도움이 됩니다.
- 객체 ACL ( 권장 x )
- 버킷 ACL ( 권장 x )
- 버킷 정책
- IAM 정책
왜 객체 ACL / 버킷 ACL은 권장하지 않을까요?
아래 2가지 문제를 풀어보면서 그 이유에 대해서 추론 해보도록 하겠습니다.
우선 객체 ACL과 버킷 ACL은 AWS콘솔의 화면에서 권한 부분에서 확인 할수 있습니다.
유심히 보아야 할 부분은 아래 세가지인데요
왜 권장하지 않을까요?
실습 및 학습을 하기전에 제 생각으로는 IAM과 연계 하여 RBAC 관리를 하는것이 아니라
ACL을 사용하게 되면 사용자에 맞는 권한을 부여하는 행위가 불가능 해서 그런것이지 않을까 추측 합니다.
실습 및 학습을 완료한 후에 다시 한번 정리 해보도록 하시죠.
자, 차례대로 실습을 진행해 보겠습니다.
세가지 체크부분을 통해 권한을 부여할수 있습니다.
- 퍼블릭 액세스 차단 - 기본적으로는 퍼블릭 액세스가 전체 차단되어 있습니다.
- 객체 소유권 - ACL 활성화를 하는 경우 멀티 계정에서도 접근이 가능합니다.
- ACL(액세스 제어 목록) - 나의 AWS 계정 < AWS 계정이 있는 모든 사용자 < AWS 계정이 없어도 됨 더 큰 범위의 모든 사용자
✅ 자격증명 없이 s3 검색이 되는것이 취약점
# 자격증명 없이
# 버킷 검색
aws s3 ls s3://flaws.cloud --no-sign-request
# 다운로드 secret
# 객체 다운로드 >> 다운로드가 되는 이유가 무엇인가?
aws s3 cp s3://flaws.cloud/secret-dd02c7c.html . --no-sign-request
# secret 확인
# 파일 내용 확인
file secret-dd02c7c.html
cat secret-dd02c7c.html ; echo
lynx secret-dd02c7c.html
# (옵션) 출력 결과의 링크 정보 확인 후 Level2 풀어 보자!
aws s3 ls s3://level2-c8b217a33fcf1f839f6f1f73a00a9ae7.flaws.cloud --no-sign-request
# Level 2
# s3 버킷 리스트 조회 실행 안됨
aws s3 ls s3://level2-c8b217a33fcf1f839f6f1f73a00a9ae7.flaws.cloud --no-sign-request
An error occurred (AccessDenied) when calling the ListObjectsV2 operation: Access Denied
✅ S3 권한 설정 실습
- [AWS UI 콘솔] AWS S3 버킷 생성 : 서울 리전
- AWS CLI로 생성시 아래 내용 참고
- default로 만들면 퍼블릭 차단 !
# S3 버킷 생성 (local 환경에서 실행 )
# aws s3 mb s3://버킷(유일한 이름) --region ap-northeast-2
NICKNAME=<자신의닉네임>
NICKNAME=koo
aws s3 mb s3://ahss-$NICKNAME --region ap-northeast-2
# S3 버킷 조회
aws s3 ls
aws s3api get-public-access-block --bucket ahss-$NICKNAME
{
"PublicAccessBlockConfiguration": {
"BlockPublicAcls": true,
"IgnorePublicAcls": true,
"BlockPublicPolicy": true,
"RestrictPublicBuckets": true
}
}
- 퍼블릭 액세스 차단 편집 : (Uncheck) 모든 퍼블릭 액세스 차단을 풀어줄것임
- 파일 생성 후 업로드 - s3 확인
# 파일 생성
echo "memo1" > memo1.txt
echo "memo2" > memo2.txt
echo "memo3" > memo3.txt
# S3로 업로드
aws s3 cp memo1.txt s3://ahss-$NICKNAME
aws s3 cp memo2.txt s3://ahss-$NICKNAME
aws s3 cp memo3.txt s3://ahss-$NICKNAME
# 파일 확인
aws s3 ls s3://ahss-$NICKNAME --recursive --human-readable --summarize
aws s3api list-objects --bucket ahss-$NICKNAME | jq
- EC2 에 ssh 접속 후 퍼블릭 액세스 차단 정책 유추
NICKNAME=koo
aws s3 ls s3://ahss-$NICKNAME --human-readable
aws s3 ls s3://ahss-$NICKNAME --human-readable --no-sign-request
❌ 왜 실패 할까?
[AWS 콘솔] 권한 → 객체 소유권 편집 : ‘ACL 활성화’ , ‘버킷 소유자 선호’
기본 : ACL 비활성화 되어있음
[AWS 콘솔] 권한 → ACL(액세스 제어 목록) 편집 : 모든사람(퍼블릭 액세스) - 객체 (Check 나열) → ‘변경 사항 저장’
- 확인 - List는 성공!!
NICKNAME=koo
aws s3 ls s3://ahss-$NICKNAME --human-readable
aws s3 ls s3://ahss-$NICKNAME --human-readable --no-sign-request
2023-08-28 05:18:54 6 Bytes memo1.txt
2023-08-28 05:18:55 6 Bytes memo2.txt
2023-08-28 05:18:56 6 Bytes memo3.txt
# List는 성공 했지만 파일 복사는 안될것이다.
# 파일 복사 실행 : 출력 결과의 원인을 유추해보자!
aws s3 cp s3://ahss-$NICKNAME/memo1.txt . --no-sign-request
❌ 왜 복사는 실패 할까?
[AWS 콘솔] 객체 별 권한 설정
- memo1.txt : 모든사람(퍼블릭 액세스) - 객체 (Check 읽기) → ‘변경 사항 저장’
- memo2.txt : 인증된 사용자 그룹(AWS 계정이 있는 모든 사용자) - 객체 (Check 읽기) → ‘변경 사항 저장’
- 확인 ( ec2에서 자격증명 없는 모든 퍼블릭 액세스 ) - 성공
# 파일 복사 실행 : 출력 결과의 원인을 유추해보자!
aws s3 cp s3://ahss-$NICKNAME/memo1.txt . --no-sign-request
# 파일 복사 실행 : 출력 결과의 원인을 유추해보자!
aws s3 cp s3://ahss-$NICKNAME/memo2.txt . --no-sign-request
# 파일 복사 실행 : 출력 결과의 원인을 유추해보자!
aws s3 cp s3://ahss-$NICKNAME/memo3.txt . --no-sign-request
- 내 로컬 환경 ( AWS credential 등록되어 있음) - 성공
# flaws.cloud Level2
aws s3 ls s3://level2-c8b217a33fcf1f839f6f1f73a00a9ae7.flaws.cloud --human-readable
aws s3 cp s3://level2-c8b217a33fcf1f839f6f1f73a00a9ae7.flaws.cloud/secret-e4443fc.html .
cat secret-e4443fc.html
결론 : ACL을 사용하게 되면, 사실상 인증된 전세계 AWS 모든 사용자에게 버킷을 허용하는것이나 마찬가지임
따라서 , 버킷정책 및 IAM 정책을 권장한다.
✅ 버킷 정책
ACL을 사용하게 되면, 사실상 인증된 전세계 AWS 모든 사용자에게 버킷을 허용하는것이나 마찬가지임
따라서 , 버킷정책 및 IAM 정책을 권장한다.
- 버킷 정책 - 리소스 정책
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "PublicReadGetObject",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::ahss-koo/*"
}
]
}
- 테스트 : 설정 후 aws cli 로 S3 버킷 정책 확인
aws s3api get-bucket-policy --bucket ahss-koo | jq -r .Policy | jq
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "PublicReadGetObject",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::ahss-koo/*"
}
]
}
✅ IAM Access Analyzer
# 액세스 분석기 생성
#aws accessanalyzer create-analyzer --analyzer-name firstanalyzer --type ACCOUNT --output text --query arn
ANA_ARN=$(aws accessanalyzer create-analyzer --analyzer-name firstanalyzer --type ACCOUNT --output text --query arn)
echo $ANA_ARN
# S3 버킷 스캔 수행
aws accessanalyzer start-resource-scan --analyzer-arn $ANA_ARN --resource-arn arn:aws:s3:::ahss-$NICKNAME
# S3 버킷 스캔 결과 확인
aws accessanalyzer get-analyzed-resource --analyzer-arn $ANA_ARN --resource-arn arn:aws:s3:::ahss-$NICKNAME | jq
{
"resource": {
"resourceArn": "arn:aws:s3:::ahss-koo",
"resourceType": "AWS::S3::Bucket",
"createdAt": "2023-08-28T08:54:50.135000+00:00",
"analyzedAt": "2023-08-28T08:55:42.175000+00:00",
"updatedAt": "2023-08-28T08:54:50.135000+00:00",
"isPublic": true,
"actions": [
"s3:GetObject",
"s3:ListBucket",
"s3:ListBucketMultipartUploads",
"s3:ListBucketVersions"
],
"sharedVia": [
"BUCKET_ACL",
"POLICY"
],
"status": "ACTIVE",
"resourceOwnerAccount": "466593096201"
}
}
✅ 콘솔에서 확인
- [AWS 콘솔] IAM - 액세스 보고서 - 액세스 분석기
✅ 버킷에 대한 퍼블릭 액세스 차단 설정
aws s3api put-public-access-block --bucket ahss-$NICKNAME --public-access-block-configuration \
"BlockPublicAcls=true,IgnorePublicAcls=true,BlockPublicPolicy=true,RestrictPublicBuckets=true"
✅ 실습 완료 후 액세스 분석기 삭제
aws accessanalyzer delete-analyzer --analyzer-name firstanalyzer
✅ 버킷도 실습 완료 후 모두 삭제
# 버킷에 객체 모두 삭제
aws s3 rm s3://ahss-$NICKNAME --recursive
# 실습에 사용한 S3 버킷 삭제
aws s3 rb s3://ahss-$NICKNAME
# 확인
aws s3 ls
'DevOps > AWS' 카테고리의 다른 글
[AHSS 1주차] AWS S3 보안 (3) (0) | 2023.08.31 |
---|---|
[AHSS 1주차] AWS S3 보안 (2) (0) | 2023.08.29 |
AWS Config (0) | 2023.06.06 |
[AWS] S3 사용방법 (0) | 2022.06.22 |
[AWS] 3.EC2 WAS에 Git Project Maven Build하기 (0) | 2021.05.10 |