美文网首页工作生活kubernetes
最好的K8S 安全机制介绍 4 service account

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

作者: 陈sir的知识图谱 | 来源:发表于2019-07-03 18:05 被阅读0次

    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

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

    相关文章

      网友评论

        本文标题:最好的K8S 安全机制介绍 4 service account

        本文链接:https://www.haomeiwen.com/subject/orbchctx.html