Kubernetes学习笔记(4)-安全认证与DashBoard使用

安全认证

简介

Kubernetes作为一个分布式集群的管理工具,保证集群的安全性是其一个重要的任务。Kubernetes通过对各种使用它服务的客户端进行认证和鉴权,以此来保证集群的安全性。

在Kubernetes集群中,客户端通常分为两类:

  • User Account:一般是独立于Kubernetes之外的其他服务管理的用户账号。
  • Service Account:Kubernetes管理的账号,用于为Pod中的服务进程在访问Kubernetes时提供身份标识。

在Kubernetes中,ApiServer是访问及管理资源对象的唯一入口。任何一个请求访问ApiServer,都要经过下面三个流程:

  • Authentication(认证):身份鉴别,只有正确的账号才能够通过认证
  • Authorization(鉴权): 判断用户是否有权限对访问的资源执行特定的动作
  • Admission Control(准入控制):用于补充授权机制以实现更加精细的访问控制功能

认证管理

Kubernetes集群安全的关键点在于如何识别并认证客户端身份,它提供了三种客户端身份认证方式:

  • HTTP Base认证:通过用户名+密码的方式认证
  • HTTP Token认证:通过一个Token来识别合法用户
  • HTTPS证书认证:基于CA根证书签名的双向数字证书认证方式

Kubernetes允许同时配置多种认证方式,只要其中任意一个方式认证通过即可。

鉴权管理

认证管理用于明确用户的身份,接下来的鉴权管理则用于判断某个用户是否有某种权限。

每个发送到ApiServer的请求都带上了用户和资源的信息:比如发送请求的用户、请求的路径、请求的动作等,授权就是根据这些信息和授权策略进行比较,如果符合策略,则认为授权通过,否则会返回错误。

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

  • AlwaysDeny:表示拒绝所有请求,一般用于测试
  • AlwaysAllow:允许接收所有请求,相当于集群不需要授权流程(Kubernetes默认的策略)
  • ABAC:基于属性的访问控制,表示使用用户配置的授权规则对用户请求进行匹配和控制
  • Webhook:通过调用外部REST服务对用户进行授权
  • Node:是一种专用模式,用于对kubelet发出的请求进行访问控制
  • RBAC:基于Role的访问控制(kubeadm安装方式下的默认选项)

在RBAC(Role-Based Access Control)中会涉及如下概念:

  • 用户:包括User、Groups、ServiceAccount
  • Role:代表着一组定义在资源上的可操作动作的集合,简单来说就是某种权限
  • 绑定Binding:将定义好的Role跟用户绑定在一起,即授予用户某种权限

在Kubernete中存在与RBAC相关的顶级Resource对象,都可以通过yaml配置文件进行资源的创建和修改:

  • Role、ClusterRole:用于指定一组权限
  • RoleBinding、ClusterRoleBinding:用于将角色(权限)赋予给对象

资源的定义提高了可复用性,例如一些同类用户具有相同的权限,此时在进行权限赋予的时候就可以直接复用同一个Role Resource。

准入控制

来自客户端的请求在通过了前面的认证和授权之后,还需要经过准入控制处理,ApiServer才会进行处理。准入控制是一个可配置的控制器列表,可以通过在ApiServer上通过命令行设置选择执行哪些准入控制器。

只有当所有的准入控制器都检查通过之后,ApiServer才会执行该请求,否则返回拒绝。当前可配置的Admission Control准入控制如下:

  • AlwaysAdmit:允许所有请求
  • AlwaysDeny:禁止所有请求,一般用于测试
  • AlwaysPullImages:在启动容器之前总去下载镜像
  • DenyExecOnPrivileged:它会拦截所有想在Privileged Container上执行命令的请求
  • ImagePolicyWebhook:该插件将允许后端的一个Webhook程序来完成Admission Controller的功能
  • Service Account:使用ServiceAccount实现了自动化
  • SecurityContextDeny:这个插件将使用SecurityContext的Pod中的定义全部失效
  • ResourceQuota:用于资源配额管理目的,观察所有请求,确保在namespace上的配额不会超标
  • LimitRanger:用于资源限制管理,作用于namespace上,确保对Pod进行资源限制
  • InitialResources:为未设置资源请求与限制的Pod,根据其镜像的历史资源的使用情况进行设置
  • NamespaceLifecycle:如果尝试在一个不存在的namespace中创建资源对象,则该创建请求将被拒绝。当删除一个namespace时,系统将会删除该namespace中所有对象
  • DefaultStorageClass:为了实现共享存储的动态供应,为未指定StorageClass或PV的PVC尝试匹配默认的StorageClass,尽可能减少用户在申请PVC时所需了解的后端存储细节
  • DefaultTolerationSeconds:这个插件为那些没有设置forgiveness tolerations并具有notready:NoExecute和unreachable:NoExecute两种taints的Pod设置默认的“容忍”时间,为5min
  • PodSecurityPolicy:这个插件用于在创建或修改Pod时决定是否根据Pod的security context和可用的PodSecurityPolicy对Pod的安全策略进行控制

DashBoard

命令行工具kubectl提供了几乎所有操作Kubernetes集群的功能,但是操作门槛还是有些高。因此,为了提供更丰富的用户体验,Kubernetes还开发了一个基于Web的DashBoard,用户可以使用Dashboard来部署容器化的应用,监控应用的状态,执行故障排查以及管理Kubernetes中各种资源等。官方DashBoard的项目地址为kubernetes/dashboard: General-purpose web UI for Kubernetes clusters。下面简单介绍这个DashBoard的使用方式。

首先需要从官网下载配置文件recommended.yaml,这里面描述了DashBoard运行所需的资源。实际上DashBoard整体也是一个运行在Kubernetes集群中的服务,需要各种Resource的支持。

1
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml

得到配置文件之后,我们需要进行一些修改。主要修改的是其中名为kubernetes-dashboard的Service,修改内容为增加下面具有注释的两行。因为默认情况下该Service的type为ClusterIP,无法在集群外访问,因此这里需要将其改为NodePort,同时完成端口映射。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
kind: Service
apiVersion: v1
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kubernetes-dashboard
spec:
type: NodePort # change to NodePort
ports:
- port: 443
targetPort: 8443
nodePort: 30009 # expose nodePort
selector:
k8s-app: kubernetes-dashboard

之后,可以运行apply命令生成相关资源。可以发现所有资源都位于kubernetes-dashboard名称空间下。

1
kubectl apply -f recommended.yaml

此时我们已经可以访问https://localhost:30009/来进入DashBoard,不过此时它会提示我们输入Token。因此我们还需要创建相关User,获取Token。下面的步骤均参考官方文档:dashboard/docs/user/access-control/creating-sample-user.md at master · kubernetes/dashboard

首先我们需要创建一个用户admin-user,并为其赋予相关的权限。这两个动作对应Kubernetes中的两个Resource,因此准备如下配置文件,这里命名为admin-user.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kubernetes-dashboard

---

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kubernetes-dashboard

之后利用apply命令创建资源,这样就可以创建出admin-user用户并且为其授予权限。

1
kubectl apply -f admin-user.yaml

然后利用下面的命令生成Token:

1
kubectl create token admin-user -n kubernetes-dashboard

该命令会在控制台上输出一长串字符串,即Token。访问https://localhost:30009/,在登录页面上输入获取的Token,即可登录成功。


Kubernetes学习笔记(4)-安全认证与DashBoard使用
http://example.com/2023/08/01/Kubernetes学习笔记-4-安全认证与DashBoard使用/
作者
EverNorif
发布于
2023年8月1日
许可协议