Kubernetes 安全机制

Kubernetes 安全框架 API 认证三关

  • 访问 K8S 集群的资源需要过三关:认证、鉴权、准入控制

  • 普通用户进行访问的时候,都需要经过 apiserver, apiserver 做统一协调,比如门卫

    • 访问过程中,需要证书、token、或者用户名和密码
    • 如果访问 pod 需要 serviceAccount
  • K8S 安全控制框架主要由下面 3 个阶段进行控制,每一个阶段都支持插件方式,通过 API Server 配置来启用插件。

    1. Authentication(认证)
    2. Authorization(授权)
    3. Admission Control(准入控制)

查看ServiceAccount

1
2
3
4
5
# kubectl get sa

NAME SECRETS AGE
default 1 5d22h
nfs-client-provisioner 1 3h1m

认证

对外不暴露 8080 端口,只能内部访问,对外使用的端口 6443

客户端身份认证常用方式

  • https 证书认证,基于 ca 证书。
  • http token 认证,通过 token 来识别用户。
  • http 基本认证,用户名 + 密码认证。

授权

RBAC(Role-Based Access Control,基于角色的访问控制):负责完成授权(Authorization)工作。

准入控制

Adminssion Control 实际上是一个准入控制器插件列表,发送到 API Server 的请求都需要经过这个列表中的每个准入控制器。

插件的检查,检查不通过,则拒绝请求。

1.11 版本以上推荐使用的插件:

1
2
--enable-admission-plugins= \
NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds, ResourceQuota

RBAC 核心概念

RBAC(Role-Based Access Control,基于角色的访问控制),允许通过 Kubernetes API 动态配置策略。

k8s 中有默认的几个角色

  • Role:授权特定命名空间的访问权限
  • ClusterRole:授权所有命名空间的访问权限

角色绑定

  • RoleBinding:将角色绑定到主体(即subject)
  • ClusterRoleBinding:将集群角色绑定到主体

主体(subject)

  • User:用户
  • Group:用户组
  • ServiceAccount:服务账号

RBAC 实现鉴权

1、创建命名空间

首先查看已经存在的命名空间

1
kubectl get namespace

然后我们创建一个自己的命名空间 roledemo。

为什么要创建命名空间?因为如果不创建命名空间的话,默认是在 default 下。

1
kubectl create ns roledemo

2、命名空间创建Pod

1
kubectl run nginx --image=nginx -n roledemo

3、创建角色

1
2
3
4
5
6
7
8
9
10
11
# vim rbac-role.yaml

kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
namespace: roledemo
name: pod-reader
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "watch", "list"]

tip:这个角色只对 pod 有 get、list 权限

然后通过 yaml 创建我们的role

1
2
3
4
5
kubectl apply -f rbac-role.yaml     # 创建
kubectl get role -n roledemo # 查看

NAME AGE
pod-reader 19s

4、创建角色绑定

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# role-rolebinding.yaml

kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: read-pods
namespace: default
subjects:
- kind: User
name: lucy
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role
name: pod-reader
apiGroup: rbac.authorization.k8s.io

然后创建我们的角色绑定

1
2
3
4
# 创建角色绑定
kubectl apply -f rbac-rolebinding.yaml
# 查看角色绑定
kubectl get role, rolebinding -n roledemo

5、使用证书识别身份

我们首先得有一个 rbac-user.sh 证书脚本

这里包含了很多证书文件,在TSL目录下,需要复制过来

通过下面命令执行我们的脚本

1
./rbac-user.sh

最后我们进行测试

1
2
3
4
# 用get命令查看 pod 【有权限】
kubectl get pods -n roledemo
# 用get命令查看svc 【没权限】
kubectl get svc -n roledmeo


Kubernetes 安全机制
https://flepeng.github.io/042-云原生-02-kubernetes-31-核心概念-Kubernetes-安全机制/
作者
Lepeng
发布于
2023年3月1日
许可协议