1 安全扫描
(1)创建一个高级扫描
(2) 打开 Plugins选项.
Disable 所有插件除了下面几个:
General
Settings
Policy Compliance
Service Detection
(3) 在Compliance部分 选择 需要扫描的合规系统:centos或者其他.
保存扫描即可。
2 扫描实例:k8s的CIS检测
2.1 配置
(1) 在nessus 中导入下列的策略,该策略中包含基础的k8s master的节点cis扫描配置
(2) 创建Credentials,选择SSH进行配置
如果supper-user包含了sudo的权限,并可以执行任意的指令,可以直接设置SSH Privilege Escalation 为sudo
配置的用户需要能登录k8s集群节点的权限
如果supper-user未包含sudo的权限,则可以新建一个用户(需要配置该用户的password)使其可以通过sudo执行任意指令,此时需要设置SSH Privilege Escalation 为su+sudo
关于SSH Privilege Escalation 的解释如下:https://community.tenable.com/s/article/SSH-Privilege-Escalation#su-sudo
(3) 在Compliance 中配置CIS 扫描项,需要修改其中的文件路径使其符合集群的情况
(4) 检查Plugins中是否打开了如下的插件
如果存在问题可以参考:https://community.tenable.com/s/article/Troubleshoot-failed-audit-compliance-scans
2.2 运行
在My Scans→New Scans→ User Defined→ Test_k8s_cis,设置Targets为需要扫描的节点,然后选择Lanch
2.3 查看结果
运行时间可能较长,运行结束后可以看到compliance中扫描出来的违规配置
2.4 扫描结果分析
1.1.11 Ensure that the etcd data directory permissions are set to 700 or more restrictive
描述: etcd 存储目录权限过大
修复方案:chmod 700 /var/lib/etcd
影响:验证重启后无影响
1.1.21 Ensure that the Kubernetes PKI key file permissions are set to 600
描述: k8s pki 下的文件权限过大
修复方案:chmod -R 600 /etc/kubernetes/pki/*.key
影响:验证重启后无影响
1.2.1 Ensure that the –anonymous-auth argument is set to false
描述: 不允许匿名用户访问
修复方案:/etc/kubernetes/manifests/kube-apiserver.yaml 中配置–anonymous-auth=false,或者通过配置system:anonymous和system:unauthenticated的权限进行控制
影响:不允许匿名访问,所有直接的访问都会被拒绝
1.2.10 Ensure that the admission control plugin EventRateLimit is set
描述: 限制 API 服务器接受请求的速率,避免速度APIserver被打挂
修复方案: 在apiserver中添加如下配置
--enable-admission-plugins=...,EventRateLimit,...
--admission-control-config-file=<path/to/configuration/file>
示例配置文件如下:
/etc/kubernetes/pki/admission-control-config.yaml
apiVersion: apiserver.k8s.io/v1alpha1
kind: AdmissionConfiguration
plugins:
- name: EventRateLimit
path: eventconfig.yaml
/etc/kubernetes/pki/eventconfig.yaml
apiVersion: eventratelimit.admission.k8s.io/v1alpha1
kind: Configuration
limits:
- type: Namespace
qps: 10
burst: 100
cacheSize: 50
- type: User
qps: 10
burst: 50
cacheSize: 50
- type: Server
qps: 100
burst: 1000
影响:会限制集群和namespace 输出event的速率,当达到配置的极限时,超出的event会被拒绝并返回429 Too Many Requests,需要更具集群的大小及apiserver的处理能力来进行配置,参考社区说明: admission_control_event_rate_limit.md
1.2.12 Ensure that the admission control plugin AlwaysPullImages is set
描述: 设置pod的拉取策略为Always,在多租户时需要和鉴权配合使用以确保镜像不会被其他的用户使用
修复方案:在apiserver中添加如下配置–enable-admission-plugins=…,AlwaysPullImages,…
影响:每次拉取私有镜像都需要凭据。此外,在受信任的环境中,这可能会增加网络、注册表的负载并降低速度。此设置可能会影响离线或隔离的集群,这些集群已预加载镜像并且无权访问注册表以提取使用中的镜像。此设置不适用于使用此配置的集群。
1.2.14 Ensure that the admission control plugin ServiceAccount is set
描述:创建 Pod 时,如果未指定服务帐户,则会自动为其分配同一命名空间中的默认服务帐户
修复方案:似乎已经配置过,但是仍然扫出来
影响:无
1.2.16 Ensure that the admission control plugin PodSecurityPolicy is set
描述:必须要设置PodSecurityPolicy
修复方案:APIserver配置参数– enable -admission-plugins =…,PodSecurityPolicy,…
影响:在允许创建 pod 之前,必须创建并授予策略对象。至少在集群中需要一个安全策略,可能需要配置多个安全策略(注:psp在1.21中已经计划废弃podsecuritypolicy-deprecation-past-present-and-future)
备注:添加后apiserver无法拉起,还在验证中…
1.2.17 Ensure that the admission control plugin NodeRestriction is set
描述:限制 kubelet 仅可以修改自己的 Node 和 Pod 对象
修复方案:APIserver 配置参数–enable-admission-plugins=…,NodeRestriction,…
影响:无
1.2.21 Ensure that the –profiling argument is set to false
描述:关闭性能分析功能
修复方案:设置apiserver 的参数–profiling=false
影响:分析信息将不可用,基本影响很小
1.2.23 Ensure that the –audit-log-maxage argument is set to 30 or as appropriate
描述:将审计日志保留至少30天或视情况而定
修复方案:设置apiserver 的参数–audit-log- maxage=30
影响:基本无,可以根据具体情况设置
1.2.25 Ensure that the –audit-log-maxsize argument is set to 100 or as appropriate
描述:在审计日志达到 100 MB 或适当时轮换日志文件。
修复方案:设置apiserver 的参数–audit-log-maxsize=100
影响:基本无,可以根据具体情况设置
1.2.27 Ensure that the –service-account-lookup argument is set to true
描述:在验证令牌之前验证服务帐户,防止被删除后还能继续访问
修复方案:设置apiserver 的参数–service-account-lookup=true
影响:基本无
1.2.29 Ensure that the –etcd-certfile and –etcd-keyfile arguments are set as appropriate - certfile
描述:etcd 应配置为对客户端连接使用 TLS 加密
修复方案:按照 Kubernetes 文档设置 apiserver 和 etcd 之间的 TLS 连接。然后,在主节点上编辑API server pod规范文件/etc/kubernetes/manifests/kube-apiserver.yaml,设置etcd证书和密钥文件参数。–etcd-certfile=<path/to/client-certificate-file>和–etcd-keyfile=<path/to/client-key-file>
注:标准部署都配置过了,还会扫出的原因是期望为–etcd-certfile=/etc/kubernetes/pki/etcd/peer.crt([\s]|$),需要使用固定目录下的文件
影响:基本无
1.2.33 Ensure that the –encryption-provider-config argument is set as appropriate
描述:加密 etcd 键值存储。
修复方案:按照 Kubernetes 文档并配置 EncryptionConfig 文件。然后,在主节点上编辑 API 服务器 pod 规范文件 /etc/kubernetes/manifests/kube-apiserver.yaml 并将 –encryption-provider-config 参数设置为该文件的路径:–encryption-provider-config =</path/to/EncryptionConfig/File>
影响:待验证,看起来更变密钥似乎会对apiserver读取数据有影响 https://kubernetes.io/zh/docs/tasks/administer-cluster/encrypt-data/
1.2.34 Ensure that encryption providers are appropriately configured
描述:在使用 etcd 加密的地方,应该配置适当的提供者。
修复方案:按照 Kubernetes 文档并配置 EncryptionConfig 文件。在此文件中,选择 aescbc、kms 或 secretbox 作为加密提供程序。
影响:与1.2.33 为一个问题,可以同步修复
1.2.6 Ensure that the –kubelet-certificate-authority argument is set as appropriate
描述:在建立连接之前验证 kubelet 的证书,kubelet和apiserver使用https进行通信
修复方案:设置 apiserver 和 kubelets 之间的 TLS 连接,并设置apiserver 的参数 –kubelet-certificate-authority=/etc/kubernetes/pki/apiserver-kubelet-client.crt
影响:apiserver 和 kubelets 上配置 TLS
1.3.1 Ensure that the –terminated-pod-gc-threshold argument is set as appropriate
描述:设置终止pod收集数量,当前默认是12500才会进行回收
修复方案:设置/etc/kubernetes/manifests/kube-controller-manager.yaml 的参数 –terminated-pod-gc-threshold为合适的值
影响:基本无
1.3.2 Ensure that the –profiling argument is set to false
描述:是否打开controller-manager的性能分析功能
修复方案:/etc/kubernetes/manifests/kube-controller-manager.yaml 设置–profiling=false
影响:基本无,分析信息将不可用
1.3.7 Ensure that the –bind-address argument is set to 127.0.0.1
描述:不要将kube-controller-manager绑定到127.0.0.1之外的IP
修复方案:/etc/kubernetes/manifests/kube-controller-manager.yaml 并设置–bind-address=127.0.0.1
影响:基本无
1.4.1 Ensure that the –profiling argument is set to false
描述:是否打开kube-schedule的性能分析功能
修复方案: /etc/kubernetes/manifests/kube-scheduler.yaml 设置–profiling=false
影响:基本无,分析信息将不可用
2.1 Ensure that the –cert-file and –key-file arguments are set as appropriate - cert
描述:etcd服务配置tls
修复方案: /etc/kubernetes/manifests/etcd.yaml 配置–cert-file和–key-file
注:其实已经配置,不过文件路径不符合期望–cert-file=/etc/kubernetes/pki/apiserver-etcd-client.crt
影响:无
3.1.1 Client certificate authentication should not be used for users
描述:client的认证不应该使用证书,例如 OIDC 的使用,应该替代客户端证书。
修复方案: 去除apiserer中的参数client-ca-file
影响:客户端无法使用证书进行访问,需要进一步评估
5.2.4 Minimize the admission of containers wishing to share the host network namespace
描述:通常不允许容器使用hostnetwork
修复方案: 创建禁止使用node节点网络的PSP
影响:集群内使用hostnetwork的系统组件都要使用nodeport或者其他形式进行暴露
5.2.7 Minimize the admission of containers with the NET_RAW capability
描述:通常不允许使用具有潜在危险的 NET_RAW 功能的容器
修复方案: 创建 PSP,确保将 .spec.requiredDropCapabilities 设置为包含 NET_RAW 或 ALL。
影响:带有以 NET_RAW 功能运行的容器的 Pod 将不被允许
5.2.8 Minimize the admission of containers with added capabilities
描述:通常不允许具有超出默认设置的分配能力的容器
修复方案:确保 allowedCapabilities 不存在于集群的 PSP 中,除非它被设置为空数组。
影响:带有需要超出默认设置的能力的容器的 Pod 将不被允许。