介绍 RBAC 授权插件

REST 客户端发送 GET、 POST、 PUT、 DELETE 和其他类型的 HTTP 请求到特定的 URL 路径上,这些路径表示特定的 REST 资源。在 Kubernetes 中,这些资源是 Pod、 Service、 Secret,等等。 以下是 Kubernetes 请求动作的一些例子

  • 获取 pod
  • 创建服务
  • 更新密钥

这些动词(get、 create、 update)映射到客户端请求的 HTTP 方法(GET、 POST、 PUT)上
image.png
Kubernetes有一个很基本的特性就是它的所有资源对象都是模型化的 API 对象,允许执行 CRUD(Create、Read、Update、Delete)操作(也就是我们常说的增、删、改、查操作),比如下面的这下资源:

  • Pods
  • ConfigMaps
  • Deployments
  • Nodes
  • Secrets
  • Namespaces

上面这些资源对象的可能存在的操作有:

  • create
  • get
  • delete
  • list
  • update
  • edit
  • watch
  • exec

RBAC 授权规则是通过四种资源来进行配置的,它们可以分为两个组:

  • Role(角色)和 ClusterRole ( 集群角色),它们指定了在资源上可以执行哪些 动词。
  • RoleBinding (角色绑定)和 ClusterRoleBinding (集群角色绑定),它们将上 述角色绑定到特定的用户、组或 ServiceAccounts 上。

角色定义了可以做什么操作,而绑定定义了谁可以做这些操作
image.png

image.png

使用RBAC

创建ns和pod

创建命名空间和运行 pod 创建一个在命名空间 foo 中的 pod 和另一个在命名空间 bar 中的 pod

  1. kubectl create ns foo
  2. kubectl run --generator=run-pod/v1 test-foo --image=luksa/kubectl-proxy -n foo
  3. kubectl create ns bar
  4. kubectl run --generator=run-pod/v1 test-bar --image=luksa/kubectl-proxy -n bar

image.png

查看权限

为了验证 RBAC 是否己经开启并且阻止 pod 读取集群状态,可以使用 curl 命令来列 出 foo 命名空间中的服务
由于没对foo中的serviceaccount设置权限,所以看不到资源

kubectl exec -it -n foo test-foo-5c6b49464c-wd685  curl localhost:8001/api/v1/namespaces/foo/services

image.png

使用 Role 和 RoleBinding

image.png
image.png

cat > foo-reader-role.yaml << EOF
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: foo-reader
  namespace: foo
rules:
- apiGroups: ["", "extensions", "apps"]
  resources: ["services"]
  verbs: ["get", "list"]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: foo-reader-rolebinding
  namespace: foo
subjects:
- kind: ServiceAccount
  name: default
  namespace: foo
roleRef:
  kind: Role
  name: foo-reader
  apiGroup: rbac.authorization.k8s.io
EOF

image.png
现在有权访问了,但是资源为空
image.png

在角色绑定中使用其他命名空间的 ServiceAccount

bar中的pod直接访问foo中的service

kubectl exec -it -n bar test-bar-bcdd89499-87d2n  curl localhost:8001/api/v1/namespaces/foo/services

image.png

在rolebinding中添加bar的serveraccount

kubectl edit -n foo rolebinding foo-reader-rolebinding

image.png

在 foo 命名空间中有一个 RoleBinding,它引用foo中的role角色,并且绑定 foo 和 bar 命名空间中的default ServiceAccount
image.png

image.png

使用 ClusterRole 和 ClusterRoleBinding

ClusterRole 允许集群级别的资源访问
没有权限前

kubectl exec -it -n bar test-bar-bcdd89499-87d2n  curl localhost:8001/api/v1/persistentvolumes

image.png

cat > pv-reader.yaml << EOF
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole 
metadata: 
  name: pv-reader
rules:
- apiGroups: ["", "extensions", "apps"]
  resources: ["persistentvolumes"]
  verbs: ["get", "list"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: pv-reader
subjects:
- kind: ServiceAccount
  name: default
  namespace: bar
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: pv-reader
EOF

image.png

授权后就能访问了
image.png

image.png

RBAC web工具

部署permission-manager

官网链接:https://github.com/sighupio/permission-manager

unzip permission-manager-master.zip

部署依赖

kubectl apply -f permission-manager-master/k8s/k8s-seeds/namespace.yml
kubectl apply -f permission-manager-master/k8s/k8s-seeds/

image.png

  • 修改 Deploy 必填 Env 参数 | Env 名称 | 描述 | | —- | —- | | PORT | 服务器暴露的端口 | | CLUSTER_NAME | 在生成kubeconfig文件中使用的集群名称 | | CONTROL_PLANE_ADDRESS | 在生成kubeconfig文件中的k8s api 地址 | | BASIC_AUTH_PASSWORD | WEB UI 登陆密码(默认用户名为 admin) |
kubectl config show

image.png

vim permission-manager-master/k8s/deploy.yaml

image.png

kubectl apply -f permission-manager-master/k8s/deploy.yaml

image.png

image.png

访问web,nortport为32260
账号admin 密码1v2d1e2e67dS
image.png
新建一个用户,只能访问bar的namespace下内容
image.png

image.png

image.png

编辑配置文件
image.png
image.png
切换context

kubectl config get-contexts

image.png

kubectl config use-context kubernetes

只能访问bar的namespace下内容
image.png