본문 바로가기

Cloud

AWS - S3

Amazon S3

- 무제한 Scaling이 가능한 Storage

- 객체 형태를 저장/관리하는 시스템이자 서비스로, 파일이 버킷 또는 디렉토리에 있음

 

S3-Bucket

- 전역적으로 고유한 이름이며, Region 수준에서 관리되기에 같은 지역에 같은 이름의 버킷은 존재할 수 없음

 

Bucket Naming Convention

1) 대소문자 섞어서 사용 X

2) 3-63자 길이

3) IP주소는 들어가면 안됨

4) 소문자 or 숫자로 시작할 것

 

S3 Bucket은 파일을 객체로 가지며 키를 가집니다.  키는 파일의 전체 경로를 뜻하며 하나의 예를 들어 설명하자면

S3://my-bucket/my_file.txt

다음과 같은 경로를 가질때, key는 파일 이름인 my_file.txt가 됩니다.  단, 버킷 내 디렉토리로 묶여서 파일 경로가 관리되고 있다면

Key는 폴더 + 파일이름(Prefix + Object name) 이 됩니다.

버킷 내에는 Directory 개념이 없고 단지 Key 이름이 길게 존재한다고 생각하면 됩니다.

 

 


S3의 Object Values 최대치는 5TB이며 한 번에 업로드 할 수 있는 용량은 5GB까지라, 그 이상인 경우 5GB 미만으로 나눠서 여러 번 

업로드 될 것입니다.   그렇기 때문에 이를 Multi-Part Upload라고 명칭하는 것입니다.

 

 

Amazon S3의 각 객체는 키페어의 리스트인 메타데이터가 있고, 시스템이나 사용자 메타 데이터에서 사용됩니다.

태그는 유니코드 키로 객체나 수명 주기 정책 관련 보안이 없는 경우에 매우 유용한 키 값 페어와 태그를 가지게 됩니다.

S3 버전 ID를 통해 객체에 대한 버저닝이 가능하며 S3 자체는 Global Service라 Region에 속하지 않지만

Bucket은 가장 가까운 Region에 맞춰 생성해야 합니다. 

 

 

Amazon S3 Versioning

- 버저닝 할 때에는 반드시 버킷 레벨에서 활성화 되어야 합니다.

 

1) 같은 키로 파일 버전을 다시 업로드 할 경우 기존 파일을 덮어쓰게 되는데, 사실은 덮어 쓰는 것이 아니라 해당 파일의 새로운 버전을 생성하는 것이며, 버저닝을 통해 파일 형상 관리 또한 가능합니다.

2) 버킷에서 버저닝이 중단될 경우, 이전 버전을 삭제하는 것이 아니라 이후의 파일이 버전을 할당 받지 못하도록 함

(즉, 버저닝 시작 및 종료 시점으로부터 발생하는 객체에 대해 관리가 되는 것)

 

버전표시

 

다음처럼 같은 파일을 업로드해도 버전 표시를 ON 한다면, 버전 ID가 다르게 관리되며 업로드 된 것을 확인할 수 있습니다.

여기서 중요한 것은 버전ID 별로 관리되는 파일을 통해 형상 관리가 가능하며, 파일(객체)을 삭제한다고 했을 때에도

버저닝으로 관리된 것을 지우면 Version ID가 있는 파일(객체)을 지우는 것이기 때문에 영구적으로 지워지는 것이지만

그냥 삭제하는 것이면 Delete Marker가 붙어서 실제 지워지는 것은 아님

 

 

 


S3 Encryption for Objects

 

1) SSE-S3

- AWS가 처리 및 관리하는 키를 사용해서 S3 객체를 암호화하는 방법

2) SSE-KMS

- AWS 키 관리 서비스로 암호화 키를 관리하는 것

3) SSE-C

- 사용자가 만든 암호화 키를 관리할 때 쓰이는 방식

4) Client Side Encryption(SCE)

- 서버에서는 암호화 방식이 전혀 없고 클라이언트 측면에서 모든 암호화가 진행

 

 


 

 

1) SSE-S3

: Server Side Encryption으로 서버 측면에서 암호화가 진행됨

Amazon S3에서 처리 및 관리하는 Key를 암호화에 사용하는 방식이며 AES256 방법으로 사용함

객체를 업로드하고 SSE-S3로 암호화를 하려면 Header에 "x-amz-server-side-encryption" : "AES256"으로 정하면 됨

(x-amz : X-Amazon)

 

SSE-S3

 

다음처럼 Object를 Amazon S3(서버)에 업로드할 때 HTTP 또는 HTTPS 프로토콜을 통해 업로드하는데, 프로토콜 방식에 Header로

