sigstore/policy-controller
GitHub: sigstore/policy-controller
基于 Sigstore 生态的 Kubernetes 准入控制器,在容器部署时强制验证镜像签名和供应链元数据,确保只有经过验证的镜像才能运行。
Stars: 162 | Forks: 69
# Policy Controller
`policy-controller` 准入控制器可用于基于来自 `cosign` 的可验证供应链元数据,在 Kubernetes 集群上强制执行策略。
[](https://goreportcard.com/report/github.com/sigstore/policy-controller)
[](https://github.com/sigstore/policy-controller/actions/workflows/kind-e2e-cosigned.yaml)
[](https://api.securityscorecards.dev/projects/github.com/sigstore/policy-controller)
`policy-controller` 还会解析镜像 tag,以确保运行的镜像与准入时的镜像没有区别。
有关更多信息,请参阅 [安装说明](https://docs.sigstore.dev/policy-controller/installation)。
目前,`policy-controller` 可以自动验证容器镜像的签名和证明。
强制执行是基于每个命名空间配置的,并且支持多个密钥。
我们正在积极开发更多功能。
有关 `policy-controller` 的更多信息,请查看我们的文档网站 [这里](https://docs.sigstore.dev/policy-controller/overview)。
## 示例
请参阅 [examples/](./examples/) 目录以获取示例策略等。
## 策略测试
此仓库包含一个 `policy-tester` 工具,它可以针对各种镜像检查策略。
在此仓库的根目录下,运行以下命令进行构建:
```
make policy-tester
```
然后运行它,指向包含 ClusterImagePolicy 的 YAML 文件,以及一个用于评估策略的镜像:
```
(set -o pipefail && \
./policy-tester \
--policy=test/testdata/policy-controller/tester/cip-public-keyless.yaml \
--image=ghcr.io/sigstore/cosign/cosign:v1.9.0 | jq)
```
## 本地开发
你可以使用 `local-dev` CLI 工具启动一个本地 [Kind](https://kind.sigs.k8s.io/) K8s 集群,以测试对 Policy Controller 的本地更改。使用 `make local-dev` 构建该工具,然后使用 `./bin/local-dev setup` 运行它。
它可选地接受以下内容:
```
--cluster-name
--k8s-version
--registry-url
```
你可以使用 `./bin/local-dev clean --cluster-name=
` 清理集群。
你需要安装以下工具才能使用此功能:
- [Docker](https://docs.docker.com/get-docker/)
- [kind](https://kind.sigs.k8s.io/)
- [ko](https://ko.build/install/)
- [kubectl](https://kubernetes.io/docs/tasks/tools/)
### 使用本地 registry
如果你想使用本地 Kind registry 而不是在线 registry,
请在调用 CLI 时不要包含 `registry-url` 标志。它将默认使用本地 registry。但在运行 CLI 之前,你必须先将以下行添加到 `/etc/hosts` 文件中:
`127.0.0.1 registry.local`
## 配合 Azure Container Registry (ACR) 使用 Policy Controller
要允许 webhook 向 ACR 发起请求,你必须使用以下方法之一进行身份验证:
1. 托管标识(用于 AKS 集群)
2. 服务主体(用于 AKS 集群)
3. Pod imagePullSecrets(用于非 AKS 集群)
请参阅 [官方文档](https://learn.microsoft.com/en-us/azure/container-registry/authenticate-kubernetes-options#scenarios)。
### AKS 集群的托管标识
有关更多详细信息,请参阅 [官方文档](https://learn.microsoft.com/en-us/azure/aks/cluster-container-registry-integration?toc=%2Fazure%2Fcontainer-registry%2Ftoc.json&bc=%2Fazure%2Fcontainer-registry%2Fbreadcrumb%2Ftoc.json&tabs=azure-cli)。
1. 你必须通过在 `az aks create` 或 `az aks update` 命令中使用 `--enable-managed-identities` 标志来为集群启用托管标识
2. 你必须通过在 `az aks create` 或 `az aks update` 命令中使用 `--attach-acr` 将 ACR 附加到 AKS 集群。有关更多详细信息,请参见 [这里](https://learn.microsoft.com/en-us/azure/aks/cluster-container-registry-integration?toc=%2Fazure%2Fcontainer-registry%2Ftoc.json&bc=%2Fazure%2Fcontainer-registry%2Fbreadcrumb%2Ftoc.json&tabs=azure-cli#create-a-new-aks-cluster-and-integrate-with-an-existing-acr)
3. 你必须将 `AZURE_CLIENT_ID` 环境变量设置为托管标识的客户端 ID。
4. 你必须将 `AZURE_TENANT_ID` 环境变量设置为托管标识所在的 Azure 租户。
这些将被 Azure 凭据管理器检测到。
当你创建一个启用了托管标识的集群时,
会创建一个名为 `-agentpool` 的用户分配托管标识。在设置 `AZURE_CLIENT_ID` 时请使用此标识的客户端 ID。确保 ACR 已附加到你的集群。
#### 从此仓库在本地安装 Policy Controller
如果你使用 `make ko-apply` 直接从此仓库部署 policy-controller,则需要将 `AZURE_CLIENT_ID` 和 `AZURE_TENANT_ID` 添加到 [webhook deployment configuration](config/webhook.yaml) 的环境变量列表中。
#### 通过 Helm Chart 安装 Policy Controller
在安装 Helm chart 时,你可以将托管标识的客户端 ID 作为自定义环境变量提供:
```
helm install policy-controller sigstore/policy-controller --version 0.9.0 \
--set webhook.env.AZURE_CLIENT_ID=my-managed-id-client-id,webhook.env.AZURE_TENANT_ID=tenant-id
```
### AKS 集群的服务主体
#### 通过 Helm Chart 安装 Policy Controller
你应该能够提供服务主体客户端 ID 和租户 ID 作为工作负载身份注释:
```
helm upgrade --install policy-controller sigstore/policy-controller --version 0.9.0 \
--set-json webhook.serviceAccount.annotations="{\"azure.workload.identity/client-id\": \"${SERVICE_PRINCIPAL_CLIENT_ID}\", \"azure.workload.identity/tenant-id\": \"${TENANT_ID}\"}"
```
## 支持策略
此 policy-controller 的版本可以在以下版本的 Kubernetes 中运行:
| | policy-controller `> 0.2.x` | policy-controller `> 0.10.x` |
|---|:---:|:---:|
| Kubernetes 1.23 | ✓ | |
| Kubernetes 1.24 | ✓ | |
| Kubernetes 1.25 | ✓ | |
| Kubernetes 1.27 | | ✓ |
| Kubernetes 1.28 | | ✓ |
| Kubernetes 1.29 | | ✓ |
注意:尚未经过全面测试,但可以安装
## 发布周期
我们打算转为每月一次的小版本发布周期。
小版本将在月初左右发布。
如果更改很小,不足以发布小版本,我们可能会发布补丁版本。
我们也会根据需要定期发布补丁版本以修复 bug。
## 安全
如果您发现任何安全问题,请参考 Sigstore 的 [安全策略](https://github.com/sigstore/policy-controller/security/policy)。标签:APT组织, Cosign, DevSecOps, EVTX分析, Go, JSONLines, Kubernetes 安全, Lerna, Policy Controller, PyVis, Ruby工具, Sigstore, SLSA, Web截图, 上游代理, 准入控制器, 子域名突变, 容器安全, 文档安全, 日志审计, 模型鲁棒性, 策略执行, 软件供应链安全, 远程方法调用, 镜像完整性, 镜像签名验证, 集群防护, 零信任