전공영역 공부 기록

게임으로 배우는 AWS S3(부제 S3 game)

악분 2023. 8. 27. 09:14
반응형

안녕하세요. 이 글은 S3 game을 소개와 풀이방법을 설명합니다.

 

S3 game이란?

S3 game은 AWS S3를 쉽게 학습할 수 있도록 만든 게임입니다. 총 11문제로 구성되어 있습니다. 문제 풀이에 막히시는 분을 위해 문제마다 힌트를 제공합니다.

 

다음 문제를 풀기 위해 현재 단계의 문제를 풀어야 합니다. 문제 답이 다음 문제 링크이기 때문입니다.

 

문제 목록

  • Level1 - Public access
  • Level2 - Get specific object by its ID
  • Level3 - Metadata
  • Level4 - Tags
  • Level5 - Versioning
  • Level6 - S3 Select
  • Level7 - Presigned URL
  • Level8 - CloudFront
  • Level9 - Referer
  • Level10 - Storage Classes
  • Level11 - Encryption

 

S3 game에서 공부하는 내용

  • awscli로 s3에 접근하는방법
    • aws s3 명령어
    • aws s3api 명령어
    • s3메타데이터 조회
  • s3 policy
  • s3 virtual host
  • pre-presigned(서명된) s3 url
  • s3를 cloudfront에 연동할 때, 올바른 s3접근 제한
  • http header referer를 이용한 s3접근 제한
  • 서버사이드 키로 암호화 된 s3버킷 파일 조회 방법

 

Level1 문제

Level1 문제는 S3버킷을 조회하는 문제입니다. 

 

S3 game링크로 접속하면, 아래 그림처럼 첫 번째 문제 접속 링크가 보입니다. 문제링크를 클릭하여 문제 페이지로 넘어가 1단계 문제를 풀어보세요.

 

 

정답을 보려면 아래 더보기를 클릭하세요!

더보기

문제 답

 

S3 버킷에 있는 treasure을 awscli로 조회하는 문제였습니다. aws s3 ls와 aws s3 cp명령어를 사용하여 파일을 조회합니다. aws 공식문서를 참조하시면 좋습니다.

 

① 버킷 조회

aws s3 ls명령어로 버킷을 조회합니다. 버킷이름은 문제에서 제공하는 url에 있습니다.

 

버킷을 조회하면 파일이 아래 그림과 같이 버킷에 있는 파일이 보입니다.

aws s3 ls s3://s3game-level1

 

② 파일 내용 보기

문제에서 제공하는 버킷 파일 중에 treasure1파일에 정답이 있습니다. 아쉽지만 aws s3명령어 중에 파일 내용을 읽는 명령어는 없습니다. 그러므로 파일을 다운로드한 뒤 파일을 읽어야 합니다.

 

파일 다운로드는 aws cp명령어로 합니다.

 aws s3 cp s3://s3game-level1/treasure1 ./treasure1

 

다운로드 받은 파일을 읽으면 다음 문제 링크가 보입니다.

 

Level2 문제

Level2 문제는 list권한은 없지만 get권한이 있는 S3버킷을 조회하는 문제입니다.

 

더보기

문제 답

 

list권한이 없어 s3 버킷 목록은 볼 수 없습니다. 하지만 get권한이 있어 파일 내용을 보는 것은 가능합니다. Level1문제 경험을 살려 파일이름을 추측하여 정답 파일을 읽습니다.

 

①  버킷을 조회하면 문제에서 말하는 것처럼 list권한이 없어 조회가 안됩니다.

 aws s3 ls s3game-level2.s3.us-east-2

 

② 문제에서 get권한이 있다고 말했으니 파일이름을 추측하여 접근합니다. Level1문제가 treasure1이었으니 Level2문제는 treasure2일 가능성이 높습니다.

 curl https://s3game-level2.s3.us-east-2.amazonaws.com/treasure2

 

 

Level3 문제

Level3 문제는 2단계 정답에서 얻은 액세스키, 시크릿키로 S3에 접근하는 문제입니다. 그리고 s3버킷 아이템의 헤더 메타데이터를 조회하여 숨겨진 코드를 찾아야 합니다.

 

정답을 보려면 아래 더보기를 클릭하세요!

더보기

문제 답

 

① aws프로파일을 설정한 후, 환경변수을 사용하여 프로파일을 선택합니다. 액세스키와 시크릿키는 2번째 문제 정답에 있습니다.

aws configure --profile tmp
export AWS_PROFILE=tmp

 

② 버킷을 조회하여 정답 파일을 찾습니다.  

 aws s3 ls s3://s3game-level3

 

③ 정답 파일을 다운로드하고 파일 내용을 읽습니다. 

 aws s3 cp s3://s3game-level3/treasure3_has_no_secret_code treasure3
 cat treasure3

 

파일을 읽으면 숨겨진 코드를 찾으라고 합니다.

 cat treasure3

 

④ 숨겨진 코드는 s3헤더 메타데이터에 있습니다. 메타데이터는 aws s3api로 조회할 수 있습니다. 

 aws s3api head-object --bucket s3game-level3 --key treasure3_has_no_secret_code

 

 

Level4 문제

Level4 문제와 유사한 문제입니다. 버킷 아이템 메타데이터를 찾아 숨겨진 코드를 찾는 문제입니다.

 

정답을 보려면 아래 더보기를 클릭하세요!

더보기

문제 답

 

 

① 버킷 목록을 조회합니다. treasure파일이 보이네요!

aws s3 ls  s3game-level4-k73045aztqln

 

 ② treasure파일을 다운로드 받습니다.

 aws s3 cp s3://s3game-level4-k73045aztqln/treasure4_also_has_no_secret_code treasure4

 

 ③ treasure파일 내용을 읽으면 메타데이터에 숨겨진 코드를 찾으라고 합니다. 

 

④ aws s3api를 사용해서 메타정보를 찾습니다. 3번 문제는 헤더에 메타데이터가 있었지만, 4번 문제는 tag에 메타데이터가 있습니다. 

 aws s3api get-object-tagging --bucket s3game-level4-k73045aztqln --key  treasure4_also_has_no_secret_code

 

 

Level 5 문제

Level5 문제는 s3버킷 아이템의 버전을 확인하는 문제입니다.

 

정답을 보려면 아래 더보기를 클릭하세요!

더보기

 문제 답

 

① 버킷을 조회합니다. treasure파일이 없습니다.

 aws s3 ls s3game-level5-8v95e5rv7z4i

 

 

② 버킷 버전 설정을 확인합니다. Enabled 응답은 버전 설정이 활성화 되었다는 의미입니다.

 aws s3api get-bucket-versioning --bucket s3game-level5-8v95e5rv7z4i

 

③ 버킷 아이템을 조회합니다. DeleteMarker가 선택된 treasure파일이 있습니다.

 aws s3api list-object-versions --bucket s3game-level5-8v95e5rv7z4i

 

④ treasure파일은 deletemarker가 되어 있어 조회할 수 없고 다운로드 받아야 합니다. ③번 과정에서 찾은 treasure파일 버전을 이용하여 파일을 다운로드 받습니다.

aws s3api get-object --bucket s3game-level5-8v95e5rv7z4i \
--key treasure5_is_deleted \
--version-id 344PQOyFqocF0TI66MbLynNNdQqHfBz3 \
treasure5

 

⑤ 파일 내용을 확인합니다. 

 

 

반응형

 

Level6 문제

Level6 문제는 s3 select쿼리를 사용하는 문제입니다.

 

정답을 보려면 아래 더보기를 클릭하세요!

더보기

문제 답

 

① 정답은 간단히 aws s3 ls, cp로 풀 수 있습니다. gz파일을 다운로드 받아 압축을 풀면 됩니다.

 aws s3 ls s3game-level6-vjv45x1gux81

 

② 하지만 문제에서는 필터링 사용을 요구합니다. 그래서 필터링 명령어로 풀어보겠습니다. 문제에서 제공하는 selectet쿼리와 select-object-content문서를 참고하여 s3api를 사용합니다.

 

③ 파일 내용을 확인합니다.

 

Level7 문제

Level7문제는 pre-signed url을 사용하여 s3 버킷에 접근하는 문제입니다.

 

정답을 보려면 아래 더보기를 클릭하세요!

더보기

문제 답

 

