mTLS를 사용하여 Python 응용 프로그램 연결

적용 대상: 적용 가능 Exadata Cloud@Customer만 해당

mTLS를 사용하여 Autonomous Database 인스턴스에 Python 애플리케이션을 연결할 수 있습니다.

mTLS를 사용하여 Python 응용 프로그램을 연결하면 인증 및 암호화를 위한 향상된 보안이 제공되며, 클라이언트 자격 증명을 사용하여 보안이 적용됩니다(사용자 이름과 암호 제공).

python-oracledb 드라이버의 기본 "Thin 모드"는 Oracle Database에 직접 연결됩니다. 드라이버는 일부 추가 기능을 위해 선택적으로 Oracle Client 라이브러리 "Thick 모드"를 사용할 수 있습니다. Oracle Client 라이브러리는 Oracle Instant Client, 전체 Oracle Client 또는 Oracle Database 설치 라이브러리일 수 있습니다.

다음 단계에 따라 mTLS를 사용하여 Python 애플리케이션을 Autonomous Database 인스턴스에 연결합니다.

  1. Python 및 python-oracledb 드라이버 설치
  2. 보안 인증서 획득(Oracle Wallet) 및 네트워크 연결 활성화
  3. Thin 모드로만 접속하려는 경우 이 단계를 수행합니다. python-oracledb Thin Mode(mTLS)로 Python 애플리케이션 실행
  4. Thick 모드로 연결하려면 다음 단계를 수행하십시오. Run Python Application with python-oracledb Thick Mode (mTLS)

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를 실행하면 소스 패키지가 대신 다운로드됩니다. 소스가 컴파일되고 결과 이진이 설치됩니다.

    추가 옵션 및 팁은 Installing python-oracledb를 참조하십시오.

  3. Thick 모드에서 python-oracledb 드라이버를 사용하려면 Oracle Client 소프트웨어를 설치합니다.

    기본적으로 python-oracledb는 Oracle Database에 직접 연결되는 Thin 모드에서 실행됩니다. Thin 모드에는 Oracle Client 라이브러리가 필요하지 않습니다. 그러나 일부 추가 기능은 python-oracledb가 Thick 모드에서 실행될 때 사용할 수 있습니다.

    주:

    python-oracledb Thin 및 Thick 모드의 지원되는 기능에 대한 자세한 내용은 python-oracledb에서 지원하는 Oracle Database 기능을 참조하십시오. 이 링크에 표시된 일부 기능은 Autonomous Database에서 사용할 수 없습니다.

    Python-oracledb는 Oracle Instant 클라이언트 라이브러리 또는 Oracle Database 클라이언트 라이브러리를 사용하고 Python 코드에서 oracledb.init_oracle_client()를 호출할 때 Thick 모드를 사용합니다.

    Oracle 클라이언트 소프트웨어를 설치할 때 다음과 같이 mTLS 및 TLS 연결에 필요한 최소 버전에 차이가 있습니다.

    • 상호 TLS(mutual TLS) 연결:

      • 데이터베이스가 원격 컴퓨터에 있는 경우 운영 체제 아키텍처에 맞는 무료 Oracle Instant Client "Basic" 또는 "Basic Light" 패키지를 다운로드합니다. 지원되는 버전 Oracle Instant Client: 18.19 이상, 19.2 이상 또는 21(기본 릴리스 이상)을 사용합니다.

      • 또는 Full Oracle Database 클라이언트 라이브러리가 시스템에서 사용 가능한 경우(Full 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(또는 그 이상) - 모든 플랫폼
      • 또는 Full Oracle Database Client 19.14(또는 그 이상) 및 21.5(또는 그 이상)를 포함하여 시스템에서 Full Oracle Database 클라이언트 라이브러리를 사용할 수 있는 경우 사용할 수 있습니다.

보안 인증서 획득(Oracle Wallet) 및 네트워크 연결 활성화

클라이언트 보안 인증서를 획득하여 Autonomous Database 인스턴스에 접속합니다.

  1. Autonomous Database 인스턴스에서 전자 지갑 파일을 다운로드하여 Autonomous Database 인스턴스에 액세스하는 데 필요한 클라이언트 보안 인증서 및 네트워크 구성 설정이 포함된 zip 파일을 가져옵니다.

    클라이언트 보안 인증서(wallet.zip 파일)를 얻습니다.

    • ADMIN 사용자: Oracle Cloud Infrastructure 콘솔에서 데이터베이스 연결을 누릅니다. Download Client Credentials (Wallets)를 참조하십시오.

    • 기타 사용자(관리자가 아님): Autonomous Database 인스턴스에 대한 관리자로부터 Oracle Wallet을 받습니다.

    주:

    허용되지 않은 데이터베이스 액세스를 방지하기 위해 wallet.zip 파일 및 해당 내용을 보호합니다.
  2. 클라이언트 자격 증명 파일(wallet.zip)의 압축을 풉니다.

python-oracledb Thin Mode(mTLS)로 Python 애플리케이션 실행

기본적으로 python-oracledb는 Thin 모드를 사용하여 Autonomous Database 인스턴스에 직접 연결합니다.

Thin 모드에서는 전자 지갑 zip의 두 파일만 필요합니다.

  • tnsnames.ora: 응용 프로그램 연결 문자열에 사용되는 네트 서비스 이름을 데이터베이스 서비스에 매핑합니다.

  • ewallet.pem: 가상 모드에서 SSL/TLS 접속을 사용으로 설정합니다.

Thin 모드로 연결하려면 다음을 수행합니다.

  1. tnsnames.oraewallet.pem 파일을 시스템의 위치로 이동합니다.

    Linux의 예제:

    /opt/OracleCloud/MYDB

    예를 들면 다음과 같습니다.

    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에서는 oracledb.connectdb2024_low 네트워크 서비스 이름과 함께 사용하여 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)

    '원시' 문자열 r"..."를 사용하면 백슬래시가 디렉토리 구분자로 처리됩니다.

    이 예에 표시된 것처럼 wallet_locationconfig_dir는 동일한 디렉토리로 설정되고 디렉토리에는 tnsnames.oraewallet.pem가 포함됩니다. 이러한 파일에 대해 동일한 디렉토리를 지정할 필요는 없습니다.

