ウォレット関数を使用するデータベース・シークレット・ローテーション

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内に作成されたサービス・ゲートウェイに宛先が設定されたエグレス・ルールが含まれていることを確認します。
  • 次のように、事前作成機能が作成されるアプリケーションからの受信リクエストを許可するように、自律型データベースのネットワーク・アクセスが構成されていることを確認します。

    1. OCIコンソールを使用して自律型データベースを作成または更新する場合は、ページの「ネットワーク・アクセスの選択」領域または「ネットワーク・アクセスの更新」領域を表示します。詳細は、Autonomous Databaseサーバーレスのドキュメントを参照してください。
    2. 次のタイプのネットワーク・アクセスのいずれかを選択します。
      • すべての場所からのセキュア・アクセスの許可:自律型データベースにインターネットからアクセスする場合は、このオプションを選択します。
      • 許可されたIPおよびVCNsからのセキュア・アクセスのみ: VCNsおよびアクセス制御リスト(ACL)のIPからのみ自律型データベースにアクセスする場合は、このオプションを選択します。自律型データベースへのアクセス元のネットワークに従って、1つ以上のアクセス制御ルールを追加します。
      • プライベート・エンドポイント・アクセスのみ: OCI VCN内のプライベート・エンドポイントから自律型データベースにアクセスする場合は、このオプションを選択します。自律型データベースにアクセスするVCNおよびサブネットを選択します。

Wallet関数を使用したデータベース・シークレット・ローテーションの構成

Walletファンクションを使用してデータベース・シークレットのローテーションを構成するには、次のステップを実行します。

  1. 「事前構築済ファンクション」ページで、「Walletを使用したデータベース・シークレット・ローテーション」「ファンクションの作成」の順に選択します。
  2. 次のようにして、「名前」「コンパートメント」および「アプリケーション」を構成します:
    • 名前:新しいファンクションの名前。名前は、文字またはアンダースコアで始まり、文字、数字、ハイフンまたはアンダースコアが続く必要があります。長さは1から255文字です。機密情報の入力は避けてください。

      別のコンパートメントにファンクションを作成するには、「コンパートメントの変更」を選択します。

    • アプリケーション:関数を作成するアプリケーションを選択します。

      適切なアプリケーションが現在のコンパートメントにまだ存在しない場合は、「新規アプリケーションの作成」を選択し、次の詳細を指定します:

      • 名前:新しいアプリケーションの名前。機密情報の入力は避けてください。
      • VCN:アプリケーションでファンクションを実行するVCN (仮想クラウド・ネットワーク)。オプションで、「VCNコンパートメント: 」を選択して、別のコンパートメントからVCNを選択します。
      • サブネット:ファンクションを実行するサブネット(最大3つ)です。オプションで、「サブネット・コンパートメント: 」を選択して、別のコンパートメントからサブネットを選択します。
      • シェイプ:アプリケーションでファンクションをデプロイおよび実行するコンピュート・インスタンスのプロセッサ・アーキテクチャ。アプリケーション内のすべてのファンクションは、同じアーキテクチャのコンピュート・インスタンスにデプロイされ、実行されます。ファンクションのイメージには、選択するアーキテクチャに必要な依存関係が含まれている必要があります。
      • タグ: リソースを作成する権限がある場合、そのリソースにフリーフォーム・タグを適用する権限もあります。定義済タグを適用するには、タグ・ネームスペースを使用する許可が必要です。タグ付けの詳細は、リソース・タグを参照してください。タグを適用するかどうかがわからない場合は、このオプションをスキップするか、管理者に問い合せてください。後でタグを適用できます。
  3. 事前構築済ファンクションのIAMポリシーを構成します。

    デフォルトでは、OCI Functionsは、事前構築済ファンクションの実行に必要なポリシー・ステートメントを使用して、動的グループおよびIAMポリシーを作成します。次の手順を実行します。

    • OCI Functionsで動的グループおよびポリシーを自動的に作成する場合は、デフォルトの動作を受け入れる変更を行いません。
    • OCI Functionsで動的グループとポリシーを自動的に作成しない場合は、「動的グループとIAMポリシーを作成しないでください」を選択します。
    重要

    「動的グループとIAMポリシーを作成しない」オプションを選択した場合は、動的グループとIAMポリシーを自分で定義する必要があります。詳細は、権限を参照してください。

    また、シークレット・ローテーション・サービスがファンクションを起動できるようにIAMポリシーを構成する必要があります。詳細は、権限を参照してください。

  4. 関数メモリーおよびタイムアウト値を次のように構成します。
    • メモリー(MB):ファンクションが実行中に使用できるメモリーの最大量(MB)。これはファンクション・イメージで使用可能なメモリーです。(デフォルト: 512 MB)
    • タイムアウト(秒):ファンクションを実行できる最大時間(秒)。指定された時間内に関数が完了しない場合は、その関数が取り消されます。(デフォルト: 300)
  5. (オプション)プロビジョニングされた同時実行性を構成して、実行インフラストラクチャを常に使用可能にする同時ファンクション呼出しの最小数を指定することで、ファンクションの起動時の初期遅延を最小限に抑えます。(デフォルト: 未選択)

    選択した場合、このファンクションに割り当てられるプロビジョニングされた同時実行ユニットの数を指定します。デフォルト: 20

    プロビジョニングされた同時実行性の詳細は、プロビジョニングされた同時実行性を使用した初期レイテンシの削減を参照してください。

  6. オプションで、「タグ」セクションに任意のタグを入力します。リソースを作成する権限を持つ場合、そのリソースにフリーフォーム・タグを適用する権限もあります。定義済タグを適用するには、タグ・ネームスペースを使用する許可が必要です。タグ付けの詳細は、リソース・タグを参照してください。タグを適用するかどうかがわからない場合は、このオプションをスキップするか、管理者に問い合せてください。タグは後で適用できます。
  7. 「作成」を選択します。

