最好的K8S 安全机制介绍 4 service account secret

service account secret

service account 是一种提供给pod 用的账号。

pod 与 api server 之间的认证

pod访问api server时,是以service 的方式进行访问的,访问的服务名为kubernetes。kubernetes 服务只在443端口提供。pod 与kubernetes 之间的认证方式通过特殊的认证方式 service account auth 进行认证。

service account auth(SAA)

SAA 与http token 认证的方式类似,但存在以下区别

  • token 来自pod里指定路径下的一个文件(/run/secrets/kubernetes.io/serviceaccount/token), 这种token是动态生成的,确切的说,是由kubernetes controller 进程用 api server的私钥(-- service-account-private-key-file 指定的私钥) 签名生成的一个JWT secret
  • 在官方提供的客户端REST 框架代码里,通过HTTPS 方式 与API SERVER 建立连接后, 会用POD里指定路径下的一个CA证书(/run/secrets/kubernetes.io/serviceaccount/ca.crt)验证api server 发来的证书, 验证是否为CA证书签名的合法证书。
  • API SERVER 在收到这个token后,采用自己的私钥(实际上是使用service-account-key-file参数指定的私钥,如果没有设置此参数,则默认采用tls-private-key-file指定的参数,即自己的私钥) 对token 进行合法性验证。

涉及到的文件总共有三个,起到了类似于secret的作用

  • /run/secrets/kubernetes.io/serviceaccount/token
  • /run/secrets/kubernetes.io/serviceaccount/ca.crt
  • /run/secrets/kubernetes.io/serviceaccount/namespace (pod 客户端使用这里的指定的namespace 作为参数调用 api server)

我们来看下serviceaccount 与secret的关系

roger@microk8s:~$ kubectl get sa
NAME                                    SECRETS   AGE
default                                 1         75d
nginx-ingress-microk8s-serviceaccount   1         6d3h


roger@microk8s:~$ kubectl describe sa nginx-ingress-microk8s-serviceaccount
Name:                nginx-ingress-microk8s-serviceaccount
Namespace:           default
Labels:              <none>
Annotations:         kubectl.kubernetes.io/last-applied-configuration:
                {"apiVersion":"v1","kind":"ServiceAccount","metadata":{"annotations":{},"name":"nginx-ingress-microk8s-serviceaccount","namespace":"defaul...
Image pull secrets:  <none>
Mountable secrets:   nginx-ingress-microk8s-serviceaccount-token-djzgv
Tokens:              nginx-ingress-microk8s-serviceaccount-token-djzgv
Events:              <none>


roger@microk8s:~$ kubectl describe sa default
Name:                default
Namespace:           default
Labels:              <none>
Annotations:         <none>
Image pull secrets:  <none>
Mountable secrets:   default-token-6fh79
Tokens:              default-token-6fh79
Events:              <none>

看看secret里的内容

roger@microk8s:~$ kubectl describe secret default-token-6fh79
Name:         default-token-6fh79
Namespace:    default
Labels:       <none>
Annotations:  kubernetes.io/service-account.name: default
              kubernetes.io/service-account.uid: f4e65628-6270-11e9-879c-000c29f4dd4d

Type:  kubernetes.io/service-account-token

Data
====
ca.crt:     1099 bytes
namespace:  7 bytes
token:      eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZWZhdWx0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6ImRlZmF1bHQtdG9rZW4tNmZoNzkiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGVmYXVsdCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6ImY0ZTY1NjI4LTYyNzAtMTFlOS04NzljLTAwMGMyOWY0ZGQ0ZCIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDpkZWZhdWx0OmRlZmF1bHQifQ.NjcX2r-WREHIFLkMJEacULVv45yCKshVRXe4VCyqY1xBhpIsZTlDKFL1NsIvYyiBrHXX1CUjTRuWxErMQK1HJN_8KCypWrrGbl2AAkijQ9maDoNlPV0swseS84LZ3I0BCWImuFyfe1E-A1laMpg-vbd2QK32Cz-ESNa8PWdsyjL4xotcyxX7E_8Dc2QhRmxIKUpyrjjnUdKNfxu1jk_ylciwY58Nz1H96fMDRmsJXKmXKf4qRmjpcGOh8vPLby7DJk1OLd7EEvY__mXV4yNFGMqSGP6cniZOFuokBFNFOND2dsXd0wAwqZpTulmnRav4p1yeyb1V1o1PUpotsKS7NQ

每个NAMESPACE下都有一个名为default的默认serviceaccount对象,在这个service account中有一个名为tokens secret,被当做volume挂在到pod的指定目录里.

  • 名为imagePullSecrets 的secret 用于下载容器镜像的认证.
  • 名为Tokens的secret 用于访问 api server的认证

service account 相关的几个控制器

  • adminssion controller (AC)
  • token controller (TC)
  • serviceaccount controller (SAC)

controller manager 创建了serviceaccount controller 与 token controller , SAC 一直坚挺serviceaccount 和namespace的实践,如果 namespace 中没有default service account, SAC 会为该namesapce 创建一个 default' service account

如果controller manager 启动是指定了API SERVER的私钥.(service-account-private-key 参数), 那么controller manager 会创建 token controller, token controller也坚挺service acount的实践,如果发现新的service account 中没有对应的service account secret,会用API SERVER的私钥创建一个TOKEN(JWT TOKEN)并用该token, CA证书,以及namespace 名称三个信息产生一个新的secret对象,放入到新创建的service account中. 如果监听到 service account的删除事件,则会自动删除相关的secret

service account secret 的挂在目录为 /var/run/secrets/kubernetes.io/serviceaccount

如果文章对您有帮助,请点一下下面的 "喜欢"

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,457评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,837评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,696评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,183评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,057评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,105评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,520评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,211评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,482评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,574评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,353评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,897评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,489评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,683评论 2 335