kube-bench测试准入
针对kubeadm创建的cluster运行CIS基准测试工具时,发现了多个必须解决的问题。
通过配置修复所有问题并重新启动受影响的组件以确保新设置生效。
修复针对kubelet发现的所有以下违规行为
Ensure that the anonymous-auth argument is set to false
Ensure that the -authorization-mode argument is not set to AlwaysAllow
尽可能使用Webhook 身份验证/授权
修复针对etcd发现的以下违规行为:
Ensure that the –client-cert-auth argument is set to true
分为几个部分
1 | **1.修改kubelet配置文件/var/lib/kubelet/config.yaml** |
使用TLS Secret
Context:
您需要使用存储在 TLS Secret 中的 SSL 文件来保护 Web 服务器的安全访问。
Task:
在 smart-rose 命名空间中为名为 smart-rose 的现有 Deployment 创建名为 smart-rose 的 TLS
Secret。
使用以下 SSL 文件:
证书:/home/candidate/ksmv00201-master/ca-cert/smart.web.k8s.crt
密钥:/home/candidate/ksmv00201-master/ca-cert/smart.web.k8s.key
Deployment 已配置为使用 TLS Secret。
请勿修改现有的 Deployment。
使用命令行创建Secret
1 | kubectl -n smart-rose create secret tls smart-rose \ |
验证
1 | kubectl get deployment -n smart-rose |
优化dockerfile和deployment
Task:
1、分析和编辑给定的 Dockerfile:/home/candidate/KSSC00301/Dockerfile(基于 ubuntu:16.04
镜像),并修改文件中可能涉及到的安全/最佳实践问题的一个异常。
2、分析和编辑给定的清单文件:/home/candidate/KSSC00301/deployment.yaml,并修改文件中有
安全/最佳实践问题的一个异常。
提示:
1、请勿添加或删除配置项,只需修改现有配置的属性值让以上两个配置都不在有安全/最佳实践问题。
2、如果需要非特权用户来执行任何项目,则请使用用户 ID 65535 的用户 nobody。
dockerfile优化
1 | FROM ubuntu:16.04 |
deployment优化
开启文件系统只读模式
关闭特权模式
1 | ... |
deployment安全管理securityContext
修改运行在namespace app名称空间里名为lamp-deployment的现有 Deployment,以便其容器:
·使用用户ID 30000运行
·使用只读的根文件系统
·禁止特权提升
您可以在/home/candidate/kssc00401/lamp-deployment.yaml中找到Deployment的清单文件。
添加securityContext配置
官网查找securityContext
找到Configure a Security Context for a Pod or Container
在containers的列表中给每个容器添加
1 | securityContext: |
如果不是在容器级,而是在控制器级.spec设置也可以,但只能设置runAsUser,无法设置只读和特权
apiserver准入控制
Context:
出于测试目的,由 kubeadm 创建的 cluster 的 Kubernetes API 服务器临时配置为允许未经身份验证
和未经授权的访问。
Task:
重新配置cluster的kubernetes API服务,以确保只允许经过身份验证和授权的REST请求。具体要求如下:
1、 禁止匿名身份验证
2、 使用授权模式Node,RBAC
3、 使用准入控制器NodeRestriction
您可以使用集群位于
/etc/kubernetes/admin.conf 的原始 kubectl 配置文件来访问受保护的集群
最后删除anonymous的clusterRolebinding
修改/etc/kubernetes/manifests/kube-apiserver.yaml
1 | --authorization-mode=Node,RBAC |
删除clusterRolebinding
1 | kubectl get clusterRolebinding \ |
镜像安全扫描
Context:
cluster上设置了容器镜像扫描器,但尚未完全集成到cluster的配置中。您必须将容器镜像扫描完全集成到kubeadm配置的集群里。
Task:
在**/etc/kubernetes/controlconf目录中**,有不完整的配置,以及具有HTTPS 端点的
https://wakanda:8080/image_policy的功能性容器镜像扫描器:
首先,重新配置 API 服务器以启用所有准入控制插件,以支持提供的 AdmissionConfiguration 设置
接着,重新配置 ImagePolicyWebhook,确保在后端失效时拒绝不符合政策的镜像。
最后,为了验证配置的有效性,部署在/home/candidate/kssc00601/vulnerable-resource.yaml文件中
定义的测试资源,该资源使用一个应被拒绝的镜像。
您可以根据需要删除并重新创建该资源进行测试。
重启kubelet
解法
这个目录下有三个文件,分别是admissionConfig,KUBECONFIG,policy
只需要修改前两个
官网,找Admission Control in Kubernetes
修改admissionConfig文件
1 | apiVersion: apiserver.config.k8s.io/v1 |
修改KUBECONFIG
server: https://wakanda:8080/image_policy #改成题目给的webhook地址
修改apiserver配置文件
添加
1 | --enable-admission-plugins=NodeRestriction,ImagePolicyWebhook |
验证
通过应用题目给的/home/candidate/kssc00601/vulnerable-resource.yaml
如果直接报错镜像未验证,说明做成功了
Cilium网络策略
Task:
使用 Cilium 实现以下操作,以保护现有应用程序的内部和外部网络流量。
首先,在 nodecli 命名空间下创建一个名为 clium 的 L4 Cilium 网络策略,并根据以下要求进行配置:
1、允许 ingress-nginx-web 命名空间中的所有 Pod 访问 clium Deployment 中的 Pod。
2、要求相互身份验证来保障通信安全。
接下来,在前述网络策略的基础上,进行以下扩展:
1、允许主机访问 clium Deployment 中的 Pod。
2、禁用相互身份验证。
会给一个Cilium的官网https://cilium.io/
搜索Example,进入L4 Examples
1 | apiVersion: cilium.io/v2 |
修改docker服务权限
Task
执行以下任务,来保护kssc00801集群
从 docker 组中删除developer用户
注意: 不要从其他组中删除用户
重新配置并重启 Docker 守护进程,确保位于/var/run/docker.sock 的套接字文件由 root 组拥有。
重新配置并重启 Docker 守护进程,确保它不监听任何 TCP 协议的端口。
解法
1 | 删除用户 |
升级k8s工作节点
Context:
当前使用 kubeadm 配置的集群最近完成了一次升级。由于兼容性原因,有一个节点被保留在较旧的版本上。
Task:
升级集群中的节点 node01,使其与control plane节点的版本保持一致。
正常是以官网为参考,本题是把node01从1.31.0升级到
1.31.1,如果是其他版本,
官网查找upgrading kubeadm cluster
1 | 查看当前版本,保证工作节点与控制节点版本一致 |
使用ingress http代理
Task
在 prod01 namespace 创建一个名为 web 的 Ingress 资源,并根据以下要求配置:
1)将主机 web.k8singress.local 和所有路径的流量路由到现有的 web Service。
2)使用已存在的 web-cert Secret 进行 TLS 终止。
3)将所有 HTTP 请求重定向至 HTTPS。
提示:可使用以下命令测试 Ingress 配置:curl -Lk https://web.k8singress.local
官网查找ingress(有两个ingress)
搜tls
1 | kubectl get ingressclasses # 查看ingressclass类名字和端口 |
使用falco扫描识别异常行为pod
Task
属于应用程序 olla的一个 Pod 出现异常,正从敏感文件 /dev/mem 直接读取系统内存数据。
首先,识别出正在访问 /dev/mem 的异常 Pod
然后,将该异常 Pod 所属的 Deployment 缩减至零副本。
注意事项:
- 除缩小pod副本外,不修改 Deployment 的其他配置。
- 不对其他 Deployment 进行更改。
- 不要删除任何 Deployment。
考试的时候会给一个falco官网https://falco.org
搜索Basic Elements of Falco Rules
写falco配置文件
1 | - list: mem_file |
配置集群日志审计
您必须为 kubeadm 配置的集群启用审计。
Task
首先,请重新配置集群中的 APIserver 服务,以便:
1) /etc/kubernetes/logpolicy/sample-policy.yaml 提供了基本的策略,正在被使用
2)日志存储在 /var/log/kubernetes/audit-logs.txt 文件中
3)最多保留 3 个日志,保留时间为 5 天
注意:基本策略仅指定不记录的内容。
其次,编辑并扩展基本策略以记录:
1)RequestResponse 级别的 persistentvolumes 事件
2)front-apps namespace 中的 configmaps 事件的请求正文
3)Metadata 级别的所有 namespace 中的 ConfigMap 和 Secret 的更改
4)Metadata 级别记录所有其他请求
注意:确保 APIserver使用扩展后的策略。
解法:
官网搜索audit
1 | 在/etc/kubernetes/logpolicy/sample-policy.yaml中 |
使用网络策略Networkpolicy
您需要通过 NetworkPolicy 来管理现有的 Deployments ,实现控制跨越不同namespace的流量。
Task
首先,在 prod namespace中创建一个名为 deny 的 NetworkPolicy,以阻止所有的入口流量。
其次,在 data 命名空间中创建一个名为 allow-from-prod 的 NetworkPolicy,以允许仅来自 prod
namespace 的 Pod 流量进入。使用 prod namespace的标签来允许流量。
提示:prod namespace标记 env: prod
data namespace标记 env: data
官方网站查找 Network Policies
1 | --- |
SA异常
Context
在安全审计中发现,某个 Deployment 存在不符合安全要求的服务账号令牌,这可能会引发安全漏洞。
Task
首先,需要修改 monitor namespace 中现有的 stats-monitor-sa ServiceAccount,禁止自动挂载API 凭据。
接着,修改 monitor namespace 中现有的 stats-monitor Deployment,确保 ServiceAccount 令牌挂载到 /var/run/secrets/kubernetes.io/serviceaccount/token 路径。
通过名为 token 的投射卷注入该令牌。确保令牌以只读模式挂载
资源文件位置/home/candidate/stats-monitor/deployment1.yaml
官网搜索service account
寻找Configure service account for pods
就可以找到字段
1 | automountServiceAccountToken:false |
添加只读挂载的字段
1 | volumeMounts: |
基于bom创建SPDX文档
Task:
在 alpine namespace 中的 alpine Deployment 中,运行着三个不同版本的 Alpine 镜像容器。
首先,需要找出哪个 Alpine 镜像中包含了版本为 3.1.4-r5 的 libcrypto3 软件包。
其次,使用预安装的 bom 工具,在 /home/candidate/kssc00150/alpine.spdx 文件中为找出的镜像版本生成 SPDX 文档。
最后, 更新 alpine Deployment,删除使用上述找到镜像版本的容器。
Deployment 的清单文件可以在/home/candidate/kssc00150/alipine-deployment.yaml 中找到。
解法
通过kubectl exec -it -n alpine alpine-7949ddcc97-z9rqp -c alpine-container-2 -- apk list | grep libcrypto3
找到带有libcrypto3-3.1.4-r5的container
在deployment文件中将其删除,并更新
生成文档:
bom generate --image alpine:3.19.1 –output /home/candidate/kssc00150/alpine.spdx
pod安全标准
Context:
为满足要求,所有用户命名空间必须强制执行受限的 Pod 安全标准。
Task:
在 confidential namespace 命名空间中,有一个 Deployment 不符合限制性的pod安全标准,导致其
Pod 无法成功调度。
请修改该 Deployment 配置,使其符合受限标准,并验证 Pod 能够正常启动和运行。
提示: Deployment 的配置文件位于/home/candidate/kssc00160/nginx-unprivileged.yaml
创建这个yaml时会报错
Error from server (Forbidden): error when creating “nginx-unprivileged.yaml”: pods “nginx
unprivileged” is forbidden:
violates PodSecurity “restricted:latest”:
allowPrivilegeEscalation != false (container “nginx” must set
securityContext.allowPrivilegeEscalation=false),
securityContext.capabilities.drop=[“ALL”] is required,
securityContext.runAsNonRoot=true is required,
securityContext.seccompProfile.type must be set to “RuntimeDefault” or “Localhost”
根据报错内容,进行字段添加
1 | securityContext: |