본문 바로가기

DevOps/AWS

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

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