從管線存取私鑰保存庫
Azure 金鑰保存庫 提供安全的解決方案,可管理具有順暢安全性的認證,例如密鑰、秘密和憑證。 使用 Azure Pipelines,您可以簡化存取和使用密鑰保存庫的程式,讓您輕鬆儲存和擷取認證。
在某些情況下,組織會藉由將密鑰保存庫的存取限制為專用於指定的 Azure 虛擬網路來設定安全性的優先順序,以確保關鍵應用程式的最高安全性層級。
在本教學課程中,您將了解如何:
- 建立服務主體
- 建立服務連線
- 設定您的輸入存取點
- 從管線查詢私人 Azure 金鑰保存庫
必要條件
Azure 訂用帳戶。 如果您還沒有 Azure 帳戶,請建立免費的 Azure 帳戶 。
Azure Key Vault。 如果您尚未建立新的 Azure 金鑰保存庫。
存取私鑰保存庫
Azure Pipelines 可讓開發人員將 Azure 金鑰保存庫 連結至變數群組,並將選擇性保存庫秘密對應至變數群組。 可以存取做為變數群組的金鑰儲存庫:
從 Azure DevOps,在變數群組設定時間期間。
從自我裝載代理程式,在管線作業運行時間期間。
建立服務主體
從建立新的服務主體開始,這可讓您存取 Azure 資源。 接下來,您必須在 Azure DevOps 中建立新的 ARM 服務連線,然後在 Azure DevOps 中驗證並儲存服務連線之前,先為 Azure 中的服務主體設定同盟認證。
巡覽至 Azure 入口網站。
從功能表列開啟 Cloud Shell,然後選取 [Bash]。
執行下列命令來建立新的服務主體:
az ad sp create-for-rbac --name YOUR_SERVICE_PRINCIPAL_NAME
請務必複製輸出,因為我們會在下一個步驟中使用它來建立服務連線。
建立服務連線
登入您的 Azure DevOps 組織,然後瀏覽至您的專案。
選取 [項目設定>服務連線>][新增服務連線]。
選取 [Azure Resource Manager],然後選取 [ 下一步]。
針對 [ 身分識別類型],從下拉功能表中選取 [應用程式註冊][自動 ]。
針對 [ 認證],保留預設的建議值: 工作負載身分識別同盟。
針對 [ 範圍層級],選取 [訂用帳戶],然後從下拉功能表中選取您的訂用帳戶。
如果您想要只限制對指定資源群組的存取,請選取 [資源群組]。
提供服務連線的名稱,然後選取 [授與所有管線的訪問許可權] 複選框,以允許所有管線 使用此服務連線。
當完成時,選擇儲存。
編輯同盟認證
在 [管理] 底下>,選取 [憑證與秘密同盟認證]。
選取 [新增認證],然後針對 [同盟認證案例],選取 [ 其他簽發者]。
針對簽發 者,貼上下列 URL,以您的組織 GUID 取代佔位符。 您可以流覽至 [組織設定>] Microsoft Entra> 下載連線至目錄的 Azure DevOps 組織清單,以尋找您的組織標識碼。
https://vstoken.dev.azure.com/<ORGANIZATION_ID>
針對 [ 主體標識符],貼上下列URL,以您的組織名稱、專案名稱和服務連線名稱取代佔位元。
sc://ORGANIZATION_NAME/PROJECT_NAME/SERVICE_CONNECTION_NAME
提供 同盟認證的 [名稱 ],然後在完成時選取 [ 新增 ]。
建立服務連線
登入您的 Azure DevOps 組織,然後瀏覽至您的專案。
選取 [項目設定>服務連線>][新增服務連線]。
選取 [Azure Resource Manager]、>[下一步],然後選取 [服務主體][手動]>[下一步]。
針對 [範圍層級] 選取 [Azure 雲端] 和 [訂用帳戶],然後輸入您的訂用帳戶標識符和訂用帳戶名稱。
輸入您的服務主體資訊,然後選取 [ 驗證]。
成功驗證之後,將服務連線命名、新增描述,然後核取 [ 授與所有管線的訪問許可權 ] 複選框。 選取 [ 驗證],然後在完成時儲存 。
提示
如果您無法驗證服務主體連線,請將訂用帳戶的讀取者存取權授與服務主體。
建立服務連線
登入您的 Azure DevOps 集合,然後流覽至您的專案。
選取 [項目設定>服務連線>][新增服務連線]。
選取 [Azure Resource Manager],為您的服務連線命名,然後針對 [範圍層級] 選取 [Azure Cloud for Environment] 和 [訂用帳戶]。
輸入您的 訂用帳戶標識碼 和訂 用帳戶名稱。
輸入您的服務主體資訊,然後選取 [ 驗證連線]。
核取 [ 允許所有管線使用此聯機 ] 複選框,然後在完成時選取 [ 確定 ]。
提示
如果您無法驗證服務主體連線,請將訂用帳戶的讀取者存取權授與服務主體。
從 Azure Devops 存取私鑰保存庫
在本節中,我們將探索從 Azure DevOps 存取私鑰保存庫的兩種方法。 首先,我們將使用變數群組來連結和對應密鑰保存庫中的秘密,然後藉由允許靜態 IP 範圍來設定輸入存取。 我們會建立輸入存取,因為 Azure Pipelines 從變數群組查詢 Azure 金鑰保存庫 時,會使用張貼的 Azure DevOps 公用 IP。 因此,藉由將輸入連線新增至 Azure 金鑰保存庫 防火牆,我們可以成功連線到 Azure 金鑰保存庫。
針對第二種方法,我們將示範如何將Microsoft裝載的代理程式IP位址動態新增至金鑰保存庫的防火牆允許清單、查詢密鑰保存庫,並在完成之後移除IP。 第二種方法僅供示範之用,並非 Azure Pipelines 的建議方法。
1 - 使用變數群組對應密鑰保存庫秘密
登入您的 Azure DevOps 組織,然後瀏覽至您的專案。
選取 [管線連結>庫],然後選取 [+ 變數群組]。
為您的變數群組命名,然後選取切換按鈕,以啟用 Azure 金鑰保存庫 作為變數按鈕的連結秘密。
選取您稍早建立的服務連線、選取金鑰保存庫,然後選取 [ 授權]。
在 [變數] 下,選取 [新增] 以新增秘密,然後在完成時選取 [儲存]。
注意
請確定您的服務連線具有 [取得] 和 [列表] 許可權,並將您的服務主體指派給私鑰保存庫中 金鑰保存庫 秘密使用者角色。
1.1 設定服務連線許可權
流覽至您的 Azure 金鑰保存庫,然後選取 [ 存取原則]。
選取 [建立],然後在 [秘密許可權] 底下新增 [取得和列表] 許可權,然後選取 [下一步]。
在搜尋列中新增服務連線、選取它,然後選取 [ 下一步]。
再次選取 [下一步 ],檢閱您的設定,然後在完成時選取 [ 檢閱 + 建立 ]。
1.2 設定服務主體許可權
流覽至您的 Azure 金鑰保存庫,然後選取 [存取控制][IAM]。
選取 [新增>角色指派>],然後選取 [角色] 索引卷標。
選取 [金鑰保存庫 秘密使用者角色],然後選取 [下一步]。
選取 [ 選取成員> ],新增您的服務主體 >選取。
完成時,請選取 [ 檢閱 + 指派 ]。
登入您的 Azure DevOps 組織,然後瀏覽至您的專案。
選取 [管線連結>庫],然後選取 [+ 變數群組]。
為您的變數群組命名,然後選取切換按鈕,以啟用 Azure 金鑰保存庫 的 [連結秘密] 作為變數按鈕。
從下拉功能表中選取您稍早建立的 Azure 服務連線,然後選取您的金鑰保存庫。
如果您遇到錯誤訊息: 指定的 Azure 服務連線必須具有所選密鑰保存庫的「取得、列出」秘密管理許可權。 如上所示。 流覽至 Azure 入口網站 中的密鑰保存庫,選取 [存取控制] [IAM]>[新增角色指派>金鑰保存庫秘密] 使用者>[下一步],然後新增您的服務主體,然後在完成時選取 [檢閱 + 指派]。
新增您的秘密,然後在完成時選取 [ 儲存 ]。
2 - 設定來自 Azure DevOps 的輸入存取
若要從 Azure DevOps 啟用金鑰保存庫的存取權,您必須授與來自特定靜態 IP 範圍的存取權。 這些範圍取決於您 Azure DevOps 組織的地理位置。
登入您的 Azure DevOps 組織。
選取組織設定。
流覽至 [ 概觀],您可以在其中找到頁面底部所列的地理位置。
設定金鑰保存庫 以允許從靜態 IP 範圍存取。
3 - 使用變數群組查詢私鑰保存庫
在此範例中,我們使用稍早設定並授權服務主體的變數群組,只要使用連結的變數群組,即可從私人 Azure 金鑰保存庫 查詢和複製我們的秘密。 從變數群組查詢 Azure 金鑰保存庫 時,Azure Pipelines 會使用張貼的公用 IP,因此請確定您已設定此存取權以正常運作:
variables:
- group: mySecret-VG
steps:
- task: CmdLine@2
inputs:
script: 'echo $(mySecret) > secret.txt'
- task: CopyFiles@2
inputs:
Contents: secret.txt
targetFolder: '$(Build.ArtifactStagingDirectory)'
- task: PublishBuildArtifacts@1
inputs:
PathtoPublish: '$(Build.ArtifactStagingDirectory)'
ArtifactName: 'drop'
publishLocation: 'Container'
替代方法 - 動態允許Microsoft裝載的代理程式IP
在第二種方法中,我們將從在管線開頭查詢Microsoft裝載代理程式的IP開始。 然後,我們會將它新增至密鑰保存庫允許清單、繼續進行其餘工作,最後從密鑰保存庫的防火牆允許清單中移除 IP。
注意
此方法僅供示範之用,並非 Azure Pipelines 的建議方法。
- task: AzurePowerShell@5
displayName: 'Allow agent IP'
inputs:
azureSubscription: 'YOUR_SERVICE_CONNECTION_NAME'
azurePowerShellVersion: LatestVersion
ScriptType: InlineScript
Inline: |
$ip = (Invoke-WebRequest -uri "http://ifconfig.me/ip").Content
Add-AzKeyVaultNetworkRule -VaultName "YOUR_KEY_VAULT_NAME" -ResourceGroupName "YOUR_RESOURCE_GROUP_NAME" -IpAddressRange $ip
echo "##vso[task.setvariable variable=agentIP]ip"
- task: AzureKeyVault@2
inputs:
azureSubscription: 'YOUR_SERVICE_CONNECTION_NAME'
KeyVaultName: 'YOUR_KEY_VAULT_NAME'
SecretsFilter: '*'
RunAsPreJob: false
- task: AzurePowerShell@5
displayName: 'Remove agent IP'
inputs:
azureSubscription: 'YOUR_SERVICE_CONNECTION_NAME'
azurePowerShellVersion: LatestVersion
ScriptType: InlineScript
Inline: |
$ipRange = $env:agentIP + "/32"
Remove-AzKeyVaultNetworkRule -VaultName "YOUR_KEY_VAULT_NAME" -IpAddressRange $ipRange
condition: succeededOrFailed()
重要
請確定您用來從管線存取金鑰保存庫的服務主體會保留 密鑰保存庫參與者 角色。
從自我裝載的代理程式存取私鑰保存庫
若要能夠從 Azure Pipelines 代理程式存取私鑰保存庫,您必須使用自我裝載代理程式(Windows、Linux、Mac)或擴展集代理程式。 這是因為Microsoft裝載的代理程式,就像其他一般計算服務一樣,不包含在密鑰保存庫的信任服務清單中。
若要建立與私鑰保存庫的連線,您必須設定金鑰保存庫的私人端點,以提供 視線 連線。 此端點必須可路由傳送,並使其私人 DNS 名稱可從自我裝載管線代理程式解析。
1 - 設定來自自我裝載代理程式的輸入存取
請遵循提供的指示來 建立虛擬網路。
在 Azure 入口網站 中,使用頁面頂端的搜尋列來尋找您的 Azure 金鑰保存庫。
在搜尋結果中找到密鑰保存庫之後,請加以選取,然後流覽至 [設定>網络]。
選取 [私人端點連線],然後選取 [建立 ] 以建立新的私人端點。
選取裝載 您稍早建立之虛擬網路的資源群組 。 為您的 實例提供 [名稱 ] 和 [網络介面名稱 ],並確定您選取與稍早建立的虛擬網路相同的 區域 。 完成後,請選取 [下一步]。
選取 [連線方法] 目錄中的 [連線到 Azure 資源],然後從 [資源類型] 下拉功能表中選擇 [Microsoft.KeyVault/vaults]。 從下拉功能表中選取您的 資源 。 目標 子資源 將會自動填入值: 保存庫。 完成後,請選取 [下一步]。
在 [虛擬網絡] 索引卷標下,選取您稍早建立的虛擬網路和子網,並將其餘字段保留為預設值。 完成後,請選取 [下一步]。
繼續執行 [DNS ] 和 [捲標] 索引標籤 ,接受預設設定。 在 [ 檢閱 + 建立] 索引卷標底下,選取 [完成時建立 ]。
部署資源之後,流覽至您的密鑰保存庫 >[設定>網络>私人端點連線],您的私人端點應以已核准的連線狀態列出。 如果您要連結到不同目錄中的 Azure 資源,您必須等候資源擁有者核准連線要求。
2 - 允許虛擬網路
流覽至 [Azure 入口網站],然後尋找您的 Azure 金鑰保存庫。
選取 [設定>網络],並確定您是 [防火牆和虛擬網络] 索引標籤底下。
選取 [新增虛擬網络>][新增現有的虛擬網络]。
從下拉功能表中選取您的 訂 用帳戶,然後選取您稍早建立的虛擬網路,然後選取您的 子網。
完成 時選取 [新增 ],然後捲動至頁面底部,然後選取 [ 套用 ] 以儲存變更。
3 - 從自我裝載代理程序查詢私鑰保存庫
下列範例會使用虛擬網路 VM 上設定的代理程式,透過變數群組查詢私鑰保存庫:
pool: Self-hosted-pool
variables:
group: mySecret-VG
steps:
- task: CmdLine@2
inputs:
script: 'echo $(mySecret) > secret.txt'
- task: CopyFiles@2
inputs:
Contents: secret.txt
targetFolder: '$(Build.ArtifactStagingDirectory)'
- task: PublishBuildArtifacts@1
inputs:
PathtoPublish: '$(Build.ArtifactStagingDirectory)'
ArtifactName: 'drop'
publishLocation: 'Container'
如果您不想授與 Azure DevOps 對私鑰保存庫的 輸入存取權,您可以使用 AzureKeyVault 工作來查詢密鑰保存庫。 不過,您必須確定允許在密鑰保存庫防火牆設定中裝載代理程式的虛擬網路。
pool: Self-hosted-pool
steps:
- task: AzureKeyVault@2
inputs:
azureSubscription: '$(SERVICE_CONNECTION_NAME)'
keyVaultName: $(KEY_VAULT_NAME)
SecretsFilter: '*'
- task: CmdLine@2
inputs:
script: 'echo $(mySecret) > secret.txt'
- task: CopyFiles@2
inputs:
Contents: secret.txt
targetFolder: '$(Build.ArtifactStagingDirectory)'
- task: PublishBuildArtifacts@1
inputs:
PathtoPublish: '$(Build.ArtifactStagingDirectory)'
ArtifactName: 'drop'
publishLocation: 'Container'
疑難排解
如果您遇到下列錯誤,請依照本節中的步驟進行疑難解答並解決問題:
Public network access is disabled and request is not from a trusted service nor via an approved private link.
這表示已停用公用存取,而且未設定私人端點連線和防火牆例外狀況。 遵循 [#configure-inbound-access-from-a-self-hosted-agent] 底下的步驟,以及 設定來自 Azure DevOps 的輸入存取,以設定私鑰保存庫的存取權。
Request was not allowed by NSP rules and the client address is not authorized and caller was ignored because bypass is set to None Client address: <x.x.x.x>
此錯誤訊息表示金鑰保存庫的公用存取已停用,且未核取 [允許信任的 Microsoft 服務 略過此防火牆選項,但用戶端 IP 位址尚未新增至金鑰保存庫防火牆。 流覽至 Azure 入口網站 中的金鑰保存庫,然後>設定網路功能,並將用戶端 IP 新增至防火牆的允許清單。
Error: Client address is not authorized and caller is not a trusted service.
請務必將地理位置的 IPV4 範圍新增至金鑰保存庫允許清單。 如需詳細資訊,請參閱 設定來自 Azure DevOps 的輸入存取。 或者,您可以跳至 動態允許Microsoft裝載的代理程式IP,瞭解如何在運行時間將用戶端IP 新增至密鑰保存庫的防火牆。