IBM Support

[Db2] SSL によってクライアント/サーバー間の通信を暗号化する方法

Question & Answer


Question

Db2 クライアント/サーバー間の通信を SSL/TLS で暗号化する方法を教えてください。
 
注:便宜的に SSL という用語を使用していますが、Db2 が通信の暗号化に使用するプロトコルは TLS 1.0, 1.1, 1.2 および 1.3 (Db2 11.5.8 以降) です。ただし、TLS 1.0, 1.1 は非推奨であり将来のバージョンでサポートされない可能性があります。
バージョン 11.5 で非推奨になった機能
> Transport Layer Security (TLS) プロトコルのバージョン 1.0 と 1.1 の使用は非推奨になりました。

Answer

Db2 は同梱されている GSkit および Java JSSE を使って、サーバーとクライアント間の通信を TLS で暗号化できます。
以下に Db2 サーバーとクライアントの TLS 構成例を示します。詳細はマニュアルの Db2 の TLS 構成 を参照してください。
なお、この文書では例としてデータベース・サーバーのホスト名を db2srv.example.com、SSL ポート番号を 50001、接続先データベース名を SAMPLE として記述しています。

[SSL/TLS サポートの構成 (データベース・サーバー)]
 
データベース・サーバーで GSkit の gsk8capicmd コマンドを使用して鍵ストアを作成し、ここに証明書を作成します。gsk8capicmd コマンドの実行前に「運用上の考慮点」を参照して PATH などを設定する必要があります。
  1. インスタンス・オーナーとしてデータベース・サーバーにログインします。
  2. 鍵ストアを作成します。
    注: 鍵ストアを pkcs12 形式で作成する場合 -keydb -create に -type pkcs12 オプションを付加してください。また、鍵ストア・ファイルの拡張子も kdb でなく p12 にしてください。
    -keydb -create で -stash を指定すると、パスワードの入力を省略できるスタッシュ・ファイル (*.sth) が作成されます。

    gsk8capicmd_64 -keydb -create -db $HOME/server.kdb -pw "myServerPassw0rdpw0" -stash
  3. 鍵ストアに証明書を格納します。
    • (自己署名証明書を使用する場合)
      1. 鍵ストアに自己証明書を作成します。
        注: 自己証明書の有効期限はデフォルトで 365日です。期限を指定する場合は -expire オプションで日数を指定してください。

        gsk8capicmd_64 -cert -create -db $HOME/server.kdb -stashed -label "myselfsigned" -dn "CN=db2srv.example.com,O=example,ST=Tokyo,C=JP"
        
    • (CA 署名証明書を使用する場合) 
      1. 公開鍵、秘密鍵と証明書要求を作成します。

        gsk8capicmd_64 -certreq -create -db $HOME/server.kdb -stashed -label "signedcert" -dn "CN=db2srv.example.com,O=example,ST=Tokyo,C=JP" -target "signedcert.csr" -size 2048 -sigalg SHA256_WITH_RSA
      2. 作成された証明書要求 (signedcert.csr) をセキュリティ・チームまたは証明局に送り、証明書を受けとります。
        ここではルート証明書 ca_root.cer と証明書要求に対する署名つき証明書 signed_cert.cer を受け取ったと仮定します。
      3. 鍵ストアにルート証明書を追加し、署名された証明書を受信します。

        gsk8capicmd_64 -cert -add -db $HOME/server.kdb -stashed -file ca_root.cer -label "CA_root" -format ascii
        gsk8capicmd_64 -cert -receive -db $HOME/server.kdb -stashed -file signed_cert.cer

        中間証明書も受け取った場合、ルート証明書 -> 中間証明書の順に追加してから署名された証明書を受信します。

  4. クライアントに配布する証明書をファイルに抽出します。

    gsk8capicmd_64 -cert -extract -db $HOME/server.kdb -stashed -label "myselfsigned" -target $HOME/db2srv.arm -format ascii -fips

    または

    gsk8capicmd_64 -cert -extract -db $HOME/server.kdb -stashed -label "signedcert" -target $HOME/db2srv.arm -format ascii -fips
