一 Kubernetes访问

1.1 Kubernetes交互

与Kubernetes交互通常有kubectl、客户端(Dashboard)、REST API请求。

1.2 API访问流程

用户使用kubectl、客户端(Web)、或者REST请求访问API的时候,Kubernetes内部服务或外部访问都可获得授权来访问API。当一个请求达到API的时候,通常会经过以下阶段:

1.3 安装传输

通常在Kubernetes集群中,API在端口443上提供服务。且通常为自签名的证书,在$USER/.kube/config中包含API服务器证书的根证书,该证书在配置时用于代替系统默认根证书。因此需要自定义配置证书时,可将证书写入$USER/.kube/config。当使用kube-up.sh创建集群时,此证书会自动写入$USER/.kube/config。如果群集有多个用户,则创建者需要与其他用户共享证书。

1.4 Authentication

建立TLS后,HTTP请求将进行身份验证,API服务器可配置为运行一个或多个身份验证器模块。

身份验证步骤的输入是整个HTTP请求,但是,它通常只检查标头和/或客户端证书。

身份验证模块包括客户端证书,Password和Plain Tokens,Bootstrap Tokens和JWT令牌(用于服务帐户)。

可以指定多个验证模块,在这种情况下,每个验证模块都按顺序尝试,直到其中一个成功。

如果请求无法通过身份验证,则会被HTTP状态码401拒绝。否则,用户将被认证为特定username用户。

提示:虽然Kubernetes usernames用于访问控制决策和请求日志记录,但它没有user对象,也没有在其对象库中存储用户名或有关用户的其他信息。

1.5 Authorization

请求被认证为来自特定用户后,必须授权该请求。

请求必须包括请求者的用户名,请求的操作以及受操作影响的对象。如果现有策略声明用户有权完成请求的操作,则授权该请求。

Kubernetes使用API​​服务器授权API请求,同时支持多种授权模块,如ABAC模式,RBAC模式和Webhook模式。管理员创建集群时,已配置了应在API服务器中使用的授权模块。如果配置了多个授权模块,Kubernetes将检查每个模块,如果任何模块授权该请求,则该请求可以继续。如果所有模块拒绝该请求,则拒绝该请求(HTTP状态代码403)。

示例1:zhangsan

 {
"apiVersion": "abac.authorization.kubernetes.io/v1beta1",
"kind": "Policy",
"spec": {
"user": "zhangsan",
"namespace": "projectCaribou",
"resource": "pods",
"readonly": true
}
}

解释:如上所示zhangsan具备的策略,代表zhangsan只能在projectCaribou命名空间中读取Pod。

请求操作:

 {
"apiVersion": "authorization.k8s.io/v1beta1",
"kind": "SubjectAccessReview",
"spec": {
"resourceAttributes": {
"namespace": "projectCaribou",
"verb": "get",
"group": "unicorn.example.org",
"resource": "pods"
}
}
}

解释:如上是get pods操作将被允许,但不能create或update projectCaribou,因为没有得到授权。

1.6 授权审查属性

Kubernetes在接受到请求时,将对以下属性进行审查:

  • user:身份验证时提供的user字符串;
  • group:经过身份验证的用户所属的组名称列表;
  • extra:由身份验证层提供的任意字符串键到字符串值的映射;
  • API:请求是否是针对API资源;
  • Request path:到其他non-resource的endpoint,如/api或/healthz)的路径;
  • API request verb:API请求的动作,如 get, list, create, update, patch, watch, proxy, redirect, delete, 和deletecollection;
  • HTTP request verb:HTTP请求的动作,如 get, post, put, 和 delete 用于 non-resource 的请求;
  • Resource:正在访问的资源的ID或名称(仅限资源请求),对于使用get,update和patch,和delete动词的资源请求,您必须提供资源名称。
  • Subresource:正在访问的子资源(仅限资源请求);
  • Namespace:要访问的对象的名称空间(仅适用于命名空间资源请求);
  • API group:正在访问的API组(仅限资源请求)。空字符串表示核心API组。

1.7 请求动作


HTTP verb
对非资源的请求动作类型
request verb
对资源的请求动作类型
POST
create
GET,HEAD
get(对单个资源),list(对集合)
PUT
update
PATCH
patch
DELETE
delete(对单个资源),deletecollection (对集合)

二 授权模块

2.1 授权模块介绍

Node:一种特殊用途的授权程序,它根据计划运行的pod为kubelet授予权限。

ABAC:基于属性的访问控制(ABAC)定义了一种访问控制范例,通过使用将属性组合在一起的策略向用户授予访问权限。策略可以使用任何类型的属性(用户属性,资源属性,对象,环境属性等)。

RBAC:基于角色的访问控制(RBAC)是一种根据企业中各个用户的角色来管理对计算机或网络资源的访问的方法。在此上下文中,访问是单个用户执行特定任务的能力,例如查看,创建或修改文件。

  • 当指定的RBAC(基于角色的访问控制)使用rbac.authorization.k8s.io API组来驱动授权决策时,允许管理员通过Kubernetes API动态配置权限策略。
  • 要启用RBAC,请启动apiserver --authorization-mode=RBAC。

Webhook:WebHook是一个HTTP回调:发生某些事情时发生的HTTP POST; 通过HTTP POST进行简单的事件通知。实现WebHooks的Web应用程序会在发生某些事情时将消息发布到URL。

2.2 授权模块配置

需要在策略配置中包括一个flag作为标识,指明需要使用的授权模块:

  • --authorization-mode=ABAC:基于属性的访问控制(ABAC)模式允许您使用本地文件配置策略。
  • --authorization-mode=RBAC:基于角色的访问控制(RBAC)模式允许您使用Kubernetes API创建和存储策略。
  • --authorization-mode=Webhook:WebHook是一种HTTP回调模式,允许您使用远程REST端点管理授权。
  • --authorization-mode=Node:节点授权是一种特殊用途的授权模式,专门授权由kubelet发出的API请求。
  • --authorization-mode=AlwaysDeny:该标志阻止所有请求。仅将此标志用于测试。
  • --authorization-mode=AlwaysAllow:该标志允许所有请求。仅在您不需要API请求的授权时才使用此标志。

提手:可以选择多个授权模块,按顺序检查模块,以便较早的模块具有更高的优先级来允许或拒绝请求。

2.3 API Server端口和IP

请求到达API server后,默认情况下,Kubernetes API服务器在2个端口上提供HTTP服务:

  • localhost port:
    1. 用于测试和引导,以及主节点的其他组件(scheduler, controller-manager)与API通信;
    2. 没有TLS;
    3. 默认为端口8080,由--insecure-port标志控制;
    4. 默认IP为localhost,由--insecure-bind-address标志控制;
    5. 请求绕过身份验证(authentication )和授权模块(authorization );
    6. 由admission控制模块处理的请求;
    7. 需要拥有主机访问权限。
  • Secure Port:
    1. 推荐使用;
    2. 使用TLS。由--tls-cert-file标志设置证书和--tls-private-key-file标志设置key。
    3. 默认是端口6443,由--secure-port标志控制;
    4. 默认IP是第一个非localhost网络接口,由--bind-address标志控制;
    5. 请求由身份验证(authentication )和授权模块(authorization )处理。
    6. 由admission控制模块处理的请求。

三 验证方式

3.1 认证类型

从版本1.7开始,Dashboard支持基于以下内容的用户身份验证:

Authorization:Bearer <token>:每个请求都传递给Dashboard的标头。从1.6版开始支持。具有最高优先级。如果存在,则不会显示登录界面。

Bearer Token:可以在Dashboard 登录界面上使用的token。

Username/password:可在Dashboard 登录界面上使用用户名/密码。

Kubeconfig:可在Dashboard 登录界面上使用的Kubeconfig文件。

提示:登录界面已在1.7版中引入,如果您使用的是最新推荐的安装,则默认情况下将启用登录功能。若手动配置证书,则需要传递--tls-cert-file和--tls-cert-key标志到dashboard。HTTPS端点将在Dashboard容器的8443端口上暴露,可以通过提供--port标志进行修改。

Skip选项将设置dashboard使用dashboard服务帐户的权限。Skip自1.10.1开放,但默认情况下禁用按钮。使用--enable-skip-login标志显示它。

3.2 Authorization header

在通过HTTP方式访问Dashboard时,使用Authorization header是使Dashboard充当用户的唯一方法。

提示:由于普通HTTP流量容易受到MITM攻击,因此存在一些风险。

要使Dashboard使用Authorization header,需要将Authorization: Bearer <token>每个请求传递到Dashboard。可以通过在Dashboard前配置反向代理来实现。Proxy将负责身份提供者的身份验证,并将请求标头中生成的令牌传递给Dashboard。

注意:需要正确配置Kubernetes API服务器才能接受这些令牌。

注意:如果通过apiserver代理访问仪表板,则授权标头将不起作用。无论是kubectl proxy和API Server的方式将无法正常工作。这是因为一旦请求到达API服务器,所有其他标头都将被删除。

3.3 Bearer Token

每个服务帐户都有一个带有有效承载令牌的机密,可用于登录仪表板。

 [root@master ~]# kubectl -n kube-system get secret			#查看secret中令牌

提示:所有类型为'kubernetes.io/service-account-token'的机密信息都允许登录,它们具有不同的权限。

 [root@master ~]# kubectl -n kube-system describe secrets replicaset-controller-token-vv8fd
#获取replicaset-controller-token-vv8fd的令牌

手动创建一个最高权限名为的admin的ServiceAccount,并绑定名为cluster-admin的ClusterRole角色(该角色拥有集群最高权限)。

 [root@master ~]# cd dashboard/
[root@master dashboard]# vi admin-token.yml
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
name: admin
annotations:
rbac.authorization.kubernetes.io/autoupdate: "true"
roleRef:
kind: ClusterRole
name: cluster-admin
apiGroup: rbac.authorization.k8s.io
subjects:
- kind: ServiceAccount
name: admin
namespace: kube-system
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin
namespace: kube-system
labels:
kubernetes.io/cluster-service: "true"
addonmanager.kubernetes.io/mode: Reconcile
[root@master dashboard]# kubectl create -f admin-token.yml
[root@master dashboard]# kubectl get secret -n kube-system | grep admin
admin-token-6s8zx kubernetes.io/service-account-token 3 94s
[root@master dashboard]# kubectl describe secret/admin-token-6s8zx -n kube-system #查看所创建的token
[root@master dashboard]# kubectl -n kube-system get secret admin-token-6s8zx -o jsonpath={.data.token} | base64 -d #直接获取

提示:Bearer Token认证方式本质上是通过ServiceAccount的身份认证加上Bearer token请求API server的方式实现。

3.4 Username/password

默认情况下禁用基本身份验证,而建议使用授权模式RBAC和--basic-auth-file标志配置Kubernetes API服务器。若未配置API服务器会自动回退到匿名用户,也不会使用Username/password的方式,使用匿名用户后无法检查提供的凭据是否有效。

可通过--authentication-mode=basic标志开启仪表板等等基本身份验证功能。默认情况下,它设置为--authentication-mode=token。

 [root@master ~]# echo "admin,admin,1" >> /etc/kubernetes/basic_auth_file.cvs			#创建用户和密码
[root@master ~]# vi /etc/kubernetes/manifests/kube-apiserver.yaml
……
- command:
- --authorization-mode=basic
- --basic-auth-file=/etc/kubernetes/basic_auth_file #追加
……

提示:前面为用户,后面为密码,数字为用户ID,多个用户不可重复。

若有多个master,以上操作在所有master上执行。

3.5 Kubeconfig

kubeconfig file只支持由--authentication-mode标志指定的身份验证,目前不支持外部身份提供程序或基于证书的身份验证。

kubeconfig的认证可以让拥有该kubeconfig的用户只拥有一个或几个命名空间的操作权限,这相比与上面的token的方式更加的精确和安全。

 [root@master ~]# kubectl -n kube-system get secret admin-token-6s8zx -o jsonpath={.data.token} | base64 -d
eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi10b2tlbi02czh6eCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJhZG1pbiIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6ImNkYzY0ZTQzLTkxY2ItMTFlOS04OTkzLTAwMGMyOWZhN2E3OSIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlLXN5c3RlbTphZG1pbiJ9.gEy5jU9Ur6xCnF1QYDTpk5zJ-Vkxh-R3TOj_Pn5B0BytSQYXjDRAgzG6BEPUYtz77Jh32fMoA8VVS1HiybhHWe9TYKgGqDhJQ-TBTlSkbWJsAsIkD3yvd2MS9W1kIWMRLowy0vtjgn4yqxVt0l_rZPM3UcuxL_aPZq3-1-kbMVO-Ysq6x2YoxL__ju6OcIeXD_56WdYbS9VsGQKg4aJHb2NMPaQw0A4S3CClqoESzUlVMS2lUms7xCOvOlZi0-r2cSlNbdetVjhfHBAFj8XAkDxAEpalc_eOk1aBxqbvUtapzBp7wBAEPTbhp5NmqMFKcUruo4Ab59TE0bPO836Hhg
[root@master ~]# vi admin_kubeconfig
……
token: eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi10b2tlbi02czh6eCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJhZG1pbiIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6ImNkYzY0ZTQzLTkxY2ItMTFlOS04OTkzLTAwMGMyOWZhN2E3OSIsInN1YiI6In-N5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlLXN5c3RlbTphZG1pbiJ9.gEy5jU9Ur6xCnF1QYDTpk5zJ-Vkxh-R3TOj_Pn5B0BytSQYXjDRAgzG6BEPUYtz77Jh32fMoA8VVS1HiybhHWe9TYKgGqDhJQ-TBTlSkbWJsAsIkD3yvd2MS9W1kIWMRLowy0vtjgn4yqxVt0l_rZPM3UcuxL_aPZq3-1-kbMVO-Ysq6x2YoxL__ju6OcIeXD_56WdYbS9VsGQKg4aJHb2NMPaQw0A4S3CClqoESzUlVMS2lUms7xCOvOlZi0-r2cSlNbdetVjhfHBAFj8XAkDxAEpalc_eOk1aBxqbvUtapzBp7wBAEPTbhp5NmqMFKcUruo4Ab59TE0bPO836Hhg #追加3.3所创建的具有最高权限的token

将admin_kubeconfig导出,然后登录界面的时候在Kubeconfig方式中可以选择admin_kubeconfig文件即可。

注意:部署生成的 kubeconfig 文件中没有 token 字段,需要手动添加该字段。

本质上,dashboard只支持两种方法,一种是token,一种是user/password。kubeconfig只是提供了一种便利,并不是一个新的认证方式,如果要用kubeconfig,要么使用username/password,要么使用token。

提示:手动创建kubeconfig可参考:https://jimmysong.io/kubernetes-handbook/guide/kubectl-user-authentication-authorization.html

kubeconfig文件详解参考:https://jimmysong.io/kubernetes-handbook/guide/authenticate-across-clusters-kubeconfig.html。

四 创建管理登录

如果是在测试环境中,或不考虑安全性的情况之下。可以考虑让外部用户直接点击skip进入到dashboard,并且拥有所有的权限。可以通过将cluster-admin这个拥有全集群最高权限的ClusterRole绑定到默认使用的ServiceAccount。

4.1 开启skip

 [root@master ~]# cd dashboard/
[root@master dashboard]# vi kubernetes-dashboard.yaml
……
args:
- --auto-generate-certificates
- --enable-skip-login
……

4.2 创建管理员yaml文件

 [root@master ~]# cd dashboard/
[root@master dashboard]# vi dashboard-admin.yaml
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
name: kubernetes-dashboard
labels:
k8s-app: kubernetes-dashboard
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: kubernetes-dashboard
namespace: kube-system
[root@master dashboard]# kubectl create -f dashboard-admin.yaml

选择跳过。

参考文档:

https://jimmysong.io/posts/user-authentication-in-kubernetes/

https://zhangchenchen.github.io/2017/08/17/kubernetes-authentication-authorization-admission-control/

附005.Kubernetes身份认证的更多相关文章

  1. 附024.Kubernetes全系列大总结

    Kubernetes全系列总结如下,后期不定期更新.欢迎基于学习.交流目的的转载和分享,禁止任何商业盗用,同时希望能带上原文出处,尊重ITer的成果,也是尊重知识.若发现任何错误或纰漏,留言反馈或右侧 ...

  2. 附004.Kubernetes Dashboard简介及使用

    一 Kubernetes dashboard简介 1.1 Web UI简介 dashboard是基于Web的Kubernetes用户界面.可以使用dashboard将容器化应用程序部署到Kuberne ...

  3. 使用USB Key(加密狗)实现身份认证

    首先你需要去买一个加密狗设备,加密狗是外形酷似U盘的一种硬件设备! 这里我使用的坚石诚信公司的ET99产品 公司项目需要实现一个功能,就是客户使用加密狗登录, 客户不想输入任何密码之类的东西,只需要插 ...

  4. 附010.Kubernetes永久存储之GlusterFS超融合部署

    一 前期准备 1.1 基础知识 在Kubernetes中,使用GlusterFS文件系统,操作步骤通常是: 创建brick-->创建volume-->创建PV-->创建PVC--&g ...

  5. CNCF基金会的Certified Kubernetes Administrator认证考试计划

    关于CKA考试 CKA(Certified Kubernetes Administrator)是CNCF基金会(Cloud Native Computing Foundation)官方推出的Kuber ...

  6. Kubernetes的认证机制

    1.了解认证机制 API服务器可以配置一到多个认证的插件(授权插件同样也可以).API服务器接收到的请求会经过一个认证插件的列表,列表中的每个插件都可以检查这个请求和尝试确定谁在发送这个请求.列表中的 ...

  7. Asp-Net-Core学习笔记:身份认证入门

    前言 过年前我又来更新了~ 我就说了最近不是在偷懒吧,其实这段时间还是有积累一些东西的,不过还没去整理-- 所以只能发以前没写完的一些笔记出来 就当做是温习一下啦 PS:之前说的红包封面我还没搞,得抓 ...

  8. "用户增长"--快速身份认证实现用户增长的技术和产品方案

    "用户增长"--快速身份认证实现用户增长的技术和产品方案 1   引言 作为一个互联网产品,用户量的增长是一个非常重要的衡量指标. 这是一个集合了销售,市场,运营,技术的综合能力. ...

  9. 基于token的多平台身份认证架构设计

    基于token的多平台身份认证架构设计 1   概述 在存在账号体系的信息系统中,对身份的鉴定是非常重要的事情. 随着移动互联网时代到来,客户端的类型越来越多, 逐渐出现了 一个服务器,N个客户端的格 ...

随机推荐

  1. Go 在 Windows 上用户图形界面 GUI 解决方案 Go-WinGUI 国产(使用cef 内核)

    Go 在 Windows 上用户图形界面 GUI 解决方案 Go-WinGUI 国产 Go 在服务端的优势不容置疑,但是在桌面应用上却没有好的 GUI 支持,本项目是 Go 语言在 Windows 上 ...

  2. js之美

    http://fxck.it/post/72326363595 大部分脚本语言里字面量都要快一些,因为解析[]比解析new Array()步骤少的多 关于Object可以用constructor注入的 ...

  3. 扩展你的javascript数组

    如今做的项目用的正是jquery的框架,Jquery miniui,其功能强大.性能卓越.易于上手.不失灵活,在不断学习和研发的过程中,miniui给了非常多的启示,让我又一次认识了js的本质,意识到 ...

  4. End-to end provisioning of storage clouds

    Embodiments discussed in this disclosure provide an integrated provisioning framework that automates ...

  5. android module 模块共用远程包

    在项目有多模块,需要使用到同一个第三方包时,引入报错,个人解决方法如下 1. 在模块build.gradle 文件中配置maven远程地址 可从app下的build.gradle文件里复制 allpr ...

  6. JDBC 使用这个是MySQL下的

    import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.R ...

  7. 思想者:漫谈大学生的四个LEARN

     核心提示:哪四个Learn呢?Learn to learn(学习怎样学习),Learn to be(学习怎样做人),Learn to do(学习怎样做事),Learn totogether(学习 ...

  8. vi学习(1)

    今天下午看了vi频繁使用的操作,现在记录,为了方便日后查询. 按vi模式.进入命令3部分. (一) 一般模式下 字符操作:上下左右箭头(或kjhl)能够实现光标上下左右移动一位. 假设想要进行多次移动 ...

  9. 开源mvcpager分页控件分页实例

    最近MVC需要用到分页,然后在网上找了一圈,发现一个很好用的分页控件,在此要感谢作者的辛勤劳动. 下载Pager 这个分页控件也有Asp.net的支持,需要的去看看作者的主页 webdiyer 先看看 ...

  10. WPF学习目录

    基本概念 数据源Source-目标Target WPF生命周期 App.xaml 依赖属性 WPF路由 线程操纵UI问题 利用属性中设置.查看DataContext/Command等 分析布局 写数据 ...