Cách bảo mật các đối tượng S3 bằng tính năng mã hóa của Amazon S3
Nhiều doanh nghiệp lưu trữ dữ liệu trên các dịch vụ lưu trữ đám mây. Các dịch vụ lưu trữ đám mây hiện nay rất phổ biến nhờ độ tin cậy cao và khả năng sẵn sàng tốt, hai yếu tố vô cùng quan trọng đối với hoạt động kinh doanh. Amazon là một trong những nhà cung cấp hàng đầu về dịch vụ đám mây công cộng trên thị trường. Các dịch vụ này được gọi là Amazon Web Services (AWS). Amazon cung cấp mức độ bảo mật cao, bao gồm kết nối mạng được mã hóa dùng để truy cập tệp tin và dịch vụ. Việc mã hóa giúp giảm thiểu rủi ro dữ liệu bị đánh cắp qua mạng. Dữ liệu là yếu tố then chốt đối với mọi doanh nghiệp và người dùng. Không ai muốn dữ liệu của mình bị mất, hỏng hoặc bị đánh cắp.
Vì lý do này, Amazon cung cấp các tùy chọn mã hóa để lưu trữ dữ liệu trên các dịch vụ lưu trữ đám mây khác nhau của mình. Các tùy chọn lưu trữ đám mây này bao gồm EBS volumes, một giải pháp lưu trữ hiệu suất cao dành cho máy ảo (instances), và Amazon S3, một dịch vụ lưu trữ đám mây được phát triển để lưu trữ bản sao lưu, tệp lưu trữ, tệp ứng dụng và các loại dữ liệu khác. Bạn có thể mã hóa các bucket Amazon S3 và các tệp được lưu trữ trong các bucket đó bằng cách sử dụng các tùy chọn mã hóa của AWS. Bài viết này trình bày về mã hóa Amazon S3, bao gồm các loại mã hóa và cấu hình.
Giới thiệu về mã hóa dữ liệu
Mã hóa dữ liệu là quá trình bảo mật dữ liệu bằng cách mã hóa thông tin. Dữ liệu được mã hóa bằng mật khẩu hoặc khóa mã hóa (cypher) và các thuật toán mã hóa đặc biệt. Sau đó, dữ liệu đã được mã hóa có thể được truy cập bằng cách sử dụng mật khẩu hoặc khóa mã hóa (giải mã) chính xác. Mã hóa dữ liệu được sử dụng để bảo vệ tính bảo mật của dữ liệu kỹ thuật số ngay cả khi một người không được phép có được quyền truy cập logic hoặc vật lý vào dữ liệu đó. Nếu một người không được ủy quyền truy cập vào dữ liệu đã được mã hóa, dữ liệu đó sẽ không thể đọc được nếu không có khóa hoặc mật khẩu. Các thuật toán mã hóa hiện đại khiến việc bẻ khóa một khóa mã hóa dài hoặc mật khẩu phức tạp trở nên khó khăn và gần như không thể. Có thể sử dụng các thuật toán mã hóa khác nhau, ví dụ như AES, 3DES, RSA, Blowfish, v.v. Các loại mật mã chính là mật mã khóa đối xứng và mật mã khóa bất đối xứng.
Amazon khuyến nghị sử dụng mã hóa S3 khi lưu trữ dữ liệu trong các thùng S3 của Amazon. Lý do đầu tiên cho khuyến nghị này là bảo mật. Mã hóa tăng cường mức độ bảo mật và quyền riêng tư. Tuy nhiên, còn có một lý do khác giải thích tại sao dữ liệu lưu trữ trên đám mây nên được mã hóa. Amazon lưu trữ dữ liệu của người dùng từ các quốc gia khác nhau. Đôi khi một quốc gia có thể yêu cầu cung cấp dữ liệu để phục vụ điều tra nếu một khách hàng hoặc tổ chức bị nghi ngờ vi phạm pháp luật. Tuy nhiên, Amazon phải tuân thủ thỏa thuận cấp phép và luật pháp của các quốc gia khác (các quốc gia mà công dân của họ là khách hàng của Amazon) và xung đột có thể xảy ra.
Nếu dữ liệu của người dùng được mã hóa và Amazon không có khóa mã hóa, dữ liệu của người dùng không thể được cung cấp cho các tổ chức hoặc cá nhân bên thứ ba (ngay cả khi dữ liệu mã hóa được cung cấp, đó chỉ là một tập hợp các bit vô dụng và không thể đọc được). Hãy tưởng tượng một tình huống trong đó Hoa Kỳ yêu cầu dữ liệu từ một khách hàng Amazon ở châu Âu để điều tra. Phải làm gì trong trường hợp này? Như bạn có thể đã biết, dữ liệu cá nhân của công dân châu Âu được bảo vệ bởi Quy định chung về bảo vệ dữ liệu (GDPR). Đọc thêm về điều này trong tài liệu trắng Quy định chung về bảo vệ dữ liệu của Liên minh Châu Âu.
Các loại mã hóa Amazon S3
Cách thức hoạt động của mã hóa S3? Amazon cung cấp nhiều loại mã hóa cho dữ liệu được lưu trữ trong Amazon S3. Dữ liệu S3 có được mã hóa không? Theo mặc định, dữ liệu trong thùng S3 không được mã hóa, nhưng bạn có thể cấu hình cài đặt mã hóa AWS S3.
Bạn nên xác định phương pháp mã hóa nào sẽ sử dụng sau khi trả lời các câu hỏi sau:
- Ai là người mã hóa và giải mã dữ liệu?
- Ai là người lưu trữ khóa bí mật?
- Ai là người quản lý khóa bí mật?
Hãy cùng xem xét các phương pháp mã hóa AWS hiện có dành cho các đối tượng S3 được lưu trữ trong một bucket.
Mã hóa phía máy chủ
Mã hóa phía máy chủ (SSE) là tùy chọn mã hóa dữ liệu đơn giản nhất. Tất cả các thao tác mã hóa phức tạp đều được thực hiện ở phía máy chủ trên đám mây AWS. Bạn gửi dữ liệu thô (chưa được mã hóa) đến AWS và sau đó dữ liệu được mã hóa ở phía AWS khi được ghi vào bộ lưu trữ đám mây. Khi bạn cần lấy lại dữ liệu, Amazon sẽ đọc dữ liệu đã mã hóa, giải mã dữ liệu cần thiết trên máy chủ Amazon, sau đó gửi dữ liệu chưa mã hóa cho bạn qua mạng. Quy trình này hoàn toàn tự động đối với người dùng cuối.
SSE-S3 là phương pháp đơn giản nhất – các khóa được AWS quản lý và xử lý để mã hóa dữ liệu bạn đã chọn. Bạn không thể xem trực tiếp khóa này hoặc sử dụng khóa này thủ công để mã hóa hoặc giải mã dữ liệu. AES-256 được sử dụng làm thuật toán mã hóa. AES (Advanced Encryption Standard) là một thuật toán mã hóa khối đối xứng, với độ dài khóa mã hóa là 256 bit. Nếu bạn hoàn toàn tin tưởng AWS, hãy sử dụng phương pháp mã hóa S3 này.
SSE-KMS là một phương pháp hơi khác so với SSE-S3. Dịch vụ Quản lý Khóa AWS (KMS) được sử dụng để mã hóa dữ liệu S3 trên máy chủ Amazon. Khóa dữ liệu được quản lý bởi AWS, nhưng người dùng quản lý Khóa chính của khách hàng (CMK) trong AWS KMS. Ưu điểm của việc sử dụng loại mã hóa SSE-KMS là quyền kiểm soát của người dùng và nhật ký kiểm tra.
Với SSE-C, các khóa được cung cấp bởi khách hàng và AWS không lưu trữ các khóa mã hóa. Khóa được cung cấp sẽ được truyền vào AWS để xử lý từng yêu cầu liên quan đến mã hóa hoặc giải mã dữ liệu. Người dùng phải đảm bảo an toàn cho các khóa. Mã hóa dữ liệu S3 được thực hiện trên máy chủ AWS. Chỉ có thể sử dụng kết nối HTTPS (không phải HTTP).
Mã hóa phía khách hàng
Khi sử dụng mã hóa phía khách hàng S3, khách hàng chịu trách nhiệm cho tất cả các hoạt động mã hóa. Trong trường hợp này, dữ liệu không được mã hóa bởi AWS mà được mã hóa ở phía người dùng. Dữ liệu được mã hóa tại trung tâm dữ liệu của người dùng sẽ được tải lên trực tiếp lên AWS. Có hai tùy chọn cho mã hóa phía khách hàng S3 – khóa chính có thể được lưu trữ ở phía khách hàng hoặc ở phía máy chủ. Nếu khóa chính được lưu trữ ở phía khách hàng, khách hàng sẽ chịu trách nhiệm hoàn toàn về việc mã hóa. Ưu điểm của phương pháp này là Amazon không bao giờ biết các khóa mã hóa của người dùng và dữ liệu không bao giờ được lưu trữ trên máy chủ Amazon ở trạng thái không được mã hóa. Người dùng sẽ mã hóa dữ liệu trước khi gửi lên Amazon S3 và giải mã dữ liệu sau khi lấy dữ liệu từ Amazon S3.
Amazon S3 Encryption Client là gì?
Amazon S3 Encryption Client được sử dụng để mã hóa dữ liệu tại phía người dùng. Một khóa mã hóa dùng một lần sẽ được tạo ngẫu nhiên và được sử dụng để mã hóa dữ liệu ở cấp độ từng đối tượng, có nghĩa là trong cùng một bucket Amazon S3 có thể chứa cả các đối tượng đã được mã hóa và chưa được mã hóa. AmazonS3EncryptionClient là một lớp công khai cho AWS SDK. Bạn có thể sử dụng AWS SDK cho Java, C++, Python, .NET và các ngôn ngữ lập trình được hỗ trợ khác để tạo ứng dụng của riêng mình hoạt động với Amazon S3 và có thể được sử dụng để mã hóa dữ liệu gửi đến S3 cũng như giải mã dữ liệu nhận từ S3 ở phía khách hàng.
Cách cấu hình mã hóa AWS S3?
- Đăng nhập vào giao diện web của AWS. Tài khoản của bạn phải có đủ quyền để chỉnh sửa cài đặt S3.
- Truy cập trang Amazon S3 (liên kết có thể khác nhau tùy theo khu vực và tài khoản của bạn):
https://s3.console.aws.amazon.com/s3/home
- Chọn bucket của bạn hoặc tạo một bucket mới mà bạn muốn cấu hình cài đặt mã hóa.
- Trên trang cài đặt bucket, nhấp vào tab
Propertiesvà sau đó nhấp vàoDefault encryption.
- Cài đặt mã hóa hiện đã mở. Theo mặc định, tùy chọn mã hóa thùng S3 bị tắt.
- Chọn tùy chọn cần thiết, ví dụ: AES-256. Đây là mã hóa phía máy chủ với khóa do Amazon S3 quản lý (SSE-S3). Bạn có thể xem chính sách thùng. Nhấp vào
Saveđể lưu cài đặt mã hóa cho thùng. Các cài đặt này sẽ được sử dụng làm cài đặt mã hóa S3 mặc định cho các đối tượng được thêm vào thùng này trong tương lai.
- Nhấp vào
Save. - Bây giờ mã hóa mặc định đã được thiết lập. Tất cả các đối tượng mới được lưu trữ trong thùng S3 sẽ được mã hóa theo cấu hình đã thiết lập. Khuyến nghị bạn nên bật mã hóa khi tạo thùng. Bạn cũng có thể bật mã hóa sau này ở cấp độ thùng. Tuy nhiên, nếu bạn cấu hình cài đặt mã hóa sau này, các cài đặt này sẽ không ảnh hưởng đến các tệp chưa được mã hóa đã được tải lên thùng trước đó.