作成した鍵ストアと証明書を使用するよう Db2 インスタンスを構成します。
  1. インスタンス・オーナーとしてデータベース・サーバーにログインします。
  2. データベース・マネージャー構成を変更します。

    db2 update dbm cfg using SSL_SVR_KEYDB $HOME/server.kdb
    db2 update dbm cfg using SSL_SVR_STASH $HOME/server.sth
    
    db2 update dbm cfg using SSL_SVR_LABEL myselfsigned
    または
    db2 update dbm cfg using SSL_SVR_LABEL signedcert
    
    db2 update dbm cfg using SSL_VERSIONS TLSv12
    db2 update dbm cfg using SSL_SVCENAME db2s_db2inst1
    db2set DB2COMM=SSL,TCPIP
    
    注1:SSL_SVR_KEYDB、SSL_SVR_STASH、SSL_SVR_LABEL は gsk8capicmd で作成したものを指定します。
    注2:SSL_SVCENAME にサービス名を指定する場合、/etc/services に db2s_db2inst1 50001/tcp などの行を記述しておく必要があります。ポート番号は該当ホストで使用されていない任意の番号を指定できます。
  3. 構成を反映させるため、インスタンスを再起動します。

    db2stop force
    db2start
     
[SSL/TLS サポートの構成 (non-Java クライアント)]
 
a) Simplified SSL (Db2 10.5 FP5 以降)
注1: APAR IT31205 のため、Db2 11.1 でこの手法による接続は SQL10013N "GSKit Error: 202" で失敗します。
注2: Db2 11.5.6 以降、コマンド行プロセッサーのような組み込み SQL アプリケーションも Simplified SSL をサポートします。
  1. サーバーの証明書 (上の例では db2srv.arm) をバイナリー・モードで転送します。
  2. 以下のようなデーター・サーバー・ドライバー構成ファイル (db2dsdriver.cfg) を作成します。
    (db2dsdriver.cfg のデフォルト・ロケーションは sqllib/cfg です。)

    <?xml version="1.0" encoding="UTF-8" standalone="no" ?>
    <configuration>
      <databases>
        <database host="db2srv.example.com" name="SAMPLE" port="50001">
          <parameter name="SecurityTransportMode" value="SSL"/>
          <parameter name="SSLServerCertificate" value="<db2srv.arm のフルパス>"/>
        </database>
      </databases>
    
      <dsncollection>
        <dsn alias="SAMPLE" host="db2srv.example.com" name="SAMPLE" port="50001"/>
      </dsncollection>
    </configuration>
    

    上のような db2dsdriver.cfg は以下のコマンドで作成できます。

    db2cli writecfg add -database SAMPLE -host db2srv.example.com -port 50001
    db2cli writecfg add -dsn SAMPLE -database SAMPLE -host db2srv.example.com -port 50001
    db2cli writecfg add -database SAMPLE -host db2srv.example.com -port 50001 -parameter "SecurityTransportMode=SSL" 
    db2cli writecfg add -database SAMPLE -host db2srv.example.com -port 50001 -parameter "SSLServerCertificate=<db2srv.arm のフルパス>" 
  3. 接続をテストします。

    db2cli validate -dsn SAMPLE -connect -user <server_user_name> -passwd <password>

    注:Db2 11.5.6 以降はコマンド行プロセッサー (CLP) でもテストできます。

    db2 connect to SAMPLE user <server_user_name>
    11.5.5 以前の CLP による接続は SQL30081N Communication function detecting the error: "sqlccSSLSocketSetup". Protocol specific error code(s): "414" で失敗します。
     
