前言 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设置日志审计策略文件在pod里的mount位置auditpolicyfileetckuberneteslogpolicysamplepolicy。yaml设置日志文件存储位置auditlogpathvarlogkubernetesauditlogs。txt设置日志文件循环auditlogmaxage10auditlogmaxbackup2mount日志策略和日志文件的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