mTLSを使用したPythonアプリケーションの接続

適用対象: 適用可能 Exadata Cloud@Customerのみ

mTLSを使用して、PythonアプリケーションをAutonomous Databaseインスタンスに接続できます。

mTLSを使用したPythonアプリケーションの接続では、認証および暗号化の高度なセキュリティが提供され、(ユーザー名とパスワードを指定することで)クライアント資格証明を使用してセキュリティが強化されます。

python-oracledbドライバのデフォルトのThinモードは、Oracle Databaseに直接接続されます。オプションで、いくつかの追加機能のためにOracle Clientライブラリ「Thick mode」を使用できます。Oracle Clientライブラリは、Oracle Instant Client、フルOracle Client、またはOracle Databaseインストールから取得できます。

mTLSを使用してAutonomous DatabaseインスタンスにPythonアプリケーションを接続するには、次のステップに従います:

  1. Pythonおよびpython-oracledbドライバのインストール
  2. セキュリティ資格証明(Oracle Wallet)の取得およびネットワーク接続の有効化
  3. シン・モードでのみ接続する場合は、このステップを実行します: python-oracledbシン・モード(mTLS)を使用したPythonアプリケーションの実行
  4. Thickモードで接続する場合、このステップを実行します: python-oracledb Thickモード(mTLS)を使用したPythonアプリケーションの実行

Pythonおよびpython-oracledbドライバのインストール

