Oracle Databaseへの接続
Oracle Data Provider for .NETは、ユーザー名とパスワード、Windowsネイティブ認証、KerberosおよびTransport Layer Security/Secure Sockets Layerなど様々な方法でOracle Databaseに接続できます。この項では、OracleConnection
プロバイダ固有の機能について説明します。内容は次のとおりです。
Oracle Autonomous Databaseへの接続
Oracle Autonomous Databaseには、次のデプロイメント・オプションがあります。
-
Oracle Autonomous Database Serverless (ADB-S)
-
Oracle Autonomous Database on Dedicated Exadata Infrastructure (ADB-D)
-
Exadata Cloud@Customer上のOracle Autonomous Database (ADBC@C)
ADB-Sに接続するには、TLS/SSLを使用する必要があります。ADB-DおよびADBC@Cの場合、TLSの使用はオプションです。現在、Oracle Identity and Access Managementで使用できるのは、ADB-Sのみです。
このドキュメントでは、ADB-Sへの接続方法について説明します。
管理対象外ODP.NET 19.14および21.5以降では、ウォレットなしのTLS接続をサポートしています。
ODP.NET Coreおよび管理対象ドライバ19.13および21.4以降では、ウォレットなしのTLS接続をサポートしています。
ODP.NET Core 19.13.1または21.4.1以降では、Oracle Identity and Access Management (IAM)を使用したトークン・ベースの認証をサポートしています。
管理対象ODP.NET 21.6.1では、IAMを使用したトークン・ベースの認証をサポートするようになりました。
Oracle ADB-Sに接続するときは、NuGetギャラリまたはOracle Webサイトで使用可能な最新のODP.NETドライバ・バージョンを使用することをお薦めします。
ウォレットを使用した接続
次のクイック・スタート・リンクでは、ウォレットの使用時に、ODP.NETおよびOracle Developer Tools for Visual Studioをダウンロード、インストールおよび構成する方法について説明しています。
ウォレットを使用しない接続
ODP.NETを使用してOracle ADB-Sに接続する場合、アプリケーションとともにOracleウォレットまたはOracleネットワーク構成ファイルsqlnet.oraまたはtnsnames.oraをデプロイする必要はありません。かわりに、データ・ソース属性、TLS接続文字列をODP.NET接続の構成情報に指定します。
ODP.NET TLS接続を使用するには、次の手順を実行します。
-
管理対象ODP.NETまたはODP.NET Coreバージョン19.13または21.4以降を取得します。管理対象外ODP.NETの場合、バージョン19.14および21.5を取得できます。下位レベルのバージョンは、ウォレットのないTLS接続をサポートしていません。
-
Autonomous DatabaseインスタンスでTLS接続を有効にします。詳細は、TLSとmTLS認証の両方を許可するためのAutonomous Databaseインスタンスの更新に関する項を参照してください。
-
TLS接続を有効にした後、Autonomous Databaseインスタンスに接続するためのTLS接続文字列をODP.NETデータ・ソースに指定します。TLS接続文字列の表示またはコピーの詳細は、Autonomous DatabaseインスタンスのTNS名および接続文字列の表示に関する項を参照してください。
ノート:
古いTNS名では識別名を使用し、引用符で囲みます。新しいTNS名にはありません。古いTNS名のいずれかを.NET文字列に格納する場合、各引用符の前にバックスラッシュ・エスケープ・シーケンスを追加します(たとえば、\"
)。これにより、.NETでTNS名の一部として引用符が認識されます。
Oracle Identity and Access Managementの使用
Oracle Identity and Access Management (IAM)ソリューションは、クラウド・デプロイメントとオンプレミス・デプロイメントの両方に対してエンタープライズ・アプリケーションへのセキュアなアクセスを提供します。Oracle IAMクラウド・サービスでは、Oracle ADB-Sを含む、Oracleクラウド・サービス全体で統合されたアイデンティティをサポートしています。この機能により、Oracle IAMでサポートされるすべてのサービスにアイデンティティを伝播できます。統合されたアイデンティティにより、管理者とエンド・ユーザーにとってユーザー管理とアカウント管理が容易になります。
IAMユーザーは、IAMデータベース・パスワード・ベリファイア、IAMトークン、またはトークン認証用のデータベース代替パスワードのいずれかを使用して、Oracle Autonomous Databaseインスタンスに接続できます。
IAMデータベース・パスワード・ベリファイアの使用は、Oracle Databaseパスワード認証プロセスに似ています。ただし、Oracle Autonomous Databaseに格納されるパスワード・ベリファイア(パスワードの暗号化ハッシュ)のかわりに、ベリファイアはOracle Cloud Infrastructure (OCI) IAMユーザー属性の一部として格納されます。このオプションは、すべてのODP.NETクライアントでサポートされています。
データベースにIAMトークンを使用する2番目の接続方法は、より新しいものです。トークンベース・アクセスの使用は、Oracle Autonomous Databaseなどのクラウド・リソースに適しています。トークンは、IAMエンドポイントで強制できる強度に基づいています。これはマルチファクタ認証であり、パスワードのみの使用より強力です。バージョン19.13.1および21.4.1以降、ODP.NET Coreではこの新しい接続方法をサポートしています。この機能は、バージョン21.6.1の管理対象ODP.NETに追加されました。これにより、ネイティブOCI認証プリミティブ、特にOCIでサポートされているトークンを使用して、データベースにログオンしたときにOCIユーザーを認証します。OCI IAMと統合して認証を行うことで、OCIのOracle DatabaseはOCIサービスとのシームレスなアイデンティティ統合を実現します。
3番目の接続方法は、IAMトークン認証のデータベース・パスワードです。この方法は、トークン認証にデータベース代替パスワードを使用しているため、IAMデータベース・パスワード・ベリファイアを使用する場合とは異なります。この接続方法は、パスワードを使用したトークンベースの認証とも呼ばれます。ODP.NET Coreおよび管理対象のODP.NETは、バージョン21.6.1以降、この機能をサポートしています。
4番目の接続方法は、IAMシングル・サインオン・トークン(SSO)認証です。ODP.NET 23ai以降、Oracle IAMシングル・サインオンは管理対象プロバイダ・タイプとCoreプロバイダ・タイプでサポートされています。ODP.NETは、IAMトークンの取得および管理を自動的に処理します。Oracle Database 19c (19.16)、23ai以降のバージョンでは、IAM SSOがサポートされます。
関連項目:
Oracle Autonomous Database Serverlessの使用のAutonomous Databaseに対するIdentity and Access Management (IAM)認証の使用も参照してください。
IAMデータベース・パスワード・ベリファイアを使用したクライアント接続の構成
IAMユーザーに必要な認可を構成した後、このユーザーは追加の構成なしでログインできます。
アプリケーションには、Oracle Cloud Infrastructure (OCI)コンソール・パスワードではなく、任意のODP.NETドライバ・タイプを使用したIAMユーザー名とIAMデータベース・パスワードが用意されています。唯一の制約は、ODP.NETドライバがOracle Database 12cパスワード・ベリファイアをサポートする必要がある点です。以前のパスワード・ベリファイアは、IAMではサポートされていません。IAMユーザーがOracle Autonomous Databaseインスタンスに接続するために必要な特別なクライアントまたはツール構成はありません。
トークンを使用したクライアント接続の構成
ODP.NETでは、標準のJSON Webトークン(JWT)で表される署名トークンであるIAMトークンをサポートしています。署名トークン(Proof of Possession (PoP)トークンとも呼ばれる)は、クライアントに認識されている秘密キーに関連付けられています。クライアントは、保護されたリソースに署名とトークンを送信します。保護されたリソースは、署名とトークン自体を検証します。
IAMトークンをOracle Autonomous Databaseに渡す場合、次のオプションがサポートされています。
-
トークン・ファイルの使用: 既存のアプリケーションでは、Oracle Cloud Infrastructure (OCI)コマンドライン・インタフェース(CLI)を使用して、データベース・トークンをファイル・システムに要求して格納し、そのトークン・ファイルを使用するようにODP.NETを構成します。
-
APIの使用: アプリケーションを変更して、IAMからデータベース・トークンを要求し、ODP.NET APIを介してデータベース・トークンをデータベース・クライアントに渡します。
ODP.NETは、データベースへの接続時にデータベース・トークンを提示します。データベースはIAMから公開キーを要求し、データベースはデータベース・トークンを検証します。トークンが有効な場合、データベースはユーザーがメンバーであるIAMグループを要求します。データベースは、ローカル・スキーマ・マッピングを確認して、IAMユーザーがアクセスできるグローバル・スキーマ(排他的または共有)を検索します。スキーマ・マッピングが存在しない場合、ユーザーはデータベースへのアクセスを許可されません。
トークン・ファイルを使用するためのクライアント接続の構成
OCI CLIを使用して、IAMからデータベース・トークンを要求できます。OCI CLIツールを使用してトークンを要求すると、トークンと秘密キーがローカル・マシンのデフォルト・ディレクトリにコピーされます。あるいは、カスタム・ディレクトリを指定することもできます。Windowsオペレーティング・システムでは、デフォルト・ディレクトリはUSERPROFILE環境変数($USERPROFILE/.oci/db-token
など)に基づいています。LinuxおよびmacOSオペレーティング・システムでは、デフォルト・ディレクトリはHOME環境変数( $HOME/.oci/db-token
など)に基づいています。
認証にトークン・ファイルを使用するには:
-
接続文字列でODP.NETユーザーIDを「/」に設定し、パスワードを空のままにします。
-
TOKEN_AUTH
パラメータをOCI_TOKEN
に設定します。このパラメータは、TNS記述子、EZConnect
文字列、sqlnet.ora
ファイルまたはアプリケーション構成ファイルなどの様々なレベルで構成できます。これは、OracleConnection.TokenAuthentication
プロパティを介して接続レベルで、またはOracleConfiguration.TokenAuthentication
プロパティを介してプロセス・レベルで、プログラムによって構成することもできます。 -
デフォルト以外のトークンの場所を使用する場合は、トークン・ファイル・ディレクトリを設定します。特定のトークン・ファイルの場所の設定の詳細は、「トークンを渡すためのODP.NET APIの使用」の項を参照してください。
データベース・トークンの使用が有効になっている場合、Kerberos、Windows認証、TLSなど、他のすべての外部認証方式は使用できません。ただし、クライアント/サーバー接続を暗号化するためのTLSを使用できます。IAMトークンを使用する場合は、これを使用する必要があります。
関連項目:
-
トークン・ファイルの取得に必要なすべてのステップについては、Oracle Autonomous DatabasesのIAMユーザーの認証および認可。
トークンを渡すためのODP.NET APIの使用
アプリケーションは、OCI SDKを使用してIAMユーザーのデータベース・トークンを取得し、APIを介して秘密キーとともにデータベース・トークンをODP.NETに渡すことができます。
データベース・トークンには、トークン内に属性があり、その中には注意が必要なものがあり、詳しく後述します。
-
トークン内の
exp
属性は、トークンの有効期限を表します。 -
トークン内の
sub
属性は、トークンのIAMユーザーを表します。
OracleConnection.AccessToken
プロパティは、OracleAccessToken
オブジェクトに設定できます。OracleAccessToken
オブジェクトは、IAMを介して接続するために必要な署名トークンと秘密キーの両方を指定することで構築できます。
OracleConnection.AccessToken
プロパティがアプリケーションで指定されておらず、TOKEN_AUTH
パラメータがOCI_TOKEN
に設定されている場合、ODP.NETはデフォルトのディレクトリで署名トークンおよび秘密キー・ファイルを検索します。アプリケーションは、TOKEN_LOCATION
パラメータを設定して、このデフォルト・ディレクトリをオーバーライドできます。このパラメータは、TNS記述子、EZConnect
文字列、sqlnet.ora
ファイル、アプリケーション構成ファイルなどの様々なレベルでも構成できます。このパラメータは、OracleConnection.TokenLocation
プロパティを介してODP.NET接続レベルで、またはOracleConfiguration.TokenLocation
プロパティを介してプロセス・レベルで、プログラムによって構成することもできます。
次の表に、署名トークンが指定され、TOKEN_AUTH
/ TokenAuthentication
プロパティが設定されている場合のODP.NETによるIAMの使用方法を示します。
表3-2 IAMおよび署名トークンを使用したODP.NET認証
アプリケーション提供のOracleアクセス・トークン | TOKEN_AUTH/TokenAuthentation設定 | PASSWORD_AUTH / PasswordAuthentation設定 | ODP.NET認証 |
---|---|---|---|
はい |
OCI_TOKEN / |
NOT SET / |
アプリケーション提供トークンによるIAM |
はい |
NOT SET / |
NOT SET / |
アプリケーション提供トークンによるIAM |
いいえ(デフォルト) |
OCI_TOKEN / |
NOT SET / |
ファイル提供トークンによるIAM |
いいえ(デフォルト) |
NOT SET / |
NOT SET / |
Kerberos、Windows、TLS/SSLなどの外部認証 |
はい |
OCI_TOKEN / |
OCI_TOKEN / |
アプリケーション提供トークンによるIAM |
はい |
NOT SET / |
OCI_TOKEN / |
アプリケーション提供トークンによるIAM |
いいえ(デフォルト) |
OCI_TOKEN / |
OCI_TOKEN / |
|
いいえ(デフォルト) |
NOT SET / |
OCI_TOKEN / |
ユーザーID/パスワードが設定されている場合、またはSEPSが有効な |
APIを使用して署名トークンと秘密キーを提供するODP.NETアプリケーションは、トークンの有効期限が近づいているときにコールバックを受信するために、OracleAccessTokenオブジェクトに公開されているRefreshAccessToken
イベントに登録することをお薦めします。.NETイベントは、アプリケーションが期限切れになる前に署名トークンおよび秘密キーをリフレッシュする便利な方法を提供します。
ODP.NETでは、期限切れになる60秒前に、トークン・リフレッシュ・コールバックがトリガーされます。アプリケーションでは、データベースへの新しい接続の作成時に、ODP.NETが常に認証に有効なトークンを持つようにする必要があります。コールバックは認証トークンに対して1回のみ呼び出されることに注意してください。
コールバックによってリフレッシュされたトークンと秘密キーが提供されると、新しい接続はすべて、リフレッシュされたトークンを使用して認証を開始します。ただし、トークンの有効期限は、接続プールからチェックアウトされた既存の接続、または接続プール内でチェックアウトされた既存の接続には影響しません。なんらかの理由で、アプリケーションがコールバックを介して有効なリフレッシュされたトークンおよび秘密キーを提供できない場合は、OracleConnection
オブジェクトのOpenWithNewToken()
メソッドを使用して、新しい署名トークンおよび秘密キーを渡して接続を開くことができます。
トークンの有効期限が切れている場合でも、すでに確立されているアイドル接続が実行されることに注意してください。新しく指定された署名トークンは、新しい接続を作成する場合にのみ使用されます。指定された署名トークンが無効または期限切れの場合、アプリケーションはOracleConnection
オブジェクトに対するOpen()
メソッド呼出し中にエラーを受け取ります。
IAMトークンの機能要件
ODP.NET Core NuGetパッケージでは、IAMトークンを使用するために、アプリケーションは.NET 5.0以降を対象とする必要があります。
管理対象ODP.NETには、IAMトークンを使用するための一意の.NETアセンブリ・バージョンの依存関係がありません。
サンプル・コード
次に、OracleAccessToken
を使用して接続を確立する方法と、リフレッシュされたトークンをOracleRefreshAccessTokenEventArgs
クラス経由で伝播する方法を示すODP.NETサンプル・コードを示します。このサンプル・コードは、管理対象ODP.NETおよびODP.NET Coreと連携します。
// C# using System; using System.IO; using Oracle.ManagedDataAccess.Client; class RefreshDbTokenSample { // Update this path based from where token and private key would be read. private static string tokenPath = @"C:\token_dir"; static void Main(string[] args) { // Create token and private key file path. string tokenFile = Path.Combine(tokenPath, "token"); string privateKeyFile = Path.Combine(tokenPath, "oci_db_key.pem"); // Read token and private key contents. char[] dbToken = File.OpenText(tokenFile).ReadToEnd().ToCharArray(); char[] privateKey = File.OpenText(privateKeyFile).ReadToEnd().ToCharArray(); // Create OracleAccessToken OracleAccessToken accessToken = new OracleAccessToken(dbToken, privateKey); // Set the token refresh call back accessToken.RefreshAccessToken += new OracleRefreshAccessTokenEventHandler(OnRefreshAccessToken); // establish a connection string constr = "user id=/;data source=oracle"; // Create connection object OracleConnection con = new OracleConnection(constr); // Set accessToken to the connection before opening connection. con.AccessToken = accessToken; // Open connection now. con.Open(); Console.WriteLine("Connected using DB Token Authentication"); con.Dispose(); } public static void OnRefreshAccessToken( OracleRefreshAccessTokenEventArgs eventArgs) { // Application code to get Refreshed DB token and private key RefreshToken(out char[] refreshedToken, out char[] refreshedPrivateKey); // Set the refreshed DB token and private key to eventArgs eventArgs.DbToken = refreshedToken; eventArgs.PrivateKey = refreshedPrivateKey; } public static void RefreshToken(out char[] refreshedToken, out char[] refreshedPrivateKey) { refreshedToken = null; refreshedPrivateKey = null; // TODO: Add code to refresh the token. } }
トークン認証用のデータベース代替パスワードを使用したクライアント接続の構成
データベース代替パスワード接続方法では、IAMトークンベース認証に固有のユーザー名とパスワードを使用します。この資格証明セットは、より一般的なデータベース・ユーザー名およびパスワードとは別です。
この機能を使用するには、PASSWORD_AUTH
パラメータをOCI_TOKEN
に設定する必要があります。
IAMは、クライアントがデータベース・ベアラー・トークンをリクエストするためのRESTエンドポイントを公開します。ODP.NETは、TLS 1.2以降を介してエンドポイントからリクエスト・トークンをコールします。ドライバは、ユーザー名、パスワード、OCI IAM URL、テナントのOracle Cloud Identifier (OCID)、データベース・コンパートメント識別子(オプション)、およびリクエスト内のデータベース識別子(オプション)を指定します。データベース識別子が指定されている場合、データベース・コンパートメント識別子は必須になります。レスポンスでベアラー・トークンがODP.NETに返されます。その後、ドライバは返されたベアラー・トークンを送信して、データベースで認証します。
ODP.NETは、追加の接続リクエストが発生したときに再利用するためのトークンをキャッシュします。期限切れになるまでトークンに保持されます。アプリケーションは、接続できるように期限切れになる前にトークンをリフレッシュする必要があります。
ODP.NET代替パスワード資格証明は、アプリケーションで使用するためにセキュアな外部パスワード・ストア(SEPS)ウォレットに安全に格納できます。
IAMトークン認証方法の比較
次の表に、IAMトークン認証オプションの相違点および類似点を示します。
アプリケーションが提供するデータベース・トークンおよび秘密キー | ファイルを介したデータベース・トークンおよび秘密キー | トークン認証の代替ユーザー資格証明 |
---|---|---|
接続文字列でユーザー名を"/"に設定する必要があります。 |
接続文字列でユーザー名を"/"に設定する必要があります。 |
ODP.NET接続文字列のユーザー名とパスワードは代替資格証明を表します。 |
- |
- |
SEPSは資格証明を格納できます。SEPSが有効な場合、まずユーザー名とパスワードが取得されます。次に、パラメータ |
|
|
ユーザー名/パスワードは、接続文字列または |
構成パラメータなし |
|
|
構成パラメータなし |
同じ接続で |
同じ接続で |
|
- |
- |
アプリケーションによって提供されるデータベース・トークンは、署名トークンである必要があります。 |
ファイルから読み取られるデータベース・トークンは、署名トークンである必要があります。 |
IAMから受信したデータベース・トークンはベアラー・トークンです。 |
ODP.NETは、接続を開いたときに、次の情報をデータベースに送信します。
|
ODP.NETは、ファイルからデータベース・トークンおよび秘密キーを読み取り、接続を開いたときに認証のために次の情報をデータベースに送信します。
|
接続を開くと、ODP.NETはユーザー名/パスワードを使用してIAMからデータベース・トークンをリクエストし、そのトークンを認証のためにデータベースに送信します。 |
IAMシングル・サインオン
管理対象ODP.NETおよびODP.NET CoreはOracle IAMシングル・サインオン(SSO)をサポートしているため、フェデレーション・ユーザーを含め、Oracleデータベースおよびクラウド・サービス間でユーザー・アイデンティティを伝播できます。SSOは、Oracle IAMアイデンティティを使用するすべてのサービスにアクセスするために一度ログオンするだけで済むため、エンド・ユーザーにとってより簡単です。ODP.NETはアクセス・トークン管理を自動的に実行するため、.NET開発者にとっても簡単です。アプリケーションは、データベース・トークンおよび秘密キーの処理から解放されます。
ODP.NETにOracle IAM認証パラメータを指定すると、IAMアクセス・トークンが取得されて、データベース接続および後続のすべての接続リクエストが確立されます。トークンは接続プールごとにキャッシュされます。トークンがまもなく期限切れになる場合、ODP.NETは新しいアクセス・トークンを自動的に取得します。
ODP.NET IAM SSOでは、NuGetギャラリのOracle.ManagedDataAccess.Oci
パッケージが必要です。そのパッケージでは、依存関係として自動的にダウンロードされるOracle Cloud Identity Data Plane Service (OCI.DotNetSDK.Identitydataplane
NuGetパッケージ)およびOracle Cloud Identity (OCI.DotNetSDK.Identity
NuGetパッケージ)が使用されます。
IAM SSOを構成するには、ODP.NETにIAM資格証明および接続情報が必要です。次の表の認証パラメータを使用して接続できます。
表3-3 ODP.NET OCI IAMのパラメータ
OCI IAMパラメータ | 説明 |
---|---|
トークン認証 |
OCI IAMアクセス・トークンを取得するための認証フローを指定します |
構成ファイル |
ユーザーIDやテナンシOCIDなど、OCI IAM認証値を取得するための構成ファイルの場所を指定します |
プロファイル |
構成ファイルからODP.NETが使用するプロファイルを指定します |
コンパートメント |
データベースのコンパートメントOracle Cloud IDを指定します |
データベース |
データベースのOracle Cloud IDを指定します |
すべてのOCI IAM認証フローでは、トークン認証パラメータのみが必要です。その他のパラメータはすべてオプションか、または不要です。次の表に、ODP.NETがサポートするすべてのIAM認証フローおよび使用可能なパラメータを示します。
表3-4 ODP.NET OCI IAM認証フロー
OCI IAM認証フロー | 必須パラメータ |
---|---|
APIキー |
|
インスタンス・プリンシパル |
|
リソース・プリンシパル |
|
委任トークン |
|
対話型 |
|
デフォルト |
|
ODP.NETは、次のいずれかの構成の場所からOCI IAMパラメータ値を取得できます。表の上位の場所のパラメータ値は、下位にリストされている場所の値よりも優先されます。
表3-5 ODP.NET OCI IAM構成の場所
構成の場所 | 使用可能なパラメータ |
---|---|
|
|
|
|
|
|
アプリケーション/Web構成ファイル |
|
|
|
ODP.NET OCI IAM SSOは、OciTokenAuthentication
クラス、OracleConnection
UseOciTokenAuthentication
メソッドおよびOracleConfiguration
クラスを介してプログラムにより構成できます。プロバイダは、接続のオープン後にOciTokenAuthentication
オブジェクトを読取り専用に変更して、プールの存続期間中にOCIトークン認証設定が変更されないようにします。設定がロックされると、プールされた新しい接続がリクエストされたときに再利用するために、トークンはキャッシュされます。
ODP.NET OCI IAM SSOコードのサンプル:
OracleConnection conn = new OracleConnection(constr); conn.TokenAuthentication = OracleTokenAuth.OciApiKey; OciTokenAuthentication tokenconfig = new OciTokenAuthentication { ConfigurationFile = "<CONFIGURATION FILE>", Profile = "<PROFILE>", Compartment = "<COMPARTMENT OCID>", Database = "<DATABASE OCID>" } conn.UseOciTokenAuthentication(tokenConfig); conn.Open(); conn.Close();
または、ODP.NET OCI IAM SSOは、tnsnames.ora
、簡易接続プラス、sqlnet.ora
または.NET構成ファイル(あるいはその組合せ)を使用して、ODP.NETコードを変更せずに構成できます。
IAM対話型認証フロー
対話型認証フローの場合、2つの異なるデータ・ソースでユーザー名とテナンシ名の値が同じであるとき、ユーザーは、接続が異なる接続プールに属していても1回のみログインする必要があります。その理由は、これらのすべての接続に同じトークンが使用され、ODP.NETによってキャッシュされるためです。アプリケーションは、新しい接続または新しいプールで使用されないように、ODP.NETにすべてのセッション・トークンのキャッシュをクリアするように指示できます。ClearInteractiveTokenCache
静的メソッドは、既存の接続プール(対話型認証フローで作成されるプール)にキャッシュされたアクセス・トークンをクリアします。既存のオープン接続のみが引き続き機能します。
コード・サンプル: ODP.NET対話型認証フローを使用したOCI IAMシングル・サインオン接続
string username = "user@company.com"; string constr = $"user id=<USERNAME>; data source = db-descriptor1"; OracleConnection conn = new OracleConnection(constr); conn.TnsAdmin = @"C:\DB1\TnsAdmin\"; conn.TokenAuthentication = OracleTokenAuth.OciInteractive; OciTokenAuthentication obj1 = new OciTokenAuthentication() { ConfigurationFile = @"C:\oci_config\config" }; conn.UseOciTokenAuthentication(obj1); conn.Open(); Console.WriteLine("Connected to DB 1."); conn.Close(); string constr2 = $"user id=<USERNAME>; data source = db-descriptor2 "; OracleConnection conn2 = new OracleConnection(constr2); conn2.TnsAdmin = @"C:\DB2\TnsAdmin\"; conn2.TokenAuthentication = OracleTokenAuth.OciInteractive; OciTokenAuthentication obj2 = new OciTokenAuthentication() { ConfigurationFile = @"C:\oci_config\config" }; conn2.UseOciTokenAuthentication(obj2); conn2.Open(); Console.WriteLine("Connected to DB 2."); conn2.Close();
Microsoft Entra IDの使用
ODP.NET 21.7および19.15.1以降、ODP.NETはOracle Databaseへの接続時にMicrosoft Entra ID (Azure Active Directory (AAD)とも呼ばれる)認証をサポートしています。ODP.NETは、ユーザー名とパスワードのかわりにアクセス・トークンを使用してデータベースにアクセスします。
この機能は、Oracleデータベースで一元化されたユーザー認証にAADを使用するアプリケーションおよびサービスに役立ちます。これらのサービスには、ユーザー管理のためにAADに依存するAzureやMicrosoft 365ベースのクラウド・サービス(Microsoft Power BIサービスなど)を含めることができます。
トークン・ベース認証の使用は、エンド・ユーザーにとってより安全で簡単です。ユーザーがリソースにアクセスするたびに資格証明を指定する必要はありません。さらに、リソースは個々のユーザー資格証明を処理および管理する必要がありません。
AADは、OAuth 2.0ユーザー認可標準に準拠しています。OAuth 2.0は、アクセス・トークンを取得し、そのアクセス・トークンを使用してOracleデータベースなどのリソースにアクセスする手段を提供します。
AADは、コア、管理対象および管理対象外のODP.NETドライバでサポートされています。これにはOracle Autonomous DatabaseまたはOracle Database 19.16以降が必要です。
管理対象および管理対象外のODP.NETでは、Azure Active DirectoryのサポートのためにNET Framework 4.5.2以降が必要です。ODP.NET Coreには、Azure Active Directoryをサポートするための一般的なコンポーネント・システム要件よりも詳細な実行時要件はありません。
ODP.NETバージョン23およびOracle Database 23ai以降、AADシングル・サインオンは管理対象ODP.NETおよびODP.NET Coreでサポートされています。ODP.NETは、AADトークンの取得および管理を自動的に処理します。
Azure ADトークンを使用した接続
ファイル・ベースのアクセス・トークンを使用してAADで認証するために管理対象プロバイダまたはコア・プロバイダを使用するODP.NETアプリケーションでは、TOKEN_AUTH
パラメータまたはOracleConfiguration.TokenAuthentication
プロパティをOAUTH
に設定する必要があります。トークンの場所は、その後、TOKEN_LOCATION
パラメータまたはTokenLocation
プロパティで指定されます。OAUTH
を使用する場合は、トークンの場所を明示的に指定する必要があります。そうしないと、エラーが発生します。OAUTH
の場合、この場所は、ファイル"token"があるディレクトリ、またはファイル名を含むフルパスです。
ODP.NETアプリケーションがアクセス・トークンを使用してAADで認証する場合、これらの構成ステップは不要です。アクセス・トークンは、ODP.NET APIを介して提供されます。
開発者はOracleAccessToken
オブジェクトを作成し、OracleConnection.AccessToken
プロパティを介してアクセス・トークンを提供します。アプリケーションでRefreshAccessToken
イベント・ハンドラが設定されている場合、ODP.NETはアクセス・トークンが失効する60秒前に起動します。OracleRefreshAccessTokenEventArgs
パラメータは、コールバック・メソッドでリフレッシュされたアクセス・トークンを提供します。
OracleAccessToken
トークンは、OpenWithNewToken
メソッドをコールするか、または.NETコールバックの呼出し時にOracleRefreshAccessTokenEventArgs.Token
プロパティを設定することによってのみ更新できます。
ODP.NET接続プーリングの場合、OracleAccessToken
オブジェクトが接続プールを区別するために使用され、実際のトークンは有効期限が切れてリフレッシュされることがあるため使用されません。リフレッシュされたアクセス・トークンを使用する必要があるのは、新しい接続のみです。既存のプール接続はアクセス・トークンに依存せず、引き続き機能します。アプリケーションは、常に同じ接続プールが使用されるように、OracleConnection
に同じOracleAccessToken
オブジェクトを指定する必要があります。
TOKEN_AUTH
およびTOKEN_LOCATION
は、tnsnames.ora
およびsqlnet.ora
ファイルでも設定できます。OAuthを管理対象外ODP.NETで使用するには、同等の管理対象外ODP.NET APIがないため、これらのファイルにトークン値を設定します。
サンプル・コード: ODP.NET Azure Active Directory認証の使用
// This is a simple ODP.NET, Core Driver application that connects to an Oracle Autonomous Database // using a token obtained from Azure Active Directory (Azure AD). // Azure.Identity can be obtained through NuGet Gallery. // It will include the Azure.Core and Azure.Identity namespaces. using System; using System.Threading; using Azure.Core; using Azure.Identity; using Oracle.ManagedDataAccess.Client; namespace ConnectToOracleUsingAccessToken { class Program { static void Main() { try { // Retrieve an access token from Azure AD. string token = GetAccessToken(); // Create an instance of an OracleAccessToken. The access token needs to // be passed to the OracleAccessToken constructor as array of characters. var oracleAccessToken = new OracleAccessToken(token.ToCharArray()); // Create an instance of an OracleConnection object. // The developer must provide the appropriate data source setting. var connection = new OracleConnection("User Id=/;Data Source=<oracle>"); // tnsnames.ora, sqlnet.ora, and cwallet.sso must reside in the same // directory as the application executable. These files can be downloaded // from Oracle Cloud for the Oracle Autonomous DB instance. connection.TnsAdmin = @".\"; // Assign the OracleAccessToken to the AccessToken property on the // OracleConnection object. connection.AccessToken = oracleAccessToken; // Open the connection. connection.Open(); // If Open() fails, it will throw an exception. Console.WriteLine("Open success."); // Dispose the OracleConnection object. connection.Dispose(); } catch (Exception ex) { Console.WriteLine(ex); } } // Retrieves an Azure AD access token through the // Service Principal Auth flow using a client secret. static string GetAccessToken() { // The developer must configure the Azure AD parameters below. string clientId = "<client Id of app registration in Azure AD>"; string tenantId = "<tenant Id of Azure AD>"; string clientSecret = "<secret value of app registration in Azure AD>"; string scope = "<scope of DB registration in Azure AD>"; // Create a TokenRequestContext object. var tokenRequestContext = new TokenRequestContext(new[] { scope }); // Create a ClientSecretCredential object. var credentials = new ClientSecretCredential(tenantId, clientId, clientSecret); // Get the access token from Azure AD. AccessToken accessToken = credentials.GetToken(tokenRequestContext, default(CancellationToken)); // Return the access token. return accessToken.Token; } } }
関連項目:
Azure Active Directory ODP.NETのサンプル・コードは、次のOracle .NET GitHubサイトにあります。
https://github.com/oracle/dotnet-db-samples/tree/master/samples/azure-active-directory
Azure ADシングル・サインオンを使用した接続
ODP.NETはAADシングル・サインオン(SSO)をサポートしているため、Oracleデータベースおよびクラウド・サービス間でユーザー・アイデンティティを伝播できます。SSOは、AADアイデンティティを使用するすべてのサービスにアクセスするために一度ログオンするだけで済むため、エンド・ユーザーにとってより簡単です。ODP.NETはアクセス・トークン管理を自動的に実行するため、.NET開発者にとっても簡単です。
ODP.NETにAAD認証パラメータを指定すると、AADアクセス・トークンが取得されて、データベース接続および後続のすべての接続リクエストが確立されます。トークンは接続プールごとにキャッシュされます。トークンがまもなく期限切れになる場合、ODP.NETは新しいアクセス・トークンを自動的に取得します。
ODP.NET AAD SSOでは、NuGetギャラリのOracle.ManagedDataAccess.Azure
パッケージが必要です。そのパッケージでは、依存関係として自動的にダウンロードされるAzure .NET SDK (Azure.Identity
NuGetパッケージ)が使用されます。
AAD SSOを構成するには、ODP.NETにAzure資格証明および接続情報が必要です。次の表のパラメータを使用して接続します。
パラメータ | 説明 |
---|---|
|
これは、Azure ADベアラー・アクセス・トークンを取得するための認証フローを指定します。 |
|
これは、クライアント・アプリケーションがアクセス・トークンをリクエストするAzure AD上の保護されたリソース識別子を指定します。 |
|
これは、アプリケーション(クライアント・アプリケーションまたはデータベース)が登録されるテナント識別子を指定します。テナントは、個人または組織に割り当てられたクラウド・リソースのエンティティまたは論理グループです。 |
|
クライアントIDは、Azure ADに登録されたアプリケーションの識別子です。 |
|
クライアント・シークレットは、Azureクラウド内のリソースの資格証明です。Azure ADに登録されたアプリケーションは、クライアント・シークレットを持つことができます。 |
|
クライアント証明書は、Azureクラウド・リソースのデジタル証明書です。これは、クライアント・シークレットのかわりにも使用できます。 |
|
保護されたクライアント証明書のパスワードを指定します。 |
|
リダイレクトURI (返信URL)は、アプリケーションが正常に認可され、認可コードまたはアクセス・トークンが付与されると、認可サーバーがユーザーに送信するURLです。対話型認可フローで使用されます。 |
|
これは、Azureアカウント・ユーザーのIDです。たとえば:
|
|
これは、Azureアカウントのパスワードです。 |
接続に必要なパラメータは、Azure認証方法およびクラウド・アカウント構成によって異なります。次の表に、ODP.NETがサポートするすべてのAAD認証方法と、それぞれに必要なパラメータまたはオプションで使用できるパラメータを示します。
認証方法 | 必須パラメータ |
---|---|
サービス・プリンシパル |
|
対話型認証 |
|
管理対象アイデンティティ |
|
デフォルト |
|
ユーザー名およびパスワード |
|
デバイス・コード |
|
Azureデフォルト・フローでは、クライアント・ドライバは、シーケンス内の5つの認証フロー(サービス・プリンシパル(クライアント・シークレットを使用)、サービス・プリンシパル(クライアント証明書を使用)、ユーザー名認証フロー、管理対象アイデンティティおよびVisual Studio認証フロー)を評価します。アプリケーションが実行されている環境に基づいて、最も適切なフローが実行されます。
ノート:
ODP.NETは常に.default
AADスコープを使用します。
ODP.NETは、次のいずれかの構成の場所からこれらのAADパラメータ値を取得できます。表の上位の場所は、下位にリストされた後の場所より優先されます。
構成の場所 | 使用可能なパラメータ |
---|---|
|
|
|
|
|
Azureアカウントのユーザー名とパスワードは、それぞれユーザー名とパスワードとして構成できます。 |
ODP.NET接続文字列 |
Azureアカウントのユーザー名とパスワードは、それぞれユーザー名とパスワードとして構成できます。 |
SEPSウォレット |
クライアントIDおよびクライアント・シークレットは、それぞれユーザー名とパスワードとして構成できます。 Azureアカウントのユーザー名とパスワードは、それぞれユーザー名とパスワードとして構成できます。 |
|
|
Azure .NET SDK環境変数 |
|
ODP.NET AAD SSOは、OracleConnection
UseAzureTokenAuthentication
拡張メソッドを使用してプログラムにより構成できます。プロバイダは、接続のオープン後にAzureTokenAuthentication
オブジェクトを読取り専用に変更して、プールの存続期間中にAzureトークン認証設定が変更されないようにします。設定がロックされると、プールされた新しい接続がリクエストされたときに再利用するために、トークンはキャッシュされます。
Azure対話型認証フロー
対話型認証フローの場合、2つの異なる接続でユーザー、アプリケーションID URI、クライアントID、テナントIDおよびリダイレクトURIの値が同じであるとき、ユーザーは、接続が異なる接続プールに属していても1回のみログインする必要があります。その理由は、これらのすべての接続に同じトークンが使用され、ODP.NETによってキャッシュされるためです。アプリケーションは、新しい接続または新しいプールで使用されないように、ODP.NETにすべてのアクセス・トークンのキャッシュをクリアするように指示できます。ClearInteractiveTokenCache
静的メソッドは、既存の接続プール(対話型認証フローで作成されるプール)にキャッシュされたアクセス・トークンをクリアします。既存のオープン接続のみが引き続き機能します。
コード・サンプル: ODP.NET Azure Active Directoryシングル・サインオンの構成および接続
string dbAppIdUri = "<value>"; string clientId = "<value>"; string tenantId = "<value>"; string redirectUri = "<value>"; var conn = new OracleConnection("User Id=/;Data Source=<value>;Connection Timeout=900"); var tokenConfig = new AzureTokenAuthentication { ClientId = clientId, TenantId = tenantId, DatabaseApplicationIdUri = dbAppIdUri, RedirectUri = redirectUri }; conn.WalletLocation = @".\wallet"; conn.TnsAdmin = @".\tns"; conn.TokenAuthentication = OracleTokenAuth.AzureInteractive; conn.UseAzureTokenAuthentication(tokenConfig); conn.Open();
または、AAD SSOは、tnsnames.ora
、簡易接続プラス、sqlnet.ora
、SEPSウォレットまたはAzure .NET SDK環境変数(あるいはその組合せ)を使用して、ODP.NETコードを変更せずに構成できます。
接続文字列属性およびURL
すべてのODP.NETプロバイダは、次の表の接続文字列属性をサポートしています。
管理対象ODP.NETおよびODP.NET Coreは、接続文字列属性のかわりに接続文字列URLを受け入れることができます。これらのURLは、ODP.NET接続文字列値が格納されているAzure、Oracle Cloud Infrastructureまたはローカル・ファイルの一元化された構成プロバイダにアクセスします。
表3-6は、サポートされている接続文字列属性のリストです。
表3-6 サポートされている接続文字列属性
接続文字列属性 | 説明 | デフォルト値 |
---|---|---|
|
データベース・セッションが切断され、リカバリ可能なエラーになった場合に、トランザクションおよび非トランザクション操作を、データベース・リクエストで自動的に非破壊的かつ迅速にリプレイできます。 |
|
|
接続の最小存続時間(秒)。 |
|
|
接続タイムアウト・エラーが発生する前に、新しい接続または接続プールからのアイドル接続を待機する時間(秒)。 |
|
|
接続するデータベースを識別するOracle Netサービス名、接続記述子または簡易接続ネーミング。 |
空の文字列 |
|
管理権限: |
空の文字列 |
|
未使用の確立済接続量が過剰となり、クローズされる接続数。 |
|
|
COM+トランザクションまたは |
|
|
ODP.NET接続プールを使用して、Oracleデータベース・サービス、サービス・メンバー、インスタンスまたはノードの停止時に、プールから接続を事前に削除できます。Oracle RAC、Data Guard、GoldenGateなどの単一インスタンスへのデプロイを含め、Oracle Global Data Servicesを扱います。 |
|
|
ODP.NET接続プールを使用して、ロード・バランシング・アドバイザリおよびサービスの目的に基づき、Oracleデータベース・インスタンス間の作業要求のバランスを調整できます。Oracle RAC、Active Data Guard、GoldenGateなどを含め、Oracle Global Data Servicesを扱います。 |
|
|
プール内のすべての接続が使用された場合に作成される新しい接続の数。 |
|
|
プール内の接続の最大数。 |
|
|
メタデータ情報をキャッシュします。 |
|
|
プール内の接続の最小数。 |
|
|
|
空の文字列 |
|
接続文字列でのパスワード検索。 |
|
|
接続プーリング。 |
|
|
プロキシ・ユーザーのユーザー名。 |
空の文字列 |
|
プロキシ・ユーザーのパスワード。 |
空の文字列 |
|
接続の自動チューニングを有効化または無効化します。 |
|
|
接続がプールに戻るときの文キャッシュの消去。 |
|
|
文キャッシングの有効化と、キャッシュ・サイズ、つまりキャッシュ可能な文の最大数。 |
|
|
ODP.NETが ODP.NET管理対象外ドライバでは使用できません。 |
空の文字列 |
|
この属性は、アクセス・トークン認証タイプを指定します。指定できる値は、 管理対象ODP.NETおよびODP.NET Coreでのみサポートされます。 |
|
|
この属性は、ファイルベースのトークンの場所です。この値には、"token"という名前のファイルがあるディレクトリ、またはファイルのフルパス指定を指定できます。 管理対象ODP.NETおよびODP.NET Coreでのみサポートされます。 |
トークン認証タイプによって異なります |
|
Oracleユーザー名。 |
空の文字列 |
|
プールから発生した接続の検証。 |
|
|
ODP.NETウォレット・ディレクトリ。 ODP.NET管理対象外ドライバでは使用できません |
空の文字列 |
|
PKCS #12ウォレット・パスワードを格納します |
空の文字列 |
次の例は、Oracle Databaseへの接続に接続文字列属性を使用します。
// C# using System; using Oracle.DataAccess.Client; class ConnectionSample { static void Main() { OracleConnection con = new OracleConnection(); //using connection string attributes to connect to Oracle Database con.ConnectionString = "User Id=scott;Password=tiger;Data Source=oracle"; con.Open(); Console.WriteLine("Connected to Oracle" + con.ServerVersion); // Close and Dispose OracleConnection object con.Close(); con.Dispose(); Console.WriteLine("Disconnected"); } }
関連項目:
-
接続文字列の詳細は、OracleConnectionプロパティを参照してください。
-
文キャッシングの詳細は、OracleCommandオブジェクトを参照してください。
接続文字列ビルダー
OracleConnectionStringBuilder
クラスでは、エラーを起こしにくく、管理しやすい接続文字列を作成します。
このクラスを使用することによって、開発者は設定ファイルを使用した接続文字列の提供およびキー/値ペアによる動的な値の設定が可能です。設定ファイル・エントリの例は次のとおりです。
<configuration> <connectionStrings> <add name="Publications" providerName="Oracle.DataAccess.Client" connectionString="User Id=scott;Password=tiger;Data Source=inst1" /> </connectionStrings> </configuration>
接続文字列情報は、接続文字列名を指定して取得できます。この例ではPublications
です。次に、providerName
に基づいて、そのプロバイダ用の適切なファクトリを取得できます。これにより、接続文字列を簡単に管理および変更できます。さらに、これによって接続文字列への文字列注入に対してより優れたセキュリティを提供します。
データ・ソース属性の指定
この項では、データ・ソース属性を指定する複数の方法について説明します。
次の例は、tnsnames.ora
ファイル内のsales
というTNS別名にマップされた接続記述子を示しています。
sales= (DESCRIPTION= (ADDRESS= (PROTOCOL=tcp)(HOST=sales-server)(PORT=1521)) (CONNECT_DATA= (SERVICE_NAME=sales.us.acme.com)))
接続プールは別名の完全ディスクリプタを保持しているので、同じ接続文字列を使用するそれ以降の接続要求については、その別名を再度解決する必要がなくなります。これは、tnsnames.ora
、.NET構成データ・ソースおよびLDAP別名に当てはまります。接続プールのキャッシュで保持されている完全ディスクリプタを消去するには、OracleDataSourceEnumerator.GetDataSources()
を呼び出し、その後にOracleConnection.ClearPool()
またはOracleConnection.ClearAllPools()
を呼び出します。
接続プーリングが使用されていない場合は、別名を解決して完全ディスクリプタを得る処理を要求のたびに行う必要があります。LDAPの場合は、LDAPサーバーへの問合せが接続要求のたびに発生します。
TNS別名の使用
TNS別名を使用してscott/tiger
として接続するには、有効な接続は次のようになります。
"user id=scott;password=tiger;data source=sales";
接続記述子の使用
ODP.NETでは、アプリケーションはtnsnames.ora
ファイルを使用せずに接続することもできます。そのためには、接続記述子全体を"data
source"
として使用できます。
接続文字列は次のようになります。
"user id=scott;password=tiger;data source=" + "(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)" + "(HOST=sales-server)(PORT=1521))(CONNECT_DATA="+ "(SERVICE_NAME=sales.us.acme.com)))"
簡易接続および簡易接続プラスのネーミング・メソッド
簡易接続および簡易接続のプラス・ネーミング・メソッドを使用すると、クライアントは構成を行わずにデータベースに接続できます。
これが有効になっていると、ODP.NETにより、アプリケーションではData Source
属性を次の書式で指定できます。
//host:[port]/[service_name]
同じ例を使用して、有効な接続文字列を次に示します。
"user id=scott;password=tiger;data source=//sales-server:1521/sales.us.acme.com" "user id=scott;password=tiger;data source=//sales-server/sales.us.acme.com" "user id=scott;password=tiger;data source=sales-server/sales.us.acme.com"
ポート番号が指定されていない場合、デフォルトで1521が使用されます。
簡易接続は、クラスタ・データベースやクラウド・データベースなど、より広範なアプリケーションをサポートするために、また使いやすいように、ODP.NET 19cで拡張されました。今回改善された機能を簡易接続プラスと言い、その機能は次のとおりです。
-
SSL/TLS付きTCP/IP/
-
任意のSQL*Net記述レベル・パラメータを使用可能
-
複数のホストおよびポート
-
名前/値ペアのわかりやすい書式
この構文では、疑問符記号?
を使用して名前/値ペアの開始を示し、アンパサンド記号&
を使用してそれぞれの名前/値ペアを区切ります。接続文字列全体を単一の文字列として指定する必要があります。パラメータ値では、先頭と末尾の空白は無視されます。値の一部として空白が必要な場合は、二重引用符内に配置する必要があります。ODP.NET 23.5では、Easy Connect Plusでのアドレス・リストのサポートが追加されました。
簡易接続プラスの構文:
[[protocol:]//]host1{,host2}[:port1]{,host3:port2}{;host4{,host5}[:port3]} [/[service_name][:server][/instance_name]][?parameter_name=value{¶meter_name=value}]
簡易接続プラスのサンプル:
tcps://sales1.us.example.com:1522,sales2.us.example.com;sales3.us.example.com,sales4. us.example.com/MyServiceName?WALLET_LOCATION=/wallets
tcps://salesserver1:1521/sales.us.example.com
salesserver1:1521,salesserver2,salesserver3:1522/sales.us.example.com
tcps://salesserver1:1521/sales.us.example.com?wallet_location=D:/oracle
tcps://salesserver1:1521/sales.us.example.com?ssl_server_cert_dn=cn=sales,cn=OracleContext,dc=us,dc=example,dc=com
tcps://salesserver1:1521/sales.us.example.com?https_proxy=www-proxy.mycompany.com&https_proxy_port=80
salesserver1:1521/sales.us.example.com?connect_timeout=60&transport_connect_timeout=30&retry_count=3
関連項目:
簡易接続ネーミング・メソッドの使用の項に関する詳細および要件は、『Oracle Database Net Services管理者ガイド』を参照
LDAPの使用
ODP.NETは、Oracle Internet DirectoryやMicrosoft Active DirectoryなどのLDAP準拠ディレクトリ・サーバーに含まれる接続記述子にマップされる接続識別子で接続できます。
ODP.NET LDAP接続を有効にするには、ldap.ora
ファイルを使用して構成情報を指定します。
ODP.NET管理対象外ドライバのLDAPを構成するには、Oracle Database Net Services管理者ガイドで、ディレクトリ・ネーミング・メソッドの構成に関する項の手順に従ってください。
ODP.NET管理対象ドライバのLDAPを構成するには、settingsセクションとLDAPsettingsセクションの手順に従ってください。
Oracle Databaseリリース18c、バージョン18.1からは、組織は一元管理されたユーザー (CMU)をActive Directoryで使用できます。この機能は、一元的なID管理ソリューションとしてActive Directoryを使用することを望む組織のために設計されています。組織は、CMUおよびActive DirectoryでKerberos、PKIまたはパスワード認証を使用できます。
LDAPチャネル・バインディングとLDAP署名は、LDAPクライアントとActive Directoryドメイン・コントローラ間の通信セキュリティを強化する方法です。バージョン19以降、管理対象ODP.NETおよびODP.NET Core LDAPネーミング・アダプタは、Microsoft LDAPの強化ガイダンスに完全に準拠しています。
関連項目:
-
Using LDAPを使用するセクションの詳細と要件は、Oracle Database Net Services管理者ガイドとOracle Databaseセキュリティ・ガイドを参照してください。
-
LDAPチャネル・バインディングおよびLDAP署名の有効化のためのMicrosoftのガイダンス
LDAP URLネーミング
LDAP URLネーミングを使用すると、クライアントは、SQLNET.ORA
およびLDAP.ORA
構成ファイルなしでLDAPサーバーに格納されているTNS別名を解決できます。
サポートされている構文:
ldap[s]://host[:port]/name[,context][?parameter=value{¶meter=value}]
host
は、ホスト名またはIPアドレスです。
port
は、使用されるポートです。デフォルトのポート番号は、LDAPSでは636、LDAPでは363です。
name[,context]
は次のいずれかです:
-
alias
,Default_Admin_Context
-
alias
,CN
=OracleContext
,Default_Admin_Context
-
CN
=alias
,Default_Admin_Context
-
CN
=alias
,CN
=OracleContext
,Default_Admin_Context
Default_Admin_Context
は、LDAP.ORA
のDEFAULT_ADMIN_CONTEXT
パラメータの値です。
パラメータ:
-
DIRECTORY_SERVER_TYPE
は、OID
、OUD
、AD
にでき、デフォルトはOID
です。 -
AUTHENTICATE_BIND
はtrueまたはfalseにでき、デフォルトはfalseです。 -
AUTHENTICATE_BIND_METHOD
には、ウォレットからユーザー名/パスワードを使用することを示すLDAPS_SIMPLE_AUTH
またはNONE
を指定できます。 -
WALLET_LOCATCION
では、ウォレットの場所を指定します。URLにWALLET_LOCATION
がなく、必要な場合は、SQLNET.ORA
から取得されます。 -
LDAP_CONN_TIMEOUT
は、LDAP接続タイムアウト(秒)を指定します。
LDAP URLを使用して別名を解決する場合、 SQLNET.ORA
のWALLET_LOCATION
パラメータを除き、SQLNET.ORA
およびLDAP.ORA
のすべてのLDAP関連パラメータは無視されます。
ウォレットなしのLDAPS構成
バージョン23.4以降、ODP.NET管理対象ドライバおよびコア・ドライバのLDAPネーミング・アダプタは、ウォレットなしのSSLをサポートしています。一方向TLSでは、LDAPクライアント証明書は必要ありません。サーバーのODP.NET LDAPネーミング・アダプタ認証には、信頼できる認証局(CA)のクライアント・ウォレットを指定できます。ウォレットがないと、信頼できるCAはローカル・ホストのデフォルトのトラストポイントから取得されます。ウォレット・ファイルがないと、LDAPS接続構成が簡単になります。
LDAPSウォレットなし一方向TLSは、次の2つの方法のいずれかで使用できます。
-
LDAPサーバーで、.NETルート/ローカル・マシン・ストアで定義されているO/Sの信頼できる認証局によって署名された証明書/ウォレットを使用している場合、LDAPクライアントに対して、Oracleウォレットの場所の設定解除以外の変更は必要ありません(すでに設定されている場合)。
-
LDAPサーバーで自己署名証明書/ウォレットを使用する場合は、LDAPサーバー証明書/ウォレットの自己署名ルート証明書(公開キー)をクライアント・マシンのルート証明書ストア(ルート/ローカル・マシン)に挿入する必要があります。
TCPSプロトコルが指定され、次のいずれかの場合に、ODP.NET LDAPネーミング・アダプタは一方向TLSを使用して接続を試みます。
-
ウォレットの場所の設定が存在しない場合か、または
-
ウォレットの場所がシステムに設定されている場合。
WebSocketの使用
WebSocketは、単一のTCP接続を介して全二重通信チャネルを提供するプロトコルです。SSL/TLSを使用したWebSocketは、セキュアなWebSocket接続を提供します。WebSocketはHTTPの拡張機能であり、HTTPプロキシおよび仲介サービスと連携できます。
ODP.NET Core、管理対象プロバイダおよび管理対象外プロバイダはいずれも、Oracle Database 19c以上でWebSocketおよびセキュアなWebSocketプロトコルをサポートしています。
ODP.NET WebSocket構成
WebSocketおよびセキュアなWebSocketを接続記述子を使用して設定するには、tnsnames.ora
、.NET構成ファイルまたはOracleDataSourceCollection
クラスで、PROTOCOLをWebSocketの場合はWSに、セキュアなWebSocketの場合はWSSに設定します。
WebSocket Uniform Resource Identifier (URI)は、tnsnames.ora
、sqlnet.ora
、.NET構成ファイルおよびOracleConfiguration
クラスで設定できます。
ODP.NET構成ファイルのWebSocket URI設定の例:
<oracle.manageddataaccess.client> <version number="*"> <settings> <setting name="SQLNET.URI" value="<WebSocket URI>"/> </settings> </version> </oracle.manageddataaccess.client>
OracleConfigurationのWebSocket URI設定C#の例:
OracleConfiguration.SqlNetURI = <WebSocket URI>;
管理対象外ODP.NETでURIを設定する場合、フォワード・スラッシュ文字で開始することはできません。管理対象ODP.NETの場合、URIの先頭のフォワード・スラッシュはオプションです。
Transport Layer SecurityとSecure Sockets Layerの使用
Transport Layer Security (TLS)とその前身であるSecure Sockets Layer (SSL)は、ネットワーク接続を保護する業界標準プロトコルです。
ODP.NET Core、管理対象バージョンおよび管理対象外バージョンは、データベースとトランスポート認証用のウォレットで一方向および双方向のTLS/SSLをサポートします。ODP.NET Core、管理対象および管理対象外は、ウォレットなしの一方向のTLSもサポートします。ウォレットを提供する必要がなければ、Oracle Autonomous Databaseなどのデータベース接続を簡素化できます。
Secure Sockets LayerとTransport Layer Securityの差異
SSLは最初にNetscape社によって開発されましたが、Internet Engineering Task Force (IETF)がその開発を引き継ぎ、名前をTransport Layer Security (TLS)に変更しました。
ODP.NETでは、TLS 1.2および1.3がサポートされています。
SSL/TLSクライアントでは、接続しようとしているデータベース・サーバーの識別名(DN)が正しいことを保証できます。DN一致のパラメータは、SSL_SERVER_DN_MATCH
(sqlnet.ora
)とSSL_SERVER_CERT_DN
(tnsnames.ora
)で、これは.NET構成ファイルでも定義できます。
DN一致を有効にするには、SSL_SERVER_DN_MATCH
をTrue
(またはOn
、Yes
)に設定します。SSL_SERVER_CERT_DN
はオプションです。管理者が、一致させたいDNを正確に指定できます。SSL_SERVER_CERT_DN
が設定されていない場合は、HOSTNAME
ベースのDN照合が実行されます。
SSL_SERVER_DN_MATCH
は、次を使用して設定できます。
-
sqlnet.ora
-
接続アドレス: 完全な説明ベースとEZConnectの両方
-
OracleConfiguration.SSLServerDNMatch
SSL_SERVER_CERT_DN
は、次を使用して設定できます。
-
接続アドレス: 完全な説明ベースとEZConnectの両方
関連項目:
-
IETF Webサイトの次の場所にあるTLSプロトコル・バージョン1.0(RFC 2246)
-
settingsセクションの
SSL_VERSION
。
ノート:
SSLが最も広く認識されている用語であるため、SSLでもTLSでも該当する場合、この項では説明を簡単にするためにSSLという用語を使用します。ただし、これらのプロトコルの使用方法または構成方法に違いがある場合、この項では、記述内容がSSLに該当するか、TLSに該当するかを明記します。
ウォレットを使用したODP.NET Secure Sockets Layerの構成
Secure Sockets Layerをクライアントで構成する場合、ウォレットが作成されていることを確認して、SSL付きTCP/IPをクライアントで使用してください。オプションで、追加のステップを実行して構成を強化できます。
ノート:
ODP.NETは自動ログイン・ウォレットをサポートしますが、ローカル自動ログイン・ウォレット・オプションはサポートしていません。
SSL構成に関するトピック:
ステップ1: クライアント・ウォレット作成の確認
次のステップに進む前に、クライアントでウォレットが作成されていることと、クライアントに有効な証明書があることを確認する必要があります。
ODP.NET管理対象およびコア・ドライバでは、ファイルおよびMicrosoft Certificate Store (MCS)ベースのウォレットをサポートしています。
-
ファイルベース・ウォレットでは、Oracle Wallet Managerを使用して、ウォレットが作成されていることを確認します。ウォレットの確認の詳細は、『Oracle Databaseセキュリティ・ガイド』のステップ1A: サーバーでのウォレット作成の確認に関する項を参照してください。
-
MCSの場合、ODP.NETはMYまたはPersonal証明書ストアから資格証明を取得します。Microsoftツールまたは
orapki
ユーティリティを使用して証明書を作成し、使用するMCSに証明書をロードします。
ステップ2: クライアントでのSSL付きTCP/IPの使用
ODP.NETデータ・ソースはSSLを使用するように変更する必要があります。特に、トランスポート・プロトコルはSSL付きTCP/IPまたはOracleで言うところの"tcps"を使用するように変更する必要があります。SSLとともに使用するODP.NETデータ・ソースの例は次のようになります。
finance = (DESCRIPTION= (ADDRESS = (PROTOCOL=tcps) (HOST=finance_server) (PORT=1575) ) (CONNECT_DATA = (SERVICE_NAME=Finance.us.example.com) ) )
ステップ3: 必要なクライアントSSL構成の指定(ウォレット・ロケーション)
ウォレット・ロケーションを指定するために、sqlnet.ora
または.NETアプリケーション構成を編集します。
-
ファイル・ベース・ウォレットのSSLウォレット・ロケーションを設定する例です。ここで、
<wallet_location>
は、指定したロケーションでクライアント・ウォレットが格納されます。wallet_location = (SOURCE=(METHOD= File) (METHOD_DATA=(DIRECTORY=<wallet_location>)))
-
MCSベース・ウォレットのSSLウォレット・ロケーションを設定する例は次のようになります。
wallet_location = (SOURCE=(METHOD= MCS))
ステップ4: SSLバージョンのクライアントでの設定(オプション)
SSL_VERSION
パラメータは、sqlnet.ora
または.NETのapplication.config
、web.config
またはmachine.config
ファイルを介して設定できます。通常、このパラメータを設定する必要はありません。このパラメータのデフォルト設定はany
で、データベース・サーバーがあらゆる必要な制限を認証されているSSLバージョンに適用できるようにします。次にsqlnet.ora
の設定例を示します。
SSL_VERSION=1.2
ステップ5: クライアントにおける認証サービスとしてのSSLの設定(オプション)
TCPSをトランスポートと外部データベース認証の両方として使用する場合は、sqlnet.ora
またはapplication.config
、web.config
またはmachine.config
ファイルにSQLNET.AUTHENTICATION_SERVICES
パラメータを設定します。
SSLはトランスポート暗号化媒体として使用できます。そのため、この設定の「オプション」指定です。
SSL/TLSを外部データベース認証方法として使用する場合は、クライアント証明書に一致する外部認証データベース・ユーザーを作成する必要があります。
次にsqlnet.ora
でのSSL外部認証を可能にする設定例を示します。
SQLNET.AUTHENTICATION_SERVICES = (TCPS)
ノート:
ODAC 12cリリース4より前のリリースでは、ODP.NET管理対象ドライバSSL接続はデータベース・サーバー・マシンの動的(エフェメラル)ポートにリダイレクトされていました。ODAC 12cリリース4以降では、管理対象ODP.NET SSL接続は、Oracle Listenerに対する元のソケット接続を続けるようになりました。したがって、ファイアウォールで必要なのはOracle Listenerのポート(例:1521)に対するアクセスのみです。
関連項目:
-
TLS/SSLと、Oracleデータベースでの構成に関する詳細は、『Oracle Databaseセキュリティ・ガイド』でSecure Sockets Layerの有効化に関する項を参照してください。
-
外部で識別されるデータベース・ユーザーの作成の詳細は、『Oracle Databaseセキュリティ・ガイド』の外部認証されるユーザーの作成に関する項を参照してください。
ウォレットを使用しないODP.NET Secure Sockets Layerの構成
バージョン19.13および21.4以降、ODP.NET管理対象ドライバおよびコア・ドライバではウォレットを使用しないSSLをサポートしています。管理対象外ODP.NETでは、バージョン19.14および21.5からウォレットなしのSSLサポートが導入されました。一方向TLSでは、クライアント証明書は必要ありません。サーバーのODP.NET認証には、信頼できる認証局(CA)のクライアント・ウォレットを指定できます。ウォレットがないと、信頼できるCAはローカル・ホストのデフォルトのトラストポイントから取得されます。ウォレット・ファイルがないと、接続構成が簡単になります。
ウォレットなし一方向TLSは、次の2つの方法のいずれかで使用できます。
-
データベース・サーバーで、.NETルート/ローカル・マシン・ストアで定義されているO/Sの信頼できる認証局によって署名された証明書/ウォレットを使用している場合、Oracleウォレットの場所の設定解除以外にクライアントの変更は必要ありません(すでに設定されている場合)。
-
データベース・サーバーで自己署名証明書/ウォレットを使用する場合は、サーバー証明書/ウォレットの自己署名ルート証明書(公開キー)をクライアント・マシンのルート証明書ストア(ルート/ローカル・マシン)に挿入する必要があります。
TCPSプロトコルが指定され、次のいずれかの場合に、ODP.NETは一方向TLSを使用して接続を試みます。
-
ウォレットの場所の設定が存在しない場合か、または
-
ウォレットの場所が
system
に設定されている場合。
システムが次の動的構成方法で指定されている場合、ODP.NETでは基本的に既存の静的ウォレット構成(ファイルまたはOracleConfiguration
ベース)が無視されます。
-
TNS接続記述子
-
WALLET_LOCATION
またはMY_WALLET_DIRECTORY
-
-
簡易接続プラス
-
WALLET_LOCATION
-
-
ODP.NET接続文字列
-
Wallet_Location
-
-
ODP.NETの
OracleConnection
プロパティ-
WalletLocation
-
これらのオプションを使用すると、管理者はクライアント証明書またはSEPSを使用した接続とウォレットを使用しない接続を異なる細分度で指定できます。
デフォルトでは、Oracle Autonomous Databaseの資格証明はsqlnet.ora
のWALLET_LOCATION
を使用します。ウォレットの要件を無効にするには、sqlnet.ora
WALLET_LOCATION
設定を完全に削除するか、前述の動的ウォレットの場所設定のいずれかをsystem
に設定します。
システムの信頼できる認証局リストへの公開キーの挿入
認証局(CA)の公開キーはCA証明書に格納されます。この証明書は、クライアント・システム上のローカル・トラスト・ストアに格納されます。ルート証明書を異なるプラットフォームにインストールする一般的なコマンドを次に示します。
Windows:
Base64/PEM形式:
openssl pkcs12 -in ewallet.p12 -clcerts -nokeys -out rootca.pem certutil -addstore -enterprise -f -v root rootca.pem
Linux (OracleおよびRed Hat):
PKCS #12ファイルからPEM証明書を作成します。
openssl pkcs12 -in ewallet.p12 -clcerts -nokeys -out rootca.pem -password pass:<password> sudo cp rootca.pem /etc/pki/ca-trust/source/anchors sudo update-ca-trust
Linuxでは、管理者は、前述のOPENSSL
コマンドで生成されたPEMファイルの内容を追加することで、ルートPEMファイルを手動で編集できます。Linux上のルートPEMファイルは、/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem
へのリンクである/etc/pki/tls/cert.pem
にあります。
Linux (Ubuntu):
PEM (.pem)またはCER (.cer)ファイル拡張子をCRT拡張子(.crt)に変更します。次に、次の2つのコマンドを実行します。
sudo cp rootca.crt /usr/local/share/ca-certificates/rootca.crt sudo update-ca-certificates
macOS:
Base64/PEM形式:
sudo security add-trusted-cert -d -r trustRoot -k "/Library/Keychains/System.keychain" "<directory>/rootca.pem"
TLS/SSL設定のトラブルシューティング
この項では、よく発生する問題点と、それを解決する一般的なステップについて説明します。
TLS/SSLウォレットの一般的なエラー
Microsoft Windowsでは現在、ウォレットがMD5アルゴリズムを使用することは制限されています。Oracle Public Key Infrastructure(orapki
)ユーティリティ12.1以下ではデフォルトのオプションだったため、Oracleウォレットはこのアルゴリズムで生成された可能性があります。
orapki
は、データベース・サーバー・インストールまたはOracleクライアント管理者インストールのORACLE_HOME\bin
ディレクトリにあります。Oracle Instant Clientには含まれていません。ユーティリティが必要なのはウォレットを設定するときだけで、ウォレットと一緒にユーティリティを配布する必要はありません。
TLS/SSLの設定時に、0x80004005コードを伴う「ORA-0052: SSLハンドシェイク中に失敗しました」エラーが発生し、最初の内部例外が「SSPI呼出しに失敗」、2番目の内部例外が「関数に送信されたトークンが無効」の場合、MD5が使用されているときなど、Microsoft Security Support Provider Interface (SSPI)でOracleウォレットが拒否された可能性が高いと考えられます。これは、ハンドシェイク時のエラーです。このエラーは、かわりにSHA-2アルゴリズムを使用して解決できます。
2番目の内部例外が「パッケージに指定された資格証明は認識されませんでした」の場合は、ユーザー証明書が認証局(CA)なしに生成されました。このエラーは、orapki
を使用してCA/ルート証明書を生成したうえで、ユーザー・ウォレット/証明書を再生成し、この新しいCA/ルート証明書を示すことで解決できます。
次のステップでは、orapki
とSHA-2を使用してOracleウォレットを生成します。この手順に従ってウォレットを生成するときには、任意のバージョンのorapki
を使用できます。
-
ルート・ウォレット、たとえばCAウォレットを作成します。
orapki wallet create -wallet ./root -pwd <password>
-
自己署名証明書(CA証明書)をルート・ウォレットに追加します。
orapki wallet add -wallet ./root -dn 'CN=<my root>' -keysize 1024 -self_signed -validity 3650 -pwd <password> -sign_alg sha512
-
自己署名済証明書をウォレットからエクスポートします。
orapki wallet export -wallet ./root -dn 'CN=<my root>' -cert ./root/b64certificate.txt -pwd <password>
-
ユーザー・ウォレット、たとえば顧客ウォレットを作成します。
orapki wallet create -wallet ./user -pwd <password> -auto_login
-
証明書リクエストの追加
orapki wallet add -wallet ./user -dn 'CN=<client's hostname>' -keysize 1024 -pwd <password> -sign_alg sha512
-
証明書リクエストをエクスポートします。
orapki wallet export -wallet ./user -dn 'CN=<client's hostname>' -request ./user/creq.txt -pwd <password>
-
CAによって発行された証明書を作成します。
orapki cert create -wallet ./root -request ./user/creq.txt -cert ./user/cert.txt -validity 3650 -pwd <password> -sign_alg sha512
-
信頼できる証明書(CA証明書)をウォレットに追加します。この例では、クライアントとサーバーの両方のウォレットに同じCAを使用すると想定しています。
orapki wallet add -wallet ./user -trusted_cert -cert ./root/b64certificate.txt -pwd <password>
-
新しい証明書を追加します。
orapki wallet add -wallet ./user -user_cert -cert ./user/cert.txt -pwd <password> -sign_alg sha512
-
ユーザー・ウォレットの内容を表示します。
orapki wallet display -wallet ./user -pwd <password>
-
サーバー・ウォレットを作成します。
orapki wallet create -wallet ./server -pwd <password> -auto_login
-
サーバー証明書リクエストを追加します。
orapki wallet add -wallet ./server -dn 'CN=<server's hostname>' -keysize 1024 -pwd <password> -sign_alg sha512
-
証明書リクエストをエクスポートします。
orapki wallet export -wallet ./server -dn 'CN=<server's hostname>' -request ./server/creq.txt -pwd <password>
-
CAによって発行されたサーバー証明書を作成します。
orapki cert create -wallet ./root -request ./server/creq.txt -cert ./server/cert.txt -validity 3650 -pwd <password> -sign_alg sha512
-
信頼できる証明書(CA証明書)をサーバー・ウォレットに追加します。この例では、クライアントとサーバーの両方のウォレットに同じCAを使用すると想定しています。
orapki wallet add -wallet ./server -trusted_cert -cert ./root/b64certificate.txt -pwd <password>
-
サーバー・ウォレットの
user_cert
証明書を追加します。orapki wallet add -wallet ./server -user_cert -cert ./server/cert.txt -pwd <password> -sign_alg sha512
-
サーバー・ウォレットの内容を表示します。
orapki wallet display -wallet ./server -pwd <password>
相互TLS/SSL証明書の選択
ODP.NET接続でTCPS(TLS/SSL)を使用する場合、ユーザーには署名付き証明書が必要です。このクライアント証明書は、OracleウォレットおよびMicrosoft証明書ストア(MCS)に格納できます。使用できる証明書が複数ある場合は、ユーザーまたはアプリケーションの設定で、接続する特定の証明書を指定する必要があります。この選択は、ユーザーがグラフィカル・ユーザー・インタフェース(GUI)を使用して手動で行うか、アプリケーションによってサムプリントを使用して自動的に行うことができます。
GUIの場合、エンド・ユーザーはストアで使用可能なリストから正しいクライアント証明書(MCSなど)を選択します。キー・ストアは、表示されている証明書をフィルタリングして、正しい証明書の選択を簡素化できます。たとえば、GUIはプライベート証明書と有効期限の状態で証明書をフィルタリングできるはずです。デフォルトでは、選択プロセスは相互TLS用であるため、公開キーのみの信頼できる認証局(CA)証明書は証明書ストアGUIに表示されません。
GUI証明書の選択はデフォルトで無効になっています。有効にするには、OracleConnection
AllowCertificateSelectionUI
プロパティをtrueに設定します。Windowsから接続すると、エンド・ユーザーにはポップアップ・ウィンドウが表示され、MCSでTLS/SSL証明書を選択できます。
または、GUIの選択では、サムプリントがクライアント証明書を一意に識別できます。
開発者は、OracleConfiguration
またはOracleConnection
、TNS接続記述子、Easy Connect Plusまたはsqlnet.ora
エントリのSSLCertificateThumbprint
プロパティでサムプリントを設定できます。
orapki
(orapki.exe
)は、Oracleデータベースの証明書およびウォレットを管理できます。Oracleウォレットで証明書を作成、変更、表示して、SHA1サムプリントを含めることができます。ウォレットのサムプリントは、次のorapkiコマンドを使用して表示できます:
orapki wallet display -wallet <wallet directory> -pwd <wallet password> -complete
Microsoft Windowsでは、Windows MCSにPersonal Identity Verification (PIV)スマートカード証明書が自動的に追加されます。TLS/SSL接続時など、これらのスマートカード証明書が使用される場合は、PINプロンプトの入力が成功する必要があります。最初のPINプロンプトの成功は、デジタル署名のPIVスマートカード証明書コンテナを除き、その後の同じスマートカード証明書すべての使用に対して、プロセス・レベルでキャッシュされます。これらのコンテナ内の証明書では、証明書を使用するたびにPINプロンプトが必要です。
セキュアな外部パスワード・ストアの使用
安全性の高い外部パスワード・ストア(SEPS)は、パスワードの資格証明を安全に格納するクライアント側ウォレットの使用です。すべてのODP.NETドライバ・タイプが、外部パスワード・ストアを使用するように構成できます。
Oracleウォレットは、認証および署名用資格証明を安全に格納するコンテナです。ウォレットにより、データベース接続をパスワード資格証明に依存する大規模なデプロイメントを簡素化できます。アプリケーションでは、埋込みユーザー名およびパスワードが必要なくなり、これによりセキュリティ・リスクを減らします。
ODP.NET CoreでSEPSを使用するには、NuGetパッケージのSystem.Security.Cryptography.Pkcs
バージョン4.7以降が、アプリケーション・プロジェクトの依存関係として必要です。
ODP.NETでは、2つのシナリオでSEPSをTCPSと組み合せて使用できます:
-
sqlnet.ora
WALLET_LOCATION
からのSEPSウォレットおよび接続アドレスWALLET_LOCATION
からのTCPSウォレット -
sqlnet.ora
WALLET_LOCATION
からのSEPSウォレットのみが指定され、WALLET_LOCATION
は接続アドレスに指定されていない
2番目のシナリオでは、ウォレットにクライアント証明書がある場合、mTLSが使用されます。証明書がない場合は、ウォレットなしの一方向TLSが使用されます。
SEPSでは、通常は、TNS別名が、ウォレット・ファイル内の暗号化されているデータベース・ユーザー名とパスワードに関連付けられます。TNS別名ベースのSEPSユーザー名とパスワードが見つからない場合、バックアップ・オプションとして、ウォレット内でSEPSのデフォルトのユーザー名とパスワードを構成できます。その後は、ODP.NETにより、かわりにそのデフォルトのユーザー名とパスワードを使用して接続されるようになります。ODP.NETでのデフォルト・ユーザー名およびパスワードのサポートには、バージョン23.8以上が必要です。
セキュアな外部パスワード記憶域(SEPS)の構成
SEPSを構成するためのステップ:
ステップ1.ウォレット・ファイルを作成します
mkstore
ユーティリティを使用してウォレット・ファイルを作成し、資格証明を挿入します。
ステップ1a:コマンド行で次の構文を使用して、クライアント上にウォレットを作成します。
mkstore -wrl wallet_location -create
たとえば:
mkstore -wrl c:\oracle\product\12.1.0\db_1\wallets -create Enter password: password
ステップ1b:コマンドラインで次の構文を使用して、ウォレットにデータベース接続の資格証明を作成します。
mkstore -wrl wallet_location -createCredential db_connect_string username Enter password: password
たとえば:
mkstore -wrl c:\oracle\product\12.1.0\db_1\wallets -createCredential orcl system Enter password: password
ステップ2.構成がクライアント・ウォレットを示すようにします
クライアントのsqlnet.ora
ファイルに、WALLET_LOCATION
パラメータを入力し、ステップ1で作成したウォレットのディレクトリの場所に設定します。
たとえば、$ORACLE_HOME/network/admin
にウォレットを作成し、OracleホームがC:\app\client\
<user>
\product\
<version>
\client_1\
に設定されている場合、クライアントのsqlnet.ora
ファイルには次のように指定する必要があります。
WALLET_LOCATION = (SOURCE =(METHOD = FILE) (METHOD_DATA = (DIRECTORY = C:\app\client\<user>\product\<version>\client_1\Network\Admin) ) )
ステップ3.SEPSをオンにします
OracleConfiguration.SqlNetWalletOverride
プロパティのウォレット・オーバーライド設定をtrue
に設定するか、sqlnet.ora
または.NET構成ファイルでSQLNET.WALLET_OVERRIDE
設定を設定して、アプリケーションでSEPSを有効にします。
SQLNET.WALLET_OVERRIDE = TRUE
この設定により、すべてのCONNECT /@db_connect_string
文で、データベースへの認証に、指定された場所にあるウォレットの情報が使用されます。
外部認証が使用されている場合、そのウォレットによる認証ユーザーはCONNECT /@db_connect_string
構文を使用し、前述の手順で指定したデータベースにユーザー名およびパスワードを使用せずにアクセスできます。ただし、ウォレット・ファイルはデータベース資格証明に対して最新に保っておく必要があることに注意してください。データベース資格証明が変更され、ウォレット・ファイルがそれに対応して変更されていない場合、接続は失敗します。
関連項目:
-
ウォレットの設定の詳細は、「Oracle Data Provider for .NET管理対象ドライバの構成」を参照してください。
-
安全性の高い外部パスワード・ストアおよびOracle databaseでの構成の詳細は、『Oracle Databaseセキュリティ・ガイド』のパスワード資格証明用の安全性の高い外部パスワード・ストアの管理に関する項を参照してください。
Kerberosの使用
Kerberosは、分散環境におけるセキュリティのためのネットワーク認証サービスです。ODP.NETアプリケーションは、シングル・サインオンと一元的なユーザー認証の目的でKerberosを使用できます。
すべてのODP.NETプロバイダ・タイプで、データベース・サーバーへの外部認証用にKerberosがサポートされています。
管理対象ODP.NET Kerberosは、MIT Kerberos 4.0.1への依存性があります。MIT Kerberosがインストールされていない場合は、Oracle.ManagedDataAccessIOP.dll
をロードできなかったというエラーが発生することがあります。
ODP.NET Core Kerberosには、Kerberos.NET.
を使用するOracle.ManagedDataAccess.Kerberos
NuGetパッケージが必要です。ODP.NET Core Kerberosを使用する場合は、ローカル・ホスト名がDNSまたはローカル・ホスト・ファイルを介して解決可能なIPであることを確認します。
ノート:
-
管理対象ODP.NETおよびODP.NET Coreでは、Kerberosの制約付き委任はサポートされません。
-
管理対象ODP.NETおよびODP.NET Coreでは、Kerberos5Pre認証アダプタはサポートされていません。かわりにKerberos5を使用してください。
ファイル・ベース資格証明キャッシュおよびMSLSA
ODP.NETは、ファイル・ベースKerberosクライアント資格証明キャッシュ(CC)およびKerberosクライアント資格証明としてWindowsログオン資格証明を使用する機能の両方をサポートします。後者はMSLSAベースKerberos認証と呼ばれます。
ファイル・ベースKerberosクライアント資格証明キャッシュ(CC)を使用するには、Oracle Database Clientのフル・インストールに関連付けられている次の実行ファイルが必要です:
-
okinit.exe
-
oklist.exe
-
okdstry.exe
Kerberos5資格証明を入手し、ファイル・ベース資格証明キャッシュ(CC)に格納するためにこの実行ファイルが必要です。ただし、資格証明キャッシュを作成後、資格証明が有効であるかぎり、前述の実行可能ファイルは実行時にODP.NETアプリケーションでは不要になります。
MIT KerberosでのODP.NET管理対象ドライバ依存性
Kerberos5データベース認証をODP.NET管理対象ドライバと一緒に使用するには、MIT Kerberos for Windows 4.0.1を次の場所からODP.NET管理対象ドライバと同じマシンにダウンロードしてインストールします。
http://web.mit.edu/kerberos/dist/
関連項目:
Kerberosと、Oracleデータベースでの構成に関する詳細は、『Oracle Databaseセキュリティ・ガイド』でKerberos認証の構成に関する項を参照してください。
ODP.NETでのKerberos認証の構成
後述のKerberos構成例を表示する際には、次の"キー"を参照してください。
-
oracleclient
= ドメインのOracle Clientユーザーを表すためにOracleデータベース・クライアント・プログラムによって使用されるKerberos/Windowsドメイン・ユーザーID -
oracleserver
= Oracleデータベース・サーバーによって使用されるKerberos/Windowsドメイン・ユーザーID -
DOMAIN.COMPANY.COM
= Kerberos/Windowsドメイン -
dbhost.company.com
= Oracleデータベース・サーバー・マシン・ホスト名 -
kerberos_service_name
= Kerberosサービス名 -
dc.company.com
= Kerberos Key Distribution Center (KDC)およびWindows Domain Controllerのホスト名
Kerberos認証の構成トピック:
-
ステップ2. クライアントとサーバーのKerberosユーザー(MSLSAのWindowsドメイン・ユーザー)を作成します
-
ステップ3. DBサーバーのKerberosプリンシパル名をDBサーバーのKerberosサービス(SPNマッピング)に関連付け、サーバー・キータブ・ファイルを生成します
-
ステップ6. Kerberos KDC(MSLSAのWindowsドメイン・コントローラ)を示すkerberos構成ファイルを作成します
-
ステップ7. Oracleデータベース・クライアントおよびサーバーのsqlnet.oraまたは.NET構成が前述のKerberos構成ファイルを示すように構成します
-
ステップ8. クライアントsqlnet.oraまたは.NET構成で資格証明キャッシュ・ファイルまたはMSLSAを示します
-
ステップ9. sqlnet.oraまたは.NET構成のクライアントとサーバー認証サービスをKerberos5に設定します
-
ステップ10. ステップ1で設定されたKerberosクライアント・ユーザーと一致する外部認証データベース・ユーザーを設定します(大文字、小文字に注意)
ステップ1.Windowsサービス・ファイルを更新し、"kerberos5"エントリを含めます
Windowsサービス・ファイル(C:\windows\system32\drivers\etc\services
)のKerberosエントリを変更します。変更前:
kerberos 88/tcp krb5 kerberos-sec #Kerberos
変更後:
kerberos 88/tcp kerberos5 krb5 kerberos-sec #Kerberos
ステップ2.クライアントとサーバーのKerberosユーザー(MSLSAのWindowsドメイン・ユーザー)を作成します
前述の"key"で示すように、oracleclient
およびoracleserver
をそれぞれクライアントとサーバーのKerberosユーザーIDとして使用します。
ODP.NETは、次の属性を持つWindowsドメイン・ユーザーを使用してMSLSAをサポートします。
-
"Kerberos DES"はオフ
-
"Kerberos AES 128ビット"はオン
-
"Kerberos AES 256ビット"はオン
-
"Kerberos事前認証必要なし"はオン
ステップ3.DBサーバーのKerberosプリンシパル名をDBサーバーのKerberosサービス(SPNマッピング)に関連付け、サーバー・キータブ・ファイルを生成します
Kerberos KDC (MSLSAのWindowsドメイン・コントローラ)で、管理者として次のコマンドを実行します。
> ktpass -princ kerberos_service_name/dbhost.company.com@DOMAIN.COMPANY.COM /crypto all /mapuser oracleserver@DOMAIN.COMPANY.COM /pass <oracleserver password> /out v5srvtab > setspn -A kerberos_service_name/dbhost.company.com@DOMAIN.COMPANY.COM oracleserver
ステップ4.サービス・プリンシパルに対するサーバー・ユーザーのマッピングを確認します
Kerberos KDCで、次のコマンドを実行し、出力をメモします。
> setspn -L oracleserver Registered ServicePrincipalNames for CN=oracleserver,CN=Users,DC=domain,DC=company,DC=com: kerberos_service_name/dbhost.company.com kerberos_service_name/dbhost.company.com@DOMAIN.COMPANY.COM
ステップ5.サーバーのsqlnet.oraが、ステップ2で生成したキータブ・ファイルを示すように設定します
サーバーのsqlnet.ora
に次の行を追加します。
sqlnet.kerberos5_keytab = c:\krb\v5srvtab
ステップ6.Kerberos KDC(MSLSAのWindowsドメイン・コントローラ)を示すkerberos構成ファイルを作成します
kerberos構成ファイルの例(krb.conf
):
[libdefaults] default_realm = DOMAIN.COMPANY.COM [realms] DOMAIN.COMPANY.COM = { kdc = dc.company.com } [domain_realm] .domain.company.com = DOMAIN.COMPANY.COM domain.company.com = DOMAIN.COMPANY.COM .DOMAIN.COMPANY.COM = DOMAIN.COMPANY.COM DOMAIN.COMPANY.COM = DOMAIN.COMPANY.COM
ステップ7.Oracleデータベース・クライアントおよびサーバーのsqlnet.oraまたは.NET構成が前述のKerberos構成ファイルを示すように構成します
クライアントまたはサーバーのsqlnet.ora
を編集し、組み込みます。
sqlnet.kerberos5_conf = C:\krb\krb.conf
または、クライアント・アプリケーション構成を編集して(設定セクションで)組み込みます。
<setting name="sqlnet.kerberos5_conf" value="C:\krb\krb.conf" />
ステップ8.クライアントsqlnet.oraまたは.NET構成で資格証明キャッシュ・ファイルまたはMSLSAを示します
資格証明キャッシュ・ファイルを示す例:
sqlnet.kerberos5_cc_name = c:\krb\krb.cc
MSLSAを示す例:
sqlnet.kerberos5_cc_name = MSLSA:
ステップ9.sqlnet.oraまたは.NET構成のクライアントとサーバー認証サービスをKerberos5に設定します
sqlnet.authentication_services=(Kerberos5)
ステップ10.ステップ1で設定されたKerberosクライアント・ユーザーと一致する外部認証データベース・ユーザーを設定します(大文字、小文字に注意)
create user "ORACLECLIENT@DOMAIN.COMPANY.COM" identified externally; grant connect, create session to "ORACLECLIENT@DOMAIN.COMPANY.COM";
ステップ11.Windowsドメイン・クライアント・ユーザー(MSLSA用)を介してクライアント・マシンにログインするか、okinitを実行してクライアントKerberosユーザー(ファイル・ベースCC用)を認証します。
okinit oracleclient
資格証明キャッシュの場合は、oklist
を使用して、キャッシュに有効な資格証明があることを検証します。これらの資格証明が期限切れの場合は、okdstry
を使用してキャッシュをクリーン・アップしてから、新しいokinit
コマンドを実行します。
ステップ12.ODP.NETアプリケーションを実行します
ODP.NET接続文字列をUser Id=/
に設定し、パスワードを空白のままにします。
ノート:
-
クライアントとサーバーを構成後、最後の2つのステップのみがODP.NETアプリケーションを実行するために継続的に必要なステップです。
-
Microsoft Visual Cランタイム・ライブラリ(MSVCRT.DLL)のバグによって、MicrosoftランタイムではKerberos5構成のODP.NET管理対象ドライバの設定が無視される可能性があります。そのような場合は、エラー・メッセージが表示されます。
OracleInternal.Network.NetworkException (0x80004005): NA Kerberos5: Authentication handshake failure at stage: krb5_sname_to_principal: default realm not found. Please set SQLNET.Kerberos5_conf.
このエラーを回避するには、ODP.NETアプリケーションのランタイム環境の
KRB5_CONFIG
が、SQLNET.Kerberos5_conf
によって示されたKerberos5構成ファイルを示すように手動で設定します。たとえば、set KRB5_CONFIG=c:\oracle\network\admin\krb5.ini
関連項目:
Kerberosと、Oracleデータベースでの構成に関する詳細は、『Oracle Databaseセキュリティ・ガイド』でKerberos認証の構成に関する項を参照してください。
Windowsネイティブ認証(NTS)の使用
Windowsのネイティブ認証アダプタで、OracleユーザーはWindowsユーザー・ログイン資格証明のみを使用してデータベースに対して認証できます。シングル・サインオンを可能にする方法を提供し、ユーザーおよびロールの資格証明管理を簡素化します。Windowsのネイティブ認証は、Windowsネイティブ認証(NTS)とも呼ばれています。
ノート:
-
ODP.NET Coreでは、WindowsでのみWindowsネイティブ認証がサポートされます
-
Microsoft .NET APIの制限によって、ODP.NET管理対象ドライバはKerberosベース資格証明ではなく、Microsoft NT LAN Manager (NTLM)を介したWindowsネイティブ認証(NTS)のみをサポートします。通常、WindowsドメインおよびOracleデータベース・サーバーがデフォルトで透過的にNTLMとKerberosドメイン資格証明の両方をサポートするため、この制限はODP.NET管理対象ドライバ・アプリケーションからは見えません。
ODP.NETクライアントのWindowsネイティブ認証(NTS)の構成
ODP.NETクライアントのNTSを構成するステップ:
ステップ1.OSAUTH_PREFIX_DOMAINが正しく設定されていることを確認します
OSAUTH_PREFIX_DOMAIN
が適切に設定されていることを確認します。外部で識別されたユーザーIDがドメインを含めるようにするには、trueに設定します。それ以外の場合はfalseに設定します。このパラメータは、HKLM/software/oracle/HOME<ORACLE_SID>
にあるレジストリ設定です。たとえば、ORACLE_SID
がr1
の場合、これはHKLM/software/oracle/HOMEr1
にあります。
ステップ2.外部で識別されたデータベース・ユーザーを設定します
ステップ1でパラメータをtrueに設定する場合は、次のコマンドを使用して、必要なWindowsドメイン・ユーザーと関連付けられ、外部で識別されたデータベース・ユーザーを設定します。
create user "MYDOMAIN\MYUSER" identified externally; grant connect, create session to "MYDOMAIN\MYUSER";
ステップ3.認証方法としてNTSを使用するためにクライアント構成を設定します
クライアントのsqlnet.oraまたはアプリケーション設定を編集して、NTSをsqlnet.authentication_services
に追加します。たとえば、次のようになります。
sqlnet.authentication_services = (NTS)
ノート:
クライアントとサーバーを構成後、最後の2つのステップのみがODP.NETアプリケーションを実行するために継続的に必要なステップです。
関連項目:
Windowsネイティブ認証の詳細は、Windows用の『Oracle Databaseプラットフォーム・ガイドfor Microsoft Windows』の「Windows環境におけるデータベース・ユーザーの認証」を参照してください。
オペレーティング・システム認証の資格証明
Oracle Databaseは、Windowsのユーザー・ログイン資格証明を使用してデータベース・ユーザーを認証できます。Windowsのユーザー・ログイン資格証明を使用して接続をオープンするには、User
Id
接続文字列属性をスラッシュ(/)
に設定する必要があります。Password
属性を指定しても無視されます。
ノート:
ODP.NET Coreでは、Windowsでのみオペレーティング・システム認証がサポートされます。
オペレーティング・システム認証を使用する接続を含む、すべてのODP.NET管理対象外ドライバ接続がプールできます。ODP.NET管理対象ドライバは、WindowsドメインがKerberosベースのドメイン認証のみをサポートするように制限されている場合を除き、オペレーティング・システム認証をサポートします。プーリングが有効になっている間は、デフォルトで接続はプールされ、構成は必要ありません。
オペレーティング・システム認証の使用例を次に示します。
/* Create an OS-authenticated user in the database Assume init.ora has OS_AUTHENT_PREFIX set to "" and <OS_USER> is any valid OS or DOMAIN user. create user <OS_USER> identified externally; grant connect, resource to <OS_USER>; Login through OS Authentication and execute the sample. See Oracle documentation for details on how to configure an OS-Authenticated user */ // C# using System; using Oracle.DataAccess.Client; class OSAuthenticationSample { static void Main() { OracleConnection con = new OracleConnection(); //Establish connection using OS Authentication con.ConnectionString = "User Id=/;Data Source=oracle;"; con.Open(); Console.WriteLine("Connected to Oracle" + con.ServerVersion); // Close and Dispose OracleConnection object con.Close(); con.Dispose(); Console.WriteLine("Disconnected"); } }
関連項目:
Windowsのユーザー・ログイン資格証明を使用してデータベース・ユーザーを認証するようにOracle Databaseを設定する方法の詳細は、Oracle Database管理者リファレンスfor Microsoft Windowsを参照
ネットワーク・データの暗号化および整合性
ODP.NETはイントラネットおよびクラウド・デプロイメントの両方のネットワークのデータ暗号化および整合性を有効化します。これにより、データが認証されたユーザー以外のすべてのユーザーから隠れ、元のメッセージ・コンテンツが変更されていないことを保証します。以前のリリースでは、これらの機能はOracle Advanced Security Option(ASO)暗号化と呼ばれていました。Oracle Database 12cからは、ネットワーク・データ暗号化とデータ整合性を使用する際にOracle ASOが必要なくなりました。
脆弱な暗号化およびチェックサム・アルゴリズムを使用するには、SQLNET.ALLOW_WEAK_CRYPTO
、OracleConfiguration
SqlNetAllowWeakCrypto
、または同等の設定をtrue
(デフォルト)に設定する必要があります。
データ暗号化の使用
すべてのODP.NETプロバイダ・タイプは、次の暗号化標準およびアルゴリズムをサポートしています。
-
Advanced Encryption Standard(AES)
-
AES 128ビット
-
AES 192ビット
-
AES 256ビット
-
-
Triple-DES (3DES)
-
112ビット*
-
168ビット*
* = 脆弱と見なされる暗号化アルゴリズム
-
ODP.NET、管理対象ドライバおよびODP.NET Coreは次の設定を使用してネットワーク暗号化を構成します。
-
SQLNET.ENCRYPTION_CLIENT
-
SQLNET.ENCRYPTION_TYPES_CLIENT
関連項目:
使用方法の定義および詳細は、「settingsセクション」を参照してください。
データ整合性の使用
すべてのODP.NETプロバイダ・タイプは、次のデータ整合性アルゴリズムをサポートしています。
-
SHA-1
-
SHA-2
-
SHA-256
-
SHA-384
-
SHA-512
-
関連項目:
-
ネットワーク暗号化および整合性、またはODP.NET管理対象外ドライバ用の構成の詳細は、『Oracle Databaseセキュリティ・ガイド』を参照してください。
-
ODP.NET、管理対象ドライバおよびODP.NET Coreでネットワーク暗号化またはデータ整合性を構成するには、Oracle Data Provider for .NET管理対象ドライバの構成または
sqlnet.ora
で、SQLNET.CRYPTO_CHECKSUM_CLIENT
およびSQLNET.CRYPTO_CHECKSUM_TYPES_CLIENT
設定を参照してください。データベース・サーバー・マシンで、sqlnet.ora
ファイルのSQLNET.CRYPTO_CHECKSUM_SERVER
パラメータとSQLNET.CRYPTO_CHECKSUM_TYPES_SERVER
パラメータを構成する必要がある可能性があります。
スキーマ検出
ADO.NETでは、OracleConnection.GetSchema
APIから5つの異なるタイプのメタデータ・コレクションが公開されています。これにより、アプリケーション開発者は、すべてのOracleデータ・ソースに対して、メタデータの取得を個別のアプリケーション・ベースでカスタマイズできます。このようにして、開発者は複数のデータ・ソースからのメタデータを管理する汎用セットのコードをビルドできます。
公開されているメタデータのタイプは次のとおりです。
-
MetaDataCollections
テーブル、列、インデックスなど、データ・ソースから使用できるメタデータ・コレクションのリスト。
-
Restrictions
要求されたスキーマ情報の範囲を制限して、各メタデータ・コレクションに適用される制限。
-
DataSourceInformation
製品名やバージョンなど、現在使用されているデータベースのインスタンスについての情報。
-
DataTypes
データベースがサポートする各データ型についての情報のセット。
-
ReservedWords
Oracle問合せ言語の予約語。
関連項目:
メタデータのユーザー・カスタマイズ
ODP.NETでは、データベース・スキーマ情報の包括的なセットが提供されています。開発者は、個々のアプリケーション・ベースでGetSchema
メソッドが戻すメタデータを拡張またはカスタマイズできます。
これを行うには、開発者はカスタマイズしたメタデータ・ファイルを作成し、アプリケーションにファイル名を提供する必要があります。方法は次のとおりです。
-
カスタマイズしたメタデータ・ファイルを作成し、それを.NET Frameworkがインストールされた
CONFIG
サブディレクトリに置きます。これは、machine.config
およびセキュリティ設定があるディレクトリです。このファイルには、変更のみではなく、スキーマ設定情報のセット全体を含める必要があります。開発者は、ユーザー固有の要件を検索するスキーマ動作の変更を提供します。たとえば、開発者は内部データベース表にフィルタをかけ、ユーザー固有の表のみを検索できます。
-
次と同じく、アプリケーションの
app.config
ファイル内にエントリを追加し、メタデータ・ファイルの名前を名前/値ペアの書式で指定します。<oracle.dataaccess.client> <settings> <add name="MetaDataXml" value="CustomMetaData.xml" /> </settings> </oracle.dataaccess.client>
GetSchema
メソッドがコールされると、ODP.NETではapp.config
ファイルでカスタマイズしたメタデータXMLファイルの名前を確認します。最初に、GetSchema
メソッドはプロバイダにちなんで付けられた要素、この例ではoracle.dataaccess.client
でファイル内のエントリを検索します。このXML要素内の名前MetaDataXml
に対応する値は、カスタマイズしたXMLファイルの名前で、この例ではCustomMetaData.xml
です。
メタデータ・ファイルが正しいディレクトリ内にない場合、アプリケーションは、ODP.NETに含まれているデフォルトのメタデータXMLファイルをロードします。
関連項目:
接続プーリング
ODP.NET接続プーリングは、Pooling
接続文字列属性を使用して有効化または無効化できます。デフォルトでは、接続プーリングは有効です。次に、接続プーリング・サービスの動作を制御するConnectionString
属性を示します。
-
Connection
Lifetime
-
Connection
Timeout
-
Decr
Pool
Size
-
HA
Events
-
Incr
Pool
Size
-
Load
Balancing
-
Max
Pool
Size
-
Min
Pool
Size
-
Pooling
-
Validate
Connection
接続プーリングの例
次の例は、接続プーリングに関連するConnectionString
属性を使用して、接続をオープンします。
// C# using System; using Oracle.DataAccess.Client; class ConnectionPoolingSample { static void Main() { OracleConnection con = new OracleConnection(); //Open a connection using ConnectionString attributes //related to connection pooling. con.ConnectionString = "User Id=scott;Password=tiger;Data Source=oracle;" + "Min Pool Size=10;Connection Lifetime=100000;Connection Timeout=60;" + "Incr Pool Size=5; Decr Pool Size=2"; con.Open(); Console.WriteLine("Connection pool successfully created"); // Close and Dispose OracleConnection object con.Close(); con.Dispose(); Console.WriteLine("Connection is placed back into the pool."); } }
接続プーリングの使用
接続プーリングが有効な場合(デフォルト)、OracleConnection
オブジェクトのOpen
およびClose
メソッドは、接続プーリング・サービスを暗黙的に使用します。これは、接続をプールしてアプリケーションに戻す処理を担当します。
接続プーリング・サービスは、プールを一意に識別するために、ConnectionString
プロパティを署名として使用して接続プールを作成します。
ODP.NETの管理対象バージョンとコア・バージョンでは、接続文字列自体が完全に一致している必要があります。キーワードが異なる順序で指定されている、または接続文字列にスペースが追加される場合は、新しいプールが作成されます。要求された署名を持つプールがすでに存在する場合、接続はそのプールからアプリケーションに戻されます。
管理対象外ODP.NETでは、接続文字列属性の値が変更された場合にのみ、新しいプールが作成されます。余分なスペースがある場合や、キーワード順序を変更した場合でも、新しいプールは作成されません。
接続プールが作成されると、接続プーリング・サービスは、ConnectionString
のMin
Pool
Size
属性で定義された接続数を最初に作成します。高速接続フェイルオーバーによって無効な接続が削除されないかぎり、この接続数は、接続プールの接続プーリング・サービスによって常に保持されます。この場合、接続数はMin Pool Sizeを下回る可能性があります。その場合、ODP.NETは次の接続リクエストで最小プール・サイズ・レベルのリストアを試みます。
これらの接続は、常にアプリケーションで使用され、またプール内でも使用できます。
ConnectionString
プロパティのIncr
Pool
Size
属性には、接続プールでより多くの接続が必要になったときに、接続プーリング・サービスで作成される新しい接続の数を定義します。
アプリケーションが接続をクローズすると、接続プーリング・サービスは、接続存続期間がConnection Lifetime
属性を超えているかどうかを調べます。超えている場合、接続プーリング・サービスは接続を破棄し、超えていない場合、接続は接続プールに戻ります。接続プーリング・サービスは、Close()
またはDispose()
が起動されたときのみ、Connection Lifetime
を実行します。
ConnectionString
プロパティのMax
Pool
Size
属性は、接続プールの接続の最大数を設定します。新しい接続が要求されたときに、有効な接続がなく、Max
Pool
Size
に達している場合、接続プーリング・サービスは、Connection
Timeout
属性で定義された時間待機します。Connection
Timeout
に達していても、プールに有効な接続がない場合、接続プーリング・サービスは、接続プール要求がタイムアウトしたことを示す例外を呼び出します。接続タイムアウトが発生すると、ODP.NETはそのタイムアウトの原因が、データベース・サーバーが所定の時間内に接続できなかったことであるか、プール・サイズの最大値に達したためにプール内に使用可能な接続がなかったことであるかを判断します。返される例外テキストは、「接続リクエストがタイムアウトしました」(前者の場合)または「プールされた接続リクエストがタイムアウトしました」(後者の場合)となります。
Validate
Connection
属性は、プールから発生する接続を検証します。この属性は、必要な場合にのみ使用してください。この属性により、データベースへのラウンドトリップが、各接続権をアプリケーションに付与する前に検証するためです。無効な接続が特殊な場合、開発者はValidate
Connection
属性を使用するのではなく、独自の例外/エラー・ハンドラを作成して、新しい接続を取得および検証できます。通常は、これによりパフォーマンスが改善されます。
接続が使用されていない場合、接続プーリング・サービスは接続をクローズします。接続は3分ごとにクローズされます。ConnectionString
プロパティのDecr
Pool
Size
属性は、接続プーリング・サービスに対して、3分ごとにクローズできる接続の最大数を指定します。
接続文字列に"pooling=true"
を設定して接続プールを有効にすると(デフォルトの場合)、オペレーティング・システムで認証された接続もプールされます。
接続プールの管理
ODP.NET接続プール管理は、ODP.NETアプリケーションに関する明示的な接続プール管理を提供します。アプリケーションは接続プール内の接続を明示的にクリアできます。
接続プール管理を使用すると、アプリケーションは次を実行できます。
ノート:
-
ClearPool
メソッドを使用して接続プールから接続をクリアします。 -
ClearAllPools
メソッドを使用して、アプリケーション・ドメイン内のすべての接続プール内の接続をクリアします。
関連項目:
接続パフォーマンス・カウンタ
Oracle Data Provider for .NETのインストールにより、ターゲット・システムにパフォーマンス・カウンタのセットが作成されます。すべてのODP.NETプロバイダ・タイプ(コア、管理対象および管理対象外)は、クライアント・アプリケーションごとにこれらのパフォーマンス・カウンタを公開します。これらのパフォーマンス・カウンタは、Windowsパフォーマンス・モニター(Perfmon)またはバージョン4.5.0以上のSystem.Diagnostics
ネームスペースのPerformanceCounter
クラスを使用して表示できます。
ノート:
ODP.NETパフォーマンス・カウンタは、Windowsプラットフォームでのみ使用できます。
ODP.NETパフォーマンス・カウンタは、インストール後に有効化も登録もされないため、管理者はカウンタを登録してから、目的のカウンタを有効化してから監視する必要があります。
パフォーマンス・カウンタの登録
インストール後、ODP.NETパフォーマンス・カウンタを登録して、Perfmon
などのツールがそれらを消費できるようにします。登録には、プロバイダごとにPowerShellスクリプトを実行する必要があります。
ODP.NETは、PowerShellから実行して有効にする必要のあるカウンタ用に6つのスクリプトをインストールします
-
register_odpc_perfmon_counters.ps1
– ODP.NETコア・カウンタを登録します -
register_odpm_perfmon_counters.ps1
– 管理対象ODP.NETカウンタを登録します -
register_odpu_perfmon_counters.ps1
– 管理対象外ODP.NETカウンタを登録します -
unregister_odpc_perfmon_counters.ps1
– ODP.NETコア・カウンタの登録を解除します -
unregister_odpm_perfmon_counters.ps1
– 管理対象ODP.NETカウンタの登録を解除します -
unregister_odpu_perfmon_counters.ps1
– 管理対象外ODP.NETカウンタの登録を解除します
これらのスクリプトは、Oracle Universal InstallerおよびNuGetデプロイメントの場合はORACLE_HOME\odp.net\PerfCounters
ディレクトリ、xcopyデプロイメントの場合は<INSTALLATION_DIRECTORY>\odp.net\PerfCounters
ディレクトリ、およびMSIデプロイメントの場合は<VISUAL_STUDIO_SOLUTION_DIRECTORY>\packages\Oracle.ManagedDataAccess.<VERSION>\PerfCounters
ディレクトリに、それぞれあります。
これらのPowerShellスクリプトを実行する場合は、Windows管理者権限が必要です。
登録を解除するには、登録を解除するODP.NETプロバイダ・タイプに一致する登録解除PowerShellスクリプトを実行します。
以前は、カウンタの登録および登録解除用にOraProvCfg.exe
ユーティリティがODP.NETに付属していました。このユーティリティは、これらのPowerShellスクリプトによって置き換えられます。このユーティリティにODP.NETカウンタを登録した場合は、同じOraProvCfg.exe
バージョンで登録を解除します。
パフォーマンス・カウンタの有効化
ODP.NETにより、プールされた接続および非プール接続など、様々な接続カウンタを監視できます。これらのカウンタは、個別に監視することも、まとめて監視することもできます。開発者は、管理対象および管理対象外ODP.NETで使用可能な.NET構成ファイルの<settings>
セクション、または管理対象外ODP.NETでのみ使用可能なWindowsレジストリのPerformanceCounters設定を使用して、アプリケーションの起動の前にどのカウンタを使用するか設定できます。ODP.NETコアの場合、開発者はOracleConfiguration.PerformanceCounters
プロパティを設定できます。
表3-7に、接続パフォーマンス・カウンタの設定値を示します。
表3-7 接続プーリングのパフォーマンス・カウンタ
パフォーマンス・カウンタ | 有効な値 | 説明 |
---|---|---|
なし |
|
無効(デフォルト) |
|
|
Oracle Databaseで毎秒確立されるセッション数。 |
|
|
Oracle Databaseから毎秒切断されるセッション数。 |
|
|
接続プールから毎秒確立されるアクティブな接続数。 |
|
|
接続プールから毎秒戻されるアクティブな接続数。 |
|
|
アクティブな接続プールの合計数。 |
|
|
非アクティブな接続プール数。 |
|
|
使用中の接続の合計数。 |
|
|
すべての接続プールで使用可能な接続の合計数。 |
|
|
プールされたアクティブ接続および空き接続の合計数。 |
|
|
プールされていないアクティブな接続の数。 |
|
|
暗黙的にガベージ・コレクションに入った接続数。 |
|
|
操作は行われません。このカウンタはもうサポートされていません。 |
複数のカウンタを監視するために、これらの設定はビット単位のORedです。たとえば、SoftConnectsPerSecond (4)
、Soft DisconnectsPerSecond (8)
およびNumberOfActiveConnectionPools (16)
のカウンタを収集するには、PerformanceCounters
を28
(4+8+12)に設定します。
.NET構成ファイルでのパフォーマンス・カウンタの設定
パフォーマンス・カウンタは、管理対象および管理対象外ODP.NETでのみ、web.config
やapp.config
などの.NET構成ファイルを使用して設定できます。.NET構成エントリはWindowsレジストリ設定よりも優先されるので、特定のアプリケーションに使用できます。
前述のとおり、<settings>
セクションのPerformanceCounters
設定を移入すると、個々のパフォーマンス・カウンタを監視できます。WindowsのPerfmonは、非常に長く、読みづらいアプリケーション・インスタンス名を使用しています。各アプリケーションを識別しやすくするために、管理者は.NET構成ファイルの<connectionPools>
セクションに識別子名を割り当てることができます。このセクションでは、次の設定がサポートされています。
-
connectionString
: この設定は、接続文字列を一意の識別子として使用して監視する接続またはプールを識別します。ここで入力する接続文字列は、監視するターゲット接続文字列と一致する必要がありますが、パスワード属性はありません。 -
poolName
(オプション): 接続文字列は非常に長く、多くがよく似た外観のため読みづらい可能性があります。poolName
を使用すると、任意の文字列を使用して監視対象プールを簡単に識別できます。
次の例に、これらの設定を使用する方法を示します。
ODP.NET管理対象ドライバ
<oracle.manageddataaccess.client> <version number="*"> <connectionPools> . . <connectionPool connectionString="[connection string without password]" poolName="[Pool Name]"> </connectionPool> . . </connectionPools> </version> </oracle.manageddataaccess.client>
ODP.NET管理対象外ドライバは、<oracle.manageddataaccess.client
>タグを<oracle.unmanageddataaccess.client
>タグに置き換えることによって、上にリストしたのと同じプール名の設定とフォーマットを使用できます。または、管理対象外ODP.NETにレガシー<oracle.dataaccess.client
>フォーマットを使用できます。
ODP.NET管理対象外ドライバ
<configuration> <oracle.dataaccess.client> <settings> . . <add name="[connection string without password]" value="connectionPool name='[Pool Name]'"/> . . </settings> </oracle.dataaccess.client> </configuration>
Windowsレジストリでのパフォーマンス・カウンタの設定
管理対象外ODP.NETパフォーマンス・カウンタの公開を個別に有効または無効にするには、タイプREG_SZ
のWindowsレジストリ値PerformanceCounters
を使用します。このレジストリ値は次のようになります。
HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\ODP.NET\
Assembly_Version
Assembly_Version
は、Oracle.DataAccess.dll
の完全なアセンブリ・バージョン番号です。
.NET構成ファイルと同様に、有効な値を追加して複数のパフォーマンス・カウンタを取得できます。たとえば、PerformanceCounters
が3に設定されている場合、HardConnectsPerSecond
およびHardDisconnectsPerSecond
は有効になります。
パフォーマンス・カウンタの公開
一般に、ODP.NETパフォーマンス・カウンタはPerfmonを使用して監視されます。カウンタは、次のカテゴリ名で公開されます。
-
ODP.NET、コア・ドライバ
-
ODP.NET管理対象ドライバ
-
ODP.NET管理対象外ドライバ
管理者は、これらのカテゴリを1つ以上選択した後で、監視する個々のODP.NETカウンタを選択できます。PerfMonはすべてのODP.NETカウンタを表示しますが、明示的に有効化されたカウンタのみ統計情報を生成します。
監視するカウンタを選択した後、管理者は監視する実行中のインスタンスを選択します。ODP.NETインスタンスは、PerfMonに表示されるようにアクティブに実行する必要があります。そうでない場合、モニターに使用可能なインスタンスは表示されません。インスタンス選択が発生した後、監視するカウンタとしてPerfMonに追加されます。
パフォーマンス・カウンタは、アプリケーション・ドメイン、プールまたはデータベース・インスタンスのレベルで監視できます。データベース・インスタンス・レベルの監視が適用されるのは、ロード・バランシング機能または高速接続フェイルオーバー機能が有効化されている場合のみです。
インスタンス名の形式は次のとおりです。
<アプリケーション・ドメイン名> [<プロセスID>, <アプリケーション・ドメインID>][<接続文字列/プール名>][<インスタンス名>]
。エントリの上限は127文字です。インスタンス名の各フィールドに対して長さの制約があります。次の表に、各フィールドの最大文字数を示します。
表3-8 パフォーマンス・カウンタのフィールド名と、最大文字数
フィールド名 | 最大文字数 |
---|---|
アプリケーション・ドメイン |
40 |
プール名/接続文字列 |
70 |
データベース・インスタンス名 |
16 |
フィールド値の長さが上限を超えているときは、その文字列は長さ制限に収まるように切り詰められて、続きがあることを示す「...
」が末尾に付加されます。たとえば、アプリケーションの名前がProgram.exe
で接続文字列がuser id=hr;Password=<password>;data source=inst1;max pool size=125;min pool size=50
であるとします。アプリケーション・ドメインが2つあるプロセスの場合は、次のようになります。
-
Program.exe [123, 1]
-
Program.exe [123, 1][ user id=hr;data source=inst1;max pool siz...]
-
Program.exe [123, 1][ user id=hr;data source=inst1;max pool siz...] [instA]
-
Domain 2[123, 2]
-
Domain 2[123, 2][ user id=hr;data source=inst1;max pool siz...]
-
Domain 2[123, 2][ user id=hr;data source=inst1;max pool siz...] [instB]
-
Domain 2[123, 2][ user id=hr;data source=inst1;max pool siz...] [instC]
接続プールの属性は先頭の70文字がよく似ているため、アプリケーションでプール名を設定しておくと監視ツールで各プールを一意に識別できるようになります。たとえば、プール名を使用するとき、プロセスは次のように表示されます。
Domain 2[123, 2][Pool Name][instC]
Traffic Directorモードのデータベース常駐接続プーリングおよび接続マネージャ
クライアント側の接続プーリングは、中間層マシンにとって非常に効率的です。ただし、アイドル接続の中間層サーバーが大量にある場合、データベース・サーバー・リソースを大量に消費する可能性があります。アイドル接続の数は最小限におさえることを目的としていますが、中間層サーバーが増加すると、それぞれにアプリケーション間で共有できないアイドル接続を持つ可能性があるため難しくなります。
データベース常駐の接続プール(DRCP)は、データベース・サーバー・レベルで接続をプールすることでリソース使用率を最適化することを目的としており、これにより多くのアプリケーション間で共有できます。利点は、スケーラビリティが向上し、データベース・サーバー・レベルでリソース使用率が低下することです。
Oracleのデータベース・プロキシ・ソリューションであるTraffic DirectorモードのConnection Manager (CMAN-TDM)には、プロキシ常駐接続プーリング(PRCP)という独自のプーリング機能があります。PRCPはDRCPと同様に動作します。アプリケーションがDRCPと適切に動作する場合は、PRCPとも同様に動作します。アプリケーション側で必要な変更は、TNS別名または簡易接続文字列が、データベース/DRCPサーバーではなくPRCPサーバーを指すようにすることです。
ODP.NETではDRCPおよびPRCPがサポートされています。それにより、データベース・サーバー・リソースをより有効に活用するためにこれらの接続を分配および解放できます。
DRCPについて
DRCPプール・サーバーのプロセスは、それぞれが専用サーバー・プロセスとデータベース・セッションを組み合せたものと同等です。これらは、プールされたサーバーと呼ばれます。プールされたサーバーは、同じホストまたは複数のホストで実行されている複数のアプリケーションによる共有が可能です。
DRCPがOracle Database Real Application Clusters (Oracle RAC)用に構成されている場合、プール構成は各データベース・インスタンスに適用されます。1つのインスタンスでプールを起動または停止すると、すべてのインスタンスのプールが起動または停止されます。
DRCPおよびODP.NET
DRCPは、ODP.NETのクライアント側のプーリングを補完するサーバー側のプールです。これらの2つのプールは一緒に使用できます
典型的な専用サーバー・モードでは、クライアント側の接続プーリングによって、サーバー・ラウンド・トリップとソケット/セッション作成の両方が節約されます。接続のオープン/クローズ手順では、サーバー・ラウンド・トリップは最初のOpen()
にのみ含まれます。同じ接続に対する後続のオープン/クローズ手順の場合、接続はクライアント・アドレス空間にローカルにプールされているため、クライアントからサーバーへの対話は必要ありません。
DRCPを有効にすると、クライアントが接続を確立するときに必要に応じて接続にプールされたサーバーが割り当てられます。接続がクローズされると、データベース・サーバーはDRCPサーバー・セッションをリリースしてサーバー側プールに戻し、DRCPサーバー・セッションを効率的に再利用できるようにします。このサーバー・セッションは、同じプールまたは同一または異なる中間層ホストの異なるプールによって再利用できます。
DRCPおよびODP.NETの構成
次の項では、クライアント側およびサーバー側でDRCPを構成する方法を説明します。
-
クライアント側でのDRCPの構成
ODP.NET開発者は、接続記述子で
(SERVER=POOLED)
を使用することで、クライアント側でDRCPを有効にできます。サンプル接続記述子:
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=myhost)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=sales.example.com)(SERVER=POOLED)))
-
サーバー側でのDRCPの構成
Oracleデータベースには、
SYS_DEFAULT_CONNECTION_POOL
と呼ばれるデフォルトの接続プールがあります。デフォルトでは、このプールは作成されますが起動はされません。データベース常駐接続プーリングを使用可能にするには、接続プールを明示的に起動する必要があります。プールを起動し終了するには、データベース管理者(DBA)が
SYSDBA
としてログインする必要があります。SQL> EXECUTE DBMS_CONNECTION_POOL.START_POOL();
複数のクライアント側ODP.NET接続プール間でDRCP接続を共有するには、ODP.NET接続を開く前に、
OracleConnection.DRCPConnectionClass
プロパティを文字列値に設定します。ODP.NETは、最初に同じDRCP接続クラス・プロパティ値でアイドル接続を取得しようとします。見つからない場合は、かわりに新しい接続を作成します。
例3-1 データベース常駐接続プーリング・アプリケーションの使用: サンプル・コード
// This application uses the following connect descriptor:
// oracle = (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=<hostname>)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=<service name>)(SERVER=POOLED)))
using System;
using Oracle.ManagedDataAccess.Client;
class DRCP
{
static void Main()
{
string constr = “user id=hr;password=hr;data source=oracle";
OracleConnection con = new OracleConnection(constr);
con.DRCPConnectionClass = "GroupA";
con.Open();
con.Dispose();
}
}
ノート:
ODP.NET管理対象外ドライバでDRCPを使用するには、次の設定が必要です。
-
.NET構成設定、
CPVersion
が2.0
に設定される必要があります。または、 -
CPVersion
は設定せずに、アプリケーションで使用されるTNS完全ディスクリプタに(SERVER=POOLED)
を設定します。
詳細は、「settingsセクション」を参照してください。
関連項目:
デフォルト接続プールまたはエンド・プールの構成の詳細は、『Oracle Database管理者ガイド』を参照してください。
Oracle MultitenantのDRCP
Oracle Database 21c以上では、各PDBにそれ固有の別々のDRCPを設定できます。
Oracle Database 19c以前では、DRCPはCDBレベルでのみ作成でき、そのすべてのPDB間で共有できます。したがって、ODP.NETでは、CDB全体に対して1つのDRCPが設定されます。それは、ルート・コンテナに接続することによってのみ構成され管理(起動、停止または再構成)されます。
構成する場合は、CDBを指すようにセッションを設定して、DRCPプールを開始します。たとえば:
alter session set container = cdb$root;
execute dbms_connection_pool.configure_pool('SYS_DEFAULT_CONNECTION_POOL');
execute dbms_connection_pool.start_pool();
Oracle Real Application Clusters (RAC)のDRCP
Oracle Real Application Clusters (RAC)環境では、インスタンスにDRCPを作成すると、そのDRCPはOracle RACデータベースのすべてのインスタンスにレプリケートされ、任意のインスタンスを使用して接続プールを管理できます。プール構成に対する変更は、すべてのOracle RACインスタンスで適用されます。
ODP.NETのDRCP制限
ODP.NETは、次のDRCPの機能はサポートしません。
-
エンド・ユーザー認証を使用したプロキシ接続のオープン
-
sysoper
接続のオープン -
OpenWithNewPassword
を使用したオープン -
SQLNET.AUTHENTICATION_SERVICES
パラメータ値のnts
への設定(これにより、Microsoft Windowsネイティブのオペレーティング・システム認証が有効になります) -
.NET Framework 4より前の.NET Frameworkバージョン
Oracleマルチテナントおよびプラガブル・データベース
Oracle Database 12cでは、Oracle Multitenantが導入され、これにより、スキーマ、スキーマ・オブジェクト、非スキーマ・オブジェクトのポータブル・コレクションをOracle Database内に構成し、これらを個別のデータベースとしてODP.NETに表示することができます。この自己完結型コレクションは、プラガブル・データベース(PDB)と呼ばれます。
Oracle Multitenantは、顧客がアプリケーションを変更することなく、複数のプラガブル・データベースを簡単に統合できるデータベース・アーキテクチャです。このアーキテクチャにより、多数のデータベースを1つのデータベースとして管理する利点をすべて提供しつつ、別々のデータベースの独立性およびリソース優先度付けを維持します。また、Oracle Multitenantは迅速なプロビジョニングおよびアップグレードを可能にし、他のOracleデータベース・オプションを完全に補完します。
管理対象および管理対象外のODP.NETは、Oracle Multitenantを完全にサポートします。個々のプラガブル・データベースに接続できることに加えて、ODP.NETは拡張されて、アプリケーションが同じ接続プールから特定のPDBに対して接続をリクエストおよび取得できるようになりました。アプリケーションは、同じコンテナ・データベース(CDB)の一部であるPDBのどれにでも接続でき、同じ共通ユーザーを持つ必要があります。また、接続がOracle Real Application Clustersなどで複数のインスタンスにまたがる場合、すべてのインスタンスは、共通ユーザーが接続するためにまったく同じPDBおよびサービスを一様に持つ必要があります。こうした条件が満たされると、ODP.NETは同じプール内の1つのPDBから別のPDBへの接続を、非常に効率的な方法で接続または暗黙的に切り替えることができます。
特定のPDBへの接続を(共通ユーザーとして)確立するには、OracleConnections
プロパティ、PDBName
およびServiceName
を設定してから、OracleConnection.Open()
を呼び出して、指定したPDBおよびサービス名への接続を確立します。PDBName
およびServiceName
は、接続プールからの既存のアイドル接続を使用する場合に、接続の確立または切り替えが必要なPDBおよびサービスを識別します。これらは、それぞれプラガブル・データベース名およびデータベース・サービス名です。PDBName
プロパティのみが設定されていて、サービス名が設定されていない場合、プロバイダはデフォルト(管理)・サービスを使用する接続を戻します。
ノート:
ODP.NETでは、管理対象外ドライバは同じプール内でPDB接続を切り替えることができます。
-
.NET構成設定、
CPVersion
が2.0
に設定される必要があります。または、 -
CPVersion
は設定せずに、指定された接続文字列の接続要求に対してPDBName
またはServiceName
(あるいはその両方)にNULL以外/空以外の値を設定します。
詳細は、「settingsセクション」を参照してください。
例3-2 プラガブル・データベースの使用: サンプル・コード
// C#
using System;
using Oracle.ManagedDataAccess.Client;
class PDB
{
static void Main()
{
string constr = “user id=hr;password=hr;data source=oracle”;
OracleConnection con = new OracleConnection(constr);
con.PDBName = "pdb1";
con.ServiceName = "db1.company.com";
con.Open();
con.Close();
}
}
ODP.NETは、プールされた接続が確立されているPDBName
およびServiceName
を追跡します。アプリケーションが指定されたPDBName
およびServiceName
で接続を要求すると、ODP.NETは要求と一致する接続を戻します。ただし、一致する接続が見つからない場合、ODP.NETは新しい接続を作成またはセッションを変更(あるいはその両方)を行って、要求されたPDBName
およびServiceName
に切り替えます。PDBName
またはServiceName
(あるいはその両方)が変更されている場合、SwitchedConnection
プロパティは、Open()
メソッドの起動で呼び出されると、trueを戻します。
ODP.NETでは、プロセスの存続期間中にALTER SESSION
文を使用してコンテナ・データベースを変更することはサポートされていません。Oracle Continuous Query NotificationでPDBを使用している場合、Oracle Database 12cリリース2以上に接続する必要があります。同じプールから複数のPDBへの接続をホストするには、ODP.NET for .NET Framework 4以上が必要です。
ノート:
あるPDB/サービスから別のPDB/サービスに接続が暗黙的に切り替えられている場合、サービス再配置接続タイムアウト(SRCT)は有効になりません。関連項目:
『Oracle Database管理者ガイド』のプラガブル・データベースの管理に関する説明を参照
エディションベースの再定義
エディションベースの再定義を使用すると、アプリケーションが使用中であってもそのデータベース・コンポーネントをアップグレードできます。このため、アプリケーションの停止時間を最小化あるいは排除することができます。
ODP.NETでは、プロセスの存続期間中にALTER SESSION
文を使用してエディションを変更することはサポートされていません。
管理対象および管理対象外ODP.NETはデータベース・エディションに接続でき、同じプール内の複数のエディションへの接続をホストすることもできます。ODP.NETアプリケーションは、OracleConnection.DatabaseEditionName
プロパティを接続が関連付けられるデータベース・エディションの名前に設定することで、指定されたデータベース・エディションに関連付けられている接続を取得できます。単一のプールを使用するには、同じユーザーが両方のエディションに接続できる必要があります。ODP.NETは同じ接続プールを使用でき、エディション固有のプロパティを変更するだけで同じOracleConnection
オブジェクトを共有することもできるため、エディションを使用するとアプリケーションのパフォーマンスが向上し、効率的になります。
例3-3 エディションベースの再定義の使用: サンプル・コード
using System;
using Oracle.ManagedDataAccess.Client;
class Editions
{
static void Main()
{
// Create a connection
string constr = “user id=hr;password=hr;data source=oracle”;
OracleConnection con = new OracleConnection(constr);
// Obtain a connection associated with EditionX
con.DatabaseEditionName = "EditionX";
con.Open();
// Obtain a connection associated with EditionY
con.Close();
con.DatabaseEditionName = "EditionY";
con.Open();
con.Dispose();
}
}
接続をオープンしている間にDatabaseEditionName
を使用してエディション名を変更することはできません。接続がクローズ状態のときに変更する必要があります。
ODP.NETは、Oracle Database 11gリリース2以上に接続する場合にエディションをサポートします。同じプールで複数のエディションをホストすることは、ODP.NET for .NET Framework 4以上でのみ可能です。
ノート:
管理対象外ODP.NET接続プールでこのエディションベースの再定義機能を使用するには:
-
.NET構成設定、
CPVersion
が2.0
に設定される必要があります。または、 -
CPVersion
は設定せずに、指定された接続文字列の接続要求に対してDatabaseEditionName
プロパティにNULL以外/空以外の値に設定します。
詳細は、「settingsセクション」を参照してください。
アプリケーションは、レジストリまたは構成ファイルを使用して、デプロイメント時にエディションを指定できます。アプリケーションは、タイプREG_SZ
の次のレジストリ・エントリを作成できます。
HKLM\Software\Oracle\ODP.NET\version\Edition
ここで、version
はODP.NETのバージョン、Edition
はエディションの有効な文字列値です。
アプリケーションは、かわりにweb.config
またはapplication.config
構成ファイルを使用して、デプロイメント時にエディションを指定できます。machine.config
構成ファイルを使用すると、特定のバージョンの.NET frameworkを使用するすべてのアプリケーションに対してエディションを指定できます。
次の例では、ODP.NET管理対象外ドライバの.NET構成ファイルでエディションをE1
に設定します。
<?xml version="1.0" encoding="utf-8" ?> <configuration> <oracle.dataaccess.client> <settings> <add name="Edition" value="E1"/> </settings> </oracle.dataaccess.client> </configuration>
まとめると、エディション名は.NET構成ファイルまたはWindowsレジストリのDatabaseEditionName
プロパティで設定することができます。DatabaseEditionName
が設定されている場合、他の2つの設定より優先されます。.NET構成ファイルにエディションが設定されている場合、レジストリよりも優先されます。
関連項目:
エディションの詳細は、『Oracle Database管理者ガイド』および『Oracle Database開発者ガイド』を参照
特権接続
データベース管理者は、SYSDBA
、SYSASM
、SYSOPER
などの様々な権限を使用してOracle Databaseにアクセスできます。これは、ConnectionString
プロパティのDBA
Privilege
属性によって実行されます。
次の例では、SYSDBA
としてscott
/tiger
に接続します。
// C# using System; using Oracle.DataAccess.Client; class PrivilegedConnectionSample { static void Main() { OracleConnection con = new OracleConnection(); //Connect scott/tiger as SYSDBA con.ConnectionString = "User Id=scott;Password=tiger;" + "DBA Privilege=SYSDBA;Data Source=oracle;"; con.Open(); Console.WriteLine("Connected to Oracle" + con.ServerVersion); // Close and Dispose OracleConnection object con.Close(); con.Dispose(); Console.WriteLine("Disconnected"); } }
関連項目:
データベースでの特権接続の詳細は、表6-51のDBA Privilegeを参照してください
OracleCredentialでの接続プーリング
パスワードをさらに安全にするため、すべてのODP.NETアプリケーションは、OracleCredential
を使用して、接続文字列の外部にユーザー名とパスワードを格納できます。OracleCredential
を使用すると、ページ・ファイル・スワップまたはクラッシュ・ダンプにユーザー資格証明が公開される可能性を軽減できます。
OracleCredential
は、接続プーリングの有無にかかわらず使用できます。
OracleCredential
オブジェクトを使用する場合、Oracleデータベースへの接続を開くときに、この新機能を考慮して変更された接続プール・アルゴリズムを認識する必要があります。ODP.NET接続プール・アルゴリズムの以前の実装では、接続文字列属性値の一意性を使用して新しい接続プールを作成する必要があるか、既存の接続プールを使用して接続を配布できるかを決定していました。ただし、OracleCredential
の導入では、このオブジェクトの参照も使用して、どの接続プールにOracleConnection
オブジェクトが関連付けられるかを決定します。
新しい接続プールを作成する決定は、2つのファクタに依存します。1つ目は(以前のリリースのように)接続文字列の一意性、2つ目は、新しい接続を開くときのOracleConnection
オブジェクトに指定されたOracleCredential
の参照比較です。これらのいずれかが異なる場合は、別のプールが使用されます。OracleCredential
オブジェクトの使用中に同じ接続プールの再使用を維持し、追加の接続プールを作成しないようにするには、データベース・ユーザーごとに1つのOracleCredential
オブジェクトを作成し、接続を開くときに同じオブジェクトを再使用します。
次に、新しいアルゴリズムを明確にする方法を示します。
using System; using System.Security; using Oracle.ManagedDataAccess.Client; //using Oracle.DataAccess.Client; class Test { static void Main() { string connStr1 = "user id=hr; password=hr; data source=oracle"; string connStr2 = "data source=oracle"; SecureString secPwd = new SecureString(); secPwd.AppendChar('h'); secPwd.AppendChar('r'); secPwd.MakeReadOnly(); OracleCredential oc1 = new OracleCredential("hr", secPwd); OracleCredential oc2 = new OracleCredential("hr", secPwd); OracleCredential oc3 = new OracleCredential("hr", secPwd); // con1 and con2 are associated with the same connection pool since both are using the same // connection string and OracleCredential remains null in both cases. OracleConnection con1 = new OracleConnection(connStr1); OracleConnection con2 = new OracleConnection(connStr1, null); // con3 and con4 use the same connection string but different OracleCredential objects // (although same contents) so they are associated with different connection pools. OracleConnection con3 = new OracleConnection(connStr2, oc1); OracleConnection con4 = new OracleConnection(connStr2, oc2); // con5 and con6 use the same connection string and same OracleCredential object // so they are associated with the same connection pool. OracleConnection con5 = new OracleConnection(connStr2, oc3); OracleConnection con6 = new OracleConnection(connStr2, oc3); // Open the connections con1.Open(); con2.Open(); con3.Open(); con4.Open(); con5.Open(); con6.Open(); // Please note that con1 and con2 use the same connection pool. // In addition, con3 and con4 use different connection pools // And lastly con5 and con6 use the same connection pool. // Thus, in the end, there will be 4 different connection pools created in total. } }
ノート:
OracleCredential
では、SecureString
パスワードの二重引用符をサポートしません。ただし、二重引用符はパスワード内で使用できます。
関連項目:
OracleOpaqueStringによるパスワードの保護
パスワードは、.NET SecureString
として格納できます。ただし、データ型にはテキストの機密性の維持に関して弱点があります。OracleOpaqueString
は、SecureString
のような制限がなく、文字列データを難読化します。
より堅牢なセキュリティを実現するために、SecureString
ではなくOracleOpaqueString
を使用することをお薦めします。
SecureString
パラメータを含む既存のODP.NET APIには、OracleOpaqueString
を使用するオーバーロードされた対応するAPIもあります。ODP.NET開発者は、SecureString
またはさらに安全なOracleOpaqueString
のいずれかを柔軟に使用できます。
アプリケーションによって一度に1文字ずつ空のOracleOpaqueString
インスタンスが移入されます。データ型を使用するために、アプリケーションでそれが読取り専用かつ不変に設定されます。この不変な状態は永続的です。OracleOpaqueString
が読取り専用になると、ODP.NETでの接続の作成に使用できます。この動作は、SecureString
の動作と一致します。
SecureString
とOracleOpaqueString
のプログラム的な違いの1つは、OracleCredential
クラスでの使用です。OracleOpaqueString
を使用してパスワードまたはプロキシ・パスワードを設定するために、パスワードがnullに設定されている既存のコンストラクタのいずれかを使用します。次に、SetPassword()
およびSetProxyPassword()
メソッドを使用してパスワードを設定します。
アプリケーションがOracleCredential
のプロキシ・ユーザーおよびパスワードを設定または更新する場合、OracleOpaqueString
とSetPassword()
およびSetProxyPassword()
メソッドのみを使用して実行できます。
SetPassword
およびSetProxyPassword
メソッドの利点は、資格証明が変更されるたびに既存のOracleCredential
インスタンスのパスワードを更新できることです。これは、OracleOpaqueString
およびOracleCredential
を使用する場合にのみ可能です。
次のコード・サンプルでは、ODP.NETユーザー資格証明とともにOracleOpaqueString
パスワードを使用する方法を示しています。
//Create OracleOpaqueString and populate it with the password OracleOpaqueString opaquePassword = new OracleOpaqueString(); foreach (char c in "<PASSWORD>") opaquePassword.AppendChar(c); opaquePassword.MakeReadOnly(); //Create OracleCredential and set the instance's values OracleCredential cred = new OracleCredential("HR, null, OracleDBAPrivilege.NONE); cred.SetPassword(opaquePassword); //Create the connection, populate the connection string with the OracleCredential values, and open OracleConnection conn = new OracleConnection("data source=<DATA SOURCE>"); conn.Credential = cred; conn.Open();
パスワードの有効期限
ユーザーのパスワードを失効させることができます。ODP.NETは、新規パスワードで接続をオープンする新しいメソッドOpenWithNewPassword
を指定することで、アプリケーションにパスワードの失効を処理させることができます。
次のコードは、panther
の新規パスワードで接続するために、OracleConnection
OpenWithNewPassword
メソッドを使用しています。
/* Database Setup connect / as sysdba; drop user testexpire cascade; -- create user "testexpire" with password "testexpire" grant connect , resource to testexpire identified by testexpire; alter user testexpire password expire; */ // C# using System; using Oracle.DataAccess.Client; class PasswordExpirationSample { static void Main() { OracleConnection con = new OracleConnection(); try { con.ConnectionString = "User Id=testexpire;Password=testexpire;Data Source=oracle"; con.Open(); Console.WriteLine("Connected to Oracle" + con.ServerVersion); } catch (OracleException ex) { Console.WriteLine(ex.Message); //check the error number //ORA-28001 : the password has expired if (ex.Number == 28001) { Console.WriteLine("\nChanging password to panther"); con.OpenWithNewPassword("panther"); Console.WriteLine("Connected with new password."); } } finally { // Close and Dispose OracleConnection object con.Close(); con.Dispose(); Console.WriteLine("Disconnected"); } } }
ノート:
-
OpenWithNewPassword
は、パスワードを変更するためではなく、ユーザーのパスワードが失効した場合のみ使用してください。 -
接続プーリングが有効な場合、
OpenWithNewPassword
メソッドを呼び出すと接続プールがクリアされます。その結果、古いパスワードで作成されたアイドル接続はすべてクローズされます。
プロキシ認証
データベースの設定が正しければ、データベース・ユーザーのアイデンティティおよび特権を保持し、ユーザーのかわりに監査処理を実行して、プロキシ認証により、中間層アプリケーションでセキュリティを制御できるようになります。そのためには、(実在の)データベース・ユーザー(複数可)のかわりにデータベースに接続し、認証を受けるプロキシ・データベース・ユーザーを作成および使用します。
さらに、プロキシ認証をすると、接続プーリングのスケーラビリティを強化できます。接続プーリングをプロキシ認証と組み合せて使用すると、プロキシ認証済の接続を、実在する複数のユーザー間で共有できます。これは、プロキシに対して確立済の接続およびセッションのみがキャッシュされるためです。プロキシ認証済の接続を要求すると、セッションが実際のユーザーに対して追加作成されますが、このプロキシ認証済接続がプール内に戻されると、追加作成されたセッションは廃棄されます。この設計により、セキュリティを犠牲にすることなくアプリケーションのスケーラビリティを強化できます。
ODP.NETアプリケーションでプロキシ認証を使用するには、接続文字列に、"Proxy
User
Id"
属性および"Proxy
Password"
属性を設定します。実在のユーザーは、"User
Id"
属性で指定します。オプションで、"Password"
接続文字列属性を介して実在のユーザーのパスワードを指定すると、セキュリティがさらに強化されます。プロキシ認証とともに分散トランザクションを使用する場合は、実際のユーザーのパスワードがオプションでなくなるため、パスワードを指定する必要があります。
ODP.NETプロキシ認証の使用例を次に示します。
/* Log on as DBA (SYS or SYSTEM) that has CREATE USER privilege. Create a proxy user and modified scott to allow proxy connection. create user appserver identified by eagle; grant connect, resource to appserver; alter user scott grant connect through appserver; */ // C# using System; using Oracle.DataAccess.Client; class ProxyAuthenticationSample { static void Main() { OracleConnection con = new OracleConnection(); // Connecting using proxy authentication con.ConnectionString = "User Id=scott;Password=tiger;" + "Data Source=oracle;Proxy User Id=appserver;Proxy Password=eagle; "; con.Open(); Console.WriteLine("Connected to Oracle" + con.ServerVersion); // Close and Dispose OracleConnection object con.Close(); con.Dispose(); Console.WriteLine("Disconnected"); } }
ODP.NETプロキシ認証では、管理対象ODP.NETおよびODP.NET Coreでの接続文字列構文(User Id=<PROXY USER ID>[<REAL USER ID>];Password=<PROXY PASSWORD>
)も使用できます。たとえば、前述のプロキシ・ユーザー・コード・サンプルと同じ資格証明を使用する場合は、User Id=appserver[scott];Password=eagle
です。この形式は、単一セッションのプロキシ接続に適用されます。この形式では、2つのセッションのプロキシ接続はサポートされていません。ODP.NETでは、SEPSウォレットに格納されている場合にもこの形式がサポートされています。
関連項目:
-
ALTER
USER
文のプロキシ句の説明と構文は、Oracle Database SQL言語リファレンスを参照 -
SQL文に対する監査の動作と、多層環境における権限については、Oracle Databaseセキュリティ・ガイドを参照
動的な分散トランザクション登録
OracleConnection
オブジェクトのEnlistDistributedTransaction
を使用して分散トランザクションに動的に登録するアプリケーションでは、"Enlist"
接続文字列属性の値を"true"
に設定する必要があります。"Enlist=true"
の場合、COM+トランザクションまたはSystem.Transactions
のコンテキスト内でOracleConnection
オブジェクトに対してOpen
メソッドがコールされると、接続がトランザクションに登録されます。そうでない場合、OracleConnection
オブジェクトは分散トランザクションに登録されませんが、後でEnlistDistributedTransaction
またはEnlistTransaction
メソッドを使用して明示的に登録できます。"Enlist
"が"false
"または"dynamic
"の場合、接続はトランザクション内に登録できません。ODAC 12cリリース3のODP.NET管理対象外ドライバは、"Enlist=dynamic
"用にこの新しい動作を最初に導入しました。
クライアント識別子とエンドツーエンド・トレース
クライアント識別子は、Oracleアプリケーションのコンテキスト・ネームスペースUSERENV
から事前に定義された属性です。ユーザーのアイデンティティのトラッキングが可能であるという点で、プロキシ認証に似ています。ただし、プロキシ認証では、2つのセッション(プロキシ・ユーザー用とエンド・ユーザー用)を作成する必要がありません。さらに、クライアント識別子は、データベース・ユーザーである必要はありません。任意の文字列に設定できます。最も重要な点は、クライアント識別子を使用することで、ODP.NET開発者がApplication ContextおよびOracle Label Securityを使用してOracle Virtual Private Database(VPD)をより簡単に構成できることです。クライアント識別子を設定するため、接続をオープンしてから、ODP.NETアプリケーションでOracleConnection
オブジェクトにClientId
プロパティを設定できます。管理対象外ODP.NETで接続プーリングが有効な場合、プールに接続が戻されると、常にClientId
はnullにリセットされます。管理対象ODP.NETでは、接続がプールに戻されてから最初のデータベース・ラウンドトリップの際に、ClientId
がnullにリセットされます(新しい値が指定されていない場合)。
クライアント識別子は、エンドツーエンド・アプリケーション・トレースにも使用できます。エンドツーエンド・トレースは、複数層環境のパフォーマンス上の問題の診断プロセスを単純化します。複数層環境では、エンド・クライアントからの要求は中間層で別のデータベース・セッションにルーティングされるため、異なるデータベース・セッションを越えてクライアントを追跡することは困難になります。エンドツーエンド・トレースでは、クライアント識別子を使用して、データベース・サーバーに対するすべての層から特定のエンドクライアントを一意にトレースします。
ODP.NETでは、OracleConnection
オブジェクトの書込み専用プロパティであるActionName、ClientId
、ClientInfo
、およびModuleName
が公開されています。これらのプロパティは、次のエンドツーエンドのトレース属性に対応しています。
-
ActionName
- モジュールのINSERT
操作やUPDATE
操作などのアクションを指定します。 -
ClientId
-HR.HR
などのログオンIDに基づいてエンド・ユーザーを指定します。 -
ClientInfo
- ユーザー・セッション情報を指定します。 -
ModuleName
- アプリケーションのAccounts ReceivableやGeneral Ledgerなどの機能ブロックを指定します。
関連項目:
-
エンドツーエンド・アプリケーションのトレースの概要は、Oracle Database SQLチューニング・ガイドを参照
自動接続リカバリ
ODP.NETでは、リクエスト境界の開始時に、計画済停止や計画外停止(データベース・フェイルオーバーやネットワーク障害など)によって発生した無効な接続を検出できます。無効なセッションが検出されると、ODP.NETによって、新しいセッションを作成することで残りのデータベース・インスタンスにフェイルオーバーされます。無効な接続は分配されないため、エンド・ユーザーにはエラーは発生しません。
自動接続リカバリ(ACR)は、ODP.NET 23.8以降では自動的に有効になっています。これは、すべてのODP.NETプロバイダ・タイプ(コア、管理対象および管理対象外)で使用できます。これを使用するために、クライアント側でもデータベース・サーバー側でも、コードや構成の変更は必要ありません。
ACRは、アプリケーション・コンティニュイティ(AC)、高速接続フェイルオーバー(FCF)および透過的アプリケーション・フェイルオーバー(TAF)とは異なる高可用性機能です。ACRの主な目的は、新しいリクエストで、有効な接続が受信されるようにすることです。これにより、接続のセッションおよびトランザクションの状態はリカバリされず、ACやTAFの場合と同様に、フェイルオーバー後に同じエンド・ユーザーにそれが戻されます。
ACRの機能は、3つのうち最もFCFに似ています。ただし、FCFとは異なり、ACRでは、接続のセッション状態が1つずつ(それぞれが分配されるとき)チェックされます。FCFでは、接続およびデータベースのステータス・メッセージがリアルタイムで送信され、障害メッセージを受信すると、無効な接続がすべて削除されます。FCFのほうが、反応性の高い高速な方法です。
ACRの利点は、使用するために設定が必要なく、常にオンになっているということです。
セッション状態のリセットによるアプリケーションの状態リークの制限
RESET_STATE
データベース・サービス属性は、値LEVEL1
に設定されている場合は、ODP.NETセッション状態を部分的にクリアします。これは、リクエストの最後に、次のリクエストを処理する前に実行されるため、あるセッションから次のセッションへのセッション状態リークが制限されます。RESET_STATE
サービス属性は、セッション状態が以降の再利用にリークしないようにするために、すべてのステートレス・アプリケーションにお薦めします。
この機能を使用するために、ODP.NETのコード変更は必要はありません。すべてのODP.NETプロバイダ・タイプで、この機能がサポートされています。
RESET_STATE
では、すべてのセッション状態属性がリセットされるわけではありません。
ノート:
RESET_STATE
と、それでリセットされるセッション状態属性についてさらに学習するには、アプリケーション・コンティニュイティについてを参照してください。