跳至內容

如何使用 SSL 連線成功連線至 Amazon RDS 執行個體?

5 分的閱讀內容
0

我想使用 Secure Socket Layer (SSL) 連線來連線至 Amazon Relational Database Service (Amazon RDS) 資料庫執行個體。

簡短說明

若要加密與執行 MySQL、MariaDB、Microsoft SQL Server、Oracle 或 PostgreSQL 之資料庫執行個體的連線,請使用應用程式中的 SSL 或 Transport Layer Security (TLS)。SSL/TLS 連線可提供一層安全性,因為連線會加密在用戶端和資料庫執行個體之間傳輸的資料。伺服器憑證可提供一層額外的安全性,因為伺服器憑證會驗證是否正在與 Amazon RDS 資料庫執行個體進行連線。

當您佈建資料庫執行個體時,Amazon RDS 會建立 SSL 憑證並在執行個體上安裝憑證。由憑證認證機構 (CA) 簽署這些憑證。SSL 憑證包括作為 SSL 憑證一般名稱的資料庫執行個體端點,以保護執行個體免受詐騙攻擊。由 Amazon RDS 建立的 SSL 憑證是受信任的根實體,在大多數情況下都可以使用。但是,如果您的應用程式不接受憑證鏈,則憑證可能會失敗。在這種情況下,請使用中繼憑證連線到 AWS 區域。例如,當您使用 SSL 連線到 AWS GovCloud (美國) 區域時,您必須使用中繼憑證。

您可以從 AWS 信任服務下載包含所有區域之中繼憑證和根憑證的憑證套件。如果應用程式位於 Microsoft Windows,且需要 PKCS7 檔案,則可以從 Amazon 信任服務下載 PKCS7 憑證套件。此套件包含中繼憑證和根憑證。

解決方法

每個資料庫引擎均有自己的程序來實作 SSL/TLS。若要實作資料庫叢集的 SSL/TLS 連線,請根據資料庫引擎使用下列其中一種方法。

Amazon RDS for Oracle

針對 Amazon RDS for Oracle 執行個體,若要開啟 SSL 模式,請在自訂選項群組中新增 SSL 選項

Oracle 的 RDS 支援 TLS 第 1.0 版和第 1.2 版。若要使用 Oracle SSL 選項,請在選項群組中使用 SQLNET.SSL_VERSION 選項設定。此選項設定允許下列值:

  • 「1.0」 - 用戶端僅能使用 TLS 1.0 連線到資料庫執行個體。
  • 「1.2」 - 用戶端僅能使用 TLS 1.2 連線到資料庫執行個體。
  • 「1.2 或 1.0」 - 用戶端可以使用 TLS 1.2 或 1.0 連線到資料庫執行個體。

對於現有的 Oracle SSL 選項,SQLNET.SSL_VERSION 會自動設定為「1.0」。如有必要,您可以變更設定。

您必須先將 SQL*Plus 用戶端設定為使用 SSL,然後才能連線到使用 Oracle SSL 選項的 Oracle 資料庫執行個體。若要透過 JDBC 使用 SSL 連線,您必須建立金鑰存放區、信任 Amazon RDS 根 CA 憑證,然後設定 SSL 連線。

使用 JDBC 設定 SSL 連線的範例程式碼:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;

public class OracleSslConnectionTest {
    private static final String DB_SERVER_NAME = "example-dns";
    private static final Integer SSL_PORT = "example-ssl-option-port-in-option-group";
    private static final String DB_SID = "example-oracle-sid";
    private static final String DB_USER = "example-username";
    private static final String DB_PASSWORD = "example-password";
    // This key store has only the prod root ca.
    private static final String KEY_STORE_FILE_PATH = "example-file-path-to-keystore";
    private static final String KEY_STORE_PASS = "example-keystore-password";
    public static void main(String[] args) throws SQLException {
        final Properties properties = new Properties();
        final String connectionString = String.format(
                "jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCPS)(HOST=%s)(PORT=%d))(CONNECT_DATA=(SID=%s)))",
                DB_SERVER_NAME, SSL_PORT, DB_SID);
        properties.put("example-username", DB_USER);
        properties.put("example-password", DB_PASSWORD);
        properties.put("oracle.jdbc.J2EE13Compliant", "true");
        properties.put("javax.net.ssl.trustStore", KEY_STORE_FILE_PATH);
        properties.put("javax.net.ssl.trustStoreType", "JKS");
        properties.put("javax.net.ssl.trustStorePassword", KEY_STORE_PASS);
        final Connection connection = DriverManager.getConnection(connectionString, properties);
        // If there is no exception, it means that an SSL connection can be opened
    }
}