PythonアプリケーションからAutonomous Databaseに接続するには、Pythonおよびpython-oracledbドライバをインストールします。

  1. Python 3がまだ使用できない場合は、それをインストールします。

    使用するPythonのバージョンは、クライアント側のOSおよびハードウェアによって異なります。たとえば、Windows、Linux、macOSなどです。

    ノート:

    Oracleでは、Pythonおよびpython-oracledbドライバ・リリースを最新に保つことをお薦めします。
  2. PyPIからpython-oracledbドライバをインストールします。

    python-oracledbドライバは、PythonプログラムでOracle Databaseに接続できるようにするPythonプログラミング言語拡張モジュールです。python-oracledbドライバは、一般的なcx_Oracleドライバの名前が変更された新しいメジャー・リリースです。

    サポートされているpython-oracledbドライバのバージョン: python-oracledb 1.0 (またはそれ以降)

    次のコマンドを実行して、pythonをアップグレードします:

    python -m pip install oracledb --upgrade

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

    Collecting oracledb
      Downloading oracledb-1.0.3-cp310-cp310-win_amd64.whl (1.0 MB)
         ---------------------------------------- 1.0/1.0 MB 1.8 MB/s eta 0:00:00
    Collecting cryptography>=3.4
      Downloading cryptography-37.0.4-cp36-abi3-win_amd64.whl (2.4 MB)
         ---------------------------------------- 2.4/2.4 MB 3.5 MB/s eta 0:00:00
    Collecting cffi>=1.12
      Downloading cffi-1.15.1-cp310-cp310-win_amd64.whl (179 kB)
         ---------------------------------------- 179.1/179.1 kB 5.4 MB/s eta 0:00:00
    Collecting pycparser
      Downloading pycparser-2.21-py2.py3-none-any.whl (118 kB)
         ---------------------------------------- 118.7/118.7 kB 7.2 MB/s eta 0:00:00
    Installing collected packages: pycparser, cffi, cryptography, oracledb
    Successfully installed cffi-1.15.1 cryptography-37.0.4 oracledb-1.0.3 pycparser-2.21

    python-oracledbのインストールに関するノート:

    • プロキシを使用している場合、--proxyオプションを使用してコマンドにプロキシ・サーバーを追加します。たとえば次のようにします。

      python -m pip install oracledb --upgrade --proxy=http://proxy.example.com:80
    • システム・ディレクトリへの書込み権限がない場合は、--userオプションを含めます。たとえば次のようにします。

      python -m pip install oracledb --upgrade --user
    • 使用しているプラットフォームでバイナリ・パッケージを使用できない場合、pipを実行すると、かわりにソース・パッケージがダウンロードされます。ソースがコンパイルされ、結果のバイナリがインストールされます。

    その他のオプションおよびヒントは、python-oracledbのインストールを参照してください。

  3. python-oracledbドライバをThickモードで使用する場合は、Oracle Clientソフトウェアをインストールします。

    デフォルトでは、python-oracledbはOracle Databaseに直接接続されるThinモードで実行されます。Thinモードでは、Oracle Clientライブラリは必要ありません。ただし、python-oracledbがThickモードで実行されている場合、いくつかの追加機能を使用できます。

    ノート:

    python-oracledbのThinおよびThickモードでサポートされている機能の詳細は、python-oracledbでサポートされるOracle Databaseの機能を参照してください。このリンクに示されているすべての機能をAutonomous Databaseで使用できるわけではありません。

    Oracle Instant ClientライブラリまたはOracle Database Clientライブラリのいずれかを使用して、Pythonコードでoracledb.init_oracle_client()をコールすると、python-oracledbではThickモードが使用されます。

    Oracle Clientソフトウェアをインストールする場合、mTLS接続とTLS接続に必要な最小バージョンは次のように異なります:

    • 相互TLS (mTLS)接続:

      • データベースがリモート・コンピュータ上にある場合は、使用しているオペレーティング・システム・アーキテクチャ用の無料のOracle Instant Client BasicパッケージまたはBasic Lightパッケージをダウンロードします。サポートされているバージョン(Oracle Instant Client: 18.19 (以上)、19.2 (以上)、または21 (ベース・リリース以上)を使用します。

      • または、システムで使用可能であれば、フルOracle Databaseクライアント・ライブラリを使用できます(フルOracle Database Client: Oracle Database Client: 18.19 (以上)、19.2 (以上)、または21 (ベース・リリース以上)。

    • TLS接続: Oracle Call Interface (OCI)クライアントでは、次のクライアント・バージョンを使用している場合、TLS認証がサポートされます:

      • Oracle Instant Client/Oracle Database Client 19.14 (以上)および21.5 (以上) - すべてのプラットフォーム
      • または、システムで使用可能であれば、フルOracle Databaseクライアント・ライブラリを使用できます(フルOracle Database Client 19.14 (以上)および21.5 (以上)を含む)。

セキュリティ資格証明(Oracle Wallet)の取得およびネットワーク接続の有効化

クライアント・セキュリティ資格証明を取得して、Autonomous Databaseインスタンスに接続します。

  1. Autonomous Databaseインスタンスからウォレット・ファイルをダウンロードして、Autonomous Databaseインスタンスにアクセスするために必要なクライアント・セキュリティ資格証明およびネットワーク構成設定を含むzipファイルを取得します。

    クライアント・セキュリティ資格証明(wallet.zipファイル)を取得します:

    • ADMINユーザー: Oracle Cloud Infrastructureコンソールで、「データベース接続」をクリックします。クライアント資格証明(ウォレット)のダウンロードを参照してください。

    • 他のユーザー(非管理者): Autonomous Databaseインスタンスの管理者からOracle Walletを取得します。

    ノート:

    不正なデータベース・アクセスを防ぐために、wallet.zipファイルとそのコンテンツを保護します。
  2. クライアント資格証明ファイル(wallet.zip)を解凍します。

python-oracledb Thinモード(mTLS)を使用したPythonアプリケーションの実行

デフォルトでは、python-oracledbはThinモードを使用してAutonomous Databaseインスタンスに直接接続します。

Thinモードでは、ウォレットzipの2つのファイルのみが必要です:

  • tnsnames.ora: アプリケーション接続文字列に使用されるネット・サービスをデータベース・サービスにマップします。

  • ewallet.pem: ThinモードでSSL/TLS接続を有効にします。

Thinモードで接続するには:

  1. tnsnames.oraおよびewallet.pemファイルをシステム上の場所に移動します。

    たとえば、Linuxでは次のようにします。

    /opt/OracleCloud/MYDB

    たとえば、Windowsでは次のように指定します。

    C:\opt\OracleCloud\MYDB
  2. Pythonアプリケーションで、次の接続パラメータを設定してAutonomous Databaseインスタンスに接続します:
    • config_dir: tnsnames.oraを含むディレクトリを指定します。
    • dsn: tnsnames.oraファイルから目的のネットワーク別名を指定するために使用します。
    • password: データベース・ユーザー・パスワードを指定します。
    • user: データベース・ユーザーを指定します。
    • wallet_location: PEMファイル(ewallet.pem)を含むディレクトリを指定します。
    • wallet_password: PEMファイル(ewallet.pem)のパスワードを指定します。このパスワードは、wallet.zipファイルのダウンロード時に設定します。

    たとえば、Linuxでは、db2024_lowネットワーク・サービス名でoracledb.connectを使用してADMINユーザーとして接続します(サービス名はtnsnames.oraにあります):

    connection=oracledb.connect(
         config_dir="/opt/OracleCloud/MYDB",
         user="admin",
         password=password,
         dsn="db2024_low",
         wallet_location="/opt/OracleCloud/MYDB",
         wallet_password=wallet_pw)

    たとえば、Windowsでは、db2024_lowネットワーク・サービス名でoracledb.connectを使用してADMINユーザーとして接続します(サービス名はtnsnames.oraにあります):

    connection=oracledb.connect(
         config_dir=r"C:\opt\OracleCloud\MYDB",
         user="admin",
         password=password,
         dsn="db2024_low",
         wallet_location=r"C:\opt\OracleCloud\MYDB",
         wallet_password=wallet_pw)

    'raw'文字列r"..."の使用は、バックスラッシュがディレクトリ・セパレータとして扱われることを意味します。

    この例に示すように、wallet_locationconfig_dirは同じディレクトリに設定されます(ディレクトリにはtnsnames.oraewallet.pemが含まれます)。これらのファイルに同じディレクトリを指定することは必須ではありません。

ファイアウォールの背後にある場合は、接続記述子でHTTPS_PROXYを使用するか、接続属性を設定することで、プロキシを介してTLS/SSL接続をトンネリングできます。成功した接続は、特定のプロキシ構成によって異なります。Oracleでは、パフォーマンスへの影響が考えられるため、本番環境でのプロキシの使用はお薦めしません。詳細は、『Oracle Database 19cデータベース・ネット・サービス・リファレンス』のHTTPS_PROXYまたは『Oracle Database 23aiデータベース・ネット・サービス・リファレンス』を参照してください。

Thinモードでは、https_proxyおよびhttp_proxy_portパラメータを追加してプロキシを指定できます。

たとえば、Linuxで:

connection=oracledb.connect(
     config_dir="/opt/OracleCloud/MYDB",
     user="admin",
     password=password,
     dsn="db2024_low",
     wallet_location="/opt/OracleCloud/MYDB",
     wallet_password=wallet_pw,
     https_proxy='myproxy.example.com',
     https_proxy_port=80)

たとえば、Windowsでは次のように指定します。

connection=oracledb.connect(
     config_dir=r"C:\opt\OracleCloud\MYDB",
     user="admin",
     password=password,
     dsn="db2024_low",
     wallet_location=r"C:\opt\OracleCloud\MYDB",
     wallet_password=wallet_pw,
     https_proxy='myproxy.example.com',
     https_proxy_port=80)

python-oracledb Thick Mode (mTLS)を使用したPythonアプリケーションの実行

デフォルトでは、python-oracledbはOracle Databaseに直接接続されるThinモードで実行されます。ドライバがThickモードで実行されている場合、追加のpython-oracledb機能を使用できます。

ノート:

Pythonを実行する場所にOracle Clientライブラリがインストールされている必要があります。また、Pythonコードでoracledb.init_oracle_client()をコールする必要があります。

Thickモードでは、ウォレットzipファイルの次の3つのファイルが必要です:

  • tnsnames.ora: アプリケーション接続文字列に使用されるネット・サービス名を含み、その文字列をデータベース・サービスにマップします。

  • sqlnet.ora: SQL*Netクライアント側の構成を指定します。

  • cwallet.sso: 自動オープンSSOウォレットが含まれます。

Thickモードで接続するには:

  1. システムにファイルtnsnames.orasqlnet.oraおよびcwallet.ssoを配置します。

    次の2つのオプションのいずれかを使用して、これらのファイルをシステムに配置します。

    • Instant Clientを使用している場合は、ファイルをInstant Clientディレクトリ下のnetwork/adminサブディレクトリ階層に移動します。たとえば、アーキテクチャやクライアント・システム、Instant Clientをインストールした場所に応じて、ファイルを次のようなディレクトリの場所に配置する必要があります:

      /home/myuser/instantclient_19_21/network/admin

      または

      /usr/lib/oracle/19.21/client64/lib/network/admin

      たとえば、Linuxで完全なOracle Clientを使用している場合は、ファイルを$ORACLE_HOME/network/adminに移動します。

    • または、ファイルをアクセス可能な任意のディレクトリに移動します。

      たとえば、Linuxでは、ファイルを/opt/OracleCloud/MYDBディレクトリに移動し、sqlnet.oraを編集して、ウォレットの場所のディレクトリをcwallet.ssoファイルを含むディレクトリに変更します。

      たとえば、Linuxでは、次のようにsqlnet.oraを編集します:

      WALLET_LOCATION = (SOURCE = (METHOD=file) (METHOD_DATA = (DIRECTORY="/opt/OracleCloud/MYDB")))
      SSL_SERVER_DN_MATCH=yes

      構成ファイルがデフォルトの場所にない場合、アプリケーションは、コールoracledb.init_oracle_client()config_dirパラメータを使用して、またはTNS_ADMIN環境変数を設定することによって、構成ファイルがどこにあるかを示す必要があります。

      ノート:

      network/adminディレクトリにすべての構成ファイルを配置する場合、これらの設定はどちらも必要なく、sqlnet.oraを編集する必要はありません。
  2. Pythonアプリケーションで、Autonomous Databaseインスタンスに接続するために次の初期化パラメータおよび接続パラメータを設定します:
    • config_dir: 構成ファイルを配置するときの構成ディレクトリを指定します。これは、構成ファイルがインスタント・クライアント構成ディレクトリnetwork/adminの外部のディレクトリに配置されている場合にのみ必要です。
    • dsn: tnsnames.oraファイルから目的のネットワーク別名を指定します。
    • password: データベース・ユーザー・パスワードを指定します。
    • user: データベース・ユーザーを指定します。

    構成ファイルを配置する最初のケースでは、tnsnames.oraから目的のネットワーク別名にdsnパラメータを設定して、データベース資格証明を使用してAutonomous Databaseインスタンスに接続します。

    たとえば、oracledb.init_oracle_clientを使用してADMINユーザーとして接続し、db2024_lowネットワーク・サービス名(サービス名はtnsnames.ora)で接続するには:

    oracledb.init_oracle_client()
       connection=oracledb.connect(
           user="admin",
           password=password,
           dsn="db2024_low")

    構成ファイルがインスタント・クライアント構成ディレクトリの外部のディレクトリにある場合は、oracledb.init_oracle_clientをコールするときにconfig_dirパラメータを設定します。

    たとえば、Linuxでは、db2024_lowネットワーク・サービス名を使用してADMINユーザーとして接続します:

    oracledb.init_oracle_client(config_dir="/opt/OracleCloud/MYDB")
       connection=oracledb.connect(
          user="admin",
          password=password,
          dsn="db2024_low")

    たとえば、Windowsでは、db2024_lowネットワーク・サービス名を使用してADMINユーザーとして接続します:

    oracledb.init_oracle_client(config_dir=r"C:\opt\OracleCloud\MYDB")
       connection=oracledb.connect(
          user="admin",
          password=password,
          dsn="db2024_low")

    'raw'文字列r"..."の使用は、バックスラッシュがディレクトリ・セパレータとして扱われることを意味します。

ファイアウォールの背後にある場合は、接続記述子でHTTPS_PROXYを使用するか、接続属性を設定することで、プロキシを介してTLS/SSL接続をトンネリングできます。成功した接続は、特定のプロキシ構成によって異なります。Oracleでは、パフォーマンスへの影響が考えられるため、本番環境でのプロキシの使用はお薦めしません。詳細は、『Oracle Database 19cデータベース・ネット・サービス・リファレンス』のHTTPS_PROXYまたは『Oracle Database 23aiデータベース・ネット・サービス・リファレンス』を参照してください。

Thickモードでは、sqlnet.oraファイルを編集して行を追加することで、プロキシを指定できます:

SQLNET.USE_HTTPS_PROXY=on

また、tnsnames.oraを編集し、使用する予定のサービス名の接続記述子アドレス・リストにHTTPS_PROXYプロキシ名およびHTTPS_PROXY_PORTポートを追加します。

たとえば次のようにします。

mydb_high=(description=
(address=(https_proxy=myproxy.example.com)
(https_proxy_port=80)
(protocol=tcps)(port=1522)(host=...)

Thickモードの詳細は、python-oracledbのThickモードの有効化を参照してください。