[1μ£Όμ°¨] S3 μ·¨μ½μ λ° λ³΄μ
π¨ ν΄λΉ ν¬μ€νΈλ 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 νμμΌλ‘ μ¬μ μ μλμ΄μλ ν νλ¦Ώμ μ¬μ©νμ¬ λΉλν μμ μ΄λ€.
μ°λ¦¬λ λ³λμ κ²½λ‘λ‘ μ€λΉλ ν νλ¦Ώμ μ¬μ©νμ¬ μ€νμ λΉλν κ²μ΄κΈ° λλ¬Έμ 'μ€λΉλ ν νλ¦Ώ'μ μ νν λ€μ, μμ첨λΆλ νμΌμ μ λ‘λνλ©΄ λλ€.
μ€νμ μ΄λ¦μ μμλ‘ μ§μ νλ©΄ λλ©°, νλΌλ―Έν° λμ ν€λ μ΄μ μ 미리 μμ±ν΄λ 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 λͺ λ Ήμ΄λ₯Ό ν΅ν΄ μ μμ μΌλ‘ λ²ν·μ νμΌμ΄ λ΄κ²Όλμ§ νμΈν μ μλ€.
λν, μ λ‘λλ νμΌμ μ½λλΈλμ κ°μ₯ νλ¨μ κΈ°μ¬λ list-object λͺ λ Ήμ΄λ₯Ό ν΅ν΄ μμΈν μΈλΆμ 보λ νμ ν μ μμΌλ μ°Έκ³ νμ.
μ΄λ κ² CLI νκ²½μ ν΅ν΄ νμΌμ μ λ‘λν λ΄μ©μ AWS μΉ μ½μ μμμλ μ€μκ°μΌλ‘ λ°μλκΈ° λλ¬Έμ AWS μΉ μ½μμ μ μν κ²½μ° μλμ κ°μ νλ©΄μ νμΈν μ μλ€.
4. AWS S3μ 보μ μ μ± μμ보기
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μ λ²ν· μ μ± μμλ μ΄μ μ μ¬νκ² μ¬μ μ μ μλ λ€μν 쑰건문μ κ±Έμ΄ νΉμ 쑰건μ λ§μ‘±ν κ²½μ°μλ§ κ°μ²΄/λ²ν·μ μ κ·Όν μ μλλ‘ μ€μ ν μ μλ€κ³ μκ°νμλ©΄ λ©λλ€.
λ²ν· μ μ± μμ μ μ©λλ μ¬νμ μλμ κ°μ΅λλ€.
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