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での経験を加えたものです。ある特定の環境・使用状況においての正確性が確認されていますが、すべての環境において同様の結果が得られる保証はありません。
これらの技術を自身の環境に適用する際には、自己の責任において十分な検証と確認を実施いただくことをお奨めいたします。

---------------------------------------
(変更記録) 

- 2021/10/08 
    - "手順2 : ローカル鍵ストアを作成します。" の作成例に `cd sqllib/gskit/bin`を追記しました。　
    - "手順3 : Db2インスタンスが鍵ストアを使用するように構成しましょう" 内の　データベースマネージャー構成パラメター変更順序を修正しました。
   
---------------------------------------



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

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

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

ここでは ローカル鍵ストアに保管されたマスター鍵をHSMへ移行する方法を説明します。

## 構成と手順の概略

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

まず、Db2 ネイティブ暗号化がローカル鍵ストアを使用するように構成した後　ローカル鍵ストアのマスター鍵を HSMへ移行します。

![image-HSM-Db2AESEStandalone2_KeyMigration.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855502/c30ddb27-506e-efe4-0879-8869a0896460.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
====    ================        =====
   0       1431591540408        db2aese

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

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

### Db2の前提

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



## 必要な情報

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

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

## 手順

### 手順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 : ローカル鍵ストアを作成します。

Db2 インスタンスオーナーとしてLogin し　次のような`gsk8capicmd_64 command` コマンドを使用してローカル鍵ストアを作成します。 

```
cd sqllib/gskit/bin
./gsk8capicmd_64 -keydb -create -db "<db2_instance_home>/sqllib/security/my-keystore.p12" -pw "Temp1234" -type pkcs12 -stash

# コマンド実行例
[db2inst1@psm02:/home/db2inst1/sqllib/lib64/gskit]$ ./gsk8capicmd_64 -keydb -create -db "/home/db2inst1/sqllib/security/my-keystore.p12" -pw "Temp1234" -type pkcs12 -stash
[db2inst1@psm02:/home/db2inst1/sqllib/lib64/gskit]$

```

ここで　`Temp1234`は ローカル鍵ストアのパスワードで　-stash オプションが付いている場合　ローカル鍵ストアのパスワードは　ローカル鍵ストアのファイル名と同じで拡張子が".sth"であるstashファイルに保管されます。

この例では<db2_instance_home>/sqllib/security/ の下にローカル鍵ストアを作成しています。　ローカル鍵ストアファイルと stash がファイルは次のように作成されています。

```
[db2inst1@psm02:/home/db2inst1]$ ls -lt /home/db2inst1/sqllib/security/
合計 10408
-rw-------    1 db2inst1 db2iadm1        193 May 28 10:13 my-keystore.sth	<< stash file 
-rw-------    1 db2inst1 db2iadm1          0 May 28 10:13 my-keystore.p12	<< ローカル鍵ストア
drwxr-xr-x    2 db2inst1 db2iadm1        256 May 21 18:17 auditdata
lrwxrwxrwx    1 root     system           38 May 21 18:17 db2chkau -> /opt/IBM/db2/V11.5/security64/db2chkau
-r-s--x--x    1 root     db2iadm1      24086 May 21 18:17 db2chpw
-r-x--s--x    1 db2inst1 db2iadm1      53298 May 21 18:17 db2flacc
-r-s--x--x    1 root     db2iadm1    5207605 May 21 18:17 db2ckpw
-rw-r--r--    1 db2inst1 db2iadm1       4096 May 21 18:17 db2audit.cfg
-r-s--x--x    1 db2inst1 db2iadm1      27043 May 21 18:17 db2aud
[db2inst1@psm02:/home/db2inst1]$
```



### 手順3 : Db2インスタンスが鍵ストアを使用するように構成しましょう

Db2 ネイティブ暗号化の目的で、Db2インスタンスが鍵ストアを使用するように構成するためには　データベースマネージャー構成パラメターの `keystore_type` と`keystore_location`を設定するだけです。

```
# 設定前の鍵ストアに関するデータベースマネージャー構成パラメターの状況
[db2inst1@psm02:/home/db2inst1]$ db2 get dbm cfg | grep -i KEYSTORE
 鍵ストア・タイプ                           (KEYSTORE_TYPE) = NONE
 鍵ストアのロケーション                   (KEYSTORE_LOCATION) =
[db2inst1@psm02:/home/db2inst1]$
```

ローカル鍵ストアを使用するためには　 `keystore_location`には　ローカル鍵ストアファイルへの絶対パスとファイル名を設定し `keystore_type` には　`PKCS12`を設定します

```
# KEYSTORE_LOCATION 更新コマンド例
db2 update dbm cfg using keystore_location /home/db2inst1/sqllib/security/my-keystore.p12

# KEYSTORE_TYPE　更新コマンド
db2 update dbm cfg using keystore_type pkcs12

# db2 再起動 
db2stop ; db2start;
```



上のコマンドを実行すると　 `keystore_type` と`keystore_location`は次のように設定されています。

```
[db2inst1@psm02:/home/db2inst1]$ db2 get dbm cfg | grep -i KEYSTORE
 鍵ストア・タイプ                           (KEYSTORE_TYPE) = PKCS12
 鍵ストアのロケーション                   (KEYSTORE_LOCATION) = /home/db2inst1/sqllib/security/my-keystore.p12
[db2inst1@psm02:/home/db2inst1]$
```



### 手順4 : ローカル鍵ストアを使用した暗号化データベースを作成しましょう

Db2 ネイティブ暗号化では　データベースを`ENCRYPT`オプション付きで作成すると、データベースマネージャーは作成するデータベースのマスター鍵を作成し鍵ストアにマスター鍵を追加します。

暗号化データベースを作成するためには　次のように`CREATE DATABASE` コマンドを`ENCRYPT`オプション付きで指定します。　ここで　`myibm`は　暗号化データベースの名前です。

```
db2 create db myibm encrypt
```

作成したデータベースがDb2 ネイティブ暗号化を使用して暗号化されているか検証するためには 、データベース構成パラメーターの ` 暗号化されたデータベース (Encrypted database) `が YESになっていることを確認します。

```
# データベース構成パラメーターを参照するコマンド
db2 get db cfg for myibm

# 実行例
[db2inst1@psm02:/home/db2inst1]$ db2 get db cfg for myibm | grep  -E -i "暗号化されたデータベース|Encrypted database"
 暗号化されたデータベース                                      = YES	<< YESになっていることを確認します
[db2inst1@psm02:/home/db2inst1]$
```

### 手順5 : 暗号化データベースがローカル鍵ストアを使用して正しく稼働していることを確認しましょう

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

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

# 実行例
[db2inst1@psm02:/home/db2inst1]$ db2 connect to myibm

   データベース接続情報

 データベース・サーバー = DB2/AIX64 11.5.0.0
 SQL 許可 ID            = DB2INST1
 ローカル・データベース別名 = MYIBM

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

(2) 表`EMPLOYEE_SALARY` を作成しデータを挿入します

```
# 実行コマンド
db2 "CREATE TABLE EMPLOYEE_SALARY (DEPTNO CHAR(3) NOT NULL,DEPTNAME VARCHAR(36) NOT NULL,EMPNO CHAR(6) NOT NULL,SALARY DECIMAL(9,2) NOT NULL WITH DEFAULT)"
db2 "INSERT INTO EMPLOYEE_SALARY VALUES (001,'IT',001,10000)"
db2 "INSERT INTO EMPLOYEE_SALARY VALUES (001,'IT',002,15000)"

# 実行例
[db2inst1@psm02:/home/db2inst1]$ db2 "CREATE TABLE EMPLOYEE_SALARY (DEPTNO CHAR(3) NOT NULL,DEPTNAME VARCHAR(36) NOT NULL,EMPNO CHAR(6) NOT NULL,SALARY DECIMAL(9,2) NOT NULL WITH DEFAULT)"
DB20000I  SQL コマンドが正常に完了しました。
[db2inst1@psm02:/home/db2inst1]$ db2 "INSERT INTO EMPLOYEE_SALARY VALUES (001,'IT',001,10000)"
DB20000I  SQL コマンドが正常に完了しました。
[db2inst1@psm02:/home/db2inst1]$ db2 "INSERT INTO EMPLOYEE_SALARY VALUES (001,'IT',002,15000)"
DB20000I  SQL コマンドが正常に完了しました。
[db2inst1@psm02:/home/db2inst1]$
```

   

(3) 表`EMPLOYEE_SALARY` の内容を表示します。

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

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

DEPTNO DEPTNAME                             EMPNO  SALARY
------ ------------------------------------ ------ -----------
1      IT                                   1         10000.00
1      IT                                   2         15000.00

  2 レコードが選択されました。

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

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

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

   

(5) ローカル鍵ストアへのアクセスを検証します。　

ローカル鍵ストアが使用できないように　ローカル鍵ストアファイルを移動するかファイル名を変更します。

```
# 実行コマンド ファイル名変更
mv /home/db2inst1/sqllib/security/my-keystore.p12 /home/db2inst1/sqllib/security/my-keystore.p24

# 実行例
[db2inst1@psm02:/home/db2inst1]$ mv /home/db2inst1/sqllib/security/my-keystore.p12 /home/db2inst1/sqllib/security/my-keystore.p24
[db2inst1@psm02:/home/db2inst1]$ ls -l /home/db2inst1/sqllib/security/my-keystore*
-rw-------    1 db2inst1 db2iadm1       3512 May 28 10:28 /home/db2inst1/sqllib/security/my-keystore.p24		<<ファイル名が変更されている
-rw-------    1 db2inst1 db2iadm1        193 May 28 10:13 /home/db2inst1/sqllib/security/my-keystore.sth
[db2inst1@psm02:/home/db2inst1]$ 
```

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

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

# 実行例
[db2inst1@psm02:/home/db2inst1]$ db2 connect to myibm
SQL1728N  鍵ストアにアクセスできなかったためコマンドまた
は操作が失敗しました。 理由コード "2"
[db2inst1@psm02:/home/db2inst1]$
```

   

(6) ローカル鍵ストアファイルを元に戻します。

```
# 実行コマンド ファイル名変更
mv /home/db2inst1/sqllib/security/my-keystore.p24 /home/db2inst1/sqllib/security/my-keystore.p12

# 実行例
[db2inst1@psm02:/home/db2inst1]$  mv /home/db2inst1/sqllib/security/my-keystore.p24 /home/db2inst1/sqllib/security/my-keystore.p12
[db2inst1@psm02:/home/db2inst1]$ ls -l /home/db2inst1/sqllib/security/my-keystore*
-rw-------    1 db2inst1 db2iadm1       3512 May 28 10:28 /home/db2inst1/sqllib/security/my-keystore.p12
-rw-------    1 db2inst1 db2iadm1        193 May 28 10:13 /home/db2inst1/sqllib/security/my-keystore.sth
[db2inst1@psm02:/home/db2inst1]$   
```

   

### 手順6 : ローカル鍵ストアからPKCS #11 鍵ストアへ移行します。

(1) PKCS #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/`です。

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

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

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

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

```
[db2inst1@psm02:/home/db2inst1]$ cat /home/db2inst1/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=db2aese
NEW_OBJECT_TYPE=PRIVATE
KEYSTORE_STASH=/home/db2inst1/sqllib/security/pkcs11_pw.sth
[db2inst1@psm02:/home/db2inst1]$
```

   

(2) 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
  
#　実行例
[db2inst1@psm02:/home/db2inst1]$ db2credman -stash -password HSM4co! -to /home/db2inst1/sqllib/security/pkcs11_pw.sth
Password successfully stashed to /home/db2inst1/sqllib/security/pkcs11_pw.sth
  
db2credman completed sucessfully.
[db2inst1@psm02:/home/db2inst1]$
```
    
ここで　`<partition password>` は　Crypto Officer のパスワードを使用します。　
    
注意 :  stashファイルにPKCS #11 鍵ストアのパスワードを保管することは　オプショナルです。　ユーザーがパスワードを保管しておきたい(stashしたい)と考える場合　stashファイルを作成し構成ファイルの`KEYSTORE_STASH`を指定する必要があります。
    
      

(3) `db2p12top11` コマンドを使用して、ローカル鍵ストアからPKCS #11 鍵ストアへマスター鍵を移行します
参照 : [db2p12top11 - ローカル鍵ストアを集中 PKCS #11 鍵ストアにマイグレーションするコマンド(db2提供)](https://www.ibm.com/support/knowledgecenter/ja/SSEPGG_11.5.0/com.ibm.db2.luw.admin.cmd.doc/doc/r0070177.html)
   
```
# 実行コマンド
db2p12top11 -to /home/<db2_instance>/sqllib/security/luna.cfg -pin <partition password>

#　実行例
[db2inst1@psm02:/home/db2inst1]$ db2p12top11 -to /home/db2inst1/sqllib/security/luna.cfg -pin HSM4co!
Migrating keys from <> local keystore
to PKCS#11 HSM using vendor library </usr/safenet/lunaclient/lib/libCryptoki2_64.so>
defined in configuration file </home/db2inst1/sqllib/security/luna.cfg>.

Migrating key: <DB2_SYSGEN_db2inst1_MYIBM_2020-05-28-10.28.31_2CAD47C6> ... Successful.

Out of 1 key(s): 1 key(s) inserted successfully, 0 failed.
[db2inst1@psm02:/home/db2inst1]$
```
ここで　`<partition password>` は　Crypto Officer のパスワードを使用します。　
コマンド実行中にローカル鍵ストアにあるマスター鍵がHSMパーティションに移行されます。
   
HSMクライアントの`lunacm`で  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_db2inst1_MYIBM_2020-05-28-10.28.31_2CAD47C6
Handle:        47
Object Type:   Symmetric Key
Object UID:    1b0000001b000001d0610900


Number of objects:  1


Command Result : No Error


lunacm:>
```
   
   

(4) PKCS #11 鍵ストア構成ファイル(luna.cfg)の中の`ALLOW_KEY_INSERT_WITHOUT_KEYSTORE_BACKUP`を`FALSE`に変更します。

```
[db2inst1@psm02:/home/db2inst1]$ cat /home/db2inst1/sqllib/security/luna.cfg
VERSION=1
PRODUCT_NAME=Luna
ALLOW_KEY_INSERT_WITHOUT_KEYSTORE_BACKUP=FALSE		<< trueからFALSEへ変更
LIBRARY=/usr/safenet/lunaclient/lib/libCryptoki2_64.so
SLOT_LABEL=db2aese
NEW_OBJECT_TYPE=PRIVATE
KEYSTORE_STASH=/home/db2inst1/sqllib/security/pkcs11_pw.sth
[db2inst1@psm02:/home/db2inst1]$
```

   

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

```
# 変更前の確認
[db2inst1@psm02:/home/db2inst1]$ db2 get dbm cfg | grep KEYSTORE
 鍵ストア・タイプ                           (KEYSTORE_TYPE) = PKCS12
 鍵ストアのロケーション                   (KEYSTORE_LOCATION) = /home/db2inst1/sqllib/security/my-keystore.p12
[db2inst1@psm02:/home/db2inst1]$


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

# db2 再起動 
db2stop ; db2start

# 変更を確認
[db2inst1@psm02:/home/db2inst1]$ db2 get dbm cfg  | grep KEYSTORE
 鍵ストア・タイプ                           (KEYSTORE_TYPE) = PKCS11
 鍵ストアのロケーション                   (KEYSTORE_LOCATION) = /home/db2inst1/sqllib/security/luna.cfg
[db2inst1@psm02:/home/db2inst1]$
```

   

### 手順7 : データベースが HSM デバイスにアクセスできているか確認しましょう。

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

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

# 実行例
[db2inst1@psm02:/home/db2inst1]$ db2 connect to myibm

   データベース接続情報

 データベース・サーバー = DB2/AIX64 11.5.0.0
 SQL 許可 ID            = DB2INST1
 ローカル・データベース別名 = MYIBM

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

   

(2) 表`EMPLOYEE_SALARY` の内容を表示します。

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

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

DEPTNO DEPTNAME                             EMPNO  SALARY
------ ------------------------------------ ------ -----------
1      IT                                   1         10000.00
1      IT                                   2         15000.00

  2 レコードが選択されました。

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

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

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

   

(4) データベースがHSMのマスター鍵にアクセスできないようにするために、PKCS #11 鍵ストア構成ファイル(`luna.cfg`)を移動するかファイル名を変更します。まず、PKCS #11 鍵ストア構成ファイル(`luna.cfg`)を確認するために`db2 get dbm cfg`を実行します。

```
# 確認コマンド
[db2inst1@psm02:/home/db2inst1]$ db2 get dbm cfg | grep -i keystore
 鍵ストア・タイプ                           (KEYSTORE_TYPE) = PKCS11
 鍵ストアのロケーション                   (KEYSTORE_LOCATION) = /home/db2inst1/sqllib/security/luna.cfg
[db2inst1@psm02:/home/db2inst1]$
```

鍵ストアのロケーション(`KEYSTORE_LOCATION`)で指定されたPKCS #11 鍵ストア構成ファイル(`luna.cfg`)が存在しないようにファイル名を変更します。

```
# 実行コマンド ファイル名変更　
mv  /home/db2inst1/sqllib/security/luna.cfg  /home/db2inst1/sqllib/security/luna.cfg.bak

# 実行例
[db2inst1@psm02:/home/db2inst1]$ mv  /home/db2inst1/sqllib/security/luna.cfg  /home/db2inst1/sqllib/security/luna.cfg.bak
[db2inst1@psm02:/home/db2inst1]$ ls -l /home/db2inst1/sqllib/security/luna.cfg*
-rw-r--r--    1 db2inst1 db2iadm1        236 May 28 15:37 /home/db2inst1/sqllib/security/luna.cfg.bak
[db2inst1@psm02:/home/db2inst1]$
```

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

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

# 実行例
[db2inst1@psm02:/home/db2inst1]$ db2 connect to myibm
SQL1781N  外部鍵ストアの構成ファイルの解析中にエラーが発
生しました。理由コード: "4"。
[db2inst1@psm02:/home/db2inst1]$
```

   

(5) PKCS #11 鍵ストア構成ファイル(`luna.cfg`)を元に戻します。

```
# 実行コマンド ファイル名変更
mv /home/db2inst1/sqllib/security/luna.cfg.bak /home/db2inst1/sqllib/security/luna.cfg

# 実行例
[db2inst1@psm02:/home/db2inst1]$ mv /home/db2inst1/sqllib/security/luna.cfg.bak /home/db2inst1/sqllib/security/luna.cfg
[db2inst1@psm02:/home/db2inst1]$

#　データベースへ接続できることを確認します。
[db2inst1@psm02:/home/db2inst1]$  db2 connect to myibm

   データベース接続情報

 データベース・サーバー = DB2/AIX64 11.5.0.0
 SQL 許可 ID            = DB2INST1
 ローカル・データベース別名 = MYIBM

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

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

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

(7) データベースがHSMのマスター鍵にアクセスできないようにするために、HSMアプライアンスで　HSMアプライアンスとクライアント間の通信である NTLSサービスを停止します。

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

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

# 実行例
[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                              << 'proceed'と入力
Proceeding...
Stopping ntls:                                             [  OK  ]

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

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

```
[db2inst1@psm02:/home/db2inst1]$ db2 connect to myibm
SQL1783N  PKCS #11
鍵マネージャーへのアクセス時にエラーが発生したため、コ
マンドまたは操作が失敗しました。理由コード "13"
[db2inst1@psm02:/home/db2inst1]$
```

(8) HSMアプライアンスでNTLSサービスを開始して、Db2サービスを復旧します。

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

# 実行例
[local_host] lunash:>service start ntls

Starting ntls:                                             [  OK  ]

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

この後 connect dbを使用してデータベースへ接続しようとすると次のようなエラーが発生します

```
[db2inst1@psm02:/home/db2inst1]$ db2 connect to myibm
SQL1783N  PKCS #11
鍵マネージャーへのアクセス時にエラーが発生したため、コ
マンドまたは操作が失敗しました。理由コード "13"
[db2inst1@psm02:/home/db2inst1]$
```

NTLSサービスを再開してDb2サービスを復旧するためには、db2stop , db2start を実行してdb2 を再起動する必要があります。

```
[db2inst1@psm02:/home/db2inst1]$ db2stop
db2start
2020-05-28 17:02:47     0   0   SQL1064N  DB2STOP の処理が正常に終了しました。
SQL1064N  DB2STOP の処理が正常に終了しました。
[db2inst1@psm02:/home/db2inst1]$ db2start
05/28/2020 17:02:49     0   0   SQL1063N  DB2START の処理が正常に終了しました。
SQL1063N  DB2START の処理が正常に終了しました。
[db2inst1@psm02:/home/db2inst1]$ db2 connect to myibm

   データベース接続情報

 データベース・サーバー = DB2/AIX64 11.5.0.0
 SQL 許可 ID            = DB2INST1
 ローカル・データベース別名 = MYIBM

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

   

   



## 検証環境情報

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

- 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)　
- [db2p12top11 - ローカル鍵ストアを集中 PKCS #11 鍵ストアにマイグレーションするコマンド(db2提供)](https://www.ibm.com/support/knowledgecenter/ja/SSEPGG_11.5.0/com.ibm.db2.luw.admin.cmd.doc/doc/r0070177.html)