Studies/AWS - AHSS (AWS λ³΄μ•ˆ)

[1μ£Όμ°¨] S3 취약점 및 λ³΄μ•ˆ

ReTeu 2023. 8. 30. 11:08
🚨 ν•΄λ‹Ή ν¬μŠ€νŠΈλŠ” CloudNet@의 μ„œμ’…ν˜Έ (Gasida) λ‹˜κ»˜μ„œ μ§„ν–‰ν•˜μ‹œλŠ” AHSS (AWS Hacking & Security Study) 1기의 κ°•μ˜ λ‚΄μš©μ„ λ°”νƒ•μœΌλ‘œ μž‘μ„±λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

 

첫 μ£Όμ°¨μ—λŠ” S3μ—μ„œ 일어날 수 μžˆλŠ” 취약점과 λ³΄μ•ˆ 사항에 λŒ€ν•΄ 닀룬닀.

λ¨Όμ €, S3λΌλŠ” μ„œλΉ„μŠ€μ— λŒ€ν•΄ λ‚―μ„€κ²Œ λŠκ»΄μ§€λŠ” μ‚¬λžŒλ„ μžˆμ„ ν„°μ΄λ‹ˆ 이에 λŒ€ν•΄ κ°„λž΅ν•˜κ²Œ 짚고 λ„˜μ–΄κ°€κ³ μž ν•œλ‹€.

AWSμ—μ„œλŠ” 블둝 μŠ€ν† λ¦¬μ§€, 파일 μŠ€ν† λ¦¬μ§€, 였브젝트 μŠ€ν† λ¦¬μ§€μ˜ μ„Έ 가지 μ’…λ₯˜λ‘œ μŠ€ν† λ¦¬μ§€ μ„œλΉ„μŠ€λ₯Ό μ œκ³΅ν•˜κ³  μžˆλŠ”λ°, 각각 EBS, EFS, S3에 λŒ€μ‘λœλ‹€. 

 

1. AWS S3λž€ 무엇인가?

AWS S3λŠ” Simple Storage Service의 λ‘λ¬Έμ–΄λ‘œμ„œ, AWSμ—μ„œ μ œκ³΅ν•˜λŠ” λ¬΄μ œν•œ 였브젝트 μŠ€ν† λ¦¬μ§€ κ°œλ…μœΌλ‘œ μ΄ν•΄ν•˜λ©΄ 쉽닀. 일반적으둜 λ§Žμ΄λ“€ μ‚¬μš©ν•˜λŠ” 블둝 μŠ€ν† λ¦¬μ§€μ˜ κ²½μš°μ—λŠ” 데이터λ₯Ό 블둝 λ‹¨μœ„λ‘œ κ΄€λ¦¬ν•˜κΈ° λ•Œλ¬Έμ—, λ°μ΄ν„°μ˜ 일뢀에 μˆ˜μ •μ‚¬ν•­μ— 생길 경우, 변경사항이 λ°œμƒν•œ 블둝에 λŒ€ν•΄μ„œλ§Œ μ—…λ°μ΄νŠΈ μž‘μ—…μ„ μˆ˜ν–‰ν•΄μ£Όλ©΄ λœλ‹€. ν•˜μ§€λ§Œ, S3의 경우 데이터λ₯Ό 였브젝트 λ‹¨μœ„λ‘œ κ΄€λ¦¬ν•˜κΈ° λ•Œλ¬Έμ— μ˜€λΈŒμ νŠΈμ—μ„œ μˆ˜μ •μ‚¬ν•­μ΄ λ°œμƒν•  경우, 였브젝트 전체λ₯Ό flushν•˜κ³  μƒˆλ‘œ μž‘μ„±ν•˜κ²Œ λœλ‹€. 파일의 크기가 큰 데 λ°˜ν•΄, μˆ˜μ •μ‚¬ν•­μ˜ ν¬κΈ°λŠ” μž‘μ„ 경우 λΉ„νš¨μœ¨μ μΌ 수 μžˆμ§€λ§Œ, 속도가 λΉ λ₯΄κ³  μŠ€ν† λ¦¬μ§€ μš©λŸ‰μ„ κ³ λ €ν•˜μ§€ μ•Šμ•„λ„ 되기 λ•Œλ¬Έμ— μž‘μ€ 크기λ₯Ό κ°€μ§€λ©΄μ„œ 변경이 μž¦μ€ 동적인 νŒŒμΌμ„ κ΄€λ§‡λ €λŠ” κ²½μš°μ—λŠ” S3λ₯Ό μ΄μš©ν•˜λŠ” 것이 μœ μš©ν•  수 μžˆκ² λ‹€. κ·Έλ¦Όκ³Ό ν•¨κ»˜ λ‹€μ‹œ 이해가 ν•„μš”ν•œ μ‚¬λžŒμ€ μ—¬κΈ°λ₯Ό 톡해 확인해보도둝 ν•˜μž. (κ·Έλ¦Ό μΆ”κ°€ μ˜ˆμ •)

 

 

 

