42-软件部署实战(下):IAM系统安全加固、水平扩缩容实战

 

 

 

IAM应用安全性加固

iam-apiserver、iam-authz-server、MariaDB、Redis和MongoDB这些服务,都提供了绑定监听网卡的功能。将服务绑定到内网网卡上。 

我们也可以通过iptables来实现类似的功能,通过将安全问题统一收敛到iptables规则,可以使我们更容易地维护安全类设置。

 

iptables简介

iptables是Linux下最优秀的防火墙工具,也是Linux内核中netfilter网络子系统用户态的工具。

netfilter提供了一系列的接口,在一个到达本机的数据包,或者经本机转发的数据包流程中添加了一些可供用户操作的点,这些点被称为HOOK点。通过在HOOK点注册数据包处理函数,可以实现数据包转发、数据包过滤、地址转换等功能

用户通过iptables工具定义各种规则,这些规则通过iptables传给内核中的netfilter。最终,netfilter会根据规则对网络包进行过滤。Linux系统一般会默认安装iptables软件。防火墙根据iptables里的规则,对收到的网络数据包进行处理。

iptables里的数据组织结构分为表、链、规则。

  • 表(tables):表可以提供特定的功能,每个表里包含多个链。iptables里面一共有5个表,分别是filter、nat、mangle、raw、security。这些表,分别用来实现包过滤、网络地址转换、包重构、数据追踪处理和SELinux标记设置。
  • 链(chains):链是数据包传播的路径,每一条链中可以有一个或多个规则。当一个数据包到达一个链时,iptables会从链中第一条规则开始,检查该数据包是否满足规则所定义的条件。如果满足,就会根据该条规则所定义的方法,处理该数据包。否则,就继续检查下一条规则。如果该数据包不符合链中任一条规则,iptables就会根据该链预先定义的默认策略来处理数据包。
  • 规则(rules):规则存储在内核空间的信息包过滤表中,用来描述“如果数据包满足所描述的条件,就按照要求处理这个数据包,如果不满足,就判断下一条规则”。

其中,iptables中表和链的种类及其功能,如下表所示:

上面的表格中,五张表的处理是有顺序的。当数据包到达某一条链时,会按照RAW、MANGLE、NAT、FILTER、SECURITY的顺序进行处理。

 

网络数据包处理流程

网络数据包的处理流程如下图所示:

具体可以分为两个步骤。

第一步,当数据包进入网卡后,它首先进入PREROUTING链,根据目的IP判断是否转发出去。

第二步分为两种情况:如果数据包目的地是本机,它会到达INPUT链。到达后,任何进程都会收到它。本机上的程序可以发送数据包,这些数据包会经过OUTPUT链,然后经POSTROUTING链输出;如果数据包是要转发出去,并且内核允许转发,那么数据包会经过FORWARD链,最后从POSTROUTING链输出。

iptables工具使用方式介绍

 我来介绍下iptables工具的使用方式,并给出一些使用示例。

  1. 命令格式

iptables的语法格式为:

iptables [-t 表名] 命令选项 [链名] [条件匹配] [-j 目标动作或跳转]

下面是一个iptables的使用示例:

iptables -t nat -I PREROUTING -p tcp --dport 8080 -j DNAT --to 10.0.4.88

这里对上面涉及到的一些参数进行说明。

  • 表名/链名:指定iptables命令所操作的表/链。
  • 命令选项:指定处理iptables规则的方式,例如插入、增加、删除、查看等。
  • 条件匹配:指定对符合条件的数据包进行处理。
  • 目标动作或跳转:防火墙处理数据包的方式。

iptables的命令选项又分为管理控制选项和通用选项。

管理控制选项如下:

通用选项如下:

处理数据包的方式(目标动作或跳转)有多种,具体如下表所示:

上面,我介绍了iptables工具的使用方式。因为内容有点多,你可能仍然不知道如何使用iptables工具。没关系,接下来你可以结合我举的一些例子来看下。

  1. 命令示例

下面的命令示例,默认使用了 FILTER 表,也即规则存放在 FILTER 表中,相当于每一条iptables命令都添加了-t filter 参数。

  1. 拒绝进入防火墙的所有ICMP协议数据包:
$ iptables -I INPUT -p icmp -j REJECT
  1. 允许防火墙转发除ICMP协议以外的所有数据包:
