see more blog

Các phương pháp tốt nhất để bảo mật cho dịch vụ Amazon S3

vti cloud security for amazon s3

Dịch vụ Amazon Simple Storage Service (Amazon S3) là một trong các dịch vụ nổi tiếng để lưu trữ dữ liệu trên đám mây của Amazon Web Services (AWS). Dịch vụ này được bảo mật theo các chính sách mặc định của AWS, tuy nhiên, việc vô tình làm lộ dữ liệu lưu trữ trong các bucket là dễ dàng xảy ra nếu như bắt đầu thay đổi các cấu hình mặc định sẵn có hoặc bỏ qua các cảnh báo.

Trong bài viết dưới đây, VTI Cloud sẽ điểm qua một số bước quan trọng để bảo vệ dữ liệu được lưu trữ trong dịch vụ Amazon S3.

Bước 1: Đặt tên S3 Bucket (Bucket Naming)

Bước đầu tiên trong việc bảo mật của Amazon S3 hay thường được người dùng bỏ qua, đó là việc đặt tên cho bucket.

Trên Internet, bạn sẽ dễ dàng tìm được các công cụ để quét và liệt kê (enumerate) tên các bucket đang công khai (public) như bucket-stream và S3Scanner. Nếu vô tình cấu hình public thì bucket của tổ chức sẽ dễ dàng bị các công cụ phía trên “nhìn thấy” và dữ liệu trong bucket sẽ có khả năng bị rò rỉ.

Các tên bucket được phân giải bởi DNS để tên bucket có thể được tìm thấy trên DNS logs hoặc khi public. AWS sẽ cung cấp một đường link để người dùng có thể kết nối tới S3 Bucket, chẳng hạn như tenbucket.s3.amazonaws.com.

* Cách đặt tên bucket hiệu quả

Lời khuyên của VTI Cloud, cũng như từ phía AWS, là tên của bucket (bucket name) trong Amazon S3 nên là duy nhất (unique) và hạn chế trùng với bất kỳ bucket nào khác. Bucket name này chỉ có bạn có thể nhận dạng được, nhưng không cho manh mối tên bucket này thuộc về ai/tổ chức nào.

Ví dụ: Khi đặt tên cho bucket lưu trữ dữ liệu có tính bảo mật cao, bạn có thể đặt tên là data-1-abcdef. Với “data” là mục đích của dữ liệu lưu trữ trong bucket, “1” để thể hiện rằng dữ liệu này chỉ bạn hoặc nhóm của bạn biết (có thể đánh “2” với các dữ liệu public) và “abcdef” là cụm chữ hoặc số ngẫu nhiên.

Bạn nên hạn chế sử dụng Account ID của AWS trong bucket name vì sẽ dễ bị lộ thông tin và danh tính của doanh nghiệp.

bucket naming

Bước 2: Thiết lập theo dõi và giám sát log cho Amazon S3

Các request tới S3 bucket ở cấp độ bucket như tạo hoặc xóa các bucket đều có thể được theo dõi bởi dịch vụ AWS CloudTrail. Do đó, VTI Cloud khuyến khích bật dịch vụ AWS CloudTrail và đặt CloudTrail logs trong một account riêng biệt (không liên quan tới các dịch vụ khác và để permission read-only như AWSCloudTrailReadOnlyAccess) để đảm bảo an toàn.

Tìm hiểu về AWS CloudTrail Identity-Based Policy: AWS CloudTrail Identity-Based Policy Examples – AWS CloudTrail (amazon.com)

Ngoài các hành động ở cấp bucket phía trên, VTI Cloud cũng khuyến khích ghi lại log của các hành động bên trong bucket, ví dụ các hành động PUT, GET và DELETE các object, giúp bạn theo dõi ai hoặc cái gì đã truy cập (hoặc cố gắng truy cập) dữ liệu của bạn.

2.1. Giám sát log cho Amazon Simple Storage Service

Có 02 cách chính để giám sát log ở Amazon S3, bao gồm CloudTrail object level logging và S3 server access logging. VTI Cloud khuyên bạn nên kích hoạt ít nhất một trong các phương pháp này, việc sử dụng CloudTrail là tùy chọn dễ dàng nhất.

CloudTrail logs ghi lại request được thực hiện tới S3, địa chỉ IP, người thực hiện request, date stamp một số chi tiết khác.

