【Kubernetes】认证授权RBAC (一)

news2025/1/11 11:04:23

认证授权RBAC

  • 一、k8s安全管理:认证、授权、准入控制概述
    • 1.1、简介
      • 【1】认证基本介绍
      • 【2】授权基本介绍
      • 【3】准入控制基本介绍
    • 1.2、认证
      • 【1】客户端认证
      • 【2】Bearertoken
      • 【3】Serviceaccount
      • 【4】拓展:kubeconfig文件
    • 1.3、授权
      • 【1】什么是RBAC(基于角色的授权)
      • 【2】用户基于rolebinding绑定到role
      • 【3】用户基于rolebinding绑定到clusterrole
      • 【4】用户基于clusterrolebinding绑定到clusterrole
    • 1.4、准入控制
  • 二、k8s安全管理:账户
    • 2.1、Useraccount和ServiceAccount介绍
      • 【1】UserAccount
      • 【2】ServiceAccount
    • 2.2、ServiceAccount使用案例介绍
      • 【1】创建sa,并绑定到pod
      • 【2】运行pod进行,验证sa是否可以访问apiserver
      • 【3】对sa授权
      • 【4】再次请求
  • 三、RBAC认证授权策略
    • 3.1、Role角色
    • 3.2、ClusterRole集群角色
    • 3.3、RoleBinding角色绑定
    • 3.4、ClusterRolebinding集群角色绑定

一、k8s安全管理:认证、授权、准入控制概述

1.1、简介

【1】认证基本介绍

kubernetes主要通过APIserver对外提供服务,那么就需要对访问apiserver的用户做认证。
如果任何人都能访问apiserver,那么就可以随意在k8s集群部署资源,这是非常危险的,也容易被黑客攻击渗透。所以需要我们对访问的k8s系统apiserver的用户进行认证,确保是合法的、符合要求的用户

【2】授权基本介绍

认证通过后仅代表它是一个被apiserver信任的用户,能访问apierver,但是用户是否拥有删除资源的权限,需要进行授权操作,常见的授权方式有rbac授权。

【3】准入控制基本介绍

当用户经过认证和授权后,最后一步就是准入控制了。
k8s提供了多重准入控制机制,它有点类似“插件”,为apiserver提供了很好的“可扩展性”。
请求apiserver时,通过认证鉴权后、持久化(“api对象”保存到etcd)前,会经过“准入控制器”,让它可以做“变更和认证”。

为什么需要准入控制器呢?
如果我们创建pod时定义了资源上下限,但不满足LimitRange规则中定义的资源上下限,此时LimitRanger就会拒绝我们创建此pod。

假如我们定义了一个名称空间叫做test-aa,这个名称空间做下资源限制:限制最多可以使用10vCPU、10Gi内存,在这个名称空间test-aa下创建的所有pod,定义limit的时候,所有pod的limit值不能超过test-aa这个名称空间设置的limit上线。

1.2、认证

k8s客户端访问apiserver的几种认证方式:

【1】客户端认证

客户端认证也成为双向TLS认证,kubectl在访问apiserver的时候,apiserver也要认证kubectl是否是合法的,他们都会通过ca根证书来进行验证:
在这里插入图片描述

【2】Bearertoken

Beartoken的方式,可以理解为apiserver将一个密码通过了非对称加密的方式告诉了kubectl,然后通过该密码进行相互访问:
在这里插入图片描述
kubectl访问k8s集群,要找一个kubeconfig文件,基于这个文件里的用户访问apiserver。

【3】Serviceaccount

上面的俩种认证方式,都是外部访问apiserver的时候使用的方式。
serviceaccount是内部访问pod和apiserver交互时候采用的一种方式。
serviceaccount包括namespace、token、ca,且通过目录挂载的方式给与pod,当pod运行起来的时候,就会读取到这些信息,从而使用该方式和apiserver进行通信。
在这里插入图片描述

【4】拓展:kubeconfig文件

官方地址:
https://kubernetes.io/zh-cn/docs/concepts/configuration/organize-cluster-access-kubeconfig/

在k8s集群中,当我们使用kubectl操作k8s资源时,需要确定我们用哪个用户访问哪个k8s集群,kubectl操作k8s集群资源会去/root/.kube目录下找config文件,可以通过命令行查看配置文件:

[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

在上面的配置文件当中,定义了集群、上下文以及用户。
其中config也是k8s的标准资源之一,在该配置文件中定义了一个集群列表,指定的集群可有多个,用户列表也可以有多个,指明集群中的用户。
而在上下文列表当中,是进行定义可以使用哪个用户对那个集群进行访问,以及当前使用的上下文是什么。

kubectl get pods --kubeconfig=/root/.kube/config

1.3、授权

用户通过认证之后,什么权限都没有,需要一些后续的授权操作,如对资源的增删该查等,
kubernetes1.6之后开始有RBAC(基于角色的访问控制机制)授权检查机制。

Kubernetes的授权是基于插件形成的,其常用的授权插件有以下几种:
1)Node(节点认证)
2)ABAC(基于属性的访问控制)
3)RBAC(基于角色的访问控制) ***
4)Webhook(基于http回调机制的访问控制)

【1】什么是RBAC(基于角色的授权)

让一个用户(user)扮演一个角色(Role),角色拥有权限,从而让用户拥有这样的权限,随后在授权机制当中,只需要将权限授予某个角色,此时用户将获取对应角色的权限,从而实现角色的访问。

在这里插入图片描述

在k8s的授权机制当中,采用RBAC的方式进行授权,其工作逻辑是:把对对象的操作权限定义到一个角色当中,再将用户绑定到该角色,从而使用户得到对应角色的权限。
如果通过rolebinding绑定role,只能对rolebinding所在的名称空间的资源有权限。
如上图,user1绑定到role1,只对role1这个名称空间的资源有权限,对其他ns的资源无权限,属于名称空间级别的;

另外,k8s还有一种集群级别的授权机制,就是定义一个集群角色(ClusterRole),对集群内的所有资源都有课操作的权限。
user可以通过ClusterRoleBinding绑定到ClusterRole,从而使user拥有集群的操作权限。

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

限定在rolebinding所在的名称空间
在这里插入图片描述

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

在这里插入图片描述

rolebinding绑定clusterrole的好处:
假如有6个ns,每个ns下的用户都需要对自己的名称空间有管理员权限,那么需要定义6个role和rolebinding,然后依次绑定,如果ns越来越多,就要定义更多的role和rolebinding,很麻烦,所以引入clusterrole。
定义一个clusterole,对其授予所有权限,然后用户通过rolebinding绑定到clusterrole,就会拥堵对自己名称的管理员权限了

注:RoleBinding仅仅对当前名称空间有对应的权限

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

在这里插入图片描述

1.4、准入控制

在k8s上准入控制器的模块有很多,其中比较常用的有:LimitRanger、ResourceQuota、ServiceAccount、PodSecurityPolicy(k8s 1.25已废弃)等等,对于前三种准入控制器系统默认是启用的,我们只需要定义对应的规则即可;

对于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
 ......

提示:

apiserver启用准入控制插件需要使用–enable-admission-plugins选项来指定,该选项可以使用多个值,用逗号隔开表示启用指定的准入控制插件;
这里配置文件中显式启用了NodeRestrication这个插件;
默认没有写在这上面的内置准入控制器,它也是启用了的,比如LimitRanger、ResourceQuota、ServiceAccount等等;
对于不同的k8s版本,内置的准入控制器和启用与否请查看相关版本的官方文档;
对于那些没有启动的准入控制器,我们可以在上面选项中直接启用,分别用逗号隔开即可。

对应的官网地址:
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;

APIServer需要对客户端做认证,使用kubeadm安装的K8s,会在用户家目录下创建一个认证配置文件 .kube/config 这里面保存了客户端访问API Server的密钥相关信息,这样当用kubectl访问k8s时,它就会自动读取该配置文件,向API Server发起认证,然后完成操作请求。

用户名称可以在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介绍

在Kubernetes中,所有资源对象都是通过API进行操作,他们保存在etcd里。
而对etcd的操作我们需要通过访问 kube-apiserver 来实现,上面的Service Account其实就是APIServer的认证过程,而授权的机制是通过RBAC:基于角色的访问控制实现。

3.1、Role角色

一组权限的集合,在一个命名空间中,可以用其来定义一个角色,只能对命名空间内的资源进行授权。如果是集群级别的资源,则需要使用ClusterRole。

例如:定义一个角色用来读取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集群角色

具有和角色一致的命名空间资源的管理能力,还可用于以下特殊元素的授权.
1、集群范围的资源,例如Node
2、非资源型的路径,例如:/healthz
3、包含全部命名空间的资源,例如Pods

