本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用 SSL/TLS 搭配 Amazon RDS for Db2 資料庫執行個體
SSL 是一種產業標準通訊協定,可保護用戶端與伺服器之間的網路連線。SSL 3.0 版之後的名稱已變更為 TLS,但我們通常仍會將通訊協定稱為 SSL。Amazon RDS 可支援在 Amazon RDS for Db2 資料庫執行個體上啟用 SSL 加密。使用 SSL/TLS,您可以加密應用程式用戶端與 RDS for Db2 資料庫執行個體之間的連接。SSL/TLS 支援適用於所有的 AWS 區域 for RDS for Db2。
在與資料庫執行個體相關聯的參數群組中新增 Db2 SSL 選項,就能對 RDS for Db2 資料庫執行個體啟用 SSL/TLS 加密。Amazon RDS 會使用第二個連接埠 (依 Db2 要求) 作為 SSL/TLS 連線用途。如此可讓資料庫執行個體與 Db2 用戶端之間同時進行純文字和 Db2 加密的通訊。例如,您可以使用連接埠搭配純文字通訊與 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 資料庫執行個體。如需參數群組的詳細資訊,請參閱 Amazon RDS 資料庫執行個體的資料庫參數群組。
使用下表中的參數設定。
| 參數 |
Value |
DB2COMM |
TCPIP,SSL 或 SSL |
SSL_SVCENAME |
<any port number except the number used for the non-SSL
port> |
連線至 Db2 資料庫伺服器
連線至 Db2 資料庫伺服器的指示為特定語言。
- Java
-
使用 Java 連線至 Db2 資料庫伺服器
-
下載 JDBC 驅動程式。如需詳細資訊,請參閱 IBM 支援文件中的 DB2 JDBC 驅動程式版本和下載。
-
建立包含下列內容的 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
-
若要執行 shell 指令碼,並使用憑證套件將 PEM 檔案匯入 Java KeyStore,請執行下列命令。將 shell_file_name.sh 取代為 shell 指令碼檔案的名稱,並將 password 取代為您 Java KeyStore 的密碼。
./shell_file_name.sh global-bundle.pem password truststore.jks
-
若要連線至 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 資料庫伺服器
-
安裝 node-ibm_db 驅動程式。如需詳細資訊,請參閱 IBM Db2 文件中的在 Linux 和 UNIX 系統上安裝 node-ibm_db 驅動程式。
-
根據下列內容建立 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');
});
});
-
若要執行 JavaScript 檔案,請執行下列命令。
node ssl-test.js
- Python
-
使用 Python 連線至 Db2 資料庫伺服器
-
使用下列內容建立 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()
-
建立下列 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
-
若要使用憑證套件匯入 PEM 檔案並執行 shell 指令碼,請執行下列命令。將 shell_file_name.sh 取代為您 shell 指令碼檔案的名稱。
./shell_file_name.sh global-bundle.pem
- Db2 CLP
-
使用 Db2 CLP 連線至 Db2 資料庫伺服器
-
若要使用 Db2 CLP 連線到 Db2 執行個體,您需要可在 IBM Fix Central 下載的 GSKit。若要使用 Db2 CLP,您還需要 IBM Db2 用戶端,您可以從 IBM Support 中的下載初始版本 11.5 用戶端和驅動程式下載。
-
建立金鑰存放區。
gsk8capicmd_64 -keydb -create -db "directory/keystore-filename" -pw "changeThisPassword" -type pkcs12 -stash
-
將憑證套件匯入金鑰存放區。
gsk8capicmd_64 -cert -import -file global-bundle.pem -target directory/keystore-filename> -target_stashed
-
更新 Db2 執行個體組態。
db2 update dbm cfg using SSL_CLNT_KEYDB keystore-filename SSL_CLNT_STASH keystore stash file immediate
-
為節點和資料庫編製目錄。
db2 catalog tcpip node ssluse1 REMOTE endpoint SERVER ssl_svcename security ssl
db2 catalog database testdb as ssltest at node ssluse1
-
連線至資料庫。
db2 connect to ssltest user username using password