Kafka3.4 SASL/kerberos/ACL 证以及 SSL 加密连接

Kafka3.4 SASL/kerberos ACL 证以及 SSL 加密连接

前面我们使用 kafka3.3.1 on zookeeper 的模式进行多网段监听的 kafka 集群,顺便搭建起 kafkaui 后发现一些问题,我们 kafka 集群没有连接认证,万一谁知道了我们的 kafka 连接地址,岂不是随随便便就能消费数据、清空数据、胡乱修改数据了吗?

所以本章节进行认证连接的搭建,参考官网:

https://kafka.apache.org/documentation/#security

认证类型

如果对 Kafka 连接协议有疑问的,请优先查看 Kafka SASL ACL SSL 分别代表什么意思。

测试环境

版本信息

Kafka 3.4

CDH 6.3.2

Zookeeper 3.4.5

Krb5kdc 已经启动

服务器规划信息

环境检查项

  • 关闭 selinux
  • 关闭防火墙
  • 如有条件请配置好 ansible,在本文中 bigdata_cluster 代指 udmax0[1-4].udmax.com

Krb5Kdc 安装配置

如果已经安装 krb5kdc 可忽略这部分内容。

在主节点 udmax01.udmax.com 安装 krb5 server,使用如下命令:

yum install krb5-server krb5-libs krb5-auth-dialog krb5-workstation openldap-clients -y

如果速度过慢可以更改 yum 源。

其他节点只需要安装执行环境:

ansible bigdata_cluster -m shell -a 'yum install krb5-workstation krb5-libs -y '

更改 /var/kerberos/krb5kdc/kdc.conf 文件,如果不存在则创建:

[kdcdefaults]kdc_ports = 88kdc_tcp_ports = 88[realms]UDMAX.COM = {#master_key_type = aes256-ctsacl_file = /var/kerberos/krb5kdc/kadm5.acldict_file = /usr/share/dict/wordsadmin_keytab = /var/kerberos/krb5kdc/kadm5.keytabsupported_enctypes = aes256-cts:normal aes128-cts:normal des3-hmac-sha1:normal arcfour-hmac:normal camellia256-cts:normal camellia128-cts:normal des-hmac-sha1:normal des-cbc-md5:normal des-cbc-crc:normalmax_life = 3dmax_renewable_life = 7d}

这里 reaml 叫做 UDMAX.COM,后续大量地方会使用到。

更改 /etc/krb5.conf 文件:

# Configuration snippets may be placed in this directory as well
includedir /etc/krb5.conf.d/[logging]default = FILE:/var/log/krb5libs.logkdc = FILE:/var/log/krb5kdc.logadmin_server = FILE:/var/log/kadmind.log[libdefaults]dns_lookup_realm = falseticket_lifetime = 24hrenew_lifetime = 7dforwardable = truerdns = falsepkinit_anchors = FILE:/etc/pki/tls/certs/ca-bundle.crtdefault_realm = UDMAX.COMdefault_cache_name = KEYRING:persistent:%{uid}[realms]UDMAX.COM = {kdc = udmax01.udmax.comadmin_server = udmax01.udmax.com}[domain_realm].udmax.com = UDMAX.COM
udmax.com = UDMAX.COM

需要注意的有:

  • default_realm 指向 realms 中的一项
  • realm 中的 kdcadmin_server 都指向我们的主节点。

配置完毕后分发文件:

ansible bigdata_cluster -m copy -a "src=/etc/krb5.conf dest=/etc/krb5.conf"

如果没有 ansible,请使用 scp 命令。

初始化 kdc database

kdb5_util create –r UDMAX.COM -s
Enter KDC database master key:

这里需要输入密码,在这篇文章中称之为 {{kdc_master_key}}

开启 krb5kdc 服务:

systemctl start krb5kdc
systemctl status krb5kdc

Kafka 3.4 安装

# 先安装scala
curl -fL https://github.com/coursier/coursier/releases/latest/download/cs-x86_64-pc-linux.gz | gzip -d > cs && chmod +x cs && ./cs setup# 或者离线安装包
wget https://downloads.lightbend.com/scala/2.12.17/scala-2.12.17.tgz
ansible bigdata_cluster -m shell -a "mkdir -p /usr/scala/"
ansible bigdata_cluster -m copy  -a "src=scala-2.12.17.tgz dest=/usr/scala/scala-2.12.17.tgz"
ansible bigdata_cluster -m shell -a "cd /usr/scala/; tar -zxvf scala-2.12.17.tgz"# 环境变量
vim /etc/profile.d/scala.sh
export SCALA_HOME=/usr/scala/scala-2.12.17
export SCALA_PATH=${SCALA_HOME}/bin
export PATH=${PATH}:${SCALA_PATH}ansible bigdata_cluster -m copy -a "src=/etc/profile.d/scala.sh dest=/etc/profile.d/scala.sh"

解压离线安装包,规划安装路径:

mkdir /component/kafka/
cd /component/kafka
wget https://downloads.apache.org/kafka/3.4.0/kafka_2.12-3.4.0.tgz
tar -zxvf kafka_2.12-3.4.0.tgz

注册 Kafka 的 kerberos 用户

# 创建kafka用户
addprinc -randkey kafka/udmax01@UDMAX.COM
addprinc -randkey kafka/udmax02@UDMAX.COM
addprinc -randkey kafka/udmax03@UDMAX.COM
addprinc -randkey kafka/udmax04@UDMAX.COM# 导出票据,可以导到一个文件中,或者分开也行
xst -norandkey -k /etc/security/keytab/kafkaX.keytab kafka/udmax01@UDMAX.COM
xst -norandkey -k /etc/security/keytab/kafkaX.keytab kafka/udmax02@UDMAX.COM
xst -norandkey -k /etc/security/keytab/kafkaX.keytab kafka/udmax03@UDMAX.COM
xst -norandkey -k /etc/security/keytab/kafkaX.keytab kafka/udmax04@UDMAX.COM

在这里插入图片描述

此时生成的 kafkaX.keytab 文件需要分发到各个服务器上:

ansible bigdata_cluster -m copy -a "src=/etc/security/keytab/kafkaX.keytab dest=/etc/security/keytab/"

在 9092 端口开启 SASL_PLAINTEXT 认证

首先,我们可以先配置一个 SASL_PLAINTEXT 认证,这里采用 SASL/GSSAPI 进行,主体就是刚刚生成的 kafka

配置文件更改

conf/server.properties

备份相关文件

# 备份
cd /component/kafka/kafka_2.12-3.4.0/config
cp server.properties server.properties.backup

修改 server.properties 中的内容:

broker.id=001102
reserved.broker.max.id=255255
listeners=SASL_PLAINTEXT://udmax02.udmax.com:9092
advertised.listeners=SASL_PLAINTEXT://udmax02.udmax.com:9092
inter.broker.listener.name=SASL_PLAINTEXT
sasl.mechanism.inter.broker.protocol=GSSAPI
sasl.kerberos.service.name=kafkaauto.create.topics.enable=false
delete.topic.enable=true
num.network.threads=3
num.io.threads=8
socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400
socket.request.max.bytes=104857600
log.dirs=/component/kafka/kafka-logs
num.partitions=1
num.recovery.threads.per.data.dir=1
offsets.topic.replication.factor=1
transaction.state.log.replication.factor=1
transaction.state.log.min.isr=1
log.retention.hours=168
log.retention.check.interval.ms=300000
zookeeper.connect=udmax02.udmax.com:2181,udmax03.udmax.com:2181,udmax04.udmax.com:2181
zookeeper.connection.timeout.ms=18000
group.initial.rebalance.delay.ms=0

注意 listeners 中为 Kafka broker 监听的地址,这里监听了端口 9092,协议使用的为 SASL_PLAINTEXT。而 sasl.mechanism.inter.broker.protocol 指定的 SASL 使用 GSSAPI。那么对应的 SASL 相关配置为:

sasl.mechanism.inter.broker.protocol=GSSAPI
sasl.kerberos.service.name=kafka

这里表明使用 SASL/GSSAPI(Kerberos) 进行身份验证,并且采用的 principal 名为 kafka

conf/kerberos/krb5_kafka.conf

该文件以及目录不存在,需要创建:

# 将krb5.conf 抽离一个出来,主要是某些krb5.conf可能有问题(特别是CDH接管后)。
cp /etc/krb5.conf conf/kerberos/krb5_kafka.conf# 主要的内容如下:
[logging]default = FILE:/var/log/krb5libs.logkdc = FILE:/var/log/krb5kdc.logadmin_server = FILE:/var/log/kadmind.log[kdc]profile = /var/kerberos/krb5kdc/kdc.conf[libdefaults]dns_lookup_realm = falseticket_lifetime = 24hrenew_lifetime = 7dforwardable = truerdns = falsepkinit_anchors = FILE:/etc/pki/tls/certs/ca-bundle.crtdefault_realm = UDMAX.COMdefault_ccache_name = KEYRING:persistent:%{uid}storeKey=false[realms]
UDMAX.COM = {kdc = udmax01.udmax.comadmin_server = udmax01.udmax.com}[domain_realm].udmax.com = UDMAX.COM
udmax.com = UDMAX.COM

conf/kerberos/client.properties

用于在服务器环境内进行连接,因为当前需要连接 kafka 集群,所以都需要认证。

我们开启了端口 9092,为 SASL_PLAINTEXT,所以连接时也需要配置对应的连接认证,GSSAPI 对应的就是 com.sun.security.auth.module.Krb5LoginModule 认证:

security.protocol=SASL_PLAINTEXT
sasl.mechanism=GSSAPI
sasl.kerberos.service.name=kafka
sasl.jaas.config=com.sun.security.auth.module.Krb5LoginModule required \useKeyTab=true \keyTab="/etc/security/keytab/kafkaX.keytab" \principal="kafka/udmax02.udmax.com@UDMAX.COM" \renewTGT=true \storeKey=false \useTicketCache=true;

这里使用的 principal 为最高权限的 kafka 用户,一般来说应当设置为租户。比如这样的配置:

security.protocol=SASL_PLAINTEXT
sasl.mechanism=GSSAPI
sasl.kerberos.service.name=kafka
sasl.jaas.config=com.sun.security.auth.module.Krb5LoginModule required \useKeyTab=true \keyTab="/etc/security/keytab/udmax.keytab" \principal="udmax@UDMAX.COM" \renewTGT=true \storeKey=false \useTicketCache=true;

注意 sasl.kerberos.service.name 应当是连接 kafka broker 的名称,也是 server.properties 中的 sasl.kerberos.service.name

conf/kerberos/kafka_server_jaas.conf

kafka broker 启动的时候,会根据该文件获取自身的 SASL 信息,可以理解为当 Kafka 集群启动时,他们也需要互相认证对方是否合法。常规内容如下:

KafkaServer {com.sun.security.auth.module.Krb5LoginModule requireduseKeyTab=truestoreKey=trueuseTicketCache=falsekeyTab="/etc/security/keytab/kafkaX.keytab"principal="kafka/udmax02.udmax.com@UDMAX.COM";
};KafkaClient {com.sun.security.auth.module.Krb5LoginModule requireduseKeyTab=truestoreKey=trueuseTicketCache=falseprincipal="kafka/udmax02.udmax.com@UDMAX.COM"keyTab="/etc/security/keytab/kafkaX.keytab";
};Client {com.sun.security.auth.module.Krb5LoginModule requireduseKeyTab=truestoreKey=trueuseTicketCache=falseprincipal="kafka/udmax02.udmax.com@UDMAX.COM"keyTab="/etc/security/keytab/kafkaX.keytab";
};

请注意每个 kafka brokerprincipal 应当与自己的服务器名 hostname 一致。

Client {} 中的内容为 kafka broker 连接 zookeeper 时需要的认证信息,如果 zookeeper 未开启认证,则不需要相关配置。值得注意的是作者在测试时发现CDH 6.3.2中的Zookeeper显示开启认证,实际情况并没有。

执行文件配置

到此我们相关的配置已经配置完毕,但是常用的启停程序还需要统一更改。

涉及到的启动程序包括:

  • bin/kafka-server-start.sh
  • bin/kafka-console-consumer.sh
  • bin/kafka-console-producer.sh
  • bin/kafka-topics.sh
  • bin/kafka-acls.sh

其实就是我们会在环境中使用到的 shell 都需要进行更改,更改的方式也很简单在上述文件的倒数第二行加上我们设定的环境变量:

export KAFKA_OPTS="-Dzookeeper.sasl.client=ture -Dzookeeper.sasl.client.username=kafka -Djava.security.krb5.conf=/component/kafka/kafka_2.12-3.4.0/config/kerberos/krb5_kafka.conf -Djava.security.auth.login.config=/component/kafka/kafka_2.12-3.4.0/config/kerberos/kafka_server_jaas.conf"

如果 zookeeper 未开启 sasl 请将 -Dzookeeper.sasl.client 设置为 false

此时如果 SASL_PLAINTEXT 已经足够,则不需要继续开启 SSL 认证,跳到 启动 Kafka 即可。

在 9094 端口开启 SASL_SSL 认证

在刚刚的配置中,已经使用 SASL/GSSAPI 完成了身份验证,现在添加 SSL 传输加密。

SSL 中,我们还需要生成证书以及两个 jks 文件。

生成证书并配置

创建文件夹进行操作

ansible bigdata_cluster -m shell -a " mkdir -p /opt/ca  "
cd /opt/ca

每个 broker 生成 server.keystore.jks

先在每台服务器生成 server.keystore.jks 文件,使用命令:

keytool -keystore server.keystore.jks \
-alias udmax01 \
-validity 36500 \
-genkey \
-keypass {{ssl.key.password}} \
-keyalg RSA  \
-dname "CN=udmax01.udmax.com,OU=yd,O=yd,L=beijing,S=beijing,C=cn"  \
-ext SAN=IP:{{内.网.i.p}},IP:{{外.网.i.p}},DNS:udmax01.udmax.com,DNS:udmax01 \
-storepass {{ssl.keystore.password}}

注意:

  • -dname 中的 CN 要与每台服务器名 hostname 一致
  • -ext 中对应 ip 以及 DNS 最好写全,{{内.网.i.p}}{{外.网.i.p}} 是代指如 192.168.1.100
  • -keypass-storepass 在后续需要用到,本文使用 {{ssl.key.password}}{{ssl.keystore.password}} 进行代指。

在主节点生成 CA 证书

通过 openssl 生成证书,如果没有可以进行安装:

yum install openssl -y

使用如下命令创建 CA 证书:

openssl req -new -x509 -keyout ca-key -out ca-cert -days 36500 \
-passin pass:{{openssl_password}} -passout pass:{{openssl_password}} \
-subj "/C=CN/ST=Beijing/L=Beijing/O=yd/CN=ud"

注意:

  • pass 中的密码也被 {{openssl_password}} 代替。

生成后进行分发文件:

ansible bigdata_cluster -m copy -a  " src=ca-cert dest=/opt/ca/ "
ansible bigdata_cluster -m copy -a  " src=ca-key dest=/opt/ca/ "
ansible bigdata_cluster -m shell -a " ls -ltr /opt/ca  "

此时的 /opt/ca 目录中有如下文件:

途中 old 文件可以忽略

每个 broker 通过 CA 证书创建客户端信任证书

# 创建 client.truststore.jks
keytool -keystore client.truststore.jks -alias UdmaxCA -import -file ca-cert -storepass {{ssl.keystore.password}}  -keypass {{ssl.key.password}}# 创建 server.keystore.jks
keytool -keystore server.keystore.jks -alias udmax01 -certreq -file cert-file -storepass {{ssl.keystore.password}} -keypass {{ssl.key.password}}# 创建 cert-signed 后续进行盖章
openssl x509 -req -CA ca-cert -CAkey ca-key -in cert-file -out cert-signed -days 36500 -CAcreateserial -passin pass:{{openssl_password}}# 将 ca-cert 导入server.keystore.jks
keytool -keystore server.keystore.jks -alias UdmaxCA -import -file ca-cert     -storepass {{ssl.keystore.password}} -keypass {{ssl.key.password}}# 将 cert-signed 导入server.keystore.jks
keytool -keystore server.keystore.jks -alias udmax01 -import -file cert-signed -storepass {{ssl.keystore.password}} -keypass {{ssl.key.password}}

此时就已经完成了 SSL 文件的准备:

实操截图如下(为了区分证书,每台的 alias 进行改动,其实根本也没必要):

Kafka SSL 配置

conf/server.properties

相关的 SSL 配置为:

ssl.keystore.location=/opt/ca/server.keystore.jks
ssl.truststore.location=/opt/ca/server.truststore.jks
ssl.keystore.password={{ssl.keystore.password}}
ssl.key.password={{ssl.key.password}}
ssl.client.auth=required

在这里插入图片描述

其他文件

由于 SSL 其实涉及到加解密的过程,一般只是对外使用,在内网环境可以不开启,所以内网中的各类 shell 连接 9092 端口,无需再进行 SSL 配置,如果需要请参考后续 Java SASL_SSL 程序连接 Demo

开启 ACL

如果需要开启 ACL 请优先开启 SASLACL 配置为:

authorizer.class.name=kafka.security.authorizer.AclAuthorizer
super.users=User:kafka

开启了 ACL 认证,采用 kafka 自带的授权验证,其中超级用户名叫做 kafka

启动 Kafka请添加图片描述

使用如下命令进行启动:

bin/kafka-server-start.sh -daemon /component/kafka/kafka_2.12-3.4.0/config/server.properties

使用如下命令查看 topics 信息:

/component/kafka/kafka_2.12-3.4.0/bin/kafka-topics.sh --describe --bootstrap-server udmax02.udmax.com:9092 --command-config /component/kafka/kafka_2.12-3.4.0/config/kerberos/client.properties

可能刚刚创建,并未有 topic 信息,但查看是否有报错。

使用如下命令查看 kafka broker 日志:

tailf /component/kafka/kafka_2.12-3.4.0/logs/server.log

Java SASL_SSL 程序连接 Demo

package com.huangyichun;import org.apache.kafka.clients.CommonClientConfigs;
import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.ProducerConfig;
import org.apache.kafka.clients.producer.ProducerRecord;
import org.apache.kafka.common.config.SslConfigs;import java.util.Properties;public class KafkaConnectionProducerSaslSsl {private static final String TOPIC_NAME = "test-topic";public static void main(String[] args) {System.setProperty("java.security.krb5.conf", "src/main/resources/krb5_kafka.conf");System.setProperty("java.security.auth.login.config", "src/main/resources/kafka_client_kafka.conf");System.setProperty("javax.security.auth.useSubjectCredsOnly", "false");Properties props = new Properties();props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "udmax02.udmax.com:9094,udmax03.udmax.com:9094,udmax04.udmax.com:9094");props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer");props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer");props.put(ProducerConfig.COMPRESSION_TYPE_CONFIG, "gzip");props.put(SslConfigs.SSL_TRUSTSTORE_LOCATION_CONFIG, "src/main/resources/ca/client.truststore.jks");props.put(SslConfigs.SSL_TRUSTSTORE_PASSWORD_CONFIG, "{{ssl.truststore.password}}");props.put(SslConfigs.SSL_TRUSTSTORE_TYPE_CONFIG, "JKS");props.put(CommonClientConfigs.SECURITY_PROTOCOL_CONFIG, "SASL_SSL");props.put("sasl.kerberos.service.name", "kafka");KafkaProducer<String, String> producer = new KafkaProducer<>(props);try {for (int i = 0; i < 1000; i++) {Thread.sleep(5000L);ProducerRecord<String, String> record = new ProducerRecord<>(TOPIC_NAME, "key" + (i / 10), "message: " + i);producer.send(record);}} catch (InterruptedException e) {e.printStackTrace();}}
}

