S3 là service đơn giản nhất trên AWS, và cũng là service gây ra nhiều vụ rò rỉ dữ liệu nhất. Accenture 2017: S3 bucket public chứa private keys và customer data. Hàng trăm công ty khác: bucket policy sai một dấu *, public access block chưa bật, encryption không enforced → toàn bộ dữ liệu user public.

S3 lưu trữ hơn 280 trillion objects, xử lý hàng triệu request mỗi giây. Độ bền 99.999999999% (11 số 9) — nghĩa là nếu bạn lưu 10 triệu objects, trung bình 10,000 năm mới mất 1 object.


  flowchart TB
    Bucket["S3 Bucket<br/>global unique name"]
    subgraph "Object Model"
        Key["Key: avatars/user123.jpg"]
        Value["Value: binary data + metadata"]
        Version["VersionId (khi versioning bật)"]
    end
    subgraph "Security Layers"
        BPA["Block Public Access<br/>4 settings · account + bucket"]
        Enc["Default Encryption<br/>SSE-S3 · SSE-KMS · DSSE-KMS"]
        Policy["Bucket Policy<br/>IAM language + Principal"]
        VPCE["VPC Endpoint<br/>keep traffic off internet"]
    end
    Bucket --> Key
    Bucket --> BPA
    Bucket --> Enc
    Bucket --> Policy
    Bucket --> VPCE

S3 không phải filesystem

S3 là object storage, không phải filesystem:

  • Flat namespace: / chỉ là ký tự trong key, không có directory tree thực sự
  • Immutable object: muốn “sửa” object → upload object mới (ghi đè toàn bộ)
  • Strong consistency (từ 12/2020): read-after-write cho PUT, read-after-delete cho DELETE
  • No partial updates: không thể append hoặc modify 1 phần của object

Encryption: 3 lựa chọn (sắp còn 3)

ModeKey ManagementCloudTrail Audit?Cost
SSE-S3AWS managed (AES-256)KhôngMiễn phí
SSE-KMSAWS KMS (Customer Managed Key) — mọi encrypt/decrypt đều có log$1/key/tháng + API calls
DSSE-KMSAWS KMS (dual-layer encryption)Như KMS + thêm cost
SSE-CBạn (client-provided key)Không

BucketKey (BucketKeyEnabled: true): Giảm KMS API calls từ 1 call/object xuống 1 call/bucket, tiết kiệm ~90% KMS cost cho bucket có nhiều object.

aws s3api put-bucket-encryption --bucket myapp-data --server-side-encryption-configuration '{
  "Rules": [{
    "ApplyServerSideEncryptionByDefault": {
      "SSEAlgorithm": "aws:kms",
      "KMSMasterKeyID": "arn:aws:kms:ap-southeast-1:123456789012:key/xxx"
    },
    "BucketKeyEnabled": true
  }]
}'

Enforce encryption + HTTPS bằng bucket policy

{
  "Sid": "DenyUnencryptedUploads",
  "Effect": "Deny",
  "Principal": "*",
  "Action": "s3:PutObject",
  "Resource": "arn:aws:s3:::myapp-data/*",
  "Condition": {
    "StringNotEquals": { "s3:x-amz-server-side-encryption": "aws:kms" }
  }
}

Block Public Access: 4 settings, 4 scope

BPA có 3 scope: Account → Bucket → Access Point. AWS lấy setting restrict nhất. Từ 04/2023, BPA mặc định ON cho bucket mới.

aws s3api put-public-access-block --bucket myapp-data --public-access-block-configuration \
  BlockPublicAcls=true,IgnorePublicAcls=true,BlockPublicPolicy=true,RestrictPublicBuckets=true

Nếu cần public distribution → CloudFront + OAC (Bài 15). Bucket giữ private, CloudFront là lớp public duy nhất.


Versioning + MFA Delete + Object Lock

aws s3api put-bucket-versioning --bucket myapp-data --versioning-configuration Status=Enabled,MFADelete=Enabled --mfa "arn:aws:iam::...:mfa/root-device 123456"

aws s3api put-object-lock-configuration --bucket myapp-data --object-lock-configuration '{
  "ObjectLockEnabled": "Enabled",
  "Rule": {"DefaultRetention": {"Mode": "GOVERNANCE", "Days": 365}}
}'

Versioning + MFA Delete = bảo hiểm chống ransomware và xóa nhầm. Object Lock = WORM (Write Once Read Many) cho compliance.


S3 là object storage, không phải filesystem — và Block Public Access mới là lớp bảo vệ đầu tiên, không phải encryption.

Bài sau: Phần 7: S3 nâng cao — lifecycle, replication, pre-signed URL, event