给你的Kubernetes集群建一个只读账户(防止高管。。。后)
给你的Kubernetes集群建一个只读账户
需求:我们知道搭完k8s集群会创建一个默认的管理员kubernetes-admin用户该用户拥有所以权限,有一天开发或测试的同学需要登录到k8s集群了解业务pod的状态等,我们不可能提供管理员的账户给他不安全如果他因为某个高管。。。删库跑路啥办??,所以建一个只读账户迫在眉睫。
kubectl conifg命令常见操作:
- kubectl config view:打印kubeconfig?件内容。
- kubectl config set-cluster:设置kubeconfig的clusters配置段。
- kubectl config set-credentials:设置kubeconfig的users配置段。
- kubectl config set-context:设置kubeconfig的contexts配置段。
- kubectl config use-context:设置kubeconfig的current-context配置段。
# kubectl config view
一、我是用kubeadm部署的集群,给只读账户jackhe创建私钥及证书文件,并保存在/etc/kubernetes/pki目录下。
1)生成私钥文件。
cd /etc/kubernetes/pki/ umask 077;openssl genrsa -out jackhe.key 2048
2)创建证书部署请求,关键点其中-subj选项中的CN的值将被kubeconfig最为用户名使用。
openssl req -new -key jackhe.key -out jackhe.csr -subj "/CN=jackhe"
3)用kubernetes集群生成的CA签署证书,设置有限时间3650天。
openssl x509 -req -in jackhe.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out jackhe.crt -days 3650
4)验证证书信息。
openssl x509 -in jackhe.crt -text -noout
二、创建一个新的集群信息,因为最终我们是提供config给使用者,默认的config文件有管理员信息当我们执行:kubectl config use-context 就拥有了管理权限,这是不被允许的。
kubectl config set-cluster mycluster --kubeconfig=/tmp/config --certificate-authority=/etc/kubernetes/pki/ca.crt --embed-certs=true --server="https://192.168.10.129:6443"
选项:
--kubeconfig="":配置文件存放路径 --certificate-authority="": 设置kuebconfig配置文件中集群选项中的certificate-authority路径。 --embed-certs=false: 设置kuebconfig配置文件中集群选项中的embed-certs开关。 --server="": 设置kuebconfig配置文件中集群选项中的server。
三、配置客户端证书及密钥,?户名信息会通过命令从证书Subject的CN值中?动提取,例如前?创建csr时使?的“CN=jackhe”.
kubectl config set-credentials jackhe --embed-certs=true --client-certificate=/etc/kubernetes/pki/jackhe.crt --client-key=/etc/kubernetes/pki/jackhe.key --kubeconfig=/tmp/config
选项:
--client-certificate="": 设置kuebconfig配置文件中用户选项中的证书文件路径。 --client-key="": 设置kuebconfig配置文件中用户选项中的证书密钥路径。 --embed-certs=false: 设置kuebconfig配置文件中用户选项中的embed-certs开关。
四、配置context,?来组合cluster和credentials,即访问的集群的上下?。
kubectl config set-context --cluster=mycluster --user=jackhe --kubeconfig=/tmp/config
注意: 要对应上你新建的集群名字!!!
五、指定上下文切换到jackhe访问集群,我们能看到现在是没有任何权限的。
kubectl config use-context --kubeconfig=/tmp/config kubectl config view --kubeconfig=/tmp/config kubectl get pod --kubeconfig=/tmp/config
六、接下来我们基于RBAC建立只读ClusterRole文件(权限可配置)。
kubectl apply -f readonly.yaml
apiVersion: rbac.authorization.k8s.io/v1beta1 kind: ClusterRole metadata: name: cluster-readonly rules: - apiGroups: - "" resources: - pods - pods/attach - pods/exec - pods/portforward - pods/proxy verbs: - get - list - watch - apiGroups: - "" resources: - configmaps - endpoints - persistentvolumeclaims - replicationcontrollers - replicationcontrollers/scale - secrets - serviceaccounts - services - services/proxy verbs: - get - list - watch - apiGroups: - "" resources: - bindings - events - limitranges - namespaces/status - pods/log - pods/status - replicationcontrollers/status - resourcequotas - resourcequotas/status verbs: - get - list - watch - apiGroups: - "" resources: - namespaces verbs: - get - list - watch - apiGroups: - apps resources: - deployments - deployments/rollback - deployments/scale - statefulsets verbs: - get - list - watch - apiGroups: - autoscaling resources: - horizontalpodautoscalers verbs: - get - list - watch - apiGroups: - batch resources: - cronjobs - jobs - scheduledjobs verbs: - get - list - watch - apiGroups: - extensions resources: - daemonsets - deployments - ingresses - replicasets verbs: - get - list - watch
七、创建基于用户jackhe的ClusterRoleBinding文件。
kubectl apply -f readonly.yaml
apiVersion: rbac.authorization.k8s.io/v1beta1 kind: ClusterRoleBinding metadata: name: cluster-readonly roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-readonly subjects: - apiGroup: rbac.authorization.k8s.io kind: User name: jackhe
八、我们这时再测试已经有了只读权限。
kubectl get pod --kubeconfig=/tmp/config
九、大功告成,接下来我们只要把/tmp/config文件放到用户的家目录.kube下就可以使用了。
mkdir -p /home/jackhe/.kube cp /tmp/config /home/jackhe/.kube/ chown -R jackhe.jackhe /home/jackhe/.kube/
OS切换到jackhe用户,我们能看到只有只读权限,也无法 上下文切换到 ,因为配置文件里并没有相关信息。哈哈,还想删库跑路!!!