其中 kafka_client_udmax.conf 中的内容为:

KafkaClient {com.sun.security.auth.module.Krb5LoginModule requiredrdns = falseuseKeyTab=truestoreKey=trueuseTicketCache=falseprincipal="udmax@UDMAX.COM"keyTab="src/main/resources/keytab/udmax.keytab";
};

报错锦集

Could not login: the client is being asked for a password, but the Kafka client code does not currently support obtaining a password from the user. not available to garner authentication information from the user

keytab 文件与 principal 密码不匹配。

Not authorized to access topics [XXX]

没有权限访问 XXX topic,被 ACL 挡住,使用 kafka-acl.sh 进行赋权。

General SSLEnginge problem, No name matching xxxx.xxx.xx found

SSL 无法找到匹配的 server 证书,大概率是在生成 server.keystore.jks 时将 CN 填写错误,请填写每台 hostname 的值。

在这里插入图片描述

总结

如果对您有帮助,请点赞!

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【LeetCode】240.搜索二维矩阵Ⅱ

题目 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性&#xff1a; 每行的元素从左到右升序排列。每列的元素从上到下升序排列。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,…

Cesium 实战教程 - 三种方式(CZML、nodeTransformations)修改模型节点组件属性(比例、旋转、移动等)

Cesium 实战教程 - 三种方式&#xff08;CZML、nodeTransformations&#xff09;修改模型节点组件属性&#xff08;比例、旋转、移动等&#xff09; 核心代码完整代码在线示例 关于 Cesium 设置模型组件的动作&#xff0c;之前是通过 CZML articulations 来实现的&#xff0c;…

