8 Oracle DatabaseのMicrosoft Azure Active Directoryユーザーの認証および認可

Oracle Databaseは、Microsoft Azure ADユーザーがシングル・サインオンを使用して接続するように構成できます。

8.1 Oracle DatabaseとMicrosoft Azure ADの統合の概要

OracleデータベースにアクセスするためのMicrosoft Azure ADの構成を開始する前に、全体的なプロセスについて理解する必要があります。

8.1.1 Oracle DatabaseとMicrosoft Azure ADの統合の概要

Oracle DatabaseおよびMicrosoft Azure ADは、ユーザーおよびアプリケーションがAzure AD資格証明を使用してデータベースに接続できるように構成できます。

Azure ADのユーザーおよびアプリケーションは、Azure ADシングル・サインオン(SSO)資格証明を使用してログインし、データベースにアクセスできます。これは、ユーザーまたはアプリケーションが最初にAzure ADからリクエストするAzure AD OAuth2アクセス・トークンを使用して行われます。このOAuth2アクセス・トークンには、ユーザーIDおよびデータベース・アクセス情報が含まれ、データベースに送信されます。マルチファクタ認証およびパスワードレス認証の構成の詳細は、Microsoft社の記事Azure Active Directoryのパスワードレス認証オプションを参照してください。

この統合は、次のOracle Database環境で実行できます。

  • オンプレミスOracle Databaseリリース19.18以降
  • 共有Exadataインフラストラクチャ上のOracle Autonomous Database
  • Oracle Autonomous Database on Dedicated Exadata Infrastructure
  • Oracle Base Database Service
  • Oracle Exadata Cloud Service (Oracle ExaCS)

Azure ADを構成する手順では、これらの環境を網羅するために「Oracle Database」という用語を使用します。

このタイプの統合により、Azure ADユーザーはOracle Databaseインスタンスにアクセスできます。Azure ADのユーザーおよびアプリケーションは、Azure ADシングル・サインオン(SSO)資格証明を使用してログインし、Azure ADのOAuth2アクセス・トークンを取得してデータベースに送信できます。

Azure AD管理者は、Oracle Databaseを作成してAzure ADに登録します。Azure AD内では、これはアプリ登録と呼ばれ、アプリケーション登録の略です。これは、Azure ADを使用しているソフトウェアについてAzure ADが理解しておく必要があるデジタル情報です。Azure AD管理者は、Azure ADでデータベース・アプリを登録するためのアプリケーション(アプリ)ロールも作成します。アプリケーション・ロールは、Azureユーザー、グループおよびアプリケーションをデータベース・スキーマおよびロールに接続します。Azure AD管理者は、Azure ADユーザー、グループ、またはアプリケーションをアプリケーションのロールに割り当てます。これらのアプリケーション・ロールは、データベース・グローバル・スキーマ、グローバル・ロール、またはスキーマとロールの両方にマップされます。アプリケーション・ロールに割り当てられたAzure ADユーザー、グループ、またはアプリケーションは、データベース・グローバル・スキーマ、グローバル・ロール、あるいはスキーマとロールの両方にマップされます。Oracleグローバル・スキーマは、Azure ADユーザーに排他的にマップすることもできます。Azure ADゲスト・ユーザー(組織ユーザー以外)またはAzure ADサービス・プリンシパル(アプリケーション)のみ、Azure ADアプリケーション・ロールを介してデータベース・グローバル・スキーマにマップできます。Oracleグローバル・ロールはAzureアプリケーション・ロールからのみマップでき、Azureユーザーからはマップできません。

Azure ADトークンをサポートするように更新されたツールおよびアプリケーションにより、Azure ADでユーザーを直接認証し、データベース・アクセス・トークンをOracle Databaseインスタンスに渡すことができます。SQL*Plusなどの既存のデータベース・ツールを構成して、ファイルの場所からAzure ADトークンを使用できます。このような場合、Azure ADトークンは、Microsoft PowerShellやAzure CLIなどのツールを使用して取得し、ファイルの場所に配置できます。Azure AD OAuth2データベース・アクセス・トークンは、有効期限付きで発行されます。Oracle Databaseクライアント・ドライバは、トークンをデータベースに渡す前に、トークンの形式が有効であることと、有効期限が切れていないことを確認します。トークンのスコープはデータベースです。つまり、トークンにはそのトークンが使用されるデータベースに関する情報が含まれています。データベースAzure ADアプリ登録でAzure ADプリンシパルが割り当てられたアプリケーション・ロールは、アクセス・トークンの一部として含められます。Azure ADトークンのディレクトリの場所には、ユーザーがトークン・ファイルをその場所に書き込み、データベース・クライアントがこれらのファイルを取得するために十分な権限のみ(ユーザーによる読取りおよび書込みのみなど)を付与する必要があります。データベースへのアクセスはトークンによって許可されるため、トークンはファイル・システム内で保護される必要があります。

Azure ADユーザーは、いくつかの方法を使用してAzure ADからトークンをリクエストし、Azureログイン・ウィンドウを開いてAzure AD資格証明を入力できます。

Oracle Databaseは、次のAzure ADプリンシパルを表すトークンを受け入れます。

  • Azure ADユーザー。Azure ADテナンシの登録ユーザーです
  • ゲスト・ユーザー。Azure ADテナンシでゲスト・ユーザーとして登録されているユーザーです
  • サービス。クライアント資格証明フロー(接続プール・ユースケース)を使用し、それ自体としてデータベースに接続する登録済アプリケーションです

Oracle Databaseでは、次のAzure AD認証フローがサポートされています。

  • 認証コード。ブラウザを使用して、クライアント環境のAzure ADへの認証に使用する、(アプリケーションではなく)人間のユーザーに最も一般的に使用されます
  • クライアント資格証明。(エンド・ユーザーとしてではなく)それ自体として接続するデータベース・アプリケーションで使用されます
  • On-Behalf-Of (OBO)。アプリケーションがログイン・ユーザーの代理としてアクセス・トークンを要求してデータベースに送信します
  • リソース所有者パスワード資格証明(ROPC)。本番環境での使用は推奨されませんが、ポップアップ・ブラウザでのユーザー認証の組込みが困難なテスト環境で使用できます。ROPCでは、トークン・リクエスト・コールの一部としてAzure ADユーザー名とパスワード資格証明が必要です。

8.1.2 Oracle DatabaseとMicrosoft Azure ADの統合のアーキテクチャ

Microsoft Azure Active Directoryアクセス・トークンは、OAuth 2.0標準とその拡張に従います。

Azure ADアクセス・トークンは、データベース・クライアント(SQLPlusまたはSQLclなど)からデータベースにアクセスする前に必要です。Oracleクライアント(OCI、JDBC、ODPなど)がファイルの場所からAzure ADトークンを選択するよう構成されたり、トークンはデータベース・クライアントAPIを介してクライアントに渡されることがあります。Azureユーザーはスクリプト(例についてはMicrosoftを参照)を使用してトークンを取得し、それをデータベース・クライアントが取得できるファイルの場所に置くことができます。アプリケーションは、Azure SDKを使用してアクセス・トークンを取得し、データベース・クライアントAPIを介してそのトークンを渡すことができます。アプリケーションが直接トークンを取得できない場合は、Microsoft PowerShellやAzureコマンドライン・インタフェースなどのコマンドライン・ツールを使用して、Azure ADトークンを取得できます。

次の図は、OAuth2トークンを使用したOAuth 2.0標準の一般的なフロー図です。サポートされている各フローの詳細は、Microsoft Azure ADドキュメントの『Authentication flow support in MSAL』を参照してください。

図8-1 対話型認可コード・フローを使用したAzure ADユーザーによるデータベースへのアクセス

図8-1の説明が続きます
「図8-1 対話型認可コード・フローを使用したAzure ADユーザーによるデータベースへのアクセス」の説明

認可コード・フローはOAuth2標準で、標準の一部として詳細に説明されています。フローには2つのステップがあります。最初のステップでは、ユーザーを認証し、認可コードを取得します。2番目のステップでは、認可コードを使用してデータベース・アクセス・トークンを取得します。

  1. Azure ADユーザーは、リソース、Oracle Databaseインスタンスへのアクセスをリクエストします。
  2. データベース・クライアントまたはアプリケーションは、Azure ADからの認可コードをリクエストします。
  3. Azure ADはAzure ADユーザーを認証し、認可コードを返します。
  4. ヘルパー・ツールまたはアプリケーションはAzure ADの認可コードを使用して、OAuth2トークンと交換します。
  5. データベース・クライアントは、OAuth2アクセス・トークンをOracleデータベースに送信します。トークンには、データベースのためのAzure ADアプリケーション登録でユーザーが割り当てられたデータベース・アプリケーション・ロールが含まれます。
  6. Oracle DatabaseインスタンスはAzure AD公開キーを使用して、アクセス・トークンがAzure ADによって作成されたことを確認します。

データベース・クライアントとデータベース・サーバーの両方を、AzureポータルのAzure Active Directoryセクションで「app registrations」機能を使用して登録する必要があります。データベース・クライアントは、Azure ADアプリケーション登録で登録する必要があります。データベース・クライアントには、データベースのアクセス・トークン取得を許可する権限も付与する必要があります。

8.1.3 Oracle DatabaseスキーマおよびロールのAzure ADユーザーのマッピング

Microsoft AzureユーザーをOracle Databaseインスタンスに対して認証するには、その前にMicrosoft AzureユーザーをOracle Databaseスキーマにマップし、(ロールを介して)必要な権限を付与しておく必要があります。

Microsoft Azureでは、Azure AD管理者は、ユーザー、グループおよびアプリケーションをデータベース・アプリケーション・ロールに割り当てることができます。

Azure ADスキーマをデータベース・スキーマに排他的にマップするには、Azure ADユーザーが組織に参加するとき、またはデータベースに対して認可されるときにデータベース管理者がデータベース・スキーマを作成する必要があります。また、データベース管理者は、Azure ADユーザーが割り当てられているタスクに合わせて、データベース・スキーマに付与されている権限およびロールを変更する必要があります。Azure ADユーザーが組織を離れた場合、データベース管理者は、使用されていないアカウントがデータベースに残らないようにデータベース・スキーマを削除する必要があります。データベース・アプリケーション・ロールを使用すると、Azure AD管理者は、グローバル・スキーマとグローバル・ロールにマップされているアプリケーション・ロールにユーザーを割り当てることによってアクセスおよびロールを制御できます。このようにして、データベースへのユーザー・アクセスはAzure AD管理者によって管理されるため、データベース管理者がすべてのユーザーのスキーマを作成、管理および削除する必要はありません。

Azure ADユーザーは、データベース・スキーマ(ユーザー)に排他的にまたはアプリケーション・ロールを介してマップできます。

  • Azure ADユーザーとOracle Databaseスキーマの間の排他的マッピングの作成。このタイプのマッピングでは、Azure ADユーザーに対してデータベース・スキーマを作成する必要があります。Azure ADユーザーが必要とするデータベース権限およびロールは、データベース・スキーマに付与する必要があります。データベース・スキーマは、Azure ADユーザーがデータベースに対して認可された場合に作成するだけでなく、付与された権限およびロールをAzure ADのロールおよびタスクの変更に応じて変更する必要があります。最後に、データベース・スキーマはAzure ADユーザーが組織を離れるときに削除する必要があります。
  • Azure ADアプリケーション・ロールとOracle Databaseスキーマの間の共有マッピングの作成。このタイプのマッピングは排他的マッピングよりも一般的で、アプリケーション・ロールに直接割り当てられるAzure ADユーザーか、アプリケーション・ロールに割り当てられるAzure ADグループのメンバー用です。アプリケーション・ロールは、Oracle Databaseスキーマにマップされます(共有スキーマ・マッピング)。共有スキーマ・マッピングを使用すると、複数のAzure ADユーザーが同じOracle Databaseスキーマを共有できるため、新規ユーザーが組織に加入するたびに新しいデータベース・スキーマを作成する必要はありません。この運用効率により、データベース管理者は、新規ユーザーの構成、権限とロールの更新、およびアカウントの削除を行わずに、データベース・アプリケーションのメンテナンス、パフォーマンスおよびチューニングのタスクに集中できます。

マップされたグローバル・スキーマに直接付与されるデータベース・ロールおよび権限に加えて、マップされたグローバル・ロールを介して追加のロールおよび権限を付与できます。同じ共有グローバル・スキーマにマップされている異なるAzure ADユーザーで、異なる権限およびロールが必要な場合があります。Azureアプリケーション・ロールは、Oracle Databaseグローバル・ロールにマップできます。アプリケーション・ロールに割り当てられているAzure ADユーザーまたはアプリケーション・ロールに割り当てられているAzure ADグループのメンバーであるAzure ADユーザーには、データベースへのアクセス時にOracle Databaseグローバル・ロールが付与されます。

次の図は、使用可能な様々なタイプの割当ておよびマッピングを示しています。

図8-2 Azure ADとOracle Databaseの間の割当てとマッピング

図8-2の説明が続きます
「図8-2 Azure ADとOracle Databaseの間の割当てとマッピング」の説明

これらのマッピングは、次のようになります。

  • Azure ADユーザーは、Oracle Databaseグローバル・スキーマ(ユーザー)に直接マップできます。
  • Azure ADユーザー、Azure ADグループまたはアプリケーションはアプリケーション・ロールに割り当てられ、さらにOracle Databaseグローバル・スキーマ(ユーザー)またはグローバル・ロールのいずれかにマップされます。

8.1.4 Azure ADを使用したOracle Databaseへの接続のユースケース

Oracle Databaseでは、データベースへの接続にいくつかのユースケースをサポートしています。

  • OAuth2認可コード・フロー: 人間のユーザーに対して最も一般的なフローです。クライアントは、Azure ADユーザーにAzure ADで認可コードを取得するよう指示します。このコードは、データベース・アクセス・トークンの取得に使用されます。Microsoft Azureの記事『Microsoft identity platform and OAuth 2.0 authorization code flow』を参照してください。
  • リソース所有者のパスワード資格証明(ROPC): このフローは、本番サーバーではお薦めしません。ポップアップ認証ウィンドウでは動作しないテスト・ソフトウェアで使用できます。これは、非グラフィックのユーザー・インタフェース環境でユーザーの認証にポップアップ・ウィンドウを使用できない場合に使用されます。
  • クライアント資格証明: このフローは、アプリケーションのデータベースへの接続に使用されます。アプリケーションはAzure ADアプリケーションの登録によって登録する必要があり、クライアントIDとクライアント・パスワードが必要です。これらのクライアント資格証明は、アプリケーションがデータベースに接続するときのAzure ADからのデータベース・アクセス・トークン取得に使用する必要があります。アプリケーションは、ファイル・システムまたはデータベース・クライアントAPIを介してトークンを渡すことができます。
  • On-Behalf-Of (OBO)トークン: :Azureアプリケーションは、ログイン・ユーザーのOBOトークンをリクエストします。OBOトークンは、Azure ADユーザー・アイデンティティおよびデータベースに割り当てられたアプリケーション・ロールを持つデータベースのアクセス・トークンでもあります。これにより、Azure ADユーザーはアプリケーションではなくユーザーとしてデータベースにログインできます。Azure ADユーザーのOBOトークンをリクエストし、APIを介してデータベース・クライアントに渡すことができるのはアプリケーションのみです。

8.1.5 Oracle DatabaseでMicrosoft Azure ADアイデンティティを認証する一般的なプロセス

Azure AD OAuth2アクセス・トークンを使用してAzure ADユーザーがデータベースに接続できるように、Oracle Database管理者およびMicrosoft Azure AD管理者がロールを再生します。

一般プロセスは次のとおりです。

  1. Oracle Database管理者は、Oracle Database環境がMicrosoft Azure AD統合の要件を満たしていることを確認します。「Microsoft Azure AD統合のためのOracle Databaseの要件」を参照してください。
  2. Azure AD管理者はデータベースのAzure ADアプリケーション登録を作成し、Oracle Database管理者はデータベース・アクセス用のAzure ADトークンを使用できるようにデータベースを有効にします。

    アプリケーション登録プロセスの一環として、Azure AD管理者は、Azureユーザー、グループおよびアプリケーションとOracle Databaseスキーマおよびロールの間のマッピングに使用するAzureアプリケーション・ロールを作成します。

  3. Oracle Database管理者は、グローバル・スキーマを作成して、Azure ADユーザー(排他的スキーマ・マッピング)またはAzureアプリケーション・ロール(共有スキーマ・マッピング)のいずれかにマップします。Azure ADユーザーまたはアプリケーションは、1つのスキーマにマップする必要があります。
  4. オプションで、Oracle管理者はグローバルOracle Databaseロールを作成し、Azureアプリケーション・ロールにマップします。
  5. Oracle Databaseインスタンスに接続するAzure ADエンド・ユーザーは、クライアント・アプリケーションをAzure ADクライアントとして登録します(Oracleデータベースを登録する方法と同様です)。

    アプリケーション・クライアントがパブリックでないかぎり、Azure ADクライアントにはクライアント識別およびクライアント・シークレットがあります。アプリケーション・クライアントがパブリックの場合は、アプリケーション・クライアント識別のみが必要です。

  6. Azure ADエンド・ユーザー(データベース管理者でもかまいません)は、PowerShellやAzureコマンドライン・インタフェースなどのユーティリティを使用して接続し、OAuth2データベース・アクセス・トークンを取得して、ローカル・ファイル・ディレクトリに格納します。アプリケーションは、Azure ADから直接Azure AD OAuth2アクセス・トークンをリクエストし、データベース・クライアントAPIを介して渡すこともできます。Azure AD OAuth2トークンの受渡しの詳細は、次のOracle Databaseクライアント・ドキュメントを参照してください。
  7. Oracle Databaseインスタンスに接続すると、Azure ADエンド・ユーザーは必要に応じてデータベース操作を実行します。

8.2 Microsoft Azure AD統合のためのOracle Databaseの構成

Oracle DatabaseインスタンスとのMicrosoft Azure AD統合では、データベースをAzure ADに登録する必要があります。

