Security và Encryption trong Amazon S3
Bảo mật là yếu tố then chốt khi lưu trữ dữ liệu trên Amazon S3. AWS cung cấp nhiều lớp bảo vệ để kiểm soát quyền truy cập và bảo vệ dữ liệu khỏi các mối đe dọa bên ngoài cũng như lỗi con người.
Mô hình bảo mật của S3
Amazon S3 áp dụng mô hình deny by default - mặc định từ chối mọi truy cập, trừ khi bạn cấp quyền rõ ràng. Các quyền có thể được quản lý ở nhiều cấp độ:
- IAM Policy: Cấp quyền cho người dùng, nhóm hoặc role trong AWS IAM.
- Bucket Policy: Cấp quyền trực tiếp cho bucket (áp dụng cho tất cả object bên trong).
- ACL (Access Control List): Định nghĩa quyền truy cập cho Objects
Block Public Access
Để ngăn chặn rủi ro từ việc public dữ liệu không mong muốn, AWS cung cấp tính năng Block Public Access ở cả mức tài khoản và mức bucket:
- Chặn mọi quyền public từ ACL.
- Chặn mọi quyền public từ Bucket Policy.
- Ghi đè các quyền public đã tồn tại.
💡 Best Practice: Luôn bật Block Public Access, chỉ tắt khi thực sự cần public dữ liệu (ví dụ: static website hosting).
Bucket Policy trong S3
Bucket Policy là tập hợp các quy tắc (JSON) định nghĩa ai có thể làm gì với dữ liệu trong bucket. Trong đó:
- Resource: Bucket hoặc Objects
- Effect: Allow hoặc Deny
- Action: GetObject, Put, Delete…
- Principal: Account hay user được apply (”*” là tất cả user)
Ví dụ: Chỉ cho phép truy cập từ một IP cụ thể:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "IPAllow",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::my-bucket/*",
"Condition": {
"IpAddress": { "aws:SourceIp": "203.0.113.25/32" }
}
}
]
}Access Control List (ACL)
ACL cho phép cấp quyền cho từng AWS account hoặc cho Everyone (public). ACL hiện không còn được khuyến khích sử dụng, trừ khi bắt buộc (ví dụ: tương thích ứng dụng cũ).
Mã hóa dữ liệu (Encryption)
S3 hỗ trợ mã hóa dữ liệu at rest và in transit:
Mã hóa khi lưu trữ (At Rest)
- SSE-S3: AWS quản lý key, tự động mã hóa bằng AES-256.
- SSE-KMS: Mã hóa qua AWS Key Management Service, cho phép quản lý key và log truy cập.
- SSE-C: Khách hàng tự quản lý key, AWS không lưu trữ key.
- Client-side encryption: Dữ liệu được mã hóa trước khi gửi lên S3.
Mã hóa khi truyền (In Transit)
- Sử dụng HTTPS để đảm bảo dữ liệu an toàn khi truyền tải.
Pre-signed URL là gì?
Là URL riêng biệt có thể truy cập tạm thời vào một object cho người dùng không có IAM credential (Public User). Ví dụ: Cho phép tải file trong vòng 10 phút.
https://<bucket-name>.s3.<region>.amazonaws.com/<object-key>?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=<credential>&X-Amz-Date=<date>&X-Amz-Expires=<expiration>&X-Amz-SignedHeaders=host&X-Amz-Signature=<signature>