jenkins pipeline项目

回到目录 将练习jenkins使用pipeline项目&#xff0c;结合k8s发布一个简单的springboot项目 前提&#xff1a;jenkins的环境和k8s环境都已经安装完成&#xff0c;提前准备了gitlab和一个简单的springboot项目 创建一个流水线项目 流水线中选择git&#xff0c;并选择gitlab的…

快速排序和qsort函数详解详解qsort函数

&#x1f495;是非成败转头空&#xff0c;青山依旧在&#xff0c;几度夕阳红&#x1f495; 作者&#xff1a;Mylvzi 文章主要内容&#xff1a;快速排序和qsort函数详解 前言&#xff1a; 我们之前学习过冒泡排序&#xff0c;冒泡排序尽管很方便&#xff0c;但也存在一些局限性…

vue+iviewUi+oss直传阿里云上传文件

前端实现文件上传到oss&#xff08;阿里云&#xff09;适用于vue、react、uni-app&#xff0c;获取视频第一帧图片 用户获取oss配置信息将文件上传到阿里云&#xff0c;保证了安全性和减轻服务器负担。一般文件资源很多直接上传到服务器会加重服务器负担此时可以选择上传到oss&…

字节C++后端面试总结

字节的面经,技术栈是 C++ 后端。 计算机网络 UDP和TCP区别 先说了概念一个是面向连接的基于字节流的可靠连接,一个是不需要连接的基于数据报的不可靠传输 然后说了几个小点,比如首部长度、应用场景、服务对象什么的。 补充: 还有一个很重要的点:UDP 的实时性比 TCP 好…

