S3 암호화

GreenBean·2023년 1월 6일
0
post-thumbnail
post-custom-banner

S3 암호화

S3 객체 암호화 기능 종류 및 사용하기

  • S3 데이터를 암호화 하는 방식은 크게 두 가지가 존재
    • 데이터를 저장할 때 암호화 KEY 를 이용해 암호화 ∙ 복호화로 관리하거나, Amazon 의 암호화된 API 엔드포인트를 이용해 S3 에서 다른 서비스 또는 리소스로 전송되는 데이터를 암호화 할 수 있음

🔖 암호화 KEY 이용

  • 키를 이용해 S3 데이터를 암호화 할 때 어느 주체 기준으로 암호화하는지에 따라 서버 측과 클라이언트 측으로 나뉘게 됨
    • 이 둘은 각 상황과 특징에 따라 쓰임새가 달라 자신의 서비스 환경에 맞게 선택해야 함

💻 서버 측 암호화

AWS: 서버 측 암호화를 사용하여 데이터 보호

  • 서버 측 암호화는 데이터를 받는 애플리케이션 또는 서비스에 의해 데이터를 암호화하는 것
    • 서버 측 암호화는 S3 플랫폼 내에서 진행되며 디스크에 저장될 때 데이터 객체를 암호화하고 적절한 권한 증빙을 통해 데이터 인출을 요청할 때 복호화해 전송
  • 서버 측에서 S3 암호화를 하는 방법은 3가지 존재
    • SSE-S3
      • Amazon S3 관리형 키를 사용한 암호화
    • SSE-KMS
      • Amazon Key Management Service 에 저장된 KMS 키를 사용한 암호화
    • SSE-C
      • 사용자에 의해 직접 정의된 키들을 이용해 암호화

🗂 SSE-S3

  • Amazon S3 에서 관리하는 키를 사용하여 암호화하는 방법
    • S3 Managed Data Key 는 S3 에 의해 완전히 소유되고 관리됨
    • 각 객체는 고유한 키로 암호화됨
    • 또한 추가 보안 조치로 주기적으로 교체되는 루트 키를 사용하여 키 자체를 암호화
    • Amazon S3 서버 측 암호화는 가장 강력한 블록 암호 중 하나인 AES-256 ( 256 비트 Advanced Encryption Standard ) 를 사용하여 데이터를 암호화
  • 서버에서 암호화 하기 위해서는 헤더에 아래 내용을 보내야 함
    • "x-amz-server-side-encryption": "AES256"

  • 암호화 과정
    1. 암호화되지 않은 객체를 S3 로 업로드하여 SSE-S3 암호화 실행
    2. S3 로 객체를 전송할 때 HTTP / HTTPS 프로토콜로 헤더에 "x-amz-server-side-encryption":"AES256" 을 설정해 전송
    3. 그러면 Amazon S3 는 이 헤더를 통해 S3 Managed Data Key 로 전송받은 객체를 암호화 하고 저장

🗂 SSE-KMS (Key Manager Service)

AWS: SSE-KMS 와 함께 서버 측 암호화 사용

  • SSE-KMS 는 Amazon KMS Keys 를 사용한 서버 측 암호화로 SSE-S3 와 유사하지만 이 서비스 사용 시 몇 가지 추가적인 이점이 있고 비용이 발생
    • KMS 란 Amazon 키 관리를 중점으로 하는 하나의 서비스
    • SSE-S3 과의 달리 조금 더 사용자 단위의 컨트롤을 할 수 있음
      • Amazon S3 의 객체에 대한 무단 액세스에 대응하여 추가적인 보호를 제공하는 KMS 키를 사용하려면 별도의 권한이 필요
      • SSE-KMSKMS 키가 사용된 때와 사용 주체를 표시하는 감사 추적 기능을 제공
      • 또한 고객 관리형 키를 생성하고 관리하거나 사용자 ∙ 서비스 및 리전에 고유한 Amazon 관리형 CMK 를 사용할 수 있음
    • 객체는 SSE-S3 에서와 마찬가지로 서버에서 암호화 됨
  • 서버에서 암호화 하기 위해서는 헤더에 아래 내용을 보내야 함
    • "x-amz-server-side-encryption": "aws:kms"

  • 암호화 과정
    1. Amazon S3 는 전송받은 객체의 헤더를 확인하고 어떤 방식으로 암호화 할 지 설정
    2. SSE-KMS 방식이기 때문에 S3 에서 암호화 할 때 KMS 에서 미리 세팅해놓은 KMS Customer Master Key 를 사용하여 전송받은 객체를 암호화
    3. 암호화 한 객체를 S3 버킷에 저장