2. AWS S3 μ„ΈνŒ…ν•΄λ³΄κΈ°

S3λ₯Ό μ‚¬μš©ν•˜κΈ° μœ„ν•΄ μš°μ„  AWS CLI ν™˜κ²½ ꡬ성과 ν‚€ νŽ˜μ–΄λ₯Ό λ°œκΈ‰ν•˜λ„λ‘ ν•˜μž. 특히 ν‚€ νŽ˜μ–΄λŠ” μž¬λ°œκΈ‰μ΄ λΆˆκ°€λŠ₯ν•˜λ―€λ‘œ λΆ„μ‹€ν•˜μ§€ μ•Šλ„λ‘ μ•ˆμ „ν•œ 곳에 잘 λ³΄κ΄€ν•˜λ„λ‘ ν•˜μž. 

yaml ν˜•μ‹μœΌλ‘œ 사전 μ •μ˜λ˜μ–΄μžˆλŠ” ν…œν”Œλ¦Ώμ„ μ‚¬μš©ν•˜μ—¬ λΉŒλ“œν•  μ˜ˆμ •μ΄λ‹€.

Storage.yaml
0.01MB
사진 μƒμ—μ„œλŠ” 링크λ₯Ό μ‚¬μš©ν•˜μ˜€μ§€λ§Œ, λ”°λΌν•˜μ‹œλŠ” 뢄듀은 μ²¨λΆ€νŒŒμΌμ„ μ—…λ‘œλ“œν•΄μ„œ μ‚¬μš©ν•˜μ‹œλ©΄ λ©λ‹ˆλ‹€.

 

μš°λ¦¬λŠ” λ³„λ„μ˜ 경둜둜 μ€€λΉ„λœ ν…œν”Œλ¦Ώμ„ μ‚¬μš©ν•˜μ—¬ μŠ€νƒμ„ λΉŒλ“œν•  것이기 λ•Œλ¬Έμ— 'μ€€λΉ„λœ ν…œν”Œλ¦Ώ'을 μ„ νƒν•œ λ‹€μŒ, μœ„μ—μ²¨λΆ€λœ νŒŒμΌμ„ μ—…λ‘œλ“œν•˜λ©΄ λœλ‹€.

 

μŠ€νƒμ˜ 이름은 μž„μ˜λ‘œ μ§€μ •ν•˜λ©΄ 되며, νŒŒλΌλ―Έν„° λž€μ˜ ν‚€λŠ” 이전에 미리 생성해둔 EC2 ν‚€νŽ˜μ–΄λ₯Ό μ‚¬μš©ν•˜λ©΄ λœλ‹€.

