k8s实现身份认证策略及过程解析

目录
  • 身份认证策略
  • API Server启用的身份认证机制
  • kubelet启用的身份认证机制
    • X.509数字证书认证
    • 静态令牌文件
    • Service Account令牌
    • OpenID Connect(OIDC)令牌
    • Webhook令牌认证
    • 身份认证代理
    • 静态令牌认证配置案例
      • 静态令牌认证的基础配置
      • 配置示例
  • X509 数字证书认证
    • 所有的证书
    • X509数字证书认证测试

身份认证策略

  • X.509客户端证书认证
  • 持有者令牌(bearer token)
    • 静态令牌文件(Static Token File)
    • Bootstrap令牌
    • Service Account令牌
    • OIDC(OpenID Connect)令牌
    • Webhook令牌
  • 身份认证代理(Authenticating Proxy)
  • 匿名请求

API Server启用的身份认证机制

基于认证插件支持多种认证方式,而相应认证插件的启用需要经 由kube-apiserver上的专用选项完成 kubeadm v1.26 部署的集群默认启用的认证机制如右图红框中的选 项,它们依次是

  • X509客户端证书认证
  • Bootstrap令牌认证
  • 身份认证代理
  • Service Account认证

注意:API Server并不保证各认证插件的生效次序与定义的次序相同

kubelet启用的身份认证机制

kubelet的REST API端点默认通过TCP协议的10250端口提供,支持管理操作

需要对客户端身份进行认证

  • 启用的身份认证

    • webhook
    • x509客户端证书认证
    • 注意:建议显式禁用匿名用户
  • API Server是该API端点的客户端,因此,kubelet需要在验证客户端身份时信任给API Server 颁发数字证书的CA

X.509数字证书认证

在双向TLS通信中,客户端持有数字证书,而API Server信任客户端证书的颁发者

  • 信任的CA,需要在kube-apiserver程序启动时,通过--client-ca-file选项传递
  • 认证通过后,客户端数字证书中的CN(Common Name)即被识别为用户名,而O(Organization)被识别为组名
  • kubeadm部署的Kubernetes集群,默认使用 /etc/kubernetes/pki/ca.crt 进行客户端认证
  • /etc/kubernetes/pki/ca.crt是kubeadm为Kubernetes各组件间颁发数字证书的CA

静态令牌文件

令牌信息保存于文本文件中 由kube-apiserver在启动时通过--token-auth-file选项加载 加载完成后的文件变动,仅能通过重启程序进行重载,因此,相关的令牌会长期有效 客户端在HTTP请求中,通过“Authorization Bearer TOKEN”标头附带令牌令牌以完成认证

Service Account令牌

  • 该认证方式将由kube-apiserver程序内置直接启用
  • 它借助于经过签名的Bearer Token来验证请求
    • 签名时使用的密钥可以由--service-account-key-file选项指定,也可以默认使用API Server的tls私钥
  • 用于将Pod认证到API Server之上,以支持集群内的进程与API Server通信
    • Kubernetes可使用ServiceAccount准入控制器自动为Pod关联ServiceAccount

OpenID Connect(OIDC)令牌

OAuth3认证机制,通常由底层的IaaS服务所提供

Webhook令牌认证

  • 是一种用于验证Bearer Token的回调机制
  • 能够扩展支持外部的认证服务,例如LDAP等

身份认证代理

  • 由kube-apiserver从请求报文的特定HTTP标头中识别用户身份,相应的标头名称可由特定的选项配置指定
  • kube-apiserver应该基于专用的CA来验证代理服务器身份

静态令牌认证配置案例

静态令牌认证的基础配置

  • 令牌信息保存于文本文件中

    • 文件格式为CSV,每行定义一个用户,由“令牌、用户名、用户ID和所属的用户组”四个字段组成,用户组为可选字段
    • 格式:token,user,uid,"group1,group2,group3"
  • 由kube-apiserver在启动时通过--token-auth-file选项加载
  • 加载完成后的文件变动,仅能通过重启程序进行重载,因此,相关的令牌会长期有效
  • 客户端在HTTP请求中,通过“Authorization Bearer TOKEN”标头附带令牌令牌以完成认证

配置示例

  • ① 生成token,命令:echo "(opensslrand−hex3).(openssl rand -hex 3).(opensslrand−hex3).(openssl rand -hex 8)"
  • ② 生成static token文件
  • ③ 配置kube-apiserver加载该静态令牌文件以启用相应的认证功能
  • ④ 测试,命令:curl -k -H "Authorization: Bearer TOKEN" -k https://API_SERVER:6443/api/v1/namespaces/default/pods/

X509 数字证书认证

X509客户端认证依赖于PKI证书体系,kubeadm部署Kubernetes集群时会自动生成所需要的证书,它们位于/etc/kubernetes/pki目录下

依赖到的PKI体系

另外,对Service Account的token进行签名还需要用到一个可选的密钥对儿

所有的证书

  • 各kubelet的证书可在Bootstrap过程中自动生成证书签署请求,而后由Kubernetes CA予以签署
  • 各kube-proxy、kube-scheduler和kube-controller-manager也都有相应的数字证书以完成向API Server的身份认证

X509数字证书认证测试

创建客户端私钥和证书签署请求,为了便于说明问题,以下操作在master节点上以/etc/kubernetes/为工作目录

1 生成私钥: (umask 077; openssl genrsa -out ./pki/mason.key 4096)

2 创建证书签署请求: openssl req -new -key ./pki/mason.key -out ./pki/mason.csr -subj "/CN=mason/O=developers"

3 由Kubernetes CA签署证书: openssl x509 -req -days 365 -CA ./pki/ca.crt -CAkey ./pki/ca.key -CAcreateserial -in ./pki/mason.csr -out ./pki/mason.crt

4 将pki目录下的mason.crt、mason.key和ca.crt复制到某部署了kubectl的主机上,即可进行测试

  • 这里以k8s-node01为示例;只需要复制mason.crt和mason.key即可,因为集群工作节点上已经有cr.crt文件
  • 命令:scp -rp ./pki/{mason.crt,mason.key} k8s-node01:/etc/kubernetes/pki

以上就是k8s实现身份认证策略及过程解析的详细内容,更多关于k8s 身份认证的资料请关注我们其它相关文章!

(0)

相关推荐

  • k8s应用监控探针详解

    目录 应用监控 pod状态转换 pod的启动流程? Pod支持的监测类型(健康探针) 监测机制 配置参数 示例 image pull policy 镜像管理策略 应用监控 参考 https://www.jb51.net/article/241418.htm 在pod之上 添加一个探针, kubelet通过探针去检查应用 pod状态转换 pod的启动流程? schduler环节 先绑定节点 kubelet接管 准备CNI CSI CRI 启动pod中的container 启动探针 存活探针 监测p

  • K8S 实用工具之合并多个kubeconfig实现详解

    目录 开篇 解决方案 方案一:KUBECONFIG 环境变量指向多个文件 方案二:flatten 方案三:kubectl 插件 konfig 实用工具:krew 实用工具:konfig 总结 开篇 磨刀不误砍柴工 工欲善其事必先利其器 K8S 集群规模,有的公司倾向于少量大规模 K8S 集群,也有的公司会倾向于大量小规模的 K8S 集群. 如果是第二种情况,是否有一个简单的 kubectl 命令来获取一个 kubeconfig 文件并将其合并到 ~/.kube/config 文件作为一个额外的上

  • k8s部署redis集群搭建过程示例详解

    目录 写在前面 一.redis集群搭建 1.1使用redis-cli创建集群 1.2redis集群状态验证(可选) 1.3重启pod,验证集群(可选) 1.4创建Service服务 1.5 Springboot项目配置 1.6相关疑问分析 写在前面 在上一篇文章中,我们已经做到了已经创建好6个redis副本了. 具体的详情,可以查看这里:k8s部署redis集群(一) 那么接下来,我们就继续实现redis集群的搭建过程. 一.redis集群搭建 1.1使用redis-cli创建集群 # 查看re

  • k8s部署redis集群实现过程实例详解

    目录 写在前面 前置准备 一.nfs安装 二.SC.PV 创建 2.1创建SC 2.2创建PV 三.redis集群搭建 3.1创建headless服务 3.2创建redis对应pod集群 写在前面 一般来说,REDIS部署有三种模式. 单实例模式,一般用于测试环境. 哨兵模式 集群模式 后两者用于生产部署 哨兵模式 在redis3.0以前,要实现集群一般是借助哨兵sentinel工具来监控master节点的状态. 如果master节点异常,则会做主从切换,将某一台slave作为master. 引

  • k8s入门实战deployment使用详解

    目录 介绍 自愈能力 多副本 扩缩容 故障转移 滚动更新 版本回退 其他 介绍 假设现在我们写了一个订单服务,由于访问量很高 只部署一台肯定不够,我希望k8s帮我启动好几个pod, 我们用kubectl run可能得运行100次, 基于deployment,你可以告诉k8s副本数量,k8s就会自动帮你完成,其实不止是副本数量,一旦你的pod被deployment管理,deployment将会赋予它更多的能力,比如自愈,扩缩容,滚动更新等 自愈能力 我们使用原来的方式创建一个pod kubectl

  • k8s编排之Deployment知识点详解

    目录 Pod 复杂的API对象 nginx-deployment Deployment 及类似控制器总结 Deployment 所控制的 ReplicaSet查看 Pod 复杂的API对象 Pod 这个看似复杂的 API 对象,实际上就是对容器的进一步抽象和封装而已. 说得更形象些,“容器”镜像虽然好用,但是容器这样一个“沙盒”的概念,对于描述应用来说,还是太过简单了.这就好比,集装箱固然好用,但是如果它四面都光秃秃的,吊车还怎么把这个集装箱吊起来并摆放好呢? 所以,Pod 对象,其实就是容器的

  • 基于springboot实现整合shiro实现登录认证以及授权过程解析

    这篇文章主要介绍了基于springboot实现整合shiro实现登录认证以及授权过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.添加shiro的依赖 <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring-boot-web- starter</artifactId> <version&g

  • Java加权负载均衡策略实现过程解析

    加权轮询 后端集群每台机器都分配一个权重,权重高得会承担更多的流量,相反权重低的分配的流量也会少,这种策略允许后端集群机器配置差异化 java实现 import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import org.springframework.s

  • gateway和jwt网关认证实现过程解析

    这篇文章主要介绍了gateway和jwt网关认证实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 思路: 全局过滤器对所有的请求拦截(生成token有效期30分钟,放入redis设置有效期3天.3天之类可以通过刷新接口自动刷新,超过3天需要重新登录.) 前端在调用接口之前先判断token是否过期(3o分钟),过期则先调刷新接口,换取新token, 1引入相关jar <dependency> <groupId>org.sp

  • 深入解读ASP.NET Core身份认证过程实现

    长话短说:上文我们讲了 ASP.NET Core 基于声明的访问控制到底是什么鬼? 今天我们乘胜追击:聊一聊ASP.NET Core 中的身份验证. 身份验证是确定用户身份的过程. 授权是确定用户是否有权访问资源的过程. 1. 万变不离其宗 显而易见,一个常规的身份认证用例包括两部分: ① 对用户进行身份验证 ② 在未经身份验证的用户试图访问受限资源时作出反应 已注册的身份验证处理程序及其配置选项被称为"方案",方案可用作一种机制,供用户参考相关处理程序的身份验证.挑战和禁止行为. 我

  • 使用python远程操作linux过程解析

    这篇文章主要介绍了使用python远程操作linux过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 在云服务测试中,往往需要我们进入云服务内容进行相关内容的测试.这测试可以使用平台自身的noVNC.外部辅助xshell等工具连接到云服务内部进行测试. 但是在如此反复的测试操作中,就需要用到自动化测试方法去解决这方面的需求. 在python中我们可以通过第三方库paramiko,对linux的云服务器进行操作. 如下命令先行安装 pip

  • 基于spring security实现登录注销功能过程解析

    这篇文章主要介绍了基于spring security实现登录注销功能过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.引入maven依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependenc

  • C#进阶系列 WebApi身份认证解决方案推荐:Basic基础认证

    前言:最近,讨论到数据库安全的问题,于是就引出了WebApi服务没有加任何验证的问题.也就是说,任何人只要知道了接口的url,都能够模拟http请求去访问我们的服务接口,从而去增删改查数据库,这后果想想都恐怖.经过一番折腾,总算是加上了接口的身份认证,在此记录下,也给需要做身份认证的园友们提供参考. 一.为什么需要身份认证 在前言里面,我们说了,如果没有启用身份认证,那么任何匿名用户只要知道了我们服务的url,就能随意访问我们的服务接口,从而访问或修改数据库. 1.我们不加身份认证,匿名用户可以

  • ASP.NET Forms身份认证详解

    ASP.NET身份认证基础 在开始今天的内容之前,我想有二个最基础的问题首先要明确: 1. 如何判断当前请求是一个已登录用户发起的? 2. 如何获取当前登录用户的登录名? 在标准的ASP.NET身份认证方式中,上面二个问题的答案是: 1. 如果Request.IsAuthenticated为true,则表示是一个已登录用户. 2. 如果是一个已登录用户,访问HttpContext.User.Identity.Name可获取登录名(都是实例属性). 接下来,本文将会围绕上面二个问题展开,请继续阅读

  • 详解Go-JWT-RESTful身份认证教程

    1.什么是JWT JWT(JSON Web Token)是一个非常轻巧的规范,这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息, 一个JWT由三部分组成,Header头部.Claims载荷.Signature签名, JWT原理类似我们加盖公章或手写签名的的过程,合同上写了很多条款,不是随便一张纸随便写啥都可以的,必须要一些证明,比如签名,比如盖章,JWT就是通过附加签名,保证传输过来的信息是真的,而不是伪造的, 它将用户信息加密到token里,服务器不保存任何用户信息,服务器通过使

  • Django Auth应用实现用户身份认证

    目录 1. 实现用户的认证 用户认证过程解析 Django获取后端认证 2. Auth应用获取用户模型 我们知道 Django Auth 应用一般用在用户的登录注册上,用于判断当前的用户是否合法,从而可以帮助开发者快速的构建用户系统,那么 Auth 应用又是如何是实现用户的认证的呢?当给定相关的条件或属性时候,我们可以去获取用户对象这个过程就被称为用户认证,Django Auth 应用提供了一个用来认证的方法即 authenticate 方法用来实现用户的认证行为.下面就让我们一起来认识一下吧!

随机推荐