透過 IAM 管理用戶存取 RDS

藉由 IAM 發放權限給某些使用者,可以對 RDS 做某些程度的操作。除了能夠更快速地發放、收回權限,對於資料安全性也將更有保障。

以下將介紹透過 IAM 管理用戶存取 RDS 的幾項注意事項:

  1. 使用 Signature Version 4 Signing Process,比用戶密碼更加安全。
  2. Token只有 15 分鐘的有效期限,不需要再進行密碼重置。
  3. 必須使用 SSL 連接。
  4. 能夠使用 IAM Auth 的 RDS:
    • MySQL 5.6.34 以上,除了 db.t1.micro, db.m1.small
    • MySQL 5.7.16 以上,除了 db.t1.micro, db.m1.small
    • Amazon Aurora 1.10 以上,除了 db.t2.small

前置動作

如果還沒安裝 aws-cli 的話請參考 AWS 命令列界面

pip install -U awscli

如果還沒安裝 mysql cli 的話。

brew install mysql --client-only --universal

建立 RDS Instance

設定 RDS Instance

試著使用 mysql cli 連線到剛剛開好的 instance

mysql -h rammus2.[your-endpoint].ap-southeast-1.rds.amazonaws.com -u [your-username] -p
mysql -h rammus2.xxxxxxxx.ap-southeast-1.rds.amazonaws.com -u rammus -p
CREATE USER iam_user IDENTIFIED WITH AWSAuthenticationPlugin as 'RDS';
GRANT SELECT ON `your-database-name`.* TO 'iam_user'@'%' REQUIRE SSL;

在 IAM User 添加一筆 Permission

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"rds-db:connect"
],
"Resource": [
"arn:aws:rds-db:us-west-2:[user-arn]:dbuser:[resource-id]/[new-created-user]",
]
}
]
}

使用 IAM Auth 連線到 MySQL

取得 auth token

aws rds generate-db-auth-token \
--hostname rammus2.xxxxxxxx.ap-southeast-1.rds.amazonaws.com \
--port 3306 \
--username iam_user \
--region ap-southeast-1

這邊才是重點,因為 AWS 的文件上沒有提到這幾個重要步驟,讓我卡關卡很久。

必須要使用 SSL 連線,並使用 RDS CA 才能正確連線!

下載 SSL CA https://s3.amazonaws.com/rds-downloads/rds-combined-ca-bundle.pem

使用 SSL 加密与数据库实例的连接

--ssl-ca=~/.ssh/rds-combined-ca-bundle.pem 

必須打開這個 plugin,否則 token 無法正確帶入密碼欄。

--enable-cleartext-plugin

Oneline command

 mysql -u iam_user -h rammus2.xxxxxxxx.ap-southeast-1.rds.amazonaws.com \
-p`aws rds generate-db-auth-token --hostname rammus2.xxxxxxxx.ap-southeast-1.rds.amazonaws.com \
--port 3306 \
--username iam_user \
--region ap-southeast-1` \
--ssl-ca=~/.ssh/rds-combined-ca-bundle.pem \
--enable-cleartext-plugin

Reference

Troubleshooting

出現錯誤 MySQL said: Authentication plugin ‘mysql_clear_password’ cannot be loaded: plugin not enabled

因為 token 字串會被 encrypt,所以必須開啟 cleartext plugin 才能正確送出 token。

如果是使用 Sequel Pro 的話,要在 Terminal 執行以下指令開啟 App。

LIBMYSQL_ENABLE_CLEARTEXT_PLUGIN=y /Applications/Sequel\ Pro.app/Contents/MacOS/Sequel\ Pro