8.2.1 Microsoft Azure AD統合のためのOracle Databaseの要件

Microsoft Azure ADを使用してOracle Databaseインスタンスを構成するには、その前に環境が特別な要件を満たしていることを確認する必要があります。

オンプレミスの非クラウドOracleデータベースの場合は、このドキュメントのステップに従います。Oracleデータベースが次のいずれかのDBaaSプラットフォーム上にある場合は、追加の要件についてプラットフォームのドキュメントを参照してください。

次のことに注意してください。

  • Oracle Databaseサーバーは、Azure AD公開キーをリクエストできる必要があります。エンタープライズ・ネットワーク接続の設定によっては、プロキシ設定の構成が必要になる場合があります。
  • Azure ADトークンをリクエストする必要があるユーザーやアプリケーションは、Azure ADへのネットワーク接続も可能である必要があります。接続のプロキシ設定を構成する必要がある場合があります。
  • トークンを安全に転送するため、Oracle DatabaseクライアントとOracle Databaseサーバーの間にTransport Layer Security (TLS)を構成する必要があります。このTLS接続は、一方向または相互のいずれかです。
  • 自己署名または既知の認証局によって署名されるTLSサーバー証明書を作成できます。既知の認証局(CA)によって署名された証明書を使用する利点は、データベース・クライアントが、ルート証明書を使用してローカル・ウォレットを作成および保持するのではなく、システムのデフォルト証明書ストアを使用してOracle Databaseサーバー証明書を検証できることです。これはLinuxおよびWindowsクライアントにのみ適用されることに注意してください。

8.2.2 Oracle DatabaseインスタンスのMicrosoft Azure ADテナンシへの登録

Azure AD管理者権限を持つユーザーは、Microsoft Azure ADを使用して、Oracle DatabaseインスタンスをMicrosoft Azure ADテナンシに登録します。

  1. アプリケーションを登録するためのMicrosoft Azure AD権限を持つ管理者としてAzureポータルにログインします。
  2. 「Azure Active directory admin center」ページの左側のナビゲーション・バーで、「Azure Active Directory」を選択します。
  3. 「MS - App registrations」ページの左側のナビゲーション・バーで、「App registrations」を選択します。
  4. 「New registration」を選択します。
    「Register an application」ウィンドウが表示されます。azure-reg.pngの説明が続きます
    図azure-reg.pngの説明
  5. 「Register an application」ページで、次のOracle Databaseインスタンス登録情報を入力します。
    • 「Name」フィールドに、Oracle Databaseインスタンス接続の名前(Example Databaseなど)を入力します。
    • 「Supported account types」で、ユースケースに合ったアカウント・タイプを選択します。
      • Accounts in this organizational directory only (tenant_name only - Single tenant)
      • Accounts in any organizational directory (Any Azure AD directory - Multitenant)
      • Accounts in any organizational directory (Any Azure AD directory - Multitenant) and personal Microsoft accounts (e.g. Skype, Xbox)
      • Personal Microsoft accounts only
  6. 「Redirect URI」(オプション)設定は省略します。Azure ADにはデータベース・サーバー用のリダイレクトURIが不要なため、これを作成する必要はありません。
  7. 「Register」をクリックします。
    「Register」をクリックすると、Azure ADにアプリの登録の「Overview」ペインが表示され、「Essentials」の下にアプリケーション(クライアント) IDが表示されます。この値は、Microsoft IDプラットフォーム内のアプリケーションの一意の識別子です。アプリケーションという用語はOracle Databaseインスタンスを指します。
  8. データベース・アプリケーション登録のスコープを登録します。
    スコープとは、データベースにアクセスする権限です。各データベースには、データベース・スコープを使用する権限のリクエストによって、クライアントがデータベースとの信頼を確立できるようにするスコープが必要です。これにより、データベース・クライアントはデータベースのアクセス・トークンを取得できます。
    1. 左側のナビゲーション・バーで、「Expose an API」を選択します。
    2. 「Set the App ID URI」の下の「Application ID URI」フィールドに、次の書式を使用してデータベース接続のアプリケーションID URIを入力し、「Save」をクリックします。
      your_tenancy_url/application_(client)_id

      詳細は、次のとおりです。

      • your_tenancy_urlには、Azure ADテナンシの接頭辞および完全修飾ドメイン名としてhttpsを含める必要があります。
      • application_(client)_idは、Oracle DatabaseインスタンスをAzure ADに登録したときに生成されたIDです。これは、アプリの登録の「Overview」ペインに表示されます。

      例:

      https://sales_west.example.com/1aa11111-1a1z-1a11-1a1a-11aa11a1aa1a
    3. 「Add a scope」を選択し、次の設定を入力します。
      azure-scope.pngの説明が続きます
      図azure-scope.pngの説明
      • 「Scope name」には、スコープの名前を指定します。次の名前を入力します。
        session:scope:connect

        この名前は任意のテキストにできます。ただし、スコープ名の入力は必須です。このスコープ名は、後でデータベース・クライアント・アプリケーションにデータベースへのアクセスを承認するときに使用することが必要になります。

      • 「Who can consent」には、必要な権限を指定します。「Admins and users」を選択するか、より制限を厳しくする場合は「Admins only」を選択します。
      • 「Admin consent」表示名には、管理者のみが表示できるスコープの目的(Connect to Oracleなど)を入力します。
      • 「Admin consent display name」には、管理者のみが表示できるスコープの目的(Connect to Example Databaseなど)を入力します。
      • 「User consent display name」は、スコープの目的の簡単な説明です(たとえば、Connect to Example Database)。これは、ユーザーが「Who can consent」「Admins and users」を指定した場合に表示されます。
      • 「User consent description」は、スコープの目的の詳細な説明です(たとえば、Connect to Example Database)。これは、ユーザーが「Who can consent」「Admins and users」を指定した場合に表示されます。
      • 「State」は、接続を有効または無効にします。「Enabled」を選択します。
これらのステップを完了すると、1つ以上のAzureアプリケーション・ロールを追加し、Oracleスキーマおよびロールのマッピングを実行する準備が整います。

8.2.3 Microsoft Azure AD v2アクセス・トークンの有効化

Microsoft Azure AD v2アクセス・トークンを有効にするには、Azureポータルのupn属性を使用するように構成する必要があります。

Azure AD v2アクセス・トークンは、Autonomous Database Serverlessでのみサポートされており、組織アカウント(Azure AD)と個人用Microsoftアカウント(MSA)の両方の認証を含み、v1トークンよりも幅広いアクセス・シナリオをサポートしています。このトークンは、アプリケーション登録(プレビュー)エクスペリエンスを使用してAzureポータルに登録されているアプリケーションで使用できます。
  1. 使用しているAzure ADアクセス・トークンのバージョンを確認します。
  2. Microsoft Azureポータルにログインします。
  3. 「Azure Active Directory」を検索して選択します。
  4. 「Manage」で、「App registrations」を選択します。
  5. シナリオおよび目的の結果に基づいてオプションの要求を構成するアプリケーションを選択します。
  6. 「Manage」で、「Token configuration」を選択します。
  7. 「Add optional claim」をクリックし、「upn」を選択します。

8.2.4 Microsoft Azure ADでのアプリケーション・ロールの管理

Azure ADでは、Azure ADユーザーおよびグループに割り当てられ、Oracle Databaseのグローバル・スキーマおよびロールにもマップされるアプリケーション・ロールを作成および管理できます。

8.2.4.1 Microsoft Azure ADアプリケーション・ロールの作成

データベースに接続する必要のあるAzure ADユーザー、グループおよびアプリケーションは、データベース・アプリケーション・ロールに割り当てられます。

アプリケーション・ロールの作成方法の詳細は、Microsoft Azureの記事『Create and assign a custom role in Azure Active Directory』を参照してください。次のステップでは、Oracleデータベースで使用するアプリケーション・ロールを作成する方法について説明します。
  1. アプリケーション・ロールを作成する権限を持つ管理者としてAzure ADにログインします。
  2. 作成したOracle Databaseアプリ登録にアクセスします。
    1. 「Directory + subscription」フィルタを使用して、Oracle Databaseアプリ登録を含むAzure Active Directoryテナントを見つけます。
    2. 「Azure Active Directory」を選択します。
    3. 「Manage」で、「App registrations」を選択し、以前に登録したOracle Databaseインスタンスを選択します。
  3. 「Manage」で、「App roles」を選択します。
  4. 「App roles」ページで、「Create app role」を選択します。
  5. 「Create app role」ページで、次の情報を入力します。
    • 「Display name」は、ロールの表示名です(HR App Schemaなど)。この名前には空白を含めることができます。
    • 「Value」は、ロールの実際の名前です(HR_APPなど)。この設定は、スキーマまたはロールへのデータベース・マッピングで参照される文字列と正確に一致させます。この名前にはスペースを含めません。
    • 「Description」では、このロールの目的を説明します。
    • 「Do you want to enable this app role?」では、ロールをアクティブ化できます。
  6. 「適用」をクリックします。

    アプリのロールが「App roles」ペインに表示されます。

    azure-app-roles-creation.pngの説明が続きます
    図azure-app-roles-creation.pngの説明
