API Server权限控制方法介绍
API Server权限控制分为三种:Authentication(身份认证)、Authorization(授权)、AdmissionControl(准入控制)。
身份认证:
当客户端向Kubernetes非只读端口倡议API请求时,Kubernetes通过三种方法来认证用户的合法性。kubernetes中,验证用户是否有权限操纵api的方法有三种:证书认证,token认证,根基信息认证。
证书认证
设置apiserver的启动参数:--client_ca_file=SOMEFILE ,这个被引用的文件中包罗的验证client的证书,如果被验证通过,那么这个验证记录中的主体东西将会作为请求的username。
Token认证
设置apiserver的启动参数:--token_auth_file=SOMEFILE。 token file的格局包罗三列:token,username,userid。当使用token作为验证方法时,在对apiserver的http请求中,增加 一个Header字段:Authorization ,将它的值设置为:Bearer SOMETOKEN。
根基信息认证
设置apiserver的启动参数:--basic_auth_file=SOMEFILE,如果变动了文件中的暗码,只有从头启动apiserver使 其从头生效。其文件的根基格局包罗三列:passwork,username,userid。当使用此作为认证方法时,在对apiserver的http 请求中,增加一个Header字段:Authorization,将它的值设置为: Basic BASE64ENCODEDUSER:PASSWORD。
授权:
在Kubernetes中,认证和授权是分隔的,而且授权产生在认证完成之后,认证过程是查验倡议API请求的用户是不是他所声称的阿谁人。而授权过程则 判断此用户是否有执行该API请求的权限,因此授权是以认证的功效作为根本的。Kubernetes授权模块应用于所有对APIServer的HTTP访 问请求(只读端口除外),访谒只读端口不需要认证和授权过程。APIServer启动时默认将authorization_mode设置为 AlwaysAllow模式,即永远允许。
Kubernetes授权模块查抄每个HTTP请求并提取请求上下文中的所需属性(例如:user,resource kind,namespace)与访谒控制法则进行对照。任何一个API请求在被措置惩罚惩罚前都需要通过一个或多个访谒控制法则的验证。
目前Kubernetes撑持并实现了以下的授权模式(authorization_mode),这些授权模式可以通过在apiserver启动时传入参数进行选择。
--authorization_mode=AlwaysDeny
--authorization_mode=AlwaysAllow
--authorization_mode=ABAC
AlwaysDeny 模式屏蔽所有的请求(一般用于测试)。AlwaysAllow模式允许所有请求,默认apiserver启动时给与的等于AlwaysAllow模式)。 ABAC(Attribute-Based Access Control,即基于属性的访谒控制)模式则允许用户自界说授权访谒控制法则。
ABAC模式:
一个API请求中有4个属性被用于用户授权过程:
UserName:String类型,用于标识倡议请求的用户。如果不进行认证、授权操纵,则该字符串为空。
ReadOnly:bool类型,标识该请求是否仅进行只读操纵(GET就是只读操纵)。
Kind:String类型,用于标识要访谒的Kubernetes资源东西的类型。当访谒例如/api/v1beta1/pods等API endpoint时,Kind属性才非空,但访谒其他endpoint时,例如/version,/healthz等,Kind属性为空。
Namespace:String类型,用于标识要访谒的Kubernetes资源东西地址的namespace。
对ABAC模式,在apiserver启动时除了需要传入--authorization_mode=ABAC选项外,还需要指定 --authorization_policy_file=SOME_FILENAME。authorization_policy_file文件的每一 行都是一个JSON东西,该JSON东西是一个没有嵌套的map数据布局,代表一个访谒控制法则东西。一个访谒控制法则东西是一个有以下字段的map:
user:--token_auth_file指定的user字符串。
readonly:true或false,如果是true则表白该法则只应用于GET请求。
kind:Kubernetes内置资源东西类型,例如pods、events等。
namespace:也可以缩写成ns。
一个简单的访谒控制法则文件如下所示,每一行界说一条法则。
{"user":"admin"}
{"user":"alice", "ns": "projectCaribou"}
{"user":"kubelet", "readonly": true, "kind": "pods"}
{"user":"kubelet", "kind": "events"}
{"user":"bob", "kind": "pods", "readonly": true, "ns": "projectCaribou"}
注:缺省的字段与该字段类型的零值(空字符串,0,false等)等价。
法则逐行说明如下。
第一行表白,admin可以做任何工作,不受namespace,资源类型,请求类型的限制。
第二行表白,alice能够在namespace "projectCaribou"中做任何工作,不受资源类型,请求类型的限制。
第三行表白,kubelet有权限读任何一个pod的信息。
第四行表白,kubelet有权限读写任何一个event。
第五行表白,Bob有权限读取在namespace "projectCaribou"中所有pod的信息。