μ΄ν›„μ˜ μž‘μ—…μ€ EC2 μΈμŠ€ν„΄μŠ€μ—μ„œ μˆ˜ν–‰ν•  것인데, μš°λ¦¬λŠ” AWSμ—μ„œ μ œκ³΅ν•˜λŠ” μ›Ή μ‰˜(?)인 AWS CloudShell을 μ‚¬μš©ν•  것이닀. ν•΄λ‹Ή μ„œλΉ„μŠ€λ₯Ό μ΄μš©ν•˜λ©΄ SSHλ‚˜ VNC λ“±μ˜ ν”„λ‘œν† μ½œμ„ μ΄μš©ν•˜μ§€ μ•Šμ•„λ„ μ›Ή λΈŒλΌμš°μ € μƒμ—μ„œ λ°”λ‘œ μ½˜μ†”μ— μ ‘κ·Όν•  수 μžˆλ‹€.

 

ν΄λΌμš°λ“œ μ‰˜μ„ 톡해 S3 버킷 을 생성해 주도둝 ν•˜μž. 

# S3 버킷 생성
NICKNAME=<μžμ‹ μ˜ λ‹‰λ„€μž„>
aws s3 mb s3://ahss-NICKNAME --region ap-northeast-2

# μƒμ„±ν•œ S3 버킷 쑰회
aws s3 ls

버킷 생성에 μ‹€νŒ¨ν•œ 경우

아직 ν…œν”Œλ¦Ώμ„ λΉŒλ“œμ€‘μΈ 경우 버킷이 μƒμ„±λ˜μ§€ μ•ŠλŠ”λ‹€. μ΄λŸ¬ν•œ κ²½μš°μ—λŠ” 쑰금 더 기닀리고 λ‹€μ‹œ 진행해보도둝 ν•˜μž.

 

버킷 생성에 μ„±κ³΅ν•œ 경우

 

 

 

3. S3에 였브젝트 μΆ”κ°€ν•˜κΈ°

  S3 버킷을 μ„±κ³΅μ μœΌλ‘œ λ§Œλ“€μ—ˆμœΌλ‹ˆ 이제 버킷에 였브젝트λ₯Ό μΆ”κ°€ν•΄λ³΄μž. μ΄λ²ˆμ—λŠ” κ°„λ‹¨ν•œ ν…μŠ€νŠΈ 파일 3개λ₯Ό μ—…λ‘œλ“œν•΄λ³΄μž. μ•„λž˜μ˜ μ½”λ“œλ₯Ό λ”°λΌν•΄λ³΄μž.

# 파일 생성
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​

파일이 μ •μƒμ μœΌλ‘œ μƒμ„±λ˜κ³  μ—…λ‘œλ“œλ˜μ—ˆλ‹€λ©΄ μ•„λž˜μ˜ μΊ‘μ²˜μ™€ 같이 ls λͺ…λ Ήμ–΄λ₯Ό 톡해 μ •μƒμ μœΌλ‘œ 버킷에 파일이 λ‹΄κ²ΌλŠ”μ§€ 확인할 수 μžˆλ‹€.

aws s3 ls s3://ahss- $NICKNAME --recursive --human-readable --summarize

λ˜ν•œ, μ—…λ‘œλ“œλœ νŒŒμΌμ€ μ½”λ“œλΈ”λŸ­μ˜ κ°€μž₯ ν•˜λ‹¨μ— 기재된 list-object λͺ…λ Ήμ–΄λ₯Ό 톡해 μžμ„Έν•œ 세뢀정보도 νŒŒμ•…ν•  수 μžˆμœΌλ‹ˆ μ°Έκ³ ν•˜μž.

 

μ΄λ ‡κ²Œ CLI ν™˜κ²½μ„ 톡해 νŒŒμΌμ„ μ—…λ‘œλ“œν•œ λ‚΄μš©μ€ AWS μ›Ή μ½˜μ†” μƒμ—μ„œλ„ μ‹€μ‹œκ°„μœΌλ‘œ 반영되기 λ•Œλ¬Έμ— AWS μ›Ή μ½˜μ†”μ— 접속할 경우 μ•„λž˜μ™€ 같은 화면을 확인할 수 μžˆλ‹€. 

 

 

 

 

