重要
標記(預覽)的功能、能力或屬性不受服務等級協議涵蓋,也不建議用於生產工作負載,且在正式上架前可能會有所變動或受限。
Azure AI 搜尋服務 預覽條款適用於所有預覽功能,無論是獨立功能還是正式推出功能的一部分。
啟用客戶管理金鑰(CMK)在使用Microsoft管理金鑰時,除了預設的靜態加密外,還能增加額外的安全性。 啟用 CMK 後,您可控制用於保護資料的加密金鑰,包括以下功能:
- 依照客戶定義的排程輪換金鑰
- 停用或撤銷金鑰以阻止存取加密內容 (快取金鑰可能持續長達 60 分鐘)
- 通過 Azure Key Vault 記錄審核金鑰使用情況
您可以透過以下任一方式建立、儲存和管理金鑰:
本文說明如何在 Azure AI 搜尋服務 中設定 CMK,以進一步保護加密資料。
重要
- 新增客戶管理金鑰(CMK)適用於靜態資料的加密。 如果你需要保護正在使用的資料,可以考慮使用 機密運算。
先決條件
位於可計費層級 (任何區域中的 Basic 或更高層級) 的 Azure AI 搜尋服務。
Azure Key Vault,以及啟用了軟刪除和清除保護的金鑰庫。 或者,Azure Key Vault 託管硬體安全模組 (HSM)。 此資源可以位於任何訂用帳戶,也可以位於不同租用戶中。 這些指令假設只有一個租戶。 關於跨租戶設定,請參見 「跨不同租戶配置客戶管理金鑰」。
如果你打算設定服務層級的 CMK,請使用 Search Management REST API 版本 2026-03-01-preview 或更新版本。 要檢查物件是否繼承服務層級金鑰,請使用資料平面 API 版本 2026-05-01-preview 或更新版本。
能夠設定金鑰存取權限及分配角色。 要建立金鑰,您必須在Azure Key Vault中擔任金鑰保存庫加密官員,或在Azure Key Vault受管理的HSM中擔任受管理HSM加密官員。
要指派角色,您必須是訂閱擁有者、使用者存取管理員、基於角色的存取控制管理員,或被指派為自訂角色,具有Microsoft.Authorization/roleAssignments/write權限。
可設定為客戶管理金鑰(CMK)的加密資料物件包括索引、同義詞列表、索引器、資料來源、向量器及技能集。 加密解密計算成本高,因此只有敏感內容會被加密。
加密方式如下:
物件在新建立時,必須新增客戶管理的金鑰。 重要的是要記住:
你不能事後將 CMK 加入現有物件。 如果你想在現有物件上新增客戶管理的金鑰,必須刪除並啟用加密後重新建立該物件。
一旦設定好 CMK,每次服務寫入資料時都會進行加密,包括靜態資料(長期儲存)或暫存快取資料(短期儲存)。 對於像資料來源、索引器和技能集這類物件,物件定義會被加密。 對於索引,索引文件本身(不只是索引結構)會被加密。
雖然你無法對現有物件加加密,但只要資源在同一租戶中,你可以更改物件加密定義的所有部分,包括切換到不同的金鑰庫或 HSM 儲存。
CMK 的加密是不可逆的。 你可以旋轉金鑰並更改 CMK 設定,但索引加密會持續到索引的整個壽命。 在使用 CMK 加密後,只有當搜尋服務擁有金鑰存取權時,索引才能被存取。 如果你透過刪除或更改角色指派來撤銷對金鑰的存取權,索引將無法使用,服務無法擴展,除非索引被刪除或金鑰存取權被恢復。 如果您刪除或輪替金鑰,則系統最多會將最新的金鑰快取 60 分鐘。
如果你在搜尋服務中要求 CMK,請設定執行政策。
使用 Azure 原則 強制執行的 CMK 和服務層級的 CMK 配置(該功能仍處於預覽階段)是互相獨立的設定。 你可以根據需求使用其中一種或兩種。 服務層級的 CMK 設定會對新物件套用預設金鑰,而 Azure 原則 強制執行則確保所有物件符合加密要求。 如果你啟用 CMK 強制政策但沒有服務層級金鑰,所有啟用 CMK 的物件在建立時必須指定自己的加密金鑰。 未包含 CMK 設定的物件建立請求失敗。
預設在新物件上啟用服務層級 CMK(預覽版)
從 2026-03-01 預覽版開始,你可以在 Azure AI 搜尋服務 服務本身的服務層級設定由客戶管理的金鑰。 這個功能讓你只需設定一次金鑰,就能預設套用到所有新建立的物件上。 這種保護能用你控制的金鑰保護搜尋服務中的敏感資料,且不需要每次建立物件時都指定金鑰資訊。 在資料平面 API 版本 2026-05-01-preview 及更新版本中,encryptionKey 上的 isServiceLevelKey 屬性可協助您判斷物件是繼承服務層級金鑰,還是使用明確指定的物件層級金鑰。
在服務層級啟用 CMK 意味著:
你可以透過為你建立的物件指定一個新的鍵來覆蓋這個預設鍵。 你指定的物件層級金鑰會覆蓋該物件的預設服務層級金鑰。
在服務層級與物件層級 CMK 之間選擇
預設使用服務層級的 CMK,將單一鍵套用於所有物件上。 你設定一次金鑰,新的物件就會自動繼承這項保護。
對於需要獨立金鑰生命週期的工作負載,請使用物件層級 CMK。 現有的物件層級 CMK 配置則持續運作,無需做更動。 服務層級 CMK 簡化了金鑰管理,但並不能取代物件層級的 CMK。
企業常見的模式是為大多數物件(索引、索引器、資料來源、技能集、向量器及同義映射)配置服務層級金鑰。 對於符合規範要求較嚴格的工作負載,可以設定物件層級金鑰來獨立管理存取、輪替與撤銷。
步驟 1:建立加密金鑰
請使用 Azure Key Vault 或 Azure Key Vault Managed HSM 來建立金鑰。 Azure AI 搜尋服務 加密支援大小為 2048、3072 和 4096 的 RSA 金鑰。 欲了解更多支援金鑰類型,請參閱 關於金鑰。
我們建議你在開始前先檢視 這些建議 。
所需的操作包括 包裝、 解包、 加密與 解密。
你可以使用 Azure portal、Azure CLI 或 Azure PowerShell 來建立金鑰庫。
進入Azure傳送門的鑰匙庫。
選擇左側的 物件>鍵, 然後選擇 產生/匯入。
在 「建立金鑰 」面板中,從 選項清單中選擇 「生成 」以建立新金鑰。
輸入你的鍵 名稱 ,並接受其他鍵屬性的預設值。
可選擇設定按鍵旋轉政策以 啟用自動旋轉。
選擇 建立 以開始部署。
建立金鑰後,取得其金鑰識別碼。 選擇金鑰,選擇目前版本,然後複製金鑰識別碼。 它由 鍵值 Uri、 鍵名和 鍵版本組成。 你需要識別碼來定義 Azure AI 搜尋服務 中的加密索引。 請記得所需的操作包括 Wrap、 Unwrap、 Encrypt 和 Decrypt。
步驟 2:建立安全原則
建立一個安全主體,讓你的搜尋服務用來存取加密金鑰。 你可以使用管理身份與角色指派,或註冊應用程式,讓搜尋服務在請求時提供該應用程式 ID。
使用受管理的身份和角色。 你可以使用系統管理身份或使用者管理身份。 管理身份讓你的搜尋服務能透過 Microsoft Entra ID 進行認證,而不必在程式碼中儲存憑證(ApplicationID 或 ApplicationSecret)。 這類受管身份的生命週期與搜尋服務的生命週期相關,而搜尋服務只能有一個系統指派的管理身份。 欲了解更多關於受管理身份的運作方式,請參閱 什麼是Azure資源的受管理身份。
啟用系統自動指派的管理識別以用於您的搜尋服務。 這是兩鍵操作:啟用並儲存。
你可以使用 Azure 入口網站或搜尋管理 REST API 建立使用者指派的管理身份,並將該身份分配給你的搜尋服務。 欲了解更多資訊,請參閱 建立使用者指派的管理身份。
如果您無法使用角色指派來讓搜尋服務存取加密金鑰,請遵循以下指示。
在 Azure 入口網站,找到您訂閱的Microsoft Entra資源。
在左側,在Manage下方,選擇應用程式註冊,然後選擇新註冊。
輸入註冊名稱,例如與搜尋應用程式名稱相似的名稱。 選擇 登記。
應用程式註冊完成後,複製應用程式 ID。 請將這串字串提供給你的應用程式。
如果你正在逐步執行 DotNetHowToEncryptionUsingCMK,請將此值貼上到 appsettings.json 檔案中。
接著,選擇 「憑證與秘密」。
選擇 新客戶端秘密。 輸入秘密的顯示名稱並選擇 新增。
複製應用程式密鑰。 如果您逐步執行範例,請將此值貼到 appsettings.json 檔案中。
步驟三:授予權限
如果你設定搜尋服務使用管理身份,請指派角色讓它能存取加密金鑰。
建議採用基於角色的存取控制,而非存取政策權限模型。 欲了解更多資訊或遷移步驟,請從 Azure 角色基礎存取控制(Azure RBAC)與存取政策(舊有) 開始。
進入Azure傳送門的鑰匙庫。
選擇 存取控制(IAM), 並選擇 新增角色指派。
選擇角色:
- 在Azure Key Vault中,選擇 金鑰保存庫 加密服務加密用戶。
- 在 Managed HSM 中,選擇 「Managed HSM 加密服務加密使用者」。
選擇受管理身份,選擇成員,然後選擇你搜尋服務的受管理身份。 如果你是在本地測試,務必也把這個角色分配給自己。
選擇 檢視 + 指派。
等幾分鐘,角色分配開始運作。
金鑰保存庫 防火牆與 CMK 虛擬網路存取
Azure AI 搜尋服務 必須能夠存取你 Azure Key Vault 中的加密金鑰。
如果你的金鑰庫有防火牆或虛擬網路限制,請設定以下選項之一:
啟用可信服務繞過後,Azure AI 搜尋服務 可透過管理身份以受信任服務身份存取金鑰,即使公共網路存取受限。
如果防火牆阻擋存取且未啟用可信服務繞過,Azure AI 搜尋服務 就無法取得金鑰,且依賴 CMK 的操作會失敗。
當你建立加密物件時,輸入金鑰庫的 URI、金鑰名稱和金鑰版本。 如果你使用 Microsoft Entra ID 應用程式進行認證,也請輸入應用程式 ID 和秘密密碼。
要在搜尋物件中新增由客戶管理的金鑰,可以是索引、索引器、資料來源、技能集、向量器或同義映射,你可以在 服務層 級或 物件層級設定這個鍵。
服務層級:透過在服務層級設定客戶管理的金鑰,該金鑰會預設套用於所有新建立的搜尋物件。 它不適用於既有的搜尋物件。
物件層級:在建立新搜尋物件時,你也可以在物件層級定義一個新的、唯一的鍵。 此物件層級金鑰定義會覆蓋預設的服務層級金鑰。
警告
在更新客戶管理的金鑰設定時,無論是服務層級還是物件層級的金鑰定義,請保留先前設定的資源,直到更新在整個服務中傳播。 移除身份、刪除金鑰庫或過早撤銷金鑰,會阻止部分服務元件解密仍依賴先前設定的資料。
要在物件上設定 CMK,請使用 Azure 入口網站、Search Service REST API 或 Azure SDK。
當你在 Azure 入口網站建立新物件時,可以在金鑰庫中指定一個預先定義的客戶管理金鑰。 Azure 入口網站允許你啟用 CMK 加密功能:
要使用 Azure 入口網站,必須有金鑰庫和金鑰,且你必須完成前述步驟以獲得授權存取金鑰。
在 Azure 入口網站中,技能集是在 JSON 視圖中定義的。 使用 REST API 範例中展示的 JSON 來提供一個由客戶管理的技能組金鑰。
在Azure 入口網站中,進入您的搜尋服務。
在 搜尋管理中,選擇 索引、 索引器或 資料來源。
新增一個物件。 在物件定義中,選擇Microsoft管理加密。
選擇 客戶管理的金鑰 ,並選擇你的訂閱、保險庫、金鑰和版本。
呼叫建立 API 以指定 encryptionKey 屬性:
將 encryptionKey 結構插入物件定義中。 此屬性屬於一級屬性,與名稱及描述同層級。 如果你使用相同的保險庫、金鑰和版本,你可以在每個物件定義中貼上相同的 encryptionKey 結構。
如果你的金鑰識別碼是 https://contoso-keyvault.vault.azure.net/keys/contoso-cmk/aaaaaaaa-0b0b-1c1c-2d2d-333333333333,則 URI 為 https://contoso-keyvault.vault.azure.net,金鑰名稱為 contoso-cmk,版本為 aaaaaaaa-0b0b-1c1c-2d2d-333333333333。
{
"encryptionKey": {
"keyVaultUri": "<YOUR-KEY-VAULT-URI>",
"keyVaultKeyName": "<YOUR-ENCRYPTION-KEY-NAME>",
"keyVaultKeyVersion": "<YOUR-ENCRYPTION-KEY-VERSION>",
"identity" : {
"@odata.type": "#Microsoft.Azure.Search.DataUserAssignedIdentity",
"userAssignedIdentity" : "/subscriptions/<your-subscription-ID>/resourceGroups/<your-resource-group-name>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<your-managed-identity-name>"
}
}
}
第一個範例展示了一個用於使用管理身份連接的搜尋服務的加密金鑰:
{
"encryptionKey": {
"keyVaultUri": "<YOUR-KEY-VAULT-URI>",
"keyVaultKeyName": "<YOUR-ENCRYPTION-KEY-NAME>",
"keyVaultKeyVersion": "<YOUR-ENCRYPTION-KEY-VERSION>"
}
}
第二個例子包含 accessCredentials,若你以 Microsoft Entra ID 註冊應用程式,這是必要的:
{
"encryptionKey": {
"keyVaultUri": "<YOUR-KEY-VAULT-URI>",
"keyVaultKeyName": "<YOUR-ENCRYPTION-KEY-NAME>",
"keyVaultKeyVersion": "<YOUR-ENCRYPTION-KEY-VERSION>",
"accessCredentials": {
"applicationId": "<YOUR-APPLICATION-ID>",
"applicationSecret": "<YOUR-APPLICATION-SECRET>"
}
}
}
透過對物件發出 GET 來驗證加密金鑰是否存在。
透過執行任務來驗證物件是否運作,例如查詢加密的索引。
在搜尋服務建立加密物件後,你可以像使用其他同類物件一樣使用它。 加密對使用者和開發者來說是透明的。
這些金鑰保險庫的細節都不被視為機密,且可透過瀏覽 Azure 入口網站中相關的 Azure Key Vault 頁面輕鬆取得。
搜尋物件上的 CMK 設定支援於 Azure SDK 套件中,包括 Azure SDK for .NET、Azure SDK for Java、Azure SDK for JavaScript,以及 Azure SDK for Python。
以下範例展示了物件定義中的encryptionKey表示法。 同樣的定義也適用於索引、資料來源、技能集、索引器以及同義映射。 若要在搜尋服務和金鑰保存庫上嘗試此範例,請從 azure-search-python-samples (英文) 下載筆記本。
安裝一些套件。
! pip install python-dotenv
! pip install azure-core
! pip install azure-search-documents==11.5.1
! pip install azure-identity
建立一個帶有加密金鑰的索引。
from azure.search.documents.indexes import SearchIndexClient
from azure.search.documents.indexes.models import (
SimpleField,
SearchFieldDataType,
SearchableField,
SearchIndex,
SearchResourceEncryptionKey,
)
from azure.identity import DefaultAzureCredential
endpoint = "<PUT YOUR AZURE SEARCH SERVICE ENDPOINT HERE>"
credential = DefaultAzureCredential()
index_name = "test-cmk-index"
index_client = SearchIndexClient(endpoint=AZURE_SEARCH_SERVICE, credential=credential)
fields = [
SimpleField(name="Id", type=SearchFieldDataType.String, key=True),
SearchableField(name="Description", type=SearchFieldDataType.String),
]
encryption_key = SearchResourceEncryptionKey()
encryption_key.vault_uri = "<PUT YOUR KEY VAULT URI HERE>"
encryption_key.key_name = "<PUT YOUR KEY VAULT KEY NAME HERE>"
encryption_key.key_version = "<PUT YOUR ALPHANUMERIC KEY VERSION HERE>"
index = SearchIndex(name=index_name, fields=fields, encryption_key=encryption_key)
result = index_client.create_or_update_index(index)
print(f"{result.name} created")
取得索引定義以驗證加密金鑰設定的存在。
index_name = "test-cmk-index"
index_client = SearchIndexClient(endpoint=AZURE_SEARCH_SERVICE, credential=credential)
result = index_client.get_index(index_name)
print(f"{result}")
將幾份文件載入索引。 所有現場內容都被視為敏感,並會用你的客戶管理金鑰加密在磁碟上。
from azure.search.documents import SearchClient
# Create a documents payload
documents = [
{
"@search.action": "upload",
"Id": "1",
"Description": "The hotel is ideally located on the main commercial artery of the city in the heart of New York. A few minutes away is Time's Square and the historic centre of the city, as well as other places of interest that make New York one of America's most attractive and cosmopolitan cities."
},
{
"@search.action": "upload",
"Id": "2",
"Description": "The hotel is situated in a nineteenth century plaza, which has been expanded and renovated to the highest architectural standards to create a modern, functional and first-class hotel in which art and unique historical elements coexist with the most modern comforts."
},
{
"@search.action": "upload",
"Id": "3",
"Description": "The hotel stands out for its gastronomic excellence under the management of William Dough, who advises on and oversees all of the Hotel's restaurant services."
},
{
"@search.action": "upload",
"Id": "4",
"Description": "The hotel is located in the heart of the historic center of Sublime in an extremely vibrant and lively area within short walking distance to the sites and landmarks of the city and is surrounded by the extraordinary beauty of churches, buildings, shops and monuments. Sublime Palace is part of a lovingly restored 1800 palace."
}
]
search_client = SearchClient(endpoint=AZURE_SEARCH_SERVICE, index_name=index_name, credential=credential)
try:
result = search_client.upload_documents(documents=documents)
print("Upload of new document succeeded: {}".format(result[0].succeeded))
except Exception as ex:
print (ex)
index_client = SearchClient(endpoint=AZURE_SEARCH_SERVICE, credential=credential)
執行查詢以確認索引是否運作。
from azure.search.documents import SearchClient
query = "historic"
search_client = SearchClient(endpoint=AZURE_SEARCH_SERVICE, credential=credential, index_name=index_name)
results = search_client.search(
query_type='simple',
search_text=query,
select=["Id", "Description"],
include_total_count=True
)
for result in results:
print(f"Score: {result['@search.score']}")
print(f"Id: {result['Id']}")
print(f"Description: {result['Description']}")
查詢的輸出應該會產生類似以下範例的結果。
Score: 0.6130029
Id: 4
Description: The hotel is located in the heart of the historic center of Sublime in an extremely vibrant and lively area within short walking distance to the sites and landmarks of the city and is surrounded by the extraordinary beauty of churches, buildings, shops and monuments. Sublime Palace is part of a lovingly restored 1800 palace.
Score: 0.26286605
Id: 1
Description: The hotel is ideally located on the main commercial artery of the city in the heart of New York. A few minutes away is Time's Square and the historic centre of the city, as well as other places of interest that make New York one of America's most attractive and cosmopolitan cities.
由於加密內容會在資料刷新或查詢前解密,因此你不會看到加密的視覺證據。 要確認加密是否有效,請查看資源日誌。
重要
Azure AI 搜尋服務 中的加密內容會設定使用特定金鑰和特定的 version。 如果您變更金鑰或版本,則必須更新物件才能使用它 (在您刪除舊的之前)。 若未做到,該物件將無法使用。 如果金鑰遺失,你就無法解密內容。
要啟用服務層級的 CMK 設定,請使用 Search Management REST API 或已更新以支援 2026-03-01-preview 版本或更新版本的 Azure SDK。 Azure 入口網站目前尚未支援此功能。 當你在服務層啟用 CMK 時,你不會對現有物件加加密,但除非你指定不同的物件層級金鑰來覆蓋服務層級預設值,否則你會預設對所有新建立的物件套用相同的金鑰。
目前,Azure 入口網站不支援服務層級加密。 直接使用 REST API。
若要在您的搜尋服務中以服務層級的 CMK 配置加密,請使用 Services - 建立或更新 並利用 PATCH 來更新現有的搜尋服務或使用 PUT 來建立新的搜尋服務。 API 版本必須是 2026-03-01-preview 或更新版本,才能支援服務層級設定。
在此範例中,確保將 {{subscription-id}}、{{resource-group}}、{{search-service}} 和 {{token}} 分別替換成你的訂閱 ID、資源群組名稱、搜尋服務名稱和存取權杖。 關鍵定義使用與物件層級 CMK 相同的結構,且支援三種身份選項(系統指派管理身份、使用者指派管理身份或註冊應用程式)。
PATCH https://management.azure.com/subscriptions/{{subscription-id}}/resourceGroups/{{resource-group}}/providers/Microsoft.Search/searchServices/{{search-service}}?api-version=2026-03-01-preview
Authorization: Bearer {{token}}
Content-Type: application/json
請參考以下範例,了解如何在服務層級插入 serviceLevelEncryptionKey 不同身份類型的結構。
使用系統指派管理身份的範例:
{
"encryptionWithCmk": {
"serviceLevelEncryptionKey": {
"keyVaultUri": "<YOUR-KEY-VAULT-URI>",
"keyVaultKeyName": "<YOUR-ENCRYPTION-KEY-NAME>",
"keyVaultKeyVersion": "<YOUR-ENCRYPTION-KEY-VERSION>"
}
}
}
使用者管理的身份識別範例:
{
"encryptionWithCmk": {
"serviceLevelEncryptionKey": {
"keyVaultUri": "<YOUR-KEY-VAULT-URI>",
"keyVaultKeyName": "<YOUR-ENCRYPTION-KEY-NAME>",
"keyVaultKeyVersion": "<YOUR-ENCRYPTION-KEY-VERSION>",
"identity": {
"@odata.type": "#Microsoft.Azure.Search.DataUserAssignedIdentity",
"userAssignedIdentity": "/subscriptions/<your-subscription-ID>/resourceGroups/<your-resource-group-name>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<your-managed-identity-name>"
}
}
}
}
使用應用程式 ID 的範例:
{
"encryptionWithCmk": {
"serviceLevelEncryptionKey": {
"keyVaultUri": "<YOUR-KEY-VAULT-URI>",
"keyVaultKeyName": "<YOUR-ENCRYPTION-KEY-NAME>",
"keyVaultKeyVersion": "<YOUR-ENCRYPTION-KEY-VERSION>",
"accessCredentials": {
"applicationId": "<YOUR-APPLICATION-ID>",
"applicationSecret": "<YOUR-APPLICATION-SECRET>"
}
}
}
}
服務層級 CMK 的配置支援於針對搜尋管理 REST API 2026-03-01-preview 版本或更新版本的 Azure SDK 套件中。 要確認支援,請查看你套件的變更日誌:
檢查搜尋物件是否繼承服務層級的 CMK
要檢查搜尋物件是否使用在服務層級預設配置的客戶管理金鑰,或是在物件層級設定的唯一客戶管理金鑰,請使用 isServiceLevelKey 該屬性檢查繼承的加密狀態。
目前,Azure 入口網站不支援服務層級加密。 直接使用 REST API。
在資料平面 API 版本 2026-05-01-preview 及之後,使用物件 GET 呼叫來檢查 encryptionKey.isServiceLevelKey。
以下程式碼片段即為範例。 你需要用符合你使用情境的數值來更新它。
GET https://{{search-service}}.search.windows.net/indexes/{{index-name}}?api-version=2026-08-01-preview
api-key: {{admin-api-key}}
{
"name": "hotels-cmk",
"fields": [
{
"name": "id",
"type": "Edm.String",
"key": true,
"searchable": false,
"retrievable": true
}
],
"encryptionKey": {
"keyVaultUri": "<YOUR-KEY-VAULT-URI>",
"keyVaultKeyName": "<YOUR-ENCRYPTION-KEY-NAME>",
"keyVaultKeyVersion": "<YOUR-ENCRYPTION-KEY-VERSION>",
"isServiceLevelKey": true
}
}
當 isServiceLevelKey 是 true時,物件繼承服務層級金鑰,且沒有明確的物件層級覆寫。
若要將特定物件的生命週期解耦,請設定明確的 物件層級金鑰,並在更新該物件的 isServiceLevelKey 要求中將 false 設為 PUT。
PUT https://{{search-service}}.search.windows.net/indexes/{{index-name}}?api-version=2026-08-01-preview
api-key: {{admin-api-key}}
Content-Type: application/json
{
"name": "regulated-index",
"fields": [
{
"name": "id",
"type": "Edm.String",
"key": true,
"searchable": false,
"retrievable": true
}
],
"encryptionKey": {
"keyVaultUri": "<YOUR-KEY-VAULT-URI>",
"keyVaultKeyName": "<YOUR-ENCRYPTION-KEY-NAME>",
"keyVaultKeyVersion": "<YOUR-ENCRYPTION-KEY-VERSION>",
"isServiceLevelKey": false
}
}
透過此覆寫,物件層級的金鑰生命週期與服務層級預設解耦。 你可以獨立旋轉物件層級鍵,而不必改變其他物件所使用的服務層級鍵。
啟用服務層級 CMK 後,建立請求可以省略 encryptionKey ,物件預設繼承服務層級金鑰。 若要將現有物件從明確的物件層級金鑰切換為服務層級的 CMK 繼承,請在更新請求中設定 isServiceLevelKey 為 true 。
在資料平面 API 版本 2026-05-01-preview 及之後,請求驗證會應用於 encryptionKey 物件。 如果你提供 encryptionKey, keyVaultUri 且 keyVaultKeyName 是必須的字串欄位,不論是否 isServiceLevelKey 存在或其值為何。 此驗證檢查的是欄位存在,而非金鑰存在性。 佔位字串值符合此結構驗證,缺少必填欄位則為 HTTP 400。
當 isServiceLevelKey 為 true 時,服務會將設定的服務層級金鑰套用至物件。 如果你在同一請求中提供 keyVaultUri、 keyVaultKeyName、 , keyVaultKeyVersion 服務會在該操作中忽略這些值來選擇金鑰。
為了清晰與可維護,請在請求中提供當前服務層級的鍵值,並以 GET 操作驗證有效鍵。
PUT https://{{search-service}}.search.windows.net/indexes/{{index-name}}?api-version=2026-08-01-preview
api-key: {{admin-api-key}}
Content-Type: application/json
{
"name": "regulated-index",
"fields": [
{
"name": "id",
"type": "Edm.String",
"key": true,
"searchable": false,
"retrievable": true
}
],
"encryptionKey": {
"isServiceLevelKey": true,
"keyVaultUri": "<SERVICE-LEVEL-KEY-VAULT-URI>",
"keyVaultKeyName": "<SERVICE-LEVEL-KEY-NAME>",
"keyVaultKeyVersion": "<SERVICE-LEVEL-KEY-VERSION>"
}
}
更新後,搜尋物件繼承服務層級金鑰。 透過發出 GET 請求並確認 isServiceLevelKey 是 true,來驗證有效金鑰。
要設定物件層級鍵,請提供 encryptionKey 物件層級鍵值,並設定 isServiceLevelKey 為 false 或省略 isServiceLevelKey。 若 isServiceLevelKey 是 true,請求不會將物件切換到物件層級的鍵。 在更新請求中省略 encryptionKey 會保留目前的加密金鑰設定。
服務層級 CMK 的配置支援於針對搜尋管理 REST API 2026-03-01-preview 版本或更新版本的 Azure SDK 套件中。 要確認支援,請查看你套件的變更日誌:
步驟五:測試加密
要驗證加密是否有效,請撤銷加密金鑰,查詢索引(應該無法使用),然後重新啟用加密金鑰。
這個任務請使用 Azure 入口網站。 請確保你的角色指派賦予你對密鑰的讀取權限。
在Azure Key Vault頁面中,選擇 Objects>Keys。
選擇你建立的金鑰,然後選擇 刪除。
在Azure AI 搜尋服務頁面,選擇 Search management>Indexes。
選擇你的索引,並使用搜尋總管執行查詢。 您應該會收到錯誤。
返回 Azure Key Vault Objects>Keys頁面。
選擇 管理已刪除的金鑰。
選擇你的金鑰,然後選擇 恢復。
回到你的 Azure AI 搜尋服務 索引並重新執行查詢。 你應該會看到搜尋結果。 如果沒有立即看到效果,請稍等一分鐘再試一次。
設定原則以強制執行 CMK 合規性
Azure 政策有助於執行組織標準並評估規模合規性。 Azure AI 搜尋服務 有兩個與 CMK 相關的內建可選政策。 這些政策適用於新舊的搜尋服務。
指派政策
在Azure入口網站中,導向內建政策,然後選擇 Assign。
以下是Azure入口網站中AuditIfExists政策的範例:
指派內建 CMK 原則的截圖。
透過選擇訂閱和資源群組來設定 政策範圍 。 排除任何不該適用該政策的搜尋服務。
接受或修改預設值。 選擇 檢視 + 建立,然後選擇 建立。
啟用 CMK 原則強制執行
當你在訂閱中指派一項政策給資源群組時,該政策會立即生效。 審核政策會標記不合規的資源,但拒絕政策則阻止建立及更新不合規的搜尋服務。 本節說明如何建立合規的搜尋服務或更新服務使其符合規範。 要讓物件符合規範,請從本文 的第一步 開始。
建立合規的搜尋服務
對於新的搜尋服務,請將 SearchEncryptionWithCmk 設定為 Enabled。
Azure 入口網站和命令列工具(Azure CLI 和 Azure PowerShell)都原生不提供此特性,但你可以使用 Management REST API 來配置帶有 CMK 政策定義的搜尋服務。
這個範例來自 Manage your Azure AI 搜尋服務 service with REST APIS,並修改加入了 SearchEncryptionWithCmk 屬性。
### Create a search service (provide an existing resource group)
@resource-group = my-rg
@search-service-name = my-search
PUT https://management.azure.com/subscriptions/{{subscriptionId}}/resourceGroups/{{resource-group}}/providers/Microsoft.Search/searchServices/{{search-service-name}}?api-version=2025-05-01 HTTP/1.1
Content-type: application/json
Authorization: Bearer {{token}}
{
"location": "North Central US",
"sku": {
"name": "basic"
},
"properties": {
"replicaCount": 1,
"partitionCount": 1,
"hostingMode": "default",
"encryptionWithCmk": {
"enforcement": "Enabled"
}
}
}
更新現有的搜尋服務
對於現有的搜尋服務,若已不合規,請使用 Services - Update API 或 Azure CLI az resource update 指令進行修補。 修補服務後,可以恢復更新搜尋服務屬性的能力。
PATCH https://management.azure.com/subscriptions/<your-subscription-Id>/resourceGroups/<your-resource-group-name>/providers/Microsoft.Search/searchServices/<your-search-service-name>?api-version=2025-05-01
{
"properties": {
"encryptionWithCmk": {
"enforcement": "Enabled"
}
}
}
執行以下指令,替換搜尋服務與資源群組的有效值。
az resource update --name SEARCH-SERVICE-PLACEHOLDER --resource-group RESOURCE-GROUP-PLACEHOLDER --resource-type searchServices --namespace Microsoft.Search --set properties.encryptionWithCmk.enforcement=Enabled
回應應包含以下陳述:
"encryptionWithCmk": {
"encryptionComplianceStatus": "NonCompliant",
"enforcement": "Enabled"
}
...
「不合規」表示搜尋服務已有未加密 CMK 的物件。 為了達成合規,請重新建立每個物件,指定加密金鑰。
輪換或更新加密金鑰
請依照以下指示輪換金鑰,或從 Azure Key Vault 遷移到 Hardware Security Module(HSM)。
若要進行金鑰輪替,請使用 Azure Key Vault 的自動輪替功能。 如果您使用自動輪換,請在物件定義中省略金鑰版本。 使用最新的金鑰,而非特定版本。
當你更改一個鍵或其版本時,先更新使用該鍵的物件,讓它使用新的值 ,再刪除 舊的值。 否則,該物件將無法使用,因為無法解密。
如果你在服務層級設定 CMK,旋轉服務層級金鑰會適用於未來新建立的物件。 已經繼承了先前服務層級金鑰的物件會自動取得新的金鑰,因此你不需要更新它們。 不過,如果你有任何已設定物件層級金鑰並想旋轉的物件,那你就需要更新這些物件以使用新的金鑰。
金鑰會快取 60 分鐘。 測試和旋轉鍵時請記得這點。
確定索引或同義映射所使用的鍵。
在金鑰庫中建立新金鑰,但保留原始金鑰可用。 在此步驟中,你可以從金鑰庫切換到硬體安全模組(HSM)。
更新索引或同義映射上的 encryptionKey 屬性以使用新的值。 只有原本以此屬性建立的物件才能更新為使用不同值。
停用或刪除金鑰庫中先前的金鑰。 監控金鑰存取以確認新金鑰是否被使用。
基於效能考量,搜尋服務會快取金鑰最多數小時。 如果你停用或刪除金鑰且未提供新的金鑰,查詢會暫時運作直到快取到期。 然而,一旦搜尋服務無法再解密內容,你會收到以下訊息: "Access forbidden. The query key used might have been revoked - please retry."
金鑰保存庫 提示
如果你是Azure Key Vault新手,請參考這個快速入門,學習基本任務:Set 並使用 PowerShell 從 Azure Key Vault 取出秘密。
你可以使用你需要的多個金鑰庫。 管理金鑰可以存在不同的金鑰庫。 搜尋服務可以有多個加密物件,每個物件都用不同的客戶管理加密金鑰加密,並存放在不同的金鑰庫中。
使用相同的 Azure tenant,這樣你才能透過角色指派或透過系統或使用者管理身份連線來取得你的管理金鑰。 欲了解更多關於建立租戶的資訊,請參閱 「設立新租戶」。
如果您的 Azure Key Vault 受到防火牆保護,請務必啟用 允許受信任的 Microsoft 服務略過此防火牆,讓 Azure AI 搜尋服務 能夠存取金鑰。
啟用清除保護 並對金鑰庫 進行軟刪除 。 由於使用客戶管理的金鑰加密,若你的 Azure Key Vault 金鑰被刪除,沒有人能取得你的資料。 為防止因意外刪除 金鑰保存庫 金鑰而導致資料遺失,必須在 key vault 啟用軟刪除與清除保護。 軟刪除預設是啟用的,所以只有你故意關閉它才會遇到問題。 清除保護預設不是啟用的,但在 Azure AI 搜尋服務 中用 CMK 加密時是必須的。
啟用日誌記錄 於金鑰保險庫,以便監控金鑰使用情況。
啟用金鑰自動輪換 ,或在例行輪換金鑰庫金鑰、應用程式秘密及註冊時,遵循嚴格程序。 刪除舊內容前,務必更新所有 加密內容 ,使用新的秘密和金鑰。 如果你漏掉這個步驟,你的內容就無法被解密。
處理加密內容
使用 CMK,你可能會注意到索引和查詢都因為額外的加密/解密工作而延遲。 Azure AI 搜尋服務 不會記錄加密活動,但你可以透過金鑰庫記錄來監控金鑰存取。
建議您啟用記錄作為金鑰保存庫組態的一部分。
建立一個日誌分析工作區。
在 Key Vault 中新增一個診斷設定,使用工作區來保存資料。
選擇 audit 或 allLogs 來設定分類,給診斷設定一個名稱,然後儲存。
FAQs
我可以將搜尋物件在服務層級定義的客戶管理金鑰與物件層級定義的客戶管理金鑰之間切換嗎?
- Yes. 當你設定服務層級的 CMK 時,每個新的搜尋物件預設都會使用該鍵。 如果您在物件層級定義中設定不同的金鑰,物件層級金鑰會優先於服務層級金鑰。 若移除物件層級的金鑰定義,搜尋物件會自動回到服務層級定義的客戶管理金鑰。
下一步
如果你不熟悉Azure安全架構,請參考 Azure 安全文件,特別是這篇文章: