Sunday, January 19, 2025

[AWS] KMS

-

AWS KMS (Key Management Service)

AWS KMS (Key Management Service) là dịch vụ quản lý khóa mã hóa trên AWS. Khi có yêu cầu mã hóa, KMS sẽ quản lý và cung cấp khóa mã hóa cho chúng ta. Dịch vụ được tích hợp hoàn toàn với IAM để quản lý quyền truy cập vào dữ liệu của chúng ta. Nó cung cấp cách dễ dàng để kiểm soát quyền truy cập vào dữ liệu của chúng ta và đồng thời cho phép chúng ta kiểm tra lịch sử sử dụng khóa KMS thông qua CloudTrail. KMS được tích hợp một cách mượt mà vào hầu hết các dịch vụ AWS (EBS, S3, RDS, SSM…) và cũng cung cấp API để mã hóa khóa dựa trên các yêu cầu của chúng ta. Điều quan trọng là không nên lưu trữ bí mật dưới dạng văn bản thuần túy, đặc biệt là trong mã của chúng ta. Thay vào đó, chúng ta có thể lưu trữ các bí mật đã được mã hóa trong mã / biến môi trường của chúng ta.

KMS Keys Types
• KMS Keys là tên mới của KMS Customer Master Key
• Symmetric (khóa AES-256)
• Khóa mã hóa đơn giản được sử dụng để mã hóa và giải mã
• Các dịch vụ AWS tích hợp với KMS sử dụng Symmetric CMKs
• Bạn không bao giờ có quyền truy cập vào KMS Key không được mã hóa (phải gọi API KMS để sử dụng)
• Asymmetric (cặp khóa RSA & ECC)
• Bao gồm Khóa công khai (Encrypt) và Khóa riêng tư (Decrypt)
• Sử dụng cho các hoạt động Encrypt/Decrypt hoặc Sign/Verify
• Khóa công khai có thể được tải xuống, nhưng bạn không thể truy cập Khóa riêng tư không được mã hóa
• Trường hợp sử dụng: mã hóa bên ngoài AWS bởi người dùng không thể gọi API KMS

AWS KMS (Key Management Service)
• Ba loại KMS Keys:
• AWS Managed Key: miễn phí (aws/service-name, ví dụ: aws/rds hoặc aws/ebs)
• Customer Managed Keys (CMK) được tạo trong KMS: $1 / tháng
• Customer Managed Keys được nhập (phải là khóa đối xứng 256 bit): $1 / tháng
• + phải trả cho cuộc gọi API tới KMS ($0.03 / 10000 lượt gọi)
• Tự động quay vòng khóa:
• AWS-managed KMS Key: tự động sau 1 năm
• Customer-managed KMS Key: (phải được bật) tự động sau 1 năm
• Imported KMS Key: chỉ có thể quay vòng thủ công bằng alias

Copying Snapshots across regions

Phần này nói về về việc sao chép snapshot giữa các khu vực của Amazon Web Services (AWS). Khi ta tạo ra một snapshot (bản sao lưu) của một EBS (Elastic Block Store) volume trên một khu vực cụ thể của AWS, ta có thể sao chép snapshot đó sang các khu vực khác để dễ dàng đảm bảo tính toàn vẹn của dữ liệu và đảm bảo khả năng phục hồi dữ liệu trong trường hợp xảy ra sự cố. Quá trình sao chép này có thể thực hiện bằng cách sử dụng công cụ như AWS Management Console, AWS CLI hoặc AWS SDK. Tuy nhiên, quá trình sao chép snapshot này sẽ tốn thêm chi phí liên quan đến lưu trữ và truyền tải dữ liệu giữa các khu vực.

KMS Key Policies

• Chính sách khóa KMS là cách để kiểm soát quyền truy cập đến các khóa KMS, “tương tự” như chính sách bucket S3.
• Khác biệt: bạn không thể kiểm soát quyền truy cập nếu thiếu chính sách này.
• Chính sách mặc định của khóa KMS:
• Được tạo ra nếu bạn không cung cấp một chính sách KMS Key cụ thể
• Truy cập đầy đủ vào khóa cho người dùng root = toàn bộ tài khoản AWS
• Chính sách khóa KMS tùy chỉnh:
• Xác định người dùng, vai trò có thể truy cập vào khóa KMS
• Xác định người có thể quản trị khóa
• Hữu ích cho truy cập liên tài khoản đến khóa KMS của bạn.

Copying Snapshots across accounts

Sao chép Snapshots giữa các tài khoản

  1. Tạo một Snapshot, được mã hóa bằng KMS Key của bạn (Customer Managed Key)
  2. Đính kèm KMS Key Policy để ủy quyền truy cập giữa các tài khoản
  3. Chia sẻ Snapshot được mã hóa
  4. (ở tài khoản đích) Tạo một bản sao của Snapshot, mã hóa nó với một CMK trong tài khoản của bạn
  5. Tạo một khối lượng từ Snapshot đã sao chép.

Đây là một phần của KMS Key Policy dùng để cho phép truy cập chéo tài khoản (cross-account access) đến khóa KMS được tạo ra bởi tài khoản khác.

  • “Sid”: “Allow use of the key with destination account” là một chuỗi đại diện cho mục đích của đoạn policy này, có thể tự đặt tên theo ý muốn.
  • “Effect”: “Allow” chỉ ra rằng những hành động được liệt kê trong policy sẽ được cho phép.
  • “Principal”: {} xác định chủ sở hữu của chính sách, ở đây là trống (empty).
  • “AWS”: “arn:aws:1am::TARGET-ACCOUNT-ID:role/ROLENAME” xác định tài khoản và vai trò trong tài khoản đó (target account ID và role name) được phép truy cập khóa KMS.
  • “Action”: “kms: Decrypt”, “kms: CreateGrant” là các hành động cho phép khi truy cập khóa KMS.
  • “Resource”: “*” là tài nguyên đích (destination resource), ở đây là tất cả các khóa KMS.
  • “Condition”: {“StringEquals”: {“kms: ViaService”: “ec2.REGION.amazonaws.com.”, “kms: CallerAccount”: “TARGET-ACCOUNT-ID”}} chỉ định các điều kiện để chính sách được áp dụng. Cụ thể là nếu yêu cầu được gửi từ tài khoản đích và thông qua dịch vụ EC2 trong khu vực được chỉ định thì sẽ được phép truy cập khóa KMS.

KMS Hands On w CLI

Tại phần AWS managed keys sẽ cho bạn thấy các keys bạn đã sử dụng tại đây. AWS KMS cung cấp 3 loại khóa khác nhau để quản lý quá trình mã hóa, bảo mật dữ liệu. Các loại khóa đó bao gồm:

  • AWS Managed Keys: là các khóa được quản lý bởi AWS và hoàn toàn miễn phí cho người dùng AWS. Chúng được sử dụng để bảo vệ các tài nguyên AWS như RDS, EBS, S3, …
  • Customer Managed Keys (CMK): là các khóa khách hàng tự quản lý và có thể được sử dụng cho các tài nguyên AWS và các ứng dụng bên ngoài AWS. Chúng có mức phí 1 USD mỗi tháng.
  • Custom key stores: là một tính năng mới của KMS cho phép người dùng tự quản lý việc triển khai, cấu hình và duy trì HSM (Hardware Security Module) của mình tại một số khu vực khác nhau trong toàn cầu. Tính năng này cho phép các khóa khách hàng của người dùng được quản lý và lưu trữ trong các HSM của riêng họ, nơi mà khóa được tạo ra và giữa tối đa an toàn.

Giờ mình sẽ tạo 1 khoá của khách hàng bằng cách vào Customer managed keys › Create key, lưu ý hiện tại nếu bạn tạo khoá cho khách hàng thì bạn sẽ tiêu tốn khoảng 1$/month nhé.

Các thành phần của Key type:

  • Symmetric key (Khóa đối xứng): Đây là một khóa đơn giản, sử dụng cùng một khóa để mã hóa và giải mã dữ liệu. Ví dụ, khi bạn mã hóa dữ liệu sử dụng khóa A, bạn cũng sẽ sử dụng khóa A để giải mã dữ liệu.
  • Asymmetric key (Khóa bất đối xứng): Đây là một cặp khóa, bao gồm khóa công khai và khóa bí mật. Khóa công khai được sử dụng để mã hóa dữ liệu, còn khóa bí mật được sử dụng để giải mã dữ liệu.

