Cartography:把多云资产关系装进 Neo4j,回答权限与暴露面问题
Cartography 是一种 Python 工具,可将基础设施资产及其关系提取到 Neo4j 图形数据库中。
秒懂
- 它是什么?
- Cartography 是一个 Python 工具,把 AWS、GCP、Azure、Kubernetes 等平台的资产和关系同步进 Neo4j 图数据库。它适合需要跨账号、跨提供商回答权限和暴露面问题的安全团队。
- 适合谁用?
- Cartography 适合已经有多云环境、并且愿意维护一个 Neo4j 实例的安全工程团队。它能把 AWS、GCP、Azure、Kubernetes、GitHub 等平台的资产关系集中到一个图里,回答跨账号的权限和暴露面问题。
- 能商用吗?
- 可以。Apache-2.0 是宽松许可证:你可以使用、修改并销售基于它的软件,只需保留版权和许可证声明。
- 还在维护吗?
- 在维护。仓库最近一次提交在 1 天前。
- 用什么语言写的?
- 主要是 Python(依据 GitHub 的语言统计)。
以上回答依据项目的 GitHub 数据(最近同步于 2026年9月15日)和我们的分析,不构成法律意见。
开源项目深度解析
为什么需要把资产关系画成图
大多数云平台的原生控制台只展示单个账号或单个服务。你要回答「哪些身份能访问哪些数据库」时,得在 IAM、RDS、S3 之间来回跳。跨账号、跨提供商时,这种手工查询几乎不可行。Cartography 把资产和关系导入 Neo4j,用 Cypher 查询直接问图。比如 README 里给的例子:找出所有未加密的 RDS 实例,一条 MATCH 语句就能跨账号返回。它解决的问题不是资产发现,而是关系发现。关系才是权限和暴露面分析的核心。
同步机制:从各平台 API 到 Neo4j
Cartography 的同步过程是拉取模式。它通过各平台的 API 获取数据,然后写入 Neo4j。每个平台对应一个模块,比如 aws、gcp、azure、kubernetes。模块负责定义要拉取的实体和关系。同步时,Cartography 会执行一次完整的拉取,然后更新图。README 提到,安装 cartography[neo4j-rust] 可以换用 Rust 编写的 Bolt 编解码器,同步时间能减少约 20% 到 30%。这个细节说明同步性能是项目关注点。数据进入 Neo4j 后,你可以用 Cypher 查询,也可以运行内置的安全规则。规则是预先写好的查询,比如 object_storage_public 用来检查公共对象存储。
快速上手:三条命令进入图查询
安装很简单:pip install cartography。然后启动 Neo4j 容器,README 给的命令是 docker run -d --publish=7474:7474 --publish=7687:7687 -v data:/data --env=NEO4J_AUTH=none neo4j:5-community。注意这里没有设置认证,只适合本地测试。接着运行 cartography --neo4j-uri bolt://localhost:7687 --selected-modules aws,前提是你已经配置好 AWS 凭证,比如通过 AWS_PROFILE 环境变量。同步完成后,打开 http://localhost:7474 就能用 Cypher 查询。安全规则通过 cartography-rules 子命令管理:list 查看所有规则,list object_storage_public 查看特定规则,run object_storage_public 执行它。这是从零到第一次查询的最短路径。
支持平台:30 多个,但深度不一
README 列出的平台超过 30 个,包括 AWS、GCP、Azure、Kubernetes、GitHub、Okta、Entra ID、CrowdStrike 等。每个平台的模块覆盖的实体类型不同。AWS 的覆盖面很广,从 ACM 到 SQS,包括 ECR 的多架构镜像和签名。GCP 覆盖 Compute、IAM、KMS 等。但有些平台只覆盖少量实体,比如 BigFix 只有 Computers,Lastpass 只有 users。这提醒你,不是所有平台都提供同样深度的数据。如果你需要某个平台的高级资源,比如 Azure 的 Policy,可能不在支持列表里。采用前必须核对文档,确认你关心的资源类型是否被覆盖。
安全规则:把查询变成可重复的检查
Cartography 的安全规则是一组预定义的 Cypher 查询,用于发现常见问题。README 里的 object_storage_public 就是检查公共存储桶。规则可以列出、查看和运行。这意味着你不需要自己写 Cypher 就能做基础检查。但规则是静态的,不会自动运行。你需要手动执行或通过 CI 触发。另外,规则的结果直接依赖同步的数据新鲜度。如果同步间隔太长,规则可能漏掉新出现的暴露面。这不是实时监控工具,更像定期扫描。对于需要持续监控的环境,你得自己编排同步和规则执行的频率。
维护成本:Neo4j 和同步都是你的责任
Cartography 本身是 Python 包,但它的核心依赖是 Neo4j 数据库。你要自己维护这个数据库,包括备份、升级、存储规划。README 给出的快速启动命令禁用了认证,生产环境必须配置密码或使用其他认证方式。文档提到可以通过 NEO4J_PASSWORD 环境变量设置密码。同步过程是拉取模式,每次同步都会访问各平台的 API,这会产生 API 调用成本。对于大型环境,同步时间和数据量都会增长。Rust 编解码器能提升 20% 到 30% 的同步速度,但你需要额外安装 cartography[neo4j-rust]。升级 Cartography 时,要注意模块和 schema 可能变化,旧的查询可能失效。
替代方案:云原生配置工具 vs 图数据库
如果你只关心单个云平台的合规,云厂商自己的工具可能更直接。AWS Config 和 Security Hub 能提供资源合规检查,不需要额外维护数据库。但它们的查询能力限于单个账号,跨账号需要聚合。Azure Policy 类似。另一个替代是使用 CloudSploit 或 Scout Suite 这类开源扫描工具,它们输出报告而不是可查询的图。区别在于:扫描工具给你静态结果,Cartography 给你一个可以自由查询的图。如果你需要自定义关系分析,比如「哪个 IAM 角色能通过某条路径访问 S3」,图数据库更灵活。但如果你只需要定期合规报告,静态工具可能更省事。
编辑结论
Cartography 适合已经有多云环境、并且愿意维护一个 Neo4j 实例的安全工程团队。它能把 AWS、GCP、Azure、Kubernetes、GitHub 等平台的资产关系集中到一个图里,回答跨账号的权限和暴露面问题。如果你只需要单账号的资产清单,直接用云厂商的 Config 或 Security Hub 更省事。如果你不想承担 Neo4j 的运维,或者你的数据源不在支持列表里,Cartography 可能不是合适的选择。决定采用前,先确认你要同步的平台在文档的支持列表里,并评估同步频率与数据量对 Neo4j 存储的影响。另外,安全规则需要手动或通过 CI 触发,不是实时监控,这一点要在设计里明确。最后,项目采用 Apache-2.0 许可证,你可以自由使用和修改,但要注意同步的数据可能包含敏感信息,确保 Neo4j 的访问控制到位。
社区笔记