"x-amz-server-side-encryption" : "AES256" 이 내용을 추가합니다. 

그럴 경우 Object는 암호화가 진행되는데, S3에서 관리되는 데이터 키를 통해 암호화가 진행되고 이렇게 암호화된 객체는

S3-Bucket에 저장되어 관리됩니다. 

 

2) SSE-KMS

: 암호화 키는 KMS 서비스에서 처리 및 관리되며 S3에서 암호화하는 방식이 아니라, 누가 어떤 키에 접근할 수 있을지 제어가 가능합니다.

암호화 키는 S3에 존재하지만 KMS 서비스를 통해 객체 암호화가 진행되며 감사 추적이 가능하단 장점이 있습니다.

HTTP 또는 HTTPS 프로토콜을 통해 객체를 업로드 할 때 Header에는 "x-amz-server-side-encryption" : "aws:kms"로 지정합니다.   Header를 통해 S3에서 미리 정해둔 KMS 고객 마스터 키를 사용해서 암호화를 하며, 이는 S3-Bucket에 저장 및 관리됩니다.

 

 

SSE-KMS

 

 

객체를 HTTP/HTTPS 프로토콜로 서버에 업로드 하는 것은 동일하고 Header에 정의된 내용대로 KMS(S3에서 관리)에서 키를 찾아와 업로드된 객체와 암호화를 진행하며 결과물은 S3-Bucket에 저장됩니다.

 

 

 

3) SSE-C

: 서버 측 암호화 방식이며, AWS가 외부에서 고객이 관리하는 키를 사용하는 방식

Amazon S3는 고객이 제공한 암호화 키를 저장하지 않는다.  암호화 할 때에는 당연히 키가 필요하지만, 사용한 후에는 폐기합니다.

데이터를 AWS로 전송할 때에는 반드시 HTTPS 프로토콜을 사용해야 합니다. (HTTP X)

AWS로 암호를 전달할 때 전달 과정에서는 암호화가 되어 있어야 합니다.

 

암호화 키가 HTTPS의 Header에 의해 제공되어야 하는데, 모든 HTTPS 요청마다 매번 제공해줘야 함(사용 후 폐기되기 때문)

CSE-C

 

Amazon S3는 처음과 동일한 객체 및 Client가 제공한 데이터 키를 Header를 통해 받을 것이고, 이 역시 서버 측에서 암호화 방식으로 

사용되기에 (Object + Key) 암호화 진행 후 S3-Bucket에 저장됩니다.

만약에 SSE-C를 통해 Amazon S3로부터 파일을 다시 받으려면 사용된 것과 동일한 Client측 데이터 키를 제공해야만 한다.

사용 후 폐기되기 때문에 Amazon(서버) 측에서는 사용자가 어떤 데이터 키를 사용했는지 알 수 없고 결과적으로 같은 키를 다시 제공해서

파일을 다시 받거나 복호화가 진행되므로 사용자 측면에서 관리할 것이 많습니다.

 

 

4) Client Side Encryption

: Amazon S3에 객체를 업로드 하기 전에 Client 측면에서 객체를 암호화하는 방법으로 Amazon S3 Encryption Client와 같은 

Client Library를 사용해서 암호화를 진행합니다.

Client는 데이터를 S3로 보내기 전에 암호화를 해야 하는데, 서버에서는 암호화 방식이 없기 때문에 전적으로 사용자에게 

암/복호화 책임이 있습니다.   따라서 올바른 키가 준비되어야 합니다.

 

CSE에서는 키와 암호화 주기 전체를 Client에서 전부 관리합니다.

아래 그림처럼 Client-S3 Encryption SDK(Library)를 통해 객체와 Client 측면에서의 데이터 키를 제공 받습니다.

이를 통해 암호화를 진행하고 HTTP or HTTPS 프로토콜을 통해 Amazon S3, S3-Bucket에 객체를 전달합니다.

Client Side Encryption

 

 

이처럼 데이터를 전송할 때에는 암호화 방식을 필히 사용하는데, 데이터가 전송되는 동안 SSL, TLS 인증서를 통해서

통신 중 암호화를 진행하는 것입니다.

S3는 암호화되지 않은 상태의 HTTP 엔드 포인트를 노출하거나 암호화된 HTTPS 엔드 포인트를 노출하는데, 보통은 HTTPS 엔드 포인트를 사용하여 안전성을 강화시킵니다.

Client와 Amazon S3(서버) 사이의 데이터는 모두 암호화되며, 앞서 말한 것처럼 SSL, TLS 인증서를 통해 암호화됩니다.

 

 

반응형