b) 従来の SSL (Db2 10.5 FP4 以前、または Simplified SSL が使用できない場合
  • 1 から 2 の手順はサーバーで実行し、作成された client* を各クライアントに配布します。
  • SaaS などでサーバーの GSkit が利用できない場合、パスポート・アドバンテージから Db2 Support Files for SSL Functionality をダウンロードしてインストール後に gsk8capicmd を利用できます。
  1. インスタンス・オーナー (UNIX/Linux) または管理者 (Windows) でサーバーにログインします。
  2. 鍵ストアを作成し、サーバー証明書を追加します。

    gsk8capicmd_64 -keydb -create -db "client.kdb" -pw "myClientPassw0rdpw0" -stash
    gsk8capicmd_64 -cert -add -db "client.kdb" -stashed -label "db2srv" -file "db2srv.arm" -fips
  3. 作成した client* をクライアントに転送します。

クライアントで db2dsdriver.cfg を使っている場合と、データベース・カタログを使っている場合で構成方法が異なります。
なお、Db2 11.5.6 以降、db2dsdriver.cfg のみでコマンド行プロセッサーのような組み込み SQL からも接続可能です。

  1. db2dsdriver.cfg を利用して接続する場合
    1. クライアントにログインし、db2cli コマンドで db2dsdriver.cfg を構成します。

      db2cli writecfg add -database SAMPLE -host db2srv.example.com -port 50001
      db2cli writecfg add -database SAMPLE -host db2srv.example.com -port 50001 -parameter "SecurityTransportMode=SSL"
      db2cli writecfg add -database SAMPLE -host db2srv.example.com -port 50001 -parameter "SSLClientKeystoredb=<client.kdbのパス>"
      db2cli writecfg add -database SAMPLE -host db2srv.example.com -port 50001 -parameter "SSLClientKeystash=<client.sthのパス>"
      db2cli writecfg add -dsn SAMPLE -database SAMPLE -host db2srv.example.com -port 50001
    2. 接続をテストします。

      db2cli validate -dsn SAMPLE -connect -user <username> -passwd <password>
  2. データベース・カタログを利用して接続する場合
    1. クライアントにインスタンス・オーナーまたは管理者としてログインしデータベース・マネージャー構成を更新します。

      db2 update dbm cfg using SSL_CLNT_KEYDB <client.kdbのパス>
      db2 update dbm cfg using SSL_CLNT_STASH <client.sthのパス>
    2. データベースを security SSL オプションつきでカタログします。

      db2 catalog tcpip node SSLHOST remote db2srv.example.com server 50001 security SSL
      db2 catalog db SAMPLE at node SSLHOST
    3. 接続をテストします。

      db2 connect to sample user <username>
       
[SSL/TLS サポートの構成 (Java クライアント)]
Java クライアントは keytool で鍵ストアと証明書を管理できます。
Db2 に付属の Java に含まれる keytool を使う場合、「運用上の考慮点」を参照して Java の PATH を設定する必要があります。
  1. Java クライアントにログインします。
  2. サーバーの証明書 (上の例では db2srv.arm) をバイナリー・モードで転送します。
  3. 鍵ストアを作成し、証明書をインポートします。

    keytool -import -trustcacerts -alias db2srv -file db2srv.arm -keystore dbclient.jks
    注:鍵ストア (上の例では dbclient.jks) が存在しない場合は作成されます。このとき鍵ストアの初期パスワード設定が要求されます。
    注:インポートする証明書 (上の例では db2srv.arm) を信用するか聞かれるので y を入力します。
  4. DB2Jcc ユーティリティーで接続をテストします。環境変数 CLASSPATH に db2jcc.jar または db2jcc4.jar が含まれている必要があります。

    java -Ddb2.jcc.sslConnection=true -Ddb2.jcc.sslTrustStoreLocation=<鍵ストア (dbclient.jks) のフルパス> com.ibm.db2.jcc.DB2Jcc -url jdbc:db2://db2srv.example.com:50001/sample -user <server_user_name> -password <password>

    Java アプリケーションのソース・コードからは以下のようなオプションで TLS 接続を指定できます。

    // create data source
    com.ibm.db2.jcc.DB2SimpleDataSource ds =
        new com.ibm.db2.jcc.DB2SimpleDataSource();
    
    // set connection properties
    ds.setServerName("db2srv.example.com");
    ds.setPortNumber(50001);
    ds.setDatabaseName("sample");
    ds.setDriverType(4);
    ds.setSslConnection(true);
    ds.setSslTrustStoreLocation("<鍵ストア (dbclient.jks) のフルパス>");
    鍵ストアのパスは Java のシステム・プロパティ javax.net.ssl.trustStore でも指定できます。
    通常 java.security ファイルの編集は必要ありません。デフォルトのセキュリティ・プロバイダー構成が使用可能です。
     
運用上の考慮点
  • Db2 に付属の GSkit を使用する場合、gsk8capicmd_64 コマンドの実行前に以下の設定が必要です。

    AIX
    export LIBPATH=$HOME/sqllib/lib64/gskit:$LIBPATH
    export PATH=$HOME/sqllib/gskit/bin:$PATH
    Linux
    export LD_LIBRARY_PATH=$HOME/sqllib/lib64/gskit:$LIBPATH
    export PATH=$HOME/sqllib/gskit/bin:$PATH

    Windows

    set LIB="C:¥Program Files¥ibm¥gsk8¥lib";%LIB%
    set PATH="C:¥Program Files¥ibm¥gsk8¥bin";%PATH%
    
  • Db2 に付属の Java/JSSE を使用する場合、keytool コマンドの実行前に以下の設定が必要です。
    AIX/Linux (インスタンス・オーナーで実行する場合)

    export PATH=$HOME/sqllib/java/jdk64/bin:$PATH

    Windows (Db2 が C:\Program Files\IBM\SQLLIB にインストールされている場合)

    set %PATH%="C:\Program Files\IBM\SQLLIB\java\jdk\bin";%PATH%
  • openssl コマンドを使用できるクライアントからは、以下のようなコマンドで直接サーバーの証明書を入手できます。

    openssl s_client -servername db2srv.example.com -connect db2srv.example.com:50001 </dev/null 2>/dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > ./db2srv.arm
  • 各クライアントがデータベースへ TLS で接続しているかどうかは、対象データベースへ接続して MON_GET_CONNECTION 表関数で確認できます。

    db2 connect to <database_name>
    db2 "select application_id,client_protocol from table(mon_get_connection(null,-2))"
    
    APPLICATION_ID                 CLIENT_PROTOCOL
    ------------------------------ ---------------
    192.168.0.9.47518.220526065837 SSL4    
    
      1 record(s) selected.
    Db2 11.5.8 以降、mon_get_connection 表関数は CONNECT_SEC_TYPE (TLS レベル)、CONNECT_CIPHER_SPEC (証明書仕様)、SSL_SRV_CERT_LABEL (証明書ラベル) などの追加情報を提供します。
    Db2 11.5.8 新機能:セキュリティーの向上 
  • GSkit が作成する自己証明書の有効期限はデフォルトで 365 日です。失効前に新しい証明書を使用する必要があります。

    例:鍵ストアの証明書一覧と、指定した証明書の有効期限を確認する方法
    $ gsk8capicmd_64 -cert -list -db $HOME/server.kdb -stashed
    Certificates found
    * default, - personal, ! trusted, # secret key
    -       myselfsigned
    
    $ gsk8capicmd_64 -cert -details -db $HOME/server.kdb -stashed -label "myselfsigned"
    Label : myselfsigned
    Key Size : 2048
    Version : X509 V3
    Serial : 78745cffd54be128
    Issuer : "CN=db2srv.example.com,O=example,ST=Tokyo,C=JP"
    Subject : "CN=db2srv.example.com,O=example,ST=Tokyo,C=JP"
    Not Before : May 24, 2022 11:45:24 PM JST
    Not After : May 25, 2023 11:45:24 PM JST  // この日付時刻まで有効です。
  • TLS に使用する証明書は CMS 形式 (*.kdb) または PKCS12 形式 (*.p12) の鍵ストアを利用できます。 Db2 ネイティブ暗号化と鍵ストアを共用する場合、PKCS12 形式を使用する必要があるため、既存の鍵ストアが CMS 形式の場合は以下のようなコマンドで PKCS12 形式に変換できます。

    gsk8capicmd_64 -keydb -convert -db $HOME/server.kdb -pw myServerPassw0rdpw0 -old_format kdb -new_db $HOME/dbserver.p12 -new_pw myServerPassw0rdpw0 -new_format p12 -stash
    鍵ストアの名前を変更した場合、SSL_SVR_KEYDB および SSL_SVR_STASH の設定を変更する必要があります。
     
  • 非 Java Db2 クライアントは複数の証明局の Root 証明書を添付しており、鍵ストアを作成しなくてもこれらの証明局の証明書チェーンの証明書を信頼できます。詳細はマニュアルを参照してください。
    Db2 11.5 Security CLI/ODBC and IBM data server driver configuration keyword
    Db2 12.1 Security CLI/ODBC and IBM data server driver configuration keyword
    このため、たとば 11.5.9 CSB 69673 以降および 12.1.0 の非 Java アプリケーションは DigiCert G1 および G5 Root CA の証明書チェーンを、鍵ストアの設定なしに使用可能です。

[{"Type":"MASTER","Line of Business":{"code":"LOB10","label":"Data and AI"},"Business Unit":{"code":"BU058","label":"IBM Infrastructure w\/TPS"},"Product":{"code":"SSEPGG","label":"Db2 for Linux, UNIX and Windows"},"ARM Category":[{"code":"a8m500000008Pl7AAE","label":"Connectivity-\u003ETCP\/IP"},{"code":"a8m500000008PmnAAE","label":"Security and Plug-Ins-\u003EEncryption"}],"ARM Case Number":"","Platform":[{"code":"PF002","label":"AIX"},{"code":"PF010","label":"HP-UX"},{"code":"PF016","label":"Linux"},{"code":"PF027","label":"Solaris"},{"code":"PF033","label":"Windows"}],"Version":"10.1.0;10.5.0;11.1.0;11.5.0;12.1.0"}]

Document Information

Modified date:
30 April 2025

UID

swg21623694