ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Trivy 与 AWS Security Hub 集成实战:使用 ASFF 模板上报漏洞、错误配置与密钥发现

Trivy 与 AWS Security Hub 集成实战:使用 ASFF 模板上报漏洞、错误配置与密钥发现 Trivy 与 AWS Security Hub 集成实战使用 ASFF 模板上报漏洞、错误配置与密钥发现【免费下载链接】trivyFind vulnerabilities, misconfigurations, secrets, SBOM in containers, Kubernetes, code repositories, clouds and more项目地址: https://gitcode.com/GitHub_Trending/tr/trivy本指南以 Trivy 官方提供的asff.tpl模板为主线讲解如何将 Trivy 扫描容器镜像、仓库等目标得到的漏洞Vulnerabilities、错误配置Misconfigurations与密钥Secrets发现转换为 AWS Security Hub 的 ASFFAWS Security Findings Format格式并批量导入实现安全发现的一站式聚合。读完本文你将掌握 ASFF 报告生成命令、ProductArn与AwsAccountId环境变量约定、batch-import-findings上传流程及其 100 条/请求的限制与绕过方案并能基于模板源码定制属于自己的 ASFF 输出。为什么选择 ASFF把分散的扫描发现汇入统一视图AWS Security Hub 是 AWS 提供的集中式安全发现管理服务它聚合来自多个 AWS 服务与第三方合作伙伴产品的安全检查结果。Trivy 作为容器、Kubernetes、代码仓库与云配置的多面手扫描器其扫描结果默认以表格、JSON、SARIF 等格式输出当企业希望把所有镜像与仓库的扫描发现统一纳入 Security Hub 进行分级告警、自动修复编排如联动 EventBridge时就需要将 Trivy 的结果转换为 Security Hub 原生识别的 ASFF 格式。Trivy 提供了contrib/asff.tpl这一官方 Go 模板contrib/asff.tpl配合--format template即可把扫描结果渲染成 ASFF JSON。该模板同时覆盖三类发现软件漏洞Vulnerabilities对应 ASFF 类型Software and Configuration Checks/Vulnerabilities/CVE错误配置Misconfigurations对应类型Software and Configuration Checks密钥Secrets对应类型Sensitive Data Identifications。整体工作流从扫描到入库的四步链路将 Trivy 发现导入 AWS Security Hub 的核心流程如下生成 ASFF 文件用--format template --template contrib/asff.tpl扫描目标产出符合 ASFF 语法外层带Findings键的 JSON 文件启用集成对目标账户与区域执行一次aws securityhub enable-import-findings-for-product将 aquasecurity 注册为发现提供方剥离外层包装ASFF API 要求上传的是 findings 数组本身使用jq .Findings提取内层数组批量导入通过aws securityhub batch-import-findings --findings file://report.asff上传注意单请求上限为 100 条。下文逐步展开每个环节的精确命令与背后的实现细节。第一步用 asff.tpl 生成 ASFF 报告在仓库根目录执行以下命令以扫描golang:1.12-alpine镜像为例$ AWS_REGIONus-west-1 AWS_ACCOUNT_ID123456789012 trivy image --format template --template contrib/asff.tpl -o report.asff golang:1.12-alpine命令要点拆解要素说明--format template使用模板输出格式pkg/types/report.go中定义的内置格式之一--template contrib/asff.tpl前缀表示模板从文件路径读取从源码看模板文件必须带有.tpl扩展名否则会报错template file must have .tpl extension-o report.asff将渲染结果写入文件而非标准输出AWS_REGION、AWS_ACCOUNT_IDASFF 模板运行时必需的两个环境变量详见下文值得注意的两点实现事实对应 pkg/flag/report_flags.go 中的校验逻辑若指定了--template却未搭配--format template模板会被忽略并给出警告反之只写--format template而不给--template也会被忽略。二者必须成对使用。模板渲染底层由 pkg/report/template.go 中的TemplateWriter完成NewTemplateWriter通过strings.CutPrefix(outputTemplate, )识别文件路径并读取内容随后用 Go 标准库text/template结合 Sprig 函数库解析执行执行时以report.Results即[]Result作为模板数据源。这解释了asff.tpl最外层为何是range .遍历结果集。第二步理解 ProductArn 与环境变量约定ASFF 模板在渲染时通过 Sprig 的env函数读取两个环境变量缺一不可AWS_REGION写入ProductArn的 Region 段以及每个 finding 的Resources[0].Region字段AWS_ACCOUNT_ID写入每个 finding 的AwsAccountId字段。模板中ProductArn的构造方式见 contrib/asff.tpl遵循 AWS 对合作伙伴产品资源类型的要求ProductArn: arn:aws:securityhub:{{ env AWS_REGION }}::product/aquasecurity/aquasecurity,即渲染后形如arn:aws:securityhub:us-west-1::product/aquasecurity/aquasecurity。注意 ARN 中 Product ID 段为空这是 aquasecurity 作为 AWS 合作伙伴Partner产品在 Security Hub 中的标准命名空间格式。在正式上传前需要为目标账户启用该产品的发现导入每个账户/区域执行一次即可aws securityhub enable-import-findings-for-product --product-arn arn:aws:securityhub:AWS_REGION::product/aquasecurity/aquasecurity第三步剥离 Findings 外层包装并上传模板产出的文件按 ASFF API 语法组织顶层是一个键为Findings、值为 finding 数组的对象。而 AWS CLI 的batch-import-findings期望直接接收 findings 数组因此必须去掉外层包装。最简便的做法是借助jqcat report.asff | jq .Findings得到纯数组后再通过 AWS CLI 上传$ aws securityhub batch-import-findings --findings file://report.asff整个上传前建议先做一次管道演练jq .Findings report.asff的输出即为将要提交的数组内容可借此先行人工核对字段是否符合预期。第四步应对 100 条/请求的上传上限batch-import-findings单次请求最多只能携带 100 条 finding。当扫描结果较多大型镜像或仓库的漏洞往往远超此数时需要分批上传。官方推荐仍使用jq切片jq .[:100] report.asff 1 short_report.asff即每次截取前 100 条生成子文件后上传重复执行直至全部完成。若需要脚本化可围绕length与切片表达式编写循环每次--findings file://short_report.asff上传一批。注意此限制属于 AWS API 侧约束batch-import-findings的选项说明中有明确标注与 Trivy 无关。asff.tpl 源码级解析三类发现的字段映射对照 contrib/asff.tpl 与集成测试的 golden 文件如 integration/testdata/alpine-310.asff.golden、integration/testdata/secrets.asff.golden可以提炼出模板对三类发现的核心映射ASFF 字段漏洞Vulnerabilities错误配置Misconfigurations密钥SecretsSchemaVersion2018-10-08三类相同同左同左IdTarget/VulnerabilityIDTarget/IDTargetGeneratorIdTrivy/VulnerabilityIDTrivy/IDTrivyTypesSoftware and Configuration Checks/Vulnerabilities/CVESoftware and Configuration ChecksSensitive Data IdentificationsSeverity.Label由扫描严重级别映射见下同左同左Resources[0].TypeContainerOtherOtherResources[0].DetailsContainer.ImageNameOtherCVE ID/标题、包名、已装/修复版本、NVD CVSS v2/v3 分数与向量OtherMessage、Filename、StartLine、EndLineOtherFilenameRecordStateACTIVE三类相同同左同左值得展开的模板细节严重级别映射由于 ASFF 的Severity.Label合法取值不含UNKNOWN模板在渲染前将其统一替换为INFORMATIONAL保证 JSON 严格符合 Security Hub 的枚举约束。长文本截断Description超过 512 字符时截断并追加..后缀ImageName超过 127 字符时保留末尾 124 字符并补...前缀规避 Security Hub 对字段长度的限制。CVSS 数据通过模板函数sourceID nvd定位 NVD 数据源再用(index .CVSS ...).V3Score等索引取出分数与向量缺失时渲染为空字符串。时间戳CreatedAt/UpdatedAt使用 Sprig 的now | date 2006-01-02T15:04:05.999999999Z07:00生成 Go 布局的 RFC3339 时间。转义Description、Title、Message等自由文本经escapeString底层即html.EscapeString处理后再用printf %q输出为带引号的 JSON 字符串防止特殊字符破坏 JSON 结构escapeString等函数由 pkg/report/template.go 注册进模板函数表。自定义 asff.tpl按需裁剪与扩展官方模板通过前缀加载任意路径下的自定义模板因此你可以直接复制contrib/asff.tpl到自己的项目中进行定制例如调整Title文案、增删Other字段、变更ProductFields、为错误配置补充自定义属性等。使用方式与内置模板完全一致$ export AWS_REGIONus-west-1 $ export AWS_ACCOUNT_ID123456789012 $ trivy image --format template --template your-asff.tpl -o report.asff golang:1.12-alpine需要注意无论模板如何定制以下三点是保证导入成功的前提模板渲染时可直接调用 Sprig 函数库及escapeString、escapeXML、endWithPeriod、sourceID、appVersion等 Trivy 内置函数输出必须是合法的 JSON推荐保持Findings顶层结构再按上文用jq .Findings提取字段值必须遵守 ASFF 的枚举与长度约束尤其是Severity.Label、Types、RecordState与各长度上限。验证与测试golden 文件如何保证输出稳定ASFF 输出并非黑盒仓库的集成测试在客户端/服务端两种模式下都会用../contrib/asff.tpl渲染扫描结果并与预生成的 golden 文件逐字节比对见 integration/client_server_test.go 中 alpine 3.10 with ASFF template 与 scan secrets with ASFF template 两个用例。其中integration/testdata/alpine-310.asff.golden 展示了漏洞类 finding 的完整形态包含Remediation.Recommendation.Url指向 AVD 漏洞详情页、NVD CVSS 分数与向量、已安装/已修复版本等integration/testdata/secrets.asff.golden 展示了密钥类 findingGeneratorId为TrivyId为文件名如deploy.shSeverity.Label直接取扫描结果如CRITICAL。这意味着只要你的 Trivy 版本产出的 golden 与模板一致上述流程对任何目标镜像、仓库、文件系统均适用若未来模板发生字段变更测试会第一时间暴露差异。进一步阅读模板源码contrib/asff.tpl同目录下还有gitlab.tpl、junit.tpl、html.tpl等可参考的其它官方模板模板引擎实现pkg/report/template.go模板参数与格式校验pkg/flag/report_flags.go报告与结果数据结构pkg/types/report.go集成测试与 golden 样例integration/client_server_test.go、integration/testdata/alpine-310.asff.golden。如果希望在 CI/CD 流水线中实现扫描即上报可将上述四步封装为一个 Job先trivy image生成report.asff再用jq分批切割并循环调用batch-import-findings即可让每次构建的容器安全态势自动沉淀到 AWS Security Hub 统一视图。【免费下载链接】trivyFind vulnerabilities, misconfigurations, secrets, SBOM in containers, Kubernetes, code repositories, clouds and more项目地址: https://gitcode.com/GitHub_Trending/tr/trivy创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表