前言

kubernetes安全机制围绕API server来设计的,使用了认证、鉴权、准入控制三步,保证API Server的安全。

一、认证

确认是否可信:

  • https 证书认证,基于ca证书(使用这个认证方式)
    • 双向认证,最安全!
  • http token认证,通过token来识别用户
  • http Base认证,用户名 + 密码认证

如果组件想访问,要经过双向认证
pod 认证到 api-server的标准:如果 pod 想访问通过 service account 中token !
image.png

  1. # 获取集群的pod
  2. kubectl get pod -n kube-system
  3. # 进入某个集群
  4. kubectl exec pod -n kube-system -it -- /bin/sh
  5. # 查看secrets的信息
  6. cd /run/secrets/kubernetes.io

image.png

二、 鉴权

确定请求方有哪些资源的权限:

  • ABAC:基于属性的访问控制,需要重启(已经淘汰)
  • Webbook:调用外部rest服务对用户进行授权(集群外部)
  • RBAC:基于角色的访问控制(现行默认规则)

image.png

4个资源对象概念: Role表示一组规则权限,只会增加,在一个namespace中,想跨名称空间用ClusterRole(集群级别的) RoleBinding适用于某个命名空间授权,ClusterRole Binding适用于集群 范围授权

注意:k8s不提供用户管理,User、Group、Service Account 的指定用户都是从Kubenetes(kubectl 、 kube-proxy)或是其他自定义的用户在向CA申请证书时,提供的证书请求文件决定的!

三、准入控制

准入控制是实现API server 的插件集合。

例子:创建一个用户devuser,管理dev空间

一、 创建用户名密码

kubernetes没有用户名和密码,只能在Linux里创建!

  1. useradd devuser
  2. passwd
  3. Eisoo.com123

注意:如果提示无效的密码或者密码不可用,多输两次就好了!

二、 鉴权(RBAC)

1. 证书请求文件

创建 /usr/local/cert/devuser 目录,编辑 devuser-csr.json

  1. {
  2. "CN": "admin", # CN 用户名
  3. "hosts": [],
  4. "key": {
  5. "algo": "rsa",
  6. "size": 2048
  7. },
  8. "names": [
  9. {
  10. "C": "CN",
  11. "L": "BeiJing",
  12. "ST": "BeiJing",
  13. # Group
  14. "O": "k8s", # O 字段是组
  15. "OU": "System"
  16. }
  17. ]
  18. }

2. 准备cfssl证书生成工具

cfssl是一个开源的证书管理工具,使用json文件生成证书,相比openssl 更方便使用。找任意一台服务器操作,这里用Master节点。

  1. wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
  2. wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
  3. wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64
  4. chmod +x cfssl_linux-amd64 cfssljson_linux-amd64 cfssl-certinfo_linux-amd64
  5. mv cfssl_linux-amd64 /usr/local/bin/cfssl
  6. mv cfssljson_linux-amd64 /usr/local/bin/cfssljson
  7. mv cfssl-certinfo_linux-amd64 /usr/bin/cfssl-certinfo

image.png

3. 生成证书请求和证书私钥

回到 /usr/local/cert/devuser 目录 , 最好到/etc/kubernetes/pki 下生成令牌

  1. cfssl gencert -ca=ca.crt -ca-key=ca.key -profile=kubernetes /usr/local/k8s/cert/devuser/devuser-csr.json | cfssljson -bare devuser

image.png

4. 声明访问的KUBE_APISERVER信息

进入devuser目录,设置 kube_apiserver参数
(如果不做更改的话,或者这一步可以省略)

  1. export KUBE_APISERVER="10.4.104.169:6443"

5. 设置集群参数

  1. kubectl config set-cluster kubernetes \ # 设置kubernetes的集群
  2. --certificate-authority=/etc/kubernetes/pki/ca.crt \ # 指定CA的证书
  3. --embed-certs=true \ # 指定是否进行加密和认证
  4. --server=https://10.4.104.169:6443 \ # 指定服务器信息
  5. --kubeconfig=devuser.kubeconfig # 创建一个devuser的config文件

若是执行上一步 ,那么把 server=${KUBE_APISERVER}
ls一下就会出现一个devuser.kubeconfig的文件!查看此时的kuberconfig文件,有了server的数据!
image.png

6. 设置客户端认证参数

  1. # 设置客户端认证参数
  2. kubectl config set-credentials devuser \ # 创建证书的devuser
  3. --client-key=/etc/kubernetes/pki/devuser-key.pem \ # 指定客户端证书
  4. --client-certificate=/etc/kubernetes/pki/devuser.pem \ # 指定客户端私钥
  5. --embed-certs=true \ # 开启认证方式
  6. --kubeconfig=devuser.kubeconfig

cat一下,多了用户的信息,用户名、用户证书以及用户私钥等!
image.png

7. 设置上下文参数

为了帮用户绑定至某个名称空间
先去devuser的操作界面中创建一个名称空间

  1. kubectl create namespace dev

再回到master

  1. # 设置上下文参数
  2. kubectl config set-context default \
  3. --cluster=kubernetes \ # 默认集群名称
  4. --user=devuser \ # 名称
  5. --namespace=dev \ # 名称空间
  6. --kubeconfig=lucy.kubeconfig

绑定成功!
image.png

8. 设置用户权限rolebinding

集群中已有一个clusterrole的admin用户,可以在集群中为所欲为!
把admin用户进行rolebinding绑定至dev名称空间中,代表用户admin在dev下为所欲为!

  1. kubectl create rolebinding devuser-admin-binding --clusterrole =admin --user=devuser --namespace=dev

回到master,复制dev配置文件到.kube,再赋予权限
image.png
把文件拷贝到用户目录下,首先在用户目录下建一个.kube/
再把devuser的config改名,改成config
切换上下文,使其生效
image.png

9. 测试:找default空间,dev访问不到。

image.png

三、完成√

提供dev用户名和密码!只能访问dev空间!

四、用代码实现


待更新。。。