はじめに
Autonomous Databaseではマルチクラウド環境向けの様々な機能が実装されています。
先日の機能強化で、Azure Key Vault、AWS Secrets Manager、GCP Secret Managerといった各クラウドベンダーのシークレット管理サービスに格納されたシークレットを使用してクレデンシャルが作成できるようになりました。
そこで今回は、AWS Secrets Managerに格納されているシークレットを使用してクレデンシャルを作成してみました。
Azure Key Vaultに格納されているシークレットを使用してクレデンシャルを作成する手順の記事はこちら。
Google Cloud Secret Managerに格納されているシークレットを使用してクレデンシャルを作成する手順の記事はこちら。
1. AWS Secrets Managerへのシークレットの保存
AWSのコンソールにサインインして「Secrets Manager」に移動し、「新しいシークレットを保存する」をクリックします。
シークレットのタイプとして「その他のシークレットのタイプ」を選択し、Autonomous Databaseで作成するクレデンシャルのパスワードとして使用する文字列をプレーンテキストとして入力します。
ここでは、S3にアクセス可能なAWS IAMユーザのシークレット・アクセスキーをシークレットに保存しました。
シークレットの名前を入力します。
ここではMySecretとしました。
ローテーションの設定画面では、そのまま「次」をクリックします。
設定内容に問題がないことを確認したら、「保存」をクリックしてシークレットを保存します。
シークレットが作成できたら、シークレットのARNをコピーしてメモしておきます。
2. AWS IAMロールの作成に必要な情報の確認
以下のSQLでARNを確認します。
SQL> SELECT param_value FROM cloud_integrations
2* WHERE param_name = 'aws_user_arn';
PARAM_VALUE
___________________________________________
arn:aws:iam::XXXXXXXXXXXX:user/oraclearn
SQL>
以下のSQLでAutonomous DatabaseのOCIDを確認します。
SQL> SELECT JSON_VALUE(cloud_identity, '$.DATABASE_OCID') AS adb_ocid FROM v$pdbs;
ADB_OCID
_______________________________________________________________________________________________________
OCID1.AUTONOMOUSDATABASE.OC1.AP-TOKYO-1.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
SQL>
3. AWS IAMロールの作成
AWSのコンソールにサインインし、「IAM」の「ロール」に移動します。
「信頼されたエンティティタイプ」として「AWSアカウント」を選択します。
「AWSアカウント」は「このアカウント」を選択します。
「外部IDを要求する」のチェックをオンにし、外部IDとしてAutonomous DatabaseのOCIDを入力します。
作成するロールの名前を入力し、「ロールの作成」をクリックします。
ここではロール名を「ROLE_for_ADB_using_Secret_Manager」としました。
ロールが作成できたら、許可ポリシーを設定します。
「許可を追加」をクリックし、「インラインポリシーを作成」を選択します。
このポリシーでは、Autonomous DatabaseにSecrets Managerに保存されているシークレットへの読み取りアクセスを許可するので、サービスとして「Secrets Manager」を選択し、「すべての読み取りアクション」のチェックをオンにします。
リソースとして、シークレットのARNを指定し、「次へ」をクリックします。
ポリシー名を入力し、「ポリシーの作成」をクリックします。
ここではポリシー名を「Policy_for_ADB_using_Secret_Manager」としました。
作成したロールの信頼ポリシーのPrincipalを以下のように編集します。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::XXXXXXXXXX:user/oraclearn" (<-2.で確認したARNの値に変更)
},
"Action": "sts:AssumeRole",
"Condition": {
"StringEquals": {
"sts:ExternalId": "OCID1.AUTONOMOUSDATABASE.OC1.AP-TOKYO-1.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
}
}
}
]
}
以上でロールの設定が完了しました。
4.プリンシパル認証の有効化
DBMS_CLOUD_ADMIN.ENABLE_PRINCIPAL_AUTHプロシージャを使用して、プリンシパル認証を有効化します。
providerとしてAWSを指定し、paramsのaws_role_arnには、3.で作成したロールのARNを指定します。
SQL> BEGIN
2 DBMS_CLOUD_ADMIN.ENABLE_PRINCIPAL_AUTH(
3 provider => 'AWS',
4 params => JSON_OBJECT(
5 'aws_role_arn' value 'arn:aws:iam::XXXXXXXXXXXX:role/ROLE_for_ADB_using_Secret_Manager')
6 );
7 END;
8* /
PL/SQL procedure successfully completed.
SQL>
5. Secrets Managerに格納されているシークレットを使用したクレデンシャルの作成
DBMS_CLOUD.CREATE_CREDENTIALプロシージャを使用して、クレデンシャルを作成します。
paramsのsecret_idには1.で作成したシークレットのARNを指定します。
SQL> BEGIN
2 DBMS_CLOUD.CREATE_CREDENTIAL(
3 credential_name => 'AWS_SECRET_CRED',
4 params => JSON_OBJECT(
5 'username' value 'XXXXXXXXXXXXXXXXXX', -- AWS IAMユーザのアクセスキー
6 'secret_id' value 'arn:aws:secretsmanager:ap-northeast-1:XXXXXXXXXXXX:secret:MySecret-XXXXXX') -- シークレット・アクセスキーを保存したシークレットのARN
7 );
8 END;
9* /
PL/SQL procedure successfully completed.
SQL>
Secrets Managerに格納されているシークレットを使用して作成したクレデンシャルを使用して、S3バケットにアクセスしてみます。
SQL> SELECT object_name FROM
2 DBMS_CLOUD.LIST_OBJECTS(
3 'AWS_SECRET_CRED',
4 'https://s3.ap-northeast-1.amazonaws.com/bucket_name/'
5* );
OBJECT_NAME
_______________________
employee1.csv
employee1.csv.gz
employee2.csv
employee2.csv.gz
employee20231031.csv
employee20231101.csv
employee3.csv
7 rows selected.
SQL>
Secrets Managerに格納されているシークレットを使用して作成したクレデンシャルを使用して、S3バケットにアクセスできました。
なお、シークレットを使用して作成するクレデンシャルは、ユーザ名/パスワード形式の認証が必要なところで利用可能ですので、データベース・リンクを作成する際のクレデンシャル等でも利用可能です。
6. 参考情報
・Use Vault Secret Credentials
・ENABLE_PRINCIPAL_AUTH Procedure
・CREATE_CREDENTIAL Procedure