Shopify/kubeaudit
GitHub: Shopify/kubeaudit
一款用于审计 Kubernetes 集群安全配置的命令行工具,可扫描清单文件或运行时集群并自动修复安全问题。
Stars: 1931 | Forks: 191
[](https://github.com/Shopify/kubeaudit/actions)
[](https://goreportcard.com/report/github.com/Shopify/kubeaudit)
[](https://godoc.org/github.com/Shopify/kubeaudit)
# 🚨 弃用通知 🚨
Kubeaudit 计划于 2024 年 10 月弃用。
我们正在积极寻找有兴趣接手该项目管理工作的维护者。如果您对继续其开发和维护充满热情,请联系我们。
对于寻找替代方案的用户,我们建议过渡到 Kubebench,它提供类似的功能并且处于积极维护状态。
感谢社区的贡献和支持。
# kubeaudit :cloud: :lock: :muscle:
`kubeaudit` 是一个命令行工具和 Go 包,用于审计 Kubernetes 集群的各种
不同的安全问题,例如:
* 以非 root 用户运行
* 使用只读的根文件系统
* 删除危险权限,不要添加新的
* 不要以特权模式运行
* 以及更多!
**简而言之。`kubeaudit` 确保您部署安全的容器!**
## 包
要将 kubeaudit 作为 Go 包使用,请参阅 [package docs](https://pkg.go.dev/github.com/Shopify/kubeaudit)。
本 README 的其余部分将重点介绍如何将 kubeaudit 作为命令行工具使用。
## 命令行界面 (CLI)
* [Installation](#installation)
* [Quick Start](#quick-start)
* [Audit Results](#audit-results)
* [Commands](#commands)
* [Configuration File](#configuration-file)
* [Override Errors](#override-errors)
* [Contributing](#contributing)
## 安装
### Brew
```
brew install kubeaudit
```
### 下载二进制文件
Kubeaudit 有官方发布版本,这些版本是经过认可且稳定的:
[Official releases](https://github.com/Shopify/kubeaudit/releases)
### 自行构建
Main 分支可能包含比稳定版本更新的功能。如果您需要尚未包含在版本中的更新
功能,请确保您使用的是最新版本的 Go 并运行
以下命令:
```
go get -v github.com/Shopify/kubeaudit
```
开始使用 `kubeaudit`,请参阅 [Quick Start](#quick-start) 或查看所有 [supported commands](#commands)。
### Kubectl 插件
前置条件:kubectl v1.12.0 或更高版本
随着 kubectl v1.12.0 引入外部函数的 [easy pluggability](https://kubernetes.io/docs/tasks/extend-kubectl/kubectl-plugins/),可以通过以下方式将 kubeaudit 作为 `kubectl audit` 调用:
- 运行 `make plugin` 并确保 `$GOPATH/bin` 在您的路径中。
或者
- 将二进制文件重命名为 `kubectl-audit` 并使其在您的路径中可用。
### Docker
我们不再向 Docker Hub 发布镜像(因为 Docker Hub 淘汰了免费团队组织)。暂时来说,[old images](https://hub.docker.com/r/shopify/kubeaudit) 仍然可用,但可能随时停止服务。我们将很快开始向 Github Container registry 发布镜像。
要在集群中将 kubeaudit 作为作业运行,请参阅 [Running kubeaudit in a cluster](docs/cluster.md)。
## 快速开始
kubeaudit 有三种模式:
1. Manifest 模式
2. Local 模式
3. Cluster 模式
### Manifest 模式
如果使用 `-f/--manifest` 标志提供了 Kubernetes manifest 文件,kubeaudit 将审计该 manifest 文件。
示例命令:
```
kubeaudit all -f "/path/to/manifest.yml"
```
示例输出:
```
$ kubeaudit all -f "internal/test/fixtures/all_resources/deployment-apps-v1.yml"
---------------- Results for ---------------
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment
namespace: deployment-apps-v1
--------------------------------------------
-- [error] AppArmorAnnotationMissing
Message: AppArmor annotation missing. The annotation 'container.apparmor.security.beta.kubernetes.io/container' should be added.
Metadata:
Container: container
MissingAnnotation: container.apparmor.security.beta.kubernetes.io/container
-- [error] AutomountServiceAccountTokenTrueAndDefaultSA
Message: Default service account with token mounted. automountServiceAccountToken should be set to 'false' or a non-default service account should be used.
-- [error] CapabilityShouldDropAll
Message: Capability not set to ALL. Ideally, you should drop ALL capabilities and add the specific ones you need to the add list.
Metadata:
Container: container
Capability: AUDIT_WRITE
...
```
如果未发现具有给定最低严重级别的错误,则返回以下内容:
```
All checks completed. 0 high-risk vulnerabilities found
```
#### 自动修复
Manifest 模式还支持使用 `autofix` 命令自动修复所有安全问题:
```
kubeaudit autofix -f "/path/to/manifest.yml"
```
要将修复后的 manifest 写入新文件而不是修改源文件,请使用 `-o/--output` 标志。
```
kubeaudit autofix -f "/path/to/manifest.yml" -o "/path/to/fixed"
```
要根据 kubeaudit 配置文件中指定的自定义规则修复 manifest,请使用 `-k/--kconfig` 标志。
```
kubeaudit autofix -k "/path/to/kubeaudit-config.yml" -f "/path/to/manifest.yml" -o "/path/to/fixed"
```
### Cluster 模式
Kubeaudit 可以检测它是否在集群内的容器中运行。如果是,它将尝试审计该集群中的所有 Kubernetes 资源:
```
kubeaudit all
```
### Local 模式
Kubeaudit 将尝试使用本地 kubeconfig 文件 (`$HOME/.kube/config`) 连接到集群。可以使用 `--kubeconfig` 标志指定不同的 kubeconfig 位置。要指定 kubeconfig 的上下文,请使用 `-c/--context` 标志。
```
kubeaudit all --kubeconfig "/path/to/config" --context my_cluster
```
有关 kubernetes 配置文件的更多信息,请参阅 https://kubernetes.io/docs/concepts/configuration/organize-cluster-access-kubeconfig/
## 审计结果
Kubeaudit 产生三个严重级别的结果:
- `Error`:安全问题或无效的 kubernetes 配置
- `Warning`:最佳实践建议
- `Info`:信息性,无需操作。这包括 [overridden](#override-errors) 的结果
可以使用 `--minSeverity/-m` 标志设置最低严重级别。
默认情况下,kubeaudit 将以人类可读的方式输出结果。如果输出旨在进一步处理,可以使用 `--format json` 标志将其设置为输出 JSON。要将结果输出为日志(以前的默认值),请使用 `--format logrus`。某些输出格式包含颜色,以便在终端中更易于阅读。要禁用颜色(例如,如果您将输出发送到文本文件),可以使用 `--no-color` 标志。
您可以使用 `--format sarif` 标志生成 [SARIF](https://docs.oasis-open.org/sarif/sarif/v2.0/sarif-v2.0.html) 格式的 kubeaudit 报告。要将 SARIF 结果写入文件,可以使用 `>` 重定向输出。例如:
```
kubeaudit all -f path-to-my-file.yaml --format="sarif" > example.sarif
```
如果存在严重级别为 `error` 的结果,kubeaudit 将以退出代码 2 退出。可以使用 `--exitcode/-e` 标志更改此设置。
有关自定义 kubeaudit 的所有方法,请参阅 [Global Flags](#global-flags)。
## 命令
| 命令 | 描述 | 文档 |
| :-------- | :------------------------------------------------------------------------ | :---------------------- |
| `all` | 运行所有可用的审计器,或使用 kubeaudit 配置指定的审计器。 | [docs](docs/all.md) |
| `autofix` | 自动修复安全问题。 | [docs](docs/autofix.md) |
| `version` | 打印当前的 kubeaudit 版本。 | |
### 审计器
审计器也可以单独运行。
| 命令 | 描述 | 文档 |
| :--------------- | :------------------------------------------------------------------------------------------------------------- | :-------------------------------------- |
| `apparmor` | 查找未运行 AppArmor 的容器。 | [docs](docs/auditors/apparmor.md) |
| `asat` | 查找使用自动挂载的默认服务账户的 Pod | [docs](docs/auditors/asat.md) |
| `capabilities` | 查找未删除推荐权限或添加新权限的容器。 | [docs](docs/auditors/capabilities.md) |
| `deprecatedapis` | 查找使用已弃用 API 版本定义的任何资源。 | [docs](docs/auditors/deprecatedapis.md) |
| `hostns` | 查找启用了 HostPID、HostIPC 或 HostNetwork 的容器。 | [docs](docs/auditors/hostns.md) |
| `image` | 查找未使用所需镜像版本(通过 tag)或使用无 tag 镜像的容器。 | [docs](docs/auditors/image.md) |
| `limits` | 查找超过指定 CPU 和内存限制或未指定任何限制的容器。 | [docs](docs/auditors/limits.md) |
| `mounts` | 查找挂载了敏感主机路径的容器。 | [docs](docs/auditors/mounts.md) |
| `netpols` | 查找没有默认拒绝网络策略的命名空间。 | [docs](docs/auditors/netpols.md) |
| `nonroot` | 查找以 root 身份运行的容器。 |LINK_31/> |
| `privesc` | 查找允许特权升级的容器。 | [docs](docs/auditors/privesc.md) |
| `privileged` | 查找以特权模式运行的容器。 | [docs](docs/auditors/privileged.md) |
| `rootfs` | 查找没有只读文件系统的容器。 | [docs](docs/auditors/rootfs.md) |
| `seccomp` | 查找未运行 Seccomp 的容器。 | [docs](docs/auditors/seccomp.md) |
### 全局标志
| 简写 | 全称 | 描述 |
| :---- | :----------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------- |
| | --format | 要使用的输出格式("sarif"、"pretty"、"logrus"、"json" 之一)(默认为 "pretty") |
| | --kubeconfig | 本地 Kubernetes 配置文件的路径。仅在本地模式下使用(默认为 `$HOME/.kube/config`) |
| -c | --context | 要使用的 kubeconfig 上下文的名称 |
| -f | --manifest | 要审计的 yaml 配置文件的路径。仅在 manifest 模式下使用。您可以使用 `-` 从 stdin 读取。 |
| -n | --namespace | 仅审计指定命名空间中的资源。目前在 manifest 模式下不支持。 |
| -g | --includegenerated | 在扫描中包含生成的资源(例如由 Deployments 生成的 Pod)。如果您希望 kubeaudit 为生成的资源生成结果(例如,如果您有自定义资源或想要捕获所有者资源不再存在的孤立资源),您可以使用此标志。 |
| -m | --minseverity | 设置要报告的最低严重级别("error"、"warning"、"info" 之一)(默认为 "info") |
| -e | --exitcode | 如果存在严重级别为 "error" 的结果时使用的退出代码。按照惯例,0 用于表示成功,所有非零代码表示错误。(默认为 2) |
| | --no-color | 在输出中不使用颜色(默认为 false) |
## 配置文件
kubeaudit 配置可用于两件事:
1. 仅启用某些审计器
2. 为审计器指定配置
任何可以使用标志为各个审计器指定的配置都可以使用配置文件表示。
配置具有以下格式:
```
enabledAuditors:
# Auditors are enabled by default if they are not explicitly set to "false"
apparmor: false
asat: false
capabilities: true
deprecatedapis: true
hostns: true
image: true
limits: true
mounts: true
netpols: true
nonroot: true
privesc: true
privileged: true
rootfs: true
seccomp: true
auditors:
capabilities:
# add capabilities needed to the add list, so kubeaudit won't report errors
allowAddList: ['AUDIT_WRITE', 'CHOWN']
deprecatedapis:
# If no versions are specified and the'deprecatedapis' auditor is enabled, WARN
# results will be genereted for the resources defined with a deprecated API.
currentVersion: '1.22'
targetedVersion: '1.25'
image:
# If no image is specified and the 'image' auditor is enabled, WARN results
# will be generated for containers which use an image without a tag
image: 'myimage:mytag'
limits:
# If no limits are specified and the 'limits' auditor is enabled, WARN results
# will be generated for containers which have no cpu or memory limits specified
cpu: '750m'
memory: '500m'
```
有关每个审计器的更多详细信息,包括配置中审计器特定配置的说明,请参阅 [Auditor Docs](#auditors)。
**注意**:kubeaudit 配置与使用 `--kubeconfig` 标志指定的 kubeconfig 文件不同,后者指的是 Kubernetes 配置文件(参见 [Local Mode](/README.md#local-mode))。另请注意,只有 `all` 和 `autofix` 命令支持使用 kubeaudit 配置。它不适用于其他命令。
**注意**:如果标志与配置文件结合使用,标志将优先。
## 覆盖错误
可以通过添加覆盖标签来忽略特定容器或 Pod 的安全问题。这意味着审计器将生成 `info` 结果而不是 `error` 结果,并且审计结果名称将附加 `Allowed`。标签记录在每个审计器的文档中,但支持覆盖的审计器的一般格式如下:
覆盖标签由 `key` 和 `value` 组成。
`key` 是覆盖类型(容器或 Pod)和每个审计器唯一的 `覆盖标识符` 的组合(请参阅特定审计器的 [docs](#auditors))。根据覆盖类型,`key` 可以采用以下两种形式之一:
1. **容器覆盖**,覆盖该特定容器的审计器,格式如下:
```
container.kubeaudit.io/[container name].[override identifier]
```
2. **Pod 覆盖**,覆盖 Pod 内所有容器的审计器,格式如下:
```
kubeaudit.io/[override identifier]
```
如果 `value` 设置为非空字符串,它将在 `info` 结果中显示为 `OverrideReason`:
```
$ kubeaudit asat -f "auditors/asat/fixtures/service-account-token-true-allowed.yml"
---------------- Results for ---------------
apiVersion: v1
kind: ReplicationController
metadata:
name: replicationcontroller
namespace: service-account-token-true-allowed
--------------------------------------------
-- [info] AutomountServiceAccountTokenTrueAndDefaultSAAllowed
Message: Audit result overridden: Default service account with token mounted. automountServiceAccountToken should be set to 'false' or a non-default service account should be used.
Metadata:
OverrideReason: SomeReason
```
根据 Kubernetes 规范,`value` 必须为 63 个字符或更少,并且必须为空或以字母数字字符(`[a-z0-9A-Z]`)开头和结尾,中间包含破折号(`-`)、下划线(`_`)、点(`.`)和字母数字。
可以将多个覆盖标签(用于多个审计器)添加到同一资源。
有关要覆盖的审计器,请参阅特定的 [auditor docs](#auditors) 以获取示例。
要了解有关标签的更多信息,请参阅 https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/
## 贡献
如果您想修复错误、贡献功能或只是更正拼写错误,只要您遵循我们的 [Code of Conduct](./CODE_OF_CONDUCT.md),请随时进行。
1. 创建您自己的 Fork!
2. 获取源代码:`go get github.com/Shopify/kubeaudit`
3. 进入源代码目录:`cd $GOPATH/src/github.com/Shopify/kubeaudit`
4. 将您 Fork 的仓库添加为远程仓库:`git remote add fork https://github.com/you-are-awesome/kubeaudit`
5. 创建您的功能分支:`git checkout -b awesome-new-feature`
6. 安装 [Kind](https://kind.sigs.k8s.io/#installation-and-usage)
7. 运行测试以查看一切是否按预期工作:`USE_KIND=true make test`(要在不使用 Kind 的情况下运行测试:`make test`)
8. 提交您的更改:`git commit -am 'Adds awesome feature'`
9. 推送到分支:`git push fork`
10. 签署 [Contributor License Agreement](https://cla.shopify.com/)
11. 提交 PR(所有 PR 必须标记为 :bug: (Bug 修复)、:sparkles: (新功能)、:book: (文档更新) 或 :warning: (重大更改) )
12. ???
13. 获利
请注意,如果您在打开 PR 之前未签署 CLA,您可以通过在 PR 中添加一条评论来重新运行检查,评论内容为 "I've signed the CLA!"!
标签:CLI工具, DevSecOps, EVTX分析, EVTX分析, EVTX分析, EVTX分析, Go, Gremlin, K8s, Kubernetes, Ruby工具, Rust语言, Shopify, SPARQL, Web截图, 上游代理, 云原生安全, 供应链安全, 只读文件系统, 合规性检查, 图数据库, 基准测试, 子域名突变, 安全审计, 容器安全, 属性图, 带宽管理, 开源安全工具, 文档结构分析, 日志审计, 特权检测, 用户界面自定义, 请求拦截, 逆向工程平台, 集群安全, 非Root运行