$ iptables -A FORWARD -p ! icmp -j ACCEPT
  1. 拒绝转发来自192.168.1.10主机的数据,允许转发来自192.168.0.0/24网段的数据:
$ iptables -A FORWARD -s 192.168.1.11 -j REJECT
$ iptables -A FORWARD -s 192.168.0.0/24 -j ACCEPT
  1. 丢弃从外网接口(eth1)进入防火墙本机的源地址为私网地址的数据包:
$ iptables -A INPUT -i eth1 -s 192.168.0.0/16 -j DROP
$ iptables -A INPUT -i eth1 -s 172.16.0.0/12 -j DROP
$ iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP
  1. 只允许管理员从202.13.0.0/16网段使用SSH远程登录防火墙主机:
$ iptables -A INPUT -p tcp --dport 22 -s 202.13.0.0/16 -j ACCEPT
$ iptables -A INPUT -p tcp --dport 22 -j DROP
  1. 允许本机开放从TCP端口20-1024提供的应用服务:
$ iptables -A INPUT -p tcp --dport 20:1024 -j ACCEPT
$ iptables -A OUTPUT -p tcp --sport 20:1024 -j ACCEPT
  1. 允许转发来自192.168.0.0/24局域网段的DNS解析请求数据包:
$ iptables -A FORWARD -s 192.168.0.0/24 -p udp --dport 53 -j ACCEPT
$ iptables -A FORWARD -d 192.168.0.0/24 -p udp --sport 53 -j ACCEPT
  1. 禁止其他主机ping防火墙主机,但是允许从防火墙上ping其他主机:
$ iptables -I INPUT -p icmp --icmp-type Echo-Request -j DROP
$ iptables -I INPUT -p icmp --icmp-type Echo-Reply -j ACCEPT
$ iptables -I INPUT -p icmp --icmp-type destination-Unreachable -j ACCEPT
  1. 禁止转发来自MAC地址为00:0C:29:27:55:3F的数据包和主机的数据包:
$ iptables -A FORWARD -m mac --mac-source 00:0c:29:27:55:3F -j DROP
  1. 对外开放TCP端口20、21、25、110,以及被动模式FTP端口1250-1280:
$ iptables -A INPUT -p tcp -m multiport --dport 20,21,25,110,1250:1280 -j ACCEPT
  1. 禁止转发源IP地址为192.168.1.20-192.168.1.99的TCP数据包:
$ iptables -A FORWARD -p tcp -m iprange --src-range 192.168.1.20-192.168.1.99 -j DROP
  1. 禁止转发与正常TCP连接无关的非syn请求数据包:
$ iptables -A FORWARD -m state --state NEW -p tcp ! --syn -j DROP
  1. 拒绝访问防火墙的新数据包,但允许响应连接或与已有连接相关的数据包:
$ iptables -A INPUT -p tcp -m state --state NEW -j DROP
$ iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
  1. 只开放本机的web服务(80)、FTP(20、21、20450-20480),放行外部主机发往服务器其他端口的应答数据包,将其他入站数据包都进行丢弃处理:
$ iptables -I INPUT -p tcp -m multiport --dport 20,21,80 -j ACCEPT
$ iptables -I INPUT -p tcp --dport 20450:20480 -j ACCEPT
$ iptables -I INPUT -p tcp -m state --state ESTABLISHED -j ACCEPT
$ iptables -P INPUT DROP

到这里,我们已经了解了iptables的功能,下面来看看如何使用iptables来加固IAM应用。我把它分成内网不安全和内网安全两种情况。

IAM安全加固(内网不安全)

在设置iptables规则之前,我们需要先梳理系统的访问关系,然后根据这些访问关系设置iptables规则。访问关系如下图所示:

你可以看到,IAM系统服务互访关系分为下面这4种:

  • 允许公网客户端访问Nginx的80和443端口。
  • Keepalived服务之间能够互发VRRP协议包。
  • Nginx访问各节点上iam-apiserver、iam-authz-server和iam-pump组件开启的HTTP/HTTPS/GRPC服务。
  • iam服务可以从各节点访问Redis、MariaDB、MongoDB数据库。

 

内网不安全的情况下,加固系统可以分为3大步骤,每个步骤中又有一些小步骤。另外,需要新增节点或者删除节点时,也需要进行一些变更操作。下面我们来具体看下。

