OCIシークレット管理サービスの代表的なユースケースとして、データベース接続用のパスワードを管理することがあげられます。
クラウドでデータベースの資格証明を一元管理し、必要に応じてローテーションできますので、セキュリティを高めつつ管理を簡易にすることが可能です。
しかし、シークレットをローテーションする場合、当然ながらデータベース側のパスワードも同時に変更する必要があり、シークレット管理サービスのシークレットの更新とデータベースのパスワード更新はできるだけ同時に行う必要があります。
そこで OCI Functions サービスでは、事前定義されたファンクション(PBF)が提供されており、シークレット管理サービスがローテーション時にこれらと連携することで、シークレット・ローテーション時にOracle Databaseのパスワードも自動的に変更することが可能です。
この記事ではシークレットの作成からFunctionsサービスとの連携、そしてローテーションを行うまでを行います。
シークレット管理サービス概要
OCIでは、SSHで使用する秘密鍵やパスワードなどのクレデンシャルをアプリケーションやスクリプトなどにハードコードしないよう、クラウド上で一元管理できる「OCI シークレット管理サービス」が提供されています。
このシークレット管理サービスは、もともとはOCIの鍵管理サービス(KMS)であるOCI Vaultの機能の一部でしたが、最新のリリースにて独立したサービスとして分離されました。
構成手順
データベース接続の方法に応じてFunctionの指定の方法が少し異なるため、非ADB(Base Databaseなど)とADBで手順を分けて解説します。
※ ADB:Autonomous AI Database
非ADBの場合
前提条件
- Oracle Database がすでに作成されていること
- 本記事では Base Database を使用します。
- 対象のDBユーザーが作成済みであり、パスワードが設定されていること。
- ここでは例としてTESTユーザーを使用します。
- また、該当ユーザーに接続用の CREATE SESSION 権限が付与されていること。
- OCI Vault にて、シークレット暗号化用のマスター暗号鍵が作成済みであること。
必要なIAMポリシー
Functionによるローテーションのためには以下のIAMポリシーが必要になります。必要に応じてwhere句などの条件を追加します。
# 動的グループ (secret-dg)
resource.type='vaultsecret'
# IAMポリシー
Allow dynamic-group <secret-dg> to manage functions-family in tenancy
# 動的グループ (function-dg)
resource.type='fnfunc'
# IAMポリシー
Allow dynamic-group <function-dg> to manage secret-family in tenancy
Functionの作成
以下の手順で事前構築済みFunctionを作成します。
- [開発者サービス] → [ファンクション] → [事前構築済みファンクション] に移動
- 検索ボックスに「database」などと入力
- 「Database Secret Rotation without Wallet」を選択
- 「関数の作成」をクリック
「アプリケーション」は必要に応じて作成します。必要なIAMポリシーは前述の通りであるため、手動でポリシーを作成する場合は「作成しない」を有効化しても問題ありません。
その他の項目は適宜入力し、「作成」をクリックします。
Functionが作成されたら、OCIDを控えておきます。
シークレットの作成
次にシークレットを作成します。
OCI コンソールから、[アイデンティティとセキュリティ] → [シークレット管理] へ移動し、「シークレットの作成」を選択します。
適切な名前とVaultの暗号化鍵を指定した後、「手動シークレット生成」を選択します。
シークレット・コンテンツには対象となるユーザとそのパスワード、そして接続情報を以下のJSON形式で入力します。なお、接続文字列はOCIコンソールの対象データベース詳細画面からコピーすることも可能です。
{
"username": "<DBユーザー名>",
"password": "<パスワード>",
"connectionString": "<接続文字列>"
}
続く項目の「シークレットのローテション」設定では、「OCI関数」と先ほどのFanctionのOCIDを入力し、「シークレットの作成」をクリック。ローテーション間隔は適当に期間を入力しておきます。
シークレット作成後、アクションメニューから「編集」をクリックし、「自動シークレット生成」に切り替えます。
シークレットの形式には、以下のJSONを指定します。%GENERATED_PASSPHRASE% を指定することで、ローテーション時に自動生成されたパスワードが設定されます。
{
"username": "<DBユーザー名>",
"password": "%GENERATED_PASSPHRASE%",
"connectionString": "<接続文字列>"
}
手動ローテーションの実行と確認
アクションメニューから「ローテーション」を選択し、手動でローテーションを実行します。

ローテーションを実行すると、RotateSecret が開始されます。実行中はワークリクエスト画面から進捗を確認でき、必要に応じてローテーションを取り消すことも可能です。

