

# 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 옵션을 추가합니다. Amazon RDS는 Db2에서 요구하는 대로 SSL/TLS 연결을 위해 두 번째 포트를 사용합니다. 이로 인해 DB 인스턴스와 Db2 클라이언트 간에 클리어 텍스트 통신과 SSL로 암호화된 통신이 동시에 발생할 수 있습니다. 예를 들어 이 포트를 클리어 텍스트 통신에 사용하여 VPC 내의 다른 리소스와 통신하면서 동일한 포트를 SSL로 암호화된 통신에 사용하여 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 드라이버 버전 및 다운로드](https://www.ibm.com/support/pages/db2-jdbc-driver-versions-and-downloads)를 참조하세요.

1. 다음 콘텐츠로 쉘 스크립트 파일을 만듭니다. 이 스크립트는 번들의 모든 인증서를 Java KeyStore에 추가합니다.
**중요**  
스크립트의 경로에 `keytool`이 존재하는지 확인하여 스크립트가 찾을 수 있도록 하세요. Db2 클라이언트를 사용하는 경우 `~sqlib/java/jdk64/jre/bin` 아래에서 `keytool`을 찾을 수 있습니다.

   ```
   #!/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*를 쉘 스크립트 파일의 이름으로, *암호*를 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 설명서의 [Linux 및 UNIX 시스템에 node-ibm\$1db 드라이버 설치](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 Support의 [Download initial Version 11.5 clients and drivers](https://www.ibm.com/support/pages/download-initial-version-115-clients-and-drivers)에서 다운로드할 수 있는 IBM Db2 클라이언트도 필요합니다.

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
   ```

------