ウォレット関数を使用するデータベース・シークレット・ローテーション
OCI FunctionsでWalletの事前組込み関数を使用したデータベース・シークレット・ローテーションを使用して、データベースへのmTLS接続を使用してシークレットをローテーションする方法をご覧ください。
一般的な使用方法のシナリオ
Wallet PBFを使用したデータベース・シークレット・ローテーションを使用して、ウォレット(mTLS)とのJDBC接続を行うことで、データベースのシークレットを自動的にローテーションします。
Database Secret Rotation with Wallet関数に関連するサービスは次のとおりです。
有効範囲
この関数のスコープに関する考慮事項は次のとおりです。
- 事前組込み関数は、JDBC URLをサポートする任意のデータベースで使用できます。
- シークレット・サービスは、事前組込みファンクションによって作成されたファンクションを使用して、データベース・シークレットをローテーションします。
- Wallet PBFを使用したデータベース・シークレット・ローテーションは、Autonomous Databaseで使用されます。Autonomous Databaseの詳細は、Autonomous Databaseを参照してください。
前提条件と推奨事項
この事前作成機能を使用する場合のベスト・プラクティスを次に示します。
- 事前構築済み関数のタイムアウトを300秒に設定します。
- アプリケーションにリンクされたVCNが、サービス・ゲートウェイ、インターネット・ゲートウェイまたはNATゲートウェイを使用して、他のOCIサービスへのアクセスを容易にします。
- VCNにアタッチされているサブネットに、ルート表とセキュリティ・リストがあることを確認します。
- サブネットのルート表に、VCN内に作成されたサービス・ゲートウェイを使用しているルールが含まれていることを確認します。シークレット・ローテーションを構成するリージョン内のOCIサービスに、サービス・ゲートウェイがアクセスできることを確認します。
- サブネットのセキュリティ・リストに、VCN内に作成されたサービス・ゲートウェイに宛先が設定されたエグレス・ルールが含まれていることを確認します。
-
次のように、事前作成機能が作成されるアプリケーションからの受信リクエストを許可するように、自律型データベースのネットワーク・アクセスが構成されていることを確認します。
- OCIコンソールを使用して自律型データベースを作成または更新する場合は、ページの「ネットワーク・アクセスの選択」領域または「ネットワーク・アクセスの更新」領域を表示します。詳細は、Autonomous Databaseサーバーレスのドキュメントを参照してください。
- 次のタイプのネットワーク・アクセスのいずれかを選択します。
- すべての場所からのセキュア・アクセスの許可:自律型データベースにインターネットからアクセスする場合は、このオプションを選択します。
- 許可されたIPおよびVCNsからのセキュア・アクセスのみ: VCNsおよびアクセス制御リスト(ACL)のIPからのみ自律型データベースにアクセスする場合は、このオプションを選択します。自律型データベースへのアクセス元のネットワークに従って、1つ以上のアクセス制御ルールを追加します。
- プライベート・エンドポイント・アクセスのみ: OCI VCN内のプライベート・エンドポイントから自律型データベースにアクセスする場合は、このオプションを選択します。自律型データベースにアクセスするVCNおよびサブネットを選択します。
Wallet関数を使用したデータベース・シークレット・ローテーションの構成
Walletファンクションを使用してデータベース・シークレットのローテーションを構成するには、次のステップを実行します。
デプロイ・ダイアログに、ファンクションをデプロイするタスクが表示されます(「事前構築済ファンクション・デプロイメントの終了」を参照)。
構成オプション
権限
ファンクションを実行するには、特定のIAMポリシーが必要です。
Walletを使用したデータベース・シークレット・ローテーション・ファンクションの場合、動的グループを作成し、シークレット・ローテーション・サービスがファンクションを起動できるようにIAMポリシーを構成する必要があります。適切なポリシーを設定するには、次のステップを実行します。
- ルールを含む動的グループを作成します:
resource.type='vaultsecret'
このルールには、動的グループ内のすべてのボールト・シークレットが含まれます。より限定的なルールを使用して、動的グループに含めるボールト・シークレットを制限できます。例:
resource.id='<secret-id>'
- 動的グループに含まれるリソースがファンクションを起動できるようにするIAMポリシーを構成します。例:
Allow dynamic-group <vs-dynamic-group-name> to manage functions-family in tenancy
ノート
<vs-dynamic-group-name>
は、ボールト・シークレット用に作成した動的グループの名前です。
また、ファンクションの作成時に「動的グループおよびIAMポリシーを作成しない」オプションを選択した場合は、ファンクションでシークレットを管理できるように、動的グループおよびIAMポリシーを自分で定義する必要があります。適切なポリシーを設定するには、次のステップを実行します。
- ルールを含む動的グループを作成します。
resource.type='fnfunc'
このルールには、動的グループ内のすべての関数が含まれます。より限定的なルールを使用して、動的グループに含める関数を制限できます。例:
resource.id='<function-ocid>'
- 動的グループを使用してIAMポリシーを構成します:
Allow dynamic-group <dynamic-group-name> to manage secret-family in tenancy Allow dynamic-group <dynamic-group-name> to read autonomous-databases in tenancy
より限定的なポリシーを使用して、ファンクションが管理できるボールト・シークレットを制限できます。例:
Allow dynamic-group <dynamic-group-name> to manage secret-family in compartment <compartment-name> where target.secret.id = "<secret-ocid>"
<function-ocid>
を、前のステップで作成したファンクションのOCIDに置き換えます。 <dynamic-group-name>
は、ファンクションのOCIDを使用して作成した動的グループの名前です。<compartment_ocid>
は、関数を含むコンパートメントのOCIDですこの関数の起動
このPBFを使用して作成された関数は、シークレット・サービスによって起動され、シークレットがローテーションされます。
- このPBFを使用してファンクションを作成し、ファンクションIDをコピーします。
-
- ナビゲーション・メニューを開き、「アイデンティティとセキュリティ」、「Vault」の順に選択します。
- 「リスト範囲」で、ボールトに作成したシークレットを含むコンパートメントを選択します。
- 交代勤務の場合、[ターゲット システム タイプ]で [関数]を選択します。
- ステップ1からコピーしたファンクションIDを「ターゲット・システムID」として追加します。
- シークレットが次の要件に従っていることを確認します。
- シークレットの最初のバージョンを手動で作成する必要があります。次のJSON形式のシークレット・コンテンツを含む「手動シークレット生成」を選択します:
{ "username": "<required: username>", "password": "<required: password>", "adbId": "<required: adbId>", "tnsName": "<required: tnsName (adbName + ‘_high/_low/_medium’)>" }
- パスワードは、ローテーションするデータベースに対して設定されているパスワードと同じである必要があります。
- シークレットが正常に作成された後、シークレット・サービスによって後続のシークレット・バージョンを自動生成できるように、「シークレットの自動生成」を有効にする必要があります。
- 新しく作成したシークレットを編集し、「シークレットの自動生成」を有効にして、次のJSON形式でシークレット・コンテンツを指定します:
{ "username": "<required: username>", "password": "%GENERATED_PASSPHRASE%", "adbId": "<required: adbId>", "tnsName": "<required: tnsName (adbName + ‘_high/_low/_medium’)>" }
- 「シークレットの自動生成」では、シークレット・サービスがこのフィールドでパスワードを自動生成できるように、パスワードは
%GENERATED_PASSPHRASE%
として指定されます。 - ユーザー名とパスワードは、
jdbc:oracle:thin:@<tnsName>?TNS_ADMIN=<walletDirectory>
という形式を使用してデータベースとの接続を確立する必要があります。 - シークレット・コンテンツには、
tnsName
(adbName + ‘_high/_low/_medium’
)およびadbId
が含まれる必要があります。 - mTLS接続を使用してください。詳細は、Autonomouse Database ServerlessドキュメントのJDBC Thin Connections with a Wallet (mTLS)を参照してください。
- シークレットの最初のバージョンを手動で作成する必要があります。次のJSON形式のシークレット・コンテンツを含む「手動シークレット生成」を選択します:
トラブルシューティング
OCI Functions共通ステータス・コード
次の表に、事前組込み関数の操作時に発生する可能性がある一般的なOCI関数のエラーをまとめます。
エラー・コード | Error Message | アクション |
---|---|---|
200 | 成功 | なし |
404 | NotAuthorizedOrNotFound | 必要なポリシーが構成されていることを確認します(Fn ProjectのCLIコマンドを実行すると、404エラーが返されますを参照)。 |
444 | タイムアウト |
ファンクションの実行中に、クライアントとOCIファンクション間の接続が中断されました(ファンクションの起動によりクライアントがタイムアウトを報告し、ファンクションのログに444エラーが表示されますを参照)。再試行によって問題が解決する可能性があります。 ほとんどのクライアントの内部タイムアウトは60秒です。組み込み関数のタイムアウトが300秒に設定されている場合でも、次のことが必要になることがあります。
詳細は、ファンクションの呼出しを参照してください。 |
502, 504 | (各種) | ほとんどの問題は、502ステータス・コードを返します(ファンクションの呼出しは、ファンクションの失敗メッセージおよび502エラーを返すを参照)。「error receiving function response」というメッセージの502エラーは、メモリー割当てを増やすことによって解決される可能性があります。502は、関数が一時的な状態にあるときに発生することがあります。再試行によって問題が解決する可能性があります。 |
原因をさらに特定するには、事前作成済関数のロギング機能を有効にします(ファンクション・ログの格納および表示を参照)。ファンクションのトラブルシューティングの詳細は、OCIファンクションのトラブルシューティングを参照してください。
Walletの組込みファンクション・エラー・メッセージによるデータベース・シークレットのローテーション
次の表は、この組み込み関数の操作時に発生する可能性のあるエラーをまとめたものです。
ステップ | ステータス・コード | レスポンス・メッセージ | 説明 |
---|---|---|---|
VERIFY_CONNECTION | 200 | 保留中のシークレット・バージョンを使用した接続に成功しました! | シークレットの保留中バージョンが存在し、そのバージョンを使用してデータベース接続が正常に確立されました。 |
現在のシークレット・バージョンを使用した接続に成功しました! | 現在のシークレット・バージョンでデータベース接続に成功しました。 | ||
400 | 現在のシークレット・バージョンを使用した接続は失敗しました。 | 現在のシークレット・バージョンまたは保留中のバージョン(存在する場合)の資格証明が無効であるか、ファンクションとデータベース間の接続用のネットワーク構成が正しくありません。 | |
404 | シークレットの現在のバージョンが見つかりません | 指定されたsecretIdのシークレットの現在のバージョンが存在しません。 | |
500 | <例外メッセージ> | 接続の検証中に例外が発生したときにスローされます。 | |
CREATE_PENDING_VERSION | 200 | 保留中のバージョンがすでに存在します。 | シークレットの保留中バージョンはすでに存在します。新規待ち状態バージョンを作成しません。 |
保留中のバージョンが正常に作成されました。 | 待ち状態のバージョンが存在しません。シークレットの新規待ち状態バージョンが作成されます。 | ||
<例外コード> | 保留中のバージョンの作成に失敗しました。 | シークレットの新しい保留中バージョンを作成しようとしているときにDPクライアントから例外が発生しました。 | |
500 | <例外メッセージ> | 新規バージョンの作成中に例外が発生したときにスローされます。 | |
UPDATE_TARGET_SYSTEM | 200 | ターゲット・システムはすでに更新されています。 | データベースは、このバージョンがデータベース資格証明の更新に以前使用されていたことを示す、保留中のシークレット・バージョンを使用して接続できます。 |
ターゲット・システムは正常に更新されました。 | データベース資格証明は、シークレットの保留中のバージョンで更新されました。 | ||
404 | 保留中のバージョンが存在しません。 | ターゲット・システムの更新に使用できるシークレットの保留中のバージョンが存在しません。 | |
500 | ターゲット・システムの更新に失敗しました。 | ターゲット・システムを新しい保留中のバージョン資格証明で更新しようとしましたが、これらの資格証明を使用したデータベース接続の検証に失敗しました。 | |
<例外メッセージ> | ターゲット・システムの更新中に例外が発生したときにスローされます。 | ||
PROMOTE_PENDING_VERSION | 200 | 保留中のバージョンがプロモートされました! | 保留中のバージョンが現在のバージョンにプロモートされました。 |
500 | <例外メッセージ> | 保留バージョンの昇格中に例外が発生したときにスローされます。 |
原因をさらに特定するには、事前作成済関数のロギング機能を有効にします(ファンクション・ログの格納および表示を参照)。
ログ分析のヒント
すべての組み込み関数は、ロギングレベルを構成パラメータとして指定するオプションを提供します。ロギング・レベルをDEBUG
に設定して、詳細情報を取得できます。
アプリケーションには複数の関数があるため、事前に作成された関数ログエントリは接頭辞「PBF | <PBF NAME>」で識別されます。
たとえば、Database Secret Rotation with Walletの事前構築済関数のログ・エントリは次のようになります。
"PBF | Database Secret Rotation with Wallet | INFO | 2024-01-31T18:06:50.809Z | Fetching details from Events JSON"