Kubernetes(k8s)是一种目前流行的开源容器编排系统,可以自动部署、扩展和管理容器化工作负载。Kubernetes提供了容器自修复、自动扩展和服务发现的功能,但是,也存在一些固有的安全风险。Docker 是一个容器平台,用于构建、部署和管理应用程序。Docker容器的轻量、可移植和可扩展特性为应用程序的开发和交付带来了巨大的便利,特别是在微服务架构应用上,是许多开发者和组织的首选。然而,随着容器化的广泛应用,Docker也面临着日益复杂和严峻的容器安全挑战。
本文主要介绍k8s和Docker所面对的安全性问题,并推荐几款开源免费容器安全工具。
Kubernetes的安全性问题
(1)集群安全
集群安全包括通过启用认证、授权和加密来保护控制组件,如API服务器、etcd和Kubernetes控制器管理程序(Kubernetes controller manager)等。
(2)节点安全
节点安全主要是指正确配置网络和保护Kubernetes运行时环境,包括删除不必要的用户帐户、确保应用访问的合规性。
(3)应用程序安全
应用程序安全意味着要对pod进行保护,在Kubernetes中,pod是用于运行应用程序的容器。保护这些应用程序的前提是保护pod。Kubernetes提供了多个安全特性来帮助保护应用程序。这些特性可用于限制资源访问、实施网络策略,并支持容器之间的安全通信。
Docker容器的安全问题
(1)镜像污染
目前Docker Hub上面有着数量众多的第三方上传镜像,这些镜像质量参差不齐。在这其中,不排除有黑客故意上传包含了恶意程序的镜像,并伪装成业务镜像供用户下载使用。当用户误用此类镜像启动容器时,无疑会导致容器被入侵。因此,用户必须对这些镜像进行扫描甄别,以保证容器所使用的镜像是可受信任的,尽可能不使用非信任的第三方镜像。
(2)网络攻击
Docker默认使用bridge网络,该网络会创建一个虚拟网桥,连接在同一个网桥之间的容器可以互相访问。当某个容器被入侵时,黑客有可能顺着网络访问到宿主机中的其他容器。同时 ,攻击者也可以通过DDos等方式,攻击容器的服务来耗尽主机的资源,从而引起整个宿主机的崩溃。
(3)内核攻击
当黑客获取到容器权限时,由于共享内核的缘故,理论上可通过对内核的攻击来达到控制或影响主机的地步 。
(4)操作不当
有些操作不当容易使容器出现漏洞,例如:
- 在启动容器时将主机的根目录映射到容器中;
- 在启用容器时使用特权模式——privileged,此时Docker容器允许可以访问主机上的所有设备,并可以获取大量设备文件的访问权限。
(5)针对Docker Daemon的攻击
Docker使用的是C/S架构,作为服务端的Docker Daemon会接收客户端通过CLI或者REST API发送的命令,并执行对容器的相应操作。但请求不一定都是由可信任的用户发起的,攻击者可能通过伪造请求的方式,来达到欺骗Daemon端执行危险的操作。
(6)Docker漏洞攻击
Docker本身属于应用程序,不可避免地会有出现代码的漏洞,这可能导致程序受到攻击。
综上所述,要确保容器安全,涉及设备、系统、网络、镜像、应用、操作等各个层次。其中,容器本身的安全往往容易容易被忽略,下面内容主要推荐一些对保护Kubernetes集群和Docker容器有用的开源工具,有助于Docker 镜像的静态扫描、安全审计、加固 Kubernetes 集群和实现运行时安全性。
1.Trivy
https://github.com/aquasecurity/trivy
Trivy是一个全面且多功能的安全扫软件。Trivy包含拥有查找安全问题的扫描器,并将目标定位在可以找到这些问题的地方。可用于查找容器、Kubernetes、代码存储库、云等当中存在的漏洞、错误配置、密码泄露、SBOM等问题。Trivy支持大多数流行的编程语言,支持跨平台操作系统。
Trivy支持扫描的对象包括:
- 容器镜像
- 文件系统
- Git仓库(远程)
- 虚拟机镜像
- Kubernetes
- AWS
Trivy能够发现的问题包括:
- 使用中的操作系统包和软件依赖关系(SBOM)
- 已知漏洞(CVEs)
- IaC问题和错误配置
- 敏感信息和秘密
- 软件许可信息
在执行Trivy扫描之后,将得到一个漏洞列表,包括漏洞的严重性和CVE编号。
实际的安装和使用如下:
(1)安装
使用Homebrew for MacOS and Linux 安装:
brew install trivy
docker run aquasec/trivy
或者使用脚本安装:
curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh | sh -s -- -b /usr/local/bin v0.47.0
也可以基于源码安装:
git clone --depth 1 --branch v0.47.0 https://github.com/aquasecurity/trivy
cd trivy
go install ./cmd/trivy
(2)扫描容器镜像
docker run -v /var/run/docker.sock:/var/run/docker.sock -v $HOME/Library/Caches:/root/.cache/ aquasec/trivy:0.47.0 image python:3.4-alpine
扫描结果如下:
2.Docker Bench for Security
https://github.com/docker/docker-bench-security
Docker Bench for Security是一个Docker安全相关的命令集,用于自动检查在生产环境中部署Docker容器的数十种常见最佳实践。
使用以下脚本可以从本机运行:
git clone https://github.com/docker/docker-bench-security.git
cd docker-bench-security
sudo sh docker-bench-security.sh
或者基于Docker执行:
docker run --rm --net host --pid host --userns host --cap-add audit_control \
-e DOCKER_CONTENT_TRUST=$DOCKER_CONTENT_TRUST \
-v /etc:/etc:ro \
-v /lib/systemd/system:/lib/systemd/system:ro \
-v /usr/bin/containerd:/usr/bin/containerd:ro \
-v /usr/bin/runc:/usr/bin/runc:ro \
-v /usr/lib/systemd:/usr/lib/systemd:ro \
-v /var/lib:/var/lib:ro \
-v /var/run/docker.sock:/var/run/docker.sock:ro \
--label docker_bench_security \
docker-bench-security
3.Clair
https://github.com/quay/clair
Clair是一个用于静态分析Docker和appc容器中的漏洞的开源项目。该工具有多种部署模式,最适合高可伸缩性和可用性。Clair 支持REST api,并提供HTML扫描报告。他还可以与Docker Registry集成以自动提供漏洞报告。
Clair 目前的版本v4使用ClairCore库作为其检查内容和报告漏洞的引擎。在较高的层次上,可以将Clair视为ClairCore库中提供的功能的服务包装器。Clair V4的架构如下图所示:
详细使用方式可以参考官方文档:https://quay.github.io/clair/howto/getting_started.html
4.Kube-bench
https://github.com/aquasecurity/kube-bench
CIS Benchmarking 是保护IT系统和数据的全球公认标准,它提供了一系列的指导手册来保护容易受到网络攻击的操作系统、软件和网络。
Kube-bench是一个开源工具,用于检查Kubernetes是否按照CIS Kubernetes基准(包含一组Kubernetes安全最佳实践)来优化部署。因此,当仅为CIS基准测试目的需要扫描时,kube-bench是最好的。
运行kube-bench有多种方法。可以在pod中运行kube-bench,但它需要访问主机的PID命名空间以检查正在运行的进程,以及访问主机上存储配置文件和其他文件的某些目录。GitHub存储库包含特定于云的 job-*.yaml 文件 ,kube-bench将根据机器上运行的Kubernetes版本自动决定运行哪个测试集。
例如:
$ kubectl apply -f job.yaml
job.batch/kube-bench created
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
kube-bench-j76s9 0/1 ContainerCreating 0 3s
# Wait for a few seconds for the job to complete
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
kube-bench-j76s9 0/1 Completed 0 11s
# The results are held in the pod's logs
kubectl logs kube-bench-j76s9
[INFO] 1 Master Node Security Configuration
[INFO] 1.1 API Server
...
具体可以参考相关文档:https://github.com/aquasecurity/kube-bench/blob/main/docs/running.md
5.kubeaudit
https://github.com/Shopify/kubeaudit
kubeaudit是一个可以针对常见的安全控制对Kubernetes的部署进行审计的开源工具,比如:
- 以非root用户运行
- 使用只读的根文件系统
- 放弃易受攻击的能力,不要添加新的
- 不要特权运行
kubeaudit的Brewhome安装如下:
kubeaudit all -f "/path/to/manifest.yml"
Kubeaudit 可以在三种不同的模式下运行:manifest、cluster和local。它还可以自动修复清单,这使它有别于其他竞争对手。
manifest模式运行—在该模式下,需要提供相关Kubernetes资源的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
...
另外,还有集群模式:
kubeaudit all
本地模式:
kubeaudit all -f "/path/to/config"
br
此外,kubeaudit有多个审计配置文件,包括外观,能力,限制,特权,rootfs, seccomp, netpols和asat。
6.Kubescape
https://github.com/kubescape/kubescape
Kubescape是一个开源的Kubernetes安全平台,适用于IDE、CI/CD管道和集群。它的功能包括风险分析、安全性、合规性和错误配置扫描,为Kubernetes用户和管理员节省了宝贵的时间、精力和资源。
安装:
curl -s https://raw.githubusercontent.com/kubescape/kubescape/master/install.sh | /bin/bash
执行扫描:
kubescape scan --verbose
结果如下
7.Kube-hunter
https://github.com/aquasecurity/kube-hunter
kube-hunter是一个用Python开发的开源渗透测试工具,用于在Kubernetes集群中寻找安全漏洞。它支持编写可以在本地机器、集群内部以及主动和被动模式下远程执行的自定义模块。
在活动模式下,kube-hunter可以发现任何漏洞,还可以将kube-hunter作为模拟攻击工具在staging 环境中运行。
安装和使用方式如下:
pip install kube-hunter # Installing Kube-hunter.
kube-hunter --remote some.node.com # Running remotely.
kube-hunter --cidr 192.168.0.0/24. # Network Scanning.
kube-hunter --remote some.domain.com --active # Active Mode.
kube-hunter --list --active # List of test cases.
kube-hunter --remote some.node.com --json # Json output
kube-hunter --k8s-auto-discover-nodes --kubeconfig "/path/config"
8.Cilium
https://github.com/cilium/cilium
Cilium是一个网络安全检测项目,提供基于eBPF的网络可观察性和安全性解决方案。它与Docker和Kubernetes兼容,允许在不更改应用程序代码或容器配置的情况下应用安全策略。
9.Syft and Grype
https://github.com/anchore/syft
https://github.com/anchore/grype
Syft是一个基于Go开发的CLI工具库,用于从容器映像和文件系统生成软件物料清单(SBOM)。Grype是一个针对容器映像和文件系统的漏洞扫描工具。当Syft与Grype等扫描工具一起搭配使用时,可以用于检测系统漏洞或异常。
Syft安装:
curl -sSfL https://raw.githubusercontent.com/anchore/syft/main/install.sh | sh -s -- -b /usr/local/bin
Grype安装:
curl -sSfL https://raw.githubusercontent.com/anchore/grype/main/install.sh | sh -s -- -b /usr/local/bin
具体使用,可参考官方文档。
10.Dockle
https://github.com/goodwithtech/dockle
Dockle是一个基于遵循CIS(互联网安全中心)Docker基准,并按照最佳实践构建安全的Docker容器镜像的工具。
扫描Docker Image的操作命令如下:
(1)扫描Docker镜像:
$ dockle goodwithtech/test-image:v1
br
(2)扫描Docker镜像文件:
$ docker save alpine:latest -o alpine.tar
$ dockle --input alpine.tar
(3)获取扫描JSON结果:
$ dockle -f json goodwithtech/test-image:v1
$ dockle -f json -o results.json goodwithtech/test-image:v1
更多操作可参考官方手册。