🗂 SSE-C

  • 사용자가 완전하게 키 관리하는 암호화 방식
    • Amazon S3 는 사용자가 제공한 암호화 키를 서버에 저장하지 않으며 사용한 키는 바로 폐기됨
    • S3 는 제공된 키를 가지고 암호화 시키는 역할만 수행
      • SSE-C 를 사용하면 사용자는 암호화 키를 관리하고 Amazon S3 는 암호화 (디스크에 쓸 때) 및 복호화 (객체에 액세스할 때) 를 관리
    • 따라서 데이터를 전송할 때는 반드시 HTTPS 프로토콜을 사용해야 함
      • 사용자가 키를 보내야 하기 때문에 암호화는 필수
      • 키는 HTTPS 헤더에 담아 전송

  • 암호화 과정
    1. 사용자는 HTTPS 프로토콜을 사용하여 암호화 키와 객체를 Amazon S3 로 전송
    2. S3 에서는 전송받은 키로 객체를 암호화하여 S3 버킷에 저장
    3. S3 로부터 파일을 받으려면 암호화를 할 때 사용되었던 것과 동일한 키를 S3 로 보내줘야 함
  • 사용자가 직접 HTTPS 를 사용해 데이터를 암호화하고 버킷에 업로드 하는 형식으로 S3 콘솔 메뉴를 지원을 하지 않음
    • 따라서 REST API 를 호출하여 객체를 생성할 때 사용자가 제공 암호화 키 ( SSE-C ) 를 사용하여 암호화
  • SSE-C 를 사용하는 경우 아래와 같은 헤더를 포함하여 직접 암호화 키 정보를 제공해야 함
    • x-amz-server-side​-encryption​-customer-algorithm
      • 헤더를 사용하여 암호화 알고리즘을 지정
      • 헤더 값은 "AES256"
    • x-amz-server-side​-encryption​-customer-key
      • 이 헤더를 사용하여 256 비트의 base64 인코딩 암호화 키를 Amazon S3 에 제공하여 데이터를 암호화 및 복호화
    • x-amz-server-side​-encryption​-customer-key-MD5
      • 이 헤더를 사용하여 RFC 1321 에 따라 암호화 키의 128 비트 base64 인코딩 MD5 다이제스트를 제공
      • Amazon S3 는 메시지 무결성 검사에 이 헤더를 사용하여 암호화 키가 오류 없이 전송 되었음을 확인

💻 클라이언트 측 암호화

  • 클라이언트 측 암호화 ( Client Side Encryption ) 는 로컬에서 데이터를 암호화하는 작업
    • SSE-C 와 차이점은 S3 서버가 암호화 과정에 전혀 관여하지 않는다는 점
    • 객체를 S3에 업로드 하기 전에 클라이언트에서 암호화
  • Amazon S3 Encryption Client 라는 라이브러리를 사용하여 암호화
    • 이 때문에 복호화 할 때도 클라이언트에서 암호화 키를 이용해 복호화 해야 함
    • 클라이언트가 암호화 키와 암호화 과정을 관리
    • 대부분은 간단하게 설정 할 수 있는 서버 측 암호화를 사용
    • 기업 및 기관에 따라 암호화 키를 직접 생성 및 관리하려는 경우 클라이언트 측 암호화 기능을 사용

  • 암호화 과정
    1. 클라이언트는 Amazon 에서 제공하는 암호화 SDK 를 사용하여 객체를 암호화
    2. 암호화가 클라이언트 측에서 일어나므로 객체는 로컬에서 완전히 암호화 됨
    3. 암호화 된 객체를 S3 버킷에 업로드

Tip! 추가 내용

💻 S3 전송 중 암호화

🗂 SSL / TLS

  • 통신 암호화 방식으로 SSLTLS 가 사용됨
  • HTTPS 를 이용하는 경우 전송 중 암호화를 하게 되는데 이 때 SSL / TLS 인증서를 이용
    • HTTPS 를 사용하면 Amazon S3 과 클라이언트 사이를 이동하는 데이터가 모두 암호화되어 전송되는데 이것을 Encryption In Transit 라고 부름
  • 클라이언트가 암호 키를 제공해야 하는 경우에는 HTTPS 프로토콜 사용이 필수
    • SSE-C

profile
🌱 Backend-Dev | hwaya2828@gmail.com
post-custom-banner

0개의 댓글