rbac安全机制

目录

概念

rbac实验


概念

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  

此时就能进入容器

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值