Kubernetes集群安全:准入控制Admission Control
2017-05-15
概述 #
kube-apiserver是Kubernetes集群的中心,集群中所有资源的创建和更新都是通过APIServer的Restful API实现的。 因此Kubernetes通过一系列的机制来保证APIServer的安全,包括APIServer的认证、授权以及本文我们要学习的准入控制Admission Control。
关于APIServer的认证和授权我们之前分享过两篇《Kubernetes集群安全:Api Server认证》和《Kubernetes 1.6新特性学习:RBAC授权》,认证授权就是要识别和认证客户端的身份以及对访问权限的授权。
上图是APIServer被访问控制的过程,在经过认证和授权之后就进入了准备控制Admission Control。
准入控制器 #
Kubernetes的Admission Control实际上是一个准入控制器(Admission Controller)插件列表,发送到APIServer的请求都需要经过这个列表中的每个准入控制器插件的检查。 官方文档Using Admission Controllers中介绍了Kubernetes中内置的可以配置的准入控制器插件:
- AlwaysAdmit:允许所有请求通过
- AlwaysPullImages:在启动容器之前总是去下载镜像,相当于每当容器启动前做一次用于是否有权使用该容器镜像的检查
- AlwaysDeny:禁止所有请求通过,用于测试
- DenyEscalatingExec:拒绝exec和attach命令到有升级特权的Pod的终端用户访问。如果集中包含升级特权的容器,而要限制终端用户在这些容器中执行命令的能力,推荐使用此插件
- ImagePolicyWebhook
- ServiceAccount:这个插件实现了serviceAccounts等等自动化,如果使用ServiceAccount对象,强烈推荐使用这个插件
- SecurityContextDeny:将Pod定义中定义了的SecurityContext选项全部失效。SecurityContext包含在容器中定义了操作系统级别的安全选型如fsGroup,selinux等选项
- ResourceQuota:用于amespace上的配额管理,它会观察进入的请求,确保在namespace上的配额不超标。推荐将这个插件放到准入控制器列表的最后一个。ResourceQuota准入控制器既可以限制某个namespace中创建资源的数量,又可以限制某个namespace中被Pod请求的资源总量。ResourceQuota准入控制器和ResourceQuota资源对象一起可以实现资源配额管理。
- LimitRanger:用于Pod和容器上的配额管理,它会观察进入的请求,确保Pod和容器上的配额不会超标。准入控制器LimitRanger和资源对象LimitRange一起实现资源限制管理
- NamespaceLifecycle:当一个请求是在一个不存在的namespace下创建资源对象时,该请求会被拒绝。当删除一个namespace时,将会删除该namespace下的所有资源对象
- DefaultStorageClass
- DefaultTolerationSeconds
- PodSecurityPolicy
当Kubernetes版本>=1.4.0,官方建议使用这些插件:
1--admission-control=NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,ResourceQuota