RDS MySQL的SSL(Secure Socket Layer)加密功能用於對傳輸中的資料進行加密,適用於增強RDS串連安全性或者滿足安全合規等情境。RDS MySQL執行個體的SSL預設處於關閉狀態。
前提條件
RDS MySQL執行個體系列和版本如下:
高可用系列:8.0、5.7、5.6
叢集系列:8.0、5.7
基礎版系列:8.0、5.7
您可以前往執行個體基本資料頁面查看以上資訊。
非Serverless基礎系列執行個體轉換為Serverless基礎系列執行個體,SSL需要再次開啟。
符合上述條件的執行個體中,有部分執行個體會報錯不支援SSL。如遇到該報錯,請升級核心小版本後再重試。
功能介紹
SSL加密功能可以對RDS MySQL和用戶端之間傳輸的資料進行加密,防止資料被第三方監聽、截取和篡改。
開啟SSL加密後,用戶端串連RDS MySQL時,可以選擇進行加密串連或者非加密串連。
開啟SSL加密時,RDS MySQL將產生伺服器憑證以及公私密金鑰。
在加密串連的建立過程中,RDS MySQL會發送伺服器憑證(包含公開金鑰)給用戶端,用戶端用收到的公開金鑰加密產生的對稱金鑰,只有RDS MySQL有私密金鑰能夠解密該對稱金鑰,RDS MySQL和用戶端將使用該對稱金鑰對通訊資料進行加密和解密,從而保證通訊的機密性。用戶端還可以使用CA認證驗證收到的伺服器憑證以確認RDS MySQL身份,防止中間人攻擊。
RDS MySQL執行個體支援的SSL鏈路加密配置及功能對比如下:
對比項 | ||
擷取方式 | 設定資料庫雲端認證 | 由認證認證機構發或自我簽署憑證頒發 |
認證有效期間 | 365天 | 由您自訂 |
保護的串連地址數 | 1個 | 1個 |
認證作用 | 開啟SSL鏈路加密,用戶端驗證服務端真偽。 | 開啟SSL鏈路加密,用戶端驗證服務端真偽。 |
影響
開啟SSL加密、關閉SSL加密、更新認證(MySQL 5.6、5.7版本)會重啟執行個體,RDS服務會出現執行個體切換,建議在業務低峰期操作,並確保您的應用有自動重連機制,自動重連需要在您的應用側代碼中設定。MySQL 8.0版本更新認證不會重啟執行個體。執行個體切換的影響請參見執行個體切換的影響。
開啟SSL加密後,建立加密串連會顯著增加CPU使用率。建議您僅在外網鏈路有加密需求的時候採用SSL加密,內網鏈路相對較安全,一般無需對鏈路加密。
TLS 版本說明
TLS(Transport Layer Security)是一種被廣泛採用的傳輸層安全性協議,用來保障互連網通訊的私密性和資料安全性。TLS協議有很多版本,RDS MySQL不同大版本對TLS的支援情況如下:
RDS MySQL版本 | TLSv1.0 | TLSv1.1 | TLSv1.2 | TLSv1.3 |
8.0 | 支援 | 支援 | 支援 | 支援 (自20221231版本起) |
5.7 | 支援 | 支援 | 支援 | 不支援 |
5.6 | 支援 | 支援 | 支援 | 不支援 |
TLSv1.0和TLSv1.1已經在2021年被IETF廢棄( RFC8996),出於安全性考慮,推薦使用TLSv1.2及以上的TLS協議進行安全通訊。
ssl_cipher預設配置說明
RDS MySQL使用OpenSSL實現TLS的安全通訊。RDS MySQL在5.7的20230831和8.0的20230930版本中,升級了OpenSSL版本到3.0,此版本預設不再支援通過TLSv1.0和TLSv1.1進行通訊(詳見OpenSSL官方文檔)。
出於相容性考慮,RDS MySQL通過調整ssl_cipher參數預設值為 "ALL:@SECLEVEL=0"
,恢複了對TLSv1.0和TLSv1.1的支援。
如果您的業務確認只使用TLSv1.2及以上版本的TLS協議,建議您在RDS控制台設定ssl_cipher參數為 ""
(空串),以獲得更高的安全層級保障。
步驟一:為RDS MySQL開啟SSL加密
訪問RDS執行個體列表,在上方選擇地區,然後單擊目標執行個體ID。
在左側導覽列單擊資料安全性。
在SSL頁簽下,單擊未開通前面的滑塊開關。
說明如果沒有找到SSL頁簽,請重新確認本文的前提條件。
在彈出的對話方塊中選擇要開通SSL加密的地址,單擊確定,開通SSL加密。
您可以根據需要,選擇加密內網鏈路或者外網鏈路,但只可以選擇一條鏈路。
開通SSL加密需要約1分鐘,您可以手動重新整理頁面查看執行個體狀態。
步驟二:下載CA認證
開啟雲端認證後,RDS MySQL資料庫提供資料庫CA認證供您下載,當您通過用戶端遠端連線RDS MySQL資料庫時,使用資料庫CA認證可以對資料庫真偽進行校正。
訪問RDS執行個體列表,在上方選擇地區,然後單擊目標執行個體ID。
單擊左側導覽列資料安全性,在SSL頁簽下,單擊下載CA認證。
下載的檔案為壓縮包,包含如下三種CA檔案:
PEM檔案:適用於絕大部分情境。
JKS檔案:PEM格式CA認證通常需要匯入到truststore,即轉換為JKS檔案才能在Java中使用。您可以在Java程式中使用此JKS檔案,密碼為apsaradb。
p7b檔案:適用於少數要求PKCS #7認證檔案的Windows應用。
步驟三:從用戶端串連RDS MySQL
開啟SSL加密後,用戶端和RDS MySQL之間的串連是否加密與用戶端的類型和設定有關。例如,用戶端可能預設採用加密串連。您可以修改用戶端的設定或代碼,要求建立加密串連以及驗證RDS MySQL的身份。
命令列
對於MySQL 5.7.11及以後版本的用戶端,在串連命令中添加--ssl-mode選項可以設定SSL加密。
對於MariaDB用戶端以及MySQL 5.7.11之前的用戶端,請使用--ssl和--ssl-verify-server-cert等選項。具體請參見MariaDB和MySQL官方文檔。
--ssl-mode=DISABLED表示串連不加密。
--ssl-mode=PREFERRED或者不添加--ssl-mode選項,表示嘗試加密串連,如果無法加密則採用非加密串連。
--ssl-mode=REQUIRED,表示必須加密串連,如果無法加密則串連失敗。
--ssl-mode=VERIFY_CA,表示必須加密串連,並用本地的CA認證驗證伺服器憑證是否有效。
--ssl-mode=VERIFY_IDENTITY,表示必須加密串連,並用本地的CA認證驗證伺服器憑證是否有效,並驗證伺服器憑證的主機名稱或IP地址是否與實際串連的主機名稱或IP地址匹配。
樣本一:嘗試加密串連,如果無法加密則採用非加密串連。
mysql -h {RDS串連地址} -u {RDS帳號} -p --ssl-mode=PREFERRED
樣本二:要求加密串連,並驗證伺服器憑證的有效性。
mysql -h {RDS串連地址} -u {RDS帳號} -p --ssl-mode=VERIFY_CA --ssl-ca={CA憑證路徑}/ApsaraDB-CA-Chain.pem
上述樣本裡的{RDS串連地址}、{RDS帳號}和{CA憑證路徑}需替換為實際的值。
更多關於--ssl-mode選項的說明,請參見MySQL官方文檔。
MySQL Workbench
開啟MySQL Workbench,選擇
。填寫RDS串連地址和帳號密碼。
在SSL頁簽下,設定Use SSL參數,指定SSL CA File為下載的PEM格式CA認證,然後單擊Test Connection或者OK。
關於Use SSL參數的選項,可以參考命令列串連方式的--ssl-mode說明。
DMS
在DMS中錄入RDS MySQL執行個體時,可設定開啟SSL參數。具體操作,請參見雲資料庫錄入。
也可以在已錄入的執行個體上右鍵,選擇編輯執行個體,然後在進階資訊中設定。
應用程式代碼
Java
Connector/J(mysql-connector-java)是MySQL官方提供的JDBC驅動程式。本樣本使用mysql-connector-java 8.0.19版本作為依賴。
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.19</version>
</dependency>
以下範例程式碼使用sslMode屬性指定SSL模式。mysql-connector-java從8.0.13版本開始支援該屬性,如果您使用更早的版本,則需要改為使用useSSL、requireSSL和verifyServerCertificate屬性,具體請參見MySQL文檔。
範例程式碼:
package com.aliyun.sample;
import com.mysql.cj.jdbc.MysqlDataSource;
import java.sql.Connection;
import java.sql.SQLException;
public class Sample {
public static void main(String[] args) {
Connection conn = null;
MysqlDataSource mysqlDS=null;
try{
mysqlDS = new MysqlDataSource();
//可按需設定SslMode。關於該屬性的選項,請參見命令列串連方式的說明。
mysqlDS.setSslMode("VERIFY_IDENTITY");
//truststore用於儲存CA認證,這裡設定truststore類型為JKS。
mysqlDS.setTrustCertificateKeyStoreType("JKS");
// 請將file:/後面的路徑改為您的ApsaraDB-CA-Chain.jks檔案的路徑。
mysqlDS.setTrustCertificateKeyStoreUrl("file:/D:\\ApsaraDB-CA-Chain\\ApsaraDB-CA-Chain.jks");
// 下載的JKS檔案的密碼為apsaradb,不能修改。
mysqlDS.setTrustCertificateKeyStorePassword("apsaradb");
// 您的資料庫連接串
mysqlDS.setServerName("rm-xxxxxx.mysql.rds.aliyuncs.com");
// 您的資料庫連接埠
mysqlDS.setPort(3306);
// 您的資料庫帳號
mysqlDS.setUser("xxxxxx");
// 您的資料庫密碼
mysqlDS.setPassword("xxxxxx");
// 您的資料庫名
mysqlDS.setDatabaseName("xxxxxx");
conn = mysqlDS.getConnection();
}catch(Exception e){
e.printStackTrace();
} finally {
try {
if (conn != null)
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
Python
# 安裝pymysql pip install pymysql
import pymysql
try:
ssl_config = {"ca":"/path/to/path/ca.crt", "mode":"VERIFY_CA"} # ca為認證的路徑,mode為ssl-mode
conn = pymysql.connect(host='******.mysql.rds.aliyuncs.com', user='*****', passwd='******', db='*****', ssl=ssl_config)
cursor = conn.cursor()
cursor.execute('select version()')
data = cursor.fetchone()
print('Database version:', data[0])
cursor.close()
except pymysql.Error as e:
print(e)
更多操作
更新雲端認證
RDS MySQL伺服器雲端認證有效期間為1年,認證到期後不更新,會導致使用加密串連的用戶端程式無法正常串連執行個體。即將到期時,阿里雲將會通過郵件、站內信(事件中心)的方式進行提醒,RDS MySQL雲端認證會在特定時間段自動更新。您可以通過配置計劃時間配置自訂認證更新時間。更多資訊,請參見計劃內事件。您也可以通過以下方式手動補救伺服器認證的有效期間。
雲端認證自動更新後,使用加密串連的用戶端程式無需重新下載和配置CA認證即可正常串連資料庫。
若您需要更新自訂認證,請參見更新自訂認證。
MySQL 8.0版本更新認證不會重啟執行個體,MySQL 5.6、5.7版本更新認證會重啟執行個體。
訪問RDS執行個體列表,在上方選擇地區,然後單擊目標執行個體ID。
在左側導覽列單擊資料安全性。
選擇SSL頁簽,單擊更新有效期間。
查看串連加密情況
查看當前會話使用的密碼套件。如果返回的Value不為空白,表示當前串連是加密的。
SHOW STATUS LIKE 'Ssl_cipher';
查看當前會話使用的SSL/TLS版本。
SHOW STATUS LIKE 'Ssl_version';
如果是MySQL命令列,還可以執行
\s
來查看當前串連是否加密。如果當前為加密串連,返回的SSL值為當前使用的密碼套件。
強制加密串連
設定服務端只允許加密串連
目前不支援。
設定用戶端只允許加密串連
以命令列為例,在串連命令中設定SSL模式為REQUIRED、VERIFY_CA或VERIFY_IDENTITY,表示只允許加密串連,如果無法加密,則串連失敗。
設定特定使用者只允許加密串連
例如,以下命令用於設定testuser帳號只允許加密串連。
ALTER USER 'testuser'@'%' REQUIRE SSL;
查看CA認證內容
執行以下命令可以查看CA認證的內容。
openssl x509 -in {CA憑證路徑}/ApsaraDB-CA-Chain.pem -text
關閉SSL加密
關閉SSL加密會重啟RDS執行個體,系統會觸發主備切換降低影響,但仍建議您在業務低峰期操作。
訪問RDS執行個體列表,在上方選擇地區,然後單擊目標執行個體ID。
在左側導覽列單擊資料安全性。
選擇SSL標籤頁。
單擊已開通前面的開關,在彈出的提示框中單擊確定。
常見問題
功能諮詢
Q1:如何?雙向驗證?即除了驗證服務端身份,也驗證用戶端身份。
A:RDS MySQL目前不支援在SSL握手時驗證用戶端身份。您可以通過白名單設定、帳號管理來實現存取控制。
Q2:如何加密讀寫分離地址?
A:請參見設定代理SSL加密。
Q3:如何關閉已開啟的SSL。
A:請參見關閉SSL加密。