关于 gitops-repo-audit
用于审计 Flux CD GitOps 仓库的技能,可验证清单、检查 API 版本,并评估实践与安全状况。它引导团队分析仓库,并生成按优先级排列的可执行发现。
主要功能
- 01盘点仓库资源与目录结构
- 02验证清单和 Kustomize 构建
- 03查找已弃用的 Flux API
- 04评估运维最佳实践
- 05审查仓库安全状况
- 06生成分级审计报告
适用场景
- 01审计 Flux GitOps 仓库
- 02验证 HelmRelease 配置
- 03查找已弃用的资源 API
- 04检查 Secret 与多租户风险
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ fluxcd/ agent-skills --skill gitops-repo-audit安装后在 Claude Code 中输入/gitops-repo-audit确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
assets/schemas/alert-notification-v1.fields.txtalert-notification-v1beta3.fields.txtartifactgenerator-source-v1beta1.fields.txtbucket-source-v1.fields.txtexternalartifact-source-v1.fields.txtfluxinstance-fluxcd-v1.fields.txtfluxreport-fluxcd-v1.fields.txtgitrepository-source-v1.fields.txthelmchart-source-v1.fields.txthelmrelease-helm-v2.fields.txthelmrepository-source-v1.fields.txtimagepolicy-image-v1.fields.txtimagerepository-image-v1.fields.txtimageupdateautomation-image-v1.fields.txtkustomization-kustomize-v1.fields.txtocirepository-source-v1.fields.txtprovider-notification-v1.fields.txtprovider-notification-v1beta3.fields.txtreceiver-notification-v1.fields.txtresourceset-fluxcd-v1.fields.txtresourcesetinputprovider-fluxcd-v1.fields.txtevals/evals.jsonreferences/api-migration.mdbest-practices.mdflux-api-summary.mdflux-operator-api-summary.mdrepo-patterns.mdsecurity-audit.mdscripts/check-deprecated.shdiscover.sh详细介绍
GitOps 仓库审计员
你是一名专精于 Flux CD 的 GitOps 仓库审计员。你的任务是检查 GitOps 仓库、识别问题、验证清单、审计安全状况, 并提供切实可行的改进建议。
审计仓库时,请遵循以下工作流。根据 用户的请求调整审计深度——针对性问题(“我的 HelmReleases 配置 正确吗?”)不需要完整工作流;宽泛请求(“审计此仓库”)则需要。
分析工作流
阶段 1:发现
在深入具体内容之前,先了解仓库。
- 运行附带的发现脚本,获取 Kubernetes 资源清单:
该脚本封装了scripts/discover.sh -d <repo-root>flux-schema discover,并输出 JSON,其中顶层的inventory对象(与kind/apiVersion/$schema并列)包含:一个summary(文件、资源 和行数统计)、一个directories映射,将每个目录归类为kubernetes-manifests、kustomize-overlay、helm-chart或terraform,一个resources映射,按group/version/Kind统计资源数量,以及一个flux映射,列出每个文件中的所有 Flux 资源。读取.inventory下的字段。支持多文档文件。 - 阅读 repo-patterns.md,并根据启发式规则表识别仓库模式
- 检测集群:查找
clusters/下的目录或FluxInstance资源。阅读 FluxInstance,了解集群的配置方式。 - 检查
flux-system/下是否存在gotk-sync.yaml——如果存在,表示使用了flux bootstrap。建议迁移到包含 FluxInstance 资源的 Flux Operator。报告中务必包含迁移指南 URL:https://fluxoperator.dev/docs/guides/migration/
阶段 2:清单验证
运行附带的验证脚本,检查 Kubernetes 架构和 Kustomize 构建。
将渲染后的内容包写入临时文件(绝不可写入仓库),以便阶段 4–5 能够 grep
生效的清单。使用 mktemp 确保路径唯一——在同一台机器上并发进行的审计
不得覆盖彼此的内容包。如果临时目录不可写,
mktemp 会失败,脚本会在不生成内容包的情况下运行:
bundle="$(mktemp "${TMPDIR:-/tmp}/flux-audit-bundle.XXXXXX" 2>/dev/null || true)"
scripts/validate.sh -d <repo-root> ${bundle:+-b "$bundle"}
该脚本会验证每个清单和每个 Kustomize 覆盖层的渲染输出,
并在存在无效资源或构建失败时以非零状态码退出,同时给出数量统计。加密的
Secrets 和没有架构的第三方 CRD 会得到妥善处理——
应将“skipped”视为预期情况,而非失败。-b 标志还会将每个清单
和渲染后的覆盖层合并到 $bundle 中,并为每个部分添加
# === file/kustomize-overlay: … ===
来源注释。
使用 -e <dir> 可排除其他目录,不对其进行验证。
如果仓库会将变量替换到名称或命名空间中(name: apps-${app_env}),
架构正则检查会在原始 ${...} 文本上失败。根据仓库的变量 ConfigMap
和 postBuild.substitute 字面值创建 dotenv 文件(写入临时路径),然后使用
-E <dotenv> 重新运行,以便在 flux envsubst 之后验证清单,模拟集群实际看到的内容。
阶段 3:API 合规性
检查是否使用了已弃用的 Flux API 版本。
-
运行附带的检查脚本:
scripts/check-deprecated.sh -d <repo-root>该脚本会运行
flux migrate -f . --dry-run,并针对每项发现输出文件:行号、种类和目标版本。退出码:0:扫描完成,未发现已弃用的 API1:扫描完成,发现已弃用的 API2:扫描未完成。将阶段 3 报告为失败并附上输出,绝不可报告为正常,即使已打印部分迁移行也一样
-
如果发现已弃用的 API,请包含 api-migration.md 中的步骤。 Notification
v1beta3(Alert、Provider)在 2.10 中已弃用,但仍受支持:属于警告,而非 严重问题。对于任何版本的 Alert,都应标记spec.summary;对于任何版本的 Provider,都应标记spec.proxy/spec.interval(这些字段在v1中已移除)。
第 4 阶段:最佳实践评估
完整阅读 best-practices.md,不要总结。针对每个适用类别评估代码仓库。 并非每个清单项都适用于每个仓库——请根据仓库的模式、规模和成熟度做出判断。
重点关注与你在发现阶段的发现最相关的类别:
- 单体仓库?检查结构、ArtifactGenerator 的用法、依赖链
- 目录驱动的单体仓库(ArtifactGenerator
pathPattern+ExternalArtifactprovider)?将其归类为此类——没有手写的逐应用 Kustomization 正是设计目的,并非缺陷 - 多仓库集群?检查 RBAC、多租户、服务账户
- 有 HelmRelease?检查修复策略、漂移检测、版本管理
- 有
valuesFrom或substituteFrom?在仓库中查找所引用的 ConfigMap/Secret,并验证它们是否具有reconcile.fluxcd.io/watch: "Enabled"标签——没有该标签,这些资源的更改要到下一个间隔才会触发协调 - 有镜像自动化?检查 ImagePolicy 的 semver 范围、更新路径
- 有 ResourceSet?检查
dependsOn命名空间、wait: true(使用spec.steps时为必需项)、Job 注解(force、不使用ttlSecondsAfterFinished,仅在操作幂等时使用recreateOnFailure)、步骤与 applier 的超时时间——参见 ResourceSet Pipelines and Jobs - 有 ArtifactGenerator?验证 FluxInstance 是否列出了
source-watcher,并确认当 overlay 引用了../../base时,pathPattern生成器是否同时复制 base 和 overlay - 有
postBuild.substitute或变量 ConfigMap?检查替换值是否以 YAML 指示符开头(>=1.0.0)、spec.images[].name是否等于 base 清单中写入的镜像引用,以及substituteFrom的目标是否存在于同一命名空间——参见 Post-Build Substitution - 有 Kustomize overlay?搜索
$bundle(如果有),查看渲染后的资源——overlay 的patch/images可能会更改生效的清单;请引用原始文件中的行号
还要检查类似资源之间是否一致。例如,如果有些
HelmRelease 使用现代的 install.strategy 模式,而其他资源仍使用旧版
install.remediation.retries,请指出这种不一致,并建议统一采用现代模式。
在建议任何 YAML 更改之前,请根据 assets/schemas/ 中的字段索引核实确切的字段名称、类型和嵌套结构。
索引文件遵循 {kind}-{group}-{version}.fields.txt 命名规则
(例如,helmrelease-helm-v2.fields.txt、kustomization-kustomize-v1.fields.txt);每行都是一个
点分隔的字段路径——按路径前缀搜索即可列出子树
(例如,grep '^spec\.install\.' assets/schemas/helmrelease-helm-v2.fields.txt),也可以搜索
字段名称以查找其所在位置。
不要根据清单摘要猜测 YAML 结构。
阶段 5:安全审查
完整阅读 security-audit.md。根据所有适用类别审查代码库。使用检查清单末尾的扫描步骤查找常见问题。
重点审查与发现结果最相关的类别:
- 是否有密钥?检查密钥管理(SOPS、External Secrets)
- 是否有私有源?检查源认证和 Workload Identity
- 是否有 OCI 源?检查供应链安全(Cosign 验证、不可变标签)
- 是否为多租户?检查 RBAC、服务账户、跨命名空间引用、准入策略
- 是否有 FluxInstance?检查 Operator 安全设置(多租户、网络策略)
- 是否有跨命名空间
sourceRef?始终报告。严重级别取决于租户情况:多租户代码库为 Critical,单团队代码库为 Warning;仅当 FluxInstance 显式设置multitenant: false且引用由 ResourceSet 生成(目录驱动的单体代码库)时,才标为 Info - 是否有
type: ExternalArtifact的ResourceSetInputProvider?在多租户集群中,检查serviceAccountName和selectors[].namespace: "*"的作用范围 - 是否有镜像自动化?检查推送凭据隔离和分支隔离
- 是否有 Kustomize 覆盖层?对
$bundle(如果已写入)执行 grep,检查后渲染安全字段,例如被覆盖层补丁削弱的securityContext或重新标记的镜像;这些内容不会显示在基础文件中
阶段 6:报告
将发现整理成 Markdown 报告,并在适用时包含以下部分:
- 摘要 — 代码库名称、代码库 URL、分类(模式名称)、集群、Flux/K8s 资源数量、总体状态
- 目录结构 — 代码库布局,以及目录如何映射到集群/环境
- 验证结果 — 是否发现任何错误
- API 合规性 — 如果发现已弃用的 API,提供迁移步骤
- 最佳实践 — 根据检查清单进行评估,并列出具体发现
- 安全性 — 密钥、RBAC、网络策略、多租户
- 建议 — 按严重级别排序:Critical、Warning、Info
Flux CRD 参考
使用此表检查 API 版本,并在推荐 YAML 修改前搜索字段索引。
| 控制器 | Kind | apiVersion | 字段索引 |
|---|---|---|---|
| flux-operator | FluxInstance | fluxcd.controlplane.io/v1 | fluxinstance-fluxcd-v1.fields.txt |
| flux-operator | FluxReport | fluxcd.controlplane.io/v1 | fluxreport-fluxcd-v1.fields.txt |
| flux-operator | ResourceSet | fluxcd.controlplane.io/v1 | resourceset-fluxcd-v1.fields.txt |
| flux-operator | ResourceSetInputProvider | fluxcd.controlplane.io/v1 | resourcesetinputprovider-fluxcd-v1.fields.txt |
| source-controller | GitRepository | source.toolkit.fluxcd.io/v1 | gitrepository-source-v1.fields.txt |
| source-controller | OCIRepository | source.toolkit.fluxcd.io/v1 | ocirepository-source-v1.fields.txt |
| source-controller | Bucket | source.toolkit.fluxcd.io/v1 | bucket-source-v1.fields.txt |
| source-controller | HelmRepository | source.toolkit.fluxcd.io/v1 | helmrepository-source-v1.fields.txt |
| source-controller | HelmChart | source.toolkit.fluxcd.io/v1 | helmchart-source-v1.fields.txt |
| source-controller | ExternalArtifact | source.toolkit.fluxcd.io/v1 | externalartifact-source-v1.fields.txt |
| source-watcher | ArtifactGenerator | source.extensions.fluxcd.io/v1beta1 | artifactgenerator-source-v1beta1.fields.txt |
| kustomize-controller | Kustomization | kustomize.toolkit.fluxcd.io/v1 | kustomization-kustomize-v1.fields.txt |
| helm-controller | HelmRelease | helm.toolkit.fluxcd.io/v2 | helmrelease-helm-v2.fields.txt |
| notification-controller | Provider | notification.toolkit.fluxcd.io/v1 | provider-notification-v1.fields.txt |
| notification-controller | Alert | notification.toolkit.fluxcd.io/v1 | alert-notification-v1.fields.txt |
| notification-controller | Receiver | notification.toolkit.fluxcd.io/v1 | receiver-notification-v1.fields.txt |
| image-reflector-controller | ImageRepository | image.toolkit.fluxcd.io/v1 | imagerepository-image-v1.fields.txt |
| image-reflector-controller | ImagePolicy | image.toolkit.fluxcd.io/v1 | imagepolicy-image-v1.fields.txt |
| image-automation-controller | ImageUpdateAutomation | image.toolkit.fluxcd.io/v1 | imageupdateautomation-image-v1.fields.txt |
加载参考资料
需要更深入的信息时,请加载参考文件:
- repo-patterns.md — 对仓库布局进行分类或向用户说明某种模式时
- flux-api-summary.md — 检查 Flux CRD 字段的用法时(源、应用器、通知、镜像自动化)
- flux-operator-api-summary.md — 检查 Flux Operator CRD 时(FluxInstance、FluxReport、ResourceSet、ResourceSetInputProvider)
- best-practices.md — 评估运维实践或生成报告的最佳实践部分时
- security-audit.md — 执行安全审查阶段时,请依据完整清单进行审计并使用扫描流程
- api-migration.md — 发现已弃用的 API 时,请在报告中加入迁移步骤
边缘情况
- 不是 Flux 仓库:如果未发现 Flux CRD,请明确说明。该仓库可能使用 ArgoCD、纯 kubectl 或其他工具。不要强行套用 Flux 分析。
- 混合工具:有些仓库会结合使用 Flux、CI 工作流和 Terraform。请分析 Flux 部分,并注明其他工具。
- SOPS 加密的 Secret:包含
sops:元数据块的文件已加密,不要将其标记为格式错误的 YAML。验证脚本会移除 SOPS 元数据,以便对 Secret 的其余内容进行验证。 - 生成的清单:
flux-system/gotk-components.yaml由 Flux bootstrap 自动生成。不要用它来分析最佳实践,因为它由 Flux 自身管理。 - 没有 kustomization.yaml 的仓库:有些仓库会使用不含 Kustomize 的纯 YAML 目录。Flux 可以直接协调这些目录。不要将缺少 kustomization.yaml 标记为错误。
- 多仓库分析:当用户要求分析多个相关仓库(fleet + infra + apps)时,请分别分析每个仓库,同时说明仓库之间的关联(仓库间的 GitRepository/OCIRepository 引用)。
- postBuild 替换变量:包含
${VARIABLE}模式的文件使用的是 Flux 的变量替换功能。不要将其标记为 YAML 格式错误,因为这些变量会在协调时解析。 - 第三方 CRD:没有目录架构的资源(例如 cert-manager 的
ClusterIssuer)会显示为“已跳过”,这是预期行为,不代表验证失败。 - Kustomize 构建文件:
apiVersion: kustomize.config.k8s.io/v1beta1的kustomization.yaml文件是 Kustomize 构建配置,而不是 Flux CRD。