k8s安全机制

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根证书签名的客户端身份进行验证

认证的访问类型

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

2、pod对APi server的访问,pod coredNS dashborad都是pod,也需要访问APi

3、客户端kubelet

kubelet kube-proxy:都是通过APiserver的https证书,进行双向验证,都是用6443端口进行验证
controller manager sheduler与APi server在一台服务器,可以直接使用APi server的非安全端口访问(8080端口)
签发证书

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、service Account,就是为了方便pod中的容器访问API server

pod的动作(增删改查)动态的,每个pod手动生成一个证书,于是k8s使用了service Account来进行循环认证,service Account里面包含了统一的认证信息,直接进行api server访问

5、Secret 保存资源对象

serverAccount 内部保存的token service-Account-token
Secret保存的是自定义的保密信息 

6、serviceAccount保存信息

1、token
2、ca.crt
3、namespace
都会被自动挂载
鉴权

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

能做那些指定的操作
1、ALwaysDeny	拒绝所有,一般是测试
2、ALwaysAllow	允许所有,用测试
3、ABAC attribute-base access control	基于属性的访问控制
4、webhook	外部访问集群内部的鉴权方式
5、RBAC role-base access control	基于角色的访问控制,也是k8s现在默认的规则机制

角色
role	指定命名空间的资源控制权限
绑定角色
rolebinding	将角色绑定到指定的命名空间
集群
clusterrole	可以授权所有命名空间的资源控制权限
绑定集群
clusterrolebinding	将集群的角色绑定到命名空间
准入控制

准入控制是api server的一个准入控制器的插件列表,不同的插件可以实现不同的准入控制机制

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

有哪些准入控制
limitranger	命名空间的配置
serviceAccount
ResourceQuota	命名空间的配置限制
实验

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

创建一个用户
useradd lucky
passwd lucky

上传证书到 /usr/local/bin 目录中
chmod +x /usr/local/bin/cfssl*
mkdir /opt/lucky
cd /opt/lucky

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

/etc/kubernetes/pki/ 目录中会生成 lucky-key.pem、lucky.pem、lucky.csr
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 20.0.0.70

使用上下文参数生成 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
NAME                                        CREATED AT
role.rbac.authorization.k8s.io/pod-reader   2024-01-25T05:59:37Z

NAME                                              ROLE              AGE
rolebinding.rbac.authorization.k8s.io/read-pods   Role/pod-reader   16s

切换用户,测试操作权限
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
NAME       READY   STATUS    RESTARTS   AGE
pod-test   1/1     Running   0          33s

你可能感兴趣的:(kubernetes,安全,容器)