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

Twoeyes·2023년 8월 31일
0

s3 보안강화

1. Presign URL!

만료 날짜를 설정하여, AWS 보안 자격 증명이나, 권한이 없어도 URL을 통해 객체 업로드/다운로드가 가능하다.

aws s3 cp jameswebb.jpg s3://ahss-twoeyes-presign
aws s3 presign s3://ahss-twoeyes-presign/jameswebb.jpg --expires-in 500

presign 을 통한 500초 간 URL 생성

s3://ahss-twoeyes-presign cli에서 받은 url로 jameswebb.jpg를 확인할 수 있다.
위는 download이고, upload도 사용 가능한데, PUT 메소드와 함께 사용해야 업로드가 가능하다. 추후에 알아보자.

2. Require HTTPS

HTTPS를 사용한 요청이 아니라면, 거부!!

aws s3api head-object --bucket ahss-$NICKNAME-presign --key jameswebb.jpg --endpoint-url http://s3.ap-northeast-2.amazonaws.com
aws s3api head-object --bucket ahss-$NICKNAME-presign --key jameswebb.jpg --endpoint-url https://s3.ap-northeast-2.amazonaws.com

--endpoint-url을 특정해준다고 해도 결과값이 달라지지 않으니 뭔 차이인지 아직 잘 모르겠다.
--endpoint-url에서 http를 https로 바꿔서 테스트 해볼 예정이다. ssl을 사용한 서비스 제공이다.

# s3 > 버킷 > 버킷 명 > 버킷 정책 편집

{
	"Id": "S3-Security-Deny-unless-HTTPS",
	"Version": "2012-10-17",
	"Statement": [{
		"Action": "s3:*",
		"Effect": "Deny",
		"Principal": "*",
		"Resource": "arn:aws:s3:::ahss-닉네임-presign/*",
		"Condition": {
			"Bool": {
				"aws:SecureTransport": false
			}
		}
	}]
}

버킷 정책에서 https만을 사용하게끔, SecureTransport가 false라면 Deny로 버킷 정책을 설정하였다.

http로는 403이 응답되었고, https로 하니 정상적으로 head-object를 확인할 수 있었다.

3. Require SSE-KMS Encryption

s3는 기본적으로 자체 암호화가 된다.(23년 4월부터)
하지만 그것은 s3 default 암호화이고, 암호화 방식을 바꿀 수 있다!

▼ 기본 암호화 방식


* s3api의 head-object는 무엇일까.

우리의 친구 chatGPT에게 물어보니 다음과 같은 답변을 주었다.

AWS S3 API의 head-object는 Amazon S3 버킷에서 객체의 메타데이터를 검색하는 데 사용되는 명령입니다. 이 명령을 사용하면 객체의 속성 및 상태 정보를 확인할 수 있습니다.

객체 크기: 객체의 크기(바이트)를 알려줍니다.
최종 수정 시간: 객체가 마지막으로 수정된 시간을 제공합니다.
ETag: 객체에 대한 엔터티 태그(ETag) 값을 제공합니다. 이 값은 일종의 체크섬으로, 동일한 내용의 객체인지 확인하는 데 사용될 수 있습니다.
메타데이터: 추가로 정의된 사용자 지정 메타데이터 키-값 쌍을 포함하여, 객체에 연결된 메타데이터를 제공할 수 있습니다.
head-object 명령은 실제로 객체 데이터 자체를 가져오지 않고, 메타데이터만 반환하기 때문에 데이터 전송 비용이 발생하지 않습니다. 이는 특정 객체가 존재하는지 확인하거나 해당 객체의 속성을 미리 파악할 때 유용합니다.

아직은 사용처를 잘 모르겠지만, 점차 알게 될거라 믿는다.

* s3api의 put-object는 무엇일까.

echo "123456789abcdefg" > textfile
aws s3api put-object --key text01 --body textfile --bucket ahss-$NICKNAME-presign

SSE-KMS를 테스트하는 부분에서 위와 같은 명령어를 사용하였다.
뜯어보자.

s3api의 put-object는 객체를 s3에 넣는 옵션이다.
--key는 put-object의 주 옵션으로 s3에 저장될 파일의 이름을 말한다.
--body도 put-object의 주 옵션으로 지정한 파일의 내용물을 지정한다.
그러니까, 이름이랑, 파일 내부 내용을 따로 지정할 수 있다.
이름이 text01일 뿐, 내용물은 textfile이라는 얘기이다.....

그럼 "aws s3 cp textfile s3://ahss-$NICKNAME-presign/text01"과 무슨 차이일까?

aws s3api put-object와 aws s3 cp 모두 Amazon S3 버킷에 파일을 업로드하는 데 사용되지만, 사용되는 컨텍스트와 기능적인 세부 사항에서 약간의 차이가 있습니다.
aws s3api put-object: 이 명령은 Amazon S3의 REST API를 직접 사용하여 객체를 업로드합니다. 이 명령은 더 많은 상세 옵션을 제공하며, 객체 메타데이터나 ACL, 서버 측 암호화 등과 같은 고급 기능을 설정할 수 있습니다.
aws s3 cp: 이 명령은 AWS CLI의 고수준(high-level) S3 명령 중 하나입니다. 이는 로컬 파일 시스템과 S3 간에 파일을 복사하는 데 편리하게 사용됩니다. cp명령어는 단순 복사 작업에 초점을 맞추어 사용자 친화적인 인터페이스를 제공합니다.
입력하신 두 명령어 모두 'textfile'이라는 로컬 파일을 'text01'이라는 이름으로 S3 버킷에 업로드하는 동일한 작업을 수행합니다. 하지만 첫 번째 경우(put-object)는 좀 더 저수준(low-level)의 API 호출이며, 상세 옵션 설정이 가능한 반면, 두 번째 경우(cp)는 고수준(high-level)의 추상화된 인터페이스를 통해 동일한 작업을 수행합니다.

명령어 자체의 기능은 같았지만, s3api를 사용함으로써 좀 더 상세한 추가 옵션이 가능하다는 차이가 있는 것 같다.

profile
아 배고파

0개의 댓글