1つのDb2インスタンスに業務用と検証用のデータベースが同居している。片方だけ別のSSL証明書にしたい。この要望はできる部分とできない部分が混ざっています。
設定するパラメーターがDBM CFGにあるかDB CFGにあるかを見れば判断できそうに思えますが、それだけでは足りません。通信の種類によって可否が逆向きになります。
まず見る(結論)
サーバーが提示する証明書はインスタンスに1枚で固定、クライアントが提示する証明書はDB毎に変えられる。この2つを混同すると、いくら設定を探しても見つかりません。
# サーバー証明書はインスタンス単位(DBM CFG)
db2 get dbm cfg | grep -i ssl
# DB CFG にある SSL はクライアント接続用ではなく HADR 用
db2 get db cfg for SAMPLE | grep -i ssl
症状 → 原因 → 対処(逆引き)
| やりたいこと | 可否と理由 | 実際に触る場所 |
|---|---|---|
| DB毎にサーバーが返す証明書を変える | 不可。証明書はインスタンスに1枚(SSL_SVR_LABEL) |
分けたいならインスタンスを分ける |
| DB毎にSSLポートを分けて証明書を変える | 不可。SSL_SVCENAME は単一値でカンマ区切り不可(SQL0104N) |
同上 |
| DB毎にクライアントが提示する証明書を変える | 可。接続前にDB名が分かっているため | db2dsdriver.cfg の <database> 要素ごとに SSLClientLabel |
| CLPや埋め込みSQLでDB毎に分ける | 不可。db2dsdriver.cfg を読まない |
SSL_CLNT_KEYDB(DBM CFG)=クライアントインスタンス単位 |
| HADRのレプリケーション通信でDB毎に分ける | 可。HADR_SSL_LABEL がDB CFGにある |
鍵ストアはインスタンス単位のまま、ラベルだけDB毎に選ぶ |
分かれ目は設定ファイルの場所ではなく順序です。TLSハンドシェイクでサーバーが証明書を出す時点で、接続はまだDRDAに入っておらず、どのデータベースに繋ぎに来たのかがサーバーに伝わっていません。DRDAにはHTTPSのSNIに相当する仕組みもないので、証明書を選ぶ材料がありません。クライアント側とHADRは接続先が先に確定しているので選べます。
クライアントに配るのはトラストストアに入れる公開証明書で、秘密鍵を含みません。同一インスタンスの全DBが同じ証明書を返す以上、DB毎に書き出しても中身は同一のバイト列になり、ファイル名が変わるだけです。「アプリAをDB Bに繋がせたくない」が本当の要件なら、それは GRANT / REVOKE と権限設計で作るもので、証明書では実現できません。
設定したのに効かないときの最短確認
db2dsdriver.cfg はパラメーター名を間違えてもXMLとしては妥当なので、黙って無視されます。綴りは db2cli validate で機械的に判定できます。
db2cli validate -dsn DSNSAMP
認識された語は大文字化されて Keywords の表に並び、不明な語だけが **UNKNOWN** と表示されます。正しい綴りは SecurityTransportMode / SSLClientKeystoredb / SSLClientKeystash / SSLClientLabel の4つです(大文字小文字は無視されます)。
HADR側は逆に、鍵ストアに存在しないラベルを書いても DB20000I が返ります。設定時に鍵ストアを見に行かないため、綴り間違いはHADRを開始するまで表に出ません。
実機で確かめた結果と、判断を間違えやすい点
DB CFGに書こうとしたときのメッセージ、2つのDBに同じ証明書が返ることのフィンガープリント比較、db2dsdriver.cfg をDB毎に分けた実際の設定と db2cli validate の出力は、Zennのフル記事に載せています。AUTHENTICATION CERTIFICATE が12.1.4に存在しない話と、SQL0104N の Expected tokens を有効値の一覧として読むと誤る話も同記事にあります。
関連: Db2にSSLで接続できない ― SQL30081Nの原因を切り分ける逆引き / SQL30081N 通信エラーを切り分ける
構築と同時に満たすべきDb2のセキュリティ設計(認証・暗号化・権限)を、現場の経験談を交えて本書 第3章「セキュリティ設計の基本と実装」で解説しています。
現場で引ける Db2 の教科書
現場で引ける!Db2実践エンジニア・バイブル
Db2はRDBMS市場でシェア数%。情報が少なく、頼れるのは膨大な公式マニュアルだけ―― そんな現状を変えたくて、「なぜこの値にするのか」「この障害のとき次に何を見るのか」という、マニュアルに載っていない現場の文脈を1冊にまとめました。書いてあることはすべて実際の現場で経験したことです。
アーキテクチャ/構成パラメーター選定/セキュリティ/バックアップ・リカバリ/HADR/pureScale/日常点検の自動化/メモリ・ロック競合/SQLチューニング/RUNSTATS・REORG/MON_GET監視/現場の難題集 ―― 全12章+運用シェルスクリプト集。