第一步,设置防火墙规则。

基于上面说到的几种互访关系,我们可以在各个节点上设置iptables规则来加固系统。我将这些规则设置编写成了go工具,用来自动生成设置这些规则的shell脚本。

具体设置的过程可以分为5步。

  1. 进入iam项目源码根目录。
  2. 配置accesss.yaml(工具根据此配置,自动生成iptables设置脚本),内容如下(位于configs/access.yaml文件):
# 允许登录SSH节点的来源IP,可以是固定IP(例如10.0.4.2),也可以是个网段,0.0.0.0/0代表不限制来源IP
ssh-source: 10.0.4.0/24

# IAM应用节点列表(来源IP)
hosts:
  - 10.0.4.20
  - 10.0.4.21

# 来源IP可以访问的应用端口列表(iam-apiserver, iam-authz-server, iam-pump对外暴露的的端口)
ports:
  - 8080
  - 8443
  - 9090
  - 9443
  - 7070

# 来源IP可以访问的数据库端口列表(Redis, MariaDB, MongoDB)
dbports:
  - 3306
  - 6379
  - 27017

上面的配置中,我们指定了允许登陆机器的子网、Nginx需要访问的端口列表和各节点需要访问的数据库端口列表。

  1. 生成iptables初始化脚本:
$ go run tools/geniptables/main.go -c access.yaml -t app -a -o firewall.sh
$ ls firewall.sh
firewall.sh

你可以打开firewall.sh文件,查看该脚本设置的规则。
4. 将firewall.sh脚本拷贝到10.0.4.20和10.0.4.21节点执行:

$ scp firewall.sh root@10.0.4.20:/tmp/
$ scp firewall.sh root@10.0.4.21:/tmp/

登陆10.0.4.20和10.0.4.21机器,执行/tmp/firewall.sh

  1. 在10.0.4.20(数据库节点)节点上,设置iptables规则,以允许各节点访问:

因为数据库节点也位于10.0.4.20节点,所以只需要添加新的rule,并将iptables -A INPUT -j DROP规则放到最后执行即可。

$ go run tools/geniptables/main.go -c access.yaml -t db -o addrules.sh

然后,将addrules.sh脚本拷贝到10.0.4.20节点执行。

注意,因为iptables是按顺序进行规则过滤的,所以需要将iptables -A INPUT -j DROP规则放在新设置规则的后面,否则执行不到新设置的规则。你可以在设置完iptables规则之后,执行下面的命令来将DROP放到最后:

iptables -A INPUT -j LOG --log-level 7 --log-prefix "Default Deny"
iptables -A INPUT -j DROP

生成的addrules.sh脚本加入以上设置。

第二步,设置重启自动加载iptables规则。

前面我们在各个节点设置了iptables规则,但是这些规则在系统重启后会丢失。为了使系统重启后自动重新设置这些规则,我们需要将当前的iptables规则保存起来,让系统重启时自动加载。需要进行下面两个步骤。

  1. 保存现有的规则:
$ sudo iptables-save > /etc/sysconfig/iptables
  1. 添加下面的命令行到/etc/rc.d/rc.local文件中:
$ iptables-restore < /etc/sysconfig/iptables

第三步,自动化。

在上面的步骤中,我们自动生成了iptables规则,并手动登陆到节点进行设置。你肯定也发现了,整个流程手动操作过多,容易出错,效率还低。你可以参考设置过程,将这些设置工作自动化,比如编写脚本,一键刷新所有节点的iptables规则。

另外,我们再来看下在新增节点和删除节点两种场景下,如何设置iptables规则。

场景1:新增节点

如果我们要扩容一个节点,也需要在新节点设置防火墙规则,并在数据库节点设置防火墙规则允许来自新节点的访问。

假如我们新增一个10.0.4.22节点,这里要设置防火墙规则,需要下面的4个步骤。

  1. 编辑access.yaml,在hosts列表下新增10.0.4.22节点IP。编辑后内容如下:
# 允许登录SSH节点的来源IP,可以是固定IP(例如10.0.4.2),也可以是个网段,0.0.0.0/0代表不限制来源IP
ssh-source: 10.0.4.0/24

# IAM应用节点列表(来源IP)
hosts:
  - 10.0.4.20
  - 10.0.4.21
  - 10.0.4.22