4. AWS S3의 λ³΄μ•ˆ μ •μ±… μ•Œμ•„λ³΄κΈ°

AWS S3μ—λŠ” 크게 4κ°€μ§€μ˜ λ³΄μ•ˆ 정책을 μ μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이번 μž₯μ—μ„œλŠ” 이에 λŒ€ν•΄ μ‚΄νŽ΄λ΄…λ‹ˆλ‹€.

AWS S3에 μ μš©ν•  수 μžˆλŠ” λ³΄μ•ˆ μ •μ±…μ˜ 4 μ’…λ₯˜

1. 객체/버킷 ACL (Access Control List)

  κ°€μž₯ λ¨Όμ € 객체 ACLμž…λ‹ˆλ‹€. 객체 ACL의 μ‚¬μš©μ€ AWS μΈ‘μ—μ„œλ„ κ³΅μ‹μ μœΌλ‘œ λΉ„κΆŒμž₯ν•˜κ³  μžˆλŠ”λ°, κ·Έ μ΄μœ λŠ” κ°μ²΄λ³„λ‘œ ACL을 관리할 경우 μ œλŒ€λ‘œ 관리가 이루어지지 μ•ŠλŠ” μΌ€μ΄μŠ€κ°€ 맀우 많기 λ•Œλ¬ΈμœΌλ‘œ, λ°˜λ“œμ‹œ 각 객체에 λŒ€ν•œ μ ‘κ·Ό κΆŒν•œμ„ κ°œλ³„μ μœΌλ‘œ μ œμ–΄ν•΄μ•Όλ§Œ ν•˜λŠ” κ²½μš°κ°€ μ•„λ‹ˆλΌλ©΄ 버킷 정책을 톡해 λ‹€λ₯Έ μ‚¬μš©μžμ˜ μ ‘κ·Ό κΆŒν•œμ„ κ΄€λ¦¬ν•˜λ„λ‘ 였브젝트λ₯Ό κ³΅μœ ν•˜λ„λ‘ ꢌμž₯ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. 객체 ACL의 μ„€μ • 변경은 'S3 > 버킷 > [버킷 λͺ…] > κΆŒν•œ (νƒ­) > 객체 μ†Œμœ κΆŒ (블둝) > νŽΈμ§‘' 을 톡해 μ ‘κ·Ό κ°€λŠ₯ν•©λ‹ˆλ‹€. S3 버킷을 처음 μƒμ„±ν•˜κ³  λ‚˜λ©΄ 기본적으둜 퍼블릭 μ ‘κ·Ό κΆŒν•œμ΄ λͺ¨λ‘ μ°¨λ‹¨λ˜μ–΄ μƒμ„±λ©λ‹ˆλ‹€.

ACL을 ν™œμ„±ν™”ν•˜λ©΄, μ•„λž˜μ™€ 같이 ACL κΆŒν•œμ„ νŽΈμ§‘ν•  수 μžˆλŠ” 화면에 μ ‘κ·Όν•  수 있게 λœλ‹€. 퍼블릭 μ•‘μ„ΈμŠ€μ—μ„œ 객체λ₯Ό 확인할 수 μžˆλ„λ‘ 섀정을 λ³€κ²½ν•΄λ³΄μž. 

μ—¬κΈ°κΉŒμ§€ 잘 따라왔닀면 μ½˜μ†”μ— μ•„λž˜μ˜ λͺ…λ Ήμ–΄λ₯Ό μž…λ ₯ν•΄μ„œ 퍼블릭 μ•‘μ„ΈμŠ€ κΆŒν•œμ—μ„œ 파일 λͺ©λ‘μΌ 잘 μ½μ–΄μ˜¬ 수 μžˆλŠ”μ§€ 확인해볼 수 μžˆλ‹€.

