AWS Security: Encryption
#exam-tip
Tổng quan: Hướng dẫn toàn diện về mã hóa dành cho các workloads ML trên AWS, bao gồm mã hóa lúc nghỉ (encryption at rest), mã hóa trên đường truyền (encryption in transit), AWS KMS, và AWS Secrets Manager. Đây là kiến thức sống còn để bảo vệ dữ liệu training, model artifacts, và các thông tin xác thực trong SageMaker cũng như các dịch vụ AWS ML khác.
Mục lục
- AWS Security: Encryption
1. Encryption #important
1.1 Encryption 101 #exam-tip
Các Loại Mã hóa:
1. Mã hóa lúc Nghỉ (Encryption at Rest)
Là gì: Mã hóa dữ liệu đang nằm im trong ổ cứng (S3, EBS, cơ sở dữ liệu). Tại sao: Tránh việc bị ai đó thó mất ổ cứng vật lý hoặc truy cập trái phép. Mặc định của AWS: Hầu hết các dịch vụ đều cho phép bật mã hóa lúc nghỉ.
2. Mã hóa trên Đường truyền (Encryption in Transit)
Là gì: Mã hóa dữ liệu đang bay lượn trên mạng. Tại sao: Trống trò nghe lén (eavesdropping) hoặc tấn công đứng giữa (man-in-the-middle). Phương pháp: Xài TLS/SSL (chính là cái giao thức HTTPS).
Các Khái niệm Chính:
Mã hóa Đối xứng (Symmetric Encryption):
- Dùng CHUNG MỘT CHÌA KHÓA cho cả việc khóa (encrypt) lẫn mở khóa (decrypt).
- Siêu nhanh - Cực ngon để mã hóa dữ liệu khổng lồ.
- Ví dụ: Thuật toán AES-256.
- Dùng khi: Mã hóa các file trên S3, hay các ổ cứng EBS.
Mã hóa Bất đối xứng (Asymmetric Encryption):
- Có 2 chìa: Chìa công khai (Public key) để khóa + Chìa bí mật (Private key) để mở.
- Chậm rùa - Chỉ xài cho dữ liệu bé tí xíu, hoặc dùng để trao đổi khóa cho nhau.
- Ví dụ: Thuật toán RSA.
- Dùng khi: Bắt tay thiết lập mạng (TLS handshakes), hay ký chữ ký số.
Mã hóa Bao thư (Envelope Encryption): #exam-tip Cách KMS hoạt động:
- AWS KMS dùng một cái khóa chính (master key) (gọi là Customer Master Key - CMK).
- CMK sẽ được dùng để đem đi mã hóa một cái khóa dữ liệu (data key) (hay còn gọi là khóa bao thư - envelope key).
- Đem cái data key đó đi mã hóa dữ liệu thật của bạn.
- Cất cả 2 cục: dữ liệu đã bị mã hóa + data key đã bị mã hóa vào chung một chỗ.
- Muốn mở ra (decrypt): Gọi CMK ra để giải mã cái data key, rồi mới lấy cái data key đó đi giải mã dữ liệu thật.
Tại sao lại đẻ ra cái trò mã hóa bao thư rườm rà này:
- Khỏi phải bê nguyên cục dữ liệu khổng lồ đẩy lên KMS (cho đỡ nghẽn mạng).
- Dữ liệu thật sẽ được mã hóa cục bộ ngay tại máy bằng cái data key.
- Chỉ cần ném mỗi cái data key bé tí ti lên KMS để nhờ nó mã hóa hộ là xong.
1.2 Mã hóa trong SageMaker (SageMaker Encryption) #important #exam-tip
1. Mã hóa lúc Nghỉ
Cái gì cần Mã hóa:
| Tài nguyên | Phương thức Mã hóa | Các Lựa chọn Khóa (Keys) |
|---|---|---|
| S3 (Training Data) | Mã hóa Phía máy chủ S3 (S3 SSE) | SSE-S3 (Khóa AWS giữ), SSE-KMS (Khóa mình giữ), SSE-C (Khóa tự mang từ nhà lên) |
| Ổ cứng EBS (Lúc Training) | Mã hóa EBS | AWS giữ hoặc KMS khách hàng giữ |
| Model Artifacts (S3) | Mã hóa Phía máy chủ S3 (S3 SSE) | Bắt buộc xài SSE-KMS (đây là mặc định của SageMaker) |
| SageMaker Studio EFS | Mã hóa EFS | KMS khách hàng giữ |
| Endpoints (Ổ EBS) | Mã hóa EBS | KMS khách hàng giữ |
Cách Kích hoạt: #exam-tip
Training Job gài thêm KMS:
from sagemaker.estimator import Estimator
estimator = Estimator(
image_uri='my-algorithm',
role=role,
instance_type='ml.m5.xlarge',
# Mã hóa ổ cứng chạy training
volume_kms_key='arn:aws:kms:region:account:key/key-id',
# Mã hóa cục model artifacts lúc ném ra S3
output_kms_key='arn:aws:kms:region:account:key/key-id'
)
S3 Bucket xài chung với KMS:
import boto3
s3 = boto3.client('s3')
s3.put_object(
Bucket='my-training-data',
Key='data.csv',
Body=data,
ServerSideEncryption='aws:kms',
SSEKMSKeyId='arn:aws:kms:region:account:key/key-id'
)
2. Mã hóa trên Đường truyền #exam-tip
Cái gì cần Mã hóa:
| Giao tiếp | Phương thức Mã hóa |
|---|---|
| Gọi API đến SageMaker | Buộc xài TLS 1.2+ (HTTPS) |
| Truyền dữ liệu lên S3 | Đương nhiên TLS (qua cổng HTTPS) |
| Giao tiếp giữa các máy lúc train (Inter-node) | Bật TLS (khi chạy distributed training) |
| Gọi Endpoint (Invocations) | TLS (Chỉ hỗ trợ HTTPS) |
| SageMaker Studio | TLS |
Ép buộc xài TLS: #exam-tip
Viết S3 Bucket Policy (Bắt xài HTTPS):
{
"Effect": "Deny",
"Principal": "*",
"Action": "s3:*",
"Resource": "arn:aws:s3:::my-bucket/*",
"Condition": {
"Bool": {
"aws:SecureTransport": "false"
}
}
}
Mã hóa giao tiếp giữa các containers trong SageMaker:
estimator = Estimator(
# ... mớ tham số khác
enable_inter_container_traffic_encryption=True # Bật TLS cho distributed training
)
Kịch bản Bài thi: #exam-tip
| Kịch bản | Giải pháp |
|---|---|
| “Mã hóa training data trên S3” | Dùng SSE-KMS với khóa do khách hàng tự quản lý (customer-managed key) |
| “Mã hóa model artifacts” | Xài cái tham số output_kms_key của SageMaker |
| “Mã hóa giao tiếp lúc distributed training” | Đặt tham số enable_inter_container_traffic_encryption=True |
| “Yêu cầu phải dùng khóa do cty tự cấp quyền” | Dùng KMS với customer-managed CMK (đừng xài khóa AWS-managed) |
| “Chặn mấy đứa xài http thường vào đọc training data” | Đập S3 bucket policy ép phải có aws:SecureTransport=true |
| “Mã hóa ổ lưu trữ của cái notebook instance” | Xài SageMaker Studio nhúng KMS key cho ổ EFS |
1.3 AWS KMS (Key Management Service) #important #exam-tip
Mục đích: Đẻ và quản lý các chìa khóa mã hóa (encryption keys).
Các Khái niệm Chính:
Khóa Chính của Khách hàng (Customer Master Key - CMK)
Phân loại:
| Loại CMK | Ai Cầm Trịch | Đổi khóa (Rotation) | Phù hợp cho | Tiền |
|---|---|---|---|---|
| AWS Managed (AWS giữ) | AWS | Auto (mỗi năm 1 lần) | Dễ, chả phải làm gì | Free |
| Customer Managed (Khách tự giữ) | Mình tự lo | Làm bằng cơm hoặc auto (mỗi năm) | Muốn kiểm soát 100%, hoặc do luật compliance bắt ép | $1/tháng + phí xài |
| AWS Owned (Của nhà AWS trồng) | AWS (mình không nhìn thấy) | AWS tự xử | S3, DynamoDB hay lấy xài (mặc định) | Free |
Policies của Khóa (Key Policies): #exam-tip
- Kiểm soát thằng nào được xài chìa khóa này (giống hệt IAM policies nhưng xài cho keys).
- Cấp quyền (Grant permissions) cho việc mã hóa, giải mã, hoặc đẻ ra khóa dữ liệu (generate data keys).
- Xuyên biên giới (Cross-account access) - Cấp chìa cho một tài khoản AWS khác sang nhà mình mở cửa.
Các Thao tác Thường gặp:
import boto3
kms = boto3.client('kms')
# Đẻ một cái khóa do mình tự quản lý (customer-managed key)
response = kms.create_key(
Description='Chìa khóa mã hóa training data cho SageMaker',
KeyUsage='ENCRYPT_DECRYPT'
)
key_id = response['KeyMetadata']['KeyId']
# Đem đi mã hóa (chỉ mã hóa được file xíu xiu <4KB thôi nhé)
ciphertext = kms.encrypt(
KeyId=key_id,
Plaintext=b'dữ liệu cực kỳ nhạy cảm'
)
# Giải mã nè
plaintext = kms.decrypt(
CiphertextBlob=ciphertext['CiphertextBlob']
)
# Đẻ ra data key (để phục vụ trò mã hóa bao thư - envelope encryption)
data_key = kms.generate_data_key(
KeyId=key_id,
KeySpec='AES_256'
)
# Kết quả trả về gồm: Cái data key trần trụi (Plaintext) + Cái data key đã bị khóa (Encrypted)
Xoay vòng Khóa (Key Rotation): #exam-tip
- Auto quay xe (Automatic rotation) - KMS tự động đẻ ra vật liệu khóa mới mỗi năm.
- Vẫn giữ đồ cổ (Old versions kept) - Mấy cái khóa cũ vẫn được giữ lại để lỡ cần giải mã mấy dữ liệu mã hóa từ đời tống.
- Êm ru (Transparent) - Chả cần sửa code gì ráo.
- Thực tiễn tốt nhất - Nên bật chế độ auto cho tất cả các khóa customer-managed.
Kịch bản Bài thi: #exam-tip
| Kịch bản | Giải pháp |
|---|---|
| “Luật bắt công ty phải tự cầm khóa” | Chọn Customer-managed CMK |
| “Yêu cầu tự động xoay khóa” | Bật auto-rotation cho cái customer-managed CMK |
| “Đem mã hóa mấy file S3 tổ chảng” | Phải xài Envelope encryption (đẻ ra khóa con generate_data_key) |
| “Chia khóa cho tài khoản AWS khác vào xài ké” | Viết KMS key policy cấp quyền cross-account |
| “Kiểm toán xem thằng nào lén xài khóa” | Lôi CloudTrail logs ra coi |
| “Mã hóa cái ổ cứng lúc train SageMaker” | Khai báo tham số volume_kms_key vào lúc gọi training job |
1.4 AWS Secrets Manager #exam-tip
Mục đích: Cất giấu, tự động đổi pass, và quản lý các bí mật (passwords, API keys, thông tin đăng nhập DB).
Các Tính năng Sát thủ:
- Auto đổi pass (Automatic rotation) - Có thể xài Lambda functions để tự động mò vào DB đổi password.
- Mã hóa (Encryption) - Nằm trong kho là được KMS bảo kê mã hóa.
- Lập phiên bản (Versioning) - Theo dõi từng đời mật khẩu cũ mới.
- Kiểm soát siêu mịn (Fine-grained access) - Đưa IAM policies vào gác cổng.
- Tích hợp ngon lành - Hỗ trợ tận răng việc auto đổi pass cho RDS, Redshift, DocumentDB.
Use Cases khi chơi với ML:
| Use Case | Tại sao nên xài Secrets Manager |
|---|---|
| Mật khẩu Database | Cho phép SageMaker thọc vào RDS chôm training data mà không cần nhét cứng password vào code |
| API keys | Cất mấy cái API keys của đối tác thứ 3 dùng cho đám inference endpoints |
| Model endpoints | Cất URL của endpoint và các token bảo mật |
| Kết nối S3 | Giấu access keys dùng để chọt sang S3 của account khác (cross-account) |
Ví dụ: SageMaker thò tay vào lấy bí mật
import boto3
import json
# Moi cái secret ra
secrets_client = boto3.client('secretsmanager')
response = secrets_client.get_secret_value(SecretId='my-db-password')
secret = json.loads(response['SecretString'])
# Ném vào trong training script
db_password = secret['password']
db_connection = connect_to_db(password=db_password)
Mẹo Bài thi: #exam-tip
- “Giấu password truy cập database cho SageMaker” → Đánh ngay Secrets Manager (KHÔNG BAO GIỜ hardcode).
- “Tự động đổi API keys xoành xoạch” → Xài Secrets Manager bật tính năng rotation.
- “Luật công ty bắt đổi password 90 ngày một lần” → Bật Secrets Manager automatic rotation.