在您使用 SSL 連線到 Oracle 執行個體的 RDS 之前,請檢查下列項目:

  • 下載 RDS 根憑證並將其新增至公事包檔案中。將此檔案儲存在 sqlnet.ora 檔案中 WALLET_LOCATION 參數指定的目錄中。
  • 您的 TNS 項目中有正確的 SSL 連接埠號碼。
  • Amazon RDS 安全群組設定為允許透過 SSL 連接埠從您的機器傳入連線。
  • 已適當設定防火牆或安全政策,以允許來自 Amazon RDS SSL 連接埠上的流量。

Amazon RDS for MariaDB

Amazon RDS for MariaDB 支援 TLS 第 1.0 版、第 1.1 版、第 1.2 版和第 1.3 版。在單向 TLS 連線中,於沒有用戶端憑證的情況下使用 TLS,僅能驗證伺服器。因此,僅能在單向進行驗證。但是,仍然能在雙向上進行加密。如需詳細資訊,請參閱 MariaDB 網站上的啟用 MariaDB 用戶端的單向 TLS

透過伺服器憑證驗證,用戶端會驗證憑證是否屬於伺服器。如需詳細資訊,請參閱 MariaDB 網站上的伺服器憑證驗證

若要使用 RDS 憑證啟動 MySQL 5.7 用戶端或更新版本,請執行類似下列內容的命令:

mysql -h myinstance.123456789012.rds-us-east-1.amazonaws.com -u testuser -p --ssl-ca=[full path]global-bundle.pem --ssl-mode=VERIFY_IDENTITY

若要使用 RDS 憑證啟動 MariaDB 用戶端,請執行類似下列內容的命令:

mysql -h myinstance.123456789012.rds-us-east-1.amazonaws.com -u testuser -p --ssl-ca=[full path]global-bundle.pem --ssl-verify-server-cert

若特定使用者或帳戶需要 SSL 連線,請根據 MariaDB 版本執行下列查詢:

ALTER USER 'test'@'%' REQUIRE SSL;

對於 MariaDB 第 10.5 版及更新版本的 RDS,如果已開啟效能結構描述,且應用程式已連接到資料庫執行個體,請檢查哪些連線使用 SSL/TLS:

MariaDB> SELECT id, user, host, connection_type
FROM performance_schema.threads pst
INNER JOIN information_schema.processlist isp
ON pst.processlist_id = isp.id;

**注意:**如需有關效能結構描述的詳細資訊,請參閱 MariaDB 網站上的效能結構描述

Amazon RDS for MySQL

MySQL 使用 OpenSSL 進行安全連線。如需詳細資訊,請參閱 Amazon RDS 上 MySQL 資料庫執行個體的 SSL/TLS 支援

依預設,MySQL 用戶端程式會嘗試在伺服器支援加密連線時建立加密連線。如需其他安全性,請使用 --ssl-ca 參數參考包含作為一般名稱之資料庫執行個體端點的 SSL 憑證。SSL 憑證可保護執行個體免受詐騙攻擊。

若要使用 MySQL 5.7 及更新版本的 --ssl-ca 參數來啟動用戶端,請執行類似下列內容的命令:

mysql -h myinstance.123456789012.rds-us-east-1.amazonaws.com -u testuser -p --ssl-ca=[full path]global-bundle.pem --ssl-mode=VERIFY_IDENTITY

若特定使用者或帳戶需要 SSL 連線,請根據 MySQL 版本請執行類似下列內容的命令:

mysql -h myinstance.123456789012.rds-us-east-1.amazonaws.com -u testuser -p --ssl-ca=[full path]global-bundle.pem --ssl-verify-server-cert

對於 MySQL 5.7 及更新版本,請執行下列命令:

ALTER USER 'testuser'@'%' REQUIRE SSL;

對於 MySQL 第 5.7 版或 第 8.0 版的 RDS,如果已開啟效能結構描述,且應用程式已連接到資料庫執行個體,請檢查哪些連線使用 SSL/TLS:

mysql> SELECT id, user, host, connection_type
FROM performance_schema.threads pst
INNER JOIN information_schema.processlist isp
ON pst.processlist_id = isp.id;

**注意:**如需有關效能結構描述的詳細資訊,請參閱 MariaDB 網站上的效能結構描述

Amazon RDS for Microsoft SQL Server

若要使用 SSL 連線到您的 Microsoft SQL Server 資料庫執行個體的 RDS,您可以對所有連線強制使用 SSL加密特定連線

若要加密來自其他 SQL 用戶端的連線,請將 encrypt=true 附加至連線字串。此字串可以作為選項或作為 GUI 工具中連線頁面上的屬性。

