现在要求集群运行 Kubernetes >=1.19。
使用未注册的
kubernetes.io注解进行覆盖标签将被弃用。很快将要求改用kubeaudit.io。 更多背景请参考此讨论。
Kubeaudit 计划于 2024 年 10 月之前弃用。
我们正在积极寻找愿意接手该项目的维护者。如果您对继续开发和维护它充满热情,请与我们联系。
对于寻找替代方案的用户,我们建议迁移到 Kubebench,它提供类似功能且正在积极维护。
感谢社区的支持和贡献。
kubeaudit 是一个命令行工具和一个 Go 包,用于审计 Kubernetes 集群中的各种安全关注点,例如:
简而言之,kubeaudit 确保你部署的容器是安全的!
如需将 kubeaudit 作为 Go 包使用,请参阅包文档。
本 README 的其余部分将重点介绍如何将 kubeaudit 用作命令行工具。
brew install kubeaudit
Kubeaudit 有经过验证的稳定官方发布版本: 官方发布
main 分支可能包含比稳定发布版本更新的功能。如果你需要尚未包含在发布版本中的新功能,请确保使用最新的 Go 并运行以下命令:
go get -v github.com/Shopify/kubeaudit
从快速开始开始使用 kubeaudit,或查看所有支持的命令。
前提条件:kubectl 1.12.0 或更高版本
kubectl 1.12.0 引入了外部函数的易插拔性,kubeaudit 可以通过以下方式作为 kubectl audit 调用:
运行 make plugin 并将 $GOPATH/bin 添加到你的 PATH 中。
或者将二进制文件重命名为 kubectl-audit 并将其放在 PATH 中。
我们不再向 Docker Hub 发布镜像(因为 Docker Hub 已停止为免费团队组织提供服务)。目前,旧镜像仍然可用,但可能会随时停止提供。我们将很快开始向 Github 容器注册表发布镜像。
如需在集群中将 kubeaudit 作为作业运行,请参阅在集群中运行 kubeaudit。
kubeaudit 有三种模式:
如果使用 -f/--manifest 标志提供了 Kubernetes 清单文件,kubeaudit 将审计该清单文件。
示例命令:
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
清单模式还支持使用 autofix 命令自动修复所有安全问题:
kubeaudit autofix -f "/path/to/manifest.yml"
要将修复后的清单写入新文件而非修改源文件,请使用 -o/--output 标志。
kubeaudit autofix -f "/path/to/manifest.yml" -o "/path/to/fixed"
要根据 kubeaudit 配置文件中指定的自定义规则修复清单,请使用 -k/--kconfig 标志。
kubeaudit autofix -k "/path/to/kubeaudit-config.yml" -f "/path/to/manifest.yml" -o "/path/to/fixed"
Kubeaudit 可以检测自身是否在集群内的容器中运行。如果是,它将尝试审计该集群中的所有 Kubernetes 资源:
kubeaudit all
Kubeaudit 将尝试使用本地 kubeconfig 文件($HOME/.kube/config)连接到集群。可以通过 --kubeconfig 标志指定不同的 kubeconfig 路径。使用 -c/--context 标志指定 kubeconfig 的上下文。
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:信息性,无需操作。包括已覆盖的结果可以使用 --minSeverity/-m 标志设置最低严重级别。
默认情况下,kubeaudit 以人类可读的方式输出结果。如果输出需要进一步处理,可以使用 --format json 标志将其设置为 JSON 格式。要输出为日志(之前的默认格式),请使用 --format logrus。某些输出格式包含颜色,便于在终端中阅读。要禁用颜色(例如,将输出发送到文本文件),可以使用 --no-color 标志。
你可以使用 --format sarif 标志生成 SARIF 格式的 kubeaudit 报告。要写入 SARIF 结果到文件,可以使用 > 重定向输出。例如:
kubeaudit all -f path-to-my-file.yaml --format="sarif" > example.sarif
如果存在严重级别为 error 的结果,kubeaudit 将以退出码 2 退出。可以使用 --exitcode/-e 标志更改此行为。
有关 kubeaudit 所有自定义选项,请参阅全局标志。
审计器也可以单独运行。
kubeaudit 配置可用于两个目的:
任何可以通过单个审计器标志指定的配置都可以在配置中表示。
配置格式如下:
enabledAuditors:
# 如果未明确设置为 "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:
# 将需要的能力添加到允许添加列表中,这样 kubeaudit 就不会报告错误
allowAddList: ['AUDIT_WRITE', 'CHOWN']
deprecatedapis:
# 如果未指定版本且启用了 'deprecatedapis' 审计器,将为使用已弃用 API 定义的资源生成 WARN 结果。
currentVersion: '1.22'
targetedVersion: '1.25'
image:
# 如果未指定镜像且启用了 'image' 审计器,将为使用无标签镜像的容器生成 WARN 结果。
image: 'myimage:mytag'
limits:
# 如果未指定限制且启用了 'limits' 审计器,将为未指定 CPU 或内存限制的容器生成 WARN 结果。
cpu: '750m'
memory: '500m'
有关每个审计器的更多详细信息,包括配置中针对特定审计器的配置描述,请参阅审计器文档。
注意:kubeaudit 配置与 --kubeconfig 标志指定的 kubeconfig 文件不同,后者指的是 Kubernetes 配置文件(参见本地模式)。另请注意,只有 all 和 autofix 命令支持使用 kubeaudit 配置。它不适用于其他命令。
注意:如果同时使用标志和配置文件,标志将优先。
可以通过添加覆盖标签来忽略特定容器或 Pod 的安全问题。这意味着审计器将产生 info 结果而不是 error 结果,并且审计结果名称将追加 Allowed。每个审计器的文档中都记录了这些标签,但支持覆盖的审计器的通用格式如下:
覆盖标签由 key 和 value 组成。
key 是覆盖类型(容器或 Pod)和一个 覆盖标识符(每个审计器唯一,参见具体审计器的文档)的组合。根据覆盖类型,key 可以采取两种形式之一:
container.kubeaudit.io/[容器名称].[覆盖标识符]
kubeaudit.io/[覆盖标识符]
如果 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])开头和结尾,中间可以包含短划线(-)、下划线(_)、点(.)和字母数字字符。
可以将多个覆盖标签(针对多个审计器)添加到同一资源。
有关要覆盖的审计器的具体示例,请参阅相应的审计器文档。
要了解有关标签的更多信息,请参阅 https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/
如果你希望修复 bug、贡献功能或仅仅纠正一个拼写错误,欢迎随时这样做,但请遵循我们的行为准则。
go get github.com/Shopify/kubeauditcd $GOPATH/src/github.com/Shopify/kubeauditgit remote add fork https://github.com/you-are-awesome/kubeauditgit checkout -b awesome-new-featureUSE_KIND=true make test(要在没有 Kind 的情况下运行测试:make test)git commit -am 'Adds awesome feature'git push fork请注意,如果你在提交 PR 之前没有签署 CLA,可以在 PR 中添加一条 "I've signed the CLA!" 的评论来重新运行检查!
| 命令 | 描述 | 文档 |
|---|
all | 运行所有可用的审计器,或使用 kubeaudit 配置指定的审计器。 | docs |
autofix | 自动修复安全问题。 | docs |
version | 打印当前 kubeaudit 版本。 |
| 命令 | 描述 | 文档 |
|---|
apparmor | 查找未使用 AppArmor 运行的容器。 | docs |
asat | 查找使用自动挂载的默认服务账户的 Pod。 | docs |
capabilities | 查找未删除推荐能力或添加新能力的容器。 | docs |
deprecatedapis | 查找使用已弃用 API 版本定义的任何资源。 | docs |
hostns | 查找启用了 HostPID、HostIPC 或 HostNetwork 的容器。 | docs |
image | 查找未使用所需镜像版本(通过标签)或使用无标签镜像的容器。 | docs |
limits | 查找超出指定 CPU 和内存限制的容器,或未指定限制的容器。 | docs |
mounts | 查找挂载了敏感主机路径的容器。 | docs |
netpols | 查找没有默认拒绝网络策略的命名空间。 | docs |
nonroot | 查找以 root 身份运行的容器。 | docs |
privesc | 查找允许权限提升的容器。 | docs |
privileged | 查找以特权模式运行的容器。 | docs |
rootfs | 查找未使用只读文件系统的容器。 | docs |
seccomp | 查找未使用 Seccomp 运行的容器。 | docs |
| 简写 | 长参数 | 描述 |
|---|
| --format | 使用的输出格式(可选 "sarif", "pretty", "logrus", "json")(默认 "pretty") | |
| --kubeconfig | 本地 Kubernetes 配置文件的路径。仅在本地模式下使用(默认 $HOME/.kube/config) | |
| -c | --context | 要使用的 kubeconfig 上下文名称 |
| -f | --manifest | 要审计的 yaml 配置路径。仅在清单模式下使用。可以使用 - 从标准输入读取。 |
| -n | --namespace | 仅审计指定命名空间中的资源。当前在清单模式下不支持。 |
| -g | --includegenerated | 在扫描中包括生成的资源(例如由 Deployment 生成的 Pod)。如果你希望 kubeaudit 为生成的资源生成结果(例如,如果你有自定义资源,或希望捕获所有者资源不再存在的孤立资源),可以使用此标志。 |
| -m | --minseverity | 设置要报告的最低严重级别(可选 "error", "warning", "info")(默认 "info") |
| -e | --exitcode | 如果存在严重级别为 "error" 的结果时使用的退出码。通常 0 表示成功,非零代码表示错误。(默认 2) |
| --no-color | 输出中不使用颜色(默认 false) |