client发起apiserver调用时,apiserver先认证(Authentication)用户,再给用户受权(Authorization),最后执行准入控制(Admission Control)node
认证就是识别用户身份的过程后端
基于CA根证书签名的双向数字证书认证api
apiserver启动的时候经过--client-ca-file=XXXX
配置签发client证书的CA,当client发送证书过来时,apiserver使用CA验证,若是证书合法,提取Common Name字段做为用户名安全
生成一个长串token,并放入header发起http请求,apiserver依据token识别用户并发
apiserver启动经过--token-auth-file=XXXXX
加载全部用户token,client请求的时候Header加上token便可curl
保证token动态生成,可是该方案正在试验阶段,不太成熟测试
将[username:password]进行加密存入http request中的Header Authorization域,并发送给apiserver,apiserver依据这个域中的信息识别用户ui
apiserver启动时经过参数--basic-auth-file=XXXX
指定用户信息的文件路径,client请求的时候Header带上base64(user:password)
便可加密
若是是经过kubectl,请参考,带上用户名密码,去除证书认证url
kubectl --server=https://10.20.46.113:6443 --insecure-skip-tls-verify=true --username=xxx --password=xxx get nodes
主要面向pod内部访问apiserver的鉴权方式。controller manager和apiserver会利用server端的私钥为每一个pod建立一个token,并挂载到/run/secrets/kubernetes.io/serviceaccount/
路径下。pod在访问apiserver的时候带上该token就行
备注:当使用pod访问apiserver的安全端口时,只能采用这种方式
基于OAuth2协议认证,受各大云提供商青睐
按照规定k8s的接口规范,自定义token认证
openstack提供的认证和受权方案,适合采用openstack体系搭建k8s的团队,处于试验阶段
当开启匿名请求时,全部没有被拒绝的请求都被认为是匿名请求,在受权阶段,这些请求都被统一处理
受权就是授予用户请求权限,并鉴别用户的api请求是否合法的过程
目前支持的几种受权策略:
主要详解后三个策略
启动ABAC,须要apiserver指定受权策略文件的路径和名字(--authorization-policy-file=XXXX),文件中的每一行表明一个策略对象
思路:用户发送请求到apiserver,用户识别用户所拥有的权限策略信息,并与authorization-policy-file中的策略一一匹配,若是至少一行匹配成功,该请求就经过了受权
添加新的ABAC策略,须要重启apiserver
须要提供一个https接口,并按照指定规规范处理request和响应response
在k8s中比较推荐的实现方式
优点:
启动RBAC,须要apiserver启动参数加上-authorization-mode=RBAC
RBAC的四个资源对象:
一个典型的映射关系
通过认证和受权后,还须要通过多个准入控制器的审核,client到apiserver的请求才能成功获得相应
目前提供的准入控制器有这些(这些插件并非都启用了):
经过curl来测试权限是否生效的时候,请确保使用高版本的curl(已知低版本7.19.7)
主要参考资料为【Kubernetes权威指南:从Docker到Kubernetes实践全接触(记念版)】。官方文档略坑,不少东西只介绍了片断,很难基于它实践