带你玩转kubernetes-k8s(第41篇:深⼊分析集群安全机制四
增值税如何计算[Secret,Po。。。
Secret私密凭据
上⼀节提⼑Secret对象,Secret的主要作⽤是保管私密数据,⽐如密码、OAuth Tokens、 SSH Key等信息。将这些私密信息放在Secret对象中⽐直接放在Pod或Docker Image中更安全,也更便于使⽤和分发。
下⾯的例⼦⽤于创建⼀个Secret:
apiVersion: v1
kind: Secret
metadata:
name: mycret
type: Opaque
data:
password: dmFsdWUtMg0K
urname: dmFsdWUtMQ0K
在上⾯的例⼦中,data域的各⼦域的值必须为BASE64编码值,其中password域和urname域BASE64编码前的值分别为value-1和value-2。
⼀旦Secret被创建,就可以通过下⾯三种⽅式使⽤它。
(1)在创建Pod时,通过为Pod指定Service Account来⾃动使⽤该Secret。
(2)通过挂载该Secret到Pod来使⽤它。
(3)在Docker镜像下载时使⽤,通过指定Pod的spc.ImagePullSecrets来引⽤它。
第1种使⽤⽅式主要⽤在API Server鉴权⽅⾯,之前提到过。下⾯的例⼦展⽰了第2种使⽤⽅式:将⼀个Secret通过挂载的⽅式添加到Pod的Volume中:
apiVersion: v1
kind: Pod
童年读后感500字左右
metadata:
name: mypod
spec:
containers:
- name: mycontainer
image: tomcat
volumeMounts:
丁香花成人
- name: foo1
mountPath: "/etc/foo1"
readOnly: true
volumes:
- name: foo1
cret:
cretName: mycret
第3种使⽤⽅式的使⽤流程如下:
(1)执⾏login命令,登录私有Registry:
docker login localhost:8000
输⼊⽤户名和密码,如果是第1次登录系统,则会创建新⽤户,相关信息被会写⼊~/.dockercfg⽂件中。(2)⽤BASE64编码dockercfg的内容:
cat ~/.dockercfg ba64
(3)将上⼀步命令的输出结果作为Secret的data.dockercfg域的内容,由此来创建⼀个Secret:
# image-poll-cret.yaml:
apiVersion: v1
kind: Secret
metadata:
name: myregistrykey
data:
dockercfg: .......................................
type: kubernetes.io/dockercfg
kubectl create -f image-pull-cret.yaml
(4)在创建Pod时引⽤该Secret:
# pods.yaml
apiVersion: v1
营养早餐粥kind: Pod
metadata:
name: mypod2
spec:
containers:
- name: foo
image: jaychou/tomcat:v1
imagePullSecrets:
- name: myregistrykey
kubectl create -f pods.yaml
在使⽤Mount⽅式挂载Secret时,Container中Secret的data域的各个域的Key值作为⽬录中的⽂件,Value值被BASE64编码后存储在相应的⽂件中。在前⾯的例⼦中创建的Secret,被挂载到⼀个叫作mycontainer的Container中,在该Container中可通过相应的查询命令查看所⽣成的⽂件和⽂件中的内容,如下所⽰:
通过上⾯的例⼦可以得出如下结论:我们可以通过Secret保管其他系统的敏感信息(⽐如数据库的⽤户名和密码),并以Mount的⽅式将Secret挂载到Container中,然后通过访问⽬录中⽂件的⽅式获取该敏感信息。当Pod被API Server创建时,API Server不会校验该Pod引⽤的Secret是否存在。⼀旦这
个Pod被调度,则kubelet将试着获取Secret的值。如果Secret不存在或暂时⽆法连接到API Server,则kubelet按⼀定的时间间隔定期重试获取该Secret,并发送⼀个Event来解释Pod没有启动的原因。⼀旦Secret被Pod获取,则kubelet将创建并挂载包含Secret的Volume。只有所有Volume都挂载成功,Pod中的Container才会被启动。在kubelet启动Pod中的Container 后,Container中和Secret相关的Volume将不会被改变,即使Secret本⾝被修改。为了使⽤更新后的Secret,必须删除旧Pod,并重新创建⼀个新Pod。
Pod的安全策略配置
为了更精细地控制Pod对资源的使⽤⽅式,Kubernetes从1.4版本开始引⼊了PodSecurityPolicy资源对象对Pod的安全策略进⾏管理,并在1.10版本中升级为Beta版,到1.14版本时趋于成熟。⽬前PodSecurityPolicy资源对象的API版本为extensions/v1beta1,从1.10版本开始更新为policy/v1beta1,并计划于1.16版本时弃⽤extensions/v1beta1。
1.PodSecurityPolicy的⼯作机制
若想启⽤PodSecurityPolicy机制,则需要在kube-apirver服务的启动参数--enable-admission-plugins中进⾏设置:
如果是⾼可⽤,所有apirver均需要修改
kubectl edit pod -n kube-system kube-apirver-k8s-master1
--enable-admission-plugins=PodSecurityPolicy
在开启PodSecurityPolicy准⼊控制器后,Kubernetes默认不允许创建任何Pod,需要创建PodSecurityPolicy策略和相应的RBAC授权策略(Authorizing Policies),Pod才能创建成功。
例如,尝试创建如下Pod:
apiVersion: v1
kind: Pod
metadata:
先生理财name: nginx
spec:
containers:
- name: nginx
image: nginx
使⽤Kubectl命令创建时,系统将提⽰“禁⽌创建”的报错信息。
接下来创建⼀个PodSecurityPolicy,配置⽂件psp-non-privileged.yaml的内容如下:
apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
name: psp-non-privileged
spec:
privileged: fal # 不允许特权模式的Pod
Linux:
rule: RunAsAny
supplementalGroups:
rule: RunAsAny
runAsUr:
吃大葱有什么好处rule: RunAsAny
fsGroup:
rule: RunAsAny
volumes:
- '*'
之后再次创建Pod既可成功。
上⾯的PodSecurityPolicy“psp-non-privileged”设置了privileged: fal,表⽰不允许创建特权模式的Pod。在下⾯的YAML配置⽂件pod-privileged.yaml中为Pod设置了特权模式:
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: nginx
触目皆是curityContext:
privileged: true
创建Pod时,系统将提⽰“禁⽌创建特权模式的Pod”的报错信息.
2.PodSecurityPolicy配置详情
在PodSecurityPolicy对象中可以设置下列字段来控制Pod运⾏时的各种安全策略。
1.特权模式相关配置
privileged:是否允许Pod以特权模式运⾏。
2.宿主机资源相关配置
(1)hostPID:是否允许Pod共享宿主机的进程空间。
(2)hostIPC:是否允许Pod共享宿主机的IPC命名空间。
(3)hostNetwork:是否允许Pod使⽤宿主机⽹络的命名空间。
(4)hostPorts:是否允许Pod使⽤宿主机的端⼝号,可以通过hostPortRange字段设置允许使⽤的端⼝号范围,以【min,max】设置最⼩端⼝号和最⼤端⼝号。
(5)Volumes:允许Pod使⽤的存储卷Volume类型,设置为“*”表⽰允许使⽤任意Volume类型,建议⾄少允许Pod使⽤下列Volume 类型。
◎ configMap
◎ downwardAPI
◎ emptyDir
◎ persistentVolumeClaim
◎ cret
◎ projected
(6)AllowedHostPaths:允许Pod使⽤宿主机的hostPath路径名称,可以通过pathPrefix字段设置路径的前缀,并可以设置是否为只读属性,例⼦如下。
apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
name: allow-hostpath-volumes
spec:
volumes:
- hostPath
炒花蛤的做法allowedHostPaths:
- pathPrefix: "/foo"
readOnly: true
结果为允许Pod访问宿主机上以“/foo”为前缀的路径,包括“/foo”“/foo/”“/foo/bar”等,但不能访
问“/fool”“/etc/foo”等路径,也不允许通过“/foo/../”表达式访问/foo的上层⽬录。
(7)FSGroup:设置允许访问某些Volume的Group ID范围,可以将规则(rule字段)设置为MustRunAs、MayRunAs或RunAsAny。