dawshund_mcp 是一个 MCP 服务器包,用于枚举 AWS IAM 数据、评估有效权限,并可视化用户、角色和资源之间的访问关系。它面向希望快速、简便且有效地洞察 AWS 身份风险的云安全工程师,是对 dAWShund 项目的封装,将上游项目包装为两种服务器形式,避免用户需要记住并分别运行多个脚本。
上游 dAWShund 项目提供了三个主要组件。sAWSage 用于枚举 IAM 主体和资源策略,并将它们合并为单个 JSON 文档;支持的资源包括 IAM 组、角色和用户,以及部分基于资源的策略,如 AWS Backup、EFS、KMS、Lambda、S3、SNS 和 SQS。运行脚本后,合并文件 sawsage.json 会生成在 policies/ 目录下。Gerakina 将合并后的策略输入 AWS 的 simulate-principal-policy API,生成新的 JSON 文件 effective_permissions.json,列出每个主体被允许、显式拒绝或隐式拒绝的操作;由于需要对每个主体、操作和资源的唯一组合调用 AWS API,该步骤可能需要一些时间。dAWShund 则将有效权限导入 Neo4j 数据库,构建主体与资源的图,并生成 permissions4j.json 和 dawshund.json,分别适合在 Neo4j 和 BloodHound 中浏览。Neo4j 功能为可选;此包附带的 HTTP 服务器提供轻量级摘要。
依赖与环境要求方面,dAWShund 依赖 Python、AWS CLI 和若干 Python 包;如要使用 Neo4j 可视化,还需要运行中的 Neo4j 实例。最低要求包括:一个拥有调用 IAM API(用于枚举)和 simulate-principal-policy API(用于评估)权限的 AWS 账户,并使用 aws configure --profile <profile_name> 配置 AWS 凭据;安装 AWS CLI 并使其在路径中可用;可选地,若计划直接运行 dawshund.py 脚本,则需要 Neo4j 服务器(HTTP 服务器无需 Neo4j 即可汇总结果)。
安装方式:先安装 AWS CLI 并为要评估的账户配置命名配置文件,例如 aws configure --profile myprofile。然后克隆本仓库(或复制 mcp_dawshund_server 文件夹)并运行安装脚本:cd mcp_dawshund_server 后执行 ./setup.sh。该脚本会安装 Python 依赖(boto3、neo4j、flask、flask_cors)并将 dAWShund 代码克隆到本地子目录。若希望使用 Python 虚拟环境,可在运行 setup.sh 前创建并激活。
启动方式:运行 python3 server.py 启动服务器,默认 HTTP 服务在所有接口的 8000 端口监听;可在启动前设置 PORT 环境变量更改端口,例如 PORT=5000 python3 server.py。若打算使用 MCP 实现而非 HTTP API,可运行 python3 iam_mcp_server.py;MCP 服务器不绑定 TCP 端口,通过标准输入/输出通信,通常由 Claude for Desktop 等客户端启动。
HTTP 服务器用法:基于 Flask 的服务器(server.py)通过 HTTP 暴露三个端点,所有请求和响应均使用 JSON。其一,枚举 IAM 策略(/collect):通过 sAWSage 触发 IAM 主体和资源策略的枚举,需提供 AWS CLI 配置文件名称,可选提供区域数组;若未提供区域,sAWSage 会枚举支持服务的所有已知区域。响应是一个以 AWS ARN 为键的大型 JSON 文档,每个条目包含元数据(友好名称、附加策略)以及从内联和托管策略中提取的原始语句;同一文件也会保存到 dAWShund/policies/sawsage.json 以备后用。其二,评估有效权限(/evaluate):使用 AWS simulate-principal-policy API 模拟附加到每个主体的权限,该端点仅需配置文件名称。响应包含 effective_permissions.json 的内容,即以主体 ARN 为键的字典;每个条目中的 Permissions 键包含名为 allowed、explicitDeny 和 implicitDeny 的列表,列出该主体的(操作, 资源)元组。其三,汇总评估结果(/analyze):检索评估的紧凑摘要,该端点读取 effective_permissions.json,统计每个主体被允许、显式拒绝和隐式拒绝的操作数量,无需请求体。该摘要有助于快速识别权限过大的主体或存在意外隐式拒绝的主体。更深层分析可连接 Neo4j 数据库并运行原始 dawshund.py 脚本,它将构建图并创建 permissions4j.json 和 dawshund.json。
MCP 服务器用法:除 Flask HTTP API 外,本包还包含使用 fastmcp 库实现的 Model Context Protocol(MCP)服务器。MCP 服务器通过 JSON-RPC 通信,供 Claude Desktop 或自定义 FastMCP 客户端等 AI 助手使用。它暴露与 HTTP API 相同的操作,但使用结构化的工具定义而非 HTTP 端点。安装 FastMCP:setup.sh 脚本会安装 fastmcp 包;若手动管理依赖,可自行安装,FastMCP 需要 Python 3.10 或更高版本。手动运行服务器以在本地测试:运行后会以 STDIO 模式启动,阻塞并监听标准输入上的 JSON-RPC 请求;若计划作为远程连接器暴露,也可通过 HTTP 运行。可用的工具有三个,每个工具返回 JSON 结构化内容并附带简短摘要;collect 和 evaluate 工具返回简短消息及各自 JSON 输出文件的路径(完整文档可能达数百 KB),analyze 工具读取有效权限文件并返回以主体 ARN 为键、包含允许和拒绝操作计数的字典。
与 Claude Desktop 集成:Claude Desktop 可启动在 claude_desktop_config.json 文件中定义的本地 MCP 服务器。在 macOS 上该文件位于 ~/Library/Application Support/Claude/claude_desktop_config.json,在 mcpServers 键下添加新条目并替换为系统中的正确路径。保存后需重启 Claude Desktop,因为配置仅在启动时读取。当自然语言提示需要 IAM 枚举或权限模拟时,Claude 会调用相应工具。例如可以说:"Enumerate IAM policies for my default profile and summarise how many actions are allowed or denied." Claude 将依次发出 collect_iam、evaluate_iam 和 analyze_iam 调用,每个工具的结果返回给 Claude 并纳入助手的最终回复。也可将 MCP 服务器作为远程连接器,通过 HTTP 运行并在 Claude 网页界面注册 URL,例如在 Claude 设置中添加 http://localhost:8000/mcp 作为自定义连接器。
注意事项与限制:权限要求方面,枚举步骤使用 list_users、list_roles、get_user_policy 等 IAM API;评估步骤调用 simulate-principal-policy,后者会针对资源评估操作;需确保所用 AWS 配置文件具有执行这些操作的足够权限。运行时间与成本方面,模拟策略可能耗时,因为对每个主体/操作/资源组合都会发起一次 API 调用;对于主体和策略较多的账户,可能需要数分钟;模拟 API 本身不产生额外 AWS 费用,但枚举查询受正常 API 速率限制约束。Neo4j 集成方面,默认 dawshund.py 连接到 localhost:7687 上的 Neo4j 实例,用户名 neo4j、密码 dawshund;若要填充自己的 Neo4j 数据库,请在运行前编辑 dAWShund/dawshund.py 中的 NEO4J_URI 和 NEO4J_AUTH 值;此处提供的 HTTP 服务器完全不使用 Neo4j,而是汇总 JSON 输出。扩展性方面,上游项目目前仅枚举有限服务的资源策略;如需覆盖更多服务,可考虑向上游仓库贡献服务枚举器。许可方面,本包捆绑的 dAWShund 脚本按 BSD 3-Clause 许可;此文件夹中的包装代码(服务器和安装脚本)已发布到公共领域。