# 탐색 μ‹€ν–‰
aws s3 ls s3://ahss-$NICKNAME --human-readable --no-sign-request

# Memo1.txt νŒŒμΌμ„ 볡사
aws s3 cp s3://ahss-$NICKNAME/memo1.txt . --no-sign-request

  --no-sign-request μ˜΅μ…˜μ„ μ£Όμ—ˆκΈ° λ•Œλ¬Έμ— 버킷 μ†Œμœ μž κΆŒν•œ 없이 접근을 μ‹œλ„ν•˜κ³  μžˆλŠ”λ°, μš°λ¦¬λŠ” 방금 퍼블릭 μ•‘μ„ΈμŠ€μ—μ„œλ„ νŒŒμΌμ„ λ‚˜μ—΄ν•  수 μžˆλŠ” κΆŒν•œμ„ λΆ€μ—¬ν–ˆκΈ° λ•Œλ¬Έμ— ls λͺ…λ Ήμ–΄λ₯Ό μ‚¬μš©ν•  수 μžˆμ§€λ§Œ, νŒŒμΌμ„ λ³΅μ‚¬ν•˜λ €κ³  μ‹œλ„ν•˜λŠ” 경우 νŒŒμΌμ— λŒ€ν•œ 읽기 κΆŒν•œμ€ 뢀여받지 μ•Šμ•˜κΈ° λ•Œλ¬Έμ— permission denied (Forbidden) 라고 ν‘œμΆœλ˜λŠ” 것을 확인할 수 μžˆλ‹€.

 

 

 

2. 버킷 μ •μ±…

  λ‹€μŒμœΌλ‘œλŠ” 버킷 정책에 λŒ€ν•΄μ„œ μ‚΄νŽ΄λ΄…λ‹ˆλ‹€. 버킷 μ •μ±…μ—μ„œλŠ” μž‘μ—…μ˜ μ’…λ₯˜, μš”μ²­μž, μ ‘κ·Όν•˜λŠ” ν•­λͺ©μ˜ μ˜΅μ…˜ λ“± λ‹€μ–‘ν•œ 쑰건을 μ§€μ •ν•˜μ—¬ 객체/버킷에 λŒ€ν•œ 쀑앙 집쀑식 μ ‘κ·Ό μ œμ–΄ 방식을 μ œκ³΅ν•©λ‹ˆλ‹€. ν΄λΌμš°λ“œν”Œλ ˆμ–΄ DNSλ₯Ό μ‚¬μš©ν•˜κ³  계신 뢄듀이라면 μ•„λž˜μ˜ μ΄λ―Έμ§€μ²˜λŸΌ Cloudflare Dashboardμ—μ„œ Page RulesλΌλŠ” κΈ°λŠ₯을 톡해 νŠΉμ • URL둜 μ ‘κ·Όμ‹œμ— μ–΄λ– ν•œ λ³΄μ•ˆμ •μ±…μ„ μ μš©ν•  것인지 κ°œλ³„μ μœΌλ‘œ μ„€μ •ν•  수 μžˆλŠ” κΈ°λŠ₯을 μ œκ³΅ν•˜κ³  μžˆλŠ” 것을 μ•Œκ³  κ³„μ‹€κ²λ‹ˆλ‹€. AWS S3의 버킷 μ •μ±…μ—μ„œλ„ 이와 μœ μ‚¬ν•˜κ²Œ 사전에 μ •μ˜λœ λ‹€μ–‘ν•œ 쑰건문을 κ±Έμ–΄ νŠΉμ • 쑰건을 λ§Œμ‘±ν•  κ²½μš°μ—λ§Œ 객체/버킷에 μ ‘κ·Όν•  수 μžˆλ„λ‘ μ„€μ •ν•  수 μžˆλ‹€κ³  μƒκ°ν•˜μ‹œλ©΄ λ©λ‹ˆλ‹€. 

