cloudNet@ 팀의 가시다 님이 진행하는 AWS 보안 스터디 1주차 정리입니다.
[ AWS 보안 ]
S3는 어떻게 관리해야 할까요?
✅ S3 접근 통제 방법
- 객체 ACL ( 권장 x )
- 버킷 ACL ( 권장 x )
- 버킷 정책
- IAM 정책
이번 포스팅에서는 IAM 정책을 통한 S3 권한 통제 방법에 대한 실습 및 정리에 대한 내용이다.
IAM 정책 실습
[자신의 PC] IAM 자격증명 설정 되어 있는 상태 : IAM User 생성 및 S3 권한 부여
✔️ s3 test용 user을 생성한다.
✔️ s3 Full access policy를 부여한다.
# s3user 사용자 생성
aws iam create-user --user-name s3user
# iam 사용자 리스트 확인
aws iam list-users | jq
# 사용자에게 프로그래밍 방식 액세스 권한 부여
aws iam create-access-key --user-name s3user
{
"AccessKey": {
"UserName": "s3user",
"AccessKeyId": "AKIAWZIY5UIERMSJMFMF",
"Status": "Active",
"SecretAccessKey": "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",
"CreateDate": "2023-08-31T02:03:27+00:00"
}
# s3user 사용자에 AWS관리형정책(AmazonS3FullAccess)을 추가
aws iam attach-user-policy --policy-arn arn:aws:iam::aws:policy/AmazonS3FullAccess --user-name s3user
[EC2] 자격증명 없는 상태 : s3user 사용자 자격증명 설정 후 확인
✔️ s3 자격증명을 EC2 aws cli에 설정한다.
# aws cli 명령 시도
aws s3 ls
aws ec2 describe-vpcs
# s3user 자격증명 profile
aws configure
AWS Access Key ID [None]: AKIA5ILF2FJIQAIEV7UB
AWS Secret Access Key [None]: 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
Default region name [None]: ap-northeast-2
Default output format [None]:
# 자격 증명 정보 저장되는 파일 확인
cat ~/.aws/credentials
# aws cli 명령 시도
aws s3 ls
aws ec2 describe-vpcs
# 퍼블릭 액세스 차단 비활성 설정
aws s3api put-public-access-block --bucket ahss-$NICKNAME-presign --public-access-block-configuration \
"BlockPublicAcls=false,IgnorePublicAcls=false,BlockPublicPolicy=false,RestrictPublicBuckets=false"
✔️ s3 조회 권한 확인
✔️ vpc 는 권한 없음
✔️ public 액세스 차단 비활성
퍼블릭 버킷 설정 후 IP 기반 통제
[AWS 콘솔] 버킷 정책 설정 - 편집 클릭 후 아래 내용 입력
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "PublicReadGetObject",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::ahss-koo-presign/*"
}
]
}
[EC2] 버킷 정책 확인 - Public Access 허용 되어있기 때문에 EC2에서 접근 가능
aws s3api get-bucket-policy --bucket ahss-$NICKNAME-presign | jq -r .Policy | jq
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "PublicReadGetObject",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::ahss-koo-presign/*"
}
]
}
# 파일 복사 실행
aws s3 cp s3://ahss-$NICKNAME-presign/jameswebb.jpg .
# [EC2] 미리 자신의 공인 IP 확인 메모해두기
curl ipinfo.io
curl ipinfo.io/ip ;echo
✔️ s3 객체 다운로드 성공
[AWS 콘솔] 버킷 정책 설정 편집 ← IP주소는 EC2의 공인 IP 입력
{
"Statement": [
{
"Effect": "Deny",
"Principal": "*",
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::ahss-koo-presign",
"arn:aws:s3:::ahss-koo-presign/*"
],
"Condition": {
"NotIpAddress": {
"aws:SourceIp": "13.124.226.47/32"
}
}
}
]
}
✔️ s3 버킷 정책 확인
aws s3api get-bucket-policy --bucket ahss-$NICKNAME-presign | jq -r .Policy | jq
{
"Version": "2008-10-17",
"Statement": [
{
"Effect": "Deny",
"Principal": "*",
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::ahss-koo-presign",
"arn:aws:s3:::ahss-koo-presign/*"
],
"Condition": {
"NotIpAddress": {
"aws:SourceIp": "13.124.226.47/32"
}
}
}
]
}
# [자신의 PC] 파일 생성
echo "memo1" > memo1.txt
# [자신의 PC] S3로 업로드
aws s3 cp memo1.txt s3://ahss-$NICKNAME-presign
# [자신의 PC] 버킷 조회
aws s3 ls s3://ahss-$NICKNAME-presign
aws s3api list-objects --bucket ahss-$NICKNAME-presign | jq
# [EC2] 파일 생성
echo "memo2" > memo2.txt
# [EC2] S3로 업로드
aws s3 cp memo2.txt s3://ahss-$NICKNAME-presign
# [EC2] 버킷 조회
aws s3 ls s3://ahss-$NICKNAME-presign
aws s3api list-objects --bucket ahss-$NICKNAME-presign | jq
✔️ s3 버킷정책에 ec2 공인 IP를 넣어서 허용
✔️ s3 버킷정책에 의하여 개인계정은 조회가 안됨
IAM 정책과 버킷 정책의 충돌 ?
✔️ s3 버킷정책 = 리소스 정책 = 요청을 받는 리소스에 연결되는 정책
✔️ IAM 정책 = identity-based Policy = 요청을 하는 주체에게 연결되는 정책
✅ 퀴즈
IAM정책은 Allow , 버킷 정책은 Deny 일때 어떤 정책을 따를까요?
정답: in -Account일때와 Cross-Account일때 다르다
- in - Account일때는 합집합 - 즉 허용 ( 둘중 하나만 허용이어도 허용 )
- Cross -Account일때는 교집합 - 즉 불허 ( 둘중 하나만 Deny어도 Deny )
Python boto3 (AWS SDK )
[EC2] 자격증명 있는 상태
# boto3 설치
sudo python3 -m pip install boto3
# 버킷 리스트 조회
cat <<EOT > bucket-all.py
import boto3
s3 = boto3.resource('s3')
for bucket in s3.buckets.all():
print(bucket.name)
EOT
python3 bucket-all.py
Python audit ( csv 파일로 떨구기 )
- 버킷명
- 어떤 암호화를 제공하는지
- bucket key, type등 출력
[EC2] 자격증명 있는 상태
#
git clone https://github.com/aws-samples/amazon-s3-default-encryption-audit
cd amazon-s3-default-encryption-audit/
tree
#
python3 amazon-s3-default-encryption-audit.py
...
Output Location: /home/ec2-user/
You can now access the report in the following location:
/home/ec2-user/bucketEncryptionReport_20230827-054611.csv
#
cat /home/ec2-user/bucketEncryptionReport_20230827-054611.csv
[ec2-user@My-EC2 amazon-s3-default-encryption-audit]$ cat bucketEncryptionReport_20230831-071416.csv
Bucket Name,Default Encryption Mode,SSE-KMS Key Type,Bucket Key
cf-templates-3vlsm80lvj2x-ap-southeast-2, AES256, N/A
eksworkshop-466593096201-ap-northeast-2, AES256, N/A
elasticbeanstalk-ap-northeast-2-466593096201, AES256, N/A
tas-koo, AES256, N/A
vra-cloudformation, AES256, N/A
ahss-koo-presign, arn:aws:kms:ap-northeast-2:466593096201:alias/aws/s3, AccessDenied, True
AWS Config
- 리소스 인벤토리 및 변경 추적
제일 편하게 사용하는 방법 ✅ 추천
[AWS 콘솔] Config
✔️ Config - 설정 - 편집 - 일반설정 ( QuickStart 1단계에서 설정하는 내용임)
✔️ Config - 설정 - 편집 - 일반설정 - 전송방법 ( S3 새로 만드는것이 편함 )
✔️ 규칙 > 규칙 추가 > s3-bucket-level-public-access-prohibited
✔️ 규칙 > 규칙 추가 > 관리형 규칙 > s3-bucket-level-public-access-prohibited 추가
✔️ s3- bucket 중에서 public access가 허용되어있는 bucket을 찾아줌
✔️ Checks if S3 buckets are publicly accessible.
정리의 시간
IAM 정책 은 IAM 을 사용하여 S3를 비롯한 모든 AWS 리소스에 대한 액세스를 관리할 수 있습니다.
s3 버킷정책과 같은 리소스에 연결되는 정책과는 달리, 요청을 하는 주체에게 연결되는 정책이기 때문에 identity-based Policy라고도
불리며 리소스 정책과 충돌이 일어날수 있습니다.
충돌될 경우, 1 Account 일경우와 Cross Account일 경우 다른 결과값이 나올수 있으며 AWS의 조이정님이 영상으로 소개한 부분을 참고하면 좋습니다.
✔️ s3 버킷정책 = 리소스 정책 = 요청을 받는 리소스에 연결되는 정책
✔️ IAM 정책 = identity-based Policy = 요청을 하는 주체에게 연결되는 정책
이외에도, AWS SDK 또는 AWS Config 등
리소스에 대한 정책을 관리하는 여러가지 방법들이 존재하며 프로그래밍적 요소와 자동화적 요소를 필수적으로 학습하여 AWS 리소스를 관리 할 필요가 있겠네요. ( 열심히 공부하자 )
'DevOps > AWS' 카테고리의 다른 글
[AHSS 2주차] AWS IAM 보안 (2) (0) | 2023.09.06 |
---|---|
[AHSS 2주차] AWS IAM 보안 (1) (0) | 2023.09.04 |
[AHSS 1주차] AWS S3 보안 (2) (0) | 2023.08.29 |
[AHSS 1주차] AWS S3 보안 (1) (0) | 2023.08.28 |
AWS Config (0) | 2023.06.06 |