방화벽 뒤에 있는 경우 연결 기술자에서 HTTPS_PROXY를 사용하거나 연결 속성을 설정하여 프록시를 통해 TLS/SSL 연결을 터널링할 수 있습니다. 성공한 연결은 특정 프록시 구성에 따라 다릅니다. Oracle은 성능에 영향을 줄 수 있으므로 운용 환경에서 프록시 사용을 권장하지 않습니다. 자세한 내용은 HTTPS_PROXY in Oracle Database 19c Database Net Services Reference 또는 Oracle Database 23ai Database Net Services Reference를 참조하십시오.

씬 모드에서는 https_proxyhttp_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 모드에서 실행됩니다. 추가 python-oracledb 기능은 드라이버가 Thick 모드에서 실행될 때 사용할 수 있습니다.

주:

굵은 모드에서는 Python을 실행하는 Oracle Client 라이브러리가 설치되어 있어야 합니다. 또한 Python 코드에서 oracledb.init_oracle_client()을 호출해야 합니다.

Thick 모드에서는 전자 지갑 zip 파일의 다음 세 파일이 필요합니다.

  • tnsnames.ora: 애플리케이션 접속 문자열에 사용되는 네트 서비스 이름을 포함하고 문자열을 데이터베이스 서비스에 매핑합니다.

  • sqlnet.ora: SQL*Net 클라이언트측 구성을 지정합니다.

  • cwallet.sso: 자동 열린 SSO 전자 지갑을 포함합니다.

Thick 모드로 연결하려면 다음을 수행합니다.

  1. tnsnames.ora, sqlnet.oracwallet.sso 파일을 시스템에 배치합니다.

    다음 두 가지 옵션 중 하나를 사용하여 시스템에 파일을 배치합니다.

    • 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: 데이터베이스 사용자를 지정합니다.

    구성 파일을 처음 배치하는 경우 dsn 매개변수를 tnsnames.ora에서 원하는 네트워크 별칭으로 설정하여 데이터베이스 인증서를 사용하여 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")

    '원시' 문자열 r"..."를 사용하면 백슬래시가 디렉토리 구분자로 처리됩니다.

방화벽 뒤에 있는 경우 연결 기술자에서 HTTPS_PROXY를 사용하거나 연결 속성을 설정하여 프록시를 통해 TLS/SSL 연결을 터널링할 수 있습니다. 성공한 연결은 특정 프록시 구성에 따라 다릅니다. Oracle은 성능에 영향을 줄 수 있으므로 운용 환경에서 프록시 사용을 권장하지 않습니다. 자세한 내용은 HTTPS_PROXY in Oracle Database 19c Database Net Services Reference 또는 Oracle Database 23ai Database Net Services Reference를 참조하십시오.

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 모드 사용을 참조하십시오.