目录
概念
rbac就是安全机制。
集群是按照用户名进行登录、按照项目名称进行命令空间的分类。
k8s的安全机制:
集群内部和外部的通信都需要靠apiserver进行调度。所有的安全机制都是围绕apiserver展开的。
要和apiserver进行通信有三关:
1. 认证 Authentication 就是token
2. 鉴权 Authorzation 就是你在集群当中权限的控制
3. 准入控制 admission control 就是能做哪些
一、认证
1. http token,是一个很长的特殊编码方式的而且是难以被模仿的特殊字符串,就是用来表达客户端的一种方式。每一个token都会对应一个用户,存储在apiserver能够访问的文件中。客户端发起对apiserver的请求时,在http header当中必须加入token。
2. http base 认证:用户名+密码进行认证
3. https证书认证:基于ca证书签名的客户端身份认证方式。这是最严格的方式。
http token和http base都是服务端对客户端的单向认证,https是双向认证的方式。
认证的资源类型:
kubectl、kubelet、kube-proxy 都是需要认证的,kubectl对pod进行管理也需要认证。
service-Account:是为了方便访问pod中的容器,以及容器访问apiserver专门创建的。每创建一个pod就会自动创建service-Account。
pod里容器目录下包含以下三个:
1. token:和apiserver认证的私钥
2. ca.crt:认证apiserver的证书
3. namespace:标识service account的命名空间
目录地址:/var/run/secrets/kubernetes.io/serviceaccount/
二、鉴权:
认证过后,就到了鉴权。鉴权就是确定请求方有哪些资源的权限。鉴权统一使用rbac进行。
角色:
Role:就是指定命名空间的资源控制权限
ClusterRole:可以指定所有的命名空间的资源控制权限
角色绑定:
rolebinding:将角色绑定到主体(用户 subject)
clusterRolebinding:将集群角色绑定到主体
主体:
user 用户
service account 服务账号(集群的服务账号)
group 用户组
模版:
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: test1
#创建的角色名称
namespace: lucky-cloud
#这个是必须要有的字段,只能有一个命名空间
rules:
#定义规则
- apiGroups: [""]
#"" 就是默认对apiserver的请求权限
resources: ["pods","services","deployments","pods/exec","pods/log"]
#给主体(用户)可以在指定的命名空间内哪些资源对象进行操作
verbs: ["get","watch","list","exec","create"]
#操作的类型
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: test2
namespace: lucky-cloud
subjects:
- kind: User
name: lucky
apiGroups: rbac.authorization.k8s.io
roleRef:
kind: Role
name: test1
apiGroups: rbac.authorization.k8s.io
注:如果创建的是clusterRolebinding,就不需要namespace
三、准入机制
rbac实验
此时就需要做认证
apiserver和用户之间连接的认证证书:
cd /usr/local/bin/
把cfssl cfssl-certinfo cfssljson这三个拖进去
chmod 777 cfssl*
客户端的签名证书:
cd /opt/rbac/
cat > lucky-csr.json <<EOF
{
"CN": "lucky",
"hosts": [],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "BeiJing",
"L": "BeiJing",
"O": "k8s",
"OU": "System"
}
]
}
EOF
cd /etc/kubernetes/pki/
cfssl gencert -ca=ca.crt -ca-key=ca.key -profile=kubernetes /opt/rbac/lucky-csr.json | cfssljson -bare lucky
和集群认证的配置文件:
cd /opt/rbac
vim rbac-config.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
chmod 777 rbac-config.sh
./rbac-config.yaml 192.168.233.31 (master的ip地址)
kubectl config use-context kubernetes --kubeconfig=lucky.kubeconfig
mkdir /home/lucky/.kube
cp lucky.kubeconfig /home/lucky/.kube/config
chown -R lucky:lucky /home/lucky/.kube/
vim role.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: test1
#创建的角色名称
namespace: lucky-cloud
#这个是必须要有的字段,只能有一个命名空间
rules:
#定义规则
- apiGroups: [""]
#"" 就是默认对apiserver的请求权限
resources: ["pods","services","deployments","pods/exec","pods/log"]
#给主体(用户)可以在指定的命名空间内哪些资源对象进行操作
verbs: ["get","watch","list","exec","create"]
#操作的类型
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: test2
namespace: lucky-cloud
subjects:
- kind: User
name: lucky
apiGroups: rbac.authorization.k8s.io
roleRef:
kind: Role
name: test1
apiGroups: rbac.authorization.k8s.io
注:#rules.verbs有:"get", "list", "watch", "create", "update", "patch", "delete", "exec"
#rules.resources有:"services", "endpoints", "pods", "secrets", "configmaps", "crontabs", "deployments", "jobs", "nodes", "rolebindings", "clusterroles", "daemonsets", "replicasets", "statefulsets", "horizontalpodautoscalers", "replicationcontrollers", "cronjobs"
kubectl create ns lucky-cloud
kubectl apply -f role.yaml
kubectl create deployment nginx1 --image=nginx;1.22 --replicas=3 -n lucky-cloud
su - lucky 切换用户
kubectl logs -f nginx1
kubectl exec -it nginx1 bash
此时就能进入容器