1. Mở đầu

Đầu tiên bạn cần làm rõ một điều như sau: AWS KMS không phải là dịch vụ nhằm mục đích mã hoá - giải mã dữ liệu mà nó là dịch vụ quản lý các khoá dùng để mã hoá dữ liệu.

AWS KMS viết tắt cho AWS Key Management Service, là một dịch vụ để quản lý khoá (key) hay dữ liệu nhạy cảm.

Bài toán đặt ra là khi bạn sử dụng các key để mã hoá dữ liệu, bạn muốn các key này phải được bảo mật nên bạn lại mã hoá các key này đi bằng các key khác. Đến cuối cùng, các key cuối cùng dùng để mã hoá lại không được mã hoá. Để giải quyết vấn đề trên, AWS đưa ra dịch vụ AWS KMS.

AWS KMS sẽ quản lý các key dùng để mã hoá các key mã hoá dữ liệu của mình.

Ví dụ: Bạn dùng data key để mã hoá câu "Tôi đẹp trai", bạn sẽ dùng master key để mã hoá data key, master key này chính là khoá mà AWS KMS sẽ lưu trữ và quản lý. Lúc này, master key là khoá để tạo ra data key, và data key là khoá để mã hoá dữ liệu quan trọng của bạn.

Chú ý một điều là AWS KMS không cho phép bạn nhìn thấy khoá của mình (master key trong trường hợp trên), nó chỉ cho phép bạn gọi tới thông qua Key ID để lấy ra data key cho việc mã hoá và giải mã. Chính vì bạn cũng không thể nhìn thấy master key nên dịch vụ này khá an toàn.

Giả sử một hacker nào đó có được dữ liệu đã mã hoá của bạn, muốn đọc được dữ liệu đó họ sẽ phải bằng cách nào đó lấy được data key, họ có thể lấy được data key bằng những cách sau:

  • Họ biết được master key để sinh ra data key  -> điều này dường như là không thể vì master key được quản lý bởi AWS KMS và chính bạn cũng không nhìn thấy được nó.
  • Họ có thông tin aws credential của bạn và họ có thể gọi tới AWS KMS để lấy data key -> nếu để lộ aws credential cho hacker thì đó là một vấn đề lớn rồi.
  • Họ bắt được gói tin trả về khi bạn request tới AWS KMS để lấy data key -> trường hợp này cũng khó xảy ra vì mọi API của AWS đều mã hoá bằng giao thức TLS.

 

2. Sử dụng AWS KMS như thế nào?

AWS KMS có 2 cách sử dụng chính:

  • Cách 1: Gửi plaintext lên AWS KMS để mã hoá.
  • Cách 2: Gọi api lên AWS KMS để lấy data key nhằm mã hoá ở client.

 

Ở cách 1, dữ liệu dạng plaintext được gửi trực tiếp lên AWS KMS (tất nhiên phải thông qua chuẩn mã hoá TLS khi gửi lên) để dịch vụ mã hoá trên đó nên sẽ có vấn đề về dung lượng dữ liệu và tốc độ mã hoá.

AWS KMS chỉ cho phép mã hoá dữ liệu có dung lượng tối đa 4KB khi mã hoá bằng cách 1.

KMS sử dụng chủ yếu ở cách 2 là gọi api để lấy data key và mã hoá dữ liệu ở client. Để hiểu thêm về cách 2 thì bạn đọc bài https://blog.daovanhung.com/post/giai-thich-cach-hoat-dong-cua-aws-encryption-sdk

 

Link tham khảo:

https://aws.amazon.com/kms/

https://docs.aws.amazon.com/crypto/latest/userguide/awscryp-choose-kms.html

https://aws.amazon.com/kms/faqs/