k8s-Service Account

root
233
文章
0
评论
2021年8月18日23:11:28 评论 7218字阅读24分3秒

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"

 

 

继续阅读
weinxin
我的微信
这是我的微信扫一扫
  • 文本由 发表于 2021年8月18日23:11:28
  • 除非特殊声明,本站文章均为原创,转载请务必保留本文链接
k8s-RBAC Kubernetes

k8s-RBAC

k8s-RBAC认证授权策略 RBAC介绍 在Kubernetes中,所有资源对象都是通过API进行操作,他们保存在etcd里。而对etcd的操作我们需要通过访问 kube-apiserver 来实现...
k8s-Secret Kubernetes

k8s-Secret

配置管理中心Secret Secret是什么? Configmap一般是用来存放明文数据的,如配置文件,对于一些敏感数据,如密码、私钥等数据时,要用secret类型 Secret解决了密码、token...
K8s-configmap Kubernetes

K8s-configmap

配置管理中心configmap Configmap概述 什么是Configmap? Configmap是k8s中的资源对象,用于保存非机密性的配置的,数据可以用key/value键值对的形式保存,也可...
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: