Để hiểu cách S3 bảo mật dữ liệu, hãy tìm hiểu về dịch vụ mã hoá và giải mã trên AWS: Key Management Service (KMS).
Trong bài này:
1. Nhắc lại
Mục này mình điểm lại ngắn gọn các khái niệm quan cơ bản trong mật mã hoá, là tiền đề quan trọng để hiểu KMS.
-
Khoá Mật mã (Cryptographic Key): là một chuỗi nhị phân dùng để mã hoá và/hoặc giải mã dữ liệu. Độ an toàn của thuật toán mã hoá ngoài phụ thuộc vào bản thân thuật toán còn phụ thuộc kích thước khoá (chiều dài chuỗi nhị phân), quá trình sinh khoá và trao đổi khoá. AWS Key Management Service (KMS) là dịch vụ quản lý các “Key” này.
-
Mã hoá Đối xứng (Symmetric Encryption): là nhóm các thuật toán mã hoá sử dụng cùng khoá mật mã để mã hoá cũng như giải mã.
-
Mã hoá Bất Đối xứng (Asymmetric Encryption): ngược lại, nhóm này sử dụng hai khoá riêng biệt cho mã hoá và giải mã. Mã hoá dùng khoá công khai (public key), giải mã dùng khoá bí mật (private key). Một ví dụ dễ hình dung là việc gửi thư điện tử (email), mọi người nếu biết địa chỉ email của bạn (hoàn toàn có thể công khai) có thể gửi thư cho bạn, nhưng nội dung email thì chỉ có bạn với thông tin đăng nhập đúng có thể đọc. Có thể coi địa chỉ email là một khoá công khai mà bạn có thể cung cấp cho người khác nếu muốn họ gửi thông tin riêng cho mình, và thông tin đăng nhập là khoá bí mật dùng để giải mã và đọc thông tin đó.
-
Bản rõ (Plaintext): là dữ liệu gốc chưa mã hoá.
-
Bản mã (Ciphertext): đầu ra của bản rõ sau khi áp dụng thuật toán mã hoá.
2. Key Management Service (KMS)
KMS là dịch vụ quản lý khoá mật mã để mã hoá và giải mã dữ liệu trên các dịch vụ AWS khác. Mặc định, KMS là dịch vụ theo vùng, tức trong cùng tài khoản, KMS ở Region A và KMS ở Region B có thể coi như hai dịch vụ tách biệt hoàn toàn, một khoá tạo ở Region A chỉ có thể được sử dụng trong Region đó. Tuy nhiên, AWS cũng hỗ trợ khoá đa vùng (multi-region key), hữu ích trong các trường hợp cần khôi phục sau thảm hoạ, quản lý dữ liệu toàn cầu, v.v., nhưng cũng sẽ khiến việc đảm bảo tuân thủ quy trình bảo mật phức tạp hơn.
KMS hỗ trợ tạo mới, nhập vào, lưu trữ và quản lý cả khoá đối xứng và bất đối xứng, cũng như sử dụng chúng để mã hoá và giải mã.
2.1. KMS Key
KMS Key bản chất là một logical container chứa khoá mật mã thực được dùng (cryptographic key ở phần trên, trong AWS gọi là key material). Ngoài ra còn có các thông tin khác như ID, ngày tạo, ngày hết hạn, key policy, mô tả, v.v.
Có thể chia KMS Key thành hai loại: AWS Managed và Customer Managed.
AWS Managed Key, như tên gọi, được tạo sẵn bởi AWS khi sử dụng các dịch vụ cần mã hoá. Ví dụ, khi sử dụng tính năng Server-Side Encryption trong S3 và chọn để S3 quản lý khoá (SSE-S3), S3 sẽ tạo một AWS Managed Key trong KMS có tên gọi (alias) là aws/s3 với key policy phù hợp để sử dụng. Người dùng không cần thực hiện thao tác nào. AWS Managed Key được tự động xoay tua (key rotation), tức thay đổi key material (vẫn giữ nguyên ARN của KMS Key) để đáp ứng các yêu cầu bảo mật.
Ngược lại, Customer Managed Key được tạo và quản lý bởi người dùng. Phần key material có thể được tạo bởi KMS, hoặc nhập key material có sẵn vào KMS để sử dụng. AWS hỗ trợ tự động xoay tua KMS Key nếu người dùng bật tính năng này, với chu kỳ mặc định 365 ngày.
Ví dụ, trong Region us-east-1, mình tạo một Customer Managed Key, khoá đối xứng, với key material tạo bởi KMS, có alias là awscoban, và sử dụng AWS CLI để mã hoá chuỗi ký tự AWS Co Ban như sau:
aws kms encrypt \
--key-id alias/awscoban \
--plaintext "AWS Co Ban" \
--region us-east-1 \
--query CiphertextBlob
Trong đó --key-id là ARN của KMS key, có thể thay thế bằng alias. KMS sẽ sử dụng thuật toán AES-256 để mã hoá. Kết quả là chuỗi ký tự định dạng Base64 sau:
AQICAHgJggN/uuJvcB0rSPiFHvcWE44kRKCy4eRJTreBJJ4nQQGotOAmNG4s+MyQjaDkSnTNAAAAZDBiBgkqhkiG9w0BBwagVTBTAgEAME4GCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQMYfcciEYqLlhiDW7zAgEQgCEIUSqNHZNVSVHPXiJdBfKhzAbO2ys99qBVclAGNdMx51c=
Ta có thể sử dụng bản mã này để giải mã ngược lại như sau:
aws kms decrypt \
--ciphertext-blob "AQICAHgJggN/uuJvcB0rSPiFHvcWE44kRKCy4eRJTreBJJ4nQQGotOAmNG4s+MyQjaDkSnTNAAAAZDBiBgkqhkiG9w0BBwagVTBTAgEAME4GCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQMYfcciEYqLlhiDW7zAgEQgCEIUSqNHZNVSVHPXiJdBfKhzAbO2ys99qBVclAGNdMx51c=" \
--region us-east-1 \
--query Plaintext
Kết quả là chuỗi ban đầu AWSCoBan. Ta không cần chỉ rõ --key-id như khi mã hoá, vì thông tin này có sẵn trong bản mã đầu vào.
Một nguyên tắc cần ghi nhớ là KMS được thiết kế để KMS Key không bao giờ rời khỏi KMS, dữ liệu được đưa đến KMS để mã hoá rồi trả về bản mã, không để lộ khoá ra ngoài.
Và quan trọng hơn, KMS Key chỉ có thể mã hoá tối đa 4 KB dữ liệu. Quá nhỏ, vì vậy các ứng dụng sẽ không mã hoá dữ liệu trực tiếp với KMS Key, mà dùng KMS Key để tạo ra Khoá Mã hoá Dữ liệu (Data Encryption Key). Cùng tìm hiểu chi tiết dưới đây.
2.2. Data Encryption Key
Khi tích hợp KMS vào ứng dụng của người dùng để mã hoá dữ liệu, AWS áp dụng quy trình mã hoá phong bì (envelope encryption) như sau:
- KMS tạo Khoá Mã hoá Dữ liệu (Data Encryption Key - DEK) ở dạng plaintext (chưa mã hoá).
- KMS mã hoá DEK sử dụng KMS Key, thu được bản mã của DEK (encrypted DEK).
- KMS gửi cả plaintext và encrypted DEK cho người dùng hoặc dịch vụ, sau đó xoá plaintext DEK. Do người dùng/dịch vụ sẽ tự thực hiện mã hoá dữ liệu, KMS không cần giữ lại plaintext DEK.
- Người dùng/dịch vụ sử dụng plaintext DEK để mã hoá dữ liệu, rồi xoá bỏ plaintext DEK để bảo mật.
- Khi cần giải mã, người dùng/dịch vụ gửi encrypted DEK cho KMS, KMS sử dụng KMS Key để giải mã ra plaintext DEK tương ứng, gửi lại rồi xoá đi. Người dùng/dịch vụ sử dụng plaintext DEK này để giải mã dữ liệu, rồi lại xoá bỏ.
Theo cơ chế này, KMS không cần lưu plaintext DEK, và việc mã hoá/giải mã được thực hiện bởi người dùng/dịch vụ.
Tại sao AWS giới hạn kích thước dữ liệu có thể mã hoá bằng KMS Key chỉ 4 KB, và khuyến khích sử dụng DEK cho các ứng dụng cần mã hoá?
Lý do thứ nhất là hiệu năng. Key material của KMS Key được lưu trong Hardware Security Module (HSM), là một thiết bị vật lý đặc dụng cho lưu trữ và thao tác với các khoá bảo mật. Nếu đưa dữ liệu quá lớn vào HSM để mã hoá sẽ làm tăng độ trễ và tạo thắt cổ chai. Thay vào đó, sử dụng cơ chế envelop encryption, giao việc mã hoá dữ liệu cho ứng dụng với DEK, còn HSM chỉ thực hiện mã hoá DEK.
Lý do thứ hai là bảo mật. Mỗi dữ liệu sẽ được mã hoá bằng một DEK riêng, nên nếu DEK đó bị lộ, sẽ không ảnh hưởng đến các dữ liệu khác, và tổng thể KMS Key vẫn an toàn.
2.3. Key Policy
Đây là resource policy của KMS. Mỗi KMS Key sẽ có một key policy tương ứng. Người dùng chỉ có thể điều chỉnh key policy của Customer Managed Key. Khác với các resource policy khác, key policy không tự động cấp quyền cho Root User, mà cần được cho phép rõ ràng, ví dụ, bằng luật sau:
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Cấp quyền cho Root User",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456789012:root"
},
"Action": "kms:*",
"Resource": "*"
},
]
Key policy thường được kết hợp với IAM Policy để cấp quyền quản lý và sử dụng KMS Key. Có thể phân quyền rõ ràng: ai được phép tạo và xoá key, ai được phép sử dụng key để mã hoá và giải mã.
Ví dụ, luật dưới đây cho phép IAM User 123456789012:user/awscoban quyền quản lý KMS Key, nhưng không được sử dụng.
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Cấp quyền quản lý khoá",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456789012:user/awscoban"
},
"Action": [
"kms:Create*",
"kms:Describe*",
"kms:Enable*",
"kms:List*",
"kms:Put*",
"kms:Update*",
"kms:Revoke*",
"kms:Disable*",
"kms:Get*",
"kms:Delete*",
"kms:TagResource",
"kms:UntagResource",
"kms:ScheduleKeyDeletion",
"kms:CancelKeyDeletion",
"kms:RotateKeyOnDemand"
],
"Resource": "*"
}
]
Ngược lại, luật dưới đây cho phép IAM User đó sử dụng KMS Key để mã hoá, giải mã, tạo DEK, nhưng không được tạo, cập nhật hay xoá KMS Key.
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Cấp quyền sử dụng khoá",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456789012:user/awscoban"
},
"Action": [
"kms:Decrypt",
"kms:ReEncrypt*",
"kms:GenerateDataKey*",
"kms:DescribeKey"
],
"Resource": "*"
}
]
Cơ chế phân quyền này giúp việc phân công trách nhiệm đơn giản và linh hoạt hơn.
Tài liệu tham khảo
Hy vọng qua bài viết này, bạn đọc đã hiểu cách KMS sinh khoá và mã hoá dữ liệu. Giờ là lúc quay lại S3 và xem KMS được tích hợp vào S3 như thế nào để bảo mật dữ liệu trên đó.