CKS考试心得

考前须知:

1、一共16题,100分66分及格,考试有两次机会

考试准备:

1、护照或或者包含英文名字证件

2、要选择工作日的早上或者晚上考试,千万不要选择周末去考,否则卡到怀疑人生,影响考试结果

3、提前1小时等待考试,关闭VM,webex、teams等服务就花了30分钟。
 

题目:

第一题: Secret

1 、在namespace istio-system中获取名为db1-test的现有secret的内容,将username字段存储在名为 /cks/sec/user.txt的文件中,并将password字段存储在名为 /cks/sec/pass.txt的文件中。 注意:你必须创建以上两个文件,他们还不存在。 注意:不要在以下步骤中使用/修改先前创建的文件,如果需要,可以创建新的临时文件。

k get secrets db1-test -n istio-system -o  jsonpath={.data.username} | base64 -d > /cks/sec/user.txt
k get secrets db1-test -n istio-system -o jsonpath={.data.password} | base64 -d > /cks/sec/pass.txt

2 在istio-system namespace中创建一个名为db2-test的新secret,内容如下:

username :  production-instance

password :  KvLftKgs4aVH

k create secrets generic db2-test -n istio-system --from-literal=username=production-instance 
--from-literal=password=KvLftKgs4aVH

3 最后,创建一个新的Pod,它可以通过卷访问secret db2-test :

Pod 名称  secret-pod

Namespace  istio-system

容器名   dev-container

镜像  nginx

卷名  secret-volume

挂载路径   /etc/secret

apiVersion: v1
kind: Pod
metadata:name: secret-podnamespace: istio-system
spec:containers:- image: nginxname: dev-containervolumeMounts:-  name: secret-volumemountpath: /etc/secretvolumes:- name: secret-volumesecret:secretName: db2-test

第二题:Pod指定特定ServiveAccount

1. 在现有namespace qa中创建一个名为backend-sa的新ServiceAccount,

确保此ServiceAccount不自动挂载API凭据。

1、#获取sa模板
k create sa  backend-sa  -n qa --dry-run=client -o yaml > sa.yaml  
2、编辑sa.yaml 增加不自动挂载api凭据参数
vim sa.yaml
apiVersion: v1
kind: ServiceAccount
metadata:name: backend-sanamespace: qa
automountServiceAccountToken: false
3、创建sa
k  create -f  sa.yaml
"

2. 使用 /cks/sa/pod1.yaml中的清单文件来创建一个Pod。

apiVersion: v1
kind: Pod
metadata:name: backendnamespace: qa
spec:serviceAccountName: backend-sa //就加这一行,在链接里有containers:- image: nginx:1.9imagePullPolicy: IfNotPresentname: backend"


3. 最后,清理namespace ns中任何未使用的ServiceAccount。

k get ns  -n qa  
k delete sa  名字

第三题:Pod安全

检查在 namespace production中运行的Pod,并删除任何非无状态或非不可变的 Pod。

使用以下对无状态和不可变的严格解释:

l 能够在容器内存储数据的 Pod 的容器必须被视为非无状态的。

注意:你不必担心数据是否实际上已经存储在容器中。

l 被配置为任何形式的特权 Pod 必须被视为可能是非无状态和非不可变的。
 

"1、删除privilege的pod
k  get pod  -n production k get pod 名字   -n  production  -o yaml  | egrep -i  ""priv.*: true""k  delete pod  名字   -n  production"

第四题:默认网络策略

为所有类型为Ingress+Egress的流量在namespace testing中创建一个名为denypolicy的新默认拒绝NetworkPolicy。

此新的NetworkPolicy必须拒绝namespace testing中的所有的Ingress + Egress流量。

将新创建的默认拒绝NetworkPolicy应用与在namespace testing中运行的所有Pod。

你可以在 /cks/net/p1.yaml找到一个模板清单文件。
 

edit   p1.yamlapiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:name: denypolicynamespace: testing
spec:podSelector: {}policyTypes:- Ingress- Egresskubectl create -f  p1.yaml

第五题:RBAC

一个名为web-pod的现有Pod已在 namespace db中运行。

编辑绑定到 Pod 的 ServiceAccount service-account-web的现有Role,仅允许只对 services类型的资源执行 get操作。
 

kubectl describe rolebindings -n db
kubectl edit role role-1 -n dbrules:- apiGroups:  [""]resources: ["services"]verbs:  ["get"]

在namespace db中创建一个名为role-2 ,并仅允许只对 namespaces类型的资源执行delete操作的新 Role。
 

 k create  role  role-2  --verb=delete --resource=namespaces       -n db    

创建一个名为role-2-binding的新 RoleBinding,
将新创建的 Role 绑定到 Pod 的ServiceAccount

k  create rolebinding role-2-binding --role=role-2  --serviceaccount=db: service-account-web -n db

第六题:NetworkPolicy

只允许以下Pod连接到Pod products-service

1 namespace qa中的Pod

2 位于任何namespace,带有标签environment: testing的Pod

注意:确保应用NetworkPolicy。

你可以在/cks/net/po.yaml找到一个模板清单文件

vim po.yaml
apiVersion:  networking.k8s.io/v1
kind: NetwokPolicy
metadata:name: pod-restrictionnamespace:  dev-team
spec:podSelector: matchLabels:name: testpolicyTypes:- Ingressingress:- from:- namespaceSelector:matchlabels:name: qa- from:- namespaceSelector: {}-  podSelector:matchLabels:environment: testing

第七题: Audit日志审计

在cluster中启用审计日志。为此,请启用日志后端,并确保:

l 日志存储在 /var/log/kubernetes/audit-logs.txt

l 日志文件能保留 10 天

l 最多保留 2 个旧审计日志文件
/etc/kubernetes/logpolicy/sample-policy.yaml
 提供了基本策略。它仅指定不记录的内容

ssh  master
vim /etc/kubernetes/mainfast/kube-apiserver.conf
--audit-policy-path=/etc/kubernetes/logpolicy/sample-policy.yaml
--audit-log-path=/var/log/kubernetes/audit-logs.txt
--audit-log-maxage=10
--audit-log-maxbackup=2- mountPath: /etc/kubernetes/logpolicy/sample-policy.yamlname: auditreadOnly: true
- mountPath: /var/log/kubernetes/name: audit-logreadOnly: false
- hostPath:path: /etc/kubernetes/logpolicy/sample-policy.yamltype:  Filename: audit  
- hostPath:path: /var/log/kubernetes/type:  DirectoryOrCreatename: audit-log      sytemctl restart kubelet

注意:基本策略位于cluster的master节点上。

编辑和扩展基本策略以记录:

l RequestResponse 级别的 cronjobs更改

l namespace front-apps中 deployment更改的请求体

l Metadata 级别的所有 namespace 中的 ConfigMap 和 Secret 的更改

此外,添加一个全方位的规则以在 Metadata 级别记录所有其他请求。
 

 #注意  这里是resources的[]里资源对象要加s   
apiVersion: audit.k8s.io/v1
kind: Policy
omitStages:- "RequestReceived"
rules:- level: RequestResponse resources:-  group: ""resources:  ["cronjobs"]- level: Request resources:-  group: ""resources:  ["deployments"]namespaces:  ["front-apps"]- level: Metadata resources:-  group: ""resources:  ["configmaps","secrets"]- level: Metadata omitStages:- "RequestReceived"k  apply -f  yaml

第七题: Dockerfile检测

#dockerfile
修改两处  #user root  改为 user nobody  
修改 image: ubuntu:latest  为 ubuntu:19.2
#deployment.yaml
第一种答案:
注释security context这行
第二种答案:
把securityContext:这里的privileged改为false,然后用户改为runAsUser: 65535

