0
点赞
收藏
分享

微信扫一扫

K8s进阶篇-细粒度权限控制​


K8s进阶篇-细粒度权限控制​













集群是否启用RBAC

grep -C3 /usr/lib/systemd/system/kube-apiserver.service |grep authorization-mode

K8s进阶篇-细粒度权限控制​_访问控制


API Server目前支持以下几种授权策略

AlwaysDeny:表示拒绝所有请求,一般用于测试。

AlwaysAllow:允许接收所有请求。如果集群不需要授权流程,则可以采用该策略,这也是Kubernetes的默认配置。

ABAC(Attribute-Based Access Control):基于属性的访问控制。表示使用用户配置的授权规则对用户请求进行匹配和控制。

Webhook:通过调用外部REST服务对用户进行授权

RBAC:Role-Based Access Control,基于角色的访问控制。

Node:是一种专用模式,用于对kubelet发出的请求进行访问控制


k8s认证/授权/准入控制

认证

认证支持多种插件

(1)令牌(token)认证:

双方有一个共享密钥,服务器上先创建一个密码,存下来,客户端登陆的时候拿这个密码登陆即可,这个就是对称密钥认证方式;k8s提供了一个restful风格的接口,它的所有服务都是通过http协议提供的,因此认证信息只能经由http协议的认证首部进行传递,这种认证首部进行传递通常叫做令牌;

(2)ssl认证:

对于k8s访问来讲,ssl认证能让客户端确认服务器的认证身份,我们在跟服务器通信的时候,需要服务器发过来一个证书,我们需要确认这个证书是不是ca签署的,如果是我们认可的ca签署的,里面的subj信息与我们访问的目标主机信息保持一致,没有问题,那么我们就认为服务器的身份得到认证了,k8s中最重要的是服务器还需要认证客户端的信息,kubectl也应该有一个证书,这个证书也是server所认可的ca签署的证书,双方需要互相认证,实现加密通信,这就是ssl认证

授权

如果用户通过认证,那么什么权限都没有,需要一些后续的授权操作,如对资源的增删该查等,kubernetes1.6之后开始有RBAC(基于角色的访问控制机制)授权检查机制。


ServiceAccount(服务账号)

User account(用户账号)


准入控制

一般而言,准入控制只是用来定义我们授权检查完成之后的后续的其他安全检查操作的,进一步补充了授权机制,由多个插件组合实行,一般而言在创建,删除,修改或者做代理时做补充;

K8s集群添加useraccount和serviceaccount

生成证书签名文件

cd /etc/kubernetes/pki/

openssl genrsa -out lucky.key 2048

K8s进阶篇-细粒度权限控制​_访问控制_02


生成证书key

openssl req -new -key lucky.key -out lucky.csr -subj "/CN=lucky"

K8s进阶篇-细粒度权限控制​_访问控制_03


生成证书

openssl x509 -req -in lucky.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out lucky.crt -days 3650

K8s进阶篇-细粒度权限控制​_配置文档_04



Kubeconfig添加用户

在kubeconfig下新增加一个lucky这个用户把lucky这个用户添加到kubernetes集群中,可以用来认证apiserver的连接

kubectl config set-credentials lucky --client-certificate=./lucky.crt --client-key=./lucky.key --embed-certs=true

kubectl config set-context lucky@kubernetes --cluster=kubernetes --user=lucky

K8s进阶篇-细粒度权限控制​_访问控制_05


切换到lucky这个用户

kubectl config get-contexts-------查看集群账号


kubectl config current-context----查看集群当前账号


kubectl config use lucky@kubernetes---切换账号


账号授权

把user这个用户通过rolebinding绑定到clusterrole上,授予权限,权限只是在lucky这个名称空间有效把lucky这个用户通过rolebinding绑定到clusterrole上

kubectl create rolebinding lucky -n lucky --clusterrole=cluster-admin --user=lucky

K8s进阶篇-细粒度权限控制​_服务器_06


添加普通用户

useradd lucky

cp -ar /root/.kube/ /home/lucky/

chown -R lucky.lucky /home/lucky/

su - lucky

使用kubeconfig和token访问集群

kubectl命令访问集群时,默认情况下在$HOME/.kube目录下寻找名为config的配置文档,配置文档中包含集群 API 地址、端口号、证书等,kubectl 据此建构访问集群的上下文。

准备好证书请求文档

定义集群用户上下文

制作 kubeconf 主要有三步:

为配置文档添加集群信息

为配置文档添加用户信息(token 访问可忽略)

为配置文档添加上下文

输入以下命令,将群集详细信息添加到配置文档中:

kubectl config --kubecnotallow=config-demo set-cluster development --server=https://1.2.3.4 --certificate-authority=fake-ca-file


kubectl config set-cluster kubernetes

--certificate-authority=/etc/kubernetes/cert/ca.pem

--embed-certs=true

--server=https://172.16.200.100:8443

--kubecnotallow=config-demo.kubeconfig


将用户认证详细信息添加到配置文档中(如果使用 token 访问可忽略此步骤):

kubectl config --kubecnotallow=config-demo set-credentials developer --client-certificate=fake-cert-file --client-key=fake-key-seefile

kubectl config set-credentials devuser-sa-key

--client-certificate=/etc/kubernetes/cert/devuser-sa.pem

