cwayne18/rancher-patcher
GitHub: cwayne18/rancher-patcher
rancher-patcher 是一个 CLI 工具,用于在 Rancher 正式版本之间从 Prime registry 拉取 CVE 修复镜像并对集群中的组件 Deployment 进行原地修补,无需执行完整的 Rancher 版本升级。
Stars: 0 | Forks: 0
# rancher-patcher(概念验证)
`rancher-patcher` 是一个小型 CLI 工具,专门用于在**官方 Rancher 版本发布之间**,拉取 Rancher 管理的组件镜像的 **CVE 修复重建版本**,它仅使用 **Rancher Prime registry**(`registry.rancher.com`)。
这是一个基于 [`rancher/rke2-patcher`][rke2-patcher] 构建的概念验证工具,后者针对 RKE2 组件镜像执行相同的操作。`rke2-patcher` 修补的是 RKE2 的 `HelmChartConfig` 对象,而 `rancher-patcher` 的目标则是 Rancher 管理的 Deployment(Fleet、Rancher operators、Rancher Turtles,以及——作为实验性功能——Rancher server 和 cluster agent)。
## 两种版本间更新方式
Rancher 向 Prime registry 发布了两种类型的 CVE 修复镜像,借助本工具,您可以**无需**进行完整的 Rancher 升级即可过渡到这些镜像:
1. **原地重建版本** —— 即 `…-hotfix-*` 或 `…-security*` 标签,它们使用修复过的基础层重新构建*相同*的 GA 版本。目前只有 `rancher`、`rancher-agent`、`fleet` 和 `fleet-agent` 提供此类镜像。
2. **补丁级版本升级** —— 在**相同的 `X.Y` 版本线**上升级到更新的 `vX.Y.Z`(例如从 `v10.0.2` 升级到 `v10.0.4`)。这使得那些仅发布标准 semver 的 operators 能够发挥作用:补丁版本通常包含 CVE 修复,且不会引入破坏性的 API 变更。
`rancher-patcher` 会将您当前的 **`major.minor` 版本线**上的镜像更新至符合条件的新版本——无论该版本是重建版本还是更高版本的补丁——但它**绝不会**跨跃到不同的**次要或主版本**。跨跃次要/主版本属于完整的 Rancher 版本升级,应交由 Rancher 的常规工具来处理。
## 为什么仅支持 Prime
版本发布间的 CVE 重建版本(`…-hotfix-*` / `…-security*`)**仅**发布到 Prime registry(`registry.rancher.com`)。公开的 Docker Hub 镜像(`docker.io`)仅保留在其原始构建日期发布的完整 GA 版本。因此,`rancher-patcher` **拒绝针对 Docker Hub 进行操作**,并将 Prime registry 作为默认选项。该工具进行身份验证的方式是遵循 Prime registry 在其 `WWW-Authenticate` 头中声明的任何 Bearer token 领域(这与 `rke2-patcher` 使用的挑战流程相同);它没有对 auth server 的任何信息进行硬编码。
## 45 天的补丁窗口期
与 `rke2-patcher` 一样,`rancher-patcher` 强制执行一个 **45 天的窗口期**,以确保用户在有完整版本可用时能够及时更新:
- 该窗口期的**零点**是**您当前运行的 GA 版本的构建日期**(通过 Prime registry 上镜像配置中的 `created` 时间戳解析得出——这相当于 RKE2 中通过标签指定的构建日期)。
- 同一 `major.minor` 版本线上的更新镜像(无论是重建版本**还是**补丁升级)只有在构建日期距离零点**在 45 天以内**时,才**符合**更新条件。
- 超过 45 天后,修补操作将被**拒绝**,系统会提示您将 Rancher 升级到下一个版本。
- `rancher-patcher` 只会在次要版本线内提升**补丁**级别(例如从 `v0.13.4` 升级到 `v0.13.6`),但**绝不**跨跃**次要或主版本**(例如从 `v0.13.x` 升级到 `v0.14.0`);那属于完整的 Rancher 升级,而非简单的修补。
## 构建
```
CGO_ENABLED=0 go build -o rancher-patcher .
# 或
make build
```
## 命令
```
rancher-patcher --version
rancher-patcher --config
rancher-patcher image-list
rancher-patcher image-cve
rancher-patcher image-patch [--dry-run] [--yes|-y]
rancher-patcher image-reconcile [--dry-run] [--yes|-y]
```
- `--version` 打印 CLI 版本;如果可以连接到 `kubectl` 和集群,还会打印集群的 `gitVersion`。即使没有可用的集群,该命令也会执行成功。
- `--config` 打印有效配置(registry、补丁窗口期、支持的组件等)。
标志参数可以出现在组件之前或之后(例如,`image-patch --dry-run fleet` 和 `image-patch fleet --dry-run` 都是有效的)。
### `image-list`
列出组件在 Prime registry 上的标签,按 GA 版本分组(最新版本优先),并且——对于当前运行的 `major.minor` 版本线(或在无法连接到集群时选择最新的版本线)——显示每个补丁候选版本(更高版本的补丁发布以及 `hotfix`/`security` 重建版本)及其构建日期和补丁窗口期状态。
```
rancher-patcher image-list fleet
```
### `image-cve`
检测集群中当前运行的镜像,并使用本地的 `trivy` 二进制文件对其进行扫描(概念验证的本地模式)。需要集群访问权限,并且 `PATH` 中必须包含 `trivy`。
```
rancher-patcher image-cve fleet
```
### `image-patch`
检测当前运行的镜像,然后在 45 天的窗口期内,将组件 Deployment 修补到**相同 `major.minor` 版本线**上**最新且符合条件**的 Prime 镜像——这可能是一个更高版本的补丁发布,也可能是 `hotfix`/`security` 重建版本。目标容器是通过**镜像仓库**(而不是容器名称)进行匹配的,因此即使不同 Rancher 版本间的容器名称不同,它也能正常工作。
```
rancher-patcher image-patch fleet --dry-run # preview the change
rancher-patcher image-patch fleet # apply (prompts for confirmation)
rancher-patcher image-patch fleet --yes # apply non-interactively (CI)
```
在以下情况下,它将拒绝修补:
- 当前运行的镜像已经是其版本线上最新且符合条件的镜像。
- 仅有的较新镜像超出了 45 天的窗口期(系统会提示您升级 Rancher)。
- 目标版本会跨跃到更新的**次要或主版本**(相反,它会提示您有完整的升级可用)。
### `image-reconcile`
将组件还原回其 GA 发布镜像(撤销之前应用过的补丁)。
```
rancher-patcher image-reconcile fleet --dry-run
rancher-patcher image-reconcile fleet
```
## 支持的组件
要进行修补的容器是通过 **Prime 镜像仓库**进行匹配的,因此下文中的 namespace/deployment 坐标均为默认的 Rancher 安装规范——请根据您的实际环境进行确认。
### 目前提供原地重建版本(`hotfix`/`security`)
| 组件 | Prime 仓库 | 工作负载 (namespace / deployment) |
|-----------------|------------------------|-----------------------------------------------|
| `fleet` | `rancher/fleet` | `cattle-fleet-system` / `fleet-controller` |
| `fleet-agent` | `rancher/fleet-agent` | `cattle-fleet-local-system` / `fleet-agent` |
| `rancher` | `rancher/rancher` | `cattle-system` / `rancher` — **实验性**|
| `rancher-agent` | `rancher/rancher-agent`| `cattle-system` / `cattle-cluster-agent` — **实验性** |
### 补丁升级候选项(标准 semver 发布,已预配置)
这些组件目前仅提供完整的 GA semver,因此 `rancher-patcher` 可以帮助您在窗口期内,将它们升级到同一次要版本线上更高的**补丁**版本。它们已经被预先配置好,因此一旦 Rancher 开始为它们发布 Prime 重建版本,它们也能立即受益。
| 组件 | Prime 仓库 | 工作负载 (namespace / deployment) |
|-----------------------------|------------------------------------|------------------------------------------------------------|
| `rancher-turtles` | `rancher/turtles` | `rancher-turtles-system` / `rancher-turtles-controller-manager` |
| `rancher-webhook` | `rancher/rancher-webhook` | `cattle-system` / `rancher-webhook` |
| `backup-restore-operator` | `rancher/backup-restore-operator` | `cattle-resources-system` / `rancher-backup` |
| `cis-operator` | `rancher/cis-operator` | `cis-operator-system` / `cis-operator` |
| `aks-operator` | `rancher/aks-operator` | `cattle-system` / `aks-config-operator` |
| `eks-operator` | `rancher/eks-operator` | `cattle-system` / `eks-config-operator` |
| `gke-operator` | `rancher/gke-operator` | `cattle-system` / `gke-config-operator` |
| `rancher-csp-adapter` | `rancher/rancher-csp-adapter` | `cattle-csp-adapter-system` / `rancher-csp-adapter` |
| `prometheus-federator` | `rancher/prometheus-federator` | `cattle-monitoring-system` / `prometheus-federator` |
| `system-upgrade-controller` | `rancher/system-upgrade-controller`| `cattle-system` / `system-upgrade-controller` |
| `neuvector-controller` | `rancher/neuvector-controller` | `cattle-neuvector-system` / `neuvector-controller-pod` |
### 有意排除在范围之外的内容
节点级镜像(RKE2/k3s、`hardened-*`、CNI 等)属于 `rke2-patcher` 的管辖范围。`mirrored-*` 镜像属于上游第三方镜像,Rancher 仅对其进行重新托管,因此它们没有对应的 Rancher 补丁线。这两者均被排除在外。
### 关于 `rancher`/`rancher-agent` 的说明(“如果可能的话”)
修补 **Rancher server 镜像**以及与之关联的 **cluster agent** 虽受支持,但被标记为**实验性**功能:
- server 镜像与其内嵌的 Helm charts 和 CRD 紧密耦合,因此直接进行原地替换的风险要比修补像 Fleet 这样的叶子组件更高。
- cluster agent 与 server 存在版本锁定关系,只能在与之同步的情况下进行移动。
对于这两者,`rancher-patcher` 需要额外的明确确认。在生产环境中,Rancher server 的修补仍应通过 Rancher 的常规升级工具进行;此概念验证仅演示了该机制,并非官方支持的升级路径。
## 配置
| 环境变量 | 默认值 | 描述 |
|-----------------------------|------------------------|--------------------------------------------------------------------|
| `RANCHER_PATCHER_REGISTRY` | `registry.rancher.com` | Prime registry 主机。Docker Hub 主机将被拒绝。 |
内置的 45 天补丁窗口期符合 `rke2-patcher` 的规范。
## 要求
- 对于 `image-list`:需要能够访问 Prime registry 的网络连接。无需集群(它将报告当前运行的版本为未知)。
- 对于 `image-cve`、`image-patch`、`image-reconcile`:需要配置好针对目标集群的 `kubectl`。
- 对于 `image-cve`:需要本地 `trivy` 二进制文件(概念验证的本地扫描模式)。
## 布局
```
internal/
cmd/ CLI wiring, 45-day window, command orchestration
components/ supported component → Prime repository + workload mapping
registry/ Prime registry client (Bearer challenge, tag listing, build-date resolution, semver parsing)
kube/ minimal kubectl shell-out wrapper
```
标签:EVTX分析, Pandas, Rancher, 容器镜像, 日志审计, 漏洞补丁, 请求拦截, 运维工具