k8s-Service Account的授权管理
Service Account也是一种账号,是给运行在Pod里的进程提供了必要的身份证明。需要在Pod定义中指明引用的Service Account,这样就可以对Pod的进行赋权操作。
[root@master01 ~]# kubectl api-versions
例如:pod内可获取rbac命名空间的所有Pod资源,pod-reader-sc的Service Account是绑定了名为pod-read的Role
Service Account为服务提供了一种方便的认证机制,但它不关心授权的问题。可以配合RBAC来为Service Account鉴权:
- 配置–authorization-mode=RBAC和–runtime-config=rbac.authorization.k8s.io/v1alpha1
- 配置–authorization-rbac-super-user=admin
- 定义Role、ClusterRole、RoleBinding或ClusterRoleBinding
# This role allows to read pods in the namespace "default" kind: Role apiVersion: rbac.authorization.k8s.io/v1alpha1 metadata: namespace: default name: pod-reader rules: - apiGroups: [""] # The API group "" indicates the core API Group. resources: ["pods"] verbs: ["get", "watch", "list"] nonResourceURLs: [] --- # This role binding allows "default" to read pods in the namespace "default" kind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1alpha1 metadata: name: read-pods namespace: default subjects: - kind: ServiceAccount # May be "User", "Group" or "ServiceAccount" name: default namespace: default roleRef: kind: Role name: pod-reader apiGroup: rbac.authorization.k8s.io
apiVersion: v1 kind: Pod metadata: name: nginx namespace: default spec: serviceAccountName: default containers: - name: nginx image: nginx imagePullPolicy: IfNotPresent ports: - containerPort: 80
默认的RBAC策略为控制平台组件、节点和控制器授予有限范围的权限,但是除kube-system外的Service Account是没有任何权限的。
(1)为一个应用专属的Service Account赋权
此应用需要在Pod的spec中指定一个serviceAccountName,用于API、Application Manifest、kubectl create serviceaccount等创建Service Account的命令。
例如为my-namespace中的my-sa Service Account授予只读权限
#rolebinding的名字 #view只读权限 #ns的名字:sa的名字 kubectl create rolebinding my-sa-view --clusterrole=view --serviceaccount=my-namespace:my-sa --namespace=my-namespace
(2)为一个命名空间中名为default的Service Account授权
如果一个应用没有指定 serviceAccountName,则会使用名为default的Service Account。注意,赋予Service Account “default”的权限会让所有没有指定serviceAccountName的Pod都具有这些权限
例如,在my-namespace命名空间中为Service Account“default”授予只读权限:
kubectl create rolebinding default-view --clusterrole=view --serviceaccount=my-namespace:default --namespace=my-namespace
另外,许多系统级Add-Ons都需要在kube-system命名空间中运行,要让这些Add-Ons能够使用超级用户权限,则可以把cluster-admin权限赋予kube-system命名空间中名为default的
Service Account,这一操作意味着kube-system命名空间包含了通向API超级用户的捷径。
kubectl create clusterrolebinding add-ons-add-admin --clusterrole=cluster-admin --serviceaccount=kube-system:default
(3)为命名空间中所有Service Account都授予一个角色
如果希望在一个命名空间中,任何Service Account应用都具有一个角色,则可以为这一命名空间的Service Account群组进行授权
kubectl create rolebinding serviceaccounts-view --clusterrole=view --group=system:serviceaccounts:my-namespace --namespace=my-namespace
(4)为集群范围内所有Service Account都授予一个低权限角色
如果不想为每个命名空间管理授权,则可以把一个集群级别的角色赋给所有Service Account。
kubectl create clusterrolebinding serviceaccounts-view --clusterrole=view --group=system:serviceaccounts
(5)为所有Service Account授予超级用户权限
kubectl create clusterrolebinding serviceaccounts-view --clusterrole=cluster-admin --group=system:serviceaccounts
查看授权角色
[root@master01 Prometheus]# kubectl get clusterrole NAME CREATED AT admin 2021-08-06T04:50:08Z calico-kube-controllers 2021-08-06T05:04:35Z calico-node 2021-08-06T05:04:35Z cluster-admin 2021-08-06T04:50:08Z edit 2021-08-06T04:50:08Z kk 2021-08-18T07:56:29Z kubeadm:get-nodes 2021-08-06T04:50:17Z kubernetes-dashboard 2021-08-06T05:03:15Z system:aggregate-to-admin 2021-08-06T04:50:08Z system:aggregate-to-edit 2021-08-06T04:50:08Z .... ....
使用kubectl命令行工具创建资源对象
(1)在命名空间rbac中为用户es授权admin ClusterRole:
kubectl create rolebinding bob-admin-binding --clusterrole=admin --user=es --namespace=rbac
(2)在命名空间rbac中为名为myapp的Service Account授予view ClusterRole:
kubctl create rolebinding myapp-role-binding --clusterrole=view --serviceaccount=rbac:myapp --namespace=rbac
(3)在全集群范围内为用户root授予cluster-admin ClusterRole:
kubectl create clusterrolebinding cluster-binding --clusterrole=cluster-admin --user=root
(4)在全集群范围内为名为myapp的Service Account授予view ClusterRole:
kubectl create clusterrolebinding service-account-binding --clusterrole=view --serviceaccount=myapp
yaml文件进行rbac授权:https://kubernetes.io/zh/docs/reference/access-authn-authz/rbac/
限制不同的用户操作k8s集群
[manager@master01 ~]$ kubectl get pod The connection to the server localhost:8080 was refused - did you specify the right host or port?
ssl认证
生成一个证书
(1)生成一个私钥
[root@master01 ~]# cd /etc/kubernetes/pki/ [root@master01 pki]# (umask 077; openssl genrsa -out hwf.key 2048) Generating RSA private key, 2048 bit long modulus .+++ .............................................................................................................+++ e is 65537 (0x10001)
(2)生成一个证书请求
[root@master01 pki]# openssl req -new -key hwf.key -out hwf.csr -subj "/CN=hwf"
(3)生成一个证书
[root@master01 pki]# openssl x509 -req -in hwf.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out hwf.crt -days 3650 Signature ok subject=/CN=hwf Getting CA Private Key
在kubeconfig下新增加一个hwf这个用户
(1)把lucky这个用户添加到kubernetes集群中,可以用来认证apiserver的连接
[root@master01 pki]# kubectl config set-credentials hwf --client-certificate=./hwf.crt --client-key=./hwf.key --embed-certs=true User "hwf" set.
(2)在kubeconfig下新增加一个hwf这个账号
[root@master01 pki]# kubectl config set-context hwf@kubernetes --cluster=kubernetes --user=hwf Context "hwf@kubernetes" created.
(3)切换账号到hwf,默认没有任何权限[需要进行RBAC授权才能操作k8s集群]
[root@master01 pki]# kubectl config use-context hwf@kubernetes Switched to context "hwf@kubernetes". [root@master01 pki]# kubectl get pod Error from server (Forbidden): pods is forbidden: User "hwf" cannot list resource "pods" in API group "" in the namespace "default" kubectl config use-context kubernetes-admin@kubernetes #这个是集群用户,有任何权限
把user这个用户通过rolebinding绑定到clusterrole上,授予权限,权限只是在hwf这个名称空间有效
yaml方法:
apiVersion: rbac.authorization.k8s.io/v1 # 此角色绑定使得用户 "dave" 能够读取 "development" 名字空间中的 Secrets # 你需要一个名为 "secret-reader" 的 ClusterRole kind: RoleBinding metadata: name: read-secrets # RoleBinding 的名字空间决定了访问权限的授予范围。 # 这里隐含授权仅在 "development" 名字空间内的访问权限。 namespace: default subjects: - kind: User name: hwf # 'name' 是区分大小写的 apiGroup: rbac.authorization.k8s.io - kind: ServiceAccount # May be "User", "Group" or "ServiceAccount" name: www roleRef: kind: ClusterRole name: cluster-admin apiGroup: rbac.authorization.k8s.io
[root@master01 ~]# kubectl config use-context hwf@kubernetes Switched to context "hwf@kubernetes". [root@master01 ~]# kubectl get pod NAME READY STATUS RESTARTS AGE frontend-ds-mzsws 0/1 Terminating 0 37h pod-secret-volume 1/1 Running 0 24h [root@master01 ~]# kubectl get pod --all-namespaces Error from server (Forbidden): pods is forbidden: User "hwf" cannot list resource "pods" in API group "" at the cluster scopem
命令行的方法
kubectl create ns hwf kubectl create rolebinding hwf -n hwf --clusterrole=cluster-admin --user=hwf
切换回去
[root@master01 ~]# kubectl config use-context kubernetes-admin@kubernetes Switched to context "kubernetes-admin@kubernetes".
添加一个hwf的普通用户
[root@master01 ~]# useradd hwf #需要把config里管理员的信息都删除,只留下hwf用户的 [root@master01 ~]# cp -ar /root/.kube/ /home/hwf/ [root@master01 ~]# chown -R hwf.hwf /home/hwf/ [root@master01 ~]# su - hwf
再次测试
[hwf@master01 ~]$ kubectl get pod NAME READY STATUS RESTARTS AGE frontend-ds-mzsws 0/1 Terminating 0 37h pod-secret-volume 1/1 Running 0 24h
注意事项:
cp .kube/config文件去别的用户家目录时一定要删除管理员的信息不然
[hwf@master01 .kube]$ kubectl config use-context kubernetes-admin@kubernetes Switched to context "kubernetes-admin@kubernetes". [hwf@master01 .kube]$ kubectl get pod --all-namespaces NAMESPACE NAME READY STATUS RESTARTS AGE default frontend-ds-mzsws 0/1 Terminating 0 37h default pod-secret-volume 1/1 Running 0 24h kube-system calico-kube-controllers-cc8959d7f-nzdkj 1/1 Running 0 11d kube-system calico-node-6qzfp 1/1 Running 0 12d kube-system calico-node-8wfhn 1/1 Running 0 12d
删除管理员信息后就无法切换管理员了
[hwf@master01 .kube]$ kubectl config use-context kubernetes-admin@kubernetes
error: no context exists with the name: "kubernetes-admin@kubernetes"

评论