Java的抽象类不能被实例化

Java的抽象类不能被实例化。如果试图实例化&#xff0c;会编译报错。 示例&#xff1a; 定义一个抽象类&#xff1a; package com.thb;public abstract class AbstractPoint {public AbstractPoint() {} }再定义一个主类&#xff1a; package com.thb;public class Test4 {p…

从源码层面深度剖析Spring循环依赖 | 京东云技术团队

以下举例皆针对单例模式讨论 图解参考 https://www.processon.com/view/link/60e3b0ae0e3e74200e2478ce 1、Spring 如何创建Bean&#xff1f; 对于单例Bean来说&#xff0c;在Spring容器整个生命周期内&#xff0c;有且只有一个对象。 Spring 在创建 Bean 过程中&#xff0…

中电金信:ChatGPT一夜爆火,知识图谱何以应战?

随着ChatGPT的爆火出圈 人工智能再次迎来发展小高潮 那么作为此前搜索领域的主流技术 知识图谱前路又将如何呢&#xff1f; 事实上&#xff0c;ChatGPT也并非“万能”&#xff0c;作为黑箱模型&#xff0c;ChatGPT很难验证生成的知识是否准确。并且ChatGPT是通过概率模型执行推…

全新二开美化版UI好看的社区源码下载/反编译版