若要確認連線是否已加密,請執行下列查詢:

SELECT ENCRYPT_OPTION FROM SYS.DM_EXEC_CONNECTIONS WHERE SESSION_ID = @@SPID;

確認查詢是否針對 encrypt_option 傳回 true

**注意:**若要為使用 JDBC 連線的用戶端啟用 SSL 加密,您可能需要將 RDS SQL 憑證新增至 Java CA 憑證 (cacerts) 存放區。若要執行此動作,請使用 keytool 公用程式。

Amazon RDS for PostgreSQL

Amazon RDS 支援 PostgreSQL 資料庫執行個體的 SSL 加密。如需詳細資訊,請參閱將 SSL 與 PostgreSQL 資料庫執行個體搭配使用

在透過 SSL 連線到 PostgreSQL 資料庫執行個體的 RDS 之前,請完成下列步驟:

  1. 下載該憑證。
  2. 將憑證匯入至您的作業系統中。

如需詳細資訊,請參閱透過 SSL 連線到 PostgreSQL 資料庫執行個體

若要參考憑證,請使用 sslrootcert 參數。例如,sslrootcert=rds-ssl-ca-cert.pem

psql "host=myinstance.123456789012.rds-us-east-1.amazonaws.com port=5432 user=testuser dbname=testpg sslmode=verify-full sslrootcert=global-bundle.pem"

若要將 PostgreSQL 執行個體的 RDS 連線設定為使用 SSL,請在自訂參數群組中將 rds.force\ _ssl 設定為 1 (開啟)。依預設,此值設定為 0 (關閉)

在您將 rds.force_ssl 設定為 1 (開啟) 時,系統會修改資料庫執行個體的 pg_hba.conf 檔案,以支援新的 SSL 組態。若要查看 pg_hba.conf 檔案的內容摘要,請使用 pg_hba_file_rules 視圖。如需詳細資訊,請參閱 PostgreSQL 網站上的 pg_hba_file_rules

當您將 rds.force_ssl 設定為 0 (關閉) 時,pg_hba.conf 檔案看起來類似下列內容:

SELECT * FROM pg_hba_file_rules;

 line_number | type  |     database      | user_name  | address  | netmask | auth_method | options | error
-------------+-------+-------------------+------------+----------+---------+-------------+---------+-------
           4 | local | {all}             | {all}      |          |         | md5         |         |
          10 | host  | {all}             | {rdsadmin} | samehost |         | md5         |         |
          11 | host  | {all}             | {rdsadmin} | all      |         | reject      |         |
          12 | host  | {rdsadmin}        | {all}      | all      |         | reject      |         |
          13 | host  | {all}             | {all}      | all      |         | md5         |         |
          14 | host  | {replication}     | {all}      | samehost |         | md5         |         |
          15 | host  | {rds_replication} | {all}      | all      |         | md5         |         |
(7 rows)

當您將 rds.force_ssl 設定為 1 (開啟) 時,pg_hba.conf 檔案看起來類似下列內容:

SELECT * FROM pg_hba_file_rules;

line_number |  type   |     database      | user_name  | address  | netmask | auth_method | options | error
-------------+---------+-------------------+------------+----------+---------+-------------+---------+-------
          4 | local   | {all}             | {all}      |          |         | md5         |         |
         10 | host    | {all}             | {rdsadmin} | samehost |         | md5         |         |
         11 | host    | {all}             | {rdsadmin} | all      |         | reject      |         |
         12 | host    | {rdsadmin}        | {all}      | all      |         | reject      |         |
         13 | hostssl | {all}             | {all}      | all      |         | md5         |         |
         14 | host    | {replication}     | {all}      | samehost |         | md5         |         |
         15 | hostssl | {rds_replication} | {all}      | all      |         | md5         |         |

注意:rds.force_ssl 設定為 1 (開啟) 後,line_number (13) 的類型值可能會更新為 hostssl

在執行個體上啟用 SSL 連線並啟動 PostgreSQL 執行個體的 RDS 連線之後,您會看到類似下列內容的訊息:

psql "host=myinstance.123456789012.rds-us-east-1.amazonaws.com port=5432 user=testuser dbname=testpg"
. . .
SL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
Type "help" for help.

拒絕所有非 SSL 連線,並顯示下列訊息:

psql "host=myinstance.123456789012.rds-us-east-1.amazonaws.com port=5432 user=testuser dbname=testpg sslmode=disable"psql: FATAL: no pg_hba.conf entry for host "host.ip", user "testuser", database "testpg", SSL off

相關資訊

使用 SSL/TLS 來加密資料庫執行個體或叢集的連線