8.2.4.2 Microsoft Azure ADアプリケーション・ロールへのユーザーおよびグループの割当て

Microsoft Azure ADユーザーがOracleデータベースにアクセスするためには、その前に、Oracle Databaseスキーマ・ユーザーまたはロールにマップされるアプリケーション・ロールにMicrosoft Azure ADユーザーを割り当てておく必要があります。

ユーザーおよびグループをアプリケーション・ロールに割り当てる手順の詳細は、Microsoft Azureの記事『Add app roles to your application and receive them in the token』を参照してください。次のステップでは、Oracleデータベース用にこれを実行する方法について説明します。
  1. Azure ADユーザーおよびグループをアプリケーション・ロールに割り当てる権限を持つ管理者としてAzure ADにログインします。
  2. エンタープライズ・アプリケーションで、作成したOracle Databaseアプリケーション登録の名前を検索します。これは、アプリケーション登録の作成時に自動的に作成されます。
    1. 「Directory + subscription」フィルタを使用して、Oracle接続を含むAzure Active Directoryテナントを見つけます。
    2. 「Azure Active Directory」を選択します。
    3. 「Manage」で、「Enterprise applications」を選択し、以前に登録したOracle Databaseアプリケーション登録名を選択します。
  3. 「Getting Started」で「Assign users and groups」を選択します。
  4. 「Add user/group」を選択します。
  5. 「Add assignment」ウィンドウで、「Users and groups」を選択して、ユーザーおよびセキュリティ・グループのリストを表示します。
  6. このリストから、アプリケーション・ロールに割り当てるユーザーおよびグループを選択し、「Select」をクリックします。
  7. 「Add assignment」ウィンドウで、「Select a role」を選択して、作成したアプリケーション・ロールのリストを表示します。
  8. アプリケーション・ロールを選択し、「Select」を選択します。
  9. 「Assign」をクリックします。
8.2.4.3 アプリケーション・ロールへのアプリケーションの割当て

クライアント資格証明フローを使用してデータベースに接続する必要のあるアプリケーションは、アプリケーション・ロールに割り当てる必要があります。

  1. Azure ADユーザーおよびグループをアプリケーション・ロールに割り当てる権限を持つ管理者としてAzure ADにログインします。
  2. アプリケーションのアプリ登録にアクセスします。
  3. 「Manage」で、「API permissions」を選択します。
  4. 「Configured permissions」領域で、「+ Add a permission」を選択します。
  5. 「Request API permission」ペインで、「My APIs」タブを選択します。
  6. このアプリケーションにアクセスを許可する対象のOracle Databaseアプリケーションを選択します。次に、「Application permissions」オプションを選択します。
  7. アプリケーションに割り当てるデータベース・アプリケーション・ロールを選択し、画面下部の「Add Permission」ボックスをクリックしてアプリケーション・ロールを割り当て、ダイアログ・ボックスを閉じます。割り当てたアプリケーション・ロールが「Configured permissions」の下に表示されることを確認します。
  8. 「Grant admin consent for tenancyを選択してテナンシ・ユーザーに承認を与え、確認ダイアログ・ボックスで「Yes」を選択します。

8.2.5 Oracle Databaseに対するAzure AD外部認証の有効化

Oracle DatabaseでのMicrosoft Azure AD外部認証を有効にする必要があります。

使用しているプラットフォームのAzure AD認証の詳細は、次のドキュメントのリンクを参照してください。
  1. ALTER SYSTEMシステム権限が付与されたユーザーとして、Oracle Databaseインスタンスにログインします。
  2. IDENTITY_PROVIDER_TYPEパラメータを次のように設定します。
    ALTER SYSTEM SET IDENTITY_PROVIDER_TYPE=AZURE_AD SCOPE=BOTH;
  3. IDENTITY_PROVIDER_TYPEパラメータが正しく設定されていることを確認します。
    SELECT NAME, VALUE FROM V$PARAMETER WHERE NAME='identity_provider_type';

    次の出力が表示されます。

    NAME                    VALUE 
    ----------------------  ------- 
    identity_provider_type  AZURE_AD
  4. 次の構文を使用して、IDENTITY_PROVIDER_CONFIGパラメータを設定します。
    ALTER SYSTEM SET IDENTITY_PROVIDER_CONFIG =
    {
       application_id_uri : string , // from registered app, to be mapped in jwt "aud" claim; 
                                     // Domain qualified to support cross tenancy resource access
       tenant_id : string,           // from tenant config
       app_id: string                // from registered resource app
    }SCOPE=BOTH;

    例:

    ALTER SYSTEM SET IDENTITY_PROVIDER_CONFIG =
    {
      "application_id_uri" : "https://www.example.com/11aa1a11-aaaa-1111-1111-1111aa11111",
      "tenant_id" : "111a1111-a11a-111a-1a1a-1111111111a",
      "app_id" : "11aa1a11-aaaa-1111-1111-1111aa11111"
    }SCOPE=BOTH;

Azure AD外部認証のためのOracle Databaseの有効化の詳細は、オンプレミス(非クラウド)のOracleデータベースに関してこのドキュメントで説明する情報に加え、次のプラットフォーム固有のドキュメントを参照してください。

8.2.6 Oracle Databaseに対するAzure AD外部認証の無効化

Oracle DatabaseインスタンスのAzure AD外部認証を無効にするには、ALTER SYSTEM文を使用する必要があります。

Oracle Databaseに加えて、この手順はOracle Autonomous Database on Dedicated Exadata InfrastructureおよびOracle Exadata Cloud Service (Oracle ExaCS)にも使用できます。これらの製品でAzure AD外部認証を無効にする場合は、製品ドキュメントを参照してください。

Oracle Autonomous Database on Shared Exadata InfrastructureからAzure ADを無効にするには、Oracle Autonomous Database Serverlessの使用を参照してください。次の手順は、他のすべてのプラットフォームに適用されます。

  1. ALTER SYSTEMシステム権限が付与されたユーザーとして、Oracle Databaseインスタンスにログインします。
  2. アイデンティティ・プロバイダのパラメータを次のように設定します。
    ALTER SYSTEM RESET IDENTITY_PROVIDER_CONFIG SCOPE=BOTH;
    ALTER SYSTEM RESET IDENTITY_PROVIDER_TYPE SCOPE=BOTH;

8.3 Oracle Databaseスキーマおよびロールのマッピング

Azure ADユーザーは、1つのデータベース・スキーマにマップされ、オプションで1つ以上のデータベース・ロールにマップされます。

8.3.1 Oracle DatabaseスキーマのMicrosoft Azure ADユーザーへの排他的マッピング

Oracle DatabaseスキーマをMicrosoft Azure ADユーザーに排他的にマップできます。

  1. CREATE USERまたはALTER USERシステム権限を付与されたユーザーとして、Oracle Databaseインスタンスにログインします。
  2. Azure ADユーザー名を指定するIDENTIFIED GLOBALLY AS句を使用してCREATE USERまたはALTER USER文を実行します。
    たとえば、peter_fitchという名前の新しいデータベース・スキーマ・ユーザーを作成し、このユーザーをpeter.fitch@example.comという名前の既存のAzure ADユーザーにマップするには、次のようにします。
    CREATE USER peter_fitch IDENTIFIED GLOBALLY AS 
    'AZURE_USER=peter.fitch@example.com';
  3. CREATE SESSION権限をユーザーに付与します。
    GRANT CREATE SESSION TO peter_fitch;

8.3.2 共有Oracleスキーマのアプリケーション・ロールへのマッピング

このマッピングでは、Oracleスキーマがアプリケーション・ロールにマップされます。したがって、そのアプリケーション・ロールを持つすべてのユーザーが同じ共有スキーマを取得します。

  1. CREATE USERまたはALTER USERシステム権限を持つユーザーとして、Oracle Databaseインスタンスにログインします。
  2. Azureアプリケーション・ロール名を指定するIDENTIFIED GLOBALLY AS句を使用してCREATE USERまたはALTER USER文を実行します。
    たとえば、dba_azureという名前の新しいデータベース・グローバル・ユーザー・アカウント(スキーマ)を作成し、それをAZURE_DBAという名前の既存のAzure ADアプリケーション・ロールにマップするには、次のようにします。
    CREATE USER dba_azure IDENTIFIED GLOBALLY AS 'AZURE_ROLE=AZURE_DBA';

8.3.3 アプリケーション・ロールへのOracle Databaseグローバル・ロールのマッピング

AzureアプリにマップされたOracle Databaseグローバル・ロールは、Azureユーザーおよびアプリケーションに、ログイン・スキーマを介して付与されている権限およびロールに加え、さらに権限およびロールを付与します。

  1. CREATE ROLEまたはALTER ROLEシステム権限が付与されたユーザーとして、Oracle Databaseインスタンスにログインします
  2. Azure ADアプリケーション・ロールの名前を指定するIDENTIFIED GLOBALLY AS句を使用してCREATE ROLEまたはALTER ROLE文を実行します。
    たとえば、widget_sales_roleという名前の新しいデータベース・グローバル・ロールを作成し、それをWidgetManagerGroupという名前の既存のAzure ADアプリケーション・ロールにマップするには、次のようにします。
    CREATE ROLE widget_sales_role IDENTIFIED GLOBALLY AS 
    'AZURE_ROLE=WidgetManagerGroup';

