这个手刹不太灵儿

这个手刹不太灵儿

认证授权RBAC

一、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(基于角色的授权)

【Kubernetes】认证授权RBAC (一)-LMLPHP

【2】用户基于rolebinding绑定到role

限定在rolebinding所在的名称空间
【Kubernetes】认证授权RBAC (一)-LMLPHP

【3】用户基于rolebinding绑定到clusterrole

【Kubernetes】认证授权RBAC (一)-LMLPHP

注:

【4】用户基于clusterrolebinding绑定到clusterrole

【Kubernetes】认证授权RBAC (一)-LMLPHP

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
01-07 00:57