kubernetes(k8s) 学习 (十三) k8s的访问控制(认证+授权+准入控制)

访问控制的简介

API Server——Kubernetes网关

API为Kubernetes各类资源对象(如节点、标签、Pod、服务、部署、secrets、configmaps以及ingress等)提供访问接口。这些资源对象通过简单的REST API执行基本的CRUD(增删改查)操作。

Kubernetes的核心构建块之一是API Server,它作为Kubernetes的网关,是访问和管理资源对象的唯一入口。内部组件(如kubelet、调度程序和控制器)通过API Server访问API以进行编排和协调。分布式键/值数据库、etcd只能通过API Server访问。

客户端的认证操作是由api server配置的一到多个认证插件完成,授权操作由一到多个授权插件进行,而通过授权检测的用户所请求的相关操作还要经由一到多个准入控制插件的遍历检测

在这里插入图片描述

在这里插入图片描述通常我们可以通过命令行工具kubectl来与API Server进行交互。从kubectl发送的任何内容最终都会被API Server所接收。因此,多个工具和插件会直接或间接地使用相同的API。

即使在Kubernetes集群中访问或者操作对象之前,该请求也需要由API Server进行身份验证。REST路径使用基于X.509证书的TLS协议来保护和加密流量。Kubectl在编码和发送请求之前查找文件〜/ .kube / config以检索CA证书和客户端证书。

k8s访问控制
在这里插入图片描述

访问控制三部曲

Authentication(认证)
认证方式现共有8种,可以启用一种或多种认证方式,只要有一种认证方式通过,就不再进行其它方式的认证。
通常启用X509 Client Certs和Service Accout Tokens两种认证方式。

Kubernetes集群有两类用户:由Kubernetes管理的Service Accounts (服务账户)和(Users Accounts) 普通账户。
k8s中账号的概念不是我们理解的账号,它并不真的存在,它只是形式上存在。

Authorization(授权)
必须经过认证阶段,才到授权请求,根据所有授权策略匹配请求资源属性,决定允许或拒绝请求。授权方式现共有6种,AlwaysDeny、AlwaysAllow、ABAC、RBAC、Webhook、Node。默认集群强制开启RBAC。

Admission Control(准入控制)
用于拦截请求的一种方式,运行在认证、授权之后,是权限认证链上的最后一环,对请求API资源对象进行修改和校验。

访问k8s的API Server的客户端主要分为两类:

kubectl :用户家目录中的 .kube/config 里面保存了客户端访问API Server的
密钥相关信息,这样当用kubectl访问k8s时,它就会自动读取该配置文件,
向API Server发起认证,然后完成操作请求。

pod:Pod中的进程需要访问API Server,如果是人去访问或编写的脚本去访问,
这类访问使用的账号为:UserAccount;
而Pod自身去连接API Server时,使用的账号是:ServiceAccount,
生产中后者使用居多

kubectl向apiserver发起的命令,采用的是http方式,其实就是对URL发起增删改查的操作。

$ kubectl  proxy --port=8888 &
$ curl http://localhost:8888/api/v1/namespaces/default
$ curl http://localhost:8888/apis/apps/v1/namespaces/default/deployments

以上两种api的区别是:

api它是一个特殊链接,只有在核心v1群组中的对象才能使用。
apis 它是一般API访问的入口固定格式名。

1.在这里插入图片描述在这里插入图片描述在这里插入图片描述2.在这里插入图片描述3.在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

创建serviceaccount

UserAccount与serviceaccount

用户账户是针对人而言的。
服务账户是针对运行在 pod 中的进程而言的。
用户账户是全局性的。 其名称在集群各 namespace 中都是全局唯一的,
未来的用户资源不会做 namespace 隔离, 服务账户是 namespace 隔离的。

通常情况下,集群的用户账户可能会从企业数据库进行同步,其创建需要特殊权限,并且涉及到复杂的业务流程。 服务账户创建的目的是为了更轻量,允许集群用户为了具体的任务创建服务账户 ( 即权限最小化原则 )。

