当前位置: 首页 > 科技观察

Kubernetes身份认证和授权操作全攻略:K8s 访问控制入门

时间:2023-03-11 23:02:56 科技观察

Kubernetes认证授权全攻略:K8s访问控制入门程序等Kubernetes的关键概念都非常熟悉。对于生产部署,Kubernetes安全性至关重要。因此,有必要了解平台如何管理用户和应用程序的身份验证和授权。我们将推出系列文章,从实用的角度来理解平台内Kubernetes和Pod外用户的认证授权。我还解释了如何使用角色和角色绑定来允许或限制资源访问。APIServer——KubernetesGatewayAPI为各种Kubernetes资源对象(如节点、标签、Pod、服务、部署、秘密、配置映射和入口等)提供访问接口。这些资源对象通过简单的RESTAPI执行基本的CRUD(创建、删除、修改、查询)操作。APIServer是Kubernetes的核心构建块之一,它是Kubernetes的网关,是访问和管理资源对象的唯一入口。kubelets、调度程序和控制器等内部组件通过APIServer访问API以进行编排和协调。分布式key/value数据库,etcd只能通过APIServer访问。通常我们可以通过命令行工具kubectl与APIServer进行交互。从kubectl发送的任何内容最终都会被API服务器接收。因此,多个工具和插件直接或间接使用相同的API。即使在访问或操作Kubernetes集群中的对象之前,请求也需要通过APIServer进行身份验证。REST路径使用基于X.509证书的TLS协议来保护和加密流量。Kubectl在编码和发送请求之前查看文件~/.kube/config以检索CA证书和客户端证书。apiVersion:v1clusters:-cluster:certificate-authority:/Users/janakiramm/.minikube/ca.crtserver:https://192.168.99.100:8443name:minikubecontexts:-context:cluster:minikubeuser:minikubename:minikubecurrent-context:minikubekind:Configpreferences:{}users:-name:minikubeuser:client-certificate:/Users/janakiramm/.minikube/client.crtclient-key:/Users/janakiramm/.minikube/client.key文件ca.crt表示使用的CA证书集群,文件client.crt和client.key映射到用户minikube。Kubectl在上下文中使用这些证书和密钥对请求进行编码。可以通过curl命令访问APIServer吗?答案是肯定的。即使最常见的操作是通过运行kubectl代理来使用隧道协议,我们仍然可以通过计算机上可用的证书访问该路径。除了CA证书,我们还需要在标头中嵌入一个base64编码的令牌。如何从curl检索令牌和调用API如下所示:kubectlconfigview-ojsonpath='{"Clustername\tServer\n"}{range.clusters[*]}{.name}{"\t"}{.cluClusternameServerminikubehttps://192.168.99.100:8443exportCLUSTER_NAME="minikube"APISERVER=$(kubectlconfigview-ojsonpath="{.clusters[?(@.name==\"$CLUSTER_NAME\")].cluster.server}")下一个,一项重要任务是获取与默认服务帐户关联的令牌。不要担心这个实体,我们会在后面的文章中更好地理解它。TOKEN=$(kubectlgetsecrets-ojsonpath="{.items[?(@.metadata.annotations['kubernetes\.io/service-a现在我们有了调用curl的所有数据:curl-XGET\--cacert~/。minikube/ca.crt\--header"Authorization:Bearer$TOKEN"\$APISERVER/version三级Kubernetes访问控制上面提到,用户和Pod在访问或操作对象之前必须经过APIServer的鉴权。当有效请求被发送到APIServer,在被允许或拒绝之前会经过3个步骤。1.身份验证TLS连接一旦建立,请求就进入身份验证阶段。在这个阶段,请求的负载由一个或多个检查authenticator模块,认证模块由管理员在集群创建过程中配置,一个集群可能有多个认证模块配置,每个模块会依次尝试认证,直到其中一个成功,在主流的认证模块中会包含客户端证书,密码rds、普通令牌、引导程序令牌和JWT令牌(用于服务帐户)。使用客户端证书是默认情况,也是最常见的情况。请注意,Kubernetes没有用于对用户进行身份验证的典型用户数据库或配置文件。但它使用从X.509证书和令牌中提取的字符串,并将它们传递给身份验证模块。OpenID、Github甚至LDAP提供的外部身份验证机制可以通过身份验证模块之一与Kubernetes集成。2.授权API请求通过认证后,下一步就是确认是否允许操作。这是访问控制过程的第二步。对于一个请求的授权,Kubernetes主要关注三个方面——请求者的用户名、请求动作、动作影响的对象。用户名是从令牌中嵌入的标头中提取的,操作是映射到CRUD操作(例如GET、POST、PUT、DELETE)的HTTP动词之一,对象是有效的Kubernetes对象之一,例如吊舱或服务。Kubernetes的授权决策基于现有策略。默认情况下,Kubernetes遵循封闭和开放的概念,即访问资源需要明确的权限策略。与身份认证类似,授权也是基于一种或多种模块进行配置的,如ABAC方式、RBAC方式、Webhook方式等。当管理员创建集群时,他们配置与API服务器集成的授权模块。如果使用了多个模块,Kubernetes会检查每个模块,如果有任何模块授权请求,则请求被授权。如果所有模块都拒绝请求,则请求被拒绝(HTTP状态代码403)。当您使用默认配置的kubectl时,所有请求都会通过,因此此时您被视为集群管理员。但是当我们添加新用户时,默认情况下他们的访问权限将受到限制。3.准入控制通过准入控制是请求的最后一步。与前两步类似,准入控制也有很多模块。但与前两步不同的是,最后阶段可以修改目标对象。准入控制模块作用于对象创建、删除、更新和连接(代理)阶段,但不包括对象读取。例如,准入控制模块可用于修改创建持久卷声明(PVC)的请求,以使用特定的存储类。模块可以实现的另一种策略是在每次创建容器时拉取一个镜像。在此过程中,如果有任何准入控制模块拒绝,则立即拒绝该请求。一旦请求通过所有准入控制器,就会使用相应API对象的验证过程对其进行验证,然后写入对象存储。在本文的下一部分中,我们将更深入地了解如何创建用户并为他们配置身份验证。敬请期待~