You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取访问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资源:

  1. 先通过上述方法获取所有访问IP;
  2. 用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 15:34:51