第八题: Gvisor

该 cluster使用 containerd作为CRI运行时。containerd的默认运行时处理程序是runc。

containerd已准备好支持额外的运行时处理程序runsc (gVisor)。

使用名为runsc的现有运行时处理程序,创建一个名为untrusted 的RuntimeClass。

更新 namespace server中的所有Pod以在gVisor上运行。
 

#编写yaml
apiVersion:  node.k8s.io/v1beta1
kind: RuntimeClass
metadata:name: untrusted
handler: runsc
#创建
k  create -f  yaml
#查询
kubectl get RuntimeClassk  eidt  deployment  web1  -n client
在 spec下面添加  runtimeClassName:  untrusted

第九题:Trivy扫描镜像安全漏洞

使用Trivy开源容器扫描器检测namespace kamino中 Pod 使用的具有严重漏洞的镜像。

查找具有High或Critical严重性漏洞的镜像,并删除使用这些镜像的Pod。

ssh  master
k get pod  -n kamino  --output=custom-columns="Name:.metadata.name,IMAGE: .spec.containers[*].image"
trivy image  -s  HIGH,CRITICAL   amonzline:1k  delete  pod    xxxxx   -n kamino --force

第十题: Sisdig

使用运行时检测工具来检测 Pod tomcat 单个容器中频发生成和执行的异常进程

有两种工具可供使用:

l sysdig

l falco

注: 这些工具只预装在cluster的工作节点,不在 master 节点。

使用工具至少分析30秒 ,使用过滤器检查生成和执行的进程,将事件写到 /opt/KSR00101/incidents/summary文件中,

其中包含检测的事件, 格式如下:

[timestamp],[uid],[processName]

保持工具的原始时间戳格式不变。

注: 确保事件文件存储在集群的工作节点上
 

docker ps | grep tomcat
找到containerid
sysdig -M 30 -P "%evt.time,%user.uid,%proc.name"  container.id=ID号    >  指定的log名字

第十一题: 启用 API server认证

重新配置cluster的Kubernetes APl 服务器,以确保只允许经过身份验证和授权的 REST请求。

使用授权模式 Node,RBAC 和准入控制器 NodeRestriction。
 

#备份
ssh  master
cp  /etc/kubernets/mainfast/kube-apiserver.yaml  ~/
vim  /etc/kubernets/mainfast/kube-apiserver.yaml
- --authorization-mode=Node,RBAC
- --enable-admission-plugins=NodeRestrictionsystemctl resatrt kubelet

删除用户 system:anonymous 的 ClusterRoleBinding来进行清理。
注意:所有kubectl 配置环境/文件也被配置使用未经身份验证和未经授权的访问。

你不必更改它,但请注意,一旦完成 cluster 的安全加固, kubectl 的配置将无法工作。

您可以使用位于 cluster 的 master 节点上,cluster 原本的 kubectl 配置文件

/etc/kubernetes/admin.conf ,以确保经过身份验证的授权的请求仍然被允许。

k  delete clusterrolebinding   system:anonymous

第十二题: kube-bench修复

kube-bench 是一个 CIS 评估工具,扫描 kubernetes 集群存在的安全问题,
基本上按照 扫描结果的修复建议进行修复就可以了,系统会给出很具体的修复措施。

# 修复 kube-apiserver 安全问题
#修改:--authorization-mode=Node,RBAC
#添加--insecure-port=0
#删除# --insecure-bind-address=0.0.0.0#修复 kubelet 安全问题
vi /var/lib/kubelet/config.yaml
# 将authentication.anonymous.enabled 设置为 false
authentication:anonymous:enabled: false
# authorization.mode 设置为 Webhook
authorization:mode: Webhook# 修复 etcd 安全问题
vi /etc/kubernetes/manifests/etcd.yaml
# 修改为true:
- --client-cert-auth=true
# 以上修复完成后 重新加载配置文件并重启kubelet
systemctl daemon-reload
systemctl restart kubelet

第十三题: ImagePolicyWebhook容器镜像扫描

给定一个目录 /etc/kubernetes/epconfig中不完整的配置以及具有 HTTPS 端点

https://acme.local:8082/image_policy 的功能性容器镜像扫描器:

1. 启用必要的插件来创建镜像策略

最后,通过尝试部署易受攻击的资源 /cks/img/web1.yaml来测试配置是否有效。

你可以在 /var/log/imagepolicy/roadrunner.log 找到容器镜像扫描仪的日志文件。

ssh master
vim /etc/kubernetes/mainfast/kube-apiserver.yaml
- -- enable-admission-plugins=NodeRestriction,ImagePolicyWebhook
- --admission-contorl-config-file=/etc/kubernetes/epconfig/admission_configrtion.yaml
- mountPath: /etc/kubernetes/epconfigname: k8s-admissreadOnly: true
- hostPath:path:  /etc/kubernetes/epconfigtype: DirectoryOrCreatename: k8s-admisssystemctl restart kubelet

2. 校验控制配置并将其更改为隐式拒绝(implicit deny)

cd  /etc/kubernetes/epconfig
vim admission_configrtion.yaml
修改 allowdefalut = false

3. 编辑配置以正确指向提供的 HTTPS 端点

cd  /etc/kubernetes/epconfig
vim  kubeconfig.yaml
在cluster下面增加:
server:  https://acme.local:8082/image_policy 

第十四题: PSP

创建一个名为restrict-policy的新的PodSecurityPolicy,以防止特权Pod的创建。

最后,创建一个名为dany-access-bind的ClusterRoleBinding ,

你可以在一下位置找到模版清单文件:

/cks/psp/psp.yaml
 

apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:name: restrict-policy  #改下名字
spec:privileged: false  # 修改为false seLinux:    rule: RunAsAnysupplementalGroups:rule: RunAsAnyrunAsUser:rule: RunAsAnyfsGroup:rule: RunAsAnyvolumes:- '*'k  create -f psp.yaml


在现有的namespace staging中创建一个名为psp-denial-sa的新ServiceAccount。

kubectl create sa psp-denial-sa -n staging


创建一个名为restrict-access-role并使用新创建的PodSecurityPolicy restrict-policy的ClusterRole。

kubectl create clusterrole restrict-access-role --verb=use --resource=psp --resource-name=restrict-policy

将新创建的ClusterRole restrict-access-role绑定到新创建的ServiceAccount psp-denial-sa。

 kubectl create clusterrolebinding dany-access-bind --clusterrole=restrict-access-role --serviceaccount=staging:psp-denial-sa

第十五题:AppArmor

在 cluster 的工作节点上,实施位于 /etc/apparmor.d/nginx_apparmor的现有APPArmor 配置文件。
编辑位于 /home/candidate/KSSH00401/nginx-deploy.yaml的现有清单文件以应用 AppArmor 配置文件。
最后,应用清单文件并创建其中指定的 Pod 。
 

ssh master
apparmor_parser -q /etc/apparmor.d/nginx_apparmorapiVersion: v1
kind: Pod
metadata:name: podx annotations: #添加这一部分container.apparmor.security.beta.kubernetes.io/podx: localhost/nginx-profile-3 
spec:containers:- image: busyboximagePullPolicy: IfNotPresentname: podx       #这个就是containers下的名字,为podxcommand: [ "sh", "-c", "echo 'Hello AppArmor!' && sleep 1h" ]resources: {}nodeName: node01dnsPolicy: ClusterFirstrestartPolicy: Always
status: {}kubectl apply -f /home/candidate/KSSH00401/nginx-deploy.yaml

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/615957.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

全面解析微服务

导读 微服务是企业应用及数据变革升级的利器,也是数字化转型及运营不可或缺的助产工具,企业云原生更离不开微服务,同时云原生的既要最大化发挥微服务的价值,也要最大化弥补微服务的缺陷。本文梳理了微服务基础设施组件、服务网格、…

C++重新认知:拷贝构造函数

一、什么是拷贝构造函数 对于简单变量来说&#xff0c;可以轻松完成拷贝。 int a 10; int b a;但是对于复杂的类对象来说&#xff0c;不仅存在变量成员&#xff0c;也存在各种函数等。因此相同类型的类对象是通过拷贝构造函数来完成复制过程的。 #include<iostream>…

基于 TensorFlow.js 构建垃圾评论检测系统

基于 TensorFlow.js 构建垃圾评论检测系统。 准备工作 在过去的十年中,Web 应用变得越来越具有社交性和互动性,而即使是在中等热门的网站上,也有数万人可能实时对多媒体、评论等的支持。这也让垃圾内容发布者有机会滥用此类系统,将不太令人满意的内容与其他人撰写的文章、视…

小程序必看系列!什么是抖音小程序?抖音小程序怎么制作?

随着移动互联网的飞速发展&#xff0c;抖音已经成为了一个广受欢迎的短视频平台。在这个平台上&#xff0c;用户可以分享自己的生活点滴、表达自己的观点&#xff0c;甚至还能通过小程序来丰富自己的社交体验。那么&#xff0c;如何制作抖音小程序呢&#xff1f; 一、抖音小程…

5288 SDH/PDH数字传输分析仪

5288 SDH/PDH数字传输分析仪 数字通信测量仪器 5288 SDH/PDH数字传输分析仪为高性能手持式数字传输分析仪&#xff0c;符合ITU-T SDH/PDH技术规范和我国光同步传输网技术体制的规定,支持2.048、34.368、139.264Mb/s及155.520Mb/s传输速率的测试。可进行SDH/PDH传输设备和网络的…

云畅科技技术中心被认定为湖南省省级企业技术中心

近日&#xff0c;湖南省工业和信息化厅公布《2023年第二批湖南省省级企业技术中心(第29批)》&#xff0c;云畅科技技术中心作为研发设计型代表入选。 省级企业技术中心是强化企业技术创新主体地位&#xff0c;增强企业自主创新能力&#xff0c;推动工业企业高质量发展的一个重要…

Vue-插槽(Slots)

1. 介绍 在Vue.js中&#xff0c;插槽是一种强大的功能&#xff0c;它允许你创建可重用的模板&#xff0c;并在使用该模板的多个地方插入自定义内容。 插槽为你提供了一种方式&#xff0c;可以在父组件中定义一些“插槽”&#xff0c;然后在子组件中使用这些插槽&#xff0c;插…

SQL-分组查询

&#x1f389;欢迎您来到我的MySQL基础复习专栏 ☆* o(≧▽≦)o *☆哈喽~我是小小恶斯法克&#x1f379; ✨博客主页&#xff1a;小小恶斯法克的博客 &#x1f388;该系列文章专栏&#xff1a;重拾MySQL &#x1f379;文章作者技术和水平很有限&#xff0c;如果文中出现错误&am…

turnjs实现翻书效果

需求&#xff1a;要做一个效果&#xff0c;类似于阅读器上的翻书效果。 咱们要实现这个需求就需要使用turnjs这个插件&#xff0c;他的官网是turnjs官网。 进入官网后可以点击 这个按钮去下载官网的demo。 这个插件依赖于jQuery&#xff0c;所以你的先安装jQuery. npm insta…

面试官:实际工作中哪里用到了自定义注解?

自定义注解可以标记在方法上或类上&#xff0c;用于在编译期或运行期进行特定的业务功能处理。在 Java 中&#xff0c;自定义注解使用 interface 关键字来定义&#xff0c;它可以实现如&#xff1a;日志记录、性能监控、权限校验等功能。 在 Spring Boot 中实现一个自定义注解&…

Unity URP下阴影锯齿

1.概述 在Unity开发的URP项目中出现阴影有明显锯齿。如下图所示&#xff1a; 并且在主光源的Shadow Type已经是Soft Shadows模式了。 2.URP Asset 阴影出现锯齿说明阴影质量不高&#xff0c;所以要先找到URP Asset文件进行阴影质量参数的设置。 1.打开PlayerSetting找到Graph…

代码签名证书怎么选择?软件开发者必看

随着互联网的高速发展&#xff0c;各种购物、资讯、社交类软件高速增长。而对于软件开发者来说&#xff0c;选择合适的代码签名证书来为软件进行数字签名、确保软件程序代码的完整性和软件的可信任性是很有必要的。但市场上有多种品牌、多种类型的代码签名证书可以选择&#xf…

03.阿里Java开发手册——OOP规约

【强制】避免通过一个类的对象引用访问此类的静态变量或静态方法&#xff0c;无谓增加编译器解析成本&#xff0c;直接用类名来访问即可。 【强制】所有的覆写方法&#xff0c;必须加Override 注解。 说明&#xff1a;getObject()与 get0bject()的问题。一个是字母的 O&#x…

git pull 时 配置适合自己的合并策略 git config pull.rebase

当 git pull 时有可能遇到以下的提示 hint: git config pull.rebase false # merge (the default strategy) hint: git config pull.rebase true # rebase hint: git config pull.ff only # fast-forward only这三个配置项影响git pull的默认行为。以下是对它们…

tab分页高亮切换及tab交互

当用户点击页面中的 Tab 后&#xff0c;切换展示相应的商品列表&#xff0c;功能相对简单&#xff0c;快速实现即可。 // 存储高亮的下标 <script setup lang"ts"> // 高亮的下标 const activeIndex ref(0) </script><template><!-- 推荐选项…

vue前端开发自学,插槽练习,同时渲染父子组件的数据信息

vue前端开发自学,插槽练习,同时渲染父子组件的数据信息&#xff01; 如果想在slot插槽出口里面&#xff0c;同时渲染出来&#xff0c;来自父组件的数据&#xff0c;和子组件自身的数据呢。又有点绕口了。vue官方给的解决办法是。需要借助于&#xff0c;父组件的自定义属性。 …

第二百五十九回

文章目录 知识回顾示例代码经验总结 我们在上一章回中介绍了MethodChannel的使用方法&#xff0c;本章回中将介绍EventChannel的使用方法.闲话休提&#xff0c;让我们一起Talk Flutter吧。 知识回顾 我们在前面章回中介绍了通道的概念和作用&#xff0c;并且提到了通道有不同的…

Unity 面试篇|(一)C#基础篇 【全面总结 | 持续更新】

目录 1. 面向对象的三大特点2. 简述值类型和引用类型3.重载和重写的区别4.C#中所有引用类型的基类是什么5.请简述ArrayList和 List的主要区别6.GC 相关知识点7.结构体和类8.C#中四种访问修饰符是哪些&#xff1f;各有什么区别&#xff1f;9.修饰符 简述private&#xff0c;publ…

本地部署Canal笔记-实现MySQL与ElasticSearch7数据同步

背景 本地搭建canal实现mysql数据到es的简单的数据同步&#xff0c;仅供学习参考 建议首先熟悉一下canal同步方式&#xff1a;https://github.com/alibaba/canal/wiki 前提条件 本地搭建MySQL数据库本地搭建ElasticSearch本地搭建canal-server本地搭建canal-adapter 操作步骤…

24-1-9 bilibilic++音视频

下午两点面试&#xff0c;面试官迟到了一会&#xff0c;面试官人很好&#xff0c;整体面试经历很不错&#xff0c;但是我人太紧张了&#xff0c;基础知识掌握的深度不够&#xff0c;没有深挖&#xff0c; 是做音视频的底层相关的&#xff0c; 实习要求只要每天打卡够九个小时就…