# 来源IP可以访问的应用端口列表(iam-apiserver, iam-authz-server, iam-pump对外暴露的的端口)
ports:
  - 8080
  - 8443
  - 9090
  - 9443
  - 7070

# 来源IP可以访问的数据库端口列表(Redis, MariaDB, MongoDB)
dbports:
  - 3306
  - 6379
  - 27017
  1. 在10.0.4.22节点设置iptables规则:
$ go run tools/geniptables/main.go -c access.yaml -t app -a -o firewall.sh

将firewall.sh脚本拷贝到10.0.4.22节点,并执行。

  1. 在已有节点新增规则,允许来自10.0.4.22的 Nginx服务的访问:
$ go run tools/geniptables/main.go -c access.yaml -t app 10.0.4.22 -o addrules.sh

将addrules.sh脚本拷贝到存量节点,并执行。

  1. 在数据库节点新增iptables规则,以允许来自新节点的访问:
$ go run tools/geniptables/main.go -c access.yaml -t db 10.0.4.22 -o addrules.sh

将addrules.sh脚本拷贝到10.0.4.20节点执行即可。

场景2:删除节点。

如果我们要删除一个节点,需要在保留的节点和数据库节点中,将该节点的访问权限删除。假如我们要删除10.0.4.22节点,设置防火墙规则需要下面3个步骤。

  1. 在保留节点删除10.0.4.22节点访问权限:
$ go run tools/geniptables/main.go -c access.yaml -t app --delete 10.0.4.22 -o delete.sh

将delete.sh脚本拷贝到保留节点(10.0.4.20,10.0.4.21),并执行。

  1. 在数据库节点删除10.0.4.22节点访问权限:
$ go run tools/geniptables/main.go -c access.yaml -t db --delete 10.0.4.22 -o delete.sh

将delete.sh脚本拷贝到10.0.4.20节点执行即可。

  1. 将下线的节点从access.yaml文件中的hosts部分删除。

IAM安全加固(内网安全)

这里,我们来看第二种情况:假定我们系统部署在一个安全的内网环境中,这时候加固系统就会变得异常简单,只需要允许来源IP为内网IP的客户端访问我们提供的各类端口即可。在我们设置完iptables规则之后,后续再新增或者删除节点,就不需要再做变更了。

具体可以分为5个步骤。

第一步,进入iam项目源码根目录。

第二步,配置accesss.yaml(工具根据此配置,自动生成iptables设置脚本),内容如下(configs/access.yaml文件):

# 允许登录SSH节点的来源IP,可以是固定IP(例如10.0.4.2),也可以是个网段,0.0.0.0/0代表不限制来源IP
ssh-source: 10.0.4.0/24

# 来源IP可以访问的应用端口列表(iam-apiserver, iam-authz-server, iam-pump对外暴露的的端口)
ports:
  - 8080
  - 8443
  - 9090
  - 9443
  - 7070

# 来源IP可以访问的数据库端口列表(Redis, MariaDB, MongoDB)
dbports:
  - 3306
  - 6379
  - 27017

上面配置中,我们仅仅指定了IAM服务端口和数据库端口。

第三步,生成iptables初始化脚本:

$ go run tools/geniptables/main.go -c access.yaml -t app --cidr=10.0.4.0/24 -a -o firewall.sh
$ ls firewall.sh
firewall.sh

第四步,将firewall.sh脚本拷贝到10.0.4.20和10.0.4.21节点执行:

$ scp firewall.sh root@10.0.4.20:/tmp/
$ scp firewall.sh root@10.0.4.21:/tmp/

登陆10.0.4.20和10.0.4.21机器执行 /tmp/firewall.sh 。

第五步,在10.0.4.20(数据库节点)节点上,设置iptables规则,以允许各节点访问。

因为数据库节点也位于10.0.4.20节点,所以只需要添加新的rule,并将 iptables -A INPUT -j DROP 规则放到最后执行即可。

$ go run tools/geniptables/main.go -c access.yaml -t db --cidr=10.0.4.0/24 -o addrules.sh

然后,将 addrules.sh 脚本拷贝到10.0.4.20节点执行。

如果要增加节点,你只需要重新执行第三步,生成firewall.sh脚本,并将firewall.sh脚本拷贝到新节点上执行即可。删除节点,则不需要做任何操作。

 

