Kubernetes用来执行安全访问和权限的步骤有3个——认证(Authentication)、受权(Authorization)和准入(Admission)。在本文中,咱们先开始了解认证(Authentication)。web
在认证中第一个须要考虑的是身份认证(Identity)。docker
Kubernetes假设“user”是在Kubernetes以外管理的。在生产环境中,能够采用LDAP(轻量级目录访问协议)、SSO(单点登陆)、Kerberos或SAML(安全断言置标语言)进行身份认证管理。在开发或测试环境中,其余的认证策略也有可能会被使用到。shell
在Kubernetes中没有表达普通用户的对象,所以不能经过API将普通用户添加到集群中。api
Kubernetes经过认证插件使用认证代理、bearer token、客户端证书或HTTP基本受权来认证API请求。当向API server发出HTTP请求时,插件会尝试将如下属性与请求关联起来:安全
全部这些值对认证系统来讲都是不透明的,只有在authorizer对其进行解释时才有意义。Kubernetes管理员一般会启用多种认证方法。所需的两种最基本的方法是——服务帐户的service account token再加上至少一种其余的用户认证方法。app
例如,使用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-auth-file=<FILENAME>选项时,API Server会从文件中读取bearer token。现在,token无限期存在,若是不重启API Server,就没法更改token列表。Token文件是一个csv文件,至少有3列:token、用户名、user uid,后面可能还会有组名(这是可选的)。测试
token, user, uid,"prod,dev,uat"
ui
请注意:若是你有超过1个组,该列必须使用双引号。
当使用来自HTTP客户端的bearer token认证时,API server指望受权请求头的值为Bearer <Token>。bearer token必须是一个字符序列,能够只需使用HTTP的编码和引用功能就能够将其放在HTTP请求头的值中。例如,若是Bearer Token是ad644f3f-bfch-295b-75bk-h9g8ngf36hb6,那么它将出如今HTTP请求头中,以下所示:
Authorization: Bearer ad644f3f-bfch-295b-75bk-h9g8ngf36hb6
经过向API server传递--basic-auth-file=<FILENAME>选项来启用基本认证。如今,基本的认证凭证将无限期地持续下去,并且若是不从新启动 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)
服务帐户是一个自动启用的身份认证器,它使用签名的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:
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部分...
这几乎以一种十分直观的方式向你说明了Kubernetes如何在token中进行身份验证有效载荷。
做者:
Sudip Sengupta
连接:
https://dzone.com/articles/ku...