ローテーションが成功すると、データベース側のパスワードも更新されます。
そのため、ローテーション前のパスワードでは接続できなくなっていることが確認できます。
[oracle@basedb26ai ~]$ sql test/Password123#Password123#@basedb26ai.dbprisbnt.koivcnsydpoc.oraclevcn.com:1521/DB0203_pdb1.dbprisbnt.koivcnsydpoc.oraclevcn.com
SQLcl: Release 25.3 Production on Wed Feb 18 12:43:44 2026
Connection failed
USER = test
URL = jdbc:oracle:oci8:@basedb26ai.dbprisbnt.koivcnsydpoc.oraclevcn.com:1521/DB0203_pdb1.dbprisbnt.koivcnsydpoc.oraclevcn.com
Error Message = ORA-01017: invalid credential or not authorized; logon denied
ローテーション後に生成されたパスワードは、新しいシークレット・バージョンから確認できます。
新しいパスワードを使用すると、正常にデータベースへ接続できることが確認できます。
[oracle@basedb26ai ~]$ sql test/ACO0zNkIo-F#M8p@basedb26ai.dbprisbnt.koivcnsydpoc.oraclevcn.com:1521/DB0203_pdb1.dbprisbnt.koivcnsydpoc.oraclevcn.com
SQLcl: Release 25.3 Production on Wed Feb 18 12:44:57 2026
Copyright (c) 1982, 2026, Oracle. All rights reserved.
Connected to:
Oracle AI Database 26ai EE High Perf Release 23.26.0.0.0 - for Oracle Cloud and Engineered Systems
Version 23.26.0.0.0
SQL> sho user
USER is "TEST"
ADBの場合
接続にmTLS(ウォレット)を使用するAutonomous AI Database(ADB)でも、非ADBの場合と同様にOCIシークレット管理サービスとOCI Functionsを連携し、パスワードのローテーションを自動化できます。
前提条件
- Oracle Database がすでに作成されていること
- 本記事では Autonomous Database - Shared を使用します。
- 対象のDBユーザーが作成済みであり、パスワードが設定されていること。
- ここでは例としてTESTユーザーを使用します。
- また、該当ユーザーに接続用の CREATE SESSION 権限が付与されていること。
- OCI Vault にて、シークレット暗号化用のマスター暗号鍵が作成済みであること。
必要なIAMポリシー
Functionによるローテーションのためには以下のIAMポリシーが必要になります。必要に応じてwhere句などの条件を追加してください。
# 動的グループ (secret-dg)
resource.type='vaultsecret'
# IAMポリシー
Allow dynamic-group <secret-dg> to manage functions-family in tenancy
# 動的グループ (function-dg)
resource.type='fnfunc'
# IAMポリシー
Allow dynamic-group <function-dg> to manage secret-family in tenancy
Allow dynamic-group <function-dg> to read autonomous-databases in tenancy
Functionの作成
以下の手順で事前構築済みFunctionを作成します。
- [開発者サービス] → [ファンクション] → [事前構築済みファンクション] に移動
- 検索ボックスに「database」などと入力
- 「Database Secret Rotation with Wallet」を選択
- 「関数の作成」をクリック
「アプリケーション」は必要に応じて作成します。必要なIAMポリシーは前述の通りであるため、手動で作成する場合は「作成しない」を有効化しても問題ありません。
その他の項目は適宜入力し、「作成」をクリックします。
Functionが作成されたらFunctionのOCIDを控えておきます。
シークレットの作成
OCI コンソールから [アイデンティティとセキュリティ] → [シークレット管理] へ移動し、「シークレットの作成」を選択します。
適切な名前とVaultの暗号化鍵を指定した後、「手動シークレット生成」を選択します。
ADBの場合、シークレットは以下のJSON形式で入力します。
{
"username": "<DBユーザー名>",
"password": "<パスワード>",
"adbId": "<ADBのOCID>",
"tnsName": "<TNS NAME>"
}
なお、tnsNameはADBの詳細画面から取得することができます。
続く項目の「シークレットのローテション」設定では、非ADB時と同様「OCI関数」とFanctionのOCIDを入力し、「シークレットの作成」をクリック。ローテーション間隔は適当に期間を入力しておきます。
シークレット作成後、アクションメニューから「編集」をクリックし、「自動シークレット生成」に切り替えます。パスワード部分を%GENERATED_PASSPHRASE% に置き換え、更新します。
{
"username": "<DBユーザー名>",
"password": "%GENERATED_PASSPHRASE%",
"adbId": "<ADBのOCID>",
"tnsName": "<TNS NAME>"
}
手動ローテーションの実行と確認
アクションメニューから「ローテーション」を選択し、手動でローテーションを実行します。
完了後、旧パスワードでは接続できなくなっており、新しく生成されたパスワードでは接続できることが確認できます。
SQL> conn test/Password123#Password123#@uqg5xbzv5lind8zf_medium
Connection failed
USER = test
URL = jdbc:oracle:thin:@uqg5xbzv5lind8zf_medium
Error Message = ORA-01017: invalid credential or not authorized; logon denied
https://docs.oracle.com/error-help/db/ora-01017/
Warning: You are no longer connected to ORACLE.
SQL> conn test/YGmK-X78dot#rgM@uqg5xbzv5lind8zf_medium
Connected.
SQL> sho user
USER is "TEST"
独自Functionの実装について
この記事では事前定義済みのFunctionを使用しましたが、ローテーション処理を独自に実装することも可能です。
カスタム実装を行う場合は、OCI が提供しているサンプルコードおよび仕様ドキュメントを参照してください。
参考リンク