--client-key=/etc/kubernetes/cert/devuser-sa-key.pem

--embed-certs=true

--kubecnotallow=devuser-sa.kubeconfig



将上下文详细信息添加到配置文档中:

kubectl config set-context kubernetes-dev

--cluster=kubernetes

--user=devuser-

--namespace=dev

--kubecnotallow=config-demo.kubeconfig

# 设置上下文参数

kubectl config set-context kubernetes-test

--cluster=kubernetes

--user=devuser

--namespace=test

--kubecnotallow=config-demo.kubeconfig


通过token令牌登陆dashboard界面

[root@master01 .kube]# kubectl create namespace lucky 创建名称空间

namespace/lucky created


[root@master01 .kube]# kubectl create serviceaccount lucky-admin -n lucky --创建sa

serviceaccount/lucky-admin created



[root@master01 .kube]# kubectl create rolebinding lucky-admin -n lucky --clusterrole=cluster-admin --serviceaccount=lucky:lucky-admin -----创建servicebindings

rolebinding.rbac.authorization.k8s.io/lucky-admin created


[root@master01 .kube]# kubectl get secret -n lucky

NAME TYPE DATA AGE

default-token-kr6h5 kubernetes.io/service-account-token 3 71s

lucky-admin-token-rj449 kubernetes.io/service-account-token 3 60s



[root@master01 .kube]# kubectl describe secret lucky-admin-token-rj449 -n lucky

Name: lucky-admin-token-rj449

Namespace: lucky

Labels: <none>

Annotations: kubernetes.io/service-account.name: lucky-admin

kubernetes.io/service-account.uid: 57a4e386-8bf5-4a95-ac21-1a6c826300a1


Type: kubernetes.io/service-account-token


Data

====

ca.crt: 1371 bytes

namespace: 5 bytes

token: eyJhbGciOiJSUzI1NiIsImtpZCI6IlNnZHZuMVdPTjVhaklzSFdFNVBkeExCWGNYamRtRnowN25uVmtPQjFKZ0EifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJsdWNreSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJsdWNreS1hZG1pbi10b2tlbi1yajQ0OSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJsdWNreS1hZG1pbiIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6IjU3YTRlMzg2LThiZjUtNGE5NS1hYzIxLTFhNmM4MjYzMDBhMSIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDpsdWNreTpsdWNreS1hZG1pbiJ9.doThTLo_k6mKtIRID4hu6Y2A0iE2jY_RBmnPa2FJJ-PKfhCKNFDae1uvdM_dpasaHN8g9Eh3Tz5-pFOKefvuyjo4pKCaVsJ3v0mPBLXD7LGKZeWLEiQdAMq3XbHR5kyfzljGKhyN9eexngTGTm3eR08u2ppVThjd-kQZzJUiKya3ifiWpOeYM1GMPeJeRWSSXXd3q73UHC93Alp5iRMEPKrItluOpyWH3DYbCipLFYEp2OURgeHwsJ6gJz23WFD1MCM6FO6pNIBgRWmuY2EntmNH1RnQ0SYoP4s-VmwRfxr6k_IVztToyiTG5RDGFBkDiyycwtJxQ8O-cWKTbQlrWg

K8s进阶篇-细粒度权限控制​_配置文档_07



通过dashboard登录界面进行创建pod的操作

apiVersion: v1

kind: Pod

metadata:

name: lucky-pod

namespace: lucky

spec:

containers:

- name: lucky

image: nginx

K8s进阶篇-细粒度权限控制​_服务器_08


通过kubeconfig登陆dashboard

[root@master01 ~]# kubectl config view

apiVersion: v1

clusters:

- cluster:

certificate-authority-data: DATA+OMITTED

server: https://192.168.211.200:8443

name: kubernetes

contexts:

- context:

cluster: kubernetes

user: admin

name: kubernetes

current-context: kubernetes

kind: Config

preferences: {}

users:

- name: admin

user:

client-certificate-data: REDACTED

client-key-data: REDACTED



创建账号

kubectl create serviceaccount lucky-admin -n lucky


kubectl get secret -n lucky 获取账号的secret信息



(1)创建cluster

kubectl config set-cluster kubernetes --certificate-authority=./ca.crt --server="https://192.168.0.6:6443" --embed-certs=true --kubecnotallow=/root/lucky-admin.conf

(2)创建credentials时需要使用上面我门创建的token信息

kubectl get secret -n lucky

DEF_NS_ADMIN_TOKEN=$(kubectl get secret lucky-admin-token-2pm2l -n lucky -o jsnotallow={.data.token}|base64 -d)

(3)开始创建credentials

kubectl config set-credentials lucky --token=$DEF_NS_ADMIN_TOKEN --kubecnotallow=/root/lucky-admin.conf

(4)创建context

kubectl config set-context lucky@kubernetes --cluster=kubernetes --user=lucky --kubecnotallow=/root/lucky-admin.conf

(5)切换context的current-context是lucky@kubernetes

kubectl config use-context lucky@kubernetes --kubecnotallow=/root/lucky-admin.conf

(6)把刚才的kubeconfig文件lucky-admin.conf复制到桌面

浏览器访问时使用kubeconfig认证,把刚才的lucky-admin.conf导入到web界面,那么就可以登陆了

举报

相关推荐

0 条评论