一、k8s安全管理:认证、授权、准入控制概述
1.1、简介
【1】认证基本介绍
【2】授权基本介绍
【3】准入控制基本介绍
为什么需要准入控制器呢?
如果我们创建pod时定义了资源上下限,但不满足LimitRange规则中定义的资源上下限,此时LimitRanger就会拒绝我们创建此pod。
假如我们定义了一个名称空间叫做test-aa,这个名称空间做下资源限制:限制最多可以使用10vCPU、10Gi内存,在这个名称空间test-aa下创建的所有pod,定义limit的时候,所有pod的limit值不能超过test-aa这个名称空间设置的limit上线。
1.2、认证
k8s客户端访问apiserver的几种认证方式:
【1】客户端认证
【2】Bearertoken
【3】Serviceaccount
【4】拓展:kubeconfig文件
官方地址:
https://kubernetes.io/zh-cn/docs/concepts/configuration/organize-cluster-access-kubeconfig/
[root@master ~]# kubectl config view
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: DATA+OMITTED
server: https://10.32.1.147:6443 # apiserver地址
name: kubernetes # 集群的名字
contexts:
- context:
cluster: kubernetes
user: kubernetes-admin
name: kubernetes-admin@kubernetes # 上下文的名字
current-context: kubernetes-admin@kubernetes # 当前上下文
kind: Config
preferences: {}
users:
- name: kubernetes-admin
user:
client-certificate-data: REDACTED
client-key-data: REDACTED
kubectl get pods --kubeconfig=/root/.kube/config
1.3、授权
用户通过认证之后,什么权限都没有,需要一些后续的授权操作,如对资源的增删该查等,
kubernetes1.6之后开始有RBAC(基于角色的访问控制机制)授权检查机制。
【1】什么是RBAC(基于角色的授权)
【2】用户基于rolebinding绑定到role
限定在rolebinding所在的名称空间
【3】用户基于rolebinding绑定到clusterrole
注:
【4】用户基于clusterrolebinding绑定到clusterrole
1.4、准入控制
对于PodSecurityPolicy(k8s1.25废弃了)这种准入控制器,系统默认没有启用,如果我们要使用,就必需启用以后,对应规则才会正常生效;这里需要注意一点,对应psp准入控制器,一定要先写好对应的规则,把规则和权限绑定好以后,在启用对应的准入控制器,否则先启用准入控制器,没有对应的规则,默认情况它是拒绝操作,这可能导致现有的k8s系统跑的系统级pod无法正常工作;所以对于psp准入控制器要慎用,如果规则和权限做的足够精细,它会给我们的k8s系统安全带来大幅度的提升,反之,可能导致整个k8s系统不可用。
查看apiserver启用的准入控制器有哪些?
[root@master ~]# cat /etc/kubernetes/manifests/kube-apiserver.yaml
apiVersion: v1
kind: Pod
metadata:
annotations:
kubeadm.kubernetes.io/kube-apiserver.advertise-address.endpoint: 10.32.1.147:6443
creationTimestamp: null
labels:
component: kube-apiserver
tier: control-plane
name: kube-apiserver
namespace: kube-system
spec:
containers:
- command:
- kube-apiserver
- --advertise-address=10.32.1.147
- --allow-privileged=true
- --authorization-mode=Node,RBAC
- --client-ca-file=/etc/kubernetes/pki/ca.crt
- --enable-admission-plugins=NodeRestriction
......
提示:
对应的官网地址:
https://kubernetes.io/zh-cn/docs/reference/access-authn-authz/admission-controllers/
二、k8s安全管理:账户
2.1、Useraccount和ServiceAccount介绍
kubernetes中账户分为:UserAccounts(用户账户)
和 ServiceAccounts(服务账户)
两种。
【1】UserAccount
UserAccount是给kubernetes集群外部用户使用的,如kubectl访问k8s集群要用useraccount用户, kubeadm安装的k8s,默认的useraccount用户是kubernetes-admin;
用户名称可以在kubeconfig中查看
[root@master ~]# cat ~/.kube/config
...
users:
- name: kubernetes-admin
...
【2】ServiceAccount
- ServiceAccount是Pod使用的账号,Pod容器的进程需要访问API Server时用的就是ServiceAccount账户;
- ServiceAccount仅局限它所在的namespace,每个namespace创建时都会自动创建一个default service account;
- 创建Pod时,如果没有指定Service Account,Pod则会使用default Service Account。
2.2、ServiceAccount使用案例介绍
【1】创建sa,并绑定到pod
[root@master 16]# kubectl create sa sa-test
serviceaccount/sa-test created
[root@master 16]# cat pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: sa-test
namespace: default
labels:
app: sa
spec:
serviceAccountName: sa-test
containers:
- name: sa-tomcat
ports:
- containerPort: 80
image: nginx
imagePullPolicy: IfNotPresent
[root@master 16]# kubectl apply -f pod.yaml
pod/sa-test created
【2】运行pod进行,验证sa是否可以访问apiserver
[root@master 16]# kubectl exec -it sa-test -- /bin/bash
root@sa-test:/# cd /var/run/secrets/kubernetes.io/serviceaccount/
root@sa-test:/var/run/secrets/kubernetes.io/serviceaccount# curl --cacert ./ca.crt -H "Authorization: Bearer $(cat ./token)" https://kubernetes/api/v1/namespaces/kube-system
{
"kind": "Status",
"apiVersion": "v1",
"metadata": {},
"status": "Failure",
"message": "namespaces \"kube-system\" is forbidden: User \"system:serviceaccount:default:sa-test\" cannot get resource \"namespaces\" in API group \"\" in the namespace \"kube-system\"",
"reason": "Forbidden",
"details": {
"name": "kube-system",
"kind": "namespaces"
},
"code": 403
}
# 上面结果能看到,sa能通过https方式成功认证API
# 但是没有权限访问k8s资源,所以code状态码是403,表示没有权限操作k8s资源
【3】对sa授权
[root@master 16]# kubectl create clusterrolebinding sa-test-admin --clusterrole=cluster-admin --serviceaccount=default:sa-test
clusterrolebinding.rbac.authorization.k8s.io/sa-test-admin created
【4】再次请求
# 请求指定ns空间下的资源
root@sa-tst:/var/run/secrets/kubernetes.io/serviceaccount# curl --cacert ./ca.crt -H "Authorization: Bearer $(cat ./token)" https://kubernetes/api/v1/namespaces/kube-system
{
"kind": "Namespace",
"apiVersion": "v1",
"metadata": {
"name": "kube-system",
"uid": "1634946c-f5c2-4b67-ad3a-425107a83cd0",
"resourceVersion": "26",
"creationTimestamp": "2023-12-06T02:47:03Z",
"labels": {
"kubernetes.io/metadata.name": "kube-system"
},
"managedFields": [
{
"manager": "kube-apiserver",
"operation": "Update",
"apiVersion": "v1",
"time": "2023-12-06T02:47:03Z",
"fieldsType": "FieldsV1",
"fieldsV1": {
"f:metadata": {
"f:labels": {
".": {},
"f:kubernetes.io/metadata.name": {}
}
}
}
}
]
},
"spec": {
"finalizers": [
"kubernetes"
]
},
"status": {
"phase": "Active"
}
}root@sa-test:/var/run/secrets/kubernetes.io/serviceaccount#
# 请求pod资源
root@sa-test:/var/run/secrets/kubernetes.io/serviceaccount# curl --cacert ./ca.crt -H "Authorization: Bearer $(cat ./token)" https://kubernetes/apiv1/pods
......
三、RBAC认证授权策略
RBAC介绍
3.1、Role角色
例如:定义一个角色用来读取Pod的权限.
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: rbac
name: pod-read
rules:
- apiGroups: [""]
resources: ["pods"]
resourceNames: []
verbs: ["get","watch","list"]
rules中的参数说明:
1、apiGroups:支持的API组列表,例如:"apiVersion: apps/v1"等
2、resources:支持的资源对象列表,例如pods、deployments、jobs等
3、resourceNames: 指定resource的名称
4、verbs:对资源对象的操作方法列表。
3.2、ClusterRole集群角色
例如:定义一个集群角色可让用户访问任意secrets
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: secrets-clusterrole
rules:
- apiGroups: [""]
resources: ["secrets"]
verbs: ["get","watch","list"]
3.3、RoleBinding角色绑定
例如:将在rbac命名空间中把pod-read角色授予用户es
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: pod-read-bind
namespace: rbac
subjects:
- kind: User
name: es
apiGroup: rbac.authorization.k8s.io
roleRef:
- kind: Role
name: pod-read
apiGroup: rbac.authorizatioin.k8s.io
3.4、ClusterRolebinding集群角色绑定
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: es-allresource
namespace: rbac
subjects:
- kind: User
name: es
apiGroup: rbac.authorization.k8s.io
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin