Db2 V11.5 と Luna HSMの連携 - マスター鍵を直接HSM上に作成する

### Db2 V11.5 と Luna ハードウェア・セキュリティー・モジュール (HSM)の連携

# マスター鍵を直接HSM上に作成する

Luna ハードウェア・セキュリティー・モジュール (以降 単純に"HSM"と表記します)は、高度なセキュリティ機能を有する環境での鍵管理や暗号化などの処理を行う専用のハードウェアアプライアンス製品です。Db2は ネイティブ暗号化でマスター鍵 (MK) を保管する鍵ストアを、HSM をつかって構成することが可能です。

本手順書では　スタンドアローンのDb2 サーバーとHSMアプライアンス(SafeNet Network HSM 7)1台の構成で、Db2ネイティブ暗号化のマスター鍵をHSMに生成する方法を示します。 Db2  は AIX 7.2 上に　Db2 11.5 Db2 Advanced Edition  が導入されています。

本手順書は　前提記述している項目が完了している状態からガイドが始まります。HSM管理者が行う準備作業については、[Db2-HSM 連携の事前準備 (クライアント導入からパーティション作成初期化まで)](https://qiita.com/mi-shimo/private/bf0eb3769fd1c4f2adeb) をご参照ください。　

------------------------------

 本手順書はタレス社より提供いただきました "IBM Db2 Integration Guide" (Document Part Number: 007-013741-001, Rev. B Release Date: November 2018) をベースに Db2 V11.5での経験を加えたものです。ある特定の環境・使用状況においての正確性が確認されていますが、すべての環境において同様の結果が得られる保証はありません。
これらの技術を自身の環境に適用する際には、自己の責任において十分な検証と確認を実施いただくことをお奨めいたします。

---------------------------------------



## HSM ベースのマスター鍵作成方法

Db2 ネイティブ暗号化でHSMの使用を開始するためには、HSMにマスター鍵を作成・保管する必要があります。Db2 ネイティブ暗号化では次の方法でマスター鍵をHSMに準備することができます。

-  ローカル鍵ストアに保管されたマスター鍵をHSMへ移行する。
- 直接HSMにマスター鍵を作成する。

ここでは 直接HSMにマスター鍵を作成する方法を説明します。

## 構成と手順の概略

本手順書では　スタンドアローンのDb2 サーバーとHSMアプライアンス(SafeNet Network HSM 7)1台の構成で、Db2ネイティブ暗号化のマスター鍵をHSMに生成する方法を示します。


![image-HSM-Db2AESEStandalone1_KeyGen.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855502/2949b25e-2c55-6980-6b30-e612343fd77e.jpeg)


## 前提

### HSM固有の前提

ここではすでに HSM固有の次のような設定が終了していることが前提となります。

1. HSMアプライアンスの設置や初期化などが終了していること
2. HSMアプライアンス上にDb2用のパーティションが作成されていること
3. HSMクライアントが導入登録され、Db2用のパーティションがクライアントに割り当てられていること。　
4. 割り当てられているDb2用パーティションの初期化、 Crypto Officer , Crypto Userロールが初期化されていること。　

2-4.のHSM管理者が行う準備作業については、[Db2-HSM 連携の事前準備 (クライアント導入からパーティション作成初期化まで)](https://qiita.com/mi-shimo/private/bf0eb3769fd1c4f2adeb)  をご参照ください。　

以上の前提が満たされた結果、　`vtl verify` コマンドを実⾏して、 Luna HSM クライアントがHSMアプライアンス上のDb2用のパーティションを参照できることを確認します。

```
[root@psm02:/usr/safenet/lunaclient/bin]# ./vtl verify
vtl (64-bit) v10.2.0-111. Copyright (c) 2020 SafeNet. All rights reserved.


The following Luna SA Slots/Partitions were found:

Slot    Serial #                Label
====    ================        =====
		(省略)
   1       1431591540409        hsminst2

[root@psm02:/usr/safenet/lunaclient/bin]#

```

このケースではスロットラベルSlot Labelはhsminst2です。

### Db2の前提

Db2については、Db2が導入されDb2インスタンス が作成されていることが前提となります。　ここでは db2inst2というインスタンスを使用して HSM ベースのマスターキーを使用するDb2 ネイティブ暗号化を構成します。



## 必要な情報

このシナリオを実行するためには次のような情報が必要です。

|                                                              | 本資料で使用する値       |
| ------------------------------------------------------------ | ------------------------ |
| Luna HSM クライアント導入ディレクトリー  `<LunaClient installation dir>` | /usr/safenet/lunaclient/ |
| Db2用のパーティションを指すスロットラベル `Slot label`       | hsminst2                 |
| Crypto Officer のパスワード                                  | HSM4co!                  |
| Db2 instance                                                 | db2inst2                 |
| db2_instance_home                                            | /home/db2inst2           |

## 手順

### 手順1 : GSKitが導入構成済みであることを確認します。

まず Db2 ネイティブ暗号化を使用するために　GSKitが導入構成済みであることを確認します。

Db2の導入で GSkitが導入されます。　 GSkitのライブラリーは`<db2_instance_home>/sqllib/lib32/gskit` あるいは `<db2_instance_home>/sqllib/lib64/gskit` に存在します。

`<db2_instance_home>/sqllib/db2profile`を実行して　環境を設定しましょう。



### 手順2 : PKCK#11鍵ストア構成ファイルを作成します。

Db2 ネイティブ暗号化でPKCS #11 鍵ストアにマスター鍵を保管するためには、 PKCS #11 鍵ストアの詳細情報を含む構成ファイルを作成する必要があります。Db2 サーバーに次のような詳細情報を含む構成ファイル`luna.cfg`を作成します。

```
VERSION=1
PRODUCT_NAME=Luna
ALLOW_KEY_INSERT_WITHOUT_KEYSTORE_BACKUP=true
LIBRARY=<LunaClient installation dir>/lib/libCryptoki2_64.so
SLOT_LABEL=<Partition_label>
NEW_OBJECT_TYPE=PRIVATE
KEYSTORE_STASH=/home/<db2_instance>/sqllib/security/pkcs11_pw.sth
```

- `ALLOW_KEY_INSERT_WITHOUT_KEYSTORE_BACKUP`は`TRUE`を設定しておきます

- `LIBRARY`に指定する`<LunaClient installation dir>/lib/libCryptoki2_64.so`が存在することを確認しておきましょう。本検証環境で`<LunaClient installation dir>`は　`/usr/safenet/lunaclient/`です。

  ```
  [db2inst2@psm02:/home/db2inst2]$ ls /usr/safenet/lunaclient/lib/libCryptoki2_64.so
  /usr/safenet/lunaclient/lib/libCryptoki2_64.so
  [db2inst2@psm02:/home/db2inst2]$
  ```

- SLOT_LABEL でHSMのDb2用のパーティションを指すスロットを特定します。　

- KEYSTORE_STASHは絶対パスでstashファイルを指定します。stashファイルには PKCS #11 鍵ストアのパスワードが保持されます。Db2 インスタンスが PKCS #11 鍵ストアの認証のためにstashファイルを使用します。 stashファイルの作成は 手順3 で行います。

  


以上を考慮して　今回実際に作成した `luna.cfg` が次です。　

```
[db2inst2@psm02:/home/db2inst2]$ cat /home/db2inst2/sqllib/security/luna.cfg
VERSION=1
PRODUCT_NAME=Luna
ALLOW_KEY_INSERT_WITHOUT_KEYSTORE_BACKUP=true
LIBRARY=/usr/safenet/lunaclient/lib/libCryptoki2_64.so
SLOT_LABEL=hsminst2
NEW_OBJECT_TYPE=PRIVATE
KEYSTORE_STASH=/home/db2inst2/sqllib/security/pkcs11_pw.sth

[db2inst2@psm02:/home/db2inst2]$
```

### 手順3 : stash ファイルを作成します.

db2credmanを使用してstash ファイルを作成します.

参照 : [db2credman - 資格情報とセキュリティー鍵の管理のコマンド (db2 提供)](https://www.ibm.com/support/knowledgecenter/ja/SSEPGG_11.5.0/com.ibm.db2.luw.admin.cmd.doc/doc/r0070202.html)　

```
# 実行コマンド
db2credman -stash -password <partition password> -to /home/<db2_instance>/sqllib/security/pkcs11_pw.sth
```
ここで　`<partition password>` は　Crypto Officer のパスワードを使用します。　

```
#　実行例
[db2inst2@psm02:/home/db2inst2]$ db2credman -stash -password HSM4co! -to /home/db2inst2/sqllib/security/pkcs11_pw.sth
Password successfully stashed to /home/db2inst2/sqllib/security/pkcs11_pw.sth

db2credman completed sucessfully.
[db2inst2@psm02:/home/db2inst2]$

# 実行結果　次のようにstashファイルが作成されています
[db2inst2@psm02:/home/db2inst2]$ ls -l /home/db2inst2/sqllib/security/pkcs11_pw.sth
-rw-------    1 db2inst2 db2iadm1        176 Jun 03 06:14 /home/db2inst2/sqllib/security/pkcs11_pw.sth
[db2inst2@psm02:/home/db2inst2]$
```


注意 :  stashファイルにPKCS #11 鍵ストアのパスワードを保管することは　オプショナルです。　ユーザーがパスワードを保管しておきたい(stashしたい)と考える場合　stashファイルを作成し構成ファイルの`KEYSTORE_STASH`を指定する必要があります。



### 手順4 : Db2 インスタンスが PKCS #11鍵ストアを使用するように変更します。

 データベースマネージャー構成パラメターの `keystore_type` を`pkcs11` , `keystore_location`をPKCS #11 鍵ストア構成ファイル(`luna.cfg`)へ変更します。

```
# 変更前の確認
[db2inst2@psm02:/home/db2inst2]$ db2 get dbm cfg | grep KEYSTORE
 Keystore type                           (KEYSTORE_TYPE) = NONE
 Keystore location                   (KEYSTORE_LOCATION) =
[db2inst2@psm02:/home/db2inst2]$


# 変更コマンド例
db2 update dbm cfg using keystore_type pkcs11
db2 update dbm cfg using keystore_location /home/db2inst2/sqllib/security/luna.cfg

# db2 再起動 
db2stop ; db2start

# 変更を確認
[db2inst2@psm02:/home/db2inst2]$ db2 get dbm cfg | grep -i keystore
 Keystore type                           (KEYSTORE_TYPE) = PKCS11
 Keystore location                   (KEYSTORE_LOCATION) = /home/db2inst2/sqllib/security/luna.cfg
[db2inst2@psm02:/home/db2inst2]$
```



### 手順5 : 暗号化データベースを作成します。

暗号化データベースを作成するためには`CREATE DATABSE`コマンドに`ENCRYPT`オプションを付けて実行します。次は データベース名`MYENCDB`を`ENCRYPT`オプション付きで作成しています。

```
[db2inst2@psm02:/home/db2inst2]$ db2 create db MYENCDB encrypt
DB20000I  CREATE DATABASE コマンドが正常に完了しました。
[db2inst2@psm02:/home/db2inst2]$
```

作成されたデータベースMYENCDBを確認すると次のとおり`Encrypted database`(日本語メッセージの場合は`暗号化されたデータベース`)がYESとなっていることがわかります。

```
[db2inst2@psm02:/home/db2inst2]$ db2 get db cfg for MYENCDB | grep -i Encrypt
 Encryption Library for Backup                 (ENCRLIB) = libdb2encr.a
 Encryption Options for Backup                (ENCROPTS) = CIPHER=AES:MODE=CBC:KEY LENGTH=256
 Encrypted database                                      = YES
[db2inst2@psm02:/home/db2inst2]$

```

HSMクライアントの`lunacm`でHSMパーティションの内容を確認することができます。  role `Crypto Officer`で`partition contents`を使用します。

```
-- co (Crypto Officer) で Login
lunacm:>role login -name co


        enter password: *********


Command Result : No Error


lunacm:>partition contents

        The 'Crypto Officer' is currently logged in. Looking for objects
        accessible to the 'Crypto Officer'.

        Object list:

        Label:         DB2_SYSGEN_db2inst2_MYENCDB_2020-06-03-08.45.22_A878F39E
        Handle:        32
        Object Type:   Symmetric Key
        Object UID:    2f0000001b000001d0610900


        Number of objects:  1


Command Result : No Error


lunacm:>
```





   

### 手順6 : HSM上 のキーストアが稼働していることを確認しましょう

(1) データベースに接続します

```
# 実行コマンド
db2 connect to myencdb

# 実行例
[db2inst2@psm02:/2home/db2inst2]$ db2 connect to myencdb

   Database Connection Information

 Database server        = DB2/AIX64 11.5.0.0
 SQL authorization ID   = DB2INST2
 Local database alias   = MYENCDB

[db2inst2@psm02:/home/db2inst2]$
```

   

(2) データベースに表`STUDENT_MARKS` を作成します。

```
# 実行コマンド
db2 "CREATE TABLE STUDENT_MARKS (CLASS_NO CHAR(3) NOT NULL,DEPTNAME VARCHAR(36) NOT NULL,STUDNO CHAR(6) NOT NULL,MARKS CHAR(6) NOT NULL WITH DEFAULT)" 

# 実行例
[db2inst2@psm02:/home/db2inst2]$ PTNAME VARCHAR(36) NOT NULL,STUDNO CHAR(6) NOT NULL,MARKS CHAR(6) NOT NULL WITH DEFAULT)"                                 <
DB20000I  The SQL command completed successfully.
[db2inst2@psm02:/home/db2inst2]$   
```
   
(3) 表`STUDENT_MARKS` にレコードを挿入します。

```
# 実行コマンド
db2 "INSERT INTO STUDENT_MARKS VALUES (10,'SCIENCE',001,95)"
db2 "INSERT INTO STUDENT_MARKS VALUES (10,'COMMERCE',002,90)"

# 実行例
[db2inst2@psm02:/home/db2inst2]$ db2 "INSERT INTO STUDENT_MARKS VALUES (10,'SCIENCE',001,95)"
DB20000I  The SQL command completed successfully.
[db2inst2@psm02:/home/db2inst2]$ db2 "INSERT INTO STUDENT_MARKS VALUES (10,'COMMERCE',002,90)"
DB20000I  The SQL command completed successfully.
[db2inst2@psm02:/home/db2inst2]$
```

   

(4) 表`STUDENT_MARKS` のレコードを表示します。

```
# 実行コマンド
db2 "SELECT * FROM STUDENT_MARKS"

# 実行例
[db2inst2@psm02:/home/db2inst2]$ db2 "SELECT * FROM STUDENT_MARKS"

CLASS_NO DEPTNAME                             STUDNO MARKS
-------- ------------------------------------ ------ ------
10       SCIENCE                              1      95
10       COMMERCE                             2      90

  2 record(s) selected.

[db2inst2@psm02:/home/db2inst2]$
```

   

(5) データベースへの接続を解除し非活動化します。

```
# 実行コマンド
db2 connect reset 
db2 deactivate db MYIBM
```

   

(6) HSMアプライアンスの`lunash`で、ＮTLSサービスを停止します。

参照 : [service stop (LunaSH Command Reference Guide)](https://thalesdocs.com/gphsm/luna/7.4/docs/network/Content/lunash/commands/service/service_stop.htm)

```
# 実行コマンド　
service stop ntls

# 実行例　..  接続中のセッションがあるためWARNINGがでている。
[local_host] lunash:>service stop ntls

Checking for connected clients before stopping NTLS service:

WARNING !! There are 2 client(s) connected to this Luna SA
appliance.  It is recommended that you disconnect all clients
before stopping or restarting the NTLS service.

If you wish to proceed, type 'proceed', otherwise type 'quit'

> proceed
Proceeding...
Stopping ntls:                                             [  OK  ]

Command Result : 0 (Success)
[local_host] lunash:>
```

この後　データベースへ接続しようとするとエラーとなります。

```
# 実行コマンド
db2 connect to myencdb

# 実行例
[db2inst2@psm02:/home/db2inst2]$ db2 connect to myencdb
SQL1783N  The command or operation failed because an error was encountered
accessing the PKCS #11 key manager. Reason code "13".
[db2inst2@psm02:/home/db2inst2]$
```

   

(7) NTLSサービスを開始します。

```
[local_host] lunash:>service start ntls

Starting ntls:                                             [  OK  ]

Command Result : 0 (Success)
[local_host] lunash:>
```

NTLSサービスが再開した直後　データベースへ接続しようとすると次のようなエラーとなります。

```
[db2inst2@psm02:/home/db2inst2]$ db2 connect to myencdb
SQL1783N  The command or operation failed because an error was encountered
accessing the PKCS #11 key manager. Reason code "13".
[db2inst2@psm02:/home/db2inst2]$
```

NTLSサービスが停止するなどの障害後、Db2のサービスを開始するためにには、障害を解決した後、Db2の再起動が必要です。　

```
[db2inst2@psm02:/home/db2inst2]$ db2stop ; db2start
06/03/2020 09:17:33     0   0   SQL1064N  DB2STOP processing was successful.
SQL1064N  DB2STOP processing was successful.
06/03/2020 09:17:35     0   0   SQL1063N  DB2START processing was successful.
SQL1063N  DB2START processing was successful.
[db2inst2@psm02:/home/db2inst2]$ db2 connect to myencdb

   Database Connection Information

 Database server        = DB2/AIX64 11.5.0.0
 SQL authorization ID   = DB2INST2
 Local database alias   = MYENCDB

[db2inst2@psm02:/home/db2inst2]$   
```

   

## 検証環境情報

本手順書は次の環境で作成しました。

- LUNA NETWORK HSM A700
  - Software Version:        7.4.0-226
  - Firmware:              7.3.3
- Luna Client 環境
  - AIX V7.2　(oslevel –s : 7200-03-03-1914)
  - LunaClient_10.2.0-111_AIX610-000399-002_SW_Universal_Client_10.2_AIX_RevA.tar 
  - IBM Db2 Server 11.5 


## 参考文書

### Luna HSM 

-  [IBM Db2 Integration Guide" (Document Part Number: 007-013741-001, Rev. C Release Date: June 2020) ](https://cpl.thalesgroup.com/sites/default/files/content/integration_guides/field_document/2020-07/007-013741-001_IBM%20DB2_Integration%20Guide_RevC.pdf)
-  [Product Documentation](https://thalesdocs.com/gphsm/Content/luna/network/luna_network_releases.htm)
   -  [service stop (LunaSH Command Reference Guide)](https://thalesdocs.com/gphsm/luna/7.4/docs/network/Content/lunash/commands/service/service_stop.htm)



### Db2 ネイティブ暗号化

- [Db2 ネイティブ暗号化](https://www.ibm.com/support/knowledgecenter/ja/SSEPGG_11.5.0/com.ibm.db2.luw.admin.sec.doc/doc/c0061758.html)
- [Db2 ネイティブ暗号化の概要](https://www.ibm.com/support/knowledgecenter/ja/SSEPGG_11.5.0/com.ibm.db2.luw.admin.sec.doc/doc/c0070381.html)
- [セントラル PKCS #11 鍵ストアのセットアップ](https://www.ibm.com/support/knowledgecenter/ja/SSEPGG_11.5.0/com.ibm.db2.luw.admin.sec.doc/doc/t0070203.html)

- [db2credman - 資格情報とセキュリティー鍵の管理のコマンド (db2 提供)](https://www.ibm.com/support/knowledgecenter/ja/SSEPGG_11.5.0/com.ibm.db2.luw.admin.cmd.doc/doc/r0070202.html)