2022年2月kubernetesCKS备考实录
前言
CKA和CKS是LINUX基金会联合CNCF社区组织的云原生技术领域权威认证,考试采用实操方式进行。CKS全称是Kubernetes安全专家认证,它在一个模拟真实的环境中测试考生对Kubernetes和云安全的知识。在参加CKS考试之前,必须已经通过CKA(Kubernetes管理员认证),在获得CKA认证之后才可以预约CKS考试。CKS考试难度相对于CKA提高了很多,2个小时的考试时间很紧张,因为考试是在网上进行,这两个考试又是实操考试,网络条件不好,很影响效率,如果不抓紧的话,很可能做不完所有实操题。提醒备考的同学善用考试软件提供的notepad功能,先把yaml文件或命令写到notepad里,再粘贴到terminal里。另外要注意题目要求操作的节点,有些题要求在worker节点完成,有些要求master节点,否则找不到文件。
我因为上次CKA考试还是比较顺利,94高分通过,所以这次的CKS考试有点疏忽了,搞忘带身份证和护照,CKACKS考试需要身份证护照信用卡,因此跟监考老师沟通了很久时间,最后修改了考试人姓名为中文,是用驾驶证完成的考试。意外之喜是CKS给我的证书是中文名的。
我这次考试的kubernetes版本是1。22,特意记录了一下考试会考到的知识点,分享给需要的同学。1。NetworkPolicy
通常使用标签选择器来选择pod,控制流量。所以要对kubectllabel的使用方法熟悉起来。kubectllabel〔overwrite〕(fFILENAMETYPENAME)KEY1VAL1。。。KEYNVALN〔resourceversionversion〕〔options〕
网络策略的实用方法见注释apiVersion:networking。k8s。iov1kind:NetworkPolicymetadata:name:testnetworkpolicynamespace:defaultspec:podSelector:{}表示选择所有pod应用NetworkPolicypodSelector:表示选择包含标签roledb的pod应用下面的NetworkPolicymatchLabels:role:dbpolicyTypes:表示NetworkPolicy包含ingress和egress流量规则IngressEgressingress:ingress规则白名单列表,每条规则允许同时匹配from和ports流,可以有条个规则。第1条白名单,包含fromports的组合规则,允许来自172。17网段(172。17。1除外)、或标签projectmyproject的命名空间的所有pod、或default命名空间下标签rolefrontend的pod访问(限tcp6379端口)from:ipBlock:cidr:172。17。0。016except:172。17。1。024namespaceSelector:matchLabels:project:myprojectpodSelector:matchLabels:role:frontendports:protocol:TCPport:6379第二条白名单,只包含from规则,允许来自所有命名空间包含environmenttesting标签的pod访问(不限端口)from:namespaceSelector:{}podSelector:matchLabels:environment:testingegress:egress规则白名单列表,同ingress规则一样,每条规则包含toports,可以有多条规则。to:ipBlock:cidr:10。0。0。024ports:protocol:TCPport:59782。Apparmor
查看当前节点加载的apparmorprofile,如果没有加载,要手工加载apparmorstatusgrepnginxapparmorparseretcapparmor。dnginxapparmor
cks考试的apparmorprofile文件内容:includetunablesglobalnginxprofile3profilenginxprofile3flags(attachdisconnected){includefile,Denyallfilewrites。denyw,}
注意:nginxprofile3这一行要确保注释掉,考试环境提供的可能没有注释,加载配置文件按时会报错rootnode01:apparmorparseretcapparmor。dnginxapparmorAppArmorparsererrorforetcapparmor。dnginxapparmorinetcapparmor。dninxapparmoratline2:Foundunexpectedcharacter:
修改podyaml文件,在注释里设置为podx加载apparmorprofileannotations:container。apparmor。security。beta。kubernetes。iopodx:localhostnginxprofile3
yaml文件内容如下:apiVersion:v1kind:Podmetadata:name:podxannotations:container。apparmor。security。beta。kubernetes。iopodx:localhostnginxprofile3spec:containers:image:busyboximagePullPolicy:IfNotPresentname:podxcommand:〔sh,c,echoHelloAppArmor!sleep1h〕resources:{}nodeName:node01dnsPolicy:ClusterFirstrestartPolicy:Always3。修复kubebench发现的安全问题
kubebench是一个CIS评估工具,扫描kubernetes集群存在的安全问题,基本上按照扫描结果的修复建议进行修复就可以了,系统会给出很具体的修复措施。修复kubeapiserver安全问题vietckubernetesmanifestskubeapiserver修改:authorizationmodeNode,RBAC添加insecureport0删除insecurebindaddress0。0。0。0修复kubelet安全问题vivarlibkubeletconfig。yaml将authentication。anonymous。enabled设置为falseauthentication:anonymous:enabled:falseauthorization。mode设置为Webhookauthorization:mode:Webhook修复etcd安全问题vietckubernetesmanifestsetcd。yaml修改为true:clientcertauthtrue以上修复完成后重新加载配置文件并重启kubeletsystemctldaemonreloadsystemctlrestartkubelet4。解决pod的serviceaccount设置错误问题
这个题要注意serviceaccount有个选项automountServiceAccountToken,这个选项决定是否自动挂载secret到pod。
有这个选项,我们就可以控制pod创建并绑定serviceaccount时,不自动挂载对应的secret,这样pod就没有权限访问apiserver,提高了业务pod的安全性。
可以在serviceaccount和pod的spec里设置,pod的设置优先于serviceaccount里的设置。apiVersion:v1kind:ServiceAccountmetadata:name:backendsanamespace:qaautomountServiceAccountToken:falseapiVersion:v1kind:Podmetadata:name:backendnamespace:qaspec:serviceAccountName:backendsacontainers:image:nginx:1。9imagePullPolicy:IfNotPresentname:backend
删除未使用的serviceaccount5。设置默认网络策略
这道题是送分题,设置默认拒绝所有出站和入站的pod流量,基本上可以参考官网的案例直接改一下名字就可以了
默认网络策略6。RBAC
这道题也基本是送分题,参考官网文档,根据题目要求,设置role的资源访问权限,绑定到serviceaccount就可以了。
RBAC7。日志审计
这道题稍复杂,需要按照要求启动日志审计,包括两个步骤:
(1)编写日志审计策略文件
日志审计策略apiVersion:audit。k8s。iov1kind:PolicyomitStages:RequestReceivedrules:level:RequestResponseresources:group:resources:〔namespaces〕level:Requestresources:group:resources:〔persistentvolumes〕namespaces:〔frontapps〕level:Metadataresources:group:resources:〔secrets,configmaps〕level:MetadataomitStages:RequestReceived
(2)修改kubeapiserver。yaml配置文件,启用日志审计策略,日志策略配置文件位置、日志文件存储位置、循环周期。
启动日志配置
vietckubernetesmanifestskubeapiserver。yaml设置ahrefhttps:www。bs178。comrizhitargetblankclassinfotextkey日志a审计策略文件在pod里的mount位置auditpolicyfileetckuberneteslogpolicysamplepolicy。yaml设置ahrefhttps:www。bs178。comrizhitargetblankclassinfotextkey日志a文件存储位置auditlogpathvarlogkubernetesauditlogs。txt设置ahrefhttps:www。bs178。comrizhitargetblankclassinfotextkey日志a文件循环auditlogmaxage10auditlogmaxbackup2mountahrefhttps:www。bs178。comrizhitargetblankclassinfotextkey日志a策略和ahrefhttps:www。bs178。comrizhitargetblankclassinfotextkey日志a文件的volumeMounts:mountPath:etckuberneteslogpolicysamplepolicy。yamlname:auditreadOnly:truemountPath:varlogkubernetesauditlogs。txtname:auditlogreadOnly:falsevolumes:name:audithostPath:path:etckuberneteslogpolicysamplepolicy。yamltype:Filename:auditloghostPath:path:varlogkubernetesauditlogs。txttype:FileOrCreate
重启kubeletsystemctldaemonreloadsystemctlrestartkubelet8。创建secret
这道题考解码secret的base64编码信息,创建新的secret并mount到pod的特定位置。
解码secretkubectlgetsecretsnistiosystemdb1testojsonpath{。data。username}base64dckssecuser。txtkubectlgetsecretsnistiosystemdb1testojsonpath{。data。password}base64dckssecpass。txt
创建secretkubectlcreatesecretgenericdb2testnistiosystemfromliteralusernameproductioninstancefromliteralpasswordKvLftKgs4aVH
使用secretapiVersion:v1kind:Podmetadata:name:secretpodnamespace:istiosystemspec:containers:name:devcontainerimage:nginxvolumeMounts:name:secretvolumemountPath:etcsecretvolumes:name:secret:secretName:db2test9。检测dockerfile的不安全指令
这道题也是送分题,主要是把dockerfile里两个使用了root用户的指令删除,把添加特定能力的securityContext安全上下文注释掉。删除两处USERroot注释securityContextsecurityContext:{Capabilities:{add:{NETBINDSERVICE},drop:〔〕},privileged:TRUE}10。运行沙箱容器
给出了支持安全沙箱容器运行时handlerrunsc,我们需要创建一个RuntimeClass并在podspec里指定是用该RuntimeClass
参考资料创建RuntimeClassapiVersion:node。k8s。iov1beta1kind:RuntimeClassmetadata:name:untrustedhandler:runsc修改server命名空间所有pod,设置runtimeClassName
注意:运行中的pod只能修改有限的几个属性,不支持修改RuntimeClass,需要将所有pod的yaml解析出来,修改yaml后,再重新创建pod
还需要修改deploymentspec:。runtimeClassName:untrustedcontainers:image:vicuunginx:hostimagePullPolicy:IfNotPresentname:nginxhost11。删除不符合最佳实践的pod
参考链接删除启用了特权的pod
主要是检查pod是否含privileged:true
kubectlgetpoxxxnproductionoyamlgrepiprivileged:true删除有状态pod
kubectlgetpodsXXXXnproductionojsonpath{。spec。volumes}jq12。扫描镜像安全漏洞并删除使用有安全漏洞镜像的pod
这道题考察对于镜像扫描工具trivy的使用获取镜像名kubectgetpodXXXXnkaminooyamlgrepimage扫描镜像trivyimagesHIGH,CRITICALimagenamekubectldeletepoxxx13。使用sysdig检查容器里里的异常进程
本体考察是否掌握sysdig的基本用法,记住两个帮助命令:sysdigh查看sysdig帮助sysdigl查看sysdig支持的元数据
另外sysdig支持指定containerid分析特定容器查看容器iddockerpsgreptomcatsysdigM30pevt。time,user。uid,proc。namecontainer。idxxxxoptDFAincidentssummary14。PodSecurityPolicy
这道题考察是否掌握psp的用法,包括5步骤
(1)创建psp
参考链接apiVersion:policyv1beta1kind:PodSecurityPolicymetadata:name:restrictpolicyspec:privileged:falseseLinux:rule:RunAsAnysupplementalGroups:rule:RunAsAnyrunAsUser:rule:RunAsAnyfsGroup:rule:RunAsAnyvolumes:
(2)创建clusterrole,使用pspkubectlcreateclusterrolerestrictaccessroleverbuseresourcepspresourcenamerestrictpolicy
(3)创建serviceaccountkubectlcreatesapspdenialsanstaging
(4)绑定clusterrole到serviceaccountkubectlcreateclusterrolebindingdanyaccessbindclusterrolerestrictaccessroleserviceaccountstaging:pspdenialsa
(5)启用PodSecurityPolicyvietckubernetesmanifestskubeapiserver。yaml确保有以下内容:enableadmissionpluginsNodeRestriction,PodSecurityPolicy15。启用APIserver认证
这道题同前面kubebench的考核内容有点重合,题目中是用kubeamd创建的kubernetes服务器权限设置有问题,允许未经授权的访问。
参考链接
需要进行以下修改:使用Node,RBAC授权模式和NodeRestriction准入控制器vietckubernetesmanifestskubeapiserver。yaml确保以下内容authorizationmodeNode,RBACenableadmissionpluginsNodeRestrictionclientcafileetckubernetespkica。crtenablebootstraptokenauthtrue删除system:anonymous的ClusterRolebinding角色绑定,取消匿名用户的集群管理员权限kubectldeleteclusterrolebindingsystem:anonymous16。ImagePolicyWebhook
这道题考察ImagePolicyWebhook准入控制器的使用,分4个步骤修改控制器配置文件,将未找到有效后端时的默认拒绝改为默认不拒绝
参考链接
vietckubernetesepconfigadmissionconfiguration。json{imagePolicy:{kubeConfigFile:etckubernetesepconfigkubeconfig。yaml,allowTTL:50,denyTTL:50,retryBackoff:500,defaultAllow:false}}修改控制器访问webhookserver的kubeconfigvietckubernetesepconfigkubeconfig。yaml修改如下内容apiVersion:v1kind:Configclusters:cluster:certificateauthority:etckubernetesepconfigwebhook。pemserver:https:acme。local:8082imagepolicywebhookserver的地址name:bouncerwebhook以下省略启用ImagePolicyWebhook
vietckubernetesmanifestskubeapiserver。yaml启用ImagePolicyWebhookenableadmissionpluginsNodeRestriction,ImagePolicyWebhook指定准入控制器配置文件admissioncontrolconfigfileetckubernetesepconfigadmissionconfiguration。jsonmountvolumeMounts:mountPath:etckubernetesepconfigname:epconfig映射volumesvolumes:name:epconfighostPath:path:etckubernetesepconfig测试是否生效systemctldaemonreloadsystemctlrestartkubeletkubectlapplyfcksimgweb1。yaml有图有真相CKA
CKS
月光石吊坠nbsp带来好运的神奇珠宝月光石晶体内聚集的片晶互相辉映,在蛋形表面形成淡蓝色的晕彩如同朦胧的月光。过去人们认为佩戴月光石可以带来好运,至今印第安人视月光石为神圣的石头。月光石是因为和月亮一样漂亮……
家里的牙膏只用来刷牙?那是因为你不知道还有这些作用牙膏作为日常清洁用品,除了清洁牙齿外,在生活中还有很多实用的地方。像一些有消炎作用的牙膏中含有薄荷脑、丁香油和生姜油等成分,还能够起到消炎、止痛等作用。在生活中,牙膏具体……
祖母绿宝石戒指怎么保养nbsp4个小方法你值得收藏祖母绿色的宝石戒据说是爱神所喜欢的宝石,因为它具有保障爱情的含义,还有忠诚,带给佩戴者美好回忆的意义。这种宝石戒指比较名贵,在佩戴的时候一定要小心保养。祖母绿宝石是一种非……
图手绘插画动手创造美丽世界在人们的日常生活中,插画是十分常见的艺术作品。能够在街头的墙上看见,也能够在我们看的书上见到插画的身影。插画顾名思义就是通过自己手绘画出想要表达的图片。手绘插画者不仅绘画……
德班世乒赛亚洲区预选赛签表出炉2023010816:082023年德班世乒赛亚洲区预选赛1月7日1月13日在卡塔尔多哈举行。这是中国乒乓球队2023年参加的首项赛事,12名运动员分别参加男单、女单、男……
图手工皂的好处颇多款式精美很护肤很多人非常喜欢自己在家动手制作手工皂,却不知道它到底有什么用处,好处又在哪里?手工皂不单只是外形的精致且好看,它对我们皮肤的保养与清洁有着很大的用处。这两年来不管是微信的……
石榴石鉴别真假的方法nbsp教你一些这种珠宝的知识石榴石的另一个名称叫石榴子石,是一种粒状如同种子一样的形状的宝石。它的名子为石榴石,很形象的把这种矿物宝石的外观表达了出来。它的样子就和石榴中的籽一样。很多人们都很喜欢佩……
图手工皂制作流程超简单方法让你一次就学会手工皂是现在很受欢迎的手工制品,因为自己制作出来的肥皂相较比较安全,而且原料也随处可见。手工皂的制作过程并不算复杂,但是需要你仔细做好每一步。我们今天给大家介绍一下薰衣草……
石榴石戴哪只手nbsp左进右出可以招来好运石榴石很特别,像种子一样拥有新生、信仰以及纯朴的象征。那么佩戴石榴石还有什么讲究呢?石榴石的饰品能给人带来愉悦的心情,减少上班族因为工作压力造成的疲劳。石榴石是一种漂亮的……
国乒8大新星将出征!16岁小樊振东受捧,1米77高妹变又一王中国乒乓球队的大将们出战休斯顿世乒赛了,而国乒的后备力量正在积极备战,他们将在12月2日8日征战葡萄牙世青赛。巴黎奥运周期,国乒有8大新星准备破茧成蝶。东京奥运周期,孙颖莎和王……
图手工折纸花篮教你一秒学会折法随着生活节奏的加快,人们没有时间动手制作礼物,越来越多的人喜欢那些手工艺品,其实我们自己也可以制作的,而且方法简单,制作出来的东西漂亮还可以送人。如今手工艺好的小仙女们都……
祖母绿戒指nbsp绽放惊艳色彩戒指,是我们生活中常见的奢侈品之一,其中佩戴镶嵌宝石的戒指的人居多,祖母绿戒指就是其中一款。但对于祖母绿戒指的各方面的知识,很多人都是不太清楚的。祖母绿戒指,顾名思义就是……