创建serviceaccount:
$ kubectl create serviceaccount admin
serviceaccount/admin created
  
$ kubectl describe sa admin             //此时k8s为用户自动生成认证信息,但没有授权
Name:                admin
Namespace:           default
Labels:              <none>
Annotations:         <none>
Image pull secrets:  <none>
Mountable secrets:   admin-token-6xfpp
Tokens:              admin-token-6xfpp
Events:              <none>

1.在这里插入图片描述在这里插入图片描述

添加secrets到serviceaccount中:
$ kubectl patch serviceaccount admin -p '{"imagePullSecrets": [{"name": "myregistrykey"}]}'

把serviceaccount和pod绑定起来:
apiVersion: v1
kind: Pod
metadata:
  name: myapp
   labels:
    app: myapp
spec:
  containers:
  - name: myapp
    image: reg.westos.org/westos/game2048
    ports:
    - name: http
      containerPort: 80
  serviceAccountName: admin

在这里插入图片描述在这里插入图片描述
注意:将认证信息添加到serviceAccount中,要比直接在Pod指定imagePullSecrets要安全很多。

1.在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

创建UserAccount

认证的实现

# cd /etc/kubernetes/pki/
# openssl genrsa -out test.key 2048
# openssl req -new -key test.key -out test.csr -subj "/CN=test"
# openssl  x509 -req -in test.csr -CA ca.crt -CAkey ca.key  -CAcreateserial -out test.crt -days 365
# openssl x509 -in test.crt -text -noout

$ kubectl config set-credentials test --client-certificate=/etc/kubernetes/pki/test.crt --client-key=/etc/kubernetes/pki/test.key --embed-certs=true	
$ kubectl  config view
$ kubectl config set-context test@kubernetes --cluster=kubernetes --user=test
$ kubectl config use-context test@kubernetes`在这里插入代码片`

$ $ kubectl  get pod
Error from server (Forbidden): pods is forbidden: User "test" cannot list resource "pods" in API group "" in the namespace "default"

此时用户通过认证,但还没有权限操作集群资源,需要继续添加授权。

创建用户并进行认证:创建用户时需要在root用户下进行

1.在这里插入图片描述在这里插入图片描述2.在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述3.切换至kubeadm用户
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述发现没有权限,显示的是权限禁止

在这里插入图片描述在这里插入图片描述

RBAC 授权的实现

RBAC(Role Based Access Control):基于角色访问控制授权。

允许管理员通过Kubernetes API动态配置授权策略。
RBAC就是用户通过角色与权限进行关联。
RBAC只有授权,没有拒绝授权,所以只需要定义允许该用户做什么即可。

RBAC包括四种类型:Role、ClusterRole、RoleBinding、ClusterRoleBinding。

需要理解 RBAC 一些基础的概念和思路,RBAC 是让用户能够访问 Kubernetes API 资源的授权方式
在这里插入图片描述

在 RBAC 中定义了两个对象,用于描述在用户和资源之间的连接权限。
角色

角色是一系列的权限的集合,例如一个角色可以包含读取 Pod 的权限和列出 Pod 的权限, ClusterRole 跟 Role 类似,但是可以在集群中到处使用( Role 是 namespace 一级的)。
角色绑定

RoleBinding 把角色映射到用户,从而让这些用户继承角色在 namespace 中的权限。ClusterRoleBinding 让用户继承 ClusterRole 在整个集群中的权限。

在这里插入图片描述
在这里插入图片描述
RBAC的三个基本概念:

Subject:被作用者,它表示k8s中的三类主体, user, group, serviceAccount
Role:角色,它其实是一组规则,定义了一组对 Kubernetes API 对象的操作权限。
RoleBinding:定义了“被作用者”和“角色”的绑定关系。

Role 和 ClusterRole

Role是一系列的权限的集合,Role只能授予单个namespace 中资源的访问权限。
ClusterRole 跟 Role 类似,但是可以在集群中全局使用。

