如何获取访问Azure Key Vault的Vnets/Subnets及访问IP?
分析Azure Key Vault访问流量:获取VNet/子网或IP地址的方法
一、修正KQL查询(解决CallerIpAddress解析失败问题)
你的KQL报错是因为Azure Key Vault诊断日志中不存在CallerIpAddress字段,正确的IP字段名在不同日志表中略有差异:
方法1:使用KeyVault专用日志表(推荐)
如果已启用Key Vault的专用诊断日志(KeyVaultLogs表),用以下查询获取访问IP:
KeyVaultLogs | where OperationName in ("GetSecret", "SetSecret", "DeleteSecret") | summarize by ClientIpAddress
方法2:使用AzureDiagnostics表
若仍使用通用AzureDiagnostics表,字段名为clientIPAddress,修正后的查询:
AzureDiagnostics | where ResourceProvider == "MICROSOFT.KEYVAULT" | where OperationName in ("GetSecret", "SetSecret", "DeleteSecret") | summarize by clientIPAddress
二、获取访问过的VNet/子网列表
日志中不会直接记录VNet/子网信息,需通过获取到的IP反向关联Azure资源:
- 先通过上述方法获取所有访问IP;
- 用IP匹配Azure内的虚拟机、函数应用等资源,再提取资源所属的VNet/子网。
三、PowerShell实现方式
1. 查询Key Vault访问日志获取IP
$keyVaultName = "你的密钥库名称" $resourceGroupName = "密钥库所属资源组名称" Get-AzLog -ResourceGroupName $resourceGroupName ` -ResourceName $keyVaultName ` -ResourceType "Microsoft.KeyVault/vaults" | Where-Object { $_.OperationName.Value -in ("Microsoft.KeyVault/vaults/secrets/get/action", "Microsoft.KeyVault/vaults/secrets/set/action", "Microsoft.KeyVault/vaults/secrets/delete/action") } | Select-Object CallerIpAddress, EventTimestamp, OperationName
2. 通过IP反向查询VNet/子网
$targetIp = "要查询的IP地址" Get-AzVM | Get-AzNetworkInterface | Where-Object { $_.IpConfigurations.PrivateIpAddress -eq $targetIp -or $_.IpConfigurations.PublicIpAddress.Id } | ForEach-Object { $nic = $_ # 匹配公网IP $publicIp = Get-AzPublicIpAddress -ResourceId $nic.IpConfigurations.PublicIpAddress.Id -ErrorAction SilentlyContinue if ($publicIp -and $publicIp.IpAddress -eq $targetIp) { $subnet = Get-AzVirtualNetworkSubnetConfig -ResourceId $nic.IpConfigurations.Subnet.Id [PSCustomObject]@{ 虚拟机名称 = $nic.VirtualMachine.Id.Split('/')[-1] 公网IP = $publicIp.IpAddress 子网名称 = $subnet.Name VNet名称 = $subnet.VirtualNetwork.Name } } # 匹配内网IP elseif ($nic.IpConfigurations.PrivateIpAddress -eq $targetIp) { $subnet = Get-AzVirtualNetworkSubnetConfig -ResourceId $nic.IpConfigurations.Subnet.Id [PSCustomObject]@{ 虚拟机名称 = $nic.VirtualMachine.Id.Split('/')[-1] 内网IP = $nic.IpConfigurations.PrivateIpAddress 子网名称 = $subnet.Name VNet名称 = $subnet.VirtualNetwork.Name } } }
四、Az CLI实现方式
1. 查询Key Vault访问日志获取IP
az monitor activity-log list \ --resource-group 你的资源组名称 \ --resource-type Microsoft.KeyVault/vaults \ --resource-name 你的密钥库名称 \ --query "[?operationName.value in ('Microsoft.KeyVault/vaults/secrets/get/action', 'Microsoft.KeyVault/vaults/secrets/set/action', 'Microsoft.KeyVault/vaults/secrets/delete/action')].{访问IP: callerIpAddress, 时间: eventTimestamp, 操作: operationName.value}" \ --output table
2. 通过IP反向查询VNet/子网(示例:匹配公网IP)
target_ip="要查询的IP地址" # 获取所有公网IP资源并匹配 az network public-ip list --query "[?ipAddress=='$target_ip'].{id: id}" --output tsv | while read ip_id; do # 获取关联的网卡ID nic_id=$(az network public-ip show --ids $ip_id --query "ipConfiguration.id" --output tsv) # 获取子网ID subnet_id=$(az network nic show --ids $nic_id --query "ipConfigurations[0].subnet.id" --output tsv) # 提取VNet和子网名称 vnet_name=$(echo $subnet_id | cut -d'/' -f9) subnet_name=$(echo $subnet_id | cut -d'/' -f11) # 获取关联的虚拟机名称 vm_id=$(az network nic show --ids $nic_id --query "virtualMachine.id" --output tsv) vm_name=$(echo $vm_id | cut -d'/' -f9) echo "虚拟机名称: $vm_name" echo "公网IP: $target_ip" echo "子网名称: $subnet_name" echo "VNet名称: $vnet_name" echo "---" done
内容的提问来源于stack exchange,提问作者user182595
相关产品推荐
相关产品推荐

