클라우드 보안 스터디 1주차(08.27~09.02)

Twoeyes·2023년 8월 31일
0

1. s3 권한 설정 실습 & IAM Access Analyzer

# s3 버킷 생성 cli (S3 버킷의 이름은 전세계 유일해야한다.)
#aws s3 mb s3://버킷이름 --region ap-northeast-2

# 실습에서는 NICKNAME을 전역으로 설정하여 이용했다
NICKNAME=twoeyes
aws s3 mb s3://ahss-twoeyes --region ap-northeast-2

aws s3 ls
aws s3api get-public-access-block --bucket ahss-$NICKNAME

<cli 4가지 항목 설명>
"BlockPublicAcls": true, = 새 ACL(액세스 제어 목록)을 통해 부여된 버킷 및 객 체에 대한 퍼블릭 액세스 차단
"IgnorePublicAcls": true, = 임의의ACL(액세스 제어 목록)을 통해 부여된 버킷 및 객체에 대한 퍼블릭 액세스 차단
"BlockPublicPolicy": true, = 새 퍼블릭 버킷 또는 액세스 지점 정책을 통해 부여된 버킷 및 객체에 대한 퍼블릭 액세스 차단
"RestrictPublicBuckets": true = 임의의 퍼블릭 버킷 또는 액세스 지점 정책을 통해 부여된 버킷 및 객체에 대한 퍼블릭 및 교차 계정 액세스 차단

위 명령어를 쳤을 때, 4가지가 true로 나타난다. 위에서부터 순서대로 같은 의미를 갖고있다.
s3는 생성하면 기본적으로 모든 퍼블릭 액세스가 차단(true)된다. (23년 4월부터 Default로 차단된다고 한다.)

2. 버킷에 텍스트 파일 3개 객체 업로드

touch memo1.txt memo2.txt memo3.txt

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

3. 버킷 탐색

aws s3 ls s3://ahss-$NICKNAME --human-readable
aws s3 ls s3://ahss-$NICKNAME --human-readable --no-sign-request

  • no-sign-request 옵션을 넣었을 때, Access Denied가 되었다.

이유는 무엇일까? 아마 리스팅을 하기 위해 자격 증명이 필요했는데, - no-sign-request를 통해 자격 증명을 하지 않겠다는 옵션을 넣어서 Access가 Deny 된 것 같다.

▲ 버킷 및 객체가 퍼블릭이 아님

4. 권한 -> 객체 소유권 편집 : 'ACL활성화', '버킷 소유자 선호'


▲ s3 버킷 -> 권한 -> 객체 소유권 편집

위 이미지처럼 진행해야, ACL을 컨트롤 할 수 있다.


▲ 객체를 퍼블릭으로 설정할 수 있음

5. 권한 -> ACL 편집 : 모든 사람(퍼블릭) - 객체(나열 체크)

▲ warning 창이 나오는 권한을 주면 s3 액세스 카테고리가 '퍼블릭'으로 바뀐다.

6. 버킷 재탐색

aws s3 ls s3://ahss-$NICKNAME --human-readable --no-sign-request
aws s3 cp s3://ahss-$NICKNAME/memo1.txt . --no-sign-request

▲ ls는 성공, 그러나 cp는 실패

퍼블릭 액세스를 'ls'는 '나열'을 허용하여 가능했지만, 'cp'는 실패하였다.
객체의 권한이 모자라서 인 듯 하다.

7. 객체 별 권한 설정

객체 별 액세스 제어를 '모든 사람' 과 '인증된 사용자 그룹(AWS 계정을 사용하는 모든 사용자)' 에 모두 '읽기' 권한을 주었다.

  • 모든 사람 : 퍼블릭 망에 있는 모든 사람을 일컫는다. (누구나)
  • 인증된 사용자 그룹 : AWS 계정이 있는 모든 사람들을 말한다.(사실상 퍼블릭)

외부 공인 망으로 접속 테스트 해보았다.

▲ 설정 전 실패!

▲ 설정 후 성공!

8. 버킷에서 파일 꺼내기(인증 없이!)

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

성공 1개, 실패 2개
--no-sign-request 옵션을 넣었으므로, 자격 증명을 진행하지 않는다.

memo1.txt는 모든 사람에게 '읽기' 권한을 주었다.(O)
memo2.txt, memo3.txt는 대상이 모든 사람이 아니다.(X)

자격 증명을 스킵하지 않는다면 다운로드 가능하다.
바로 위 테스트는 root cloudshell에서 진행하였다.

  • root 계정은 소유자 계정으로 memo3.txt도 다운로드 가능하다.
  • memo2.txt는 aws 사용자라면 모두 다운로드 가능하다.

9. 버킷 정책

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "PublicReadGetObject",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::ahss-twoeyes/*"
        }
    ]
}
aws s3api get-bucket-policy --bucket ahss-$NICKNAME | jq -r .Policy |jq

jq를 통해 policy 정책만 뽑았고, jq로 json 형태로 보게 했다. 이제는 다 다운로드에 성공한다.


s3와 s3api는 무슨 차이인가?

s3 명령어 설명 : https://docs.aws.amazon.com/ko_kr/cli/latest/userguide/cli-services-s3-commands.html
s3api 명령어 설명 : https://docs.aws.amazon.com/ko_kr/cli/latest/userguide/cli-services-s3-apicommands.html
S3 CLI (aws s3): 파일 및 디렉토리를 지원하는 명령어입니다.

S3API CLI (aws s3api): 더 낮은 수준의 작업을 지원합니다.
AWS S3의 REST API 작업을 직접 호출할 수 있도록 해줍니다.
JSON 형식으로 직접 API 응답을 받습니다.
더 정교한 제어가 필요한 경우 사용됩니다. 특정 헤더, 매개변수 또는 옵션을 직접 지정할 수 있습니다.

사실 s3 cli는 기본적으로 리눅스를 다룰 때의 명령어와 동일하여 이해가 쉽지만, s3api는 이해가 모자라다.
json으로 좀 더 자세한 정보를 받아본다던가, 해당 정보로 조금 더 복잡한 명령을 처리한다는 특징이 있는 것 같다.

+ cli 옵션 모르는 것

1. aws s3 ls s3://ahss-$NICKNAME --recursive --human-readable --summarize
# 여기서 recursive와 --human-readable --summarize는 무엇일까?

'--recursive' = 순환, 재귀의 의미이다.
이 옵션은 버킷 내의 모든 하위 폴더 및 객체를 조회하도록 합니다.
즉, 해당 버킷의 모든 폴더와 파일을 재귀적으로 조회합니다.

'--human-readable' =
이 옵션은 파일 크기를 읽기 쉬운 형식으로 표시하도록 합니다.
기본적으로 파일 크기는 바이트 단위로 표시되지만, 이 옵션을 사용하면 크기를 보다 읽기 쉬운 형태로 나타냅니다. 예를 들어, KB, MB, GB 등으로 표시됩니다.

'--summarize' = 
이 옵션은 리스트된 파일과 폴더들의 요약 정보를 표시합니다.
목록의 맨 아래에 총 객체 수, 총 크기 등을 표시합니다.

2. aws s3api list-objects --bucket ahss-$NICKNAME | jq
# 여기서 list-objects 와 jq는 뭘 의미하나

'list-objects' = Amazon S3 버킷 내의 객체 목록을 조회하는 S3API 명령입니다.

'jq' = JSON 데이터를 파싱하고 쿼리하는 데 사용된다. JSON 형식의 데이터를 보기 쉽게 정리하거나 원하는 정보만 추출하는 데 유용합니다.
profile
아 배고파

0개의 댓글