密钥保管库MCP服务器

一个Python MCP服务器,将Azure Key Vault数据平面操作暴露给AI代理,使用托管身份进行身份验证和最小权限RBAC进行安全秘密访问。

  • by msmbaldwin
  • Bicep
  • 本地部署
  • 更新于
在 GitHub 查看 msmbaldwin/keyvault-mcp-server-python

使用说明

Azure密钥库MCP服务器(Python)

一个Python MCP服务器,向AI代理公开Azure Key Vault数据平面操作。使用托管身份进行身份验证,使用最低权限RBAC进行安全秘密访问。部署到Azure容器应用程序,并从GitHub Copilot聊天代理模式连接。

概述

此示例演示了如何构建客户拥有的 模型上下文协议(MCP) 向AI代理公开Azure Key Vault数据平面操作的服务器。

三种集成模式:

  • 代理→ 密钥保管库:通过MCP工具阅读秘密
  • 密钥保管库→ Agent:从密钥库事件触发代理工作流(事件网格)
  • 遥测→ Agent:查询调试和监控的审核日志

主要特点:

  • 仅数据平面:只暴露秘密读取操作,没有管理平面访问权限
  • 管理身份:用途 DefaultAzureCredential 用于安全身份验证
  • 最小特权:仅需要 Key Vault Secrets User 角色
  • 容器应用程序托管:部署到Azure容器应用程序 azd up

[!重要] 此MCP服务器使用密钥库 数据平面 只有。它没有也不应该访问管理平面操作,如创建保管库、配置网络或分配RBAC角色。

MCP工具

工具 说明 密钥库API
getSecret 检索机密值 GET /secrets/{name}
listSecrets 列出秘密名称(不是值) GET /secrets
queryKeyVaultLogs 查询用于调试的审核日志 Azure监视器日志API

备注:The queryKeyVaultLogs 该工具需要额外的配置。看 启用遥测查询 在......下面

先决条件

入门指南

选择适合您需求的路径:

路径 最适合 你需要什么
部署到Azure 生产使用、团队共享 Azure订阅, azd CLI
在本地运行 快速测试、开发 Python 3.10+、Azure CLI
代码空间 为此仓库做出贡献 GitHub帐户

选项1:部署到Azure(推荐)

将MCP服务器部署到Azure容器应用程序以供生产使用。这为您提供了一个具有托管身份验证的托管端点。

Azure部署的先决条件

步骤

1.克隆和部署

git clone https://github.com/msmbaldwin/keyvault-mcp-server-python.git
cd keyvault-mcp-server-python
azd auth login
azd up

系统将提示您:

  • 环境名称:一个简短的名字,比如 kv-mcp-dev
  • Azure订阅:选择您的订阅
  • Azure位置:选择一个地区
  • 密钥库名称:现有密钥库的名称

2.配置VS代码

部署后,将MCP服务器添加到您的VS代码设置中:

  1. 打开VS代码设置(Ctrl+,)
  2. 搜索“mcp”
  3. 编辑 settings.json 并添加:
{
    "mcp": {
        "servers": {
            "keyvault-mcp-server": {
                "type": "http",
                "url": "https://<your-container-app-url>/mcp"
            }
        }
    }
}

替换 <your-container-app-url> URL来自 azd up 输出。

3.在GitHub Copilot聊天中使用

  1. 打开GitHub Copilot聊天(Ctrl+Alt+I)
  2. 选择 代理模式 从下拉列表中
  3. 点击 工具 验证 getSecret 和 listSecrets 可供使用
  4. 尝试以下提示:“列出密钥库中的秘密”

选项2:本地运行

在本地计算机上运行MCP服务器以进行快速测试或开发。

地方发展的先决条件

步骤

1.克隆并安装依赖项

git clone https://github.com/msmbaldwin/keyvault-mcp-server-python.git
cd keyvault-mcp-server-python
python -m venv .venv
source .venv/bin/activate  # On Windows: .venv\Scripts\activate
pip install -r requirements.txt

2.验证并运行

# Login to Azure (required for DefaultAzureCredential)
az login

# Set your Key Vault URL
export KEYVAULT_URL="https://<your-vault-name>.vault.azure.net/"

# Start the server
python src/server.py

服务器将于启动 http://localhost:3000.

3.配置VS代码

添加到您的VS代码 settings.json:

