Sử dụng Secrets Manager tương tác với RDS
Ở phần này, chúng ta sẽ tìm hiểu làm sao sử dụng dịch vụ AWS Secrets Manager nhằm thực hiện thay đổi password định kỳ cho RDS Database nội bộ.
Nội dung
Chúng ta sẽ tiến hành lưu trữ các giá trị RDS Credential thông qua dịch vụ AWS Secret Manager.
Store a new secret
.Credentials for RDS database
.
Username
: nhập giá trị của DBUser.Password
: nhập giá trị của DBPassword.Select the encryption key
, chọn DefaultEncryptionKey
.Next
.Next
.Disable automatic rotation
. Sau đó, chọn nút Next
.Store
.Với việc AWS SDK hỗ trợ nhiều ngôn ngữ, chúng ta có thể dễ dàng tích hợp Secrets Manager với ứng dụng hiện tại, ví dụ như Java hay Python.
Bây giờ, chúng ta sẽ sử dụng Bastion Host, là nơi được phép truy cập vào RDS Database để thực thi các shell scripts đã được chuẩn bị.
Truy cập vào Bastion Host với Session Manager
Start Session
.Start Session
.Trước khi chạy các scripts, chúng ta cần đảm bảo tài khoản được sử dụng là ec2-user
.
Tiến hành chuyển qua tài khoản ec2-user
bằng câu lệnh sau:
sudo su - ec2-user
Thực thi các Shell Scripts
mysql.oldway.sh
: đoạn mã này dùng để truy cập vào RDS database thông qua cách cũ - hard-coded password
.mysql.newway.sh
: đoạn mã này dùng để truy cập vào RDS database thôgn qua cách mới - Secrets Manager
.Đối với mysql.oldway.sh
, nội dung bên trong đoạn mã sẽ tương tự như sau, trong đó các giá trị sau sẽ được điền sẵn.
#/bin/bash
# mysql.oldway.sh
# This is the old way of accessing a database, with a hard-coded password.
# This script will only work right after the CloudFormation template runs.
# After you store and rotate the secret, you will need to use the
# mysql.newway.sh script.
mysql \
-pPASSWORD \
-u USER \
-P 3306 \
-h ENDPOINT
mysql.oldway.sh
để truy cập vào RDS Database.
./mysql.oldway.sh
Sau đó, thực thi các câu lệnh SQL để kiểm tra dữ liệu hiện có.
use smdemo;
show tables;
select * from bookinfo;
quit;
Kết quả sẽ tương tự như sau.
Đối với mysql.newway.sh
, nội dung bên trong đoạn mã sẽ tương tự như sau.
$1
.mysql
.getsecretvalue() {
aws secretsmanager get-secret-value --secret-id $1 | \
jq .SecretString | \
jq fromjson
}
secret=`getsecretvalue $1`
user=$(echo $secret | jq -r .username)
password=$(echo $secret | jq -r .password)
endpoint=$(echo $secret | jq -r .host)
port=$(echo $secret | jq -r .port)
mysql \
-p$password \
-u $user \
-P $port \
-h $endpoint
Giá trị trả về của hàm getsecretvalue() là một JSON String.
Kết quả sẽ tương tự như sau:
{
"engine": "mysql",
"username": "myuser",
"password": "mypassword",
"host": "my-database-endpoint.us-east-1.rds.amazonaws.com",
"dbname": "myDatabase",
"port": "3306"
}
mysql.newway.sh
để truy cập vào RDS Database.
./mysql.newway.sh <SECRET_NAME>
use smdemo;
show tables;
select * from bookinfo;
quit;
Sau khi đã truy cập vào RDS Database thông qua cả 2 cách, chúng ta sẽ tiến hành quá trình Secret Rotation. Đây là một quá trình định kỳ nhằm tuân thủ các quy tắc bảo mật.
Edit rotation
.Enable automatic rotation
.Use this secret
.Save
.Retrieve secret value
.Secrets Manager sẽ sử dụng AWS Severless Application Repository để cài đặt Lambda Function.
Sau khi đã hoàn tất quá trình Key Rotation, thông qua 2 cách truy cập cũ và mới, chúng ta lần lượt truy cập vào RDS Database và quan sát kết quả.
Đối với mysql.oldway.sh
, kết quả sẽ như sau:
Đối với mysql.newway.sh
, kết quả sẽ như sau:
Đối với cách cũ, bởi vì chúng ta đã sử dụng hard-coded password
nên khi password bị thay đổi, lỗi sẽ xuất hiện và ngăn cản tác vụ truy cập. Đối với cách mới, thông qua dịch vụ Secrets Manager, chúng ta có thể dễ dàng truy cập vào RDS Database trước và sau quá trình Key Rotation.