课后练习

  1. 请根据这一讲学习的内容,再增扩容一台机器。
  2. 思考下,你在应用部署时,还有哪些比较好的应用安全加固方法,欢迎在留言区分享。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

利用FFmpeg 转换课程vtt 字幕到 srt字幕

字幕转换工具 经常学习udemy 视频课程的&#xff0c;可能知道&#xff0c;从网络下载的udemy 课程文件里面有时候字幕是vtt 格式的&#xff0c;有时候想导入到百度网盘里面&#xff0c;怎奈百度网盘&#xff0c;不支持vtt 字幕格式。有字幕的时候&#xff0c;会比较好多了。既可…

【python】super()函数的用法详解!

今天分享一个我在实际项目中用到过的super()函数&#xff0c;来说说该函数的主要功能是什么&#xff0c;简单来说&#xff0c;super()函数是用来做调用父类的一个方法。 super() 是用来解决多重继承问题的&#xff0c;直接用类名调用父类方法在使用单继承的时候没问题&#xf…

第十五届蓝桥杯复盘python大学A组——试题C 数字诗意

思路 数字可以分为 有诗意的数字可以写成 (ij)(j-i1)/2 &#xff08; i、j都是正整数 &#xff09; ij 、j-i1 的奇偶性不同&#xff08;因为i、j都是正整数&#xff09; 因此&#xff0c; 如果一个数是奇数就一定有诗意 eg.312 ,523,734,945… 原因&#xff1a;根据上述分…

什么是yum、以及yum源

文章目录 yum介绍软件安装/卸载生态 yum Linux中需要对对工具、指令、程序进行安装、检查、卸载等工作&#xff0c;需要使用到yum。 Linux中安装软件的方式 源代码安装rpm包直接安装yum安装 / apt-get安装 介绍 yum是Linux预装的一个指令&#xff0c;搜索、下载、安装对应…

2.6 类型安全配置属性

无论是Propertes配置还是YAML配置&#xff0c;最终都会被加载到Spring Environment中。 Spring提供了注解Value以及EnvironmentAware接口来将Spring Environment 中的数据注入到属性上&#xff0c;SpringBoot对此进一步提出了类型安全配置属性(Type-safeConfiguration Propert…

从计算机视觉到生命科学

人工智能技术的快速发展正在深刻影响和重塑我们的生活。作为AI领域的前沿方向,多模态大模型凭借其强大的跨域学习和推理能力,在众多行业和科学领域展现出广阔的应用前景。多模态AI指的是能够同时处理和整合文本、图像、音频、视频等不同模态数据的智能系统。这种融合不同信息源…

uni-admin中引入uni-cms的缺少schema及uni-media-library缺少云函数的问题

1. 在管理端运行提示一些表找不到&#xff0c;因为是uni-admin关联的uni-starter的服务空间&#xff0c;在uni-admin的uniCloud中没有内容&#xff0c;在uni-starter的uniCloud中也没有发现对应的表&#xff0c;后面干脆在云端找到对应的表之后新建了&#xff0c;然后再下载到本…

网工内推 | 14薪!安全服务工程师,上市公司,CISP认证优先

01 远江盛邦 招聘岗位&#xff1a;安全服务工程师 职责描述&#xff1a; 1、负责对客户网络、系统进行渗透测试&#xff0c;漏洞验证、安全评估和安全加固&#xff1b; 2、负责对监督单位的系统安全问题进行监督&#xff0c;并督察改进&#xff1b; 3、对监管单位的安全告警、…

机器人流量激增:恶意机器人活动升级与新型规避技术挑战企业安全防御

近日&#xff0c;根据Cyber News引用Thales Imperva Bad Bot发布的最新研究报告&#xff0c;揭示了一个令人警醒的现象&#xff1a;2023年&#xff0c;互联网总流量中的49.6%由机器人贡献&#xff0c;相较于上一年增长了2%&#xff0c;创下了自2013年监测以来的历史新高。这一显…

【性能测试】接口测试各知识第4篇:Jmeter 八大元件及执行顺序,学习目标【附代码文档】

接口测试完整教程&#xff08;附代码资料&#xff09;主要内容讲述&#xff1a;接口测试&#xff0c;学习目标学习目标,2. 接口测试课程大纲,3. 接口学完样品,4. 学完课程,学到什么,5. 参考:,1. 理解接口的概念。学习目标&#xff0c;RESTFUL1. 理解接口的概念,2.什么是接口测试…

