2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【OCI】シークレット管理サービスからDBパスワードを自動更新する

2
Last updated at Posted at 2026-02-18

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を作成します。

  1. [開発者サービス] → [ファンクション] → [事前構築済みファンクション] に移動
  2. 検索ボックスに「database」などと入力
  3. 「Database Secret Rotation without Wallet」を選択
  4. 「関数の作成」をクリック

image.png

「アプリケーション」は必要に応じて作成します。必要なIAMポリシーは前述の通りであるため、手動でポリシーを作成する場合は「作成しない」を有効化しても問題ありません。
その他の項目は適宜入力し、「作成」をクリックします。

image.png

Functionが作成されたら、OCIDを控えておきます。

シークレットの作成

次にシークレットを作成します。

OCI コンソールから、[アイデンティティとセキュリティ] → [シークレット管理] へ移動し、「シークレットの作成」を選択します。

適切な名前とVaultの暗号化鍵を指定した後、「手動シークレット生成」を選択します。

シークレット・コンテンツには対象となるユーザとそのパスワード、そして接続情報を以下のJSON形式で入力します。なお、接続文字列はOCIコンソールの対象データベース詳細画面からコピーすることも可能です。

{
  "username": "<DBユーザー名>",
  "password": "<パスワード>",
  "connectionString": "<接続文字列>"
}

image.png

続く項目の「シークレットのローテション」設定では、「OCI関数」と先ほどのFanctionのOCIDを入力し、「シークレットの作成」をクリック。ローテーション間隔は適当に期間を入力しておきます。

image.png

シークレット作成後、アクションメニューから「編集」をクリックし、「自動シークレット生成」に切り替えます。

シークレットの形式には、以下のJSONを指定します。%GENERATED_PASSPHRASE% を指定することで、ローテーション時に自動生成されたパスワードが設定されます。

{
  "username": "<DBユーザー名>",
  "password": "%GENERATED_PASSPHRASE%",
  "connectionString": "<接続文字列>"
}

image.png

手動ローテーションの実行と確認

アクションメニューから「ローテーション」を選択し、手動でローテーションを実行します。
image.png

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

ローテーションが成功すると、データベース側のパスワードも更新されます。
そのため、ローテーション前のパスワードでは接続できなくなっていることが確認できます。

[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

ローテーション後に生成されたパスワードは、新しいシークレット・バージョンから確認できます。

image.png

新しいパスワードを使用すると、正常にデータベースへ接続できることが確認できます。

[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を作成します。

  1. [開発者サービス] → [ファンクション] → [事前構築済みファンクション] に移動
  2. 検索ボックスに「database」などと入力
  3. 「Database Secret Rotation with Wallet」を選択
  4. 「関数の作成」をクリック

image.png

「アプリケーション」は必要に応じて作成します。必要なIAMポリシーは前述の通りであるため、手動で作成する場合は「作成しない」を有効化しても問題ありません。
その他の項目は適宜入力し、「作成」をクリックします。

image.png

Functionが作成されたらFunctionのOCIDを控えておきます。

シークレットの作成

OCI コンソールから [アイデンティティとセキュリティ] → [シークレット管理] へ移動し、「シークレットの作成」を選択します。
適切な名前とVaultの暗号化鍵を指定した後、「手動シークレット生成」を選択します。
ADBの場合、シークレットは以下のJSON形式で入力します。

{
  "username": "<DBユーザー名>",
  "password": "<パスワード>",
  "adbId": "<ADBのOCID>",
  "tnsName": "<TNS NAME>"
}

image.png

なお、tnsNameはADBの詳細画面から取得することができます。

image.png

続く項目の「シークレットのローテション」設定では、非ADB時と同様「OCI関数」とFanctionのOCIDを入力し、「シークレットの作成」をクリック。ローテーション間隔は適当に期間を入力しておきます。

シークレット作成後、アクションメニューから「編集」をクリックし、「自動シークレット生成」に切り替えます。パスワード部分を%GENERATED_PASSPHRASE% に置き換え、更新します。

{
  "username": "<DBユーザー名>",
  "password": "%GENERATED_PASSPHRASE%",
  "adbId": "<ADBのOCID>",
  "tnsName": "<TNS NAME>"
}

image.png

手動ローテーションの実行と確認

アクションメニューから「ローテーション」を選択し、手動でローテーションを実行します。
完了後、旧パスワードでは接続できなくなっており、新しく生成されたパスワードでは接続できることが確認できます。

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 が提供しているサンプルコードおよび仕様ドキュメントを参照してください。

参考リンク

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?