k8s的安全机制。分布式集群管理工具,就是容器编排

安全机制的核心:APIserver作为整个内部通信的中介,也是外部控制的入口,所有的安全机制都是围绕API server来进行设计

请求API资源:

1、认证 2、鉴权 3、准入机制

只有三个条件都通过,才可以在k8s集群当中创建

认证

认证:Anthentcation 1、HTTP Token:通过token识别合法用户,token是一个很长,很复杂的一个字符串,字符串是用来表达客户的一种方式,每个token对应一个用户名,用户名存储在APIserver能够访问的文件中

客户端发起请求时,HTTP headr包含token 客户端发起请求----token----APIserver(用户名存储文件)----解码-----用户名-----访问集群

2、http base:用户+密码的验证方式,用户名和密码都是通过base64进行加密,加密完成的字符串,http Request的header

Atuthorization,发送给服务端,服务端收到加密字符串,解码,获取用户名和密码,验证通过,登录成功

3、https证书: 最严格的方式,也是最严谨的方式,基于CA根证书签名的客户端身份进行验证

认证的访问类型

k8s组件对api server组件的访问 kubelet kube-proxy

pod对api server的访问。pod coredns dashborad都是pod,也需要访问api

客户端 kubectl

kubelet kube-proxy

controller manager、sheduler 与api server在一台服务器,可以直接使用api server的非安全端口访问。(8080端口)

kebelet、kubectl、kube-proxy 都是通过apiserver的https证书,进行双向认证。都是用6443端口来进行验证。

签发证书的方式

1、 手动签发证书:二进制部署就是手动签发证书。

cA签发将证书匹配到每个对应组件,然后访问6443即可。

2、 自动签发证书:kubeadm是自动签发证书。

kubelet第一访问api server使用token。token通过之后,controller manager会为kubelet生成一个证书。

以后都是通过证书访问。kubeadm修改了证书的有效期。默认1年。

3、 kubeconfig文件包含集群的参数。包括:CA证书、API server地址、客户端的参数。(客户端的证书和私钥),集群的名称和用户名

k8s当中的组件通过启动时指定访问不同的kubeconfig。可以访问不同的集群---api server---namespace---资源对象---pod---容器

kubeconfig既是集群的描述文件,也是一个集群信息的保存文件,包含了集群的访问方式和认证信息。

~/.kube/config:保存的是kubectl的访问认证信息。

4、 serviceAccount就是为了方便pod中的容器来访问api server。

由于pod的动作(动态的增删改查),为每个pod手动生一个证书不现实。于是k8s就使用了serviceAccount来做循环认证。serviceAccount里面包含了统一的认证信息,直接进行api server访问。

5、 secret用来保存资源对象。

serviceAccount内部,保存的是token、service-auuount-token

secret保存的是自定义的保存信息。

serviceAccount的组成部分

  1. token

  2. ca.crt

  3. namespace

这三个部分都会被自动挂载到pod当中

  1. 认证

  2. 鉴权:之前的认证过程只是确认了双方都是可信的。可以互相通信。健全是为了确定请求方的访问权限。

能做哪些指定的操作。这些操作都是由鉴权来决定的。

鉴权的策略

1、 AlwayDeny:拒绝所有。一般用于测试

2、 AlwaysAllow:允许所有。也是用于测试

3、 ABAC:attribute-based access control 基于属性的访问控制

4、 webhook:外部访问集群内部的鉴权方式

5、 RBAC:role-base access control 基于角色的访问控制,也是k8s默认的规则机制。

角色:

role:指定命名空间的资源控制权限

rolebinding:将角色绑定到指定的命名空间

集群:

clusterrole:可以授权所有命名空间的资源控制权限

clusterrolebinding:将集群的角色绑定到命名空间

准入控制

准入控制式api server的准入控制器的插件列表,通过添加不同的插件可以实现不同的准入控制机制。

一般情况下建议使用官方默认的准入控制器

常用的准入控制器:

  1. limitranger:命名空间的配置管理

  2. servicAccount

  3. resourcequota:对命名空间进行整体高级控制。也是对命名空间的配置管理

实验举例

实验目的:实现不同用户管理自己的命名空间

认证--->---鉴权--->---准入机制

命名空间: lucky-cloud

上传证书文件并赋权

useradd lucky
passwd lucky
#创建一个用户

mkdir lucky
cd /usr/local/bin/
chmod +x cfssl*

vim user-cert.sh
cat > lucky-csr.json <<EOF
{
 "CN": "lucky",
 "hosts": [],
 "key": {
   "algo": "rsa",
   "size": 2048
},
 "names": [
  {
   "C": "CN",
   "ST": "Nanjing",
   "O": "k8s",
   "OU": "system"
   }
  ]
}
  EOF

chmod +x user-cert.sh
./user-cert.sh

cd /etc/kubernetes/pki/
cfssl gencert -ca=ca.crt -ca-key=ca.key -profile=kubernetes /opt/lucky/lucky-csr.json | cfssljson -bare lucky
#基于设定的信息,创建一个认证证书

cd /opt/lucky

vim rbac-kubeconfig.sh
APISERVER=$1
# 设置集群参数
export KUBE_APISERVER="https://$APISERVER:6443"
kubectl config set-cluster kubernetes \
  --certificate-authority=/etc/kubernetes/pki/ca.crt \
  --embed-certs=true \
  --server=${KUBE_APISERVER} \
  --kubeconfig=lucky.kubeconfig

# 设置客户端认证参数
kubectl config set-credentials lucky \
  --client-key=/etc/kubernetes/pki/lucky-key.pem \
  --client-certificate=/etc/kubernetes/pki/lucky.pem \
  --embed-certs=true \
  --kubeconfig=lucky.kubeconfig

# 设置上下文参数
kubectl config set-context kubernetes \
  --cluster=kubernetes \
  --user=lucky \
  --namespace=lucky-cloud \
  --kubeconfig=lucky.kubeconfig
  
kubectl create namespace lucky-cloud
chmod +x rbac-kubeconfig.sh
./rbac-kubeconfig.sh 192.168.233.91

# 使用上下文参数生成 lucky.kubeconfig 文件
kubectl config use-context kubernetes --kubeconfig=lucky.kubeconfig

//查看证书
cat lucky.kubeconfig

mkdir /home/lucky/.kube
cp lucky.kubeconfig /home/lucky/.kube/config
chown -R lucky:lucky /home/lucky/.kube/


//RBAC授权
vim rbac.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: lucky-cloud
  name: pod-reader
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "watch", "list", "create"]

---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: read-pods
  namespace: lucky-cloud
subjects:
- kind: User
  name: lucky
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: pod-reader
  apiGroup: rbac.authorization.k8s.io
  
  
kubectl apply -f rbac.yaml

kubectl get role,rolebinding -n lucky-cloud

//切换用户,测试操作权限
su - lucky

vim pod-test.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-test
spec:
  containers:
    - name: nginx
      image: nginx


kubectl create -f pod-test.yaml

kubectl get pods -o wide

//访问 svc 资源就会被拒绝
kubectl get svc

//也无法访问 default 命名空间
kubectl get pods -n default

//使用 root 用户查看
kubectl get pods -n lucky-cloud -o wide

//也可以通过绑定 admin 角色,来获得管理员权限
kubectl create rolebinding lucky-admin-binding --clusterrole=admin --user=lucky --namespace=lucky

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