Modron - 云安全合规相关资料
作者:Sec-Labs | 发布时间:
Modron - 云安全合规性

”
We are the ultimate law. All other law is tainted when compared to us.
We are order. All other order disappears when held to our light.
We are structure. All other structure crumbles when brought against us.
We are perfect law.
”
— A spokesmodron
Monte Cook, Colin McComb (1997-10-28). 伟大的莫德伦进行曲》。米歇尔-卡特编著。(TSR, Inc.),第26页。ISBN 0-7869-0648-0。
云计算的兴起使生产环境中需要管理的资源数量急剧增加。 这增加了安全团队的负担。 与此同时,云上的漏洞和合规扫描进展甚微。 盘点、数据收集、分析和修复的过程已经扩大,但没有发展到管理云计算资产的规模和多样性。 许多安全工具仍然假设维护库存、收集数据、查看结果和解决问题是由同一个人执行的。 这导致已经被基础设施规模压得喘不过气来的团队面临更大的压力。
维护一个安全的云基础设施非常困难。 云计算带来了自动化和易用性的承诺,但在这两个方面都需要取得很多进展。 基础设施安全还受到管理资产爆炸式增长以及对新资产和现有资产缺乏安全控制的影响。
Modron 通过解决资产所有权和处理与不同资产所有者的通信来解决大型云基础设施引发的库存和所有权问题,以及修复过程的可扩展性。 Modron 仍然牢记安全从业人员和领导团队,并提供有关报告问题的组织范围的统计数据。
Modron 在设计时考虑了多云和可扩展性,如今基于 GCP。 该模型允许编写一次检测规则并在多个平台上应用它们。
项目地址
https://github.com/nianticlabs/modron
Taxonomy
资源是存在于云平台的一个实体。一个资源可以是一个虚拟机实例,一个服务账户,一个kubernetes集群,等等。
是资源的 资源组 最小管理分组,通常由同一个人或一组个人管理。 在 GCP 上,这对应于一个项目,在 Azure 上对应于一个资源组。
。 规则 是给定资源或一组资源的所需状态的实现 规则仅适用于一组预定义的资源,将资源的状态与预期状态进行比较。 如果这些状态不同,则规则会生成一个或多个 观察 。
。 观察 是资源状态与其在给定时间戳的预期状态之间差异的实例
集合 定义 了从云平台获取所有数据的操作。 然后将此数据存储在数据库中,准备运行扫描。
资源 Scan 定义了 运行一组规则 针对一组 组 的操作。 该扫描的观察 结果被添加到数据库中。 无法保证同一扫描的所有观察结果都具有相同的时间戳。
Nagatha 是与 Modron 相关的通知系统。 它聚合在给定时间范围内发送给同一收件人的通知,并向该用户发送通知。
是针对给 通知 发送给 资源组 定 观察 所有者的消息实例。
的 例外 一个所有者 是资源组 选择退出 的通知 特定 规则 。 例外 必须 有一个到期日期,并且不能永远设置。 可以通过直接访问 nagatha 服务来绕过此限制。
过程
Modron 遵循任何安全扫描引擎的流程:

除了在大多数扫描引擎中,库存和修复部分留给用户作为练习。 在 Modron 中,通过根据有权操作资源组的人员自动识别资源组的所有者来处理库存,因为通过与不同资源组所有者进行通信,很大程度上促进了补救。
- 收集器 :收集器从云平台获取数据。 必须为每个支持的代码平台分别实现此代码。 它负责流程的库存和数据收集部分。
- 规则引擎 :规则引擎针对所有收集的资源运行规则并生成观察结果。 每次观察都会向 Nagatha 发送通知。
- Nagatha 接收所有观察、聚合、重复数据删除和限制通知速率的所有通知。 它还应用用户提供的例外情况。
入门
为了安装 Modron & Nagatha,您需要:
- 构建 modron 镜像:
- 在 src/ :
gcloud builds builds submit . --tag gcr.io/your-project/modron:prod --timeout 900 - 在 src/ui/ 中:
gcloud builds builds submit . --tag gcr.io/your-project/modron-ui:prod --timeout 900 - 在 纳加塔/ :
gcloud builds submit . --tag gcr.io/your-project/nagatha:dev --timeout=900
- 创建 main.tf.example 的副本并使用您自己的配置对其进行编辑
- 跑
tf plan --out tf.plan
在
开发文件夹中
- 这可能需要多次出现,因为在 GCP 上设置资源需要时间。
- 创建 tf.tfvars.json.example 的副本并使用您自己的配置对其进行编辑
- 跑
tf plan --out tf.plan在 nagatha 文件夹中 - 分配给 Modron runner 如权限中所述,将权限
标识
由 Dall-E 生成,带有“维多利亚时代立方体机器人的标志艺术,身穿燕尾服,头戴礼帽,手持双筒望远镜”
开始在 Modron 上开发
基础设施
以下是 Modron 基础架构的概述:

两个 Modron Cloud Run 在同一个 modron 项目 中运行。 Nagatha 在一个 单独的项目 中运行。
有一个开发容器。 该项目旨在使用 VSCode 打开。
要运行此项目,您需要:
- 码头工人
- 去
- 谷歌 SDK
- protobuf 编译器
- npm
开发容器提供了这些工具。 启动时,vscode 会询问你是否要在 dev 容器中重新打开项目,接受。
如果容器内的 git 配置有问题,请设置 remote.containers.copyGitConfig为真。 微软/vscode-remote-release#6124
权限
Modron 服务旨在在 GCP 上的组织级别上工作。 为了访问运行分析所需的数据,Modron 运行器服务帐户将需要在组织级别具有以下权限:
"apikeys.keys.list",
"cloudasset.assets.searchAllIamPolicies",
"compute.backendServices.list",
"compute.instances.list",
"compute.regions.list",
"compute.subnetworks.list",
"compute.zones.list",
"container.clusters.list",
"iam.serviceAccounts.list",
"iam.serviceAccountKeys.list",
"monitoring.metricDescriptors.get",
"monitoring.metricDescriptors.list",
"monitoring.timeSeries.list",
"resourcemanager.projects.getIamPolicy",
"serviceusage.services.get",
"storage.buckets.list",
"storage.buckets.getIamPolicy",
建议创建具有这些权限的自定义角色。 为此,您可以使用此 terraform 节:
resource "google_organization_iam_custom_role" "modron_lister" {
org_id = var.org_id
role_id = "ModronSecurityLister"
title = "Modron Security Lister"
description = "All list permissions for Modron the security compliance scanner"
permissions = [
"apikeys.keys.list",
"cloudasset.assets.searchAllIamPolicies",
"compute.backendServices.list",
"compute.instances.list",
"compute.regions.list",
"compute.subnetworks.list",
"compute.zones.list",
"container.clusters.list",
"iam.serviceAccounts.list",
"iam.serviceAccountKeys.list",
"monitoring.metricDescriptors.get",
"monitoring.metricDescriptors.list",
"monitoring.timeSeries.list",
"resourcemanager.projects.getIamPolicy",
"serviceusage.services.get",
"storage.buckets.list",
"storage.buckets.getIamPolicy",
]
}
调试
像 gitlab 一样运行 gosec:
docker run -i --tty --rm --volume "$PWD":/tmp/app --env CI_PROJECT_DIR=/tmp/app registry.gitlab.com/security-products/gosec:3 /analyzer run
测试
单元测试
Modron上有不少单元测试。 如果要运行 go 测试:
cd src/
go test ./... --short
集成测试
docker-compose up --build --exit-code-from "modron_test" --abort-on-container-exit
UI 集成测试
docker-compose -f docker-compose.ui.yaml up --build --exit-code-from "modron_test" --abort-on-container-exit
在本地运行
使用 docker 命令在本地运行 modron:
cd src
chmod 644 ~/.config/gcloud/application_default_credentials.json
docker build -t modron-local:latest .
export PROJECT=modron-dev
export ORG_SUFFIX="@example.com"
export ORG_ID="0123456789"
docker run -e DATASET_ID="modron_bq" -e RESOURCE_TABLE_ID="resources" -e OBSERVATION_TABLE_ID="observations" -e GCP_PROJECT_ID="$PROJECT" -e PORT="8080" -e GOOGLE_APPLICATION_CREDENTIALS="/tmp/application_default_credentials.json" -e ORG_SUFFIX="$ORG_SUFFIX" -e ORG_ID="$ORG_ID" --mount "source=$HOME/.config/gcloud/application_default_credentials.json,target=/tmp/application_default_credentials.json,type=bind" -p 8080:8080 modron-local:latest
未来发展
- 提供已报告问题的历史视图。
- 支持 AWS 进行分析
- 支持 Azure 进行分析
- 手动安装过程