例如:定义一个集群角色可让用户访问任意secrets

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: secrets-clusterrole
rules:
- apiGroups: [""]
 resources: ["secrets"]
verbs: ["get","watch","list"]

3.3、RoleBinding角色绑定

角色绑定和集群角色绑定用于把一个角色绑定在一个目标上,可以是User,Group,Service Account,使用RoleBinding为某个命名空间授权,使用ClusterRoleBinding为集群范围内授权。

例如:将在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集群角色绑定

RoleBinding也可以引用ClusterRole,对属于同一命名空间内的ClusterRole定义的资源主体进行授权.
例如:es能获取到集群中所有的资源信息.

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1361931.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

8、VS中Git使用

VS中Git使用 1.基础操作1.1 VS配置Git1.2 操作界面 2.本地库版本管理2.1 创建管理本地库2.2 暂存、存储2.3 提交2.4 版本切换 3.分支操作3.1 分支应用3.2 新建分支3.3 合并分支、解决冲突3.4 删除分支 4.远程库版本管理4.1 新建、克隆4.2 提取、拉取、推送与同步4.3 团队开发 最…

每日一题——LeetCode1051.高度检查器

方法一 sort排序: 创建一个元素和heights一模一样的expect数组 ,将expect数组从小到大进行排序,比较heights和expect相同位置不同的元素个数 var heightChecker function(heights) {var expect [],count0for(const n of heights){expect.…

Ubuntu 安装Nginx服务

文章目录 前言一、Nginx安装1. Nginx默认安装2. Nginx指定版本安装3. Nginx验证4. Nginx服务控制4.1 查看服务状态4.2 停止服务4.3 启动服务4.4 重启服务 5. Nginx文件存放目录 二、自己编译Nginx1. 下载源码2. 依赖配置3. 编译 三、Nginx卸载总结 前言 Nginx(发音为…

时序分解 | Matlab实现CPO-VMD基于冠豪猪优化算法(CPO)优化VMD变分模态分解时间序列信号分解

时序分解 | Matlab实现CPO-VMD基于冠豪猪优化算法(CPO)优化VMD变分模态分解时间序列信号分解 目录 时序分解 | Matlab实现CPO-VMD基于冠豪猪优化算法(CPO)优化VMD变分模态分解时间序列信号分解效果一览基本介绍程序设计参考资料 效果一览 基本介绍 【原创】CPO-VMD【24年新算法…

LeetCode做题总结 15. 三数之和、18. 四数之和 (Java)

不会做,参考了代码随想录和力扣官方题解,对此题进行整理。 X数之和 15. 三数之和代码思路20240103重写错误1错误2Java语言点总结 18. 四数之和代码思路20240104(伪)错误1 第一次剪枝错误2 第二次剪枝错误3 溢出 15. 三数之和 代码…

python中parsel模块的css解析

一、爬虫页面分类 1.想要爬取的内容全部在标签中,可以使用xpath去进行解析如下图 2.想要爬取的内容呈现json的数据特征,用.json()转换为字典格式 3.页面不规则,标签中包含大括号,如下面想要获取键值内容怎么做,先用re正…

Hive学习(13)lag和lead函数取偏移量

hive里面lag函数 在数据处理和分析中,窗口函数是一种重要的技术,用于在数据集中执行聚合和分析操作。Hive作为一种大数据处理框架,也提供了窗口函数的支持。在Hive中,Lag函数是一种常用的窗口函数,可以用于计算前一行…

R 批量对多个变量进行单因素方差分析 批量计算均值±标准差

多个变量批量进行单因素方差 R实现 文章目录 一、批量生成均值标准差 P值二、添加协变量单因素方差分析,生成校正P值三、在分层情况下进行单因素方差分析四、添加协变量和交互项的单因素方差分析,生成交互项的P值 一、批量生成均值标准差 P值 数据结构如…

设计模式之单例模式的懒饿汉

懒汉式 说白了就是你不叫我我不动,你叫我我才动。 类初始化模式,也叫延迟占位模式。在单例类的内部由一个私有静态内部类来持有这个单例类的实例。因为在 JVM 中,对类的加载和类初始化,由虚拟机保证线程安全。 public class Singl…

【Proteus仿真】【Arduino单片机】水箱液位监控系统

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真Arduino单片机控制器,使用LCD1602液晶、按键、蜂鸣器、液位传感器、ADC转换器、水泵等。 主要功能: 系统运行后,LCD1602显示当前水位、上下限阈…

支持 input 函数的在线 python 运行环境 - 基于队列

支持 input 函数的在线 python 运行环境 - 基于队列 思路两次用户输入三次用户输入 实现前端使用 vue element uiWindows 环境的执行器子进程需要执行的代码 代码仓库参考 本文提供了一种方式来实现支持 input 函数,即支持用户输的在线 python 运行环境。效果如下图…

[NAND Flash 5.2] SLC、MLC、TLC、QLC、PLC NAND_闪存颗粒类型

依公知及经验整理&#xff0c;原创保护&#xff0c;禁止转载。 专栏 《深入理解NAND Flash》 <<<< 返回总目录 <<<< 前言 闪存最小物理单位是 Cell, 一个Cell 是一个晶体管。 闪存是通过晶体管储存电子来表示信息的。在晶体管上加入了浮动栅贮存电子…

网络调试 TCP,开发板用静态地址-入门7

用两台电脑&#xff08;无线网络&#xff09;做实验 1.1, 在电脑A上设置为Server如下&#xff1a; 选择TCP Server后&#xff0c;直接跳出用本机IP做为“本地主机地址” 1.2在 电脑B上设置为Client, 远程主机地址设置为Server的 IP 1.3, 在A, B两台电脑上能够互相发送数据 用…

Pyinstaller 打包的文件过大,根本原因在于包含了无用的依赖文件

环境要求&#xff1a;Windows&#xff0c;Pyinstaller 6.3.0 (不是这个版本的话&#xff0c;请逐步校对以下我在运行过程中的截图) 本文所使用代码不开源&#xff0c;觉得本文的思路可行的话&#xff0c;请加 QQ - 1398173074 购买 (&#xffe5;30&#xff0c;注明来意)&…

算力-计算量,关于TOPS和FLOPS,及FLOPs

目录 一、易混淆的三个点 二、芯片算力单位详解 四、模型算力单位详解 五、算力单位量级变换 六、计算机存储单位换算 七、科学计算单位换算 一、易混淆的三个点 关于TOPS和FLOPS&#xff0c;及FLOPs&#xff0c;这里有3个易混淆的点。 1、最大的混淆点&#xff0c…

MybatisPlus—快速入门

目录 1.使用MybatisPlus的基本步骤 1.1引入MybatisPlus的起步依赖 1.2 定义Mapper 2.MybatisPlus常用注解 2.1 TableName 2.2 TableId 2.3 TableField 2.4 小结 3. 常用配置 4. 总结 1.使用MybatisPlus的基本步骤 1.1引入MybatisPlus的起步依赖 MyBatisPlus官方提…

(04)刻蚀——选择刻蚀材料创建所需图形

01、光“堆叠”可不行 前期我们了解了如何制作“饼干模具”。本期,我们就来讲讲如何采用这个“饼干模具”印出我们想要的“饼干”。这一步骤的重点,在于如何移除不需要的材料,即“刻蚀(Etching)工艺”。 ▲ 图1: 移除饼干中间部分,再倒入巧克力糖浆 让我们再来回想一下…

im6ull学习总结(三-3)freetype

1、Freetype简介 FreeType是一个开源的字体渲染引擎&#xff0c;主要用于将字体文件转换为位图或矢量图形&#xff0c;并在屏幕上渲染出高质量的字体。它提供了一组API&#xff0c;使开发者能够在自己的应用程序中使用和呈现字体。 FreeType最初是作为一个独立项目开发的&…

基于X86的助力智慧船载监控系统

船载综合监控系统结合雷达、AIS、CCTV、GPS等探测技术&#xff0c;以及高度融合的实时态势与认知技术&#xff0c;实现对本船以及范围内船舶的有效监控&#xff0c;延伸岸基监控中心监管范围&#xff0c;保障行船安全&#xff0c;为船舶安全管理部门实现岸基可控的数据通信和动…

程序员必知!责任链模式的实战应用与案例分析

责任链模式让多个对象依次处理请求&#xff0c;降低发送者和接收者的耦合度&#xff0c;以在线购物为例&#xff0c;用户提交订单需经多步验证&#xff0c;通过责任链模式&#xff0c;验证器按顺序处理请求&#xff0c;先用户身份&#xff0c;再支付方式&#xff0c;最后配送地…