2023全新二开美化版UI精美的社区源码下载/反编译版 之前我分享过Rule原版&#xff0c;相信大家已经有很多人搭建好了。这次我要分享的是RuleAPP的二开美化版&#xff08;请尊重每个作者的版权&#xff09;&#xff0c;这个版本没有加密&#xff0c;可以进行反编译&#xff0c;…

大数据——推荐系统

1 推荐系统的发展 推荐系统是指面对没有需求的用户在进入产品时&#xff0c;要给用户推荐什么东西&#xff0c;现在的APP基本上都会采用推荐系统。 从一开始的1990s开始的门户网站&#xff0c;像Yahoo、搜狐和Hao123等等&#xff0c;都是基于分类目录的网页导航网站&#xff0…

Llama 2:开放基础和微调聊天模型

介绍 大型语言模型(llm)作为高能力的人工智能助手,在复杂的推理任务中表现出色,这些任务需要广泛领域的专家知识,包括编程和创意写作等专业领域。它们可以通过直观的聊天界面与人类进行交互,这在公众中得到了迅速而广泛的采用。 法学硕士的能力是显著的考虑到训练的表面上…

产业互联网-跨境电商B2B平台

【背景】&#xff1a;互联网已经进入web3.0时代&#xff0c;产业互联网是互联网关键时点&#xff0c;特别是跨境电商&#xff0c;速卖通&#xff0c;亚马逊&#xff0c;wish Ebay&#xff0c;还有出海的titok,temu等&#xff0c;中国企业或平台走出来也是一条光明大通&#xff…

