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, 镜像不可变性, 镜像哈希, 镜像校验