kube-bench
安全是一个绕不开的话题,那么,在云原生领域,在kubernetes内更加的需要安全。毕竟没有人愿意自己的项目是千疮百孔,适当的安全可以保证项目或者平台稳定高效的运行。
安全性是一个永远不会消失的问题,无论该技术推出多长时间都无关紧要。因此,我们应该始终使用 kube bench、kube-hunter 和 CIS 基准来强化 Kubernetes 集群。我们的集群越安全,它们就越不容易出现停机和黑客攻击。
一,
什么是CIS?
当然了,我们这里提到的CIS指的是一个技术性的安全组织,不是什么独联体,无关政治。
互联网安全中心 (CIS) 是一家历史悠久的全球安全组织,已将其 Kubernetes 基准创建为“客观的、共识驱动的安全指南”,为集群组件配置提供行业标准建议并强化 Kubernetes 安全态势。
级别 1 建议实施起来相对简单,同时提供主要好处,通常不会影响业务功能。级别 2 或“深度防御”建议适用于需要更全面战略的关键任务环境。
CIS 还提供确保集群资源符合基准并为不合规组件生成警报的工具。CIS 框架适用于所有 Kubernetes 发行版。
优点: 严格且被广泛接受的配置设置蓝图。
缺点: 并非所有建议都与所有组织相关,必须相应地进行评估。
二,
现在的kubernetes集群安全现状
ubernetes (K8s) 成为世界领先的容器编排平台是有原因的,当今有74% 的 IT 公司将其用于生产中的容器化工作负载。它通常是大规模处理容器配置、部署和管理的最简单方法。
但是,尽管 Kubernetes 使容器的使用变得更容易,但在安全性方面也增加了复杂性。究其原因,集群的规模随着业务的增长可能也会不断增加,并且可能会有若干个集群,而每一套集群都是由若干个组件组成的,并且可能还会有高可用的需求,这些使得集群变得更加复杂。
Kubernetes 的默认配置并不总是为所有部署的工作负载和微服务提供最佳安全性。此外,如今您不仅要负责保护您的环境免受恶意网络攻击,还要负责满足各种合规性要求。说人话就是kubeadm这样的工具使得部署不在困难,但,每一个集群并不具有最佳的安全性。
合规性已成为确保业务连续性、防止声誉受损和确定每个应用程序的风险级别的关键。合规性框架旨在通过轻松监控控制、团队级别的问责制和漏洞评估来解决安全和隐私问题——所有这些都在 K8s 环境中提出了独特的挑战。
为了完全保护 Kubernetes,需要多管齐下的方法:干净的代码、完全的可观察性、防止与不受信任的服务交换信息以及数字签名。还必须考虑网络、供应链和 CI/CD 管道安全、资源保护、架构最佳实践、机密管理和保护、漏洞扫描和容器运行时保护。
三,
什么是kube-bench?
Kube-Bench是一款针对Kubernete的安全检测工具,从本质上来说,Kube-Bench是一个基于Go开发的应用程序,它可以帮助研究人员对部署的Kubernete进行安全检测
那么,kube-bench到底是检测kubernetes集群的什么呢?
主要是检测kubernetes集群的各个组件的配置文件,查看这些配置文件是否符合安全基线的标准。
例如,kubelet的配置文件:
其中的anonymous的值可以是true或者false,默认anonymous-auth参数设置成true,也就是可以进行匿名认证,这时对kubelet API的请求都以匿名方式进行,系统会使用默认匿名用户和默认用户组来进行访问,默认用户名“system:anonymous”,默认用户组名“system:unauthenticated”。那么,这显然是不安全的一种配置方式,因此,下面的文件做了显式的定义false,可以有效的提高集群的安全性。
那么,如果我们每一个集群都这样人肉检索配置是否合乎安全,显然是不合适的。
kube-bench这个工具可以自动的将各个组件内的这些错误的,不合乎安全基线的配置找出来,并生成一个详细的报告。也就是说,kube-bench是一个自动化的安全检测工具。
简介
Kube-bench可以检查Kubernetes是否根据CIS Kubernetes基准中定义的安全最佳实践进行部署。
安装
运行如下命令安装Kube-bench
docker run --rm -v `pwd`:/host aquasec/kube-bench:latest install
./kube-bench
检查
检查对k8s控制节点进行压测
./kube-bench master
检查完成后呢,我们发现它有10个问题。
解决问题
我们以设置--kubelet-certificate-authority
为例。
我们通过设置证书授权来改善kubernetes.
# 修改kube-apiserver.yaml
vim /etc/kubernetes/manifests/kube-apiserver.yaml
# 添加证书授权
- --kubelet-certificate-authority=/etc/kubernetes/pki/ca.crt
随后重启kubelet,并再次检查,我们就会发现这个问题以及解决了。
systemctl daemon-reload
systemctl restart kubelet.service
./kube-bench master
通过它的一些问题描述来一点点改善我们的集群环境。
常见问题
问题一
授权模式不应设置为AlwaysAllow,而应包括Node和RBAC。
实例地址ip设置无效。
不安全端口失败参数应该设置为0。
解决方法
vim /etc/kubernetes/manifests/kube-apiserver.yaml
# - --authorization-mode=AlwaysAllow
- --authorization-mode=Node,RBAC
# - --insecure-bind-address=0.0.0.0
- --insecure-port=0
问题二
确保anonymous-auth
参数设置为false
确保--authorization-mode
参数不能设置为AlwaysAllow
尽可能的使用webhook authn或authz
vim /var/lib/kubelet/config.yaml # master和node都需要改配置
anonymous:
enabled: false
authorization:
mode: Webhook
systemctl daemon-reload
systemctl restart kubelet.service
问题三
确保etcd的--client-cert-auth
失败设置为true
vim /etc/kubernetes/manifests/etcd.yaml
- --client-cert-auth=true
systemctl daemon-reload
systemctl restart kubelet.service