※ 本記事は、Can Tuzlaによる”Store Your Credentials in an OCI Vault Secret When Making External Calls from Your Autonomous Database“を翻訳したものです。

2023年7月21日


Oracle Autonomous Database Serverless (ADB-S)は、外部データソースとのやり取り、Webサービスの呼出し、または以前のブログ投稿で確認した電子メールの送信を行う際に、シームレスなユーザー・エクスペリエンスを提供します。他のOracleまたはOracle以外のデータベースへのデータベース・リンクの作成、様々なクラウド・オブジェクト・ストアからのデータのロードまたは外部表の問合せ、UTL_HTTPまたはUTL_SMTPコールの実行は、このようなユースケースの例です。データベース・リンクを作成するか、Webサービス・コールを行うかに関係なく、認証という1つの共通点があります。この認証は、データベース・リンク用にターゲット・データベースに存在するデータベース・ユーザーとして認証するか、使用しているユースケースに応じてHTTP/SMTP認証として認証することを意味する場合があります。ただし、これらの場合はすべて、ユーザー名/パスワードのペアが必要です(オブジェクト・ストア・アクセスにリソース・プリンシパルまたはネイティブ認証を使用していない場合)。Autonomous Databaseでのこれらの資格証明の作成および格納は、DBMS_CLOUD.CREATE_CREDENTIALプロシージャによって処理されます。このブログ投稿では、このようなユースケース用のパスワードをデータベースに格納するのではなく、OCI Vault Secretに格納できる次のレベルに、この手順の機能を使用しない方法について検討します。

この新機能の詳細な説明に進む前に、ADB-Sユーザーにとっての利点を強調したいと思います。:

  • ADB-Sインスタンスでパスワードをレプリケートする必要はありません。これらのパスワードは、すべてのADB-SインスタンスでポイントできるOCI Vaultシークレットに格納できます。
  • 簡単で効率的なパスワード・ローテーション。OCI Vaultでパスワードを直接ローテーションするだけで、ADB-Sインスタンスに自動的に反映されます(ADBは12時間ごとに資格証明オブジェクトをリフレッシュするため、ローテーションがデータベースに反映されるまでに最大12時間かかることに注意してください)。
  • セキュリティ。最後に、パスワードをOCI Vaultの独自のシークレットに格納し、独自の暗号化キーで暗号化します。

このブログ投稿の残りの部分では、2つのADB-Sインスタンス間にデータベース・リンクを作成するときに、この新機能の使用方法を確認します。次のステップに従います。:

  • OCI Vaultにシークレットを作成し、ターゲット・データベース・ユーザーのパスワードを格納します
  • ソースADB-Sインスタンスでリソース・プリンシパルを有効にします
  • データベース・リンクの作成

OCI Vaultにシークレットを作成し、ターゲット・データベース・ユーザーのパスワードを格納

ターゲット・データベースへのデータベース・リンクを作成するには、ターゲット・データベースのユーザー名およびパスワード(スキーマ名およびパスワード)が必要です。ターゲット・データベース・パスワードをシークレットとしてOCI Vaultに格納します。Vaultを作成したら、次のようにターゲット・データベースのパスワードを保持するシークレットを作成します:

Create OCI Vault secret

ソースADB-Sインスタンスでリソース・プリンシパルを有効に

次のステップは、ソース・データベースでリソース・プリンシパルを有効にして、OCI Vaultのシークレットにアクセスし、ターゲット・データベース・ユーザーのパスワードをフェッチできるようにすることです。以前のブログ投稿で既に説明したように、リソース・プリンシパルを有効にする前に、まず動的グループとポリシーを作成する必要があります。

動的グループの有効範囲は、この例のソース・データベースに制限されています。:

resource.id = 'ocid1.autonomousdatabase.oc1.us-sanjose-1.anzw*************'

また、ソース・データベースがテナンシ内のシークレットにアクセスできるようにする次のポリシーも追加します:

Allow dynamic-group ctuzlaDGforVault to read secret-bundles in tenancy

最後に、ソース・データベースでリソース・プリンシパルを有効にします。:

EXEC DBMS_CLOUD_ADMIN.ENABLE_RESOURCE_PRINCIPAL();

この時点では、これまで行ってきたすべての作業は1回のみであることに言及する価値があります。つまり、同じ資格証明を使用して別のデータベース・リンクを作成する必要がある場合、シークレットを作成し、リソース・プリンシパルを再度有効にする必要はありません。

データベース・リンクの作成

データベース・リンクを作成する前に、まずターゲット・データベースの資格証明オブジェクトを作成します。:

BEGIN                                                                         
  DBMS_CLOUD.CREATE_CREDENTIAL(                                                
      credential_name => 'OCI_SECRET_CRED',
      params          => JSON_OBJECT('username'    value 'ADMIN',
                                     'region'      value 'us-sanjose-1',
                                     'secret_id'   value 'ocid1.vaultsecret.oc1.us-sanjose-1.amaa************')
  );                                                                          
END;                                                                          
/

資格証明の作成時にパスワードを指定しなかったことに注意してください。かわりに、パスワードを格納するシークレットのリージョンおよびシークレットOCIDを指定しました。

データベース・リンクを作成する準備ができました。:

BEGIN
  DBMS_CLOUD_ADMIN.CREATE_DATABASE_LINK(
    db_link_name => 'financelink', 
    hostname => 'adb.us-sanjose-1.oraclecloud.com', 
    port => '1521',
    service_name => 'qtr*****_finance_low.adb.oraclecloud.com',
    credential_name => 'OCI_SECRET_CRED');
END;
/ 
select * from dual@financelink;

D
-
X

まとめると、DBMS_CLOUDはOCI Vault統合をサポートするようになり、ADB-SユーザーはパスワードをOCI Vaultにシークレットとして格納できます。これは、データベース・リンクの作成、UTL_HTTPを介したWebサービス・コール、UTL_SMTPを介した電子メールの送信、クラウド・オブジェクト・ストアへのアクセスなど、ユーザー名とパスワードのペアを提供する必要があるユースケースに適用されます。パスワードをOCI Vaultにシークレットとして保存すると、独自の暗号化キーで暗号化できるだけでなく、各データベースのパスワード・レプリケーションを回避することで、パスワード管理(作成、ローテーションなど)が大幅に簡単になります。この機能の詳細は、ドキュメントを参照してください。