Giảng viên hướng dẫn: Ngô Hữu Dũng¶
Lớp HP: DHHTTT19A Mã HP: 420300100403¶
Lê Thành Long-23630851¶
BÀI LAB: DEMO BẢO MẬT S3 + IAM + KMS¶
MỤC TIÊU¶
- Tạo 1 S3 bucket để lưu file
- Tạo 2 user với quyền khác nhau: Admin và ReadOnly
- Demo mã hóa file với KMS
- Chứng minh phân quyền hoạt động như thế nào
CHUẨN BỊ¶
- Tài khoản AWS (có thể dùng Free Tier)
- Trình duyệt web
- Không cần cài đặt gì thêm
BƯỚC 1: TẠO S3 BUCKET¶
- Đăng nhập AWS Console → tìm S3
-
Bucket name:
lelong-security-demo-20251119(thaylelongbằng tên bạn) -
Giữ nguyên các setting khác → Create bucket
BƯỚC 2: TẠO KMS KEY¶
-
Alias:
demo-encryption-key→ Next - Key administrators: bỏ qua -> Next
- Key users: bỏ qua -> Next
-
Vào key vừa tạo, copy ARN (dạng:
arn:aws:kms:us-east-1:123456789:key/abc-def)
BƯỚC 3: TẠO IAM USERS¶
Tạo User Admin:¶
-
Next → Attach policies directly
-
Next → Create user
Tạo User ReadOnly:¶
- Create user tiếp
- Username:
demo-readonly - Next → Attach policies directly
- Tìm và tick:
AmazonS3ReadOnlyAccess - Next → Create user
BƯỚC 4: TẠO ACCESS KEYS¶
Cho demo-admin:¶
- Click vào user
demo-admin
Cho demo-readonly:¶
- Làm tương tự cho user
demo-readonly
Sửa KMS Key Policy¶
- Vào KMS Console → Customer managed keys
- Click vào key
demo-encryption-key -
Tìm phần có
"Sid": "Allow use of the key"(nếu chưa có thì thêm vào) - Sửa thành như sau (thay
026090510378bằng Account ID của bạn):
{
"Version": "2012-10-17",
"Id": "key-consolepolicy-3",
"Statement": [
{
"Sid": "Enable IAM User Permissions",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::026090510378:root"
},
"Action": "kms:*",
"Resource": "*"
},
{
"Sid": "Allow use of the key for demo-admin",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::026090510378:user/demo-admin"
},
"Action": [
"kms:Decrypt",
"kms:GenerateDataKey",
"kms:DescribeKey"
],
"Resource": "*"
},
{
"Sid": "Allow use of the key for demo-readonly",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::026090510378:user/demo-readonly"
},
"Action": [
"kms:Decrypt",
"kms:DescribeKey"
],
"Resource": "*"
}
]
}
- Save changes
BƯỚC 5: TEST BẰNG AWS CLOUDSHELL¶
AWS CloudShell là terminal online, không cần cài đặt gì!
-
Ở góc trên cùng AWS Console, click icon CloudShell (hình terminal)
-
Đợi 0.5 phút để CloudShell khởi động , thêm 1 tab để demo 2 user cùng lúc
Config profile cho demo-admin:¶
aws configure set aws_access_key_id YOUR_ADMIN_ACCESS_KEY --profile admin
aws configure set aws_secret_access_key YOUR_ADMIN_SECRET_KEY --profile admin
aws configure set region us-east-1 --profile admin
Config profile cho demo-readonly:¶
aws configure set aws_access_key_id YOUR_READONLY_ACCESS_KEY --profile readonly
aws configure set aws_secret_access_key YOUR_READONLY_SECRET_KEY --profile readonly
aws configure set region us-east-1 --profile readonly
chạy kiểm tra đủ user chưa¶
aws configure list-profiles
BƯỚC 6: DEMO QUYỀN ADMIN¶
Tạo file test:¶
Upload file KHÔNG mã hóa:¶
Upload file CÓ mã hóa KMS:¶
aws s3 cp secret-file.txt s3://lelong-security-demo-20251119/encrypted-file.txt --profile admin --sse aws:kms --sse-kms-key-id alias/demo-encryption-key
Xem kết quả:¶
BƯỚC 7: KIỂM TRA MÃ HÓA TRÊN S3 CONSOLE¶
- Quay lại S3 Console → vào bucket của bạn
- Click vào file
encrypted-file.txt - Xem tab "Properties"
- Kéo xuống phần "Server-side encryption"
- Sẽ thấy:
AWS-KMSvà keydemo-encryption-key
BƯỚC 8: DEMO QUYỀN READONLY¶
Quay lại CloudShell:
Thử upload (sẽ THẤT BẠI):¶
echo "Readonly khong duoc upload" > test.txt
aws s3 cp test.txt s3://lelong-security-demo-20251119/test.txt --profile readonly
Kết quả: AccessDenied error
Thử download (sẽ THÀNH CÔNG):¶
aws s3 cp s3://lelong-security-demo-20251119/normal-file.txt downloaded-normal.txt --profile readonly
aws s3 cp s3://lelong-security-demo-20251119/encrypted-file.txt downloaded-encrypted.txt --profile readonly
Thử xóa (sẽ THẤT BẠI):¶
Kết quả: AccessDenied error
Xem nội dung file đã download:¶
BƯỚC 9: SO SÁNH FILE GỐC VÀ FILE GIẢI Mö
echo "=== File gốc ==="
cat secret-file.txt
echo "=== File download không mã hóa ==="
cat downloaded-normal.txt
echo "=== File download có mã hóa (đã tự động giải mã) ==="
cat downloaded-encrypted.txt
echo "=== So sánh MD5 hash ==="
md5sum secret-file.txt downloaded-encrypted.txt
KẾT QUẢ DEMO¶
Bài lab này đã chứng minh:
✅ Phân quyền hoạt động: Admin làm được mọi thứ, ReadOnly bị chặn upload/delete
✅ Mã hóa tự động: File được mã hóa và giải mã trong suốt
✅ Tính toàn vẹn: Hash của file gốc = hash của file giải mã
✅ Bảo mật: Chỉ user có quyền mới truy cập được KMS key
DỌN DẸP¶
- S3: Empty bucket → Delete bucket
- IAM: Delete 2 users
- KMS: Schedule key deletion (7 ngày)
PHẦN GIẢI THÍCH LÝ THUYẾT AN TOÀN THÔNG TIN¶
1. CHỨNG THỰC (Authentication) - "Chứng minh bạn là ai"¶
🏠 Ví dụ đời thường:¶
- Giống như khi bạn vào cổng trường, bạn phải đưa thẻ sinh viên để bảo vệ biết bạn là ai.
- Thẻ sinh viên = Giấy chứng minh bạn là sinh viên thật, không phải người lạ.
💻 Trong bài lab:¶
- Access Key ID = Tên đăng nhập (công khai, như MSSV)
- Secret Access Key = Mật khẩu (bí mật, như chữ ký của bạn)
🔍 Cách hoạt động:¶
Khi bạn chạy lệnh:
Điều gì xảy ra?
1. AWS CLI lấy **Secret Access Key** của bạn
2. Tạo một **chữ ký điện tử** cho câu lệnh này (dùng thuật toán HMAC-SHA256)
3. Gửi kèm chữ ký lên server AWS
4. AWS kiểm tra: "Chữ ký này có khớp với Access Key ID không?"
5. ✅ Nếu đúng → "OK, bạn là demo-admin thật"
6. ❌ Nếu sai → Lỗi `InvalidAccessKeyId`
📸 Bằng chứng trong lab:¶
- Khi bạn dùng sai Access Key → Lỗi ngay lập tức
- Khi đúng → Lệnh chạy thành công
2. PHÂN QUYỀN (Authorization) - "Bạn được phép làm gì"¶
🏠 Ví dụ đời thường:¶
Sau khi vào trường, thẻ sinh viên quyết định bạn vào được đâu: - Sinh viên thường: Vào thư viện, lớp học (chỉ đọc sách, nghe giảng) - Giáo viên: Vào phòng máy chủ, sửa điểm (làm được nhiều hơn) - Bảo vệ: Không cho vào khu vực cấm
💻 Trong bài lab:¶
| User | Policy gắn | Quyền thực tế |
|---|---|---|
| demo-admin | S3FullAccess |
Upload ✅ / Download ✅ / Delete ✅ |
| demo-readonly | S3ReadOnlyAccess |
Upload ❌ / Download ✅ / Delete ❌ |
🔍 Cách hoạt động:¶
Khi demo-readonly thử upload:
Điều gì xảy ra?
1. AWS đã chứng thực: "OK, bạn là demo-readonly" ✅
2. AWS kiểm tra policy: "Hmm, demo-readonly có quyền `s3:PutObject` không?"
3. Tra trong policy `S3ReadOnlyAccess` → **KHÔNG CÓ**
4. ❌ Trả về lỗi: `AccessDenied`
Khi demo-readonly thử download:
1. AWS chứng thực: "OK, bạn là demo-readonly" ✅
2. Kiểm tra policy: "demo-readonly có quyền `s3:GetObject` không?"
3. Tra trong policy → **CÓ** ✅
4. ✅ Download thành công!
📊 Nguyên tắc quan trọng:¶
Principle of Least Privilege (Đặc quyền tối thiểu): - Chỉ cấp đúng quyền cần thiết, không cho thừa - Giống như: Nhân viên bán hàng không cần quyền truy cập két sắt
3. MÃ HÓA ĐỐI XỨNG (Symmetric Encryption) - "Khóa bí mật chung"¶
🏠 Ví dụ đời thường:¶
Bạn và bạn thân có chung một chiếc chìa khóa để mở cùng một cái két: - Bạn dùng chìa khóa này KHÓA két → Bỏ tiền vào - Bạn thân dùng chìa khóa này MỞ két → Lấy tiền ra - Cùng 1 chìa khóa để khóa và mở
💻 Trong bài lab:¶
Khi bạn upload file với KMS:
Điều gì xảy ra? (Envelope Encryption)
┌─────────────────────────────────────────┐
│ 1. File gốc: "Day la file bi mat" │
└─────────────────────────────────────────┘
↓
┌─────────────────────────────────────────┐
│ 2. AWS KMS tạo Data Key (256 bit) │
│ Ví dụ: "X7k9mP2nQ8..." │
└─────────────────────────────────────────┘
↓
┌─────────────────────────────────────────┐
│ 3. Dùng Data Key mã hóa file │
│ Thuật toán: AES-256 │
│ Kết quả: "A8x@#mKp9L..." │
│ (File đã mã hóa) │
└─────────────────────────────────────────┘
↓
┌─────────────────────────────────────────┐
│ 4. Dùng KMS Master Key mã hóa Data Key│
│ Data Key mã hóa: "9Lp#x@A8..." │
└─────────────────────────────────────────┘
↓
┌─────────────────────────────────────────┐
│ 5. Lưu lên S3: │
│ - File đã mã hóa │
│ - Data Key đã mã hóa (kèm theo) │
└─────────────────────────────────────────┘
Khi download về:
┌─────────────────────────────────────────┐
│ 1. Download file mã hóa + Data Key │
└─────────────────────────────────────────┘
↓
┌─────────────────────────────────────────┐
│ 2. Gửi Data Key đã mã hóa cho KMS │
│ Yêu cầu: "Giải mã Data Key giùm tôi"│
└─────────────────────────────────────────┘
↓
┌─────────────────────────────────────────┐
│ 3. KMS kiểm tra quyền: │
│ "User này có quyền kms:Decrypt?" │
│ ✅ demo-admin: CÓ │
│ ✅ demo-readonly: CÓ (đã cấp) │
└─────────────────────────────────────────┘
↓
┌─────────────────────────────────────────┐
│ 4. KMS trả về Data Key đã giải mã │
└─────────────────────────────────────────┘
↓
┌─────────────────────────────────────────┐
│ 5. Dùng Data Key giải mã file │
│ Kết quả: "Day la file bi mat" │
└─────────────────────────────────────────┘
🔑 Tại sao dùng 2 lớp mã hóa?¶
- Mã hóa file trực tiếp bằng Master Key → Chậm, nguy hiểm
- Mã hóa bằng Data Key → Nhanh
- Data Key được bảo vệ bởi Master Key → An toàn
📊 Thuật toán AES-256:¶
- AES = Advanced Encryption Standard
- 256 = Độ dài khóa 256 bit
- Được chính phủ Mỹ dùng để mã hóa tài liệu mật
- Nếu dùng siêu máy tính thử hết tổ hợp → Mất hàng tỷ năm mới bẻ khóa được
4. HÀM BĂM (Hash Functions) - "Dấu vân tay số"¶
🏠 Ví dụ đời thường:¶
- Vân tay của mỗi người là duy nhất
- Nếu có 2 người có cùng vân tay → Họ là cùng 1 người
- Nếu vân tay khác → Chắc chắn là người khác
💻 Trong bài lab:¶
Khi upload file lên S3, AWS tự động tính MD5 hash:
# File gốc
echo "Day la file bi mat" > file.txt
# Tính hash
md5sum file.txt
# Kết quả: a1b2c3d4e5f6... file.txt
Đặc điểm của Hash: 1. Một chiều: Không thể từ hash tìm ngược lại nội dung 2. Deterministic: Cùng file → Cùng hash 3. Nhạy cảm: Thay đổi 1 ký tự → Hash hoàn toàn khác
File A: "Hello" → Hash: 8b1a9953c4611296a827abf8c47804d7
File B: "Hello" → Hash: 8b1a9953c4611296a827abf8c47804d7 ✅ Giống nhau
File C: "Hellp" → Hash: 5d41402abc4b2a76b9719d911017c592 ❌ Khác hoàn toàn
🔍 Trong bài lab:¶
# So sánh hash
md5sum secret-file.txt
# Output: a1b2c3d4... secret-file.txt
md5sum downloaded-encrypted.txt
# Output: a1b2c3d4... downloaded-encrypted.txt
Hash giống nhau → Chứng minh: - File không bị thay đổi trong quá trình truyền - File được giải mã chính xác 100% - Tính toàn vẹn (Integrity) được đảm bảo
📊 ETag trên S3:¶
Khi bạn xem Properties của file trên S3 Console, sẽ thấy ETag: - ETag = MD5 hash của file - S3 dùng nó để check xem file có bị hỏng trong quá trình upload không
5. CHỮ KÝ SỐ (Digital Signature) - "Chữ ký không thể giả mạo"¶
🏠 Ví dụ đời thường:¶
- Bạn ký tên vào giấy hợp đồng
- Người ta xem chữ ký để biết: "Đây đúng là lelongc ký, không ai giả mạo"
💻 Trong bài lab (ẩn bên dưới):¶
Mỗi khi bạn chạy AWS CLI, điều này xảy ra:
┌────────────────────────────────────┐
│ Bạn: aws s3 cp file.txt s3://... │
└────────────────────────────────────┘
↓
┌────────────────────────────────────┐
│ AWS CLI tạo request: │
│ PUT /file.txt │
│ Host: s3.amazonaws.com │
│ Date: 2025-11-19T09:17:54Z │
└────────────────────────────────────┘
↓
┌────────────────────────────────────┐
│ Tính hash của request: │
│ SHA256(request) = abc123def... │
└────────────────────────────────────┘
↓
┌────────────────────────────────────┐
│ Dùng Secret Key "ký" hash này: │
│ Signature = HMAC(hash, SecretKey) │
│ = xyz789mnp... │
└────────────────────────────────────┘
↓
┌────────────────────────────────────┐
│ Gửi lên AWS: │
│ - Request gốc │
│ - Access Key ID │
│ - Signature (chữ ký) │
└────────────────────────────────────┘
↓
┌────────────────────────────────────┐
│ AWS nhận được, kiểm tra: │
│ 1. Lấy Secret Key từ Access Key ID│
│ 2. Tự tính signature của request │
│ 3. So sánh với signature gửi lên │
└────────────────────────────────────┘
↓
✅ Giống nhau → Cho phép
❌ Khác nhau → AccessDenied
🔒 Bảo vệ gì?¶
- Chứng thực: Đảm bảo request từ đúng người (có Secret Key)
- Toàn vẹn: Request không bị sửa đổi trên đường đi
- Chống giả mạo: Không ai có thể tạo chữ ký giả
6. MÃ HÓA BẤT ĐỐI XỨNG (Asymmetric Encryption) - "Khóa công khai, khóa riêng"¶
🏠 Ví dụ đời thường:¶
Hòm thư tại nhà bạn: - Khóa công khai (Public Key): Khe bỏ thư → AI CŨNG BỎ ĐƯỢC - Khóa riêng (Private Key): Chìa khóa mở hòm thư → CHỈ BẠN CÓ
Ai cũng bỏ thư vào được, nhưng chỉ bạn mở và đọc được.
💻 Trong bài lab (HTTPS/TLS):¶
Khi bạn chạy aws s3 cp, kết nối HTTPS được thiết lập:
┌────────────────────────────────────┐
│ 1. Máy bạn → AWS: │
│ "Xin chào, tôi muốn kết nối" │
└────────────────────────────────────┘
↓
┌────────────────────────────────────┐
│ 2. AWS → Máy bạn: │
│ "OK, đây là Public Key của tôi" │
│ [Gửi chứng chỉ SSL + Public Key]│
└────────────────────────────────────┘
↓
┌────────────────────────────────────┐
│ 3. Máy bạn: │
│ Tạo Session Key (khóa đối xứng) │
│ Ví dụ: "K789xyz..." │
│ Mã hóa Session Key bằng │
│ Public Key của AWS │
└────────────────────────────────────┘
↓
┌────────────────────────────────────┐
│ 4. Máy bạn → AWS: │
│ Gửi Session Key đã mã hóa │
└────────────────────────────────────┘
↓
┌────────────────────────────────────┐
│ 5. AWS: │
│ Dùng Private Key giải mã │
│ → Lấy được Session Key │
└────────────────────────────────────┘
↓
┌────────────────────────────────────┐
│ 6. Cả 2 bên giờ có chung Session │
│ Key → Dùng mã hóa đối xứng │
│ (nhanh hơn) cho phần còn lại │
└────────────────────────────────────┘
🔑 Tại sao không dùng mã hóa bất đối xứng cho mọi thứ?¶
- Chậm hơn 1000 lần so với mã hóa đối xứng
- Chỉ dùng để trao đổi khóa an toàn
- Sau đó chuyển sang đối xứng để truyền dữ liệu nhanh
📊 TỔNG KẾT: LUỒNG BẢO MẬT HOÀN CHỈNH TRONG BÀI LAB¶
┌──────────────────────────────────────────────────────────────┐
│ BẠN CHẠY LỆNH UPLOAD │
│ aws s3 cp secret.txt s3://bucket/ --sse aws:kms │
└──────────────────────────────────────────────────────────────┘
↓
┌──────────────────────────────────────────────────────────────┐
│ 1. CHỨNG THỰC (Authentication) │
│ - AWS CLI ký request bằng Secret Key │
│ - AWS xác minh: "Bạn là demo-admin" ✅ │
└──────────────────────────────────────────────────────────────┘
↓
┌──────────────────────────────────────────────────────────────┐
│ 2. PHÂN QUYỀN (Authorization) │
│ - Kiểm tra policy: demo-admin có quyền PutObject? ✅ │
│ - Kiểm tra policy: demo-admin có quyền dùng KMS? ✅ │
└──────────────────────────────────────────────────────────────┘
↓
┌──────────────────────────────────────────────────────────────┐
│ 3. MÃ HÓA BẤT ĐỐI XỨNG (TLS/HTTPS) │
│ - Thiết lập kết nối an toàn với S3 │
│ - Trao đổi Session Key bằng RSA │
└──────────────────────────────────────────────────────────────┘
↓
┌──────────────────────────────────────────────────────────────┐
│ 4. MÃ HÓA ĐỐI XỨNG (KMS) │
│ - KMS tạo Data Key │
│ - Mã hóa file bằng AES-256 │
│ - Mã hóa Data Key bằng Master Key │
└──────────────────────────────────────────────────────────────┘
↓
┌──────────────────────────────────────────────────────────────┐
│ 5. HÀM BĂM (Integrity Check) │
│ - S3 tính MD5 hash của file │
│ - Lưu hash vào ETag │
│ - Dùng để verify khi download │
└──────────────────────────────────────────────────────────────┘
↓
┌──────────────────────────────────────────────────────────────┐
│ FILE ĐƯỢC LƯU AN TOÀN TRÊN S3 │
│ ✅ Chỉ người có quyền mới truy cập được │
│ ✅ Dữ liệu được mã hóa, không ai đọc được │
│ ✅ Toàn vẹn được đảm bảo bởi hash │
└─────────────────────────────────────────────────────────────┘
💡 KẾT LUẬN¶
Bài lab tuy đơn giản nhưng đã minh họa 5 trụ cột bảo mật:
| Khái niệm | Câu hỏi trả lời | Công nghệ trong lab |
|---|---|---|
| Chứng thực | Bạn là ai? | Access Key + Secret Key |
| Phân quyền | Bạn được làm gì? | IAM Policies |
| Mã hóa đối xứng | Bảo vệ dữ liệu như thế nào? | AES-256 + KMS |
| Hàm băm | Dữ liệu có bị sửa không? | MD5/SHA256 |
| Mã hóa bất đối xứng | Kết nối an toàn ra sao? | RSA + TLS/HTTPS |
mong thầy cho em điểm cao ạ ಥ_ಥ¶
Signature & Hash – Giải thích chi tiết
Chúng ta cùng làm rõ lại về "TẠO SIGNATURE" & "HASH" - với một cách giải thích đơn giản, trực quan và đi sâu vào FLOW thực tế.¶
1. SIGNATURE – ĐẢM BẢO AUTHENTICATION (XÁC THỰC) VÀ TÍNH TOÀN VẸN LỆNH¶
Signature giúp giải quyết các câu hỏi sau:¶
- "AI gửi request này?" (Authenticate) Đảm bảo user là người hợp lệ, có quyền gửi lệnh đến AWS.
→ AWS xác thực dựa trên Signature + Access Key ID. - "Request này có bị thay đổi không?" (Integrity) Nếu request bị chỉnh sửa (vd: thay URL, body), chữ ký (Signature) sẽ không hợp lệ.
Quy trình tạo Signature với ví dụ thực tế (lệnh upload như bài lab):¶
Lệnh:
AWS sẽ thực hiện các bước sau:
BƯỚC 1: CHUẨN BỊ REQUEST¶
Gốc request:¶
- Method (HTTP):
PUT - Path:
/encrypted-file.txt - Headers:
Host,x-amz-date,x-amz-security-token,... - Body: Nội dung file (nếu có).
Ví dụ (Request bạn sẽ gửi đến S3):¶
PUT /encrypted-file.txt HTTP/1.1
Host: bucket.s3.us-east-1.amazonaws.com
x-amz-date: 20251120T151000Z
Content-Type: text/plain
BƯỚC 2: TẠO "CANONICAL REQUEST" Canonical Request là "bản chuẩn hóa" của request, dùng để đảm bảo tính toàn vẹn lệnh.¶
Cách chuẩn hóa:¶
- Sắp xếp headers theo thứ tự alphabet.
- Chỉ giữ lại các headers cần thiết.
- Tính Hash của Body (nếu có).
Ví dụ Canonical Request:
PUT
/encrypted-file.txt
(empty query string)
content-type:text/plain
host:bucket.s3.us-east-1.amazonaws.com
x-amz-date:20251120T151000Z
content-type;host;x-amz-date
<hash của nội dung file>
Hash Canonical Body (file):¶
Nội dung file: "Day la file bi mat cua lelong"
→ Hash SHA-256: a7e251d4022b3e7689df314c0cbb4d5a7a5f621e0a9c7e89b6059463cab42f40
BƯỚC 3: TẠO "STRING TO SIGN" "String to Sign" là thông tin chính để tính Signature. Nó bao gồm:¶
- Thuật toán sử dụng (Signature Version 4):
→
AWS4-HMAC-SHA256 - Thời gian request: →
20251120T151000Z. - Region + Service: →
us-east-1/s3/aws4_request. - Hash của Canonical Request.
Ví dụ String to Sign:¶
AWS4-HMAC-SHA256
20251120T151000Z
20251120/us-east-1/s3/aws4_request
aedbcd30b1f2c5ab72857d34ed2b701f9e48a4efef2f29c5df1cbabdc01dfb41
Hash cuối = Hash Canonical Request (ở bước 2).
BƯỚC 4: TÍNH SIGNATURE¶
Đây là nơi Secret Access Key được sử dụng. Nhưng lưu ý: Key sẽ trải qua nhiều lớp băm (HMAC):
Quy trình:¶
-
Tạo Signing Key từ Secret Key:
-
Ký String to Sign:
Kết quả cuối cùng (signature):
BƯỚC 5: GỬI REQUEST VỚI CHỮ Kݶ
Request HTTP cuối cùng sẽ có chữ ký ở Header:
PUT /encrypted-file.txt HTTP/1.1
Host: bucket.s3.us-east-1.amazonaws.com
x-amz-date: 20251120T151000Z
Authorization: AWS4-HMAC-SHA256
Credential=AKIAIOSFODNN7EXAMPLE/20251120/us-east-1/s3/aws4_request,
SignedHeaders=content-type;host;x-amz-date,
Signature=a1b2c3d4e5f6789abcdef0123456789abcdef0123456789abcdef0123456789
BƯỚC 6: SERVER XÁC THỰC CHỮ Kݶ
AWS Server:
1. Lấy Access Key ID (ở Credential).
2. Dùng Secret Key lưu trên server để tự tính lại Signature từ request.
3. So sánh Signature (gửi lên) với Signature server tự tính:
- Khớp: Request hợp lệ → Tiến hành upload file.
- Không khớp: Báo lỗi SignatureDoesNotMatch.
LUỒNG HASH: ĐẢM BẢO INTEGRITY NỘI DUNG FILE¶
Hash (ETag) là “dấu vân tay” dùng để bảo toàn tính toàn vẹn dữ liệu.
Quy trình Hash khi Upload/Download:¶
1. KHI UPLOAD FILE LÊN S3¶
Quy trình:¶
- AWS CLI tính Hash MD5 của file trước khi upload.
- Gửi Hash MD5 kèm nội dung file.
- Ví dụ (Header HTTP):
Content-MD5: abc123.... - AWS S3 tự tính lại hash của nội dung sau khi nhận.
- So sánh MD5:
- Khớp: File nguyên vẹn → Chấp nhận lưu.
- Không khớp: Báo lỗi:
Invalid Content-MD5. - Tạo ETag = Hash MD5 → Lưu kèm file.
2. KHI DOWNLOAD FILE TỪ S3¶
Quy trình: 1. S3 trả về file cùng ETag (Hash MD5).¶
- AWS CLI tính lại Hash MD5 của file tải về.
- So sánh Hash:
- Khớp: File tải về nguyên vẹn!
- Không khớp: File bị lỗi trong quá trình truyền → Báo lỗi.
Ví dụ Hash MD5 thực hành:¶
# Tính hash file gốc:
md5sum secret-file.txt
# Output: d41d8cd98f00b204e9800998ecf8427e
# Tính hash file sau khi tải:
md5sum downloaded-file.txt
# Output: d41d8cd98f00b204e9800998ecf8427e
# Hash khớp → File nguyên vẹn.
TỔNG KẾT: TẠI SAO SIGNATURE + HASH QUAN TRỌNG?¶
Signature bảo vệ: LỆNH¶
- Đảm bảo người gửi (Authentication).
- Đảm bảo request không bị sửa (Integrity).
- Chống giả mạo hoặc replay request.
Hash bảo vệ: FILE¶
- Đảm bảo file không bị sửa đổi (Integrity).
- Phát hiện lỗi trong quá trình lưu trữ hoặc truyền tải.