

# Amazon RDS for Db2 DB インスタンスでの SSL/TLS の使用
<a name="Db2.Concepts.SSL"></a>

SSL は、クライアントとサーバー間のネットワーク接続を安全に保つための業界標準のプロトコルです。SSL バージョン 3.0 以降は、名前が TLS と変更されていますが、いまだに SSL と呼称されることもよくあります。Amazon RDS は、Amazon RDS for Db2 DB インスタンス向けに SSL での暗号化をサポートしています。SSL/TLS を使用して、アプリケーションクライアントと RDS for Db2 DB インスタンス間の接続を暗号化できます。SSL/TLS サポートは、RDS for Db2 のすべての AWS リージョン で提供されています。



RDS for Db2 DB インスタンスの SSL/TLS 暗号化を有効するには、その DB インスタンスに関連付けられているパラメータグループに、Db2 SSL オプションを追加します。Db2 からの要求があるため、Amazon RDS では SSL/TLS 接続のために 2 番目のポートを使用しています。こうすることで、クリアテキストと SSL 暗号化の両方の通信を、DB インスタンスと Db2 クライアント間で同時に実行できます。例えば、このポートで SSL 暗号化通信を使用して VPC 外部のリソースと通信する一方で、このポートでクリアテキスト通信を使用して VPC 内の他のリソースと通信できます。

