RDS SQL Server的SSL(Secure Socket Layer)加密功能用於對傳輸中的資料進行加密,適用於增強RDS內外網串連的安全性、或滿足各類安全合規等情境。您可以使用阿里雲提供的認證或使用者自訂認證對傳輸中的資料進行加密,同時還支援對內網鏈路強制進行SSL加密,能有效保障資料在傳輸過程中的機密性。
功能介紹
SSL加密功能可以對RDS SQL Server和用戶端之間傳輸的資料進行加密,防止資料被第三方監聽、截取和篡改。
開啟SSL加密後,用戶端串連RDS SQL Server時,可以選擇進行強制加密串連或者非加密串連。
開啟SSL加密時,RDS SQL Server將產生伺服器憑證以及公私密金鑰。
在加密串連的建立過程中,RDS SQL Server會發送伺服器憑證(包含公開金鑰)給用戶端,用戶端用收到的公開金鑰加密產生的對稱金鑰,只有RDS SQL Server有私密金鑰能夠解密該對稱金鑰,RDS SQL Server和用戶端將使用該對稱金鑰對通訊資料進行加密和解密,從而保證通訊的機密性。用戶端還可以使用CA認證驗證收到的伺服器憑證以確認RDS SQL Server身份,防止中間人攻擊。
TLS(Transport Layer Security)是SSL的後繼版本,本文統稱為SSL。
RDS SQL Server支援的TLS版本為1.0、1.1和1.2。
前提條件
使用自訂祕密金鑰加密前,需要先完成以下操作:
已開通OSS服務。
阿里雲帳號(主帳號)已授權RDS官方服務帳號可以訪問您OSS的許可權。
確保自訂認證為
pfx
格式,並上傳pfx
認證到OSS中。如何上傳,請參見OSS控制台上傳檔案、OSS API分區上傳檔案或使用ossbrowser工具上傳檔案。
注意事項
SSL的認證有效期間為1年,請在到期前更新認證有效性,否則使用加密串連的用戶端程式將無法正常串連。
開啟SSL加密、關閉SSL加密、更新SSL認證時會重啟執行個體,執行個體可能會有幾分鐘不可用,建議在業務低峰期操作。
由於SSL加密的實現原理,開啟SSL加密會顯著增加CPU使用率。建議您僅在外網鏈路有加密需求的時候啟用SSL加密,內網鏈路相對較安全,一般無需對鏈路加密。
使用限制
Serverless執行個體不支援SSL加密。
開通了讀寫分離的執行個體不支援SSL加密。
開啟了SSL的執行個體不支援升級核心小版本、建立高版本臨時執行個體操作。
1. 為RDS SQL Server開啟SSL加密
訪問RDS執行個體列表,在上方選擇地區,然後單擊目標執行個體ID。
在左側功能表列中單擊資料安全性。
在SSL標籤頁,單擊未開通前面的開關。
在設定SSL對話方塊中,選擇加密方式,並進行相關配置。
使用由阿里雲自動產生的密鑰
參數
是否必選
說明
請選擇受保護地址:
是
選擇要開通SSL加密的鏈路。支援加密內網鏈路和外網鏈路,但僅允許加密一條鏈路。
說明選擇加密外網鏈路時,需確保執行個體已開通外網地址。
是否開啟強制加密
否
開啟後將強制用戶端以加密方式串連SQL Server內網鏈路,且串連無需上傳CA認證,不再支援非加密串連方式。
支援最低TLS版本
否
選擇支援的最低TLS版本,當前支援TLS版本為1.0、1.1和1.2,低於該版本將被拒絕串連。
例如,選擇TLS 1.1,則表示服務端僅接受TLS 1.1和1.2協議版本的用戶端串連請求,通過TLS 1.0建立串連的用戶端會被拒絕串連。
使用自訂的密鑰進行加密
說明使用自訂祕密金鑰加密前,請確保已完成操作前置條件。
在上傳pfx格式認證到OSS面板中,單擊下一步。
在使用自訂祕密金鑰加密面板中,配置如下參數,並單擊下一步。
參數
說明
OSS Bucket
選擇認證所在的OSS Bucket。
認證
選擇需要的
pfx
認證。密碼
輸入認證密碼。
在設定常規選項面板中,配置如下參數。
參數
是否必選
說明
請選擇受保護地址:
是
選擇要開通SSL加密的鏈路。支援加密內網鏈路和外網鏈路,但僅允許加密一條鏈路。
說明選擇加密外網鏈路時,需確保執行個體已開通外網地址。
是否開啟強制加密
否
開啟後將強制用戶端以加密方式串連SQL Server內網鏈路,且串連無需上傳CA認證,不再支援非加密串連方式。
支援最低TLS版本
否
選擇支援的最低TLS版本,當前支援TLS版本為1.0、1.1和1.2,低於該版本將被拒絕串連。
例如,選擇TLS 1.1,則表示服務端僅接受TLS 1.1和1.2協議版本的用戶端串連請求,通過TLS 1.0建立串連的用戶端會被拒絕串連。
單擊確定,資料庫將支援SSL加密串連。
開啟SSL加密需要約1分鐘,您可以手動重新整理頁面查看執行個體狀態。
2. 下載SSL CA認證
如果不使用CA認證,您也可以通過SSL加密串連RDS SQL Server。但建議您下載並使用CA認證,它可以在SSL握手階段驗證收到的伺服器憑證,以確認RDS SQL Server的身份,避免中間人攻擊。
訪問RDS執行個體列表,在上方選擇地區,然後單擊目標執行個體ID。
在左側功能表列中單擊資料安全性。
在SSL頁簽下,單擊下載CA認證。
下載的檔案為壓縮包,包含如下三個檔案:
p7b檔案:用於Windows系統中匯入CA認證。
PEM檔案:用於其他系統或應用中匯入CA認證。
JKS檔案:Java中的truststore憑證存放區檔案,密碼統一為apsaradb,用於Java程式中匯入CA憑證鏈結。
重要在Java中使用JKS認證檔案時,jdk7和jdk8需要修改預設的jdk安全配置,在需要SSL訪問的資料庫所在機器的
jre/lib/security/java.security
檔案中,修改如下兩項配置:jdk.tls.disabledAlgorithms=SSLv3, RC4, DH keySize < 224 jdk.certpath.disabledAlgorithms=MD2, RSA keySize < 1024
若不修改jdk安全配置,會報如下錯誤。其它類似報錯,一般也都由Java安全配置導致。
javax.net.ssl.SSLHandshakeException: DHPublicKey does not comply to algorithm constraints
3. 配置SSL CA認證
在RDS SQL Server執行個體中開啟SSL加密後,應用端或用戶端在串連執行個體時需要配置SSL CA認證。本文以Microsoft SQL Server Management Studio(SSMS)為例,介紹SSL CA認證安裝方法。其它應用或者用戶端請參見對應產品的使用說明。
3.1 匯入認證
在案頭左下角搜尋方塊中輸入certmgr.msc並開啟。
在certmgr對話方塊中,滑鼠右擊可信任的根憑證授權單位。
選擇
。單擊下一步。
在認證匯入嚮導頁面中,單擊瀏覽匯入已下載的SSL CA認證,並單擊下一步。
選擇認證存放位置後,單擊下一步。
單擊完成等待認證匯入。
3.2 SSMS配置
開啟SQL Server Management Studio,單擊對話方塊右下角選項按鈕。
在串連屬性選項卡中,勾選加密串連和信任伺服器憑證,並單擊串連按鈕。
執行如下查詢,若查詢結果為TRUE,則說明串連已加密。
SELECT ENCRYPT_OPTION FROM SYS.DM_EXEC_CONNECTIONS WHERE SESSION_ID = @@SPID
附錄:通過SSL串連資料庫範例程式碼
# -*- coding:utf-8 -*-
import ssl
import pyodbc
# 建立一個SSL上下文,用於在Python中建立安全的SSL串連
context = ssl.create_default_context(purpose=ssl.Purpose.SERVER_AUTH, cafile="D:\ca\ApsaraDB-CA-Chain.pem")
# 建立串連
# SERVER指定目標資料庫伺服器的地址;DATABASE指定串連的資料庫名稱;UID指定登入資料庫所需的使用者名稱;PWD指定登入資料庫所需的密碼;Encrypt指定是否啟用SSL加密,值為yes表示啟用。
conn = pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server};SERVER=rm-2zec********.sqlserver.rds.aliyuncs.com;DATABASE=master;UID=zhttest;PWD=zht****;Encrypt=yes', ssl=context)
cursor = conn.cursor()
cursor.execute('SELECT @@version')
rows = cursor.fetchall()
for row in rows:
print(row)
# 關閉串連
conn.close()
using System;
using System.Data.SqlClient;
namespace SqlConnectionSSLExample
{
class Program
{
static void Main(string[] args)
{
// 建立串連
// Data Source指定目標SQL Server資料庫伺服器的地址;Initial Catalog指定串連的目標資料庫名稱;User ID指定串連資料庫所需的使用者名稱;Password指定串連資料庫所需的密碼;Encrypt指定是否啟用SSL加密傳輸,值為true表示啟用。
string connectionString = "Data Source=rm-2ze********.sqlserver.rds.aliyuncs.com;Initial Catalog=master;User ID=zhttest;Password=zht****;Encrypt=true;";
using (SqlConnection connection = new SqlConnection(connectionString))
{
// 開啟串連
connection.Open();
try
{
// 執行SQL查詢
SqlCommand cmd = new SqlCommand("SELECT @@version", connection);
string result = cmd.ExecuteScalar().ToString();
Console.WriteLine(result);
}
catch (Exception ex)
{
Console.WriteLine($"Error: {ex.Message}");
}
}
}
}
}
相關API
更多操作
更新認證有效期間
RDS SQL Server的SSL認證有效期間為1年,認證到期後不更新,會導致使用加密串連的用戶端程式無法正常串連執行個體。即將到期時,阿里雲將會通過郵件、站內信(事件中心)的方式提醒使用自訂認證開啟SSL的使用者。請在到期前更新認證有效期間,以確保用戶端程式能夠正常串連。
更新有效期間操作將會重啟執行個體,執行個體可能會有幾分鐘不可用,重啟前請做好業務安排,謹慎操作。
訪問RDS執行個體列表,在上方選擇地區,然後單擊目標執行個體ID。
在左側導覽列單擊資料安全性。
選擇SSL頁簽,單擊更新有效期間。
關閉SSL加密
關閉SSL加密會重啟RDS執行個體,系統會觸發主備切換降低影響,建議您在業務低峰期操作。
關閉SSL加密後,資料庫訪問效能會有一定程度提升,但安全性上有削弱,因此非安全環境下不建議關閉SSL加密。
關閉SSL加密後,僅支援通過非SSL方式串連。
訪問RDS執行個體列表,在上方選擇地區,然後單擊目標執行個體ID。
在左側導覽列單擊資料安全性。
選擇SSL標籤頁。
單擊已開通前面的開關,在彈出的提示框中單擊確定。
查看串連加密情況
在SQL Server中,可以執行如下命令查看當前串連是否已啟用了SSL加密串連:
SELECT session_id,encrypt_option
FROM sys.dm_exec_connections;
GO
如果在查詢sys.dm_exec_connections
系統動態管理檢視時,返回當前串連的會話ID,並且encrypt_option
的值為true
,則說明該串連已經成功開啟了SSL加密。
常見問題
Q:SSL認證到期後不更新會有什麼影響?會影響執行個體運行或資料安全嗎?
A:SSL認證到期後不更新,僅會導致使用加密串連的用戶端程式無法正常串連執行個體,但不會影響執行個體運行或資料安全。