21. Bảo mật trong RDS



Bài này trình bày hai vấn đề bảo mật quan trọng trong RDS: xác thực quyền truy cập CSDL trong DB Instance dùng IAM, và mã hoá dữ liệu trong RDS, bao gồm cả mã hoá khi truyền tải và mã hoá khi lưu trữ.

Trong bài này:

1. Xác thực Quyền Truy cập CSDL trong RDS

Bài toán cơ bản trong mọi dịch vụ là kiểm soát truy cập, để chỉ những danh tính được phép mới có thể thao tác với tài nguyên. Trong RDS, phương thức xác thực phổ biến nhất là sử dụng IAM. Quy trình như sau:

RDS IAM Authentication

  • Bước 1: Tạo một IAM Policy cho phép hành động rds-db:connect trên DB Instance cụ thể, trong Resource ARN chỉ rõ username bên trong DB Instance đó.

Giả sử ta có một DB Instance chạy PostgresSQL với ID db-instance-id-12345, trong đó có một tài khoản CSDL tên là awscoban, được tạo và cấu hình xác thực IAM bằng lệnh SQL sau:

CREATE USER awscoban; 
GRANT rds_iam TO awscoban;

IAM Policy tương ứng sẽ như sau:

{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "rds-db:connect"
            ],
            "Resource": [
                "arn:aws:rds-db:us-east-1:111122223333:dbuser:db-instance-id-12345/awscoban"
            ]
        }
    ]
}

Sau khi tạo, gán IAM Policy này cho IAM User hoặc IAM Role tương ứng với ứng dụng hoặc người dùng cần truy cập CSDL trong RDS.

  • Bước 2: Khi ứng dụng muốn kết nối đến DB Instance, sử dụng AWS SDK hoặc CLI để tạo một token tạm thời (temporary authentication token) từ RDS, thời hạn 15 phút. IAM kiểm tra xem danh tính có quyền rds-db:connect với tài khoản CSDL trên DB Instance đó hay không.

  • Bước 3: Nếu xác thực thành công, IAM trả token xác thực cho ứng dụng.

  • Bước 4: Ứng dụng sử dụng token này như mật khẩu để kết nối đến DB Instance, cùng với tên tài khoản CSDL tương ứng.

Giả sử DB Instance trên có endpoint là rdspostgres.123456789012.us-east-1.rds.amazonaws.com, trên EC2 Instance chạy ứng dụng có thể dùng các lệnh CLI sau để tạo token xác thực và kết nối đến CSDL:

export RDSHOST="rdspostgres.123456789012.us-east-1.rds.amazonaws.com"

# Tạo token xác thực:

export AUTH_TOKEN="$(aws rds generate-db-auth-token --hostname $RDSHOST --port 5432 --region us-east-1 --username awscoban)"

# Sử dụng token để kết nối đến RDS với psql, tên tài khoản CSDL là `awscoban`, tên CSDL là `awscoban-database`:

psql "host=$RDSHOST port=5432 user=awscoban password=$AUTH_TOKEN dbname=awscoban-database"

Ngoài IAM, RDS cũng hỗ trợ xác thực bằng mật khẩu truyền thống, hoặc thông qua các dịch vụ bên ngoài như Kerberos, bạn đọc quan tâm có thể tham khảo thêm trong tài liệu chính thức.

2. Mã hoá Dữ liệu trong RDS

RDS hỗ trợ mã hoá dữ liệu cả khi lưu trữ (encryption at rest) và khi truyền tải (encryption in transit).

2.1. Mã hoá Dữ liệu khi Truyền tải

  • Tại tầng ứng dụng: RDS sử dụng SSL/TLS để mã hoá kết nối giữa ứng dụng và DB Instance, người dùng có thể cài đặt bắt buộc sử dụng SSL/TLS.
  • Tại tầng mạng: tất cả dữ liệu truyền trong mạng lưới AWS trên toàn cầu đều được mã hoá ở tầng vật lý (physical layer) trước khi rời khỏi hạ tầng AWS, bên ngoài các lớp mã hoá đã có.

2.2. Mã hoá Dữ liệu khi Lưu trữ

Khi tạo DB Instance, có thể bật mã hoá dữ liệu khi lưu trữ và chọn một KMS Key tương ứng. Khi đó, toàn bộ dữ liệu trên DB Instance, và tất cả các bản sao lưu tự động hoặc snapshot thủ công đều được mã hoá. Vì các DB Instance sử dụng EBS để lưu trữ dữ liệu, việc mã hoá dữ liệu khi lưu trữ trong RDS cũng giống tính năng mã hoá của EBS, vẫn sử dụng quy trình mã hoá phong bì (envelope encryption) như đã thảo luận trong hai bài KMSEBS.

Ngoài ra, RDS cho SQL Server và Oracle hỗ trợ mã hoá dữ liệu ở cấp độ CSDL, gọi là TDE (Transparent Data Encryption). DB Engine của hai loại CSDL này tự động mã hoá dữ liệu khi lưu trữ và giải mã khi truy xuất, coi như một tầng mã hoá bổ sung phía trước tầng mã hoá của RDS (nếu có).

Dưới đây là một vài lưu ý cần ghi nhớ:

  • Mã hoá dữ liệu khi lưu trữ chỉ có thể bật khi tạo mới DB Instance, không thể bật cho DB Instance đã có. Tuy nhiên, có một cách đi đường vòng là:
    • Tạo một snapshot của DB Instance. Snapshot này không mã hoá.
    • Sao chép (copy) snapshot đó thành một snapshot mới. Thao tác sao chép này cho phép mã hoá bản sao của snapshot. Đọc thêm tại đây.
    • Tạo DB Instance từ snapshot mới đã mã hoá. Lúc này DB Instance sẽ có tính năng mã hoá dữ liệu khi lưu trữ.
  • Không thể tắt mã hoá dữ liệu một khi đã bật khi tạo DB Instance.

  • Không thể tạo snapshot mã hoá từ DB Instance không bật mã hoá.

  • Read Replica phải có trạng thái mã hoá (có hoặc không) giống như DB Instance. Không thể tạo Read Replica không mã hoá cho DB Instance có mã hoá và ngược lại.

Tài liệu tham khảo

  1. Các Phương thức Xác thực Quyền Truy cập CSDL trong RDS
  2. Xác thực với IAM
  3. Kết nối với RDS với Xác thực IAM qua AWS CLI và PostgreSQL
  4. Mã hoá Dữ liệu trong RDS

Qua loạt bài vừa rồi, mình đã trình bày những kiến thức cơ bản và quan trọng nhất về RDS: các khái niệm nền tảng, cách triển khai, các tính năng nâng cao như Multi-AZ, Read Replica, đến xác thực IAM và mã hoá dữ liệu. Những kiến thức này rất hay gặp cả trong thực tế lẫn các kỳ thi chứng chỉ AWS. Tiếp theo, hãy nói về một dịch vụ CSDL SQL được thiết kế và phát triển bởi chính AWS: Aurora.

Nếu có câu hỏi, bạn có thể nhắn mình trên fanpage hoặc group. Cảm ơn bạn.