**Topics**
+ [SSL/TLS 接続の作成](#db2-creating-ssl-connection)
+ [Db2 データベースサーバーに接続する](#db2-connecting-to-server-ssl)

## SSL/TLS 接続の作成
<a name="db2-creating-ssl-connection"></a>

SSL/TLS 接続を作成するには、認証機関 (CA) を選択し、すべての AWS リージョンの証明書バンドルをダウンロードして、カスタムパラメータグループにパラメータを追加します。

### ステップ 1: CA を選択して証明書をダウンロードする
<a name="db2-creating-ssl-connection-prereq"></a>

認証機関 (CA) を選択し、すべての AWS リージョンの証明書バンドルをダウンロードします。詳細については、「[SSL/TLS を使用した DB インスタンスまたはクラスターへの接続の暗号化](UsingWithRDS.SSL.md)」を参照してください。

### ステップ 2: カスタムパラメータグループのパラメータを更新する
<a name="db2-updating-parameters-ssl"></a>

**重要**  
RDS for Db2 に Bring-Your-Own-License (BYOL) モデルを使用している場合は、IBM Customer ID と IBM Site ID 用に作成したカスタムパラメータグループを変更します。RDS for Db2 に別のライセンスモデルを使用している場合は、手順に従ってカスタムパラメータグループにパラメータを追加します。詳細については、「[Amazon RDS for Db2 のライセンスオプション](db2-licensing.md)」を参照してください。

RDS for Db2 DB インスタンスのデフォルトのパラメータグループを変更することはできません。したがって、カスタムパラメータグループを作成して変更し、それを RDS for Db2 DB インスタンスにアタッチする必要があります。パラメータグループの詳細については、「[Amazon RDS DB インスタンスの DB パラメータグループ](USER_WorkingWithDBInstanceParamGroups.md)」を参照してください。

 次の表のパラメータ設定を使用します。


| パラメータ | 値 | 
| --- | --- | 
| DB2COMM | TCPIP,SSL-または-SSL | 
| SSL\$1SVCENAME | <any port number except the number used for the non-SSL port> | 

**カスタムパラメータグループのパラメータを更新するには**

1. [https://docs.aws.amazon.com/cli/latest/reference/rds/create-db-parameter-group.html](https://docs.aws.amazon.com/cli/latest/reference/rds/create-db-parameter-group.html) コマンドを実行して、カスタムパラメータグループを作成します。

   次の必須パラメータを含めます。
   + `--db-parameter-group-name` - 作成するパラメータグループの名前。
   + `--db-parameter-group-family` - Db2 エンジンエディションとメジャーバージョン。有効な値: `db2-se-11-5`、`db2-ae-11.5`。
   + `--description` - このパラメータグループの説明。

   DB パラメータグループの作成の詳細については、「[Amazon RDS での DB パラメータグループの作成](USER_WorkingWithParamGroups.Creating.md)」を参照してください。

1. [https://docs.aws.amazon.com/cli/latest/reference/rds/modify-db-parameter-group.html](https://docs.aws.amazon.com/cli/latest/reference/rds/modify-db-parameter-group.html) コマンドを実行して、作成したカスタムパラメータグループのパラメータを変更します。

   次の必須パラメータを含めます。
   + `--db-parameter-group-name` – 作成したパラメータグループの名前。
   + `--parameters` – パラメータ名、値、およびパラメータ更新用のアプリケーションメソッドの配列。

   パラメータグループの変更の詳細については、「[Amazon RDS の DB パラメータグループのパラメータの変更](USER_WorkingWithParamGroups.Modifying.md)」を参照してください。

1. パラメータグループを RDS for Db2 DB インスタンスに関連付けます。詳細については、「[Amazon RDS で DB パラメータグループを DB インスタンスに関連付ける](USER_WorkingWithParamGroups.Associating.md)」を参照してください。

## Db2 データベースサーバーに接続する
<a name="db2-connecting-to-server-ssl"></a>

Db2 データベースサーバーへの接続手順は言語によって異なります。

------
#### [ Java ]

**Java を使用して Db2 データベースサーバーに接続するには**

1. JDBC ドライバーをダウンロードします。詳細については、IBM サポートドキュメントの「[DB2 JDBC Driver Versions and Downloads](https://www.ibm.com/support/pages/db2-jdbc-driver-versions-and-downloads)」を参照してください。

1. 以下のコンテンツを使用して、シェルスクリプトファイルを作成します。このスクリプトによりは、バンドルのすべての証明書が Java KeyStore に追加されます。
**重要**  
スクリプトが `keytool` を見つけることができるように、スクリプトのパス上に存在することを確認します。Db2 クライアントを使用する場合、 `keytool` は `~sqlib/java/jdk64/jre/bin` にあります。

   ```
   #!/bin/bash
   PEM_FILE=$1
   PASSWORD=$2
   KEYSTORE=$3
   # number of certs in the PEM file
   CERTS=$(grep 'END CERTIFICATE' $PEM_FILE| wc -l)
   for N in $(seq 0 $(($CERTS - 1))); do
       ALIAS="${PEM_FILE%.*}-$N"
       cat $PEM_FILE |
       awk "n==$N { print }; /END CERTIFICATE/ { n++ }" |
       keytool -noprompt -import -trustcacerts -alias $ALIAS -keystore $KEYSTORE -storepass $PASSWORD
   done
   ```

1. シェルスクリプトを実行し、証明書バンドルを含む PEM ファイルを Java KeyStore にインポートするには、次のコマンドを実行します。*shell\$1file\$1name.sh* をシェルスクリプトファイルの名前に置き換え、*password* を Java KeyStore のパスワードに置き換えます。

   ```
    ./shell_file_name.sh global-bundle.pem password truststore.jks
   ```

1. Db2 サーバーに接続するには、次のコマンドを実行します。例の次のプレースホルダーを RDS for Db2 DB インスタンス情報に置き換えます。
   + *ip\$1address* – DB インスタンスエンドポイントの IP アドレス。
   + *port* – SSL 接続のポート番号。これは、SSL 以外のポートに使用される番号を除く任意のポート番号にすることができます。
   + *database\$1name* – DB インスタンス内のデータベースの名前。
   + *master\$1username* – DB インスタンスのマスターユーザー名。
   + *master\$1password* – DB インスタンスのマスターパスワード。

   ```
   export trustStorePassword=MyPassword
   java -cp ~/dsdriver/jdbc_sqlj_driver/linuxamd64/db2jcc4.jar \
   com.ibm.db2.jcc.DB2Jcc -url \
   "jdbc:db2://ip_address:port/database_name:\
   sslConnection=true;sslTrustStoreLocation=\
   ~/truststore.jks;\
   sslTrustStorePassword=${trustStorePassword};\
   sslVersion=TLSv1.2;\
   encryptionAlgorithm=2;\
   securityMechanism=7;" \
   -user master_username -password master_password
   ```

------
#### [ Node.js ]

**Node.js を使用して Db2 データベースサーバーに接続するには**

1. **node-ibm\$1db** ドライバーをインストールします。詳細については、 IBM Db2 ドキュメントの「[Installing the node-ibm\$1db driver on Linux and UNIX systems](https://www.ibm.com/docs/en/db2/11.5?topic=nodejs-installing-node-db-driver-linux-unix-systems)」を参照してください。

1. 次の内容に基づいて JavaScript ファイルを作成します。例の次のプレースホルダーを RDS for Db2 DB インスタンス情報に置き換えます。
   + *ip\$1address* – DB インスタンスエンドポイントの IP アドレス。
   + *master\$1username* – DB インスタンスのマスターユーザー名。
   + *master\$1password* – DB インスタンスのマスターパスワード。
   + *database\$1name* – DB インスタンス内のデータベースの名前。
   + *port* – SSL 接続のポート番号。これは、SSL 以外のポートに使用される番号を除く任意のポート番号にすることができます。

   ```
   var ibmdb = require("ibm_db");
   const hostname = "ip_address";
   const username = "master_username";
   const password = "master_password";
   const database = "database_name";
   const port = "port";
   const certPath = "/root/qa-bundle.pem";
   ibmdb.open("DRIVER={DB2};DATABASE=" + database + ";HOSTNAME=" + hostname + ";UID=" + username + ";PWD=" + password + ";PORT=" + port + ";PROTOCOL=TCPIP;SECURITY=SSL;SSLServerCertificate=" + certPath + ";", function (err, conn){
    if (err) return console.log(err);
    conn.close(function () {
    console.log('done');
    });
   });
   ```

1. JavaScript ファイルを実行するには、次のコマンドを実行します。

   ```
   node ssl-test.js
   ```

------
#### [ Python ]

**Python を使用して Db2 データベースサーバーに接続するには**

1. 以下のコンテンツを含む Python ファイルを作成します。例の次のプレースホルダーを RDS for Db2 DB インスタンス情報に置き換えます。
   + *port* – SSL 接続のポート番号。これは、SSL 以外のポートに使用される番号を除く任意のポート番号にすることができます。
   + *master\$1username* – DB インスタンスのマスターユーザー名。
   + *master\$1password* – DB インスタンスのマスターパスワード。
   + *database\$1name* – DB インスタンス内のデータベースの名前。
   + *ip\$1address* – DB インスタンスエンドポイントの IP アドレス。

   ```
   import click
   import ibm_db
   import sys
   
   port = port;
   master_user_id = "master_username" # Master id used to create your DB instance
   master_password = "master_password" # Master password used to create your DB instance
   db_name = "database_name" # If not given "db-name'
   vpc_customer_private_ip = "ip_address" # Hosts end points - Customer private IP Addressicert_path = "/root/ssl/global-bundle.pem" # cert path
   
   @click.command()        
   @click.option("--path", help="certificate path")
   def db2_connect(path):
   
       try:
           conn = ibm_db.connect(f"DATABASE={db_name};HOSTNAME={vpc_customer_private_ip};PORT={port};
               PROTOCOL=TCPIP;UID={master_user_id};PWD={master_password};SECURITY=ssl;SSLServerCertificate={path};", "", "")
           try:
               ibm_db.exec_immediate(conn, 'create table tablename (a int);')
               print("Query executed successfully")
           except Exception as e:
               print(e)
           finally:
               ibm_db.close(conn)
               sys.exit(1)
       except Exception as ex:
           print("Trying to connect...")
   
   if __name__ == "__main__":
       db2_connect()
   ```

1. 作成した Python ファイルを実行する次のシェルスクリプトを作成します。*python\$1file\$1name.py* を Python スクリプトファイルの名前に置き換えます。

   ```
   #!/bin/bash
   PEM_FILE=$1
   # number of certs in the PEM file
   CERTS=$(grep 'END CERTIFICATE' $PEM_FILE| wc -l)
   
   for N in $(seq 0 $(($CERTS - 1))); do
       ALIAS="${PEM_FILE%.*}-$N"
       cert=`cat $PEM_FILE | awk "n==$N { print }; /END CERTIFICATE/ { n++ }"`
       cat $PEM_FILE | awk "n==$N { print }; /END CERTIFICATE/ { n++ }" > $ALIAS.pem
       python3 <python_file_name.py> --path $ALIAS.pem
       output=`echo $?`
       if [ $output == 1 ]; then
           break
       fi
   done
   ```

1. 証明書バンドルを含む PEM をインポートし、シェルスクリプトを実行するには、次のコマンドを実行します。*shell\$1file\$1name.sh* をシェルスクリプトファイルの名前に置き換えます。

   ```
   ./shell_file_name.sh global-bundle.pem
   ```

------
#### [ Db2 CLP ]

**Db2 CLP を使用して Db2 データベースサーバーに接続するには**

1. Db2 CLP を使用して Db2 インスタンスに接続するには、[IBM Fix Central](https://www.ibm.com/support/fixcentral/swg/selectFixes?parent=Security+Systems&product=ibm/Tivoli/IBM+Global+Security+Kit&release=All&platform=All&function=fixId&fixids=8.0.*&source=fc) からダウンロードできる GSKit が必要です。Db2 CLP を使用するには、IBM Db2 クライアントも必要です。このクライアントは、IBM サポートの「[Download initial Version 11.5 clients and drivers](https://www.ibm.com/support/pages/download-initial-version-115-clients-and-drivers)」からダウンロードできます。

1. キーストアを作成します。

   ```
   gsk8capicmd_64 -keydb -create -db "directory/keystore-filename" -pw "changeThisPassword" -type pkcs12 -stash
   ```

1. 証明書のバンドルをキーストアにインポートします。

   ```
   gsk8capicmd_64 -cert -import -file global-bundle.pem -target directory/keystore-filename> -target_stashed
   ```

1. Db2 インスタンス設定を更新します。

   ```
   db2 update dbm cfg using SSL_CLNT_KEYDB keystore-filename SSL_CLNT_STASH keystore stash file immediate
   ```

1. ノードとデータベースをカタログ化します。

   ```
   db2 catalog tcpip node ssluse1 REMOTE endpoint SERVER ssl_svcename security ssl
   
   db2 catalog database testdb as ssltest at node ssluse1
   ```

1. データベースに接続します。

   ```
   db2 connect to ssltest user username using password
   ```

------