基本了解:
- 我们在前面学习的安全控制RBAC就属于K8s安全机制中的一种,所谓安全机制只是一个概念,并非某个机制原理,就像一座城池,外面有护城河,有高高的围墙,进城门需要出示令牌,城里各个关卡还设有拦路的栅栏,等等,我们可以把K8s中的数据资源比作一个皇宫,要保护里面的数据就需要设置重重“关卡”,也就起到了安全保护作用,整个安全流程就可以看作K8s的安全机制。
K8s安全机制实现目标:
- 保证容器与其所在宿主机的隔离。
- 限制容器给基础设施或其他容器带来的干扰。
- 最小权限原则,即合理限制所有组件的权限,确保组件只执行它被授权的行为,通过限制单个组件的能力来限制它的权限范围。
- 明确组件间边界的划分。
- 划分普通用户和管理员的角色。
- 在必要时允许将管理员权限赋给普通用户。
- 允许拥有Secret数据(Keys、Certs、Passwords)的应用在集群中运行。
K8s 的安全机制:
- 集群安全:TLS证书认证、RBAC
- Security Context:安全上下文,是限制pod和容器的行为,例如只读文件系统、特权、运行用户等。
- Pod Security Policy:集群级的 Pod 安全策略,自动为集群内的 Pod 配置安全策略。
- Sysctls:允许容器设置内核参数。
- AppArmor:限制容器中应用对资源的访问权限。
- Network Policies:控制集群中网络通信。
- Seccomp:限制容器内进程的系统调用。
- 也还有很多其他的插件也可以起到一定的安全防范作用,这里不一一列举,大家可以自行官网了解。
基本了解:
- 互联网安全中心(CIS,Center for Internet Security),是一个非盈利组织,致力为互联网提供免费的安全防御解决方案。
- 官网
- K8s CIS基准
下载CIS基准PDF文件步骤:
- 进入K8s CIS基准网址,找到K8S那一栏,随后就会让你填写邮件信息,给你邮件发送一个下载连接地址。
- 进入下载地址,找到你想防控的对象,我们这里就找k8s。
- 找最新版本下载即可。注意CIS基准文件即时是最新的,也有可能与K8s最新版本有区别,毕竟不是同一家公司维护,所以作为安全防范类的工具采集出来的结果也只是作为参考,并没有百分百的精确,但即使如此,作为普通运维来讲,也可以很大程度上杜绝一些问题。
- 我们可以下载pdf后,根据里面的基准来检查K8s集群配置,但内容量太大,一般会采用相关工具来完成这项工作,此时就出现了Kube-bench工具。
Kube-bench工具是什么?
Kube-bench是容器安全厂商Aquq推出的工具,基于Go开发,以CIS K8s基准作为基础,来检查K8s是否安全部署。
主要查找不安全的配置参数、敏感的文件权限、不安全的帐户或公开端口等等。
安装包下载地址
1.解压安装包,移动目录。
tar zxvf kube-bench_0.6.3_linux_amd64.tar.gz
mkdir /etc/kube-bench # 创建默认配置文件路径
mv cfg /etc/kube-bench/cfg
mv kube-bench /usr/bin/
工具用法:
- 执行命令后,会逐个检查安全配置并输出修复方案及汇总信息输出。
- 根据扫出来的建议针对性的修改,当然并非工具给的建议就要做出修改,毕竟这个工具是根据下载PDF里的条例挨个扫描,也存在版本跟k8s版本不一致的情况。
- 若结果与实际不符合,可修改成【INFO】状态,在插件目录下修改对应检查的对象文件,在要修改的条目下增加type参数。
- 若按照结果进行修改,根据提示信息修改对应组件的yaml文件,添加参数后会自动重建该静态Pod即可。
常用参数:
- -s 或 --targets:指定要基础测试的目标,这个目标需要匹配 cfg/< version >中的文件名称,已有目标:master, controlplane, node, etcd, policies。
- –version:指定k8s版本,如果未指定会自动检测。
- –benchmark:手动指定CIS基准版本,不能与–version一起使用。
信息等级:
- [PASS]:测试通过。
- [FAIL]:测试未通过,重点关注,在测试结果会给出修复建议。
- [WARN]:警告,可做了解。
- [INFO]:信息。
测试项目配置文件格式信息:
- id:编号。
- text:提示的文本。
- audit:测试方法。
- tests:测试项目。
- remediation:修复方案。
- scored:如果为true,kube-bench无法正常测试,则会生成FAIL;如果为false,即时无法正常测试,也会生成WARN。
- type:如果为manual,则会生成WARN;如果为skip,则会生成INFO。常常用在检查出来的信息虽是警告级别要做修改,但实际情况不需要修改,此时可以添加这个参数就会跳过检测,输出为INFO级别。
注意事项:
- 此工具只是用来检查k8s组件配置信息是否正确,衡量标准是根据CIS上下载的pdf文件条目挨个检查,可能存在与k8s当前组件版本不一致导致检查有些出入。比如检查出来某个组件参数需要关闭,其实还是上个版本的,k8s最新版本该组件参数已被启用,这种情况就需要挨个检查。
- 不要随意修改组件参数,尤其是线上环境更不能直接修改,修改前需要掂量改后的结果。
1.检查master配置。
[root@k8s-master1 ~]# kube-bench run -s master
2.将检查出来的 [FAIL] 问题统一粘贴出来,这里的编号与下载的pdf文件里编号是一一对应的。
#1、建议etcd服务的配置文件权限设置成644,或者更为严谨。
[FAIL] 1.1.7 Ensure that the etcd pod specification file permissions are set to 644 or more restrictive (Automated)
#2、建议etcd服务的配置文件属主属组为root:root。
[FAIL] 1.1.8 Ensure that the etcd pod specification file ownership is set to root:root (Automated)
#3、建议etcd的数据目录权限设置为700;属主属组设置为etcd:etcd。
[FAIL] 1.1.11 Ensure that the etcd data directory permissions are set to 700 or more restrictive (Automated)
[FAIL] 1.1.12 Ensure that the etcd data directory ownership is set to etcd:etcd (Automated)
#4、k8s连接kubelet证书配置,可忽略。
[FAIL] 1.2.6 Ensure that the --kubelet-certificate-authority argument is set as appropriate (Automated)
#5、pod入口插件,检查pod创建是否允许规则,已弃用,有个替代品。
[FAIL] 1.2.16 Ensure that the admission control plugin PodSecurityPolicy is set (Automated)
#6、kube-apiserver之前监听6443、8080端口,但8080是非安全端口,安全等级低,设置为0不再默认监听8080,该参数已弃用。
[FAIL] 1.2.19 Ensure that the --insecure-port argument is set to 0 (Automated)
#7、api-server性能分析接口,很多情况下不需要用,默认开启,这里建议关闭掉。
[FAIL] 1.2.21 Ensure that the --profiling argument is set to false (Automated)
#8、审计日志相关。
[FAIL] 1.2.22 Ensure that the --audit-log-path argument is set (Automated)
[FAIL] 1.2.23 Ensure that the --audit-log-maxage argument is set to 30 or as appropriate (Automated)
[FAIL] 1.2.24 Ensure that the --audit-log-maxbackup argument is set to 10 or as appropriate (Automated)
[FAIL] 1.2.25 Ensure that the --audit-log-maxsize argument is set to 100 or as appropriate (Automated)
#9、控制器性能分析接口,建议关闭。
[FAIL] 1.3.2 Ensure that the --profiling argument is set to false (Automated)
#10、调度器该参数已弃用。
[FAIL] 1.4.1 Ensure that the --profiling argument is set to false (Automated)
1.找到要修改的条目,这里检查1.1.7条目内容,可以看到实际的权限没有问题,所以这里的建议可以忽略。
2.进入/etc/kube-bench/cfg/cis-1.6目录,我这里是cis-1.6这个版本,大家根据自己的实际情况来。找到文件里的对应编号。
#添加此行。
type: skip
3.再次执行检查命令,此时该词条的状态已经变为 [INFO] 状态。
1.比如我这里需要修改1.2.21条目的状态为 [PASS],在k8s官网查找对应参数的用法,kube-apiserver接口官方地址,是需要把api-server的这个参数改成false。
2.还需要把1.3.2条目的状态为 [PASS],是需要把kube-controller-manager控制器的参数修改成false。kube-controller-manager官网接口
3.修改kube-apiserver和kube-conontroller-manager两个组件的yaml文件,添加此参数配置,而kube-scheduler调度器已启用,可以忽略。
4.静态Pod文件被修改,会自动重建该组件pod,再次检查安全配置就会显示为 【PASS】状态。
- 是一个 Python 工具,查找Kubernetes集群中的安全漏洞,一般是放在K8s集群之外的机器上执行扫描。
- 有三种安装方式,二进制、容器、Pod,这里使用docker来安装。
- 有三种扫描方式:
- 远程扫描:扫描一个或多个特定的ip或DNS名称
- 接口扫描:扫描本地网络所有接口上的子网
- IP范围扫描:扫描给定的IP范围
1.拉取镜像安装。
docker run -it --rm --network host aquasec/kube-hunter
docker run --rm aquasec/kube-hunter --interface
docker run --rm aquasec/kube-hunter --cidr 192.168.130.0/24
基本概念:
- Trivy:是一种用于容器镜像、文件系统、Git仓库的漏洞扫描工具。发现目标软件存在的漏洞。
- Trivy易于使用,只需安装二进制文件即可进行扫描,方便集成CI系统。
- 项目地址
注意事项:
- 并非所有漏洞都需要修复,有的不好修复,只有对外提供服务时用到某个库才可会被黑客利用。
- 可以通过升级库的版本、打补丁方式修复漏洞。
1.下载安装包,推荐使用二进制安装,随后解压可以直接使用。
2.拉取镜像漏洞缓存库。
[root@k8s-master1 trivy]# ./trivy image nginx
[root@k8s-master1 trivy]# ./trivy image nginx -s high
4.json格式输出到文件。
[root@k8s-master1 trivy]# ./trivy image nginx -s high -f json -o qingjun.log
基本概念:
- kubesec:是一个针对K8s资源清单文件进行安全配置评估的工具,根据安全配置最佳实践来验证并给出建议。
- 项目地址
1.下载二进制包解压使用。
[root@k8s-master1 trivy]# tar zxf kubesec_linux_amd64.tar.gz
2.扫描一个deploy.yaml文件,给出相关安全配置建议。
[root@k8s-master1 trivy]# ./kubesec scan deploy.yaml
[root@k8s-master1 opa]# docker run -i kubesec/kubesec scan /dev/stdin < deploy.yaml
#可以先设置成http服务,直接启动调用。
[root@k8s-master1 trivy]# ./kubesec http 8080 &
#运行一个容器。
[root@k8s-master1 opa]# docker run -d --name=my-kubesec -p 8888:8080 kubesec/kubesec http 8080
#远程调用kubesec检查本地的yaml文件安全配置。
[root@k8s-master1 opa]# curl -sSX POST --data-binary @gatekeeper.yaml http://192.168.130.145:8888/scan