写点什么

Kubernetes 安全专家(CKS)考试技巧

作者:HummerCloud
  • 2022-10-20
    北京
  • 本文字数:4278 字

    阅读完需:约 1 分钟

Kubernetes 安全专家(CKS)考试技巧

​注意:参加 CKS 考试需要经过认证的 Kubernetes 管理员(CKA) 认证。如果您没有它或它已过期(持续三年),您可以查看 CKA 考试的相关文章并完成考试。


什么是认证 Kubernetes 安全专家考试?

根据 CNFC 的说法,获得 CKS 证书证明考生具备在构建、部署和运行期间确保基于容器的应用程序和 Kubernetes 平台安全的技能、知识和能力。CKS 考试内容和 CKA 类似,大部分也都是实操。


CKS 考试大纲

CKS 考试旨在测试您在不同安全方面的技能。下表显示了 CKS 认证的不同领域及其权重。


!重要提示:考试中允许使用以下网站,建议多熟悉以下网站的内容结构,方便遇到问题快速查询

https://github.com/aquasecurity/trivy
https://docs.sysdig.com/
https://falco.org/docs/
https://gitlab.com/apparmor/apparmor/-/wikis/Documentation
复制代码


准备工作:

首先需要一个 k8s 集群来学习和尝试 CKS 认证中涉及的所有概念。你可以根据下方建议选取合适方式部署、管理一个 K8S 环境:

  1. MiniKube;

  2. 使用 kubeadm 部署集群;

  3. 使用免费 Google Cloud Credits 的https://devopscube.com/setup-kubernetes-cluster-google-cloud/

  4. 腾讯云容器服务 TKE;

  5. 阿里云容器服务服务 ACK;

  6. Azure 上使用免费云积分https://azure.microsoft.com/en-in/services/kubernetes-service/

  7. AWS 上使用免费套餐计划https://aws.amazon.com/eks/

别名:

设置别名非常有利于节省我们执行操作的时间并且减少产生错误的可能


vi ~/.bashrc---alias k='kubectl'alias kg='k get'alias kd='k describe'alias kl='k logs'alias kc='k create'source <(kubectl completion bash)source <(kubectl completion bash | sed 's/kubectl/k/g' )complete -F __start_kubectl k---
复制代码

资源快捷访问方式:


练习

生成 YAML Pod 规范

kg po  <pod-name> -o wide
# 生成 YAML Pod 规范kg po <pod-name> -o yamlkg po <pod-name> -o yaml > <pod-name>.yaml
# 获取不包含集群特定信息的 pod 的 YAML 规范kg po my-pod -o yaml --export > <pod-name>.yaml
复制代码


查看日志并打印


kubectl logs deploy/<podname>kubectl logs deployment/<podname>#Follow logskubectl logs deploy/<podname> --tail 1 --follow
复制代码

创建 ConfigMap 和 Secret

kc cm my-cm --from-literal=APP_ENV=devkc cm my-cm --from-file=test.txtkc cm my-cm --from-env-file=config.env
kc secret generic my-secret --from-literal=APP_SECRET=sdcdcsdcsdcsdckc secret generic my-secret --from-file=secret.txtkc secret generic my-secret --from-env-file=secret.env
复制代码


调试工具 busybox

可以使用 busybox 容器在集群内部进行各种系统调试,比如:端口验证、http、htpts 验证、网络可达验证、域名解析等

# 运行busybox 容器k run busybox --image=busybox:1.28 --rm --restart=Never -it sh
# 进入busybox容器k exec -it busybox -c busybox2 -- /bin/sh
# 添加资源限制kubectl run nginx --image=nginx --restart=Never --requests='cpu=100m,memory=256Mi' --limits='cpu=200m,memory=512Mi'
# 给pod创建并绑定servicekubectl run nginx --image=nginx --restart=Never --port=80 --expose
# 端口检验nc -z -v -w 2 <service-name> <port-name># NSLookupnslookup <service-name>nslookup 10-32-0-10.default.pod
复制代码

网络策略:

在 Kubernetes 集群中,默认情况下所有 pod 都可以与所有 pod 通信,这在某些实现中可能是一个安全问题。为了解决这个问题,Kubernetes 引入了网络策略来允许或拒绝基于 pod 标签的流量,这些标签是 pod 规范的一部分。

下面的示例拒绝在所有命名空间中运行的 Pod 的 Ingress 和 Egress 流量。

apiVersion: networking.k8s.io/v1kind: NetworkPolicymetadata:  name: example  namespace: defaultspec:  podSelector: {}  policyTypes:  - Egress  - Ingress
复制代码

下面的示例拒绝在所有命名空间中运行的 Pod 的 Ingress 和 Egress 流量。但它允许访问在端口 3306 上运行的 MySQL 解析服务。

apiVersion: networking.k8s.io/v1kind: NetworkPolicymetadata:  name: deny  namespace: defaultspec:  podSelector: {}  policyTypes:  - Egress  - Ingress  egress:  - to:    ports:      - port: 3306        protocol: TCP      - port: 3306        protocol: UDP
复制代码

拒绝除了 192.168.10.10 以外的所有 Ingress 流量

apiVersion: networking.k8s.io/v1kind: Ingressmetadata:  name:cloud-metadata-deny  namespace: defaultspec:  podSelector: {}  policyTypes:  - Egress  egress:  - to:      - ipBlock:           cidr: 0.0.0.0/0          except:          - 192.168.10.10/32
复制代码

允许 Egress 访问 192.168.10.10 服务器的数据

apiVersion: networking.k8s.io/v1kind: Ingressmetadata:  name: cloud-metadata-accessor  namespace: defaultspec:  podSelector:    matchLabels:      role: metadata-accessor  policyTypes:  - Egress  egress:  - to:    - ipBlock:        cidr: 192.168.10.10/32
复制代码

使用 Kubesec 进行静态分析

kubesec scan pod.yaml
# Using online kubesec APIcurl -sSX POST --data-binary @pod.yaml https://v2.kubesec.io/scan
# Running the API locallykubesec http 8080 &
kubesec scan pod.yaml -o pod_report.json -o json
复制代码

使用 trivy 进行漏洞扫描

trivy image nginx:1.18.0trivy image --severity CRITICAL nginx:1.18.0trivy image --severity CRITICAL, HIGH nginx:1.18.0trivy image --ignore-unfixed nginx:1.18.0
# Scanning image tarballdocker save nginx:1.18.0 > nginx.tartrivy image --input archive.tar
# Scan and output results to filetrivy image --output python_alpine.txt python:3.10.0a4-alpinetrivy image --severity HIGH --output /root/python.txt python:3.10.0a4-alpine
# Scan image tarballtrivy image --input alpine.tar --format json --output /root/alpine.json
复制代码

删除不需要的服务

列出服务:systemctl list-units --type service
停止服务:systemctl stop nginx
禁用服务:systemctl disable nginx
删除服务apt remove nginx
复制代码

绑定运行时类:

Kubernetes 在新版本中引入了 RuntimeClass 功能,v1.12 用于选择容器运行时配置。容器运行时配置用于运行 pod 的底层容器。

大多数 Kubernetes 集群将 dockershim 用作运行容器的 Runtime 类,但您可以使用不同的容器 Runtime。

在 dockershimKubernetes 版本中已弃用 v1.20,并将在 v1.24.

创建运行时类:

apiversion: node.k8s.io/v1beta1kind: RuntimeClassmetadata:  name: gvisorhandler: runsc
复制代码

给 pod 绑定运行时类

apiVersion: v1kind: Podmetadata:  labels:    run: nginx  name: nginxspec:  runtimeClassName: gvisor  containers:  - name: nginx    image: nginx 
复制代码

RBAC 使用:

基于角色的访问控制 (RBAC) 命令提供了一种基于单个用户或服务帐户的角色来调节对 Kubernetes 资源的访问的方法。

创建角色:kubectl create role developer --resource=pods --verb=create,list,get,update,delete --namespace=development
角色绑定:kubectl create rolebinding developer-role-binding --role=developer --user=zhangsan --namespace=development
验证:kubectl auth can-i update pods --namespace=development --as=zhangsan
创建集群角色:kubectl create clusterrole pvviewer-role --resource=persistentvolumes --verb=list
clusterrole和 serviceaccount绑定kubectl create clusterrolebinding pvviewer-role-binding --clusterrole=pvviewer-role --serviceaccount=default:pvviewer
复制代码

k8s 集群维护:

使用 kubectl drain 命令从给定节点中删除所有正在运行的工作负载(pod)。

使用 kubectl cordon 命令来封锁节点以将其标记为可调度。

使用 kubectl uncordon 命令将节点设置为可调度,这意味着控制器管理器可以将新 pod 调度到给定节点。

排空所有 pod 的节点:kubectl drain node-1
排空节点并忽略守护程序集:kubectl drain node01 --ignore-daemonsets
将一个节点标记为不可调度,这样就不能在这个节点上调度新的 Podkubectl cordon node-1
标记节点可调度kubectl uncordon node-1
复制代码

CKS 考试技巧

Kuberneteskubectl get 命令为用户提供了一个输出标志-o 或--output,它帮助我们以 JSON、yaml、wide 或 custom-columns 的形式格式化输出。

CKS 考试真题解析

如何保护和强化容器镜像

在设计容器映像以运行您的代码时,请特别注意保护和强化措施,以防止黑客攻击和特权升级攻击。在构建容器镜像时请记住以下几点:

  • 使用特定的包版本,例如 alpine:3.13.

  • 不要以 root 身份运行 - 使用 USER <username>来阻止 root 访问。

  • securityContext 在使用中使文件系统只读 readOnlyRootFilesystem: true

  • 使用删除 shell 访问 RUN rm -rf /bin/*

如何最小化操作系统占用空间

容器层:

说明 RUN、COPY 和 ADD 创建容器层。其他指令创建临时中间图像并且不增加构建的大小。创建图层的说明会增加结果图像的大小。

典型的 Dockerfile 如下所示。RUN 它使用指令添加单层。

FROM ubuntu
RUN apt-get update && apt-get install -y golang-go
CMD ["sh"]
复制代码

多阶段构建

多阶段构建利用 FROMDockerfile 中的多个语句。该 FROM 指令标志着构建的一个新阶段。它结合了多个 FROM 语句,允许利用以前的构建,以便有选择地将二进制文件复制到新的构建阶段,省略不必要的二进制文件。生成的 Docker 映像的大小要小得多,攻击面也大大减少。

FROM ubuntu:20.04 AS buildARG DEBIAN_FRONTEND=noninteractiveRUN apt-get update && apt-get install -y golang-goCOPY app.go .RUN CGO_ENABLED=0 go build app.go
FROM alpine:3.13RUN chmod a-w /etcRUN addgroup -S appgroup && adduser -S appuser -G appgroup -h /home/appuserRUN rm -rf /bin/*COPY --from=build /app /home/appuser/USER appuserCMD ["/home/appuser/app"]
复制代码

总结:

勤加练习是通过 CKS 考试的关键,本文只列举了部分实操内容,更多考试内容以及详细信息可以前往 CNCF 官网或 Linux foundation 查看,最后祝各位考试顺利通过!

关于 HummerRisk

HummerRisk 是开源的云原生安全平台,以非侵入的方式对云原生环境进行全面安全检测。

针对于 K8s 的安全,我们提供多方面的检测能力,可以帮助用户快速发现 K8s 集群中的各种安全问题。


访问项目地址了解试用:​ ​

https://github.com/HummerRisk/HummerRisk

发布于: 刚刚阅读数: 5
用户头像

HummerCloud

关注

还未添加个人签名 2022-09-07 加入

还未添加个人简介

评论

发布
暂无评论
Kubernetes 安全专家(CKS)考试技巧_Kubernetes_HummerCloud_InfoQ写作社区