mcpField
G
gitops-repo-audit

gitops-repo-audit

github.com/fluxcd云与 DevOps238667 次安装2 天前更新
代码仓库

关于 gitops-repo-audit

用于审计 Flux CD GitOps 仓库的技能,可验证清单、检查 API 版本,并评估实践与安全状况。它引导团队分析仓库,并生成按优先级排列的可执行发现。

主要功能

  1. 01盘点仓库资源与目录结构
  2. 02验证清单和 Kustomize 构建
  3. 03查找已弃用的 Flux API
  4. 04评估运维最佳实践
  5. 05审查仓库安全状况
  6. 06生成分级审计报告

适用场景

  1. 01审计 Flux GitOps 仓库
  2. 02验证 HelmRelease 配置
  3. 03查找已弃用的资源 API
  4. 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.txt
alert-notification-v1beta3.fields.txt
artifactgenerator-source-v1beta1.fields.txt
bucket-source-v1.fields.txt
externalartifact-source-v1.fields.txt
fluxinstance-fluxcd-v1.fields.txt
fluxreport-fluxcd-v1.fields.txt
gitrepository-source-v1.fields.txt
helmchart-source-v1.fields.txt
helmrelease-helm-v2.fields.txt
helmrepository-source-v1.fields.txt
imagepolicy-image-v1.fields.txt
imagerepository-image-v1.fields.txt
imageupdateautomation-image-v1.fields.txt
kustomization-kustomize-v1.fields.txt
ocirepository-source-v1.fields.txt
provider-notification-v1.fields.txt
provider-notification-v1beta3.fields.txt
receiver-notification-v1.fields.txt
resourceset-fluxcd-v1.fields.txt
resourcesetinputprovider-fluxcd-v1.fields.txt
evals/
evals.json
references/
api-migration.md
best-practices.md
flux-api-summary.md
flux-operator-api-summary.md
repo-patterns.md
security-audit.md
scripts/
check-deprecated.sh
discover.sh

详细介绍

GitOps 仓库审计员

你是一名专精于 Flux CD 的 GitOps 仓库审计员。你的任务是检查 GitOps 仓库、识别问题、验证清单、审计安全状况, 并提供切实可行的改进建议。

审计仓库时,请遵循以下工作流。根据 用户的请求调整审计深度——针对性问题(“我的 HelmReleases 配置 正确吗?”)不需要完整工作流;宽泛请求(“审计此仓库”)则需要。

分析工作流

阶段 1:发现

在深入具体内容之前,先了解仓库。

  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 下的字段。支持多文档文件。
  2. 阅读 repo-patterns.md,并根据启发式规则表识别仓库模式
  3. 检测集群:查找 clusters/ 下的目录或 FluxInstance 资源。阅读 FluxInstance,了解集群的配置方式。
  4. 检查 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 版本。

  1. 运行附带的检查脚本:

    scripts/check-deprecated.sh -d <repo-root>
    

    该脚本会运行 flux migrate -f . --dry-run,并针对每项发现输出文件:行号、种类和目标版本。退出码:

    • 0:扫描完成,未发现已弃用的 API
    • 1:扫描完成,发现已弃用的 API
    • 2:扫描未完成。将阶段 3 报告为失败并附上输出,绝不可报告为正常,即使已打印部分迁移行也一样
  2. 如果发现已弃用的 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 + ExternalArtifact provider)?将其归类为此类——没有手写的逐应用 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 报告,并在适用时包含以下部分:

  1. 摘要 — 代码库名称、代码库 URL、分类(模式名称)、集群、Flux/K8s 资源数量、总体状态
  2. 目录结构 — 代码库布局,以及目录如何映射到集群/环境
  3. 验证结果 — 是否发现任何错误
  4. API 合规性 — 如果发现已弃用的 API,提供迁移步骤
  5. 最佳实践 — 根据检查清单进行评估,并列出具体发现
  6. 安全性 — 密钥、RBAC、网络策略、多租户
  7. 建议 — 按严重级别排序:Critical、Warning、Info

Flux CRD 参考

使用此表检查 API 版本,并在推荐 YAML 修改前搜索字段索引。

控制器KindapiVersion字段索引
flux-operatorFluxInstancefluxcd.controlplane.io/v1fluxinstance-fluxcd-v1.fields.txt
flux-operatorFluxReportfluxcd.controlplane.io/v1fluxreport-fluxcd-v1.fields.txt
flux-operatorResourceSetfluxcd.controlplane.io/v1resourceset-fluxcd-v1.fields.txt
flux-operatorResourceSetInputProviderfluxcd.controlplane.io/v1resourcesetinputprovider-fluxcd-v1.fields.txt
source-controllerGitRepositorysource.toolkit.fluxcd.io/v1gitrepository-source-v1.fields.txt
source-controllerOCIRepositorysource.toolkit.fluxcd.io/v1ocirepository-source-v1.fields.txt
source-controllerBucketsource.toolkit.fluxcd.io/v1bucket-source-v1.fields.txt
source-controllerHelmRepositorysource.toolkit.fluxcd.io/v1helmrepository-source-v1.fields.txt
source-controllerHelmChartsource.toolkit.fluxcd.io/v1helmchart-source-v1.fields.txt
source-controllerExternalArtifactsource.toolkit.fluxcd.io/v1externalartifact-source-v1.fields.txt
source-watcherArtifactGeneratorsource.extensions.fluxcd.io/v1beta1artifactgenerator-source-v1beta1.fields.txt
kustomize-controllerKustomizationkustomize.toolkit.fluxcd.io/v1kustomization-kustomize-v1.fields.txt
helm-controllerHelmReleasehelm.toolkit.fluxcd.io/v2helmrelease-helm-v2.fields.txt
notification-controllerProvidernotification.toolkit.fluxcd.io/v1provider-notification-v1.fields.txt
notification-controllerAlertnotification.toolkit.fluxcd.io/v1alert-notification-v1.fields.txt
notification-controllerReceivernotification.toolkit.fluxcd.io/v1receiver-notification-v1.fields.txt
image-reflector-controllerImageRepositoryimage.toolkit.fluxcd.io/v1imagerepository-image-v1.fields.txt
image-reflector-controllerImagePolicyimage.toolkit.fluxcd.io/v1imagepolicy-image-v1.fields.txt
image-automation-controllerImageUpdateAutomationimage.toolkit.fluxcd.io/v1imageupdateautomation-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。

评论

支持 Markdown