Apache Kafka 中的认证、鉴权原理与应用
编辑导读:本篇内容将进一步介绍 Kafka 中的认证、鉴权等概念。AutoMQ 是与 Apache Kafka 100% 完全兼容的新一代 Kafka,可以帮助用户降低 90%以上的 Kafka 成本并且进行极速地自动弹性。作为 Kafka 生态的忠实拥护者,我们也会持续致力于传播 Kafka 技术,欢迎关注我们。
我们在此前的文章《AutoMQ SASL 安全身份认证配置教程》[1]介绍过 Apache Kafka (以下简称 Kafka)服务端和客户端的 SASL 认证协议配置,并在《AutoMQ SSL 安全协议配置教程》[2]详细介绍了如何利用 SSL(TLS) 实现 Kafka 或 AutoMQ 的安全通信。本文将进一步概述 Kakfa 中的认证方法和鉴权策略,并通过一个例子来说明我们在真实应用场景中如何对 Kafka 或者 AutoMQ 集群开启身份认证和鉴权。
注意,本文默认 Kafka 集群是以 Kraft 模式工作的。
Listener、安全协议、认证与鉴权的关系
先回顾一下 listener 的作用。listener 是 Kafka 服务端定义监听地址(域名/IP + 端口)和安全协议的实体。一般情况下,我们可以利用多 listener 来差异化设置:
-
broker 与 broker 之间,controller 与 broker 之间,client 与 broker 之间的通信安全协议;
-
内网(局域网或 VPC 内部)访问 broker、外网访问 broker 时的通信安全协议;
我们可以将 listener name 跟安全协议进行映射,举例来说,Kafka 支持以下安全协议:
我们可以设置 client 与 broker 之间使用 SASL_SSL 协议保证加密性,而集群节点之间使用 SASL_PLAINTEXT 减少 CPU 加密解密的消耗:
listeners=EXTERNAL://:9092,BROKER://10.0.0.2:9094
advertised.listeners=EXTERNAL://broker1.example.com:9092,BROKER://broker1.local:9094
listener.security.protocol.map=EXTERNAL:SASL_SSL,BROKER:SASL_PLAINTEXT
inter.broker.listener.name=BROKER
下图展示了 Listener、安全协议、认证与鉴权之间的关系
安全协议决定了服务端和客户端之间的认证(Authentication)协议,而鉴权(Authorization)基本独立于认证,只校验通过认证的主体对请求中涉及的资源是否有操作权限。下文将详细介绍认证方法和鉴权规则。
认证
认证主体
先简单介绍一下认证主体的概念。
认证主体是对 client 的身份标识,对应一个 KafkaPrincipal 对象[5]。当 client 通过认证协议完成认证后,broker 侧会将该 KafkaPrincipal 对象塞入 RequestContext,并向上传递,以供后续鉴权。一个 KafkaPrincipal 对象主要包括主体类型(目前仅有"User"这一类别)以及一个名称(可以简单理解为 client 声明的用户名)。
认证协议
安全协议到认证协议之间的映射为:
-
PLAINTEXT:无认证;
-
SSL:无认证/mTLS;
-
SASL_PLAINTEXT: SASL;
-
SASL_SSL: SASL;
其中 SSL 如果想要利用 mTLS 进行认证,需要在 broker 侧开启对 client 的 SSL 验证:
ssl.client.auth=required
利用证书中的“DistinguishedName”字段[4]识别认证主体。由于认证通常涉及到用户的管理,这种通过证书进行认证的方式在增删用户时显得比较“笨重”(尤其是动态增删用户的场景),并不是主流的认证方式。
SASL 认证协议又可以进一步细分为以下认证机制:
-
GSSAPI:借助第三方 Kerberos[3](一种基于 ticket 的加密认证协议)服务器进行认证认证;
-
PLAIN:简单账密认证,注意它跟前文的 PLAINTEXT 不是一个概念;
-
SCRAM-SHA-256/512:基于 SCRAM 算法,由 Kafka 节点基于 record 自认证;
-
OAUTHBEARER:借助第三方 OAuth 服务器认证;
Kafka broker 允许同时启用多种 SASL 认证,例如同时启用 SCRAM-SHA-256/512 + PLAIN:
sasl.enabled.mechanisms=SCRAM-SHA-256,PLAIN,SCRAM-SHA-512
Broker 侧还需要额外的 JAAS 配置,在《AutoMQ SASL 安全身份认证配置教程》中已经提及,这里不再赘述。
需要注意的是,Kafka 提供了默认的 SASL/PLAIN 实现,需要在每个节点配置中显示声明账密信息。这种静态认证方式同样不利于用户的动态管理,可以通过集成外部的账密认证服务器来提供动态能力。
鉴权
鉴权是基于认证主体,检查是否有权限操作请求的资源。
鉴权配置
重要的配置包括:
-
authorizer.class.name:指定鉴权器,默认为空。Kraft 模式下可以填写官方提供的 “org.apache.kafka.metadata.authorizer.StandardAuthorizer”,基于 ACL(access control list)规则认证;
-
super.users:设置超级用户,默认为空。格式为 User:{userName}。这里指定的用户将不受 ACL 约束,直接拥有所有资源的所有操作权限;
-
allow.everyone.if.no.acl.found:指定资源没有任意 ACL 约束时的默认权限,默认为 false。false 表示仅允许 super user 操作,true 表示允许任意用户操作。
鉴权规则
Kafka 是基于 ACL(access control list) 规则限制用户对资源的访问的。一条 ACL 规则包含两部分:
-
ResourcePattern:声明资源及其匹配方式,包含:
-
ResourceType:资源类型,包括 TOPIC、GROUP(消费者组)、CLUSTER 等;
-
ResourceName:资源名称;
-
PatternType:资源匹配方式,包括 LITERAL(全文匹配) 和 PREFIXED(前缀匹配);
-
-
AccessControlEntry:用户限制信息,包括:
-
Principal:认证主体,其实就是个用户名;
-
Host:用户主机地址;
-
AclOperation:操作行为,包括 Read、Write、CREATE、DELETE 等;
-
AclPermissionType:允许/禁止。
-
一句话串联上述规则信息就是:
允许/禁止 来自 {Host} 的用户 {Principal} 对匹配类型为 {PatternType} 、名称为 {ResourceName} 的资源进行 {AclOperation} 操作。
当同时满足:
-
存在某条 ACL 允许用户操作
-
不存在任何一条 ACL 禁止用户操作
时,允许用户对资源进行操作。
需要注意的是,可以将通配符“*”作为 ResourceName 或 Host 的内容。对于 Host 字段,填写“*” 表示任意地址。ResourceName 为 “*”,且 PatternType 为 LITERAL 时表示匹配任意名称;如果 ResourceName 为 “*”,PatternType 为 PREFIXED,表示匹配前缀名称为“*”的资源。
此外,当 ResourceType 为 CLUSTER 时,ResourceName 只能填写"kafka-cluster"。
升级认证协议或开启鉴权
某些情况下我们需要考虑安全协议的切换,或者需要将集群从无鉴权转为开启鉴权。例如,在开发环境中,我们通常直接用默认的 PLAINTEXT 配置集群,如果不幸在测试或生产环境中也使用了 PLAINTEXT 协议,那么就需要考虑升级安全协议并开启鉴权。
以下以“PLAINTEXT、无鉴权”升级为“SASL_PLAINTEXT、开启鉴权”为例,介绍如何平滑过渡。其他安全协议的变化可以以此类推。
以下假定三台 Kafka 节点都在本机部署,使用不同的端口以示区分。三台节点均为 controller + broker 的混部节点。注意,各个阶段变更时,需要一一重启各个节点。
整体逻辑示意图:
集群共需要三轮重启,业务侧需要一轮重启。
原始配置
以下为第一个节点在 PLAINTEXT 协议下的部分配置,其他节点配置依次类推:
node.id=1
controller.quorum.voters=1@localhost:9093,2@localhost:9095,3@localhost:9097
listeners=PLAINTEXT://:9092,CONTROLLER://:9093
inter.broker.listener.name=PLAINTEXT
advertised.listeners=PLAINTEXT://localhost:9092
controller.listener.names=CONTROLLER
listener.security.protocol.map=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT,SSL:SSL,SASL_PLAINTEXT:SASL_PLAINTEXT,SASL_SSL:SASL_SSL
阶段一:新协议+默认 ALLOW 鉴权上线
node.id=1
# 保持不变
controller.quorum.voters=1@localhost:9093,2@localhost:9095,3@localhost:9097
# controller 和 broker 的新 listener 上线
listeners=PLAINTEXT://:9092,CONTROLLER://:9093,BROKER_SASL://:9192,CONTROLLER_SASL://:9193
# 保持不变
inter.broker.listener.name=PLAINTEXT
# 新地址上线
advertised.listeners=PLAINTEXT://localhost:9092,BROKER_SASL://localhost:9192
# 新 listener 上线
controller.listener.names=CONTROLLER,CONTROLLER_SASL# authorization
authorizer.class.name=org.apache.kafka.metadata.authorizer.StandardAuthorizer
# 允许所有人访问资源
allow.everyone.if.no.acl.found=true
# 超级用户,用于节点之间认证
super.users=User:automqsasl.enabled.mechanisms=SCRAM-SHA-256,PLAIN,SCRAM-SHA-512
# 指定与 broker 通信时具体的 SASL 机制
sasl.mechanism.inter.broker.protocol=PLAIN
# 指定与 controller 通信时具体的 SASL 机制
sasl.mechanism.controller.protocol=PLAIN
# 静态账密配置
listener.name.broker_sasl.plain.sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required \username="automq" \password="automq-secret" \user_automq="automq-secret";listener.name.controller_sasl.plain.sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required \username="automq" \password="automq-secret" \user_automq="automq-secret";# 认证模块配置
listener.name.broker_sasl.scram-sha-256.sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required;
listener.name.controller_sasl.scram-sha-256.sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required;
listener.name.broker_sasl.scram-sha-512.sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required;
listener.name.controller_sasl.scram-sha-512.sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required;# 添加新 listener 到 安全协议的映射
listener.security.protocol.map=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT,SSL:SSL,SASL_PLAINTEXT:SASL_PLAINTEXT,SASL_SSL:SASL_SSL,BROKER_SASL:SASL_PLAINTEXT,CONTROLLER_SASL:SASL_PLAINTEXT
其中“allow.everyone.if.no.acl.found”设置为 true,是为了让线上的 client 能够正常认证,避免直接鉴权失败。
“controller.listener.names”设置为“CONTROLLER,CONTROLLER_SASL”,表示 controller 同时使用两个 listener,并且本 node 的 broker 将使用“CONTROLLER”映射的安全协议与 controller 通信。
本阶段结束以后,需要通知业务方重新配置基于 SASL_PLAINTEXT 配置客户端。同时,需要为各业务方配置 ACL 所需的规则。
阶段二:节点之间使用新协议+鉴权开启
在上一阶段执行后,新协议下的 listener 已经上线,并可以对外提供服务,但是集群的节点之间依旧维持原有的通信协议,本阶段会将内部通信进行升级:
node.id=1
# 使用新 controller 端口
controller.quorum.voters=1@localhost:9193,2@localhost:9195,3@localhost:9197
# 保持不变
listeners=PLAINTEXT://:9092,CONTROLLER://:9093,BROKER_SASL://:9192,CONTROLLER_SASL://:9193
# 使用新协议
inter.broker.listener.name=BROKER_SASL
# 使用新地址
advertised.listeners=PLAINTEXT://localhost:9092,BROKER_SASL://localhost:9192# 注意顺序变化
controller.listener.names=CONTROLLER_SASL,CONTROLLER# authorization
authorizer.class.name=org.apache.kafka.metadata.authorizer.StandardAuthorizer
# allow.everyone.if.no.acl.found=true
super.users=User:automq# 保持不变
sasl.enabled.mechanisms=SCRAM-SHA-256,PLAIN,SCRAM-SHA-512
sasl.mechanism.inter.broker.protocol=PLAIN
sasl.mechanism.controller.protocol=PLAIN
listener.name.broker_sasl.plain.sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required \username="automq" \password="automq-secret" \user_automq="automq-secret";
listener.name.controller_sasl.plain.sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required \username="automq" \password="automq-secret" \user_automq="automq-secret";# 保持不变
listener.name.broker_sasl.scram-sha-256.sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required;
listener.name.controller_sasl.scram-sha-256.sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required;
listener.name.broker_sasl.scram-sha-512.sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required;
listener.name.controller_sasl.scram-sha-512.sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required;# 保持不变
listener.security.protocol.map=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT,SSL:SSL,SASL_PLAINTEXT:SASL_PLAINTEXT,SASL_SSL:SASL_SSL,BROKER_SASL:SASL_PLAINTEXT,CONTROLLER_SASL:SASL_PLAINTEXT
注意,“allow.everyone.if.no.acl.found”配置被注释掉了,也就是不再默认允许任何人任意操作资源了。
阶段三:下线旧协议
node.id=1# 保持不变
controller.quorum.voters=1@localhost:9193,2@localhost:9195,3@localhost:9197
# 下线旧 listener
listeners=BROKER_SASL://:9192,CONTROLLER_SASL://:9193# 保持不变
inter.broker.listener.name=BROKER_SASL# 下线旧地址
advertised.listeners=BROKER_SASL://localhost:9192# 下线旧 listener
controller.listener.names=CONTROLLER_SASL# authorization
authorizer.class.name=org.apache.kafka.metadata.authorizer.StandardAuthorizer
# allow.everyone.if.no.acl.found=true
super.users=User:automq# 保持不变
sasl.enabled.mechanisms=SCRAM-SHA-256,PLAIN,SCRAM-SHA-512
sasl.mechanism.inter.broker.protocol=PLAIN
sasl.mechanism.controller.protocol=PLAIN
listener.name.broker_sasl.plain.sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required \username="automq" \password="automq-secret" \user_automq="automq-secret";
listener.name.controller_sasl.plain.sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required \username="automq" \password="automq-secret" \user_automq="automq-secret";# 保持不变
listener.name.broker_sasl.scram-sha-256.sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required;
listener.name.controller_sasl.scram-sha-256.sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required;
listener.name.broker_sasl.scram-sha-512.sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required;
listener.name.controller_sasl.scram-sha-512.sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required;# 保持不变
listener.security.protocol.map=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT,SSL:SSL,SASL_PLAINTEXT:SASL_PLAINTEXT,SASL_SSL:SASL_SSL,BROKER_SASL:SASL_PLAINTEXT,CONTROLLER_SASL:SASL_PLAINTEXT
至此,旧协议下线,所有通信基于 SASL_PLAINTEXT 协议。
总结
本文概述了 Kafka 中的认证协议和鉴权策略。首先介绍了 listener 与安全协议的映射,以及安全协议与认证方法的映射。接着分别介绍 Kafka 中支持的多种认证协议,以及 ACL 鉴权策略。在认证通过后,Kafka 会生成一个认证主体,供上层进行细粒度的鉴权。最后介绍了如何对一个运行中的 Kafka 集群中进行认证协议升级以及开启鉴权。
参考文献
[1] https://www.automq.com/blog/automq-sasl-security-authentication-configuration-guide
[2] https://www.automq.com/blog/automq-ssl-security-protocol-configuration-tutorial
[3] https://developer.confluent.io/courses/security/authentication-basics/
[4] https://smallstep.com/hello-mtls/doc/server/kafka
[5] https://web.mit.edu/kerberos/
相关文章:

Apache Kafka 中的认证、鉴权原理与应用
编辑导读:本篇内容将进一步介绍 Kafka 中的认证、鉴权等概念。AutoMQ 是与 Apache Kafka 100% 完全兼容的新一代 Kafka,可以帮助用户降低 90%以上的 Kafka 成本并且进行极速地自动弹性。作为 Kafka 生态的忠实拥护者,我们也会持续致力于传播 …...
DeepSeek自然语言处理(NLP)基础与实践
自然语言处理(Natural Language Processing, NLP)是人工智能领域的一个重要分支,专注于让计算机理解、生成和处理人类语言。NLP技术广泛应用于机器翻译、情感分析、文本分类、问答系统等场景。DeepSeek提供了强大的工具和API,帮助我们高效地构建和训练NLP模型。本文将详细介…...

激光工控机在精密制造中的应用与优势
在精密制造中,激光工控机可以用于许多场景例如 激光切割与雕刻:用于金属、塑料、陶瓷等材料的精密切割和雕刻,适用于汽车、航空航天、电子等行业;可实现复杂图案和高精度加工,满足微米级精度要求。 激光焊接…...

Docker换源加速(更换镜像源)详细教程(2025.2最新可用镜像,全网最详细)
文章目录 前言可用镜像源汇总换源方法1-临时换源换源方法2-永久换源(推荐)常见问题及对应解决方案1.换源后,可以成功pull,但是search会出错 补充1.如何测试镜像源是否可用2.Docker内的Linux换源教程 换源速通版(可以直…...
12.14 算法练习
1. 每日温度 算法思路 1. 单调栈的作用:记录我们遍历过的元素,与当前的元素方便对比,本质是以空间换时间; 2. 比较当前元素与栈顶元素的大小,当当前元素大于栈顶元素时,持续弹出栈顶元素下标,…...
ASP.NET Core SignalR的分布式部署
假设聊天室程序被部署在两台服务器上,客户端1、2连接到了服务器A上的ChatRoomHub,客户端3、4连接到服务器B上的ChatRoomHub,那么客户端1发送群聊消息时,只有客户端1、2能够收到,客户端3、4收不到;在客户端3…...
Express 中间件
在构建 Web 应用程序时,中间件(Middleware)扮演着至关重要的角色。它允许你定义一系列的函数来处理 HTTP 请求和响应过程中的各种任务。Express.js 是 Node.js 上最流行的框架之一,以其简洁且强大的中间件机制著称。本文将深入探讨…...

ABB能源自动化选用宏集Cogent DataHub避免DCOM问题,实现高效、安全的数据传输
案例概况 ABB能源自动化公司通过宏集Cogent DataHub软件将电厂设施的数据实时传输到公司办公室,实现了OPC隧道/镜像解决方案,在电厂和公司网络之间建立了一个安全、可靠的连接,确保数据传输的高度安全,减少入侵风险。 ࿰…...

springboot239-springboot在线医疗问答平台(源码+论文+PPT+部署讲解等)
💕💕作者: 爱笑学姐 💕💕个人简介:十年Java,Python美女程序员一枚,精通计算机专业前后端各类框架。 💕💕各类成品Java毕设 。javaweb,ssm…...
【Elasticsearch】分析器的构成
在Elasticsearch中,分析器(Analyzer)是一个处理文本数据的管道,它将输入的文本转换为一系列词元(tokens),并可以对这些词元进行进一步的处理和规范化。分析器由以下三个主要组件构成:…...
Python 调用 Azure OpenAI API
在人工智能和机器学习快速发展的今天,Azure OpenAI 服务为开发者提供了强大的工具来集成先进的 AI 能力到他们的应用中。本文将指导您如何使用 Python 调用 Azure OpenAI API,特别是使用 GPT-4 模型进行对话生成。 准备工作 在开始之前,请确保您已经: 拥有一个 Azure 账户…...

数据结构 算法时间复杂度和空间复杂度
一、算法好坏的度量 【事前分析法】 算法设计好后,根据算法的设计原理,只要问题规模确定,算法中基本语句执⾏次数和需求资源个数 基本也就确定了。 ⽐如求1 2 3 ... n − 1 n ,可以设计三种算法: 算法Aÿ…...

CNN-BiGRU卷积神经网络双向门控循环单元多变量多步预测,光伏功率预测
CNN-BiGRU卷积神经网络双向门控循环单元多变量多步预测,光伏功率预测 代码下载:CNN-BiGRU卷积神经网络双向门控循环单元多变量多步预测,光伏功率预测 一、引言 1.1、研究背景及意义 随着全球能源危机和环境问题的日益严重,可再…...

钉钉位置偏移解决,钉钉虚拟定位打卡
虚拟定位打卡工具 一,介绍免费获取工具 一,介绍 提到上班打卡,职场人的内心戏估计能拍成一部连续剧。打卡,这俩字仿佛自带“紧箍咒”,让无数打工人又爱又恨。想象一下,你气喘吁吁地冲进办公室,…...
【面试集锦】如何设计SSO方案?和OAuth有什么区别?
如何设计SSO方案?和OAuth有什么区别?--楼兰 带你聊最纯粹的Java 如果面试问你,你会做一个权限系统吗?那你肯定会说做过。不就是各种登录、验证吗。我做的第一个CRUD应用就是注册、登录。简单!但是,如果问你在工作中真的做过权限系统吗?其实很多人都只能默默摇摇头。因…...

Python 基于 OpenCV 的人脸识别上课考勤系统(附源码,部署教程)
博主介绍:✌2013crazy、10年大厂程序员经历。全网粉丝12W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇&a…...
vcredist_x64.exe 是 Microsoft Visual C++ Redistributable 的 64 位版本
vcredist_x64.exe 是 Microsoft Visual C++ Redistributable 的 64 位版本,它提供了运行基于 Visual C++ 编写的应用程序所需的库文件。许多 Windows 应用程序都依赖这些库来正常运行,特别是使用 Visual Studio 编译的程序。 用途和重要性: 运行时库:vcredist_x64.exe 安装…...
Tailwind CSS 的核心理念
实用优先(Utility-First) Tailwind CSS 的最核心理念是"实用优先"。这种方法颠覆了传统的 CSS 开发方式,不再编写自定义的类名和样式规则,而是通过组合预定义的工具类来构建界面。这种方式带来了以下优势: …...
集成学习(二):从理论到实战(附代码)
接上一篇续写《集成学习(一):从理论到实战(附代码)》 五、实用算法 5.1 随机森林 随机森林在数据集的各个子样本上拟合许多决策树分类器,并使用平均来提高预测精度和控制过拟合。每一个分类器拟合了一部分随机样本,…...
HTML 链接
HTML 链接 引言 HTML(超文本标记语言)是构建网页的基础,而链接是网页中不可或缺的元素。链接不仅能够连接到其他网页,还能实现网页内部内容的跳转。本文将详细介绍HTML链接的用法、属性以及如何实现链接的优化。 HTML链接的基本…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...

让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...

网站指纹识别
网站指纹识别 网站的最基本组成:服务器(操作系统)、中间件(web容器)、脚本语言、数据厍 为什么要了解这些?举个例子:发现了一个文件读取漏洞,我们需要读/etc/passwd,如…...
Java数值运算常见陷阱与规避方法
整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...

Razor编程中@Html的方法使用大全
文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...

DeepSeek源码深度解析 × 华为仓颉语言编程精粹——从MoE架构到全场景开发生态
前言 在人工智能技术飞速发展的今天,深度学习与大模型技术已成为推动行业变革的核心驱动力,而高效、灵活的开发工具与编程语言则为技术创新提供了重要支撑。本书以两大前沿技术领域为核心,系统性地呈现了两部深度技术著作的精华:…...

热门Chrome扩展程序存在明文传输风险,用户隐私安全受威胁
赛门铁克威胁猎手团队最新报告披露,数款拥有数百万活跃用户的Chrome扩展程序正在通过未加密的HTTP连接静默泄露用户敏感数据,严重威胁用户隐私安全。 知名扩展程序存在明文传输风险 尽管宣称提供安全浏览、数据分析或便捷界面等功能,但SEMR…...