从Dashboard鉴权认识Kubernetes的用户认证

Kubernetes 用户认证

  1. 从Dashboard鉴权认识Kubernetes的用户认证
  2. 从签发用户证书认识Kubernetes的用户认证

Kubernetes的API准入(Access Control)分为用户认证(Authenticating)鉴权(Authorization)两个部分。鉴权是对权限的控制,来控制角色(Role)、用户(User)是否能访问对象,主要通过RBAC、ABAC实现,你大概率听说过这两种鉴权控制策略。当然鉴权不是本片讨论的重点,下面内容我们主要讨论认证部分。


1. Kubernetes中的用户

开始前我们先看下k8s怎么定义用户。

所有的Kubrnetes集群都有两种用户:Kubernetes管理的服务账号普通用户
All Kubernetes clusters have two categories of users: service accounts managed by Kubernetes, and normal users.

1.1.ServiceAccount 服务账号

ServiceAccount(下称SA)为Pod(中的进程)提供身份认证,用来做API访问、镜像仓库等认证。我们本篇中的Dashboard案例即使用SA做认证来访问集群API。SA的作用域是Namespace。

1.2.Normal User 普通用户

普通用户并不由Kubernets管理,可以通过在x509证书中subject字段确定访问者用户名,也可以可以通过OpenID ConnectWebhook Token等方式SSO方式认证。


上面关于认证鉴权的描述是我们详细了解k8s认证鉴权的基础。下面文章分为两部分:【章节2】 怎么配置Dashboard鉴权,【章节3】

2. Kubernetes Dashborad认证鉴权

2.1. Dashborad的认证方式

Kubernetes Dashboard 的认证有两种方式:Token 、Kubeconfig

Token 是JWT令牌。Kubeconfig是kubectl认证文件,但配置中user同样采用token。

2.2. 配置Dashboard认证

[2.2.1]、[2.2.2]是所有认证方式的必要内容,根据认证方式的区别可以选择[2.2.3]、[2.2.4]、[2.2.5]几种令牌。
当前案例Dashboard已经安装在kubernetes-dashboard命名空间。

kubectl get pod -n kubernetes-dashboard
NAME                                        READY   STATUS    RESTARTS   AGE
dashboard-metrics-scraper-8c47d4b5d-5w224 1/1 Running 0 55d
kubernetes-dashboard-67bd8fc546-895hv 1/1 Running 0 55d
2.2.1.第一步,创建ServiceAccount

我们使用Dashboard管理集群需要通过Pod访问API,所有首先需要创建一个SA。

kubectl create serviceaccount
kubectl -n kubernetes-dashboard create serviceaccount admin-user
2.2.1.第二步,给SA绑定集群访问权限
kubectl ceate clusterbinding
cat <<EOF  |  kubectl apply -f -
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kubernetes-dashboard
EOF
2.2.2.获取Bearer Token
create bearer token
kubectl -n kubernetes-dashboard create token admin-user

这是可以用这个token访问Dashboard。
Sign in success

2.2.3.长期有效Token

上面的Token默认只有一小时有效期,我们可以创建一个kubernetes.io/service-account-token类型的Secret保存Token。

create secret
# 创建绑定SA的Secret,**注意kubernetes.io/service-account.name**
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Secret
metadata:
name: admin-user-token
namespace: kubernetes-dashboard
annotations:
kubernetes.io/service-account.name: "admin-user"
type: kubernetes.io/service-account-token
EOF

# 获取长期Token,这个Token就可以用来登录Dashboard
kubectl get secret admin-user-token -n kubernetes-dashboard -o jsonpath={".data.token"} | base64 -d

2.2.4.kubeconfig

我们获取到了认证Token,那么怎么把这个附加到kubeconfig方便我们存储数据呢?

modify or create kubeconfig
#获取AccountService Token
TOKEN=`kubectl get secret admin-user-token -n kubernetes-dashboard -o jsonpath={".data.token"} | base64 -d`
#设置kubeconfig新用户,用户名==ServiceAccount name `admin-user`
kubectl config set-credentials admin-user --token=$TOKEN
#设置上下文
kubectl config set-context dashboard --cluster=cluster --user=admin-user
kubectl config use-context dashboard

#查看配置文件~.kube/config,配置中应该包含 context:`dashboard` user:`admin-user`
kubectl config view

#apiVersion: v1
#clusters:
#- cluster:
# certificate-authority-data: DATA+OMITTED
# server: https://172.17.1.120:6443
# name: kubernetes
#contexts:
#- context:
# cluster: kubernetes
# user: admin-user
# name: dashboard
#- context:
# cluster: kubernetes
# namespace: qietv
# user: gouser
# name: godev
#current-context: dashboard
#kind: Config
#preferences: {}
#users:
#- name: admin-user
# user:
# token: REDACTED
#- name: godev
# user:
# client-certificate-data: DATA+OMITTED
# client-key-data: DATA+OMITTED

2.2. More about kubeconfig

从上面的.kube/config我们看到里面还有个叫godev的用户,godev用户的认证信息并不是token,而是客户端证书。用户能通过Dashboard访问Kubernetes API Server吗?

答案是不能!

那么这个用户是什么?这是一个普通用户,可以通过kubectl访问API Server。

3. Kubernetes中的普通用户认证

上文kubeconfig中的godev用户是一个普通用户,证书的Subject信息如下,与认识SA认证一样,我们通过配置普通用户认证信息,来了解这种认证过程。

godev user client-certificate-data subject info
subject=O = qietv, CN = godev