iT邦幫忙

2026 iThome 鐵人賽

0
Security

身分驗證你我他 ─ 使用 HashiCorp Vault 與 Terraform 打造 Secret 與 Identity 實驗室系列 第 17 篇

Day 17. Azure Auth Method:使用 Azure Identity 登入 Vault

  • 分享至 

  • xImage
  •  

在 Day 16,我們介紹了 AppRole Authentication,讓 Application 可以透過 Role ID 與 Secret ID 向 HashiCorp Vault 取得 Token。

但如果今天 Application 是部署在 Microsoft Azure 上呢?

例如,我們在 Azure VM 上部署一個 Spring Boot Application,需要從 Vault 取得 Database Credential。

難道還需要在 VM 裡面保存 Role ID 與 Secret ID 嗎?
其實不一定!

HashiCorp Vault 提供了 Azure Auth Method,讓 Azure 上的工作負載可以利用 Azure Identity 完成身分驗證,減少管理長期靜態憑證的需求。

什麼是 Azure Auth Method?

Azure Auth Method 是 Vault 提供的身分驗證機制,允許 Azure 工作負載透過 Microsoft Entra ID(原 Azure AD)核發的身分權杖,向 Vault 證明自己的身分。

其中最值得認識的是 Managed Identity(受控識別)。

Azure 可以替 VM 配置 Managed Identity,讓 VM 不必自行保存 Client Secret,就能向 Entra ID 取得 Access Token。

使用 Azure VM 登入 Vault

啟用 VM Managed Identity
在 Azure CLI 執行:

az vm identity assign --resource-group <RESOURCE_GROUP> --name azgranttest01

完成後可以透過下面的指令確認是否成功:

az vm identity show --resource-group azgranttest01_group  --name azgranttest01

{
"principalId": "xxx",
"tenantId": "xxx",
"type": "SystemAssigned"
}

成功後會看到 principalId,代表 Azure 已為 VM 建立身分。

接著啟用並設定 Azure Auth Method:

grantli@xxx:~$ vault auth enable azure
Success! Enabled azure auth method at: azure/
grantli@xxx:~$ vault auth list
grantli@xxx:~$ vault write auth/azure/config tenant_id="xxx" resource="https://management.azure.com/" auth_type="msi"
Success! Data written to: auth/azure/config

假設我們希望 Application 可以讀取之前建立的 KV v2 Secret:

grantli@xxx:~$ cat myapp-read.hcl
path "secret/data/myapp" {
  capabilities = ["read"]
}
grantli@xxx:~$ vault policy write azure-app myapp-read.hcl
Success! Uploaded policy: azure-app

建立 Azure Auth Role

grantli@xxx:~$ vault write auth/azure/role/azure-vm-role \
  policies="azure-app" \
  bound_subscription_ids="xxxx" \
  bound_resource_groups="xxxp" \
  bound_service_principal_ids="xxx" \
  ttl="1h"
Success! Data written to: auth/azure/role/azure-vm-role

這個 Role 的意思是:

  • 必須符合指定的 Azure Subscription。
  • 必須符合指定的 Resource Group。
  • 必須符合指定的 Managed Identity Service Principal。
  • 成功登入後,取得具有 azure-app Policy 的 Vault Token。

取得Azure Access Token

接著我們需要透過 Azure Instance Metadata Service (IMDS) 取得Azure Access token。
IMDS 是 Azure 提供給虛擬機(VM)或虛擬機規模集(VM Scale Set)內執行中應用程式的一種 REST API 服務。

它的核心特點與存取方式在於:

• 存取端點:透過非路由的知名 IP 位址 169.254.169.254 進行存取
• 限定來源:只能從 VM 內部存取,通訊內容完全不會離開實體主機(Host)

grantli@xxx:~$ AZURE_TOKEN=$(curl -s \
  -H "Metadata: true" \
  --get \
  --data-urlencode "api-version=2018-02-01" \
  --data-urlencode "resource=https://management.azure.com/" \
  "http://169.254.169.254/metadata/identity/oauth2/token" \
  | jq -r '.access_token')

grantli@xxx:~$ echo $AZURE_TOKEN
eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6In.....

接著再取得Subscription資訊:

INSTANCE=$(curl -s \
  -H "Metadata: true" \
  "http://169.254.169.254/metadata/instance?api-version=2021-02-01")

登入Vault

接著便可以透過 Azure Auth Role 登入Vault

vault write auth/azure/login \
  role="azure-vm-role" \
  jwt="$AZURE_TOKEN" \
  subscription_id="$(echo "$INSTANCE" | jq -r '.compute.subscriptionId')" \
  resource_group_name="$(echo "$INSTANCE" | jq -r '.compute.resourceGroupName')" \
  vm_name="$(echo "$INSTANCE" | jq -r '.compute.name')"

總之,使用 Azure Auth Method,最大的好處是將工作負載身分管理交給 Azure。
不過即便 Application 不需要保存 Client Secret,不代表 Vault Server 一定不需要 Azure 憑證。

Vault Server 驗證 Azure 資源時,仍需要具備適當的 Azure API 存取能力,可以透過 Service Principal、Managed Identity 或其他支援的方式取得。

總結

雖然步驟挺多的,但是,基本上來說,通用的操作順序可以如下:

  1. 建立Vault policy
  2. 建立role,assign policy
  3. 使用role進行登入

而一個App role 可以被assign 多個Policy (例如可以同時有Read、Write、Update、Delete policy),但我們今天想要調整App的權限時,便可以更改相關policy。


上一篇
Day 16. AppRole Authentication:AppRole的安全性考量
系列文
身分驗證你我他 ─ 使用 HashiCorp Vault 與 Terraform 打造 Secret 與 Identity 實驗室 共 17 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言