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 の使用は非推奨になりました。
バージョン 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 などを設定する必要があります。
- インスタンス・オーナーとしてデータベース・サーバーにログインします。
- 鍵ストアを作成します。
注: 鍵ストアを pkcs12 形式で作成する場合 -keydb -create に -type pkcs12 オプションを付加してください。また、鍵ストア・ファイルの拡張子も kdb でなく p12 にしてください。
-keydb -create で -stash を指定すると、パスワードの入力を省略できるスタッシュ・ファイル (*.sth) が作成されます。gsk8capicmd_64 -keydb -create -db $HOME/server.kdb -pw "myServerPassw0rdpw0" -stash
- 鍵ストアに証明書を格納します。
- (自己署名証明書を使用する場合)
- 鍵ストアに自己証明書を作成します。
注: 自己証明書の有効期限はデフォルトで 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 署名証明書を使用する場合)
- 公開鍵、秘密鍵と証明書要求を作成します。
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
- 作成された証明書要求 (signedcert.csr) をセキュリティ・チームまたは証明局に送り、証明書を受けとります。
ここではルート証明書 ca_root.cer と証明書要求に対する署名つき証明書 signed_cert.cer を受け取ったと仮定します。 - 鍵ストアにルート証明書を追加し、署名された証明書を受信します。
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
- 公開鍵、秘密鍵と証明書要求を作成します。
- (自己署名証明書を使用する場合)
- クライアントに配布する証明書をファイルに抽出します。
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 インスタンスを構成します。
- インスタンス・オーナーとしてデータベース・サーバーにログインします。
- データベース・マネージャー構成を変更します。
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 などの行を記述しておく必要があります。ポート番号は該当ホストで使用されていない任意の番号を指定できます。 -
構成を反映させるため、インスタンスを再起動します。
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: APAR IT31205 のため、Db2 11.1 でこの手法による接続は SQL10013N "GSKit Error: 202" で失敗します。
注2: Db2 11.5.6 以降、コマンド行プロセッサーのような組み込み SQL アプリケーションも Simplified SSL をサポートします。
- サーバーの証明書 (上の例では db2srv.arm) をバイナリー・モードで転送します。
- 以下のようなデーター・サーバー・ドライバー構成ファイル (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>
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 のフルパス>"
- 接続をテストします。
db2cli validate -dsn SAMPLE -connect -user <server_user_name> -passwd <password>
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 が使用できない場合
クライアントの数が多い場合、3 の手順をサーバーで実行し、作成された client* を各クライアントに配布すると作業を簡略化できます。
クライアントの数が多い場合、3 の手順をサーバーで実行し、作成された client* を各クライアントに配布すると作業を簡略化できます。
- インスタンス・オーナー (UNIX/Linux) または管理者 (Windows) でクライアントにログインします。
- サーバーの証明書 (上の例では db2srv.arm) をバイナリー・モードで転送します。
- 鍵ストアを作成し、サーバーの証明書を追加します。
gsk8capicmd_64 -keydb -create -db "client.kdb" -pw "myClientPassw0rdpw0" -stash gsk8capicmd_64 -cert -add -db "client.kdb" -stashed -label "db2srv" -file "db2srv.arm" -fips
- クライアントのデータベース・マネージャー構成を更新します。
db2 update dbm cfg using SSL_CLNT_KEYDB $HOME/client.kdb db2 update dbm cfg using SSL_CLNT_STASH $HOME/client.sth
- データベースを security SSL オプションつきでカタログします。
db2 catalog tcpip node SSLHOST remote db2srv.example.com server 50001 security SSL db2 catalog db SAMPLE at node SSLHOST
- 接続をテストします。
db2 connect to sample user <server_user_name>
[SSL/TLS サポートの構成 (Java クライアント)]
Java クライアントは keytool で鍵ストアと証明書を管理できます。
Db2 に付属の Java に含まれる keytool を使う場合、「運用上の考慮点」を参照して Java の PATH を設定する必要があります。
Java クライアントは keytool で鍵ストアと証明書を管理できます。
Db2 に付属の Java に含まれる keytool を使う場合、「運用上の考慮点」を参照して Java の PATH を設定する必要があります。
- Java クライアントにログインします。
- サーバーの証明書 (上の例では db2srv.arm) をバイナリー・モードで転送します。
- 鍵ストアを作成し、証明書をインポートします。
keytool -import -trustcacerts -alias db2srv -file db2srv.arm -keystore dbclient.jks
注:鍵ストア (上の例では dbclient.jks) が存在しない場合は作成されます。このとき鍵ストアの初期パスワード設定が要求されます。
注:インポートする証明書 (上の例では db2srv.arm) を信用するか聞かれるので y を入力します。 - 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>
// 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
Linuxexport LD_LIBRARY_PATH=$HOME/sqllib/lib64/gskit:$LIBPATH export PATH=$HOME/sqllib/gskit/bin:$PATH
Windowsset 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
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 の設定を変更する必要があります。
[{"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"}],"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"}]
Was this topic helpful?
Document Information
Modified date:
21 December 2023
UID
swg21623694