k8s安全 认证 鉴权 准入控制之一:实践

系列文章链接

  1. k8s安全 认证 鉴权 准入控制之一:认证(Authentication)
  2. k8s安全 认证 鉴权 准入控制之二:授权(Authorization)
  3. k8s安全 认证 鉴权 准入控制之三:实践

实践: 创建一个用户只能管理 dev 空间

  1. 在集群的master节点主机生成用户

    $ useradd devuser
    $ passwd devuser
    

如果在集群的master节点通过这个用户连接然后执行kubectl命令肯定是没有权限的,需要给他生成证书,然后设置权限

  1. 设置证书生成引导文件

    # k8s的用户名就是从CN上获取的。组是从O上获取的。这个用户或者组用于后面的角色绑定使用
    
    $ mkdir /root/cert/devuser && cd /root/cert/devuser
    
    $ vim devuser-csr.json
    
    {
    
    "CN": "devuser", # 用户名
    
    "hosts": [], #代表连接的主机地址 []不输入代表全部
    
    "key": {
    
     "algo": "rsa", #加密算法
    
     "size": 2048
    
     },
    
    "names": [
    
     {
    
     "C": "CN",
    
     "ST": "BeiJing",
    
     "L": "BeiJing",
    
      "O": "k8s", # 组名
    
      "OU": "System"
    
    } ]
    
    }
    
  2. 下载证书生成工具

$ wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 

$ mv cfssl_linux-amd64 /usr/local/bin/cfssl

$ wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 

$ mv cfssljson_linux-amd64 /usr/local/bin/cfssljson

$ wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64 

$ mv cfssl-certinfo_linux-amd64 /usr/local/bin/cfssl-certinfo
  1. 给devuser用户生成证书

    -ca -ca-key是指定我们k8s的根证书和私钥,也就是==/etc/kubernetes/pki/==目录下的ca.crt和ca.key ``-profile`是指定我们上面设置的证书引导json文件

最好在/etc/kubernetes/pki/执行这个生成证书的过程方便管理证书

$ cfssl gencert -ca=ca.crt -ca-key=ca.key \  -profile=kubernetes \  /root/cert/devuser/devuser-csr.json | cfssljson -bare devuser

​ 执行完会多出devuser.csr、devuser-key.pem、devuser.pem文件

  1. 回到 /root/cert/devuser 设置集群参数
# 设置集群访问地址环境变量
$ export KUBE_APISERVER="https://192.168.181.111:6443"

# 创建k8s认证文件 kubernetes是集群名称 --embed-certs=true是否认证加密 --server=指定k8s服务器信息 --kubeconfig=最后创建出devuser.kubeconfig 文件

$ kubectl config set-cluster kubernetes \ --certificate-authority=/etc/kubernetes/pki/ca.crt \ --embed-certs=true \ --server=${KUBE_APISERVER} \ --kubeconfig=devuser.kubeconfig

# cat一下就会看到devuser.kubeconfig文件,里面的集群名字、证书、集群地址、字段有值,其他的配置还是空,需要我们继续配置
  1. 继续 接下来设置客户端认证参数
# devuser是客户端认证的用户名  --client-certificate指定生成的客户端证书 --client-key指定客户端私钥 --embed-certs=true是否认证加密 再次写入到devuser.kubeconfig文件

$ kubectl config set-credentials devuser --client-certificate=/etc/kubernetes/pki/devuser.pem --client-key=/etc/kubernetes/pki/devuser-key.pem  --embed-certs=true --kubeconfig=devuser.kubeconfig

# 再次cat一下devuser.kubeconfig文件,里面有了name用户名 和 client-certificate-data用户客户端证书信息和client-key-data:客户端私钥信息 还是得继续设置
  1. 设置上下文参数,命名空间 要提前创建下dev命名空间
# --cluster集群名称 --user用户名 --namespace 要访问的命名空间 再次写入到 devuser.kubeconfig文件

$ kubectl config set-context kubernetes  --cluster=kubernetes --user=devuser --namespace=dev  --kubeconfig=devuser.kubeconfig
  1. 进行权限下发绑定rolebinding操作,admin在k8s集群里面是一个什么权限都有的clusterrole,把这个clusterrole绑定到我们创建的用户devuser,把这个rolebinding放在dev命名空间下
$ kubectl create rolebinding devuser-admin-binding --clusterrole=admin --user=devuser --namespace=dev
  1. 把devuser.kubeconfig文件考培到devuser用户目录文件夹,也就是/home/devuser/文件夹
# 考培前先在/home/devuser/文件夹 创建.kube/文件夹

$ mkdir /home/devuser/.kube/

# 把devuser.kubeconfig文件考培到devuser下的.kube/文件夹

$ cp devuser.kubeconfig /home/devuser/.kube/

# 把devuser.kubeconfig文件分给devuser用户 chown命令是指定文件的拥有者

$ chown devuser:devuser /home/devuser/.kube/devuser.kubeconfig

# 然后用登录devuser 连接集群的master节点,把文件名字做一个修改 但是老是报错“mv: 无法将"devuser.kubeconfig" 移动至"config": 权限不够”,我还是使用root 修改的文件名

$ cd /home/devuser/.kube

$ mv devuser.kubeconfig config
  1. root给devuser用户切换上下文,让devuser用户读取到config的信息
$ cd /home/devuser/.kube

$ kubectl config use-context kubernetes --kubeconfig=config
  1. 测试
# 使用 devuser用户查看pod
$ kubectl get pod 
上一篇:Kubernetes kubeconfig配置文件


下一篇:RBAC---用户