{
    "mcp": {
        "servers": {
            "keyvault-mcp-server": {
                "type": "http",
                "url": "http://localhost:3000/mcp"
            }
        }
    }
}

4.在GitHub Copilot聊天中使用

  1. 打开GitHub Copilot聊天(Ctrl+Alt+I)
  2. 选择 代理模式 从下拉列表中
  3. 点击 工具 验证工具是否可用

选项3:GitHub代码空间

代码空间提供了一个预配置的开发环境。最适合贡献者或那些想在没有本地设置的情况下探索代码的人。

备注:代码空间仍然需要Azure身份验证和配置。它便于开发,但不是“零配置”体验。

步骤

  1. 单击上面的徽章在代码空间中打开
  2. 容器启动后,向Azure进行身份验证:
    az login --use-device-code
    
  3. 查找您的密钥库名称:
    az keyvault list --query '[].name' -o tsv
    
  4. 启动服务器:
    export KEYVAULT_URL="https://<your-vault-name>.vault.azure.net/"
    python src/server.py
    
  5. MCP设置是预先配置的。重新加载VS代码(Ctrl+Shift+P → “重新加载窗口”),然后在副驾驶聊天中使用代理模式。

安全

此示例遵循安全最佳实践:

实践 实施
仅数据平面 未暴露管理平面操作
最小特权 用途 Key Vault Secrets User 仅限角色
管理身份 配置中未存储任何秘密
单保险库范围 角色分配仅限于一个保管库

所需角色

角色 范围 目的
Key Vault Secrets User 密钥库 读取秘密
Log Analytics Reader 日志分析工作区 查询审计日志(可选)

应避免的角色

做 不 将这些角色授予MCP服务器标识:

  • Key Vault Contributor (控制平面访问)
  • Key Vault Administrator (完全数据平面访问)
  • Owner 或 Contributor 在任何范围

故障排除

错误 原因 解决方法
403 Forbidden 缺少RBAC角色 分配 Key Vault Secrets User 到托管身份
401 Unauthorized 身份未解析 验证托管身份是否已附加到容器应用程序
404 Not Found 错误的保管库URL 检查 KEYVAULT_URL 格式

清理

azd down --purge --force

扩展图案

启用遥测查询

要启用 queryKeyVaultLogs 代理调试工具:

  1. 启用密钥库诊断日志记录 转到日志分析工作区
  2. 设置环境变量:
    export LOG_ANALYTICS_WORKSPACE_ID="<your-workspace-id>"
    
  3. 分配日志分析读取器角色 到管理身份:
    az role assignment create \
        --role "Log Analytics Reader" \
        --assignee-object-id <principalId> \
        --assignee-principal-type ServicePrincipal \
        --scope /subscriptions/<sub>/resourceGroups/<rg>/providers/Microsoft.OperationalInsights/workspaces/<workspace>
    

示例查询:

场景 查询
访问失败 AzureDiagnostics | where ResourceProvider == "MICROSOFT.KEYVAULT" and ResultSignature == "Forbidden"
最近访问 AzureDiagnostics | where OperationName == "SecretGet" | summarize count() by CallerIPAddress
异常模式 AzureDiagnostics | where ResourceProvider == "MICROSOFT.KEYVAULT" | summarize count() by bin(TimeGenerated, 1h)

从密钥库事件触发代理

密钥库与 Azure事件网格 在机密、密钥或证书更改时发出事件。使用这些事件触发代理工作流:

事件 代理工作流
SecretNearExpiry 特工启动秘密轮换
CertificateNearExpiry 代理触发证书续订
SecretNewVersionCreated 代理验证和更新依赖的应用程序

要实现,请创建事件网格订阅:

az eventgrid event-subscription create \
    --name keyvault-agent-trigger \
    --source-resource-id /subscriptions/<sub>/resourceGroups/<rg>/providers/Microsoft.KeyVault/vaults/<vault> \
    --endpoint-type webhook \
    --endpoint https://<your-agent-endpoint>/api/keyvault-events \
    --included-event-types Microsoft.KeyVault.SecretNearExpiry Microsoft.KeyVault.CertificateNearExpiry

备注:事件网格触发器需要一个单独的webhook端点(如Azure函数),而不是MCP服务器本身。然后,代理可以调用MCP服务器来检索其他上下文。

相关文档

贡献

该项目欢迎各方提供意见和建议。看 贡献.md 了解详情。

许可证

此项目根据MIT许可证获得许可-请参阅 许可证 了解详情。