① 버킷을 조회합니다. 접근 권한이 없어 Access denied 에러가 발생합니다.

 aws s3 ls s3game-level7-zhovpo4j8588/treasure7

 

 ② 문제에서 힌트를 준 것처럼 버킷아이템의 pre-signed url을 만들어야 합니다. pre-signed url은 인증을 거치지 않도록 미리 서명합니다. 

 aws s3 presign s3game-level7-zhovpo4j8588/somethingstrange --expires-in 3600

 

③ pre-siguned url을 웹 브라우저에서 열면 파일이 다운로드 됩니다.

 

④ 파일 내용을 확인하면 다음 문제 링크가 있습니다.

 

 

Level8 문제

Level8문제는 s3를 cloudfront와 연결 했을 때 잘못된 보안 설정을 찾는 문제입니다. 문제에서 말한 것처럼 s3를 cloudfront에 연결하면, cloudfront만 s3에 접근이 가능해야 합니다. cloudfront이외에 외부 사람이 s3에 접근을 못하도록 s3 policy를 설정해야 합니다.

 

정답을 보려면 아래 더보기를 클릭하세요!

더보기

문제 답

 

 

8단계 문제는 s3 cloudfront가 cloudfront에 연결되었지만 s3에 접근이 가능합니다.

 

① 버킷을 조회합니다.

aws s3 ls s3game-level8-v6g8tp7ra2ld

 

② cloudfront주소로 treasure8_CDN내용을 확인합니다.

curl https://d2suiw06vujwz3.cloudfront.net/treasure8_CDN

 

 

Level9 문제

Level9 문제는 HTTP header를 이용하여 특정 url에만 s3를 접근하는 문제입니다.

 

정답을 보려면 아래 더보기를 클릭하세요!

더보기

문제 답

 

① 버킷 목록을 조회합니다. treasure9_referer파일을 url로 접근해야 합니다.

 aws s3 ls s3game-level9-781xtls2quvy/treasure9_referer

 

② treasure9_referer파일을 url로 접근해야 합니다. 파일에 접근하면 access_denied가 됩니다.

 curl https://s3game-level9-781xtls2quvy.s3.us-east-2.amazonaws.com/treasure9_referer

 

③ 문제에서 제공한 referer을 사용하여 treasure9_referer파일에 접근합니다.

curl --referer http://s3game.treasure \
	https://s3game-level9-781xtls2quvy.s3.us-east-2.amazonaws.com/treasure9_referer

 

 

Level10 문제

Level10문제는 s3 버킷 storageclass유형을 찾는 문제입니다.

 

정답을 보려면 아래 더보기를 클릭하세요!

더보기

문제 답

 

① s3api list-object를 사용하여 storageclass가 STANDARD_IA인 것을 찾습니다. 

aws s3api list-objects \
  --bucket s3game-level10-gac6tf83erp6 \
  --query 'Contents[?StorageClass == `STANDARD_IA`]'

 

② 찾은 파일을 다운로드하고 파일 내용을 확인합니다.

 aws s3 cp s3://s3game-level10-gac6tf83erp6/djq30a807iyq treasure10

 

 

Level11 문제

Level11문제는 s3 서버 사이스크립트 암호화로 된 버킷아이템을 조회하는 문제입니다.

 

정답을 보려면 아래 더보기를 클릭하세요!

더보기

문제 답

 

① 버킷 목록을 조회합니다.

aws s3 ls s3game-level11-djq30a807iyq

 

② 정답 파일을 다운로드 하면 오류가 발생합니다.

 aws s3 cp s3://s3game-level11-djq30a807iyq/treasure11_encryption treasure11_encryption

 

③ 문제에서 제공한 서버사이드스크립트 키를 사용하여 파일을 다운로드 받습니다.

 aws s3 cp s3://s3game-level11-djq30a807iyq/treasure11_encryption treasure11_encryption \
   --sse-c AES256 \
   --sse-c-key "UkXp2s5v8y/B?E(H+MbPeShVmYq3t6w9"
download: s3://s3game-level11-djq30a807iyq/treasure11_encryption to ./treasure11_encryption

 

마치며

s3 설정을 처음 공부하는 사람에게 매우 좋은 게임이었습니다. 

저는 s3 대표적인 특징(버전, 서버사이드 암호화, pre-signed url 등)을 배웠습니다. 그리고 aws s3api도 알게되었습니다. 

 

참고자료

이하공백

반응형