본문 바로가기

DevOps/AWS

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

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