はじめに
RDSの設定変更等を実施していたところ、新しく Manage master credentials in AWS Secrets Manager -new というチェックボックスがでてきました。
確認してみたところ、2022/12/22 に発表された Amazon RDS と AWS Secrets Manager の統合を発表 によるものだったようです。
今までユーザのクレデンシャルは統合することもできましたが、マスターユーザについては今回のアップデートで統合されるようになったようです。
ということで、マスターユーザのクレデンシャルのSecrets Managerとの統合を試してみました。
RDS for Oracleのマスターユーザのシークレットの作成
RDSの変更画面で以下のようなチェックボックスができてますので、チェックします。
変更の適用について確認されますので、「すぐに適用」で変更します。
なお、本変更は「すぐに適用」のみになります。
シークレットの利用
EC2からSQL*PLUSでTESTDB02 というRDSにADMINユーザで接続します。
まずはシークレットの確認を実施すると、当然のことながら権限不足で確認できません。
$ aws secretsmanager get-secret-value --secret-id rds\!db-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx --region ap-northeast-1 | jq .SecretString | jq fromjson
An error occurred (AccessDeniedException) when calling the GetSecretValue operation: User: arn:aws:sts::xxxxxxxxxxxx:assumed-role/CustomSSMRole/i-xxxxxxxxxxxxxxxxx is not authorized to perform: secretsmanager:GetSecretValue on resource:rds!db-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx because no identity-based policy allows the secretsmanager:GetSecretValue action
EC2にSecretへのアクセス権限を付けます(EC2にアタッチされているロールにSecretを参照できるポリシーを付与します)。
以下は例ですが、GetSecretValueとGetRandomPasswordがあれば大丈夫と思います。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"secretsmanager:GetResourcePolicy",
"secretsmanager:GetSecretValue",
"secretsmanager:DescribeSecret",
"secretsmanager:ListSecretVersionIds"
],
"Resource": "arn:aws:secretsmanager:ap-northeast-1:xxxxxxxxxxxx:secret:rds!db-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx-xxxxxx"
},
{
"Sid": "VisualEditor1",
"Effect": "Allow",
"Action": "secretsmanager:GetRandomPassword",
"Resource": "*"
}
]
}
改めてシークレットの確認をすると、今度はアクセスできます。
$ aws secretsmanager get-secret-value --secret-id rds\!db-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx --region ap-northeast-1 | jq .SecretString | jq fromjson
{
"username": "admin",
"password": "xxxxxxxxxxxxxxxxxxxxxxxxxx"
}
該当のシークレットを設定し、SQL*PLUSで改めて接続すると、無事接続できました。
$ user=$(aws secretsmanager get-secret-value --secret-id rds\!db-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx | jq .SecretString | jq fromjson | jq -r .username)
$ password=$(aws secretsmanager get-secret-value --secret-id rds\!db-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx | jq .SecretString | jq fromjson | jq -r .password)
$ sqlplus $user/$password@testdb02.xxxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com:1521/TESTDB02
SQL*Plus: Release 21.0.0.0.0 - Production on Sun Jan 29 04:57:13 2023
Version 21.8.0.0.0
Copyright (c) 1982, 2022, Oracle. All rights reserved.
Last Successful login time: Sat Dec 03 2022 09:58:14 +00:00
Connected to:
Oracle Database 19c Standard Edition 2 Release 19.0.0.0.0 - Production
Version 19.17.0.0.0
まとめ
このアップデートで、RDSへの接続情報を全てSecretsで管理することができるため、ユーザ/パスワード運用から脱して環境を利用することができるようになります。
ただ、ADMINユーザの接続自体はアプリから利用されることはないと思いますし、特定のEC2から(OS上の)どのユーザでもADMINで接続できることになるので、現行のセキュリティポリシーとの整合は確認して利用すべきと思います。(MFAつけるとか)