3.4 网络安全管理设备

数据参考&#xff1a;CISP官方 目录 IDS (入侵检测系统)网络安全审计漏洞扫描系统VPN&#xff08;虚拟专网&#xff09;堡垒主机安全管理平台 一、IDS (入侵检测系统) 入侵检测系统&#xff08;IDS&#xff09;是一种网络安全设备&#xff0c;用于监测和检测网络中的入侵行…

【TypeScript】交叉类型联合类型(四)

【TypeScript】交叉类型&联合类型&#xff08;四&#xff09; 【TypeScript】交叉类型&联合类型&#xff08;四&#xff09;一、简介二、交叉类型2.1 交叉类型使用的注意点2.2 基本数据类型交叉2.3 对象类型交叉 三、联合类型四、类型缩减 一、简介 TypeScript 中的交…

坐标转换-使用geotools读取和转换地理空间表的坐标系(sqlserver、postgresql)

前言&#xff1a; 业务上通过GIS软件将空间数据导入到数据库时&#xff0c;因为不同的数据来源和软件设置&#xff0c;可能导入到数据库的空间表坐标系是各种各样的。 如果要把数据库空间表发布到geoserver并且统一坐标系&#xff0c;只是在geoserver单纯的设置坐标系只是改了…

jvm-程序计数器

1、是什么 4 学习路线 类加载器 内存结构方法区 类堆 对象虚拟机栈程序计数器本地方法栈 执行引擎解释器编译器 热点代码 5 程序计数器–作用 java源代码编译蛏二进制字节码 jvm指令。 对所有平台保持一致性。记住下一条jvm指令的执行地址。寄存器&#xff0c;cpu中读取速度…

从零开始学习 Java:简单易懂的入门指南之API、String类(八)

常用API 1.API1.1API概述1.2如何使用API帮助文档 2.String类2.1String类概述2.2String类的特点2.3String类的构造方法2.4创建字符串对象两种方式的区别2.5字符串的比较2.5.1号的作用2.5.2equals方法的作用 2.6用户登录案例2.6.1案例需求2.6.2代码实现 2.7遍历字符串案例2.7.1案…

elementUi select下拉框触底加载异步分页数据

在Element UI中&#xff0c;可以通过监听select下拉框的visible-change事件来实现触底加载下一页的效果。 方式一&#xff1a;利用elementUi的事件 具体步骤如下&#xff1a; 首先&#xff0c;在select组件中设置&#xff1a;visible-change"handleVisibleChange"…

【代码解读】RRNet: A Hybrid Detector for Object Detection in Drone-captured Images

文章目录 1. train.py2. DistributedWrapper类2.1 init函数2.2 train函数2.3 dist_training_process函数 3. RRNetOperator类3.1 init函数3.1.1 make_dataloader函数 3.2 training_process函数3.2.1 criterion函数 4. RRNet类&#xff08;网络模型类&#xff09;4.1 init函数4.…