对 RDS for Db2 数据库实例使用 SSL - Amazon Relational Database Service

对 RDS for Db2 数据库实例使用 SSL

SSL 是用于保护客户端和服务器之间的网络连接的行业标准协议。在 SSL 3.0 版之后,此名称已更改为 TLS,但我们通常仍将此协议称为 SSL。Amazon RDS 支持对 Amazon RDS for Db2 数据库实例进行 SSL 加密。使用 SSL/TLS,您可以加密应用程序客户端和 RDS for Db2 数据库实例之间的连接。SSL/TLS 支持在 RDS for Db2 的所有 AWS 区域中都可用。

要为 RDS for Db2 数据库实例启用 SSL/TLS 加密,请将 Db2 SSL 选项添加到与该数据库实例关联的参数组中。根据 Db2 的要求,Amazon RDS 使用另一个端口进行 SSL/TLS 连接。这样使数据库实例与 Db2 客户端之间能够同时进行明文通信和 SSL 加密通信。例如,您可以使用用于明文通信的端口与 VPC 内的其他资源通信,同时使用用于 SSL 加密通信的端口与 VPC 外部的资源通信。

创建 SSL/TLS 连接

要创建 SSL/TLS 连接,请选择证书颁发机构(CA),下载适用于所有 AWS 区域的证书捆绑包,然后向自定义参数组添加参数。

步骤 1:选择 CA 并下载证书

选择证书颁发机构(CA),然后为所有 AWS 区域下载证书捆绑包。有关更多信息,请参阅使用 SSL/TLS 加密与数据库实例或集群的连接

步骤 2:更新自定义参数组中的参数

重要

如果您对 RDS for Db2 使用自带许可(BYOL)模型,请修改您为 IBM Customer ID 和 IBM Site ID 创建的自定义参数组。如果您对 RDS for Db2 使用不同的许可模式,请按照此过程将参数添加到自定义参数组。有关更多信息,请参阅Amazon RDS for Db2 许可选项

您无法修改 RDS for Db2 数据库实例的默认参数组。因此,您必须创建一个自定义参数组,对其进行修改,然后将其附加到 RDS for Db2 数据库实例。有关参数组的信息,请参阅 使用数据库实例中的数据库参数组

使用下表中的参数设置。

参数
DB2COMM TCPIP,SSL
SSL_SVCENAME <any port number except the number used for the non-SSL port>
更新自定义参数组中的参数
  1. 通过运行 create-db-parameter-group 命令创建自定义参数组。

    包括以下必需选项:

    • --db-parameter-group-name - 您正在创建的参数组的名称。

    • --db-parameter-group-family – Db2 引擎版本和主要版本。有效值:db2-se-11-5db2-ae-11.5

    • --description – 此参数组的描述。

    有关创建数据库参数组的详细信息,请参阅 创建数据库参数组

  2. 通过运行 modify-db-parameter-group 命令修改您创建的自定义参数组中的参数。

    包括以下必需选项:

    • --db-parameter-group-name – 您创建的参数组的名称。

    • --parameters – 参数名称、值和参数更新应用方法的数组。

    有关修改参数组的更多信息,请参阅修改数据库参数组中的参数

  3. 将参数组与 RDS for Db2 数据库实例相关联。有关更多信息,请参阅将数据库参数组与数据库实例关联

连接到您的 Db2 数据库服务器

连接到 Db2 数据库服务器的说明因语言而异。

Java
使用 Java 连接到 Db2 数据库服务器
  1. 下载 JDBC 驱动程序。有关更多信息,请参阅 IBM 支持文档中的 DB2 JDBC Driver Versions and Downloads

  2. 使用以下内容创建 Shell 文件。此脚本会将捆绑包中的所有证书添加到 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
  3. 要运行 Shell 脚本并将包含证书捆绑包的 PEM 文件导入到 Java KeyStore 中,请运行以下命令。将 shell_file_name.sh 替换为 Shell 脚本文件的名称,并将 password 替换为 Java KeyStore 的密码。

    ./shell_file_name.sh global-bundle.pem password truststore.jks
  4. 要连接到 Db2 服务器,请运行以下命令。将示例中的以下占位符替换为 RDS for Db2 数据库实例信息。

    • ip_address – 您的数据库实例端点的 IP 地址。

    • port – SSL 连接的端口号。这可以是任何端口号,但用于非 SSL 端口的端口号除外。

    • database_name – 数据库实例中数据库的名称。

    • master_username – 数据库实例的主用户名。

    • master_password – 数据库实例的主密码。

    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_db 驱动程序。有关更多信息,请参阅 IBM Db2 文档中的 Installing the node-ibm_db driver on Linux and UNIX systems

  2. 基于以下内容创建 JavaScript 文件。将示例中的以下占位符替换为 RDS for Db2 数据库实例信息。

    • ip_address – 您的数据库实例端点的 IP 地址。

    • master_username – 数据库实例的主用户名。

    • master_password – 数据库实例的主密码。

    • database_name – 数据库实例中数据库的名称。

    • 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'); }); });
  3. 要运行 JavaScript 文件,请运行以下命令。

    node ssl-test.js
Python
使用 Python 连接到 Db2 数据库服务器
  1. 创建 Python 文件并输入以下内容。将示例中的以下占位符替换为 RDS for Db2 数据库实例信息。

    • port – SSL 连接的端口号。这可以是任何端口号,但用于非 SSL 端口的端口号除外。

    • master_username – 数据库实例的主用户名。

    • master_password – 数据库实例的主密码。

    • database_name – 数据库实例中数据库的名称。

    • ip_address – 您的数据库实例端点的 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()
  2. 创建以下 Shell 脚本,该脚本将运行您创建的 Python 文件。将 python_file_name.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
  3. 要导入包含证书捆绑包的 PEM 文件并运行 Shell 脚本,请运行以下命令。将 shell_file_name.sh 替换为您的 Shell 脚本文件的名称。

    ./shell_file_name.sh global-bundle.pem