S3 server access logs cung cấp các log record dạng newline-delimited có thể chứa các chi tiết bổ sung để giúp bạn điều tra. Có thểm đọc thêm S3 server access log format tại: Amazon S3 server access log format – Amazon Simple Storage Service

s3 cloudtrial

2.2. Thiết lập các cảnh báo đi kèm

Bên cạnh việc giám sát log, bạn vẫn nên thiết lập một số cảnh báo (alarm) với Amazon CloudWatch trên các metrics của Amazon S3 (Amazon CloudWatch request metrics for Amazon S3).

Đọc thêm: CloudWatch metrics configurations – Amazon Simple Storage Service.

Ví dụ, khi bucket chỉ sử dụng để lưu trữ CloudTrail logs thì sẽ có cảnh báo mỗi khi object bị xóa (nhưng PUT và GET request có ngưỡng thấp). Trường hợp này thường xảy ra khi bị kẻ tấn công che dấu dấu vết trong Amazon S3.

Ngoài ra, tùy theo support plan của AWS Account của tổ chức / bạn mà có thể sử dụng AWS Trusted Advisor’s Amazon S3 bucket permissions check để kiểm tra quyền truy cập mở (open access permission).

2.3. Sử dụng Amazon GuardDuty

Amazon GuardDuty là một dịch vụ phát hiện mối đe dọa thông minh mà bạn nên kích hoạt để giúp phát hiện các mối đe dọa và sự bất thường, đồng thời có tính năng bảo vệ Amazon S3 protection.

Tính năng này cho phép GuardDuty giám sát các hoạt động ở cấp độ object để xác định các rủi ro bảo mật tiềm ẩn đối với dữ liệu trong các S3 Bucket.

Nếu bạn đã kích hoạt dịch vụ Amazon GuardDuty, hãy truy cập bảng điều khiển (ở mỗi region bạn đã kích hoạt) và xác minh rằng bạn đã bật tính năng bảo vệ Amazon S3 protection.

Ví dụ về một mô hình có sử dụng Amazon GuardDuty với Amazon S3:

s3 guardDuty

2.4. Access Analyzer for S3

Access Analyzer for S3 thông báo cho bạn biết các S3 Bucket được cấu hình để cho phép truy cập bởi bất kỳ ai trên internet hoặc bởi các account AWS khác (cả bên trong và bên ngoài tổ chức).

Ví dụ: Access Analyzer for S3 có thể cho thấy rằng một bucket có quyền đọc hoặc ghi được cung cấp thông qua bucket access control list (ACL), bucket policy hoặc access point policy. Access Analyzer for S3 hoạt động bằng cách kích hoạt IAM Access Analyzer trước.

Bước 3: Mã hóa dữ liệu cho Amazon S3

Mã hóa được coi là lớp bảo mật bổ sung để kiểm soát truy cập tới dữ liệu của Amazon S3. Mã hóa sẽ giúp kiểm soát sâu hơn về quyền truy cập vào bucket của mình.

Có nhiều tùy chọn mã hóa trong Amazon S3, tuy nhiên, cách dễ nhất để kích hoạt cũng là cách dễ sử dụng nhất và cũng rất an toàn là mã hóa phía máy chủ (server-side encryption) mặc định bằng AWS Key Management Service. Mã hóa mặc định sẽ có hiệu lực với tất cả bucket mới cũng như đang có.

Nếu không sử dụng mã hóa mặc định của KMS, bạn phải tìm cách mã hóa các request tới các object trong bucket và phải thiết lập bucket policy từ chối các request không được mã hóa.

* Lưu ý khi cấu hình AWS KMS

  1. Khi sử dụng KMS key thì cần chú ý tới request quotas trên mỗi giây, nếu dưới 5000 requests/giây thì đừng quá lo lắng. Khi đạt ngưỡng thì AWS KMS sẽ trả về ThrottlingException error như sau:

You have exceeded the rate at which you may call KMS. Reduce the frequency of your calls.
(Service: AWSKMS; Status Code: 400; Error Code: ThrottlingException; Request ID: <ID>

2. Nên cân nhắc sử dụng các key khác nhau cho các mức độ nhạy cảm của dữ liệu, và quyền truy cập của từng key sẽ phải khác nhau.

Ví dụ, mỗi KMS key sẽ sử dụng cho các bucket khác nhau trong cùng một account AWS thì dữ liệu và mức độ nhạy cảm ở mỗi bucket là khác nhau.

3. Sử dụng AWS Key Management Service Key (SSE-KMS) và chọn customer key của riêng bạn để kích hoạt tính năng mã hóa mặc định:

server-side encryption

Bước 4: Quản lý truy cập

4.1. Ngăn chặn truy cập vào Amazon S3 từ bên ngoài (Public)

Bạn có thể dễ dàng thiết lập kiểm soát tập trung để giới hạn quyền truy cập công khai (public access) vào các S3 bucket bất kể là bucket cũ hay mới.

Các bucket hoặc object ACL “public” chỉ khi các thành viên được cấp quyền truy cập được định danh là người dùng của group AllUsers và group AuthenticatedUsers.

Nếu request được thực hiện từ các Amazon S3 Access Point, Amazon S3 sẽ kiểm tra xem các chính sách cấm truy cập public có được áp dụng cho Access Point hay không và sẽ từ chối request này nếu chính sách được áp dụng.

Có rất nhiều cấu hình khác nhau cho block public access, VTI Cloud khuyến khích nên kích hoạt toàn bộ (Block all public access). Tuy nhiên, vẫn cần phải kiểm tra logs của các bucket để tránh tình trạng chặn các request từ nguồn hợp lệ.

block public access

4.2. Access Control List (ACLs), AWS Identity and Access Management (IAM) và Bucket Policy

ACLs là một trong những cách cơ bản để cấp quyền truy cập vào các bucket. ACL dựa trên tài nguyên – trong trường hợp này là S3 bucket – để quản lý quyền truy cập (trái ngược với dựa trên danh tính như users / roles như AWS Identity and Management). Với AWS IAM, IAM policy sẽ tác động tới cấp độ bucket và cấp độ object.

Khi bạn tạo một bucket hoặc một object, Amazon S3 sẽ tạo một ACL mặc định, cấp cho chủ sở hữu tài nguyên toàn quyền kiểm soát tài nguyên. Bạn cũng có thể đính kèm S3 ACLs vào từng object trong bucket để quản lý quyền truy cập tới các object đó

Mẫu ACL cấp quyền truy cập cho Amazon S3 bucket

<?xml version="1.0" encoding="UTF-8"?>
<AccessControlPolicy xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
  <Owner>
     <ID>Owner-canonical-user-ID</ID>
     <DisplayName>display-name</DisplayName>
  </Owner>
<AccessControlList>
  <Grant>
     <Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="CanonicalUser">
     <ID>Owner-canonical-user-ID</ID>
     <DisplayName>display-name</DisplayName>
  </Grantee>
  <Permission>FULL_CONTROL</Permission>
</Grant>

  <Grant>
     <Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="CanonicalUser">
       <ID>user1-canonical-user-ID</ID>
       <DisplayName>display-name</DisplayName>
     </Grantee>
     <Permission>WRITE</Permission>
  </Grant>

  <Grant>
     <Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="CanonicalUser">
       <ID>user2-canonical-user-ID</ID>
       <DisplayName>display-name</DisplayName>
     </Grantee>
     <Permission>READ</Permission>
  </Grant>

  <Grant>
     <Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="Group">
       <URI>http://acs.amazonaws.com/groups/global/AllUsers</URI>
     </Grantee>
     <Permission>READ</Permission>
   </Grant>

  <Grant>
     <Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="Group">
       <URI>http://acs.amazonaws.com/groups/s3/LogDelivery</URI>
     </Grantee>
     <Permission>WRITE</Permission>
  </Grant>

  </AccessControlList>
</AccessControlPolicy>

Tuy nhiên, để đơn giản trong việc thiếp lập quyền truy cập, bạn có thể sử dụng các phương thức khác. Bao gồm bucket policy nếu muốn cấp quyền cho account khác hoặc sử dụng IAM policy (SSO) nếu cần cấp quyền truy cập trong account hoặc tổ chức.

Mẫu S3 Bucket Policy

{
  "Version": "2021-02-19",
  "Statement": [
     {
       "Effect": "Allow",
       "Principal": {
         "AWS": ["arn:aws:iam::111122223333:user/Alice",
                 "arn:aws:iam::111122223333:root"]
       },
       "Action": "s3:*",
       "Resource": ["arn:aws:s3:::my_bucket",
                    "arn:aws:s3:::my_bucket/*"]
    }
  ]
}

S3 Bucket Policy này cho phép root account 111122223333 và IAM user là Alice được phép thực thi các hành động trên S3 bucket (bao gồm các dữ liệu bên trong) có tên “my_bucket”.

Đọc thêm: Bucket policy examples – Amazon Simple Storage Service

Mẫu IAM Policy

{
  "Version": "2021-02-19",
  "Statement":[{
     "Effect": "Allow",
     "Action": "s3:*",
     "Resource": ["arn:aws:s3:::my_bucket",
                  "arn:aws:s3:::my_bucket/*"]
     }
  ]
}

IAM policy cấp cho thực thể IAM (người dùng, nhóm hoặc vai trò) mà nó được gắn với quyền để thực thi các hành động trên S3 bucket (bao gồm các dữ liệu bên trong) có tên “my_bucket”.

IAM policy có thể giới hạn truy cập tới từng bucket và object prefix, có thể tham khảo các actions, resources và conditions của S3 trong link sau: https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazons3.html

4.3. MFA Delete

Multi-factor authentication (MFA) Delete là một tính năng bổ sung một lớp xác thực để việc bảo vệ dữ liệu và bucket khỏi việc tình cờ xóa (versioning state của bucket và xóa vĩnh viễn object version)

Có một số lưu ý khi kích hoạt, chỉ root account (bucket owner) mới có khả năng kích hoạt tính năng MFA Delete. Ngoài ra, để sử dụng MFA cho versioning trong S3 bucket, bạn chỉ có thể cấu hình qua AWS Command Line Interface (AWS CLI) hoặc API (API này được sử dụng để cấu hình versioning cho bucket)

Amazon S3 lưu trữ cấu hình MFA Delete trong cùng versioning subresource và được lưu trong bucket’s versioning status.

<VersioningConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">

  <Status>VersioningState</Status>

  <MfaDelete>MfaDeleteState</MfaDelete> 

</VersioningConfiguration>

Command để kích hoạt tính năng MFA Delete cho versioning với AWS CLI:

$ aws s3api put-bucket-versioning --profile my-root-profile --bucket my-bucket-name --versioning-configuration Status=Enabled,MFADelete=Enabled --mfa “arn:aws:iam::00000000:mfa/root-account-mfa-device 123456”

4.4. Access Points

Access points là các network endpoints được đính kèm với các bucket mà được sử dụng để thực hiện các hoạt động lên S3 object, chẳng hạn như GetObject và PutObject.

Access point được sử dụng để chia sẻ dữ liệu giữa các account, thay vì sử dụng bucket policy trong mục 4.3 phía trên. Lưu ý rằng access point chỉ tác động tới object trong bucket.

VTI Cloud khuyến khích sử dụng Access Point cho các công việc sau:

  • Quản lý lượng dữ liệu lớn được chia sẻ

Sử dụng Access Point, bạn có thể phân tách một bucket policy lớn thành các access point policy riêng biệt, rời rạc cho từng ứng dụng cần truy cập tập dữ liệu được chia sẻ.

Điều này giúp đơn giản hơn khi tập trung vào việc xây dựng chính sách truy cập phù hợp cho một ứng dụng, đồng thời không phải lo lắng về việc làm gián đoạn bất kỳ ứng dụng nào khác đang trong tập dữ liệu này.

  • Hạn chế quyền truy cập vào VPC

S3 Access Point có thể giới hạn tất cả quyền truy cập vào S3 storage từ VPC.

Bạn có thể tạo Chính sách kiểm soát dịch vụ (Service Control Policy) và yêu cầu tất cả các access point hạn chế đối với VPC, giúp bảo mật cho dữ liệu của bạn trong các mạng riêng.

  • Giới hạn quyền truy cập vào các account ID cụ thể

Với S3 Access Points, có thể chỉ định các VPC Endpoint policy, chỉ cho phép truy cập vào các Access point (bucket) mà thuộc sở hữu của các account ID cụ thể.

Điều này giúp đơn giản hóa việc tạo các chính sách truy cập cho phép truy cập vào các bucket trong cùng một account, đồng thời từ chối bất kỳ quyền truy cập vô dịch vụ Amazon S3 nào khác qua VPC Endpoint.

  • Cung cấp tên duy nhất

S3 Access points cho phép đặt tên cho một truy cập là duy nhất trong account và AWS region; ví dụ mỗi region / account sẽ có 01 “TEST” access point.

Bước 5: Tính an toàn cho Amazon S3

5.1. Bucket versioning

Từ góc độ bảo mật, VTI Cloud khuyên bạn nên bật tính năng versioning cho bucket vì sự an toàn chống lại việc giả mạo hoặc vô tình xóa dữ liệu hoặc dữ liệu bị mã hóa.

Các quyền cho S3 được phân tách giữa các thao tác lên object và các object version. Ví dụ: hành động DeleteObject khác với DeleteObjectVersion. Điều này có nghĩa là với quyền DeleteObject thì chỉ có thể xóa object tại điểm hiện tại, nhưng không xóa các version của object.

bucket versioning

5.2. S3 Object Lock

S3 Object Lock là một tùy chọn bạn có thể bật để ngăn các đối tượng bị xóa hoặc ghi đè trong một khoảng thời gian cố định. Đây là một mô hình giống như write-once-read-many (WORM) và đã được đánh giá bởi các quy định khác nhau để bảo vệ dữ liệu của bạn.

Tính năng này được khuyến khích để bảo vệ dữ liệu trong một thời gian nhất định.

5.3. Amazon Macie

Amazon Macie là dịch vụ bảo mật dữ liệu và quyền riêng tư về dữ liệu được quản lý toàn phần, sử dụng các kỹ thuật máy học và đối chiếu mẫu để phát hiện và bảo vệ dữ liệu nhạy cảm của bạn trong AWS.

Amazon Macie giúp tự động phát hiện dữ liệu nhạy cảm trên quy mô lớn và giảm chi phí bảo vệ dữ liệu của bạn. Macie tự động cung cấp các Amazon S3 bucket, bao gồm danh sách các bucket không được mã hóa, bucket có thể truy cập công khai và bucket được chia sẻ với tài khoản AWS bên ngoài các tài khoản bạn đã xác định trong AWS Organizations.

Sau đó, Macie áp dụng kỹ thuật máy học và đối chiếu mẫu cho các bucket được chọn để xác định và cảnh báo bạn những dữ liệu nhạy cảm, chẳng hạn như thông tin nhận dạng cá nhân (PII). Các cảnh báo hoặc kết quả tìm kiếm của Macie có thể được tìm kiếm hoặc lọc trong AWS Management Console và gửi đến Amazon EventBridge, trước đây gọi là Amazon CloudWatch Events để dễ dàng tích hợp với quy trình có sẵn hoặc hệ thống quản lý sự kiện, hoặc được sử dụng kết hợp với các dịch vụ AWS, như AWS Step Functions để thực hiện hành động khắc phục tự động. 

Tìm hiểu thêm về Amazon Macie: https://docs.aws.amazon.com/macie/

Kết luận

Trên đây là các phương pháp tốt nhất với chú thích và lời khuyên từ VTI Cloud để bảo mật cho dịch vụ Amazon Simple Storage Service (Amazon S3).

Để có một checklist tổng thể về bảo mật cho hệ thống trên AWS, bạn có thể tham khảo bài viết trước đây của VTI Cloud: Security Checklist hệ thống chạy trên Amazon Web Services | VTI CLOUD

Tham khảo

Security Best Practices for Amazon S3 – Amazon Simple Storage Service

How to secure Amazon S3: latest best practices (securingthe.cloud)

Về VTI Cloud

VTI Cloud là Đối tác cấp cao (Advanced Consulting Partner) của AWS, với đội ngũ hơn 50+ kỹ sư về giải pháp được chứng nhận bởi AWS. Với mong muốn hỗ trợ khách hàng trong hành trình chuyển đổi số và dịch chuyển lên đám mây AWS, VTI Cloud tự hào là đơn vị tiên phong trong việc tư vấn giải pháp, phát triển phần mềm và triển khai hạ tầng AWS cho khách hàng tại Việt Nam và Nhật Bản.

Xây dựng các kiến trúc an toàn, hiệu suất cao, linh hoạt, và tối ưu chi phí cho khách hàng là nhiệm vụ hàng đầu của VTI Cloud trong sứ mệnh công nghệ hóa doanh nghiệp.

Ngoài ra, VTI Cloud có hỗ trợ xây dựng cộng đồng VIET-AWS. Đây là một trong các nhóm AWS User Groups phát triển nhanh chóng và được Amazon công nhận trong khu vực Asia Pacific (Việt Nam).

VIET-AWS là nơi kết nối, trao đổi hỗ trợ giữa các bạn Solutions Architect, DevOps, SysOps và các bạn sinh viên mới chập chững tiếp xúc dịch vụ điện toán đám mây của Amazon Web Services (AWS). Cùng VTI Cloud tham gia VIET-AWS: https://www.facebook.com/groups/vietawscommunity

Related news

what’s up at VTI