k8s之API Server认证

集群安全性

在生产环境中,必须保障集群用户的角色以及权限问题,不能给所有用户都赋予管理员权限。

1、集群的安全性必须考虑如下几个目标

(1)保证容器与其所在宿主机的隔离

(2)限制容器给基础设置或其他容器带来的干扰

(3)最小权限原则:合理限制所有组件的权限,确保组件只执行它被授权的行为,通过限制单个组件的能力来限制它的权限范围

(4)明确组件间边界的划分

(5)划分普通用户和管理员的角色

(6)在必要时允许将管理员权限赋给普通用户

(7)允许拥有Secret(Keys、Certs、Passwords)数据的应用在集群中运行

API Server认证管理

k8s集群提供了三种级别的客户端身份认证方式:

1、HTTPS证书认证

基于CA根证书签名的的双向数字认证方式,CA机构是第三方证书权威机构,认证步骤如下图:

 

1、服务器端向CA机构申请证书,CA机构下发根证书、服务端证书、私钥给申请者

2、客户端向CA机构申请证书,CA机构下发根证书、客户端证书、私钥给申请者

3、客户端向服务端发起请求,服务端下发服务端证书给客户端,客户端通过私钥进行解密,并利用服务端证书中的公钥认证证书信息比较证书中的信息,如果一致,则客户端认可服务端身份

4、客户端向服务端发送证书,服务端使用私钥进行解密,获得客户端证书公钥,并用公钥认证证书信息,确认客户端是否合法

5、两端协商好加密方案后,客户端产生一个随机密钥,通过协商好的方案加密该密钥,并发送该密钥给服务端,服务端收到密钥后,双方使用这个随机密钥进行信息传输。

2、HTTP Token认证

通过一个Token来识别合法用户,就像HTTP请求的Cookie一样,只不过Cookie是浏览器端,Token是服务端。

 

用一个很长的特殊编码方式并且难以被模仿的字符串–Token,Token对应用户信息,存储在API Server中能访问的一个文件夹中,客户端只需在请求时的HTTP Header中放入Token,API Server就可以识别用户信息。

3、HTTP Base认证

通过用户名加密码的方式认证,把(用户名+冒号+密码)用Base64编码后放到HTTP Request中的Header Authorization域中发给服务端,服务端收到后进行解密,获取用户名和密码,然后进行用户授权验证

API Server授权管理

当API Server被调用时,需要先进行用户认证,然后通过授权策略执行用户授权。

API Server支持以下几种授权策略(通过API Server启动参数–authorization-mode设置)

 

(1)AlwaysDeny:拒绝所有请求

(2)AlwaysAllow:允许接收所有请求

(3)ABAC(Attributed-Based Access Control):基于属性的访问控制,表示使用用户配置的授权规则对用户请求进行匹配和控制

(4)Webhook:通过调用外部REST服务对用户进行授权

(5)RBAC:Role-Based Access Control,基于角色的访问控制

(6)Node:一种专用模式,用于对kubelet发起的请求进行访问控制

API Server在接收到请求后,会根据请求中的数据生成一个访问策略对象,如果请求中不带某些属性,则会为这些属性根据类型设置默认值,然后将这个访问策略对象和授权策略文件中的所有访问策略对象逐条匹配,如果至少一个匹配上,则请求被鉴权通过,否则终止调用流程。

===============================

我是Liusy,一个喜欢健身的程序员。

欢迎关注微信公众号【上古伪神】,一起交流Java技术及健身,获取更多干货,领取Java进阶干货,领取最新大厂面试资料,一起成为Java大神。

来都来了,关注一波再溜呗。