k8s权限管理

K8s的用户和权限管理包括两个方面:认证和授权。认证解决用户是谁的问题,授权解决用户能做什么的问题。通过合理的权限管理,能够保证系统的安全可靠。

K8s的认证包含以下3方式。这3方式可以同时存在,认证时只按一种即可。

证书认证

       设置apiserver的启动参数:--client_ca_file=SOMEFILE

Token认证

       设置apiserver的启动参数:--token_auth_file=SOMEFILE

基本信息认证

       设置apiserver的启动参数:--basic_auth_file=SOMEFILE

 

1. 用户分类

K8s的用户分两种,一种是普通用户,一种是ServiceAccount(服务账户)。

1.1普通用户是假定被外部或独立服务管理的。管理员分配私钥。平时常用的kubectl命令都是普通用户执行的。

1.2ServiceAccount(服务帐户)是由Kubernetes API管理的用户。它们绑定到特定的命名空间,并由API服务器自动创建或通过API调用手动创建。服务帐户与存储为Secrets的一组证书相关联,这些凭据被挂载到pod中,以便集群进程与Kubernetes API通信。(登录dashboard时我们使用的就是ServiceAccount

 

2. 普通用户的创建和查看及授权

普通用户通过k8s来创建和维护是通过创建证书切换上下文环境的方式创建和切换用户。

创建用户证书

创建devuser-csr.json文件:

k8s的用户名就是从CN上获取的。组是从O上获取的。这个用户或者组用于后面的角色绑定使用

 

cat > devuser-csr.json <

{

  "CN": "devuser",

  "hosts": [],

  "key": {

    "algo": "rsa",

    "size": 2048

  },

  "names": [

    {

      "C": "CN",

      "ST": "BeiJing",

      "L": "BeiJing",

      "O": "k8s",

      "OU": "System"

    }

  ]

}

EOF

 

接下来生成user的证书:

$ cfssl gencert -ca=ca.crt -ca-key=ca.key -config=ca-config.json -profile=kubernetes devuser-csr.json | cfssljson -bare devuser

 

就会生成下面的文件:

devuser.csr devuser-key.pem devuser.pem

 

校验证书

# cfssl-certinfo -cert kubernetes.pem

 

生成config文件

kubeadm已经生成了admin.conf,我们拷贝过来这个文件,这样生的配置文件会将admin用户的信息也保存下来

$ cp /etc/kubernetes/admin.conf devuser.kubeconfig

 

设置客户端认证参数:

kubectl config set-credentials devuser \

--client-certificate=/root/ssl/devuser.pem \

--client-key=/root/ssl/devuser-key.pem \

--embed-certs=true \

--kubeconfig=devuser.kubeconfig

设置上下文参数:

kubectl config set-context kubernetes \

--cluster=kubernetes \

--user=devuser \

--namespace=kube-system \

--kubeconfig=devuser.kubeconfig

 

创建角色

创建一个叫pod-reader的角色

 

[root@master1 ~]# cat  pod-reader.yaml

kind: Role

apiVersion: rbac.authorization.k8s.io/v1

metadata:

  namespace: kube-system

  name: pod-reader

rules:

- apiGroups: [""] # "" indicates the core API group

  resources: ["pods"]

  verbs: ["get", "watch", "list"]

kubectl create -f pod-reader.yaml

 

绑定用户

创建一个角色绑定,把pod-reader角色绑定到 devuser

 

[root@master1 ~]# cat devuser-role-bind.yaml

kind: RoleBinding

apiVersion: rbac.authorization.k8s.io/v1

metadata:

  name: read-pods

  namespace: kube-system

subjects:

- kind: User

  name: devuser   # 目标用户

  apiGroup: rbac.authorization.k8s.io

roleRef:

  kind: Role

  name: pod-reader  # 角色信息

  apiGroup: rbac.authorization.k8s.io

kubectl create -f devuser-role-bind.yaml

 

       设置当前用户环境为新建的用户devuser

kubectl config use-context  kubernetes  --kubeconfig=devuser.kubeconfig

使用新的config文件

rm $HOME/.kube/config && cp devuser.kubeconfig $HOME/.kube/config

发现已经没有别的namespace的权限了,也不能访问node信息了:

 k8s权限管理_第1张图片

 k8s权限管理_第2张图片

查看配置文件中包含的用户:

 k8s权限管理_第3张图片

3.服务用户的创建和授权

服务账户的用户信息数据是由k8s来管理维护的的。service account是给进程用的,让进程有相关的权限。如dasboard就是一个进程,我们就可以创建一个service account给它,让它去访问k8sService Account它并不是给kubernetes集群的用户使用的,而是给pod里面的进程使用的,它为pod提供必要的身份认证。

查看所有的service account

 k8s权限管理_第4张图片

 

新增一个新的用户cnych

该用户只能对命名空间kube-system下面的podsdeployments进行管理

第一步新建一个ServiceAccount

 

$ kubectl create sa cnych -n kube-system

 

然后我们新建一个角色role-cnych(role.yaml)

kind: Role

apiVersion: rbac.authorization.k8s.io/v1

metadata:

  namespace: kube-system

  name: role-cnych

rules:

- apiGroups: [""]

  resources: ["pods"]

  verbs: ["get", "watch", "list"]

- apiGroups: ["extensions", "apps"]

  resources: ["deployments"]

  verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]

注意上面的rules规则:管理podsdeployments的权限。

 

然后我们创建一个角色绑定,将上面的角色role-cnych绑定到cnychServiceAccount上:(role-bind.yaml)

 

kind: RoleBinding

apiVersion: rbac.authorization.k8s.io/v1

metadata:

  name: role-bind-cnych

  namespace: kube-system

subjects:

- kind: ServiceAccount

  name: cnych

  namespace: kube-system

roleRef:

  kind: Role

  name: role-cnych

  apiGroup: rbac.authorization.k8s.io

 

分别执行上面两个yaml文件:

$ kubect create -f role.yaml

$ kubect create -f role-bind.yaml

 k8s权限管理_第5张图片

 

这样ServiceAccount cnych就创建好了,并授予了权限。

 

查看token名称

kubectl  get  secret -n kube-system

 

获取token

kubectl describe secret/{token_name} -n kube-system

 k8s权限管理_第6张图片

这样就可以使用查找token登录dashboard

 k8s权限管理_第7张图片

你可能感兴趣的:(云计算)