[!IMPORTANT] KubeClarity 已被弃用,由 openclarity/openclarity 接替。
查看发布声明了解更多信息。
此项目不再接收更新。我们建议您迁移。
KubeClarity 是一个用于检测和管理容器镜像和文件系统的软件物料清单 (SBOM) 及漏洞的工具。它扫描运行时 K8s 集群和 CI/CD 管道,以增强软件供应链安全性。

KubeClarity 内容分析器集成了以下 SBOM 生成器:
KubeClarity 漏洞扫描器集成了以下扫描器:

添加 Helm 仓库 ```shell helm repo add kubeclarity https://openclarity.github.io/kubeclarity
保存 KubeClarity 默认 chart 值
helm show values kubeclarity/kubeclarity > values.yaml
检查 values.yaml 中的配置,并根据需要更新所需的值。
要启用和配置支持的 SBOM 生成器和漏洞扫描器,请检查 Helm values 中 "vulnerability-scanner" 部分下的 "analyzer" 和 "scanner" 配置。
使用 Helm 部署 KubeClarity ```shell helm install --values values.yaml --create-namespace kubeclarity kubeclarity/kubeclarity -n kubeclarity
或用于兼容 OpenShift Restricted SCC 的安装: ```shell
helm install --values values.yaml --create-namespace kubeclarity kubeclarity/kubeclarity -n kubeclarity --set global.openShiftRestricted=true
--set kubeclarity-postgresql.securityContext.enabled=false --set kubeclarity-postgresql.containerSecurityContext.enabled=false
--set kubeclarity-postgresql.volumePermissions.enabled=true --set kubeclarity-postgresql.volumePermissions.securityContext.runAsUser="auto"
--set kubeclarity-postgresql.shmVolume.chmod.enabled=false
3. 将端口转发到KubeClarity UI: ```shell
kubectl port-forward -n kubeclarity svc/kubeclarity-kubeclarity 9999:8080
注意
KubeClarity 需要以下 K8s 权限:
权限 原因 读取 CREDS_SECRET_NAMESPACE(默认:kubeclarity)中的 secret
Helm 卸载 ```shell helm uninstall kubeclarity -n kubeclarity
清理资源
默认情况下,Helm 不会删除 StatefulSets 的 PVC 和 PV。运行以下命令可以全部删除:
kubectl delete pvc -l app.kubernetes.io/instance=kubeclarity -n kubeclarity
构建 UI 和 后端,并在本地启动后端(两种方式):
VERSION=test make docker-backend
docker run -p 8080:8080 -e FAKE_RUNTIME_SCANNER=true -e FAKE_DATA=true -e ENABLE_DB_INFO_LOGS=true -e DATABASE_DRIVER=LOCAL ghcr.io/openclarity/kubeclarity:test run
make ui && make backend
cp -r ./ui/build ./site
FAKE_RUNTIME_SCANNER=true DATABASE_DRIVER=LOCAL FAKE_DATA=true ENABLE_DB_INFO_LOGS=true ./backend/bin/backend run
在浏览器中打开 KubeClarity UI:http://localhost:8080/
KubeClarity 包含一个 CLI 工具,可以在本地运行,特别适用于 CI/CD 流水线。它允许分析镜像和目录以生成 SBOM,并扫描其中的漏洞。结果可以导出到 KubeClarity 后端。
``` make cli ``` 将 `./cli/bin/cli` 复制到你的 PATH 下,命名为 `kubeclarity-cli`。
用法:``` kubeclarity-cli analyze <image/directory name> --input-type <dir|file|image(default)> -o
示例:```
kubeclarity-cli analyze --input-type image nginx:latest -o nginx.sbom
Optionally a list of the content analyzers to use can be configured using the ANALYZER_LIST env
variable seperated by a space (e.g ANALYZER_LIST="<analyzer 1 name> <analyzer 2 name>")
Example:``` ANALYZER_LIST="syft gomod" kubeclarity-cli analyze --input-type image nginx:latest -o nginx.sbom
### 漏洞扫描
用法:```
kubeclarity-cli scan <image/sbom/directoty/file name> --input-type <sbom|dir|file|image(default)> -f <output file>
示例:``` kubeclarity-cli scan nginx.sbom --input-type sbom
可选地,可以通过 `SCANNERS_LIST` 环境变量配置要使用的漏洞扫描器列表,用空格分隔(例如 `SCANNERS_LIST="<Scanner1 name> <Scanner2 name>"`)
示例:```
SCANNERS_LIST="grype trivy" kubeclarity-cli scan nginx.sbom --input-type sbom
要将 CLI 结果导出到 KubeClarity 后端,需要使用由 KubeClarity 后端定义的应用程序 ID。 应用程序 ID 可以在 UI 的应用程序屏幕中找到,或通过 KubeClarity API 获取。
BACKEND_HOST= BACKEND_DISABLE_TLS=true kubeclarity-cli analyze --application-id -e -o
BACKEND_HOST=localhost:9999 BACKEND_DISABLE_TLS=true kubeclarity-cli analyze nginx:latest --application-id 23452f9c-6e31-5845-bf53-6566b81a2906 -e -o nginx.sbom
#### 导出漏洞扫描结果```
# The vulnerability scan result can be exported to KubeClarity backend by setting the BACKEND_HOST env variable and the -e flag.
# Note: Until TLS is supported, BACKEND_DISABLE_TLS=true should be set.
BACKEND_HOST=<KubeClarity backend address> BACKEND_DISABLE_TLS=true kubeclarity-cli scan <image> --application-id <application ID> -e
# For example:
SCANNERS_LIST="grype" BACKEND_HOST=localhost:9999 BACKEND_DISABLE_TLS=true kubeclarity-cli scan nginx.sbom --input-type sbom --application-id 23452f9c-6e31-5845-bf53-6566b81a2906 -e
LOCAL_IMAGE_SCAN=true kubeclarity-cli analyze nginx:latest -o nginx.sbom
## 使用本地Docker镜像作为输入进行漏洞扫描```
# Local docker images can be scanned using the LOCAL_IMAGE_SCAN env variable
# For example:
LOCAL_IMAGE_SCAN=true kubeclarity-cli scan nginx.sbom
KubeClarity cli可以读取一个存储私有仓库凭据的配置文件。
示例配置文件中的仓库部分:``` registry: auths: - authority: <registry 1> username: <username for registry 1> password: <password for registry 1> - authority: <registry 2> token: <token for registry 2>
无权威的注册表配置示例:(在这种情况下,这些凭据将用于所有注册表)```
registry:
auths:
- username: <username>
password: <password>
--config command line flag.kubeclarity scan registry/nginx:private --config $HOME/own-kubeclarity-config
## Private registries support for K8s runtime scan
Kubeclarity 使用 google/go-containerregistry 的 [k8schain](https://github.com/google/go-containerregistry/tree/main/pkg/authn/k8schain#k8schain) 进行注册表身份验证。
如果 k8schain 无法发现必要的服务凭据,则可以通过下面描述的密钥来定义它们。
此外,如果服务凭据不在 "kubeclarity" 命名空间中,请将 CREDS_SECRET_NAMESPACE 设置为 kubeclarity 部署。
使用 helm [charts](https://github.com/openclarity/kubeclarity/blob/HEAD/charts) 时,CREDS_SECRET_NAMESPACE 会被设置为安装 kubeclarity 的发布命名空间。
### Amazon ECR
创建一个具有 `AmazonEC2ContainerRegistryFullAccess` 权限的 [AWS IAM 用户](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users_create.html#id_users_create_console)。
使用用户凭据(`AWS_ACCESS_KEY_ID`、`AWS_SECRET_ACCESS_KEY`、`AWS_DEFAULT_REGION`)创建以下密钥:```
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Secret
metadata:
name: ecr-sa
namespace: kubeclarity
type: Opaque
data:
AWS_ACCESS_KEY_ID: $(echo -n 'XXXX'| base64 -w0)
AWS_SECRET_ACCESS_KEY: $(echo -n 'XXXX'| base64 -w0)
AWS_DEFAULT_REGION: $(echo -n 'XXXX'| base64 -w0)
EOF
注意:
ecr-saAWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY 和 AWS_DEFAULT_REGION使用 Artifact Registry Reader 权限创建一个 Google 服务账号。
使用服务账号 json 文件创建以下 secret``` kubectl -n kubeclarity create secret generic --from-file=sa.json gcr-sa
注意:
1. 密钥名称必须为 `gcr-sa`
1. `sa.json` 必须是生成密钥时服务账户 JSON 文件的名称
2. KubeClarity 使用[应用默认凭据](https://developers.google.com/identity/protocols/application-default-credentials)。这些凭据仅在 GCP 中运行 KubeClarity 时有效。
## 跨 CI/CD 阶段的 SBOM 与漏洞合并```
# Additional SBOM will be merged into the final results when '--merge-sbom' is defined during analysis. The input SBOM can be CycloneDX XML or CyclonDX json format.
# For example:
ANALYZER_LIST="syft" kubeclarity-cli analyze nginx:latest -o nginx.sbom --merge-sbom inputsbom.xml
kubeclarity-cli analyze 命令可以根据需要将生成的SBOM格式化为不同格式,以便与另一个系统集成。支持的格式如下:
| 格式 | 配置名称 |
|---|---|
| CycloneDX JSON (默认) | cyclonedx-json |
| CycloneDX XML | cyclonedx-xml |
| SPDX JSON | spdx-json |
| SPDX 标记值 | spdx-tv |
警告
KubeClarity 在内部处理 CycloneDX 格式,其他格式通过转换得到支持。由于格式之间的不兼容性,转换过程可能造成信息丢失,因此不保证结果输出中包含所有字段/信息。
要将 kubeclarity-cli 配置为使用除默认格式以外的格式,可以使用 ANALYZER_OUTPUT_FORMAT 环境变量,并传入上表中的配置名称:``` ANALYZER_OUTPUT_FORMAT="spdx-json" kubeclarity-cli analyze nginx:latest -o nginx.sbom
## 用于 CLI 的远程扫描器服务器
在运行 kubeclarity CLI 扫描漏洞时,CLI 需要将相关的漏洞数据库下载到 kubeclarity CLI 运行的位置。在 CI/CD 流水线中运行 CLI 会导致每次运行时都下载数据库,浪费时间和带宽。因此,部分支持的扫描器提供了远程模式,由服务器负责数据库管理,并可能负责对工件进行扫描。
> ***注意***
>
> 以下示例针对每个扫描器,但它们可以像非远程模式一样组合在一起运行。
### Trivy
Trivy 扫描器支持使用 Trivy 服务器进行远程模式。Trivy 服务器可以按照此处文档进行部署:[trivy 客户端-服务器模式](https://aquasecurity.github.io/trivy/v0.34/docs/references/modes/client-server/)。安装 Trivy CLI 的说明可在 [trivy 安装](https://aquasecurity.github.io/trivy/v0.34/getting-started/installation/) 中找到。Aqua 团队提供了一个官方容器镜像,可用于在 kubernetes/docker 中运行服务器,我们将在示例中使用该镜像。
要启动服务器:```
docker run -p 8080:8080 --rm aquasec/trivy:0.41.0 server --listen 0.0.0.0:8080
要使用服务器运行扫描:``` SCANNERS_LIST="trivy" SCANNER_TRIVY_SERVER_ADDRESS="http://:8080" ./kubeclarity_cli scan --input-type sbom nginx.sbom
Trivy 服务器还提供基于令牌的身份验证,以防止未经授权使用 Trivy 服务器实例。您可以通过运行带有额外标志的服务器来启用它:```
docker run -p 8080:8080 --rm aquasec/trivy:0.41.0 server --listen 0.0.0.0:8080 --token mytoken
并将令牌传递给扫描器:``` SCANNERS_LIST="trivy" SCANNER_TRIVY_SERVER_ADDRESS="http://:8080" SCANNER_TRIVY_SERVER_TOKEN="mytoken" ./kubeclarity_cli scan --input-type sbom nginx.sbom
### Grype
Grype 支持远程模式,通过使用 [grype-server](https://github.com/portshift/grype-server),这是一个 RESTful 的 grype 封装,提供了一个接收 SBOM 并返回该 SBOM 的 grype 扫描结果的 API。Grype-server 以容器镜像形式发布,因此可以在 kubernetes 中运行,或通过 docker 独立运行。
要启动服务器:```
docker run -p 9991:9991 --rm gcr.io/eticloud/k8sec/grype-server:v0.1.5
使用服务器运行扫描:``` SCANNERS_LIST="grype" SCANNER_GRYPE_MODE="remote" SCANNER_REMOTE_GRYPE_SERVER_ADDRESS=":9991" SCANNER_REMOTE_GRYPE_SERVER_SCHEMES="https" ./kubeclarity_cli scan --input-type sbom nginx.sbom
如果 Grype 服务器使用 TLS 部署,您可以覆盖默认的 URL 方案,例如:```
SCANNERS_LIST="grype" SCANNER_GRYPE_MODE="remote" SCANNER_REMOTE_GRYPE_SERVER_ADDRESS="<grype server address>:9991" SCANNER_REMOTE_GRYPE_SERVER_SCHEMES="https" ./kubeclarity_cli scan --input-type sbom nginx.sbom
参见示例配置 此处
欢迎提交 Pull Request 和错误报告。
对于较大的更改,请先在 GitHub 上创建一个 Issue 来讨论您的 提议变更及可能的影响。
更多细节请参阅本项目贡献指南
| 允许您配置镜像拉取 secret 以扫描私有镜像仓库。 |
| 读取 KubeClarity 部署命名空间中的 ConfigMap | 用于获取扫描作业的已配置模板。 |
| 列出集群范围内的 Pod | 用于计算需要扫描的目标 Pod。 |
| 列出命名空间 | 用于在 K8s 运行时扫描 UI 中获取要扫描的目标命名空间。 |
| 在集群范围内创建和删除作业 | 用于管理将在其命名空间中扫描目标 Pod 的作业。 |
| Syft JSON | syft-json |