- Nếu bạn muốn chọn mã hóa AWS-KMS, hãy nhấp vào tùy chọn tương ứng. Trong trường hợp này, hãy chọn một khóa từ danh sách thả xuống.

Mã hóa các đối tượng tùy chỉnh trong bucket
Hãy cùng tìm hiểu cách mã hóa các đối tượng tùy chỉnh đã được tải lên bucket và có cài đặt mã hóa được đặt thành None .
Mở bucket của bạn trong giao diện web của AWS. Bạn có thể xem các đối tượng S3 của mình trong tab Overview . Nhấp vào đối tượng (tệp hoặc thư mục) để xem các cài đặt mã hóa hiện tại được áp dụng cho đối tượng này. Thuộc tính và quyền truy cập của đối tượng sẽ được hiển thị trong cửa sổ bật lên. Như bạn có thể thấy trên ảnh chụp màn hình bên dưới, tệp đã tải lên chưa được mã hóa (Encryption: None).
Chọn một hoặc nhiều đối tượng, nhấp vào Actions và sau đó nhấp vào Change encryption để thay đổi cài đặt mã hóa cho các đối tượng tùy chỉnh trong thùng S3 của bạn.
Trong cửa sổ hiện ra, chọn loại mã hóa cần thiết, ví dụ: AES-256, và nhấp vào Save.
Trong cửa sổ xác nhận, kiểm tra các đối tượng đã chọn sẽ bị ảnh hưởng bởi cài đặt mã hóa mới và nhấp vào Change.
Bây giờ mã hóa đã được thiết lập cho các đối tượng đã chọn.
Lưu ý rằng sau khi bạn thiết lập cài đặt mã hóa cho toàn bộ bucket, các tệp đã được tải lên bucket trước khi bật mã hóa sẽ không được mã hóa. Nếu có số lượng lớn đối tượng trong thùng S3 của bạn, việc tìm kiếm và chọn tất cả các đối tượng chưa được mã hóa cần mã hóa có thể gặp khó khăn. Để chọn các đối tượng chưa được mã hóa trong một thùng đã bật mã hóa, bạn có thể sử dụng Amazon S3 Inventory hoặc AWS CLI.
Bạn nên xác định các đối tượng chưa được mã hóa và sau đó có thể tải lại các đối tượng đó để mã hóa chúng với mức mã hóa thùng S3 mặc định được thiết lập cho toàn bộ thùng. Nếu bạn không muốn tìm kiếm các đối tượng S3 chưa được mã hóa trong bucket của mình (ví dụ: bucket1), bạn có thể tạo một bucket mới (bucket2), sao chép tất cả các tệp từ bucket1 sang bucket2, sau đó sao chép tất cả các tệp trở lại từ bucket2 sang bucket1.
Bạn có thể sao chép các đối tượng chưa được mã hóa bằng cách ghi đè chúng bằng lệnh AWS CLI ` copy ` bằng cách định nghĩa phương thức mã hóa, ví dụ: ` --sse ` kích hoạt mã hóa SSE-S3 128-bit mà không cần tạo bucket mới:
aws s3 cp s3://mybucket/myfile.zip s3://mybucket/myfile.zip --sse
Sau khi ghi đè, tệp sẽ được mã hóa. Lưu ý rằng các thuộc tính tệp như thời gian tạo và sửa đổi tệp sẽ thay đổi sau khi ghi đè. Các ứng dụng của bạn có thể đọc các thuộc tính này (ngày và giờ tạo/sửa đổi tệp) và sử dụng chúng để làm việc với các tệp được lưu trữ trong các bucket Amazon S3 có thể không hoạt động như mong đợi sau khi ghi lại các tệp.
Nếu các tùy chọn quản lý vòng đời được bật cho bucket AWS S3 của bạn nhằm tiết kiệm chi phí, một số vấn đề có thể xảy ra. Ví dụ: bạn có thể đặt cấu hình vòng đời để xóa các tệp được tạo hoặc sửa đổi cách đây 6 tháng. Các tệp cũ sẽ tự động bị xóa, dung lượng lưu trữ trên đám mây được sử dụng ít hơn và bạn sẽ phải trả ít tiền hơn cho dịch vụ lưu trữ đám mây. Khi dấu thời gian LastModified (ngày/giờ sửa đổi lần cuối) của tệp được ghi đè cho một tệp cũ sắp bị xóa, tính năng quản lý vòng đời sẽ nhận diện tệp này là tệp mới được tạo và không nên xóa trong một thời gian dài (ví dụ: trong 6 tháng, như đã đề cập ở trên). Kết quả là, sẽ có nhiều tệp hơn được lưu trữ trong bucket, dẫn đến chi phí cao hơn.
Nếu tính năng phiên bản được bật, một phiên bản được mã hóa mới của đối tượng sẽ được tạo. Các phiên bản trước của đối tượng vẫn được giữ nguyên không mã hóa.
Tải lên đối tượng qua AWS CLI
AWS CLI có thể được sử dụng trong các trường hợp khác khi bạn cần sao chép tệp lên Amazon S3 hoặc từ Amazon S3 với các tùy chọn mã hóa. Bạn cũng có thể sử dụng giao diện dòng lệnh này để sao chép các đối tượng trong cùng một thùng S3 và từ thùng này sang thùng khác. Bạn có thể thiết lập các tùy chọn mã hóa cho các tệp đang được tải lên bằng cách sử dụng CLI vào thùng trong trường hợp cài đặt mã hóa mặc định của thùng và cài đặt mã hóa phải được sử dụng cho các tệp đang được tải lên là khác nhau. Hãy xem các ví dụ về việc sử dụng các lệnh AWS CLI trong bash.
Sao chép một tệp từ máy tính cục bộ vào thùng chứa AWS S3 và thiết lập mã hóa phía máy chủ (SSE-S3):
aws s3 cp /directory/file-name s3://bucket-name/file-encrypted --sse AES256
Sao chép và giải mã một tệp từ AWS S3 vào đĩa cục bộ:
aws s3 cp s3://bucket-name/file-encrypted /directory/file-name
Tải lên và mã hóa tệp từ đĩa cục bộ vào thùng chứa S3 bằng cách sử dụng mã hóa SSE-KMS:
aws s3 cp /directory/file-name s3://bucket-name/file-encrypted --sse aws:kms
Tải xuống và giải mã một tệp từ thùng chứa S3 vào đĩa cục bộ:
aws s3 cp s3://bucket-name/file-encrypted /directory/file-name
Kết luận
Mã hóa Amazon S3 giúp bạn bảo vệ dữ liệu được lưu trữ trong các thùng S3 trên đám mây, và điều này đặc biệt quan trọng đối với dữ liệu nhạy cảm. Mã hóa AWS S3 có thể được thực hiện ở phía máy chủ của Amazon và ở phía khách hàng. Các khóa bí mật có thể được lưu trữ ở phía máy chủ và phía khách hàng. Nếu bạn đang cân nhắc sử dụng mã hóa Amazon S3 cho các đối tượng sẽ được lưu trữ trong các thùng S3, hãy bật mã hóa khi tạo thùng. Nếu bạn đã sử dụng một bucket và các đối tượng được lưu trữ trong bucket đó chưa được mã hóa, bạn có thể kích hoạt mã hóa cho các đối tượng đó. Tuy nhiên, trong trường hợp này, có một số vấn đề bạn cần lưu ý.
Việc sử dụng mã hóa là một ý tưởng tốt để nâng cao mức độ bảo mật và bảo vệ dữ liệu của bạn khỏi sự truy cập của bên thứ ba. Ngoài việc sử dụng mã hóa AWS, hãy xem xét thực hiện sao lưu AWS S3 và Sao lưu AWS EC2 để tăng cường an toàn cho dữ liệu của bạn.



