RDS for OracleとAWS Secrets managerの統合を試してみた

# はじめに
RDSの設定変更等を実施していたところ、新しく **Manage master credentials in AWS Secrets Manager -new** というチェックボックスがでてきました。
確認してみたところ、2022/12/22 に発表された [Amazon RDS と AWS Secrets Manager の統合を発表](
https://aws.amazon.com/jp/about-aws/whats-new/2022/12/amazon-rds-integration-aws-secrets-manager/) によるものだったようです。
今までユーザのクレデンシャルは統合することもできましたが、マスターユーザについては今回のアップデートで統合されるようになったようです。

ということで、マスターユーザのクレデンシャルのSecrets Managerとの統合を試してみました。

# RDS for Oracleのマスターユーザのシークレットの作成

RDSの変更画面で以下のようなチェックボックスができてますので、チェックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2313926/6c060ff0-8ac4-f6e6-f532-fd4f2abbdfa6.png)

変更の適用について確認されますので、「すぐに適用」で変更します。
なお、本変更は「すぐに適用」のみになります。
![02-key-on-2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2313926/59905ed8-153c-b451-f933-7a1520df08ec.png)

適用すると、以下のようなシークレットが作成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2313926/c9af53b7-1d33-c340-c81b-1144f5fd8a22.png)


# シークレットの利用

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で改めて接続すると、無事接続できました。
```: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つけるとか)

###### 参考

- [[アップデート] Amazon RDSがAWS Secrets Managerとの統合をサポートするようになりました](https://dev.classmethod.jp/articles/aws-rds-integration-aws-secrets-manager/)
- [RDS の接続情報を AWS Secrets Manager で管理する](https://random-tech-note.jp/rds-rotate-password/)