google/k8s-digester
GitHub: google/k8s-digester
该工具将 Kubernetes 清单中的容器镜像标签自动解析为不可变的镜像摘要,以确保部署的镜像可验证且不可篡改。
Stars: 158 | Forks: 22
# Digester
Digester 将标签解析为
[digest](https://cloud.google.com/solutions/using-container-images),适用于
Kubernetes
[Pod](https://kubernetes.io/docs/concepts/workloads/pods/) 和
[Pod 模板](https://kubernetes.io/docs/concepts/workloads/pods/#pod-templates)
规范中的容器和 init 容器镜像。
它将使用标签的容器镜像引用:
```
spec:
containers:
- image: gcr.io/google-containers/echoserver:1.10
```
替换为使用镜像 digest 的引用:
```
spec:
containers:
- image: gcr.io/google-containers/echoserver:1.10@sha256:cb5c1bddd1b5665e1867a7fa1b5fa843a47ee433bbb75d4293888b71def53229
```
Digester 既可以作为 Kubernetes 集群中的
[变更准入 Webhook](https://kubernetes.io/docs/reference/access-authn-authz/extensible-admission-controllers/)
运行,也可以作为客户端的
[Kubernetes Resource Model (KRM) 函数](https://kpt.dev/book/02-concepts/03-functions)
与 [kpt](https://kpt.dev/) 或
[kustomize](https://kubectl.docs.kubernetes.io/guides/introduction/kustomize/)
命令行工具一起运行。
如果标签指向
[image index](https://github.com/opencontainers/image-spec/blob/master/image-index.md#oci-image-index-specification)
或
[manifest list](https://docs.docker.com/registry/spec/manifest-v2-2/#manifest-list),
digester 会将标签解析为 image index 或 manifest list 的 digest。
该 Webhook 在命名空间级别通过标签选择启用,请参阅
[部署 Webhook](#deploying-the-webhook)。
如果您使用
[Binary Authorization](https://cloud.google.com/binary-authorization/docs),
digester 可以帮助确保只有经过验证的容器镜像才能部署到您的集群中。Binary Authorization
[attestation](https://cloud.google.com/binary-authorization/docs/key-concepts#attestations)
对于特定的容器镜像 digest 有效。您必须通过 digest 部署容器镜像,以便 Binary Authorization 能够验证容器镜像的 attestation。您可以使用 digester 通过 digest 部署容器镜像。
## 运行 KRM 函数
1. 从
[Releases 页面](../../releases)下载适用于您平台的 digester 二进制文件。
或者,您可以使用以下命令下载最新版本:
VERSION=v0.1.16
curl -Lo digester "https://github.com/google/k8s-digester/releases/download/${VERSION}/digester_$(uname -s)_$(uname -m)"
chmod +x digester
2. [安装 kpt](https://kpt.dev/installation/) v1.0.0-beta.1 或更高版本,和/或
[安装 kustomize](https://kubectl.docs.kubernetes.io/installation/kustomize/)
v3.7.0 或更高版本。
3. 使用 kpt 或 kustomize 运行 digester KRM 函数:
- 使用 kpt:
kpt fn eval [manifest directory] --exec ./digester
- 使用 kustomize:
kustomize fn run [manifest directory] --enable-exec --exec-path ./digester
通过作为可执行文件运行,digester KRM 函数可以访问当前环境中的容器镜像仓库凭证,例如当前用户的
[Docker 配置文件](https://github.com/google/go-containerregistry/blob/main/pkg/authn/README.md#the-config-file)
和
[凭证助手](https://docs.docker.com/engine/reference/commandline/login/#credential-helper-protocol)。
有关更多信息,请参阅 digester 关于
[向容器镜像仓库进行身份验证](docs/authentication.md)的文档。
## 部署 Webhook
digester Webhook 需要 Kubernetes v1.16 或更高版本。
1. 如果您使用 Google Kubernetes Engine (GKE),请为自己授予 `cluster-admin` Kubernetes
[集群角色](https://kubernetes.io/docs/reference/access-authn-authz/rbac/):
kubectl create clusterrolebinding cluster-admin-binding \
--clusterrole cluster-admin \
--user "$(gcloud config get core/account)"
2. 在您的 Kubernetes 集群中安装 digester Webhook:
VERSION=v0.1.16
kubectl apply -k "https://github.com/google/k8s-digester.git/manifests/?ref=${VERSION}"
3. 将 `digest-resolution: enabled` 标签添加到您希望 Webhook 将标签解析为 digest 的命名空间:
kubectl label namespace [NAMESPACE] digest-resolution=enabled
要配置 Webhook 如何向您的容器镜像仓库进行身份验证,请参阅关于
[向容器镜像仓库进行身份验证](https://github.com/google/k8s-digester/blob/main/docs/authentication.md#authenticating-to-container-image-registries)的文档。
如果您想使用 kustomize 或 kpt 安装 Webhook,请按照
[包文档](manifests/README.md)中的步骤操作。
如果您想应用预渲染的清单,可以从 [Releases 页面](../../releases)下载已发布版本的一体化清单文件。
### 私有集群
如果您将 Webhook 安装在
[私有 Google Kubernetes Engine (GKE) 集群](https://cloud.google.com/kubernetes-engine/docs/how-to/private-clusters)中,
您必须添加一条防火墙规则。在私有集群中,节点只有
[内部 IP 地址](https://cloud.google.com/vpc/docs/ip-addresses)。
该防火墙规则允许 API 服务器访问在集群节点 8443 端口上运行的 Webhook。
1. 创建一个名为 `CLUSTER` 的环境变量。其值为运行 `gcloud container clusters list` 时看到的集群名称:
CLUSTER=[your private GKE cluster name]
2. 查找集群 API 服务器的 IP 地址范围并将其存储在环境变量中:
API_SERVER_CIDR=$(gcloud container clusters describe $CLUSTER \
--format 'value(privateClusterConfig.masterIpv4CidrBlock)')
3. 查找集群节点的
[网络标记](https://cloud.google.com/vpc/docs/add-remove-network-tags)
并将它们以逗号分隔的形式存储在环境变量中:
TARGET_TAGS=$(gcloud compute firewall-rules list \
--filter "name~^gke-$CLUSTER" \
--format 'value(targetTags)' | uniq | paste -d, -s -)
4. 创建一条防火墙规则,允许从 API 服务器到集群节点 TCP 端口 8443 的流量:
gcloud compute firewall-rules create allow-api-server-to-digester-webhook \
--action ALLOW \
--direction INGRESS \
--source-ranges "$API_SERVER_CIDR" \
--rules tcp:8443 \
--target-tags "$TARGET_TAGS"
您可以在
[GKE 私有集群文档](https://cloud.google.com/kubernetes-engine/docs/how-to/private-clusters#add_firewall_rules)中阅读有关私有集群防火墙规则的更多信息。
## 文档
- [教程](https://cloud.google.com/architecture/using-container-image-digests-in-kubernetes-manifests#using_digester)
- [动机](docs/motivation.md)
- [建议](docs/recommendations.md)
- [向容器镜像仓库进行身份验证](docs/authentication.md)
- [配置 GKE Workload Identity 以向 Container Registry 和 Artifact Registry 进行身份验证](docs/workload-identity.md)
- [解决常见问题](docs/common-issues.md)
- [故障排除](docs/troubleshooting.md)
- [构建 digester](docs/build.md)
- [开发 digester](docs/development.md)
- [发布 digester](docs/release.md)
## 免责声明
这不是一个官方受支持的 Google 产品。
标签:Binary Authorization, CI/CD安全, DevSecOps, EVTX分析, K8s准入控制, K8s控制器, K8s插件, kpt, KRM函数, kustomize, Llama, Mutating Webhook, Web截图, 上游代理, 二进制授权, 子域名突变, 容器安全, 容器镜像, 日志审计, 镜像Digest, 镜像不可变性, 镜像哈希, 镜像校验