S3 Encryption

4 phút đọcSeries: NoteBook: AWS Certified Solutions Architect Associate SAA-C031 lượt xem

Tổng quan

Amazon S3 Object Encryption là cơ chế giúp bảo vệ dữ liệu lưu trữ trong S3 khỏi bị truy cập trái phép thông qua việc mã hóa, cả trong trạng thái at-rest (khi lưu trữ) lẫn in-transit (khi truyền tải).

Phương pháp mã hoá

Bạn có thể mã hóa các đối tượng trong các S3 bucket bằng 1 trong 4 phương pháp:

Server-Side Encryption – SSE
  • Mã hóa phía máy chủ với key do S3 quản lý (SSE-S3)
    🔹 Bật mặc định (Enabled by Default)
    🔹 Mã hóa đối tượng S3 bằng key được AWS tạo, quản lý và sở hữu
  • Mã hóa phía máy chủ với key KMS được lưu trữ trong AWS KMS (SSE-KMS)
    🔹 Tận dụng dịch vụ AWS Key Management Service (KMS) để quản lý key mã hóa
    🔹 Có thể kiểm soát truy cập chi tiết (fine-grained access) và audit qua CloudTrail
  • Mã hóa phía máy chủ với key do khách hàng cung cấp (SSE-C)
    🔹 Bạn tự cung cấp và quản lý key mã hóa
    🔹 AWS không lưu trữ key – bạn phải cung cấp key mỗi lần truy cập
Client-Side Encryption
  • Dữ liệu được mã hóa trước khi upload lên S3
    Bạn tự quản lý toàn bộ lifecycle của khóa (tạo, lưu trữ, cấp phát)
    Phù hợp với các tổ chức cần tuân thủ tiêu chuẩn bảo mật nghiêm ngặt hoặc zero-trust model

Amazon S3 Encryption – SSE-S3

  • Mã hóa sử dụng khóa được AWS xử lý, quản lý và sở hữu
  • Đối tượng được mã hóa ở phía server (server-side)
  • Loại mã hóa sử dụng là AES-256
    • Cần set header HTTP:
      "x-amz-server-side-encryption": "AES256"
  • Mặc định được bật (enabled by default) cho:
    • các S3 bucket mới
    • các object mới tải lên
  1. User thực hiện thao tác upload một object lên S3 thông qua giao thức HTTP(S), có thể kèm theo header tùy chọn.
  2. Amazon S3:
    Tiếp nhận object
    Sử dụng một khóa mã hóa do S3 quản lý (S3 Owned Key) để thực hiện mã hóa dữ liệu
  3. Sau khi mã hóa, object được lưu trữ an toàn trong S3 Bucket

Amazon S3 Encryption – SSE-KMS

  • Mã hóa sử dụng khóa được xử lý và quản lý bởi AWS KMS (Key Management Service)
  • Lợi ích của KMS: người dùng có thể kiểm soát + theo dõi việc sử dụng khóa thông qua CloudTrail
  • Object được mã hóa phía server (server-side encryption)
  • Bắt buộc phải set header:
"x-amz-server-side-encryption": "aws:kms"
  • Giới hạn của SSE-KMS
    • Nếu bạn sử dụng SSE-KMS, bạn có thể bị ảnh hưởng bởi các giới hạn của KMS
    • Khi upload, hệ thống sẽ gọi API GenerateDataKey của KMS
    • Khi download, hệ thống sẽ gọi API Decrypt của KMS
    • Các request này được tính vào quota KMS theo giây, ví dụ:
      5500, 10000, 30000 request/giây tùy theo region
    • Bạn có thể yêu cầu tăng quota thông qua Service Quotas Console

Amazon S3 Encryption – SSE-C

  • Mã hóa phía server sử dụng khóa do khách hàng tự quản lý hoàn toàn, nằm ngoài AWS
  • Amazon S3 KHÔNG lưu trữ khóa mã hóa do bạn cung cấp
  • Bắt buộc phải sử dụng HTTPS
  • Khóa mã hóa phải được đính kèm trong HTTP Header, với mỗi request

Amazon S3 Encryption – Client-Side Encryption

  • Sử dụng thư viện client, ví dụ: Amazon S3 Client-Side Encryption Library
  • Client bắt buộc phải mã hóa dữ liệu trước khi gửi lên Amazon S3
  • Client cũng phải tự giải mã dữ liệu khi lấy về từ Amazon S3
  • Khách hàng tự quản lý hoàn toàn vòng đời của khóa và chu trình mã hóa

Amazon S3 – Mã hóa trong quá trình truyền (SSL/TLS)

  • Mã hóa trong quá trình truyền còn được gọi là SSL/TLS
  • Amazon S3 cung cấp 2 endpoint:
    • HTTP Endpoint – không được mã hóa
    • HTTPS Endpoint – có mã hóa trong quá trình truyền
  • Khuyến nghị sử dụng HTTPS
  • HTTPS là bắt buộc đối với phương thức SSE-C
  • Hầu hết client mặc định đều sử dụng HTTPS endpoint

Amazon S3 – Force Encryption in Transit (aws:SecureTransport)

  • Nếu user cố gắng truy cập S3 thông qua HTTP (không mã hóa) → bị từ chối
  • Chỉ những kết nối thông qua HTTPS (mã hóa trong khi truyền) mới được chấp nhận
  • Điều này được thực thi thông qua Bucket Policy, sử dụng điều kiện aws:SecureTransport

Default Encryption và Bucket Policy

  • Mã hóa SSE-S3 được áp dụng tự động cho các đối tượng mới được lưu trữ trong S3 bucket.
  • Ngoài ra, bạn có thể ép buộc mã hóa thông qua bucket policy và từ chối bất kỳ API call nào tới PUT object nếu thiếu các header mã hóa (ví dụ SSE-KMS hoặc SSE-C).

Giải thích:

  • Nếu người dùng không truyền header x-amz-server-side-encryption: aws:kms, thì sẽ bị Deny.
  • Dùng để ép mọi PUT đều sử dụng SSE-KMS.

Giải thích:

  • Từ chối nếu thiếu header x-amz-server-side-encryption-customer-algorithm (tức là không dùng SSE-C).
  • Có thể dùng trong các tình huống bạn yêu cầu user phải mã hóa với client-side key (server-side encryption)
Bạn thấy bài này thế nào?