8.4 Oracle DatabaseへのAzure ADクライアント接続の構成

登録済データベースに接続するようにクライアント接続を構成できます。

8.4.1 Azure ADへのクライアント接続の構成について

Azure ADトークンを使用してOracle Databaseインスタンスに接続するようにクライアントを構成するには、様々な方法があります。

環境に最も適したクライアント接続方法を選択してください。このガイドでは、Azure AD OAuth2アクセス・トークンを取得する様々な方法を使用してSQL*Plusを接続する例を紹介します。すべてのOracle Databaseリリース19cクライアントで、ファイルとして渡されるトークンを受け入れることができます。JDBC Thin、Instant ClientおよびODP.netドライバは、データベース・クライアントAPIを介してアプリケーションからのトークンも受け入れます。SQL*PlusなどのOracle Databaseツールではトークンを直接取得できないため、PowerShellやAzure CLIなどのツールを使用してAzure AD OAuth2アクセス・トークンを取得する必要があります。Azure ADトークンを取得するには、Azure ADアプリ登録プロセスによってクライアントを登録する必要があります。このクライアントの登録は、アプリ登録を使用したOracle DatabaseサーバーのAzure ADへの登録と同様に行われます。データベースとクライアントの両方をAzure ADに登録する必要があります。

データベースを登録する必要があるのは、クライアントがデータベースのアクセス・トークンを取得する権限を取得できるようにするためです。クライアントを登録する必要があるのは、Azure ADが信頼できるクライアントがアクセス・トークンをリクエストしていることを認識できるようにするためです。

クライアントをAzure ADに接続する方法の詳細は、次のMicrosoft Azureの記事を参照してください。

8.4.2 Azure AD接続でサポートされるクライアント・ドライバ

Oracle Databaseは、Azure AD接続用の複数のタイプのクライアント・ドライバをサポートしています。

  • JDBC Thin: Oracle Database 19.16 (2022年7月)、Oracle Database 21.8 (2022年10月)
  • OCI (Cドライバ): Oracle Database 19.16 (2022年7月)
  • OCIベースのOracle Instant Client
  • Oracle Data Provider (コア): Oracle Database 19.16、Oracle Database 21.7
  • Oracle Data Provider (管理対象外): OCIベース
  • Oracle Data Provider (管理対象): Oracle Database 19.16、Oracle Database 21.7
  • OCIベースのその他のドライバは、OCI互換性を採用しています

8.4.3 PowerShellでのSQL*PlusクライアントからOracle Databaseへの接続の操作フロー

Azureユーザー、Azure ADおよびOracleデータベースの間の接続では、これらのコンポーネントを通じたOAuth2トークンの受渡しが利用されます。

この例では、パブリック・クライアントでのリソース所有者パスワード資格証明(ROPC)フローの使用を示します。ROPCの詳細は、Microsoft Azureの記事『Microsoft identity platform and OAuth 2.0 Resource Owner Password Credentials』を参照してください。

図8-3 パブリック・クライアントを使用したROPC操作フロー

図8-3の説明が続きます
「図8-3 パブリック・クライアントを使用したROPC操作フロー」の説明
  1. AzureユーザーがPowerShellでデータベースのAzure ADアクセス・トークンをリクエストし、返されたトークンが、特定のファイルの場所でtokenというファイルに書き込まれます。
  2. Azureユーザーは、/スラッシュ・ログインを使用してデータベースに接続します。sqlnet.oraまたはtnsnames.oraのいずれかの接続文字列からInstant Clientに、Azure AD OAuth2トークンが必要であり、指定されたファイルの場所からこのトークンを取得するよう指示されます。アクセス・トークンがデータベースに送信されます。
  3. データベースは、(Azure AD公開キーを使用して)アクセス・トークンがAzure ADから取得されたことを確認し、トークンに追加のクレームがないかチェックします。
  4. データベースがスキーマ・マッピング(排他的または共有)を検出し、セッションを作成します。データベースは、Azureユーザーにアプリケーション・ロールによっても割り当てられている、すべてのグローバル・ロールも付与します。

8.4.4 Azure ADアプリ登録によるクライアントの登録

このタイプの登録は、Azure ADアプリ登録によるOracle Databaseの登録と同様に行われます。

8.4.4.1 機密およびパブリック・クライアント登録

ユースケースに応じて、データベース・クライアントを機密またはパブリックとしてAzureに登録できます。

認証フローおよびアプリケーション・シナリオの詳細は、Microsoft Azureの記事『Authentication flows and application scenarios』を参照してください。

機密クライアント・アプリケーションを登録する場合、クライアントにはクライアントIDに加えてシークレットが必要です。機密クライアント・アプリケーションは、Azure ADリクエストを行うときにクライアントIDとシークレットの両方を使用します。ただし、企業においてSQL*PlusおよびSQLclのすべてのユーザーが独自のシークレットを持つ個別のアプリ登録を作成することは実用的ではありません。また、組織内でシークレットを共有し始めると、シークレットはもはやシークレットではなくなります。パブリック・クライアント・アプリケーションのみを作成するほうがはるかに有用です。パブリック・クライアント・アプリケーションはシークレットを持たず、クライアントIDのみを持ちます。すべてのデータベース・ツール・ユーザーは、Azure ADに接続するときにパブリック・クライアントIDを使用して、アクセス・トークンを取得できます。その場合もAzure ADユーザーは、自分のユーザー資格証明を使用してAzure ADに対して認証される必要があります。

8.4.4.2 Azure ADへのデータベース・クライアント・アプリケーションの登録

クライアント・アプリ登録の作成は、Microsoft Azure ADテナンシを使用してOracle Databaseインスタンスを作成する場合と同様に行われます。

  1. アプリケーションを登録するためのMicrosoft Azure AD権限を持つ管理者としてAzureポータルにログインします。
  2. 「Azure Active directory admin center」ページの左側のナビゲーション・バーで、「Azure Active Directory」を選択します。
  3. 「MS - App registrations」ページの左側のナビゲーション・バーで、「App registrations」を選択します。
  4. 「New registration」を選択します。
  5. 「Register an application」ページで、次のOracle Databaseインスタンス登録情報を入力します。
    • 「Name」フィールドに、クライアント・アプリケーションの名前(DatabaseClientApplicationなど)を入力します。
    • 「Supported account types」で、ユースケースに合ったアカウント・タイプを選択します。
      • Accounts in this organizational directory only (tenant_name only - Single tenant)
      • Accounts in any organizational directory (Any Azure AD directory - Multitenant)
      • Accounts in any organizational directory (Any Azure AD directory - Multitenant) and personal Microsoft accounts (e.g. Skype, Xbox)
      • Personal Microsoft accounts only
  6. 「Redirect URI」(オプション)で、クライアント・アプリケーションのリダイレクトURIを構成します。
    azure-redirect-uri.pngの説明が続きます
    図azure-redirect-uri.pngの説明
    • 「Public client/native (mobile & desktop)」「Web」または「Single-page application (SPA)」を選択します。SQL*Plusを使用してOracle Databaseインスタンスにアクセスする必要があるデータベース管理者など、複数のユーザーがこのクライアント・アプリケーションを使用する場合は、「Public client」を選択します。
    • 別のアドレスを使用する場合を除き、リダイレクトURIとしてhttp://localhostを追加します。このリダイレクトURIは、認可フローで必要です。
  7. 「Register」をクリックします。
    これで、データベース・クライアントはAzure ADに登録されました。次は、Oracle Databaseインスタンスの認可クライアント・アプリケーションのリストに新しいクライアントを追加する必要があります。
  8. このクライアント・アプリケーションのリストに新しいクライアントを追加するには、次の手順を実行します。
    1. 新しいクライアントのアプリケーション(クライアント) IDをメモします。このIDはアプリケーションの「Overview」ページにあります。
    2. 「App registrations」ページで、メニューからデータベース・サーバーを選択して、そのアプリの登録ページを開きます。
    3. 左側で、「Expose an API」を選択します。
    4. 「Authorized client applications」が表示されるまで、メイン・ページを下にスクロールします。
    5. 「+」を選択して、クライアント・アプリケーションを追加します。
    6. 新しいクライアントのアプリケーション(クライアント) IDを「Client Id」フィールドにコピーします。
    7. 「Add application」をクリックします。

8.4.5 Azure AD OAuth2トークンの取得の例

次の例では、Azure AD OAuth2トークンを取得するための様々な方法を示します。

8.4.5.1 例: PowerShellで、リソース所有者のパスワード資格証明を使用してトークンを取得する

この例では、PowerShellで、リソース所有者のパスワード資格証明(ROPC)を使用してAzure ADアクセス・トークンを取得する方法を示します。