デプロイ・ダイアログに、ファンクションをデプロイするタスクが表示されます(「事前構築済ファンクション・デプロイメントの終了」を参照)。

構成オプション

権限

ファンクションを実行するには、特定の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を使用して作成された関数は、シークレット・サービスによって起動され、シークレットがローテーションされます。

  1. このPBFを使用してファンクションを作成し、ファンクションIDをコピーします。
    1. ナビゲーション・メニューを開き、「アイデンティティとセキュリティ」「Vault」の順に選択します。
    2. 「リスト範囲」で、ボールトに作成したシークレットを含むコンパートメントを選択します。
    3. シークレットのリストから、このPBFを使用してローテーションする必要があるシークレット名を選択するか、新しいシークレットを作成します。
  2. 交代勤務の場合、[ターゲット システム タイプ][関数]を選択します。
  3. ステップ1からコピーしたファンクションIDを「ターゲット・システムID」として追加します。
  4. シークレットが次の要件に従っていることを確認します。
    • シークレットの最初のバージョンを手動で作成する必要があります。次の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)を参照してください。

トラブルシューティング

OCI Functions共通ステータス・コード

次の表に、事前組込み関数の操作時に発生する可能性がある一般的なOCI関数のエラーをまとめます。

エラー・コード Error Message アクション
200 成功 なし
404 NotAuthorizedOrNotFound 必要なポリシーが構成されていることを確認します(Fn ProjectのCLIコマンドを実行すると、404エラーが返されますを参照)。
444 タイムアウト

ファンクションの実行中に、クライアントとOCIファンクション間の接続が中断されました(ファンクションの起動によりクライアントがタイムアウトを報告し、ファンクションのログに444エラーが表示されますを参照)。再試行によって問題が解決する可能性があります。

ほとんどのクライアントの内部タイムアウトは60秒です。組み込み関数のタイムアウトが300秒に設定されている場合でも、次のことが必要になることがあります。

  • OCI CLIを使用する場合: --read-timeout 300を使用します
  • OCI SDKを使用する場合: クライアントの作成時に読取りタイムアウトを300に設定します
  • DBMS_CLOUD.SEND_REQUESTを使用する場合: UTL_HTTP.set_transfer_timeout(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"