Kubernetes用来执行安全访问和权限的步骤有3个——认证(Authentication)、授权(Authorization)和准入(Admission)。在本文中,我们先开始了解认证(Authentication)。

在认证中第一个需要考虑的是身份认证(Identity)。

身份认证简介

Kubernetes假设“user”是在Kubernetes之外管理的。在生产环境中,可以采用LDAP(轻量级目录访问协议)、SSO(单点登录)、Kerberos或SAML(安全断言置标语言)进行身份认证管理。在开发或测试环境中,其他的认证策略也有可能会被使用到。

在Kubernetes中没有表达普通用户的对象,因此不能通过API将普通用户添加到集群中。

认证策略概览

Kubernetes通过认证插件使用认证代理、bearer token、客户端证书或HTTP基本授权来认证API请求。当向API server发出HTTP请求时,插件会尝试将以下属性与请求关联起来:

  • Username:识别最终用户的字符串
  • UID:识别最终用户的字符串,并试图比username格式更为一致,同时每个UID都是独特的。
  • Groups:一组字符串,将用户与一组常见的分组用户关联起来
  • Extra fields:字符串的映射,保存着授权者认为可能有用的额外信息。

所有这些值对认证系统来说都是不透明的,只有在authorizer对其进行解释时才有意义。Kubernetes管理员通常会启用多种认证方法。所需的两种最基本的方法是——服务账户的service account token再加上至少一种其他的用户认证方法。

X509客户端证书

  • 从Kubernetes 1.4开始,客户端证书可以使用证书组织字段来表明用户的组成员资格。
  • 要让一个用户拥有多个组成员资格,需要在证书中包含多个组织字段。
  • 通过向API server传递 --client-ca-file=选项来启用客户端证书认证。
  • 引用的文件必须包含一个或多个证书颁发机构,用于验证提交给API server的客户证书。
  • 如果出示客户端证书并进行验证,则使用主体的通用名作为请求的用户名。

例如,使用openssl命令行工具来生成证书签名请求:

openssl req -new -key <pem_file>.pem -out <out-csr-file>.pem -subj "/CN=admin/O=prod/O=dev/O=uat"

这将为用户名admin创建一个CSR(证书签名请求),该用户名属于以下3个组:prod、dev和uat。

静态Token文件

当在命令行中给出--token-auth-file=选项时,API Server会从文件中读取bearer token。如今,token无限期存在,如果不重启API Server,就无法更改token列表。Token文件是一个csv文件,至少有3列:token、用户名、user uid,后面可能还会有组名(这是可选的)。

token, user, uid,"prod,dev,uat"

请注意:如果你有超过1个组,该列必须使用双引号。

在请求中放入一个bearer token

当使用来自HTTP客户端的bearer token认证时,API server期望授权请求头的值为Bearer 。bearer token必须是一个字符序列,可以只需使用HTTP的编码和引用功能就可以将其放在HTTP请求头的值中。例如,如果Bearer Token是ad644f3f-bfch-295b-75bk-h9g8ngf36hb6,那么它将出现在HTTP请求头中,如下所示:

Authorization: Bearer ad644f3f-bfch-295b-75bk-h9g8ngf36hb6

静态密码文件

通过向API server传递--basic-auth-file=选项来启用基本认证。现在,基本的认证凭证将无限期地持续下去,而且如果不重新启动 API server,就无法更改密码。

基本的 auth 文件是一个 csv 文件,至少有 3 列:密码、用户名、用户 ID。在Kubernetes 1.6及以后的版本中,你可以指定一个可选的第4列,包含逗号分隔的组名。如果你有多个组,你必须用双引号(")括住第4列的值。

password,user,uid,"group1,group2,group3"

当使用来自HTTP客户端的基本认证时,API server期望Authorizationheader的值为:

Basic BASE64ENCODED(USER:PASSWORD)

服务账户Token

服务账户是一个自动启用的身份认证器,它使用签名的bearer token来验证请求。该插件需要2个可选的标志:

--service-account-key-file

一个包含PEM编码密钥的文件,用于签署bearer token。如果没有指定,将使用API server的TLS密钥。

--service-account-lookip

如果启用了,从API sever上删除的token将被撤销。

服务账户通常由API server自动创建,并通过ServiceAccount 准入控制器与集群中运行的Pod相关联。

Bearer Token会被挂载到众所周知的位置的Pod中,并允许集群内进程与API Server对话。账户可以使用PodSpec的serviceAccountName字段与Pod显式关联。

注意,serviceAccountName通常会被省略,因为这是自动完成的。

练习实践:使用ServiceAccount Token

使用以下命令可以创建ServiceAccount:

kubectl create serviceaccount testuser

创建的密钥包含API server的公共CA和签名的JSON web Token(JWT)。以下命令可以显示出揭示相关密钥的yaml:

kubectl get serviceaccount testuser -o yaml

以下命令可以显示可用Token:

kubectl get secrets

要获得编码的token数据,请输入:

kubectl get secret testuser-token-mgtnp -o yaml

你可以将编码后的token数据复制并粘贴到https://jwt.io/ 以查看有效载荷。使用你选择的编辑器输入以下yaml文件(test-pod.yaml),以运行一个pod:

apiVersion: v1
kind: pod
metadata:
name: test-pod
spec:
serviceAccountName: testuser
container:
- name: alpine:3.7
command:
- "sh"
- "-c"
- "sleep 100"

然后使用以下命令启动pod:

kubectl apply -f test-pod.yaml

使用describe可以查看更详细的内容:

kubectl describe test-pod

现在,我们有一个正在运行的pod,名为test-pod,让我们进入交互模式并运行一个shell:

kubectl exec -it test-pod -- sh

如果你想在docker容器内运行shell,所使用的命令与docker命令类似。这时,我们将会收到一个提示,然后进入Alpine Linux系统,该系统是在pod中的一个容器内运行的。为了打开被复制到容器中的token,你需要运行以下命令:

cat /var/run/sercrets/kubernetes.io/serviceaccount/token

复制输出并将该token粘贴在https://jwt.io/上Encoded部分。在另一边你会得到token的类型、命名空间、ServiceAccount名称、密钥名称等。

这几乎以一种十分直观的方式向你说明了Kubernetes如何在token中进行身份验证有效载荷。

作者:

Sudip Sengupta

链接:

https://dzone.com/articles/kubernetes-authentication

Kubernetes认证入门指南的更多相关文章

  1. Kubernetes Helm入门指南

    什么是Helm?这可不是暗黑破坏神里装备的名称:头盔,而是Kubernetes的一个包管理工具,用来简化Kubernetes应用的部署和管理.我们Helm和Kubernetes的关系,我们可以理解成y ...

  2. Web API 入门指南 - 闲话安全

    Web API入门指南有些朋友回复问了些安全方面的问题,安全方面可以写的东西实在太多了,这里尽量围绕着Web API的安全性来展开,介绍一些安全的基本概念,常见安全隐患.相关的防御技巧以及Web AP ...

  3. Web API入门指南(安全)转

    安全检测的工具站点:https://www.owasp.org/index.php/Category:Vulnerability_Scanning_Tools Web API入门指南有些朋友回复问了些 ...

  4. 史上最全!信息安全入门指南<转>

    以下所列出的链接均为在线文档,有志于信息安全的爱好者可由此作为入门指南. 背景知识 常规知识 Sun认证-Solaris 9&10安全管理员学习指南 PicoCTF资料 应用软件安全 OWAS ...

  5. Web API 入门指南

    Web API 入门指南 - 闲话安全2013-09-21 18:56 by 微软互联网开发支持, 231 阅读, 3 评论, 收藏, 编辑 Web API入门指南有些朋友回复问了些安全方面的问题,安 ...

  6. Docker 入门指南——常用命令

    前面已经介绍了 Docker 的安装方式,本文总结一下使用 Docker 的基本概念和常用命令. 基本概念 镜像 Image 镜像是一些打包好的已有的环境,可以被用来启动和创建容器 容器 Contai ...

  7. 《KAFKA官方文档》入门指南(转)

    1.入门指南 1.1简介 Apache的Kafka™是一个分布式流平台(a distributed streaming platform).这到底意味着什么? 我们认为,一个流处理平台应该具有三个关键 ...

  8. (转)Web API 入门指南 - 闲话安全

    原文地址:http://www.cnblogs.com/developersupport/p/WebAPI-Security.html Web API入门指南有些朋友回复问了些安全方面的问题,安全方面 ...

  9. Kubernetes快速入门

    二.Kubernetes快速入门 (1)Kubernetes集群的部署方法及部署要点 (2)部署Kubernetes分布式集群 (3)kubectl使用基础 1.简介 kubectl就是API ser ...

随机推荐

  1. matlab函数句柄

    matlab函数句柄 直接调用函数:  被调用函数只能被其M文件同名的主函数或在M文件中的其他函数调用,一个文件只有一个主函数. 间接调用函数:  避免只能使用直接调用函数的情况,个人理解就是为一个函 ...

  2. 鸿蒙HI3516-驱动开发(1.1-LTS)

    代码在:https://gitee.com/kwydm/open-harmony-taurus 目录大致结构 1.驱动开发创建目录://vendor/huawei/hdf/LED/src 新建Make ...

  3. 微信小程序中的自定义组件

    微信小程序中的组件 前言 之前做小程序开发的时候,对于开发来说比较头疼的莫过于自定义组件了,当时官方对这方面的文档也只是寥寥几句,一笔带过而已,所以写起来真的是非常非常痛苦!! 好在微信小程序的库从 ...

  4. dedecms arclist分页

    https://blog.csdn.net/qq_41104911/article/details/81510589

  5. Andrew Ng机器学习算法入门(八):正规方程

    正规方程 在先学习正规方程之前,先来复习一下之前学过的常规的回归方程的解法. 假设存在如果的代价函数, ,解法也十分的简答. 但是有时候遇到的情况或许会变得相当的复杂. 的数,如果是按照常规的方式进行 ...

  6. 11.qml-通过方法来加载组件、字符串方式加载组件

    在上章,我们学习了10.qml-组件.Loader.Component介绍. 本章我们继续来学习组件的其它创建方式. 1.调用Function来加载和移除组件 之前我们是使用Loader对象来实现加载 ...

  7. 使用C#操作注册表

    这节讲一下使用C#操作注册表. 首先来了解一下,什么是注册表,注册表是Windows中特有的一个东西,百度百科中对其解释如下:Windows注册表(Registry)实质上是一个庞大的数据库,它存储着 ...

  8. JAVA中Abstract到底有什么用?都用在哪些方面比较合适?

    功能向上聚合 Abstract作为抽象类和抽象方法,第一种情况是在聚合子类的通用性上起到作用,往往出现在重构过程中自然而然形成的一种层次结构-希望将多个子类的通用方法和逻辑提取到父层的抽象类. 这种重 ...

  9. 线程本地存储(动态TLS和静态TLS)

    线程本地存储(TLS) 对于多线程应用程序,如果线程过于依赖全局变量和静态局部变量就会产生线程安全问题.也就是一个线程的使用全局变量可能会影响到其他也使用此全局变量的线程,有可能会造成一定的错误,这可 ...

  10. 『政善治』Postman工具 — 11、Postman中对Cookie的操作

    目录 1.关联接口说明 2.测试关联接口实现步骤 3.补充:Postman中将请求转换成代码 上一篇文章说明了Postman中关于Cookie的相关操作,还是以Cookie举例,来说明下一在Postm ...