OAuth2アクセス・トークンを取得するには、PowerShellからRESTコールを実行します。この構成には、Oracle DatabaseインスタンスをAzure ADに登録したときに生成された、またはユーザーが指定した複数の値が必要です。
  1. 必要に応じて、Azure Active Directory PowerShellモジュールをインストールします。
    Microsoftの記事『Install the Azure Az PowerShell module』の手順に従って、Azure PowerShellをダウンロードしてインストールします。インストールの実行には約20分以上かかります。Azure PowerShellのデバッグ・オプションを設定すると、インストールの進捗状況を確認できます。
  2. Azure PowerShellのインストールが完了したら、PowerShellにログインし、次の変数を示されている順番で設定します。
    1. $TenantDomain = "user_tenancy_domain_name"
      この値はテナンシ・ドメイン名です。例:
      $TenantDomain = "example.com"
    2. $AppClientId ="application_client_id"
      この値は、データベース・サーバーではなく、データベース・クライアントのアプリケーション・クライアントIDを設定します。これが、アプリの登録の「Overview」ペインの「Application (client) ID」値です。例:
      $AppClientId ="111a1a1a-aa1a-1a1a-11aa-1a11111111aa"
    3. $Username = "user_name"
      この値は、Oracle DatabaseインスタンスにアクセスするAzureユーザーの名前です。例:
      $Username = "peter.fitch@example.com"
    4. PowerShellスクリプトでのユーザー・パスワードの入力方法は、企業または個人のセキュリティ標準によって異なります。パスワードを安全に取得する独自の方法を使用するか、この例のようにコマンド履歴およびコマンドライン・ウィンドウでパスワードを非表示にしてください。パスワード変数は、使用後に削除する必要があります。これらを次に示す順序で入力します。
      1. $securePassword = Read-Host " Enter Password" -AsSecureString
      2. $Password = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto([System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($securePassword))
    5. $Scope = "database_app_id_uri/scope"
      この値は、データベースのアプリケーションID URIおよびデータベースのスコープ(権限)を/スラッシュで区切って設定します。これらの値は、データベース・アプリ登録の「Expose an API」ページで確認できます。次の例では、https://example.com/111aa1aa-1111-1111-a1a1-1a11a111111aがアプリケーションID URIで、session:scope:connectがスコープです。
      $Scope = "https://example.com/111aa1aa-1111-1111-a1a1-1a11a111111a/session:scope:connect"
    6. $requestBody = @{client_id=$AppClientId;grant_type="password";username=$Username;password=$Password;scope=$Scope;}
      これは、この後行われるRESTコールのリクエスト本文です。
    7. $OAuthResponse = Invoke-RestMethod -Method Post -Uri https://login.microsoftonline.com/$TenantDomain/oauth2/v2.0/token -Body $requestBody
      これは、ユーザーのOAuth2アクセス・トークンを取得します。
    8. 不要な場合は、変数からパスワードを削除できます。
      • $securePassword = $null (安全なパスワード文字列の場合)
      • $Password = $null (クリアテキストのパスワード文字列の場合)
    9. $AccessToken = $OAuthResponse.access_token | Out-File -FilePath .\token -Encoding ASCII (ASCIIエンコーディングを使用して、OAuth2トークンを現在のファイルの場所に書き込む)
  3. Azure AD OAuth2アクセス・トークンはJSON Web Token (JWT)形式のトークンであるため、必要に応じて、トークンのコンテンツをWebサイトにコピーして貼り付けることで、エンコードされたコンテンツのクリアテキストを表示できます。

    https://jwt.io/

    次のことに注意してください。

    • デフォルトのPowerShell UTF16ファイル・エンコーディングはトークンに使用できません。かわりにASCIIエンコーディングを使用してください。
    • トークンは、移動時に行われるファイルのエンコーディングの変更によっては、クロスプラットフォーム(WindowsからLinuxやLinuxからWindowsなど)で動作しない場合があります。
これで、OAuth2アクセス・トークンが取得され、ファイルとして格納されました。次のステップでは、SQL*Plusクライアントがストア・アクセス・トークンを使用し、それをデータベースに送信できるようにします。
8.4.5.2 例: Microsoft Authentication LibraryでPythonを使用して、認可フローを使用する

Microsoft Authentication Library (MSAL)を使用したこの例はPythonで作成されているため、PowerShellやLinuxなどの様々なプラットフォームで実行できます。

ユーザーに対してマルチファクタ認証が有効になっている場合は、ユーザーが2番目の認証を追加するためのOAuth2認可フローが必要です。認可フローではAzure ADへのラウンド・トリップが2回必要であるため、MSALを使用して処理することをお薦めします。MSALでPythonスクリプトを使用する方法は、Microsoftの記事『Get Azure AD tokens by using the Microsoft Authentication Library』を参照してください。これらの手順はDatabricksサービス用ですが、Databricksスコープではなく、データベース・アプリケーションIDのURIとスコープにスコープを変更します。
  1. クライアント・アプリ登録を設定するためのステップはすでに完了しているため、このステップは省略します。ただし、クライアント・アプリ登録のリダイレクトURI (http://localhost)を追加していることを確認してください。
  2. 直接、MSAL Pythonライブラリを使用してAzure ADトークンを取得する手順に進みます。
    ディレクトリ(テナント) ID、パブリック・アプリケーション・クライアントのクライアントIDおよびデータベース・アプリケーションIDのURIおよびスコープが必要になります。scopesのコード・セクションには、この変数を変更しないようにという指示があります。このPythonコードはDatabricksスコープ用に作成されているため、このスコープ変数を、実際に使用するデータベースのスコープにあわせて変更することが必要になります。例:
    scopes = ['https://example.com/1111aa1a-a1aa-1a11-11aa-1a1a11aa1111/session:connect']
  3. トークンをファイルの場所に書き込むようにコードを変更します。
    次のサンプル・コードを使用し、末尾のprint文に追加します。元のstdoutをバックアップしてリストアするための行が追加されていることに注目してください。
    stdout_backup = sys.stdout
    with open('token', 'w') as token_file:
        sys.stdout = token_file
        print(acquire_tokens_result['access_token'])
    
    sys.stdout = stdout_backup
8.4.5.3 例: リソース所有者パスワード資格証明フローでCurlを使用する

この例では、パブリックAzure ADクライアントでリソース所有者パスワード資格証明(ROPC)フローを使用してAzure AD APIに対してcurlコマンドを使用する方法を示します。

このコマンドにはクリアテキスト・パスワードが含まれるため、エンド・ユーザー向けではなく、アプリケーション向けのコマンドです。これは保護される必要があります。
  • 次のcurlコマンドを入力します。
    curl -X POST -H 'Content-Type: application/x-www-form-urlencoded' https://login.microsoftonline.com/az207oracleoutlook.onmicrosoft.com/oauth2/v2.0/token  
    -d 'client_id=571c3f0a-aa3c-4f0a-93ed-4f75748955ea' -d 'scope=https://example.com/383fe7ee-1433-4844-a2d5-5b80d811256d/session:scope:connect' 
    -d 'username=peter.fitch@example.com' -d 'password=password' -d 'grant_type=password'
レスポンスは、トークン・タイプ、スコープ、有効期限および実際のトークンを含むJSONファイルです。アクセス・トークンのみがファイルに書き込まれて格納されるように、このファイルを解析する必要があります。
8.4.5.4 例: Azure CLIを使用した認可フロー

この例では、Azure CLIを使用してアクセス・トークンを取得し、取得したトークンをファイルに書き込む方法を示します。

Azure CLIのインストール方法は、Microsoft Azureの記事『Install the Azure CLI on Linux』を参照してください。
  1. Azureテナンシにログインします。
    $ az login
  2. アクセス・トークンを取得し、次の構文を使用してトークン変数に割り当てます。
    token=$(az account get-access-token --resource=database_app_id_uri --query accessToken --output tsv)

    例:

    token=$(az account get-access-token --resource=https://example.com/1111aa1a-a1aa-1a11-11aa-1a1a11aa1111 --query accessToken --output tsv)

    Azure CLIクライアント・アプリケーションIDにデータベース・リソースにアクセスする権限がないというエラーが表示される場合は、エラー・メッセージからAzure CLIクライアント・アプリケーションIDをコピーして、データベース・リソースに対して認可されるクライアント・アプリケーションのリストに追加します。(Azure ADのデータベース・アプリ登録に移動し、「Expose an API」「Add a client application」の順にクリックします)。

  3. トークンをファイルに書き込みます。
    $ echo "$token" >> token

8.4.6 Azure ADアクセス・トークン用のSQL*Plusの構成

特定の場所からAzure ADデータベース・アクセス・トークンを取得し、/スラッシュ・ログインが使用されるときにそのトークンを使用するように、SQL*Plusを構成する必要があります。

最新のSQL*PlusおよびInstant Clientのみが、Azure AD OAuth2トークンを使用できます。Azure ADトークンにはデフォルトの場所がないため、この場所を指定する必要があります。
  1. Azure ADユーザー・アカウントを持っていることを確認します。
  2. 次のいずれかについて、Azure AD管理者またはOracle Database管理者に確認します。
    • Azure ADトークンの取得に使用できるアプリケーション・クライアントID。アプリケーションを登録するAzure AD権限を持っている場合は、独自のクライアント・アプリ登録を作成します。これは、Oracle DatabaseインスタンスをAzure ADテナンシに登録する場合と同様です。
    • 自分がデータベース内のグローバル・スキーマにマップされていること。
  3. Oracle Databaseクライアント・リリース19cの最新リリース更新を使用していることを確認します。
    この構成は、Oracle Databaseクライアント・リリース19cでのみ機能します。
  4. 既存のプロセスに従ってOracle Databaseインスタンスからウォレットをダウンロードし、SQL*Plusで使用するためにウォレットを構成する手順に従います。
  5. クライアントで、sqlnet.oraファイルの次のパラメータを設定します。
    • パラメータSSL_SERVER_DN_MATCH = ONをチェックして、DN一致が有効であることを確認します。
    • TOKEN_AUTHパラメータを設定して、クライアントがAzure ADトークンを使用できるようにします。トークンの場所を指すTOKEN_LOCATIONパラメータを含めます。例:
      TOKEN_AUTH=OAUTH 
      TOKEN_LOCATION="token_location" 

      デフォルトの場所はないことに注意してください。トークンの名前がtokenの場合は、指定する必要があるのはファイル・ディレクトリ(/test/oracle/aad-tokenなど)のみです。トークン名がtokenと異なる場合(たとえば、azure.token)、この名前をパスに含める必要があります(たとえば、/test/oracle/aad-token/azure.token)。

TOKEN_AUTHおよびTOKEN_LOCATIONパラメータは、tnsnames.oraおよびsqlnet.oraで指定できます。tnsnames.ora接続文字列内のTOKEN_AUTHおよびTOKEN_LOCATION値は、その接続のsqlnet.ora設定より優先されます。例:

(description= 
  (retry_count=20)(retry_delay=3)
  (address=(protocol=tcps)(port=1522)
  (host=example.us-phoenix-1.oraclecloud.com))
  (connect_data=(service_name=aaabbbccc_exampledb_high.example.oraclecloud.com))
  (security=(ssl_server_cert_dn="CN=example.uscom-east-1.oraclecloud.com, 
     OU=Oracle BMCS US, O=Example Corporation, 
     L=Redwood City, ST=California, C=US")
  (TOKEN_AUTH=OAUTH)(TOKEN_LOCATION="/test/oracle/aad-token"))

TOKEN_AUTHおよびTOKEN_LOCATIONパラメータによって接続文字列を更新したら、AzureユーザーはSQL*Plusを起動する次のコマンドを実行して、Oracle Databaseインスタンスにログインできます。接続記述子自体を含めるか、tnsnames.oraファイルからの記述子の名前を使用できます。

connect /@exampledb_high

または、接続文字列を使用できます。例:

connect /@(description= 
  (retry_count=20)(retry_delay=3)
  (address=(protocol=tcps)(port=1522)
  (host=example.us-phoenix-1.oraclecloud.com))
  (connect_data=(service_name=aaabbbccc_exampledb_high.example.oraclecloud.com))
  (security=(ssl_server_cert_dn="CN=example.uscom-east-1.oraclecloud.com, 
     OU=Oracle BMCS US, O=Example Corporation, 
     L=Redwood City, ST=California, C=US") (TOKEN_AUTH=OAUTH)(TOKEN_LOCATION="/test/oracle/aad-token")

TOKEN_AUTHsqlnet.oraファイルまたは接続文字列のいずれかによってすでに設定されているため、データベース・クライアントはAzure OAuth2トークンを取得するようにすでに構成されています。データベース・クライアントはOAuth2トークンを取得し、そのトークンをOracle Databaseインスタンスに送信します。

8.4.7 データベースがインターネットに接続するためのネットワーク・プロキシの作成

このネットワーク・プロキシを使用すると、OracleデータベースはAzure ADエンドポイントに到達できるようになります。

8.4.7.1 データベースがインターネットに接続するためのネットワーク・プロキシの作成について

OracleデータベースはAzure ADエンドポイントに接続する必要があり、ネットワーク構成およびデフォルトのトラスト・ストア・アクセスが必要になる場合があります。

企業内にHTTPネットワーク・プロキシが配置されている場合、デフォルトのOracle Database環境およびOracle Real Applications Clusters環境に対してデータベースを構成できます。データベースは、Azure ADへのTransport Layer Security (TLS)リンクを確立するため、データベース・サーバー上のデフォルトのトラスト・ストアへのアクセスも必要です。これを有効にするには、データベース・サーバーがシステムのデフォルトの証明書ストアにアクセスできることを確認します。

8.4.7.2 デフォルトのOracle Database環境用のネットワーク・プロキシの作成

ネットワーク・プロキシを作成するには、環境変数を設定してからリスナーを再起動する必要があります。

データベースを再起動する必要はありません。
  1. Oracleデータベースがインストールされているサーバーで、http_proxy環境変数を設定します。
    例:
    export http_proxy=http://www-proxy-example.com:80/
  2. リスナーを再起動します。
    lsnrctl stop
    lsnrctl start 
8.4.7.3 Oracle Real Application Clusters環境用のネットワーク・プロキシの作成

ネットワーク・プロキシを作成するには、環境変数を設定してからデータベースを再起動する必要があります。

  1. Oracleデータベースがインストールされているサーバーで、http_proxy環境変数を設定します。
    ネットワーク・プロキシを設定するには、次の構文を使用します。入力するプロキシ・コマンドでは、プロキシ名の前にhttp://が必要であり、プロキシの末尾にポート番号が必要です。
    http_proxy=http://....:80/

    例:

    srvctl setenv database -db db_name -env "http_proxy=http://www-proxy.example.com:80/"
  2. データベースを停止します。
    $srvctl stop database -db db_name
  3. 環境変数の値を表示して、値が正しく設定されていることを確認します。
    $ srvctl getenv database -db db_name

    次のような出力が表示されます。

    db_name:
    http_proxy=http://www-proxy.example.com:80/
    https_proxy=http://www-proxy.example.com:80/
  4. データベースを再起動します。
    $ srvctl start database -db db_name

8.4.8 クライアントによるAzureトークンの直接取得の有効化

クライアント自身がAzureトークンを直接取得できるようにパラメータを設定できます。

この機能は、JDBCシン・クライアント、ODP.NET CoreクラスまたはODP.NET管理対象ドライバ・クラスを使用する環境で使用できます。これにより、クライアントは、次の方法を使用して認証リクエストをユーザーに表示できます。

  • ユーザーがWebアプリケーションを使用している場合、ユーザーの認証を求める認証リクエストがダイアログ・ボックスに表示されます。
  • ユーザーがコマンドライン・シェルで作業している場合、認証リクエストはプロンプトとして表示されます。

これらの認証リクエスト・タイプのいずれかでこの機能を有効にするには、クライアントのsqlnet.oraファイルまたは接続文字列で次のパラメータを設定する必要があります。接続文字列はsqlnet.oraよりも優先されます。

表8-1 トークンを直接取得するパラメータ

パラメータ 説明

TOKEN_AUTH

トークン認証を設定します。次のいずれかの値を入力します。

  • AZURE_DEVICE_CODEは、Azure ADアクセス・トークンをリクエストするためのデバイス・コード・フローに従うようにデータベース・ドライバに通知します。これは、環境がブラウザを開けない場合(コマンドラインのみの環境)に、人間のユーザーにも使用されます。デバイス・コードとAzure ADログインURLがツールの標準出力に書き込まれ、ユーザーが携帯電話またはラップトップのAzure ADにログインし、デバイス・コードを入力します。ユーザーは別のチャネルを介して認証され、認証が成功した場合は引き続きデータベースにアクセスできます。
  • AZURE_INTERACTIVEは、データベースのアクセス・トークンを取得するためにAzure OAuth2対話型(OAuth2認可)フローを進む必要があることをドライバに伝えます。これにより、外部スクリプトを使用せずに、Azure ADから直接トークンを取得するようにデータベース・クライアントが構成されます。これは、SQLclなどのツールにログインし、各自の環境でブラウザ・ウィンドウを開いてAzure ADへの認証を行うことができる人間のユーザー向けです。
  • AZURE_MANAGED_IDENTITYを使用すると、ドライバは、ホスト・システムに割り当てられている識別情報として認証できます。ホスト・システムは、仮想マシンなどのAzure ADによって管理されるリソースである必要があります。
  • AZURE_SERVICE_PRINCIPALを使用すると、ドライバは登録済アプリケーションのシークレットまたは証明書を使用して認証できます。

AZURE_CLIENT_ID

アプリケーションが登録されたときにAzure ADによってアプリケーションに割り当てられた、一意のアプリケーション(クライアント) ID。このアプリケーションは、ユーザーのためにデータベースのアクセス・トークン取得をリクエストするデータベース・クライアントです。

AZURE_DB_APP_ID_URI

アプリケーションID URIは、Azure AD内のアプリケーションを一意に識別するURIです。この値は、データベースのAzure ADアプリケーション登録の概要画面から取得します。

AZURE_TENANT_ID

データベースのAzureテナンシIDを指定します。

8.5 Microsoft Azure ADプロキシ認証の構成

プロキシ認証により、Azure ADユーザーは、アプリケーションのメンテナンスなどのタスクのためにデータベース・スキーマにプロキシできます。

8.5.1 Microsoft Azure ADプロキシ認証の構成について

Azureユーザーはプロキシ認証を使用して、Oracle Autonomous Databaseに接続できます。

プロキシ認証は、通常、実際のユーザーを認証し、アプリケーションを管理するためにスキーマ権限およびロールを含むデータベース・スキーマの使用をユーザーに認可するために使用されます。アプリケーション・スキーマ・パスワードの共有などの代替方法は、安全でないものとみなされ、どの実際のユーザーがアクションを実行したかを監査できません。

たとえば、アプリケーション・データベース管理者である名前付きAzure ADユーザーが資格証明を使用して認証し、データベース・スキーマ・ユーザー(hrappなど)にプロキシできる環境でのユースケースが考えられます。この認証により、Azure AD管理者は、アプリケーションのメンテナンスを実行するためにhrapp権限およびロールをユーザーhrappとして使用できますが、認証にはAzure AD資格証明を使用します。アプリケーション・データベース管理者は、データベースにサインインし、アプリケーション・スキーマにプロキシしてこのスキーマを管理できます。

8.5.2 プロキシ認証のためのAzure ADユーザーの構成

Azure ADユーザーのプロキシ認証を構成するには、このユーザーがすでにグローバル・スキーマへのマッピング(排他的マッピングまたは共有マッピング)を持っている必要があります。Azure ADユーザーがプロキシする別のデータベース・スキーマも使用可能になっている必要があります。

このタイプのユーザーがいることを確認したら、Azure ADユーザーにデータベース・ユーザーへのプロキシを許可するようにデータベース・ユーザーを変更します。
  1. ALTER USERシステム権限を持つユーザーとして、Autonomous Databaseインスタンスにログインします。
  2. ローカル・データベース・ユーザー・アカウントにプロキシする権限をAzure ADユーザーに付与します。
    コマンドではAzure ADユーザーを参照できないため、プロキシはデータベース・グローバル・ユーザー(Azure ADユーザーにマップ)とターゲット・データベース・ユーザーの間で作成する必要があります。
    次の例では、hrappはプロキシ先のデータベース・スキーマで、peterfitch_schemaはユーザーpeterfitchに排他的にマップされるデータベース・グローバル・ユーザーです。
    ALTER USER hrapp GRANT CONNECT THROUGH peterfitch_schema;
この段階で、Azure ADユーザーはプロキシを使用してデータベース・インスタンスにログインできます。例:
CONNECT [hrapp]/@connect_string

8.5.3 Azure ADユーザー・プロキシ認証の検証

Azure ADユーザー・プロキシ構成でトークン認証を検証できます。

  1. CREATE USERおよびALTER USERシステム権限が付与されたユーザーとして、Oracle Autonomous Databaseインスタンスにログインします。
  2. Azure ADユーザーとして接続し、SHOW USERおよびSELECT SYS_CONTEXTコマンドを実行します。
    たとえば、データベース・ユーザーhrappにプロキシするときに、Azure ADユーザーpeterfitchのプロキシ認証を確認するとします。
    CONNECT [hrapp]/@connect_string
    SHOW USER;
    --The output should be USER is "HRAPP "
    SELECT SYS_CONTEXT('USERENV','AUTHENTICATION_METHOD') FROM DUAL;
    --The output should be "TOKEN_GLOBAL"
    SELECT SYS_CONTEXT('USERENV','PROXY_USER') FROM DUAL;
    --The output should be "PETERFITCH_SCHEMA"
    SELECT SYS_CONTEXT('USERENV','CURRENT_USER') FROM DUAL;
    --The output should be "HRAPP"

8.6 Microsoft Azure AD接続のトラブルシューティング

トレース・ファイルを使用して、Microsoft Azure AD接続の問題を診断できます。ORA-12599およびORA-03114エラーを簡単に修正することもできます。

8.6.1 Oracle DatabaseクライアントとAzure ADの接続をトラブルシューティングするためのトレース・ファイル

トレース・ファイルを使用して、Oracle DatabaseとMicrosoft Azure ADの統合に関してトラブルシューティングできます。

8.6.1.1 接続のトラブルシューティングに使用するトレース・ファイルについて

クライアント側でMicrosoft Azure AD接続をトラブルシューティングするために、2つのレベルのトレース・ファイルを生成できます。

生成できるトレース・ファイルの2つのレベルは次のとおりです。

  • 低レベル・トレースでは、エラーの発生時にトレースが出力されます。
    • TCPSがAzure AD接続用に設定されていない場合は、プロトコルがTCPSである必要があるというメッセージが出力されます。
    • SSL_SERVER_DN_MATCHTRUEに設定されていない場合は、値がFALSEであるというメッセージが出力されます。
    • TOKEN_LOCATIONが指定されていない場合は、トークンの場所が存在しないというメッセージが出力されます。
    • 指定されたTOKEN_LOCATIONにトークンが存在しない場合は、メッセージが出力されます。
    • OCI_ATTR_TOKEN_ISBEARERをtrueに設定せずにアプリケーションがトークンを渡した場合、欠落している属性についてのメッセージが出力されます。
    • アプリケーションがOCI_ATTR_TOKEN_ISBEARERTRUEに設定し、トークンを渡さなかった場合、欠落している属性についてのメッセージが出力されます。
    • トークンが期限切れの場合は、メッセージが出力されます。
  • 高レベル・トレースでは、前述のようにエラーの発生時にトレースが出力されます。さらに、次のように、成功時にトレースが出力されます。
    • SSL_SERVER_DN_MATCHが存在する場所(tnsnames.oraまたはsqlnet.ora)が出力されます。また、TRUEに設定されている場合は、TRUEの値が出力されます。
    • アプリケーションでトークンとOCI_ATTR_TOKEN_ISBEARER=trueの両方が設定されている場合は、メッセージが出力されます。
    • TOKEN_AUTHに、正しい値OAUTHが設定されている場合は、その値が出力されます。
    • トークンが期限切れでない場合は、メッセージが出力されます。
8.6.1.2 トークン認証のクライアント・トレースの設定

クライアント側のsqlnet.oraファイルにEVENT設定を追加して、クライアント・トレースを制御できます。

これらのEVENT設定は、IAMおよびAzure ADの両方でOracle Databaseとの接続に使用できます。
  • 次のいずれかの方法を使用します。
    • クライアント側のsqlnet.oraファイルに次の設定を追加します。
      • EVENT_25701=14 (低レベル・トレースの場合)
      • EVENT_25701=15 (高レベル・トレースの場合)
    • 環境変数EVENT_25701を設定します。
      • EVENT_25701=14 (低レベル・トレースの場合)
      • EVENT_25701=15 (高レベル・トレースの場合)
    クライアント・トレース・ファイルは、次の場所に作成されます。
    • Linux: $ORACLE_HOME/log/diag/clients
    • Windows: %ORACLE_HOME%\log\diag\clients

    クライアント側のsqlnet.oraADR_BASEパラメータを使用して、トレース・メッセージが格納されるディレクトリを指定できます。ディレクトリ・パスが有効で、書込み権限があることを確認します。DIAG_ADR_ENABLEDパラメータがFALSEに設定されていないことを確認します。

    ADR_BASEの設定例を次に示します。

    ADR_BASE=/oracle/oauth2/trace

8.6.2 トークンを使用してデータベースにアクセスしようとしたときにORA-12599およびORA-03114エラーが発生する

ORA-12599: 「TNS: 暗号チェックサムの不一致が発生しました」エラーおよびORA-03114: 「Oracleに接続されていません。」エラーは、接続しようとしているデータベースがネイティブ・ネットワーク暗号化によって保護されていることを示します。

トークンを使用してOracleデータベースにアクセスする場合は、ネットワーク・ネイティブ暗号化ではなくTransport Layer Security (TLS)接続を確立する必要があります。これらのエラーを修正するには、TLSがデータベースに対して適切に構成されていることを確認してください。ローカル・データベースのユーザー名とパスワードを使用して構成をテストし、次のSYSCONTEXT USERENVパラメータを確認する必要があります。

  • NETWORK_PROTOCOL

  • TLS_VERSION

8.6.2.1 Azure ADアクセス・トークンのバージョンの確認

JSON WebトークンのWebサイトを使用すると、サイトで使用されているMicrosoft Azure ADアクセス・トークンのバージョンを確認できます。

デフォルトではAzure AD Microsoft Azure AD v1アクセス・トークンですが、サイトでv2の使用が選択されている場合があります。Oracle Databaseではv1トークンがサポートされており、Autonomous Database Serverlessではv2トークンもサポートされています。v2アクセス・トークンを使用する必要がある場合は、Oracleデータベースに対してそれらの使用を有効にできます。使用しているAzure ADアクセス・トークンのバージョンを特定するには、Azure AD管理者に確認するか、次のようにJSON WebトークンのWebサイトからバージョンを確認します。
  1. JSON WebトークンのWebサイトにアクセスします。
    https://jwt.io/
  2. トークン文字列をコピーして「エンコード」フィールドに貼り付けます。
  3. デコードフィールドを確認します。ここにはトークン文字列に関する情報が表示されています。
    そのフィールドの近くか下部に、次のバージョンのいずれかを示すverというクレームが表示されます。
    • "ver": "1.0"
    • "ver": "2.0"