k8s之安全机制

k8s之安全机制

写在前面:

API Server是集群内部各个组件通信的中介,也是外部控制的入口,因此k8s的安全机制是围绕API Server设计的,k8s使用了认证(Authentication)、鉴权(Authorization)、准入控制(Admission Control)来保证API Server的安全。

认证

认证的目的是身份鉴别,只有正确的账号才能通过认证。

k8s集群的认证方式:

HTTP Base认证,通过用户名+密码的方式认证(安全性最低)

这种方式是将用户名+密码的方式通过BASE64位算法加密,放在HTTP请求头中,发送给服务端,服务端收到请求以后,进行解码。获取用户名密码,然后进行比对。

HTTP Token认证:通过Token进行认证(安全性次之)

给每一个客户端创建一个token,这个token用密码学的角度来说,就是难以破解的一串长的字符串。当客户端发送请求时,需要将token放在HTTP请求头里面,Api Server接到Token以后,会与服务器保存的token进行比对。

HTTPS双向认证:基于ca根证书签名的双向数字证书进行认证(默认的认证方式,安全性最高)

认证的对象:

user:对于k8s集群而言,没有自己的用户管理,用户的创建需要在linux平台完成。举例:通常root用户部署k8s集群,root能操作k8s集群资源,但是其他普通用户不能操作k8s集群资源,需要先经过认证。

group:一组用户的集合,同上。

serviceaccount:pod中的容器与内外的通信都要与apiserver交互,认证是需要证书的,但是pod的创建与销毁是动态的,随机的。无法预测的行为自然不能手动创建证书。使用serviceaccount解决pod访问apiserver的问题。默认情况下,每一个namespace都会有一个serviceaccount,如果pod在创建时,没有指定serviceaccount,默认使用pod所属名称空间的serviceaccount。

认证策略

Alwaysdeny:拒绝所有请求,一般用于测试

Alwaysallow:如果集群不需要鉴权,可以使用该策略

ABAC:基于属性的权限控制,使用用户定义的授权规则,对用户的请求进行匹配与控制

WebBook:通过外部REST服务对用户进行授权

RBAC:基于角色的权限控制,kubeadm方式部署集群默认使用的方式。

鉴权

鉴权的目的在于,用户通过身份认证以后,与事先定义的策略进行匹配,判断什么对象,对何种资源,有什么操作权限(比如查看、删除)。k8s中将对一组资源的权限定义为角色,通过对象与角色的绑定实现权限控制。为了将角色与权限更好的绑定,k8s定义了下面四个资源对象 :Role、ClusterRole、RoleBinding、ClusterRoleBinding

Role及ClusterRole的使用

role及clusterrole是一组权限的集合,这些权限是白名单的形式,即你定义了什么权限就有什么权限,没有定义就没有。role用于在某个命名空间设置访问权限,只神对某个空间,创建role时必须指明该role所属的命名空间

clusterrole用于在所有命名空间设置访问权限,也即是在整个集群范围内都有效。

RoleBinding及ClusterRoleBinding的使用

rolebinding可以绑定同命令空间的role或者全局的clusterrole,clusterrolebinding只能绑定全局的clusterrole。

准入控制

用于补充鉴权实现更加精确的权限控制。

经过认证与授权以后,还需要经过准入控制通过以后,apiserver才会处理这个请求。准入控制是一个可配置的控制器列表,可以通过在apiserver上通过命令设置选择执行哪些准入控制器。只有当所有的准入控制器都检查通过以后,apiserver才执行该请求,否则拒绝。常见的准入控制如下。

AlwaysAdmit, AlwaysDeny, AlwaysPullImages, DefaultStorageClass, DenyEscalatingExec, DenyExecOnPrivileged, ImagePolicyWebhook, InitialResources, LimitPodHardAntiAffinityTopology, LimitRanger, NamespaceAutoProvision, NamespaceExists, NamespaceLifecycle, OwnerReferencesPermissionEnforcement, PersistentVolumeLabel, PodNodeSelector, PodSecurityPolicy, ResourceQuota, SecurityContextDeny, ServiceAccount. (default "AlwaysAdmit")

可配置的准入控制如下

AlwaysAdmi:允许所有请求

AlwaysDeny:禁止所有请求

AlwaysPullImages:启动容器之前总是下载镜像

DenyExecOnPrivileged:拦截所有在privileged container上执行命令的请求

ImagePolicyWebhook:这个插件允许后端的一个webhook程序来完成准入控制的功能

ServiceAccount:实现了serviceaccount的自动化

SecurityContextDeny:这个插件将使用securitycontext的pod中的定义全部失效。

resourcequota:用于资源配额管理,观察所有请求,确保namespace上的配额不会超标

LimitRanger:用于资源限制管理,作用于命名空间,确保对pod进行资源限制。

更多的准入控制插件可以在下面网址查看文档。

https://kubernetes.io/docs/admin/admission-controllers/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值