Các thành phần của Key usage:

  • Encrypt and Decrypt (Mã hóa và Giải mã): Được sử dụng để bảo vệ dữ liệu bằng cách mã hóa dữ liệu với một khóa và giải mã dữ liệu với cùng một khóa.
  • Generate and Verify MAC (Tạo và Xác thực MAC): Sử dụng để đảm bảo tính toàn vẹn của dữ liệu. MAC là viết tắt của Message Authentication Code – Mã xác thực thông điệp. Khi dữ liệu được mã hóa và gửi đi, MAC được tạo ra từ dữ liệu và khóa. Khi dữ liệu được nhận, MAC được xác thực để đảm bảo tính toàn vẹn của dữ liệu.

Các thành phần của Key material origin:

  • KMS: Key được quản lý bởi KMS.
  • External: Key được quản lý bởi một nhà cung cấp khác, sau đó được nhập vào KMS.
  • Custom key store: Key được lưu trữ trên phần cứng khác ngoài KMS và được quản lý bởi KMS.

Các thành phần của Regionality:

  • Single-Region key (Khóa trong một vùng): Key chỉ có thể được sử dụng trong một vùng.
  • Multi-Region key (Khóa đa vùng): Key có thể được sử dụng trong nhiều vùng.

Tạo 1 Alias cho khoá.

Khi tạo một chìa khóa trong KMS, bạn có thể chỉ định các người dùng và vai trò trong IAM (Identity and Access Management) để có quyền quản trị chìa khóa thông qua API của KMS. Những người dùng và vai trò này có thể thực hiện các thao tác quản trị như xóa chìa khóa, cấp phép cho người dùng khác sử dụng chìa khóa, thay đổi chính sách truy cập chìa khóa, và quản lý việc quay đổi (rotate) chìa khóa. Nếu cần, bạn cũng có thể cấp thêm quyền cho các người dùng và vai trò để quản trị chìa khóa từ giao diện quản lý KMS trên Console của AWS.

“Define key usage permissions” là phần cấu hình quyền sử dụng cho KMS key. Trong đó, phần “This account” cho phép lựa chọn các người dùng và vai trò (users và roles) trong IAM của tài khoản AWS hiện tại được phép sử dụng KMS key để thực hiện các hoạt động mã hóa (cryptographic operations). Các hoạt động này bao gồm mã hóa, giải mã, ký và xác minh.

Tính năng của KMS để cấu hình cho phép các tài khoản AWS khác có thể sử dụng được key hiện tại. Bằng cách thêm tài khoản AWS khác vào danh sách, quản trị viên có thể cho phép các tài khoản đó sử dụng key để thực hiện các hoạt động mã hóa hoặc giải mã. Tuy nhiên, các quản trị viên của các tài khoản này sẽ phải tự quản lý và cấu hình các quyền cho phép người dùng và vai trò IAM của họ sử dụng key.

Phần này cho phép bạn review lại các thiết lập, nội dung json chính là các thiết lập do bạn đã định nghĩa, mình sẽ giải thích đơn giản như sau:

Đây là một Policy (chính sách) của Key Management Service (KMS) trên AWS, cho phép người dùng IAM trong tài khoản AWS có ID là 783768293452 có quyền truy cập vào tất cả các tài nguyên KMS trên tất cả các khu vực AWS. Được cấp cho user chính là root user của tài khoản. Policy này có Effect là “Allow” nghĩa là cho phép tất cả các hành động (Action) đối với tất cả các tài nguyên (Resource) của KMS, được thực hiện bởi Principal là root user của tài khoản đó.

Và khoá của tôi đã được tạo.

Chúng ta có thể bấm Switch to policy để xem một số chính sách.

Bạn cũng có thể xoá khoá hoặc lên lịch để xoá nó.

Đầu tiên hãy tạo file lưu mật khẩu của bạn.

echo 'SuperSecretPassword' > ExampleSecretFile.txt

Sau đó chạy lệnh dưới đây, đây là một lệnh AWS CLI (Command Line Interface) để mã hóa một file văn bản bằng AWS KMS (Key Management Service). Cụ thể, lệnh sử dụng CMK (Customer Managed Key) với alias là “tutorial” để mã hóa file văn bản “ExampleSecretFile.txt”. Đầu ra của lệnh được định dạng dưới dạng văn bản base64 và lưu vào file “ExampleSecretFileEncrypted.base64”. Lệnh được thực thi trong khu vực “eu-west-2”.

aws kms encrypt --key-id alias/tutorial --plaintext fileb://ExampleSecretFile.txt --output text --query CiphertextBlob  --region eu-west-2 > ExampleSecretFileEncrypted.base64