我的2024年暑期三下乡实践宣传投稿之旅

身为2024年暑期大学生三下乡社会实践活动的一员,我肩负着学院赋予的对外信息宣传投稿考核任务。在这条特殊的宣传之路上,我经历了从之初摸着石头过河,一家家联系媒体的艰辛,到后来使用智慧软文发布系统网站进行投稿发文章的轻松转变。 刚开始,我对媒体投稿几乎一无所知。为了完…

力扣136. 只出现一次的数字

Problem: 136. 只出现一次的数字 文章目录 题目描述思路复杂度Code 题目描述 思路 由于题目要求使用线性时间复杂度和常量级的空间复杂度&#xff0c;再加上找重复元素这个特性&#xff0c;我们可以想到使用位运算来求解&#xff1a; 1.任何数与其本身异或得0&#xff0c;任何…

单车模型下Stanley循迹

文章目录 1 Stanley方法2 实现3 参考资料 1 Stanley方法 Stanley与pure pursuit方法都是基于几何的路径跟踪方法&#xff0c;pure pursuit的思想是要让车辆的后轴中心经过目标点&#xff0c;从而计算车辆的前轮转角。Stanley则除了利用横向跟踪误差外&#xff0c;还利用车辆的航…

CSS基础常用属性之颜色(如果想知道CSS的颜色知识点,那么只看这一篇就足够了!)

前言&#xff1a;在我们学习CSS的时候&#xff0c;主要学习选择器和常用的属性&#xff0c;而这篇文章讲解的就是最基础的属性——颜色。 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内容可以访问我的主页秋刀鱼不做梦-CSDN博客 目录 1.颜色属性 【1】使用颜色关键词表…

《苍穹外卖》Day01知识点记录

一、Yapi 网址为&#xff1a;https://yapi.pro/ 二、Swagger 1. 常用注解 通过注解可以控制生成的接口文档&#xff0c;使接口文档拥有更好的可读性&#xff0c;常用注解如下&#xff1a; 注解说明Api用在类上&#xff0c;例如Controller&#xff0c;表示对类的说明ApiMod…

视频号小店的红利来了,跟谁打工不是打工,自己开店,给自己打工

大家好&#xff0c;我是电商花花。 自动抖音小店的飞速崛起&#xff0c;打破了电商何惧&#xff0c;给电商行业注入了新能量&#xff0c;新活力。 而作为一直想要进军电商的腾讯&#xff0c;自然也是不想放过这个机会&#xff0c;更是携着视频号带着视频号小店来电商讨一碗饭…

Java岗大厂面试百日冲刺 - 日积月累,每日三题【Day11】 —— MyBatis1

市面上主流ORM框架: EJB&#xff1a;重量级、高花费的ORM技术&#xff0c;支持JPA&#xff0c;尤其是EJB3低侵入式 的设计&#xff0c;增加了Annotation Hibernate&#xff1a;开源&#xff0c;支持JPA &#xff0c;被选作JBoss的持久层解决方案 iBatis&#xff1a;”SQL Mappi…

CCF区块链论文录用资讯--ICSE 2024

ICSE是CCF A类会议 &#xff08;软件工程/系统软件/程序设计语言&#xff09; 其2024录用了13篇区块链论文 Smart Contract and DeFi Security Tools: Do They Meet the Needs of Practitioners? 智能合约和 DeFi 安全工具&#xff1a;它们满足从业者的需求吗&#xff1f; St…

node和go的列表转树形, 执行速度测试对比

保证数据一致性&#xff0c;先生成4000条json数据到本地&#xff0c;然后分别读取文本执行处理 node代码 node是用midway框架 forNum1:number 0forNum2:number 0//执行测试async index(){// 生成菜单列表// const menuList await this.generateMenuList([], 4000);const men…

多任务学习,在共享层,究竟在共享什么?

在多任务学习中&#xff0c;共享层所共享的主要是网络结构和参数。具体来说&#xff0c;当多个任务在共享层进行参数硬共享时&#xff0c;它们使用的是相同的网络结构&#xff08;例如三层全连接神经网络&#xff09;&#xff0c;并且这些网络层的权重&#xff08;weights&…