[K8s Security] 基于Kube-Bench(CIS Benchmark)的自动化安全基线扫描
简介
关于CIS
“CIS(Center for Internet Security) 是一个非盈利性实体,其任务是“确定、开发、验证、升级和维持针对网络防御的最佳做法解决方案”。 它借鉴了来自世界各地*、企业和学术界网络安全及 IT 专业人员的专业知识。 为了制定标准和最佳做法(包括 CIS 基准、控制措施和强化映像),他们遵循一致的决策制定模型。
CIS 基准是安全配置系统的配置基线和最佳做法。 每则指导建议都参考了一个或多个 CIS 控制措施,可帮助组织改进其网络防御能力。 CIS 控制措施与许多已建立的标准和规章框架对应,包括 NIST 网络安全框架 (CSF) 和 NIST SP 800-53、ISO 27000 系列标准、PCI DSS、HIPAA 等等。
每个基准都经历了两个阶段的共识评审。 第一个阶段属于初始开发过程,专家聚集在一起,讨论、创建和测试工作草案,直到就基准达成一致。 在第二阶段中,在发布基准后,共识团队将审核 Internet 社区中的反馈,以纳入基准中。”
对于安全从业人员来说,CIS提供了很好地最佳实践模型和基准,几乎涵盖了IT基础架构中的方方面面,包括常见的,Benchmark for Windows, Benchmark for Linux, Benchmark for Oracle, Benchmark for Cisco, Benchmark for Docker, Benchmark for Kubernetes, 等等(https://www.cisecurity.org/cis-benchmarks/)。
很多漏洞扫描工具也有集成基于CIS Benchmark 的扫描基线,以满足IT安全人员日常审计的需求。
关于Kube-Bench
Kube-Bench是Aqua发布的一款开源的K8s安全审计工具,基于CIS Benchmark for Kubernetes用Go语言开发。该工具会检查你是否根据CIS定义的Kubernetes安全基线部署了Kubernetes集群。(https://github.com/aquasecurity/kube-bench)。Kube-Bench的更新版本并不与Kubernetes的版本号一一对应,所以在部署Kube-bench前你要了解你要审计的k8s环境的具体版本是什么。
Kube-bench 安装
有四种方法安装Kube-Bench
1.在容器中运行kube-bench
2.在宿主机上运行一个单独的容器安装kube-bench
3.下载release文件
4.源码编译安装
本文中笔者选用第二种安装方法。
安装命令: docker run --rm -v pwd
:/host aquasec/kube-bench:latest install
[aaa@qq.com ~]# mkdir /opt/kube-bench && cd /opt/kube-bench
[aaa@qq.com kube-bench]# docker run --rm -v `pwd`:/host aquasec/kube-bench:latest install
等待安装,镜像大小约19M
[aaa@qq.com kube-bench]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
aquasec/kube-bench latest 65a956464fd7 5 days ago 19.3MB
安装完成后,会在安装路径下出现一个kube-bench可执行文件
[aaa@qq.com kube-bench]# ll
total 11126
drwxr-xr-x 8 root root 1024 Aug 18 15:36 cfg
-rwxr-xr-x 1 root root 11391798 Aug 18 15:36 kube-bench
常用命令:
[aaa@qq.com kube-bench]# ./kube-bench -help ---->查看使用帮助
[aaa@qq.com kube-bench]# ./kube-bench master ---->扫描master节点
[aaa@qq.com kube-bench]# ./kube-bench node ---->扫描node节点
[aaa@qq.com kube-bench]# ./kube-bench node --version 1.17 ---->扫描node节点,并指定k8s版本
配置自动化扫描
因为kube-bench工具进行k8s扫描操作比较简单,所以可以使用shell脚本来实现定期定时的自动化k8s集群安全基线扫描。并且将扫描报告以邮件方式发送出来。
前期准备:
1.K8s集群的各节点已经安装了kube-bench
2.各节点可以免密ssh登录(可以用ssh-******实现)
脚本如下:具体路径可以按需更改
aaa@qq.com kube-bench]#cat k8s_scan.sh
#! /bin/bash
## get date
strDate=$( date +%Y-%m-%d )
## get k8s cluster machines info
hostlist=($( kubectl get nodes --show-labels | awk 'NR == 1 {next} {print $1}') )
##create report path
mkdir -p /tmp/Kube-bench-scanreports/$strDate
path=/tmp/Kube-bench-scanreports/$strDate
##get currenthost
curhost=$( hostname )
## run kube-bench scan for each node
i=0
for host in ${hostlist[@]}
do
hostname=${hostlist[i]}
role=$( kubectl get nodes $hostname --show-labels | awk '{getline}{print $3}' )
{
if [ $role == "worker" ]
then
r="node"
ssh aaa@qq.com$hostname -tt << EOF
mkdir -p /tmp/Kube-bench-scanreports/$strDate/
cd /opt/kube-bench
./kube-bench $r > $path/K8s-scanreport-node-$hostname-$strDate.csv
scp $path/K8s-scanreport-node-$hostname-$strDate.csv aaa@qq.com$curhost:$path/
exit
EOF
elif [ $role == "master" ]
then
ssh aaa@qq.com$hostname -tt << EOF
mkdir -p /tmp/Kube-bench-scanreports/$strDate/
cd /opt/kube-bench
./kube-bench $role > $path/K8s-scanreport-master-$hostname-$strDate.csv
scp $path/K8s-scanreport-master-$hostname-$strDate.csv aaa@qq.com$curhost:$path/
exit
EOF
fi
i=$i+1
}
done
echo "Kubernetes Security Baseline Scan Report for below cluster:" > $path/K8sstatus
kubectl get nodes -o wide >> $path/K8sstatus
##send email with reports as attachment
cd $path
cat $path/K8sstatus | mail -s "Kubernetes Security Baseline Scan Report @$strDate" $( printf -- '-a %q ' *.csv ) -c aaa@qq.com.com aaa@qq.com.cn
然后可以使用crontab 设置定时任务跑脚本,定期发送报告邮件出来
收到邮件的格式:
上一篇: Java 排序算法 — 希尔排序
下一篇: 面向对象编程——类与对象一