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设置默认的“容忍”时间,为5minPodSecurityPolicy
:这个插件用于在创建或修改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 |
|
得到配置文件之后,我们需要进行一些修改。主要修改的是其中名为kubernetes-dashboard的Service,修改内容为增加下面具有注释的两行。因为默认情况下该Service的type为ClusterIP,无法在集群外访问,因此这里需要将其改为NodePort,同时完成端口映射。
1 |
|
之后,可以运行apply命令生成相关资源。可以发现所有资源都位于kubernetes-dashboard
名称空间下。
1 |
|
此时我们已经可以访问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 |
|
之后利用apply命令创建资源,这样就可以创建出admin-user用户并且为其授予权限。
1 |
|
然后利用下面的命令生成Token:
1 |
|
该命令会在控制台上输出一长串字符串,即Token。访问https://localhost:30009/
,在登录页面上输入获取的Token,即可登录成功。