Role示例:

kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  namespace: default
  name: myrole
rules:
- apiGroups: [""] 
  resources: ["pods"]
  verbs: ["get", "watch", "list", "create", "update", "patch", "delete"]

RoleBinding和ClusterRoleBinding
RoleBinding是将Role中定义的权限授予给用户或用户组。
它包含一个subjects列表(users,groups ,service accounts),并引用该Role。
RoleBinding是对某个namespace 内授权,ClusterRoleBinding适用在集群范围内使用。

RoleBinding示例:
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: test-read-pods
  namespace: default
subjects:
- kind: User
  name: test
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: myrole
  apiGroup: rbac.authorization.k8s.io

1.创建角色
在这里插入图片描述在这里插入图片描述2.将角色绑定给test用户
在这里插入图片描述在这里插入图片描述在这里插入图片描述3.再次切换至test
在这里插入图片描述在这里插入图片描述

ClusterRole示例

kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: myclusterrole
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "watch", "list", "delete", "create", "update"]
- apiGroups: ["extensions", "apps"]
  resources: ["deployments"]
  verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]

使用rolebinding绑定clusterRole:

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: rolebind-myclusterrole
  namespace:  default
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: myclusterrole
subjects:
- apiGroup: rbac.authorization.k8s.io
  kind: User
  name: test

创建clusterrolebinding:

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: clusterrolebinding-myclusterrole
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: myclusterrole
subjects:
- apiGroup: rbac.authorization.k8s.io
  kind: User
  name: test

1.在这里插入图片描述2.解决的问题:
在这里插入图片描述3.创建集群角色
在这里插入图片描述在这里插入图片描述4。创建集群角色绑定
在这里插入图片描述在这里插入图片描述当切换至test用户时
在这里插入图片描述在这里插入图片描述在这里插入图片描述

服务账户的自动化

服务账户准入控制器(Service account admission controller)
如果该 pod 没有 ServiceAccount 设置,将其 ServiceAccount 设为 default。
保证 pod 所关联的 ServiceAccount 存在,否则拒绝该 pod。
如果 pod 不包含 ImagePullSecrets 设置,那么 将 ServiceAccount 中的 ImagePullSecrets 信息添加到 pod 中。
将一个包含用于 API 访问的 token 的 volume 添加到 pod 中。
将挂载于 /var/run/secrets/kubernetes.io/serviceaccount 的 volumeSource 添加到 pod 下的每个容器中。

Token 控制器(Token controller)
检测服务账户的创建,并且创建相应的 Secret 以支持 API 访问。
检测服务账户的删除,并且删除所有相应的服务账户 Token Secret。
检测 Secret 的增加,保证相应的服务账户存在,如有需要,为 Secret 增加 token。
检测 Secret 的删除,如有需要,从相应的服务账户中移除引用。

服务账户控制器(Service account controller)
服务账户管理器管理各命名空间下的服务账户,并且保证每个活跃的命名空间下存在一个名为 “default” 的服务账户

Kubernetes 还拥有“用户组”(Group)的概念:
ServiceAccount对应内置“用户”的名字是:
system:serviceaccount:<ServiceAccount名字 >

而用户组所对应的内置名字是:
system:serviceaccounts:<Namespace名字 >


示例1:表示mynamespace中的所有ServiceAccount
subjects:
- kind: Group
  name: system:serviceaccounts:mynamespace
  apiGroup: rbac.authorization.k8s.io

示例2:表示整个系统中的所有ServiceAccount
subjects:
- kind: Group
  name: system:serviceaccounts
  apiGroup: rbac.authorization.k8s.io

Kubernetes 还提供了四个预先定义好的 ClusterRole 来供用户直接使用:

cluster-amdin
admin
edit
view
示例:(最佳实践)
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: readonly-default
subjects:
- kind: ServiceAccount
  name: default
  namespace: default
roleRef:
  kind: ClusterRole
  name: view
  apiGroup: rbac.authorization.k8s.io
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值