Cloudflare DNSμ—μ„œ μ œκ³΅ν•˜λŠ” Page Rules κΈ°λŠ₯

버킷 μ •μ±…μ—μ„œ μ μš©λ˜λŠ” 사항은 μ•„λž˜μ™€ κ°™μŠ΅λ‹ˆλ‹€.

1. 버킷 정책에 μ μš©λ˜λŠ” κΈ°λ³Έ 섀정은 λͺ¨λ“  ν•˜μœ„ μ˜€λΈŒμ νŠΈμ—λ„ λ™μΌν•˜κ²Œ 적용

2. ACLμ—μ„œλŠ” 단일 객체에 λŒ€ν•΄μ„œλ§Œ 정책을 μ μš©ν•  수 μžˆμ§€λ§Œ, 버킷 μ •μ±…μ—μ„œλŠ” 버킷 전체에 λŒ€ν•΄ 정책을 μ μš©ν•˜κ±°λ‚˜, νŠΉμ • μ˜€λΈŒμ νŠΈμ™€ κ·Έ ν•˜μœ„ μ˜€λΈŒμ νŠΈμ— λŒ€ν•΄ μž¬κ·€μ μœΌλ‘œ 정책을 μ μš©ν•  수 있음

 

이제 μ‹€μ œλ‘œ μ μš©ν•΄λ΄…μ‹œλ‹€. μ—¬κΈ°μ—μ„œλŠ” μ•„λž˜μ˜ JSON ν˜•μ‹μ˜ 예제 μ½”λ“œλ₯Ό λ³΅μ‚¬ν•˜μ—¬ μ‚¬μš©ν•©λ‹ˆλ‹€.

( [[NICKNAME]] μžλ¦¬μ—λŠ” μ‹€μ œ μΈμŠ€ν„΄μŠ€μ˜ 도메인을 μ μ–΄μ£Όμ„Έμš”.)

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "PublicReadGetObject",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::ahss-[[NICKNAME]]/*"
        }
    ]
}

 

  버킷 정책을 μ μš©ν–ˆλ‹€λ©΄, μ΄λ²ˆμ—λ„ ν΄λΌμš°λ“œ μ‰˜μ„ 톡해 μ •μƒμ μœΌλ‘œ μ μš©λ˜μ—ˆλŠ”μ§€ ν™•μΈν•΄λ΄…μ‹œλ‹€. μ•„λž˜μ˜ λͺ…λ Ήμ–΄λ₯Ό μž…λ ₯ν•˜λ©΄ ν˜„μž¬ μ μš©λ˜μ–΄μžˆλŠ” 버킷 정책을 μ½˜μ†”μ— 좜λ ₯ν•˜λ„λ‘ λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€.

aws s3api get-bucket-policy --bucket [[Name of Bucket]] | jq -r .Policy | jq

 

  ν•΄λ‹Ή 버킷 정책을 톡해 퍼블릭 μ•‘μ„ΈμŠ€ κΆŒν•œμœΌλ‘œλ„ νŠΉμ • μ˜€λΈŒμ νŠΈμ— μ ‘κ·Όν•˜μ—¬ GET μš”μ²­μ„ 보낼 수 μžˆλ„λ‘ ν—ˆμš©ν•˜μ˜€μœΌλ―€λ‘œ, μ—­μ‹œ 직접 ν…ŒμŠ€νŠΈν•΄λ³΄λ„λ‘ ν•©μ‹œλ‹€.

  퍼블릭 μ•‘μ„ΈμŠ€μ˜ κ²½μš°μ—λ„ μ •μƒμ μœΌλ‘œ νŒŒμΌμ„ λ‹€μš΄λ‘œλ“œν•˜λŠ” 것을 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

 

 

 

3. IAM (Identity and Access Management) μ •μ±…

  λ§ˆμ§€λ§‰μœΌλ‘œ IAM 정책에 λŒ€ν•΄ λ‹€λ€„λ΄…λ‹ˆλ‹€. IAM 정책을 S3 버킷에도 λ™μΌν•˜κ²Œ μ μš©ν•  수 μžˆλŠ”λ°, μ—¬κΈ°μ—μ„œλŠ” μ‹€μŠ΅μš©μœΌλ‘œ firstanalyzerλΌλŠ” μ΄λ¦„μ˜ μ•‘μ„ΈμŠ€ 뢄석기λ₯Ό λ§Œλ“€μ–΄ μ‚¬μš©ν•˜λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€. μ•‘μ„ΈμŠ€ λΆ„μ„κΈ°λŠ” AWS의 λ¦¬μ†Œμ— λŒ€ν•΄ κΌ­ ν•„μš”ν•œ μ΅œμ†Œν•œμ˜ κΆŒν•œλ§Œ λΆ€μ—¬ν•  수 μžˆλ„λ‘ λ„μ™€μ£ΌλŠ” 역할을 μˆ˜ν–‰ν•©λ‹ˆλ‹€. μ•‘μ„ΈμŠ€ 뢄석기에 λŒ€ν•œ μžμ„Έν•œ λ¬Έμ„œλŠ” μ—¬κΈ°μ—μ„œ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

  μ•‘μ„ΈμŠ€ λΆ„μ„κΈ°λŠ” μ›Ή μ½˜μ†”μ„ ν†΅ν•΄μ„œλ„ μƒμ„±ν•˜κ³  관리할 수 μžˆμ§€λ§Œ, μ—¬κΈ°μ—μ„œλŠ” ν΄λΌμš°λ“œ μ‰˜μ„ ν†΅ν•œ CLI ν™˜κ²½μ—μ„œ μ•‘μ„ΈμŠ€ 뢄석기λ₯Ό μƒμ„±ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€. μ•„λž˜μ™€ 같이 λͺ…λ Ήμ–΄λ₯Ό μž…λ ₯ν•˜λ©΄ μ•‘μ„ΈμŠ€ 뢄석기λ₯Ό 생성할 수 μžˆμŠ΅λ‹ˆλ‹€. 이 μž‘μ—…μ„ μˆ˜ν–‰ν•˜κΈ° μ „μ—λŠ” ν΄λΌμš°λ“œ μ‰˜μ˜ 리전과 λ™μΌν•œ μœ„μΉ˜μ— 뢄석기가 μƒμ„±λ˜λ―€λ‘œ, λͺ…λ Ήμ–΄λ₯Ό μž…λ ₯ν•˜κΈ° 이전에 본인이 μ•‘μ„ΈμŠ€ 뢄석기λ₯Ό μƒμ„±ν•˜κ³ μž ν•˜λŠ” λ¦¬μ „μœΌλ‘œ μ΄λ™ν•œ λ‹€μŒμ— μž‘μ—…μ„ μˆ˜ν–‰ν•΄μ£Όμ„Έμš”.

# μ•‘μ„ΈμŠ€ 뢄석기 생성
# 자격증λͺ… ν•„μš”
#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
==
arn:aws:access-analyzer:ap-northeast-2:276281595736:analyzer/firstanalyzer
==

AWS AMI Access Analyzerμ—μ„œλŠ” μžλ™ μŠ€μΊλ‹μ„ μ œκ³΅ν•©λ‹ˆλ‹€. λ‹€μŒ λͺ…λ Ήμ–΄λ₯Ό 톡해 μŠ€μΊ”μ„ μˆ˜ν–‰ν•˜κ³  κ·Έ κ²°κ³Όλ₯Ό μ½˜μ†”μ— 좜λ ₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

# 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

  μ €λŠ” 이전에 μˆ˜ν–‰ν•œ μ‹€μŠ΅ 이후 각각의 정책을 λͺ¨λ‘ λΉ„ν™œμ„±ν™”ν•˜κ±°λ‚˜ μ œκ±°ν•œ μƒνƒœμ΄κΈ°μ— μ €λ ‡κ²Œ ν‘œμ‹œλ˜λŠ” 것이며, 이전에 μ§„ν–‰ν•œ μ‹€μŠ΅ 사항을 κ·ΈλŒ€λ‘œ μœ μ§€ν•˜μ‹  뢄듀은 각자 ν˜„μž¬ 본인의 버킷에 적용된 정책이 λ°˜μ˜λ˜μ–΄ ν‘œμ‹œλ©λ‹ˆλ‹€.

  λ§Œμ•½μ— 퍼블릭 μ•‘μ„ΈμŠ€κ°€ κ°€λŠ₯ν•˜λ„λ‘ μ„€μ •λ˜μ–΄ μžˆλŠ” μƒν™©μ—μ„œ λ‹€μŒ λͺ…λ Ήμ–΄λ₯Ό μž…λ ₯ν•˜λ©΄ μ–΄λ–»κ²Œ λ˜λŠ”μ§€ ν™•μΈν•΄λ΄…μ‹œλ‹€.

aws s3api put-public-access-block --bucket ahss-$NICKNAME --public-access-block-configuration \
"BlockPublicAcls=true,IgnorePublicAcls=true,BlockPublicPolicy=true,RestrictPublicBuckets=true"

  μœ„μ˜ 캑처 μ΄λ―Έμ§€μ—μ„œ 확인할 수 μžˆλŠ” κ²ƒμ²˜λŸΌ 퍼블릭 μ•‘μ„ΈμŠ€κ°€ κ°€λŠ₯ν•˜λ„λ‘ κΆŒν•œ 섀정이 λ˜μ–΄ μžˆλŠ” μƒνƒœμ—μ„œ 퍼블릭 μ•‘μ„ΈμŠ€λ₯Ό λ§‰λŠ” 'public-access-block' λͺ…령을 μˆ˜ν–‰ν•œ κ²°κ³Ό 이와 κ΄€λ ¨λœ λͺ¨λ“  정책이 μˆ˜μ •λœ 것을 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

 

 

 

5. μ‹€μŠ΅μ— μ‚¬μš©ν•œ μΈμŠ€ν„΄μŠ€ μ œκ±°ν•˜κΈ°

  이제 λͺ¨λ“  μ‹€μŠ΅μ΄ λλ‚¬μŠ΅λ‹ˆλ‹€. λ‹€μŒ λͺ…λ Ήμ–΄λ₯Ό μž…λ ₯ν•˜μ—¬ μ§€κΈˆκΉŒμ§€ μ‹€μŠ΅μ— μ‚¬μš©ν•œ λͺ¨λ“  μΈμŠ€ν„΄μŠ€λ₯Ό μ’…λ£Œν•΄μ£Όμ‹œκ³  μ›Ή μ½˜μ†”μ„ 톡해 λ‹€μ‹œ ν•œ 번 ν™•μΈν•˜μ‹œκΈ° λ°”λžλ‹ˆλ‹€. μ—¬κΈ°κΉŒμ§€ λ”°λΌμ˜€μ‹œλŠλΌ κ³ μƒν•˜μ…¨μŠ΅λ‹ˆλ‹€.

# μ•‘μ„ΈμŠ€ 뢄석기 제거
aws accessanalyzer delete-analyzer  --analyzer-name firstanalyzer

# 버킷에 객체 λͺ¨λ‘ μ‚­μ œ
aws s3 rm s3://ahss-$NICKNAME --recursive
# μ‹€μŠ΅μ— μ‚¬μš©ν•œ S3 버킷 μ‚­μ œ
aws s3 rb s3://ahss-$NICKNAME
# 확인
aws s3 ls

 

'Studies > AWS - AHSS (AWS λ³΄μ•ˆ)' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[2μ£Όμ°¨] IAM 취약점 및 λ³΄μ•ˆ  (0) 2023.09.06