简介
api server 是集群访问控制的统一入口
k8s认证过程: 认证 -> 授权 - > 准入控制 (adminationcontroller)
1 认证()是对客户端的认证,简单说就是账户密码
2 授权()是资源的授权,容器、网络、存储资源的权限
3 准入机制
准入控制器位于api server ,在对象被持久化之前,准入控制器拦截对api server 的请求,一般用来做认证和授权。其中包括连个控制器:
准入控制是api server 启动时参数配置。一个准入控制器可以属于以上两者中的一种,也可能两者都属于。当请求到达 API Server 的时候首先执行变更准入控制,然后再执行验证准入控 制。
1 认证
认证支持多种插件
1 令牌认证
客户端和服务端使用共享秘钥,认证信息经由http协议认证头部进行传递。
2 ssl 认证
通过ca签发的证书,完成客户端与服务端的认证
进入pod可以查看pod中的secret
创建一个serviceaccount:
# 通过命令可以直接创建:
kubectl create serviceaccount 服务账户名称
通过查看sa详情,可以发现它属于default命名空间, 自动生成一个token
kubeconfig 文件
用户对资源访问需要通过apiserver进行通讯认证才能进行访问,此机制可以通过token,也可以通过配置文件
# 查看config文件
kubectl config view
# 展示信息
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: DATA+OMITTED
# apiserver 的地址
server: https://192.168.241.191:6443
# 集群的名字
name: kubernetes
contexts:
- context:
cluster: kubernetes
namespace: default
user: kubernetes-admin
# 上下文的名字
name: kubernetes-admin@kubernetes
# 当前上下文的名字
current-context: kubernetes-admin@kubernetes
kind: Config
preferences: {}
users:
- name: kubernetes-admin
user:
client-certificate-data: REDACTED
client-key-data: REDACTED
2 授权
3 准入控制
RBAC 认证授权策略
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: role1
# 指定所属名称空间
namespace: dev
rules:
# 支持的 API 组列表,例如:"apiVersion: batch/v1"等
- apiGroups: [""]
# 资源类型
resources: ["pods"]
# 具体资源名,空代表所有
resourceNames: []
# 操作权限
verbs: ["get","list","watch"]
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: clusterrole1
rules:
- apiGroups: [""]
resources: ["secrets"]
resourceNames: []
verbs: ["get","list","watch"]
# 将在dev 命名空间中把 role1 角色授予用户 test
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: role-binding
namespace: dev
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: role1
subjects:
- kind: User
name: test
apiGroup: rbac.authorization.k8s.io
绑定集群角色文章来源:https://www.toymoban.com/news/detail-477321.html
# 通过绑定集群角色cluster-admin,对dev空间有完全权限
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: clusterrole-binding
namespace: dev
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: User
name: all-test
apiGroup: rbac.authorization.k8s.io
使用 RBAC 鉴权 | Kubernetes文章来源地址https://www.toymoban.com/news/detail-477321.html
限制不同的用户操作 k8s 集群
# ssl 认证 生成一个证书
# (1)生成一个私钥
cd /etc/kubernetes/pki/
umask 077; openssl genrsa -out lucky.key 2048
# (2)生成一个证书请求
openssl req -new -key lucky.key -out lucky.csr -subj "/CN=lucky"
# (3)生成一个证书
openssl x509 -req -in lucky.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out lucky.crt -days 3650
# 在 kubeconfig 下新增加一个 lucky 这个用户
# (1)把 lucky 这个用户添加到 kubernetes 集群中,可以用来认证 apiserver 的连接
kubectl config set-credentials lucky --client-certificate=./lucky.crt --client-key=./lucky.key --embed-certs=true
# (2)在 kubeconfig 下新增加一个 lucky 这个账号
kubectl config set-context lucky@kubernetes --cluster=kubernetes --user=lucky
# (3)切换账号到 lucky,默认没有任何权限
kubectl config use-context lucky@kubernetes
# 通过这个命令切换回集群用户
kubectl config use-context kubernetes-admin@kubernetes
# 把 user 这个用户通过 rolebinding 绑定到 clusterrole 上,授予权限,权限只是在 lucky 这个名称空间有效
# (1)把 lucky 这个用户通过 rolebinding 绑定到 clusterrole 上
kubectl create ns lucky
kubectl create rolebinding lucky -n lucky --clusterrole=cluster-admin --user=lucky
# (2)切换到 lucky 这个用户
kubectl config use-context lucky@kubernetes
# (3)测试是否有权限
kubectl get pods -n lucky
# 有权限操作这个lucky名称空间 没有权限操作其他名称空间
kubectl get pods
# 添加一个 lucky 的普通用户
useradd lucky
# 要删除config文件中kubernetes-admin@kubernetes的信息,不然还可以通过切换用户使用admin用户
cp -ar /root/.kube/ /home/lucky/
chown -R lucky.lucky /home/lucky/
su - lucky
kubectl get pods -n lucky
到了这里,关于k8s - 安全认证(RBAC)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!