Đoạn lệnh này là một lệnh dòng lệnh trên Linux hoặc Mac OS, được sử dụng để giải mã một file được mã hóa dạng base64.

Cụ thể, đầu tiên lệnh cat được sử dụng để đọc nội dung của file ExampleSecretFileEncrypted.base64, sau đó nội dung này được đưa đến lệnh base64 --decode. Lệnh này sẽ giải mã nội dung base64 và trả về nội dung gốc của file được lưu vào file ExampleSecretFileEncrypted.

Tóm lại, đoạn lệnh này được sử dụng để giải mã một file được mã hóa dạng base64 trên Linux hoặc Mac OS.

cat ExampleSecretFileEncrypted.base64 | base64 --decode > ExampleSecretFileEncrypted

Hoặc sử dụng lệnh sau để thực hiện trên Windows command prompt để giải mã một file được mã hoá theo định dạng base64. Cụ thể, lệnh sử dụng công cụ certutil tích hợp sẵn trong hệ điều hành Windows để thực hiện giải mã. Đầu vào của lệnh là file được mã hoá ExampleSecretFileEncrypted.base64 và đầu ra là file giải mã được lưu dưới tên ExampleSecretFileEncrypted.

certutil -decode .\ExampleSecretFileEncrypted.base64 .\ExampleSecretFileEncrypted

Chúng ta có file mới tên ExampleSecretFileEncrypted nhưng nó là một file mã hoá nhị phân nên chúng ta không thể đọc được nội dung của nó bằng các công cụ hiển thị văn bản thông thường. Để xem nội dung của file này, chúng ta phải giải mã nó bằng cách sử dụng KMS key đã sử dụng để mã hóa file.

Đoạn lệnh này dùng để giải mã nội dung của file đã được mã hóa trước đó bằng KMS key.

Cụ thể, thông qua lệnh aws kms decrypt, chúng ta cung cấp cho AWS KMS ciphertext blob (nội dung file đã được mã hóa trước đó) và AWS sử dụng KMS key để giải mã ciphertext.

Kết quả được xuất ra trong định dạng văn bản (text) thông qua tùy chọn --output text, và chỉ trả về nội dung đã giải mã, được truy vấn thông qua tùy chọn --query Plaintext. Sau đó, nội dung đã giải mã được ghi vào file ExampleFileDecrypted.base64.

Lưu ý rằng tùy chọn --region cũng được cung cấp để chỉ định vùng sử dụng KMS key.

aws kms decrypt --ciphertext-blob fileb://ExampleSecretFileEncrypted   --output text --query Plaintext > ExampleFileDecrypted.base64  --region eu-west-2

Và đây là nội dung sau khi giải mã.

Đoạn mã này giải mã nội dung đã được mã hóa trước đó bằng KMS. Kết quả giải mã được lưu trữ trong file ExampleFileDecrypted.base64. Sau đó, chúng ta sử dụng các lệnh base64 hoặc certutil (phù hợp với hệ điều hành) để giải mã file đó sang định dạng văn bản thông thường, lưu trữ nó trong file ExampleFileDecrypted.txt.

# base64 decode for Linux or Mac OS 
cat ExampleFileDecrypted.base64 | base64 --decode > ExampleFileDecrypted.txt

# base64 decode for Windows
certutil -decode .\ExampleFileDecrypted.base64 .\ExampleFileDecrypted.txt

Và cuối cùng bạn sẽ thấy mật khẩu gốc của bạn ở trong file ExampleFileDecrypted.txt

KMS Multi-Region Keys

KMS Multi-Region Keys là các khóa KMS giống nhau nằm ở các khu vực AWS khác nhau và có thể được sử dụng thay thế cho nhau. Các khóa Multi-Region có cùng ID khóa, vật liệu khóa, xoay tự động, … Cho phép mã hóa ở một khu vực và giải mã ở các khu vực khác mà không cần phải mã hóa lại hoặc thực hiện các cuộc gọi API chéo khu vực.

Khóa Multi-Region KMS không phải là toàn cầu (Primary + Replicas). Mỗi khóa Multi-Region được quản lý độc lập và được sử dụng để mã hóa và giải mã dữ liệu ở các khu vực khác nhau.

Các trường hợp sử dụng bao gồm: mã hóa phía máy khách toàn cầu, mã hóa trên Global DynamoDB, Global Aurora…

DynamoDB Global Tables and KMS MultiRegion Keys Client-Side encryption

Phần này giải thích về cách sử dụng mã hóa client-side trong DynamoDB Global Tables kết hợp với KMS Multi-Region Keys.

Trong DynamoDB Global Tables, chúng ta có thể mã hóa các thuộc tính cụ thể client-side bằng cách sử dụng Amazon DynamoDB Encryption Client. Khi kết hợp với Global Tables, dữ liệu được mã hóa client-side sẽ được sao chép sang các khu vực khác. Nếu chúng ta sử dụng một KMS Multi-Region key, được sao chép sang cùng khu vực như DynamoDB Global table, thì các khách hàng ở các khu vực này có thể sử dụng các cuộc gọi API có độ trễ thấp đến KMS trong khu vực của họ để giải mã dữ liệu client-side.

Sử dụng mã hóa client-side giúp chúng ta bảo vệ các trường dữ liệu cụ thể và đảm bảo chỉ có thể giải mã nếu khách hàng có quyền truy cập vào khóa API.

Global Aurora and KMS Multi-Region Keys Client-Side encryption

Phần này mô tả về việc sử dụng KMS Multi-Region Keys và client-side encryption trong trường hợp sử dụng Global Aurora. Cụ thể, để bảo mật dữ liệu trong các trường hợp này, ta có thể sử dụng AWS Encryption SDK để mã hoá các thuộc tính cụ thể trong bảng Aurora. Khi kết hợp với Aurora Global Tables, dữ liệu được mã hoá theo cách này sẽ được sao chép sang các vùng khác nhau. Nếu ta sử dụng một khóa KMS Multi-Region được sao chép sang các khu vực tương ứng với cơ sở dữ liệu Aurora Global, thì người dùng trong các vùng này có thể sử dụng các cuộc gọi API trễ thấp đến KMS trong khu vực của mình để giải mã dữ liệu được mã hoá theo client-side encryption. Sử dụng client-side encryption giúp ta bảo vệ các trường dữ liệu cụ thể và đảm bảo chỉ có khóa API mới có thể giải mã dữ liệu, ngay cả khi các quản trị viên cơ sở dữ liệu cũng không thể xem được các thông tin này.

S3 Replication Encryption Considerations

Khi sử dụng chức năng S3 Replication trên AWS, ta cần lưu ý đến việc mã hóa các object được sao chép.

  • Đối với các object chưa được mã hóa hoặc đã được mã hóa bằng SSE-S3 (Server-Side Encryption), chúng sẽ được sao chép mặc định.
  • Đối với các object được mã hóa bằng SSE-C (Customer Provided Key), chúng sẽ không bao giờ được sao chép.
  • Đối với các object được mã hóa bằng SSE-KMS, ta cần bật tùy chọn và chỉ định KMS Key để mã hóa các object trong bucket đích. Sau đó, ta cần điều chỉnh KMS Key Policy cho target key, cấp quyền cho một IAM Role để decrypt KMS Key ở nguồn và encrypt KMS Key ở đích. Trong quá trình sao chép, có thể xảy ra lỗi KMS throttling, khi đó cần yêu cầu tăng Service Quotas để giải quyết vấn đề này.
  • Ta có thể sử dụng KMS Multi-Region Keys nhưng hiện tại chúng được xử lý như những key độc lập bởi Amazon S3, tức là object sẽ được giải mã và mã hóa lại trước khi sao chép.

AMI Sharing Process Encrypted via KMS

Quá trình Chia sẻ AMI được Mã hóa thông qua KMS

  • AMI trong Tài khoản nguồn được mã hóa bằng Khóa KMS từ Tài khoản nguồn
  • Phải sửa đổi thuộc tính hình ảnh để thêm Quyền khởi chạy tương ứng với tài khoản AWS đích được chỉ định
  • Phải chia sẻ KMS Keys được sử dụng để mã hóa bản snapshot tham chiếu AMI với tài khoản / Vai trò IAM đích
  • Vai trò / Người dùng IAM trong tài khoản đích phải có quyền truy cập để Mô tả Khóa, Mã hóa lại, Tạo quyền, Giải mã
  • Khi khởi chạy một EC2 instance từ AMI, tùy chọn tài khoản đích có thể chỉ định một Khóa KMS mới trong tài khoản của mình để mã hóa lại các ổ đĩa.
Previous article
Next article

LEAVE A REPLY

Please enter your comment!
Please enter your name here

4,956FansLike
256FollowersFollow
223SubscribersSubscribe
spot_img

Related Stories