Linux上使用SELinux保护网络服务

前言

SELinux(Security-Enhanced Linux)是一种安全模块,用于增强基于 Linux 的操作系统的安全性。 它通过强制访问控制(MAC)机制来限制进程和用户对系统资源的访问权限,从而防止未经授权的操作。
在 SELinux 中,“上下文”是指与安全有关的信息标签,这些标签被附加到系统中的所有对象上,包括文件、目录和进程等。SELinux 上下文由三部分组成:用户(user)、角色(role)和类型(type)。每个对象都有一个安全上下文(security context),定义了该对象的安全属性。

简单了解SELinux

SELinux的三种运行模式

Enforcing(强制模式)
在强制模式下,SELinux 完全启用并强制执行所有安全策略。任何违反策略的操作都会被阻止,并且会记录到审计日志中。这是 SELinux 最严格的运行模式,适用于需要高安全性的环境。
Permissive(宽容模式)
在宽容模式下,SELinux 启用但不强制执行策略。系统会继续运行,但会记录所有违反策略的行为。管理员可以查看这些日志来调整和优化策略。
Disabled(禁用模式)
在禁用模式下,SELinux 完全关闭,系统不会应用任何 SELinux 策略。这意味着所有的安全增强功能都被禁用了。

工具

sestatus:查看 SELinux 当前状态和模式。
semanage:管理 SELinux 策略和安全上下文。
audit2allow:生成允许特定操作的策略模块。
restorecon:恢复文件和目录的安全上下文。

配置文件

SELinux的配置文件主要位于/etc/selinux目录下,其中主配置文件是/etc/selinux/config。

安全上下文

在本次实验中会多次查看修改安全上下文

类型部分指定了数据类型,即进程可以访问的文件类型。例如,httpd_sys_content_t 是用于 HTTPD 服务的文件类型,而 public_content_t 是公共内容类型。策略中定义了何种进程类型可以访问何种文件类型。
示例
假设有一个文件 /var/www/html/index.html,其 SELinux 上下文可能是 system_u:object_r:httpd_sys_content_t:s0:c105(/.*)?。这表示:
用户:system_u
角色:object_r
类型:httpd_sys_content_t
级别:s0
类别:c105

简单了解httpd服务

httpd服务,全称为Apache HTTP Server,是一个广泛使用的开源Web服务器软件。
本次实验需要通过httpd服务搭建供访问测试用的web站点。
配置文件

主配置文件位于/etc/httpd/conf目录下,其中最重要的是httpd.conf文件。常见的配置选项包括ServerName、DocumentRoot、ServerAdmin、ErrorLog、CustomLog等。

一:修改SELinux的安全上下文

在Linux中为保护web服务器的安全,可以通过启用SELinux,使服务器可以正常安全的运行。禁用SELinux可以正常访问web页面,启用SELinux后不能访问。可以通过修改SELinux的安全上下文来保证httpd进程能访问存放网页文件的目录。

1、Linux下安装httpd服务

本次实验采用yum源进行安装,可以先检查下yum中是否又可用的httpd包
在这里插入图片描述

安装httpd
在这里插入图片描述
在这里插入图片描述

2、将SELinux设置为容许状态

setenforce 0
getenforce //查看状态

在这里插入图片描述

3、设置永久放行http服务

首先查看当前防火墙现有规则(目前是没有http服务的)
在这里插入图片描述

设置防火墙永久放行http服务

firewall-cmd --permanent --add-service=http

注意 firewall-cmd --permanent --add-service=http
命令中的 firewall-cmd中间没有空格

在这里插入图片描述

//重新加载防火墙
firewall-cmd --reload

再次查看http服务是否被添加到规则中

在这里插入图片描述

3、创建站点

//创建站点目录 /www 作为根目录
mkdir /www

//将字符串 "selinux test01" 写入到文件 /www/index.html 中。如果该文件不存在,则会创建这个文件;如果文件已经存在,则会被覆盖。引号中的内容可自行修改
echo "selinux test01" > /www/index.html

echo: 这是一个命令,用于在终端输出指定的字符串。
“selinux test01”: 这是要输出的字符串内容,包含在双引号内,以确保字符串中的空格被正确处理。
: >是一个重定向操作符,用于将前面的命令输出重定向到后面的文件中。
/www/index.html: 这是目标文件的路径。

在这里插入图片描述

mkdir /www命令用于在根目录下创建一个名为“www”的目录。要转到这个新创建的www目录下,可以使用cd命令。

4、设置文件权限

确保 Web 服务器(如 Apache)能够读取和执行这些文件,同时限制其他用户的写权限,以增强系统的安全性。Apache HTTP服务器,默认情况下,它运行在apache用户下。可以更改目录的所有者和组:

//将 /www 目录及其所有子目录和文件的所有者和所属组都设置为 apache 用户和组。
chown -R apache:apache /www
//将 /www 目录及其所有子目录和文件的权限设置为 755,即所有者具有读、写、执行权限,组和其他用户具有读、执行权限。
chmod -R 755 /www

chown:更改文件或目录的所有者(owner)和所属组(group)。
-R:递归地应用更改,即对指定目录下的所有文件和子目录都进行相同的操作。
apache:apache:将 /www 目录及其所有子目录和文件的所有者设置为 apache 用户,所属组也设置为 apache 组。
/www:目标目录,即要更改所有权的目录路径。

chmod:更改文件或目录的权限。
-R:递归地应用更改,即对指定目录下的所有文件和子目录都进行相同的操作。 755:这是一个八进制数,表示文件和目录的权限设置。具体含义如下:
7(所有者权限):读、写、执行权限(4 + 2 + 1 = 7)。
5(组权限):读、执行权限(4 + 0 + 1 = 5)。
5(其他用户权限):读、执行权限(4 + 0 + 1 = 5)。

在这里插入图片描述

5、配置HTTP服务器

对于Apache HTTP服务器:
编辑Apache的主配置文件(通常是/etc/httpd/conf/httpd.conf或/etc/apache2/apache2.conf):

//进入配置文件
vi /etc/httpd/conf/httpd.conf

找到以下代码

#
DocumentRoot "/var/www/html"

#
# Relax access to content within /var/www.
#
<Directory "/var/www">
    AllowOverride None
    # Allow open access:
    Require all granted
</Directory>

# Further relax access to the default document root:
<Directory "/var/www/html">

将DocumentRoot设置为你的Web站点目录:

在这里插入图片描述

修改后的字段含义如下

DocumentRoot "www"
#指定了 Web 服务器的主文档根目录为 /www。
#当客户端请求一个 URL 时,如果没有指定特定的文件路径,服务器会默认返回这个目录下的文件。
#例如,如果客户端请求 http://yourdomain.com/,服务器会返回 /www/html/index.html(假设存在)。
<Directory "/www">
    AllowOverride None
    # Allow open access:
    Require all granted
</Directory>
# 这段代码定义了对 /www 目录的访问控制:
#AllowOverride None:禁止使用 .htaccess 文件来覆盖此目录中的配置。这意味着在这个目录及其子目录中,不能通过 .htaccess 文件来改变配置。
#Require all granted:允许所有用户访问该目录及其子目录。这意味着任何客户端都可以读取和执行这个目录中的文件。

5、启动或重启HTTP服务器

systemctl restart httpd

在这里插入图片描述

6、测试是否可以访问

查看IP地址
在这里插入图片描述
确保客户端机器能够通过网络连接到你的Web服务器。可以使用curl命令在服务器上测试:

curl http://localhost

在这里插入图片描述

curl http://192.168.200.131

在这里插入图片描述

Linux中浏览器直接输入IP 192.168.200.131
在这里插入图片描述
此时会发现之前将字符串 “selinux test01” 写入到文件 /www/index.html 中的“selinux test01" 在页面上输出。

7、把SELinux设置为强制状态,测试网站访问

selinux的介入状态下,网站权限为enforcing,此时是无法访问web站点的
在这里插入图片描述
在这里插入图片描述
此时发现没有访问权限,也就是没有出现之前写入的selinux test01(如果你设置selinux为0,此时又会变成Permissive容许状态)。

8、修改/www目录下文件的selinux安全上下文

让httpd_t的类型能访问/www目录

# 查看/www的目录上下文    注意Z要大写
ll -dZ /www  
#修改/www的安全上下文
chcon -R -t httpd_sys_content_t /www

• ll 是 ls -l 的别名,用于列出目录内容的详细信息。
• -d 选项表示只显示目录本身,而不是其内容。
• -Z 选项用于显示文件或目录的 SELinux 安全上下文。
• /www 是你要查看的目标目录。

• chcon:这是更改文件上下文的命令。SELinux 使用上下文(context)来定义文件的安全策略。
• -R:这个选项表示递归操作,意味着不仅对指定目录执行操作,还会对其下的所有子目录和文件进行相同的操作。
• -t:这个选项用于指定新的 SELinux 类型(Type)。
• httpd_sys_content_t:这是你要设置的新 SELinux 类型。在这个例子中,httpd_sys_content_t 通常用于 HTTPD 系统内容,这意味着该目录及其内容将被标记为 HTTPD 系统的一部分,从而允许 Web 服务器访问它们。

在这里插入图片描述

修改安全上下文之前的目录上下文表示

unconfined_t 类型表示该目录没有特定的访问控制策略。在某些严格的 SELinux 配置下,它可能会限制某些操作。
也就是说我们设置selinux为强制态后无法访问web站点

修改安全上下文后,可以再次查看修改后的目录上下文信息

在这里插入图片描述

httpd_sys_content_t 类型是为 HTTPD 服务定义的内容类型,专门用于存放 Web 内容,并且通常会有严格的访问控制策略,这种类型的文件或目录通常只能被 HTTPD 服务读取和执行,确保只有 Web 服务器能够访问这些内容。 此时即使我们设置selinux为强制态后也可以对web页面进行访问

以下是对各个字段的解释

drwxr-xr-x.:
d: 表示这是一个目录(directory)。
rwx: 所有者(owner)的权限,表示读、写、执行权限。
r-x: 所属组(group)的权限,表示读和执行权限。
r-x: 其他用户(others)的权限,表示读和执行权限。
.表示 SELinux 安全上下文存在,但没有显示具体的内容。
4: 硬链接数,表示有多少个指向该 inode 的硬链接。(硬链接数与目录中的子目录和文件数量有关。)
apache apache: 文件的所有者和所属组。在这个例子中,所有者是 apache,所属组也是 apache。
unconfined_u:object_r:httpd_sys_content_t:s0: 这是 SELinux 的安全上下文。
unconfined_u: SELinux 用户(SELinux user)。
object_r: SELinux 角色(SELinux role)。
httpd_sys_content_t: SELinux 类型(SELinux type),表示文件的类型标签。
s0: SELinux 级别(SELinux level),通常用于多级安全性(MLS)。
48: 目录的大小,以块为单位。
Nov 16 06:17: 最后修改时间,表示该目录最后一次被修改的时间。
/www: 目录的名称和路径。

9、此时网站具有访问权限

在这里插入图片描述

二、修改SELinux的布尔值

1、修改配置文件,开启个人用户主页功能

vi /etc/httpd/conf.d/userdir.conf

/etc/httpd/conf.d/ 是存放 Apache HTTP Server 配置文件的目录。
userdir.conf 是该目录下的一个特定配置文件,通常用于配置用户目录(UserDir)功能。
在 Apache HTTP Server 中,用户目录功能允许每个用户在自己的主目录下创建公共网页空间。
例如,如果启用了用户目录功能,并且某个用户的用户名是 john,那么他可以在自己的主目录下创建一个名为 public_html 的目录这个目录中的网页内容可以通过浏览器访问。

在这里插入图片描述

2、创建用户,并且创建网站目录以及设置网站首页

mkdir public_html
echo "This is dly's web">public_html/index.html
chmod -Rf 755 /home/dly
systemctl restart httpd

cd 、cd ~ 和cd $HOME是跳转到当前用户的家目录
root用户,cd ~ 相当于 cd /root
普通用户,cd ~ 相当于cd /home/当前用户名

在这里插入图片描述

3、查看selinux的布尔值,并设置selinux为强制状态

getsebool -a |grep httpd_enable_homedirs

在这里插入图片描述

如果显示setenforce: setenforce() failed
切换到管理用户后将selinux设置为强制状态
在这里插入图片描述

4、测试web站点

注意是访问刚才创建的网站目录

http://192.168.200.131/~dly/

由于我们刚才设置setenforce 1(表示禁用状态),利用 getsebool -a |grep httpd_enable_homedirs 显示httpd_enable_homedirs --> off
因此当前是无法访问的。
在这里插入图片描述

5、修改Selinux的布尔值,设置该操作永久生效并立即生效

#修改布尔值为on,表示可以访问主目录
setsebool -P httpd_enable_homedirs=on
#再次查看当前访问状态
getsebool -a |grep httpd_enable_homedirs

在这里插入图片描述

再次访问可生效
在这里插入图片描述

三、修改selinux的端口标签

由于一个服务不能随意使用任何一个端口,其端接口使用范围是受到selinux的策略限制的,可以通过修改服务的布尔值或者是安全上下文对它们相应的服务进行允许或阻拦。

1、创建网站目录,编写首页文件

#创建目录(自定义)
mkdir -p /www/2024  #-p: 这个选项表示如果父目录不存在,则会自动创建它们。
mkdir -p /www/2025
#编写首页文件
echo "port: 2024"> /www/2024/index.html
echo "port: 2025"> /www/2025/index.html

进入首页文件

vi /etc/httpd/conf/httpd.conf

在这里插入图片描述

在文件中添加两个监听端口(也就是你刚设置的端口)
在这里插入图片描述

以及两个虚拟站点

<VirtualHost 192.168.200.131:2024>
    DocumentRoot /www/2024
ServerName www.dly.com
<Directory "/www/2024">
    AllowOverride None
    # Allow open access:
    Require all granted
        </Directory>
</VirtualHost>

<VirtualHost 192.168.200.131:2025>
    DocumentRoot /www/2025
ServerName zzc.dly.com
<Directory "/www/2025">
    AllowOverride None
    # Allow open access:
    Require all granted
        </Directory>
</VirtualHost>

在这里插入图片描述

2、查看selinux安全上下文并重启http服务

ls -Zd /www/2024/
ls -Zd /www/2025/
systemctl restart httpd

在这里插入图片描述

在这个过程中需要保证selinux在容许状态(setenforce 0),防止selinux的介入而使得http服务无法开启, 比如以下情况:
在这里插入图片描述

3、查看与http相关的selinux服务允许的端口列表,并将2024 和 2025 端口放行

semanage port -l | grep http
emanage port -a -t http_port_t -p tcp 2025
semanage port -a -t http_port_t -p tcp 2024

-a:这个选项表示操作所有匹配的端口。
-t http_port_t:这个选项指定要将端口关联到的服务类型为HTTP(http_port_t),这是一种预定义的端口类型,通常用于Web服务器的HTTP流量。
-p tcp 2025:这个选项指定了具体的端口号和协议,这里是TCP协议的2025端口。

在这里插入图片描述

可以看到端口 2024 被标记为 xinuexpansion4_port_t 类型
而xinuexpansion4_port_t 是 SELinux 中的一种端口类型,通常用于特定的网络服务或应用程序。因为 SELinux 策略已经配置为允许 HTTPD 服务访问xinuexpansion4_port_t 类型的端口,即使没有在防火墙中显式放行该端口,HTTPD 服务仍然能够正常访问。

在这里2024端口已经被定义了,所以说在前面添加监听端口的时候可以通过下面的命令查询一下待添加的监听端口是否被定义,防止端口占用。

#查看指定端口是否被定义
semanage port -l | grep 端口号

#如果想要将被定义的监听端口放行,可以先将被定义的端口删除,然后再次添加。
#删除被定义的端口
sudo semanage port -d -t xinuexpansion4_port_t -p tcp 2024
sudo semanage port -d -t xinuexpansion4_port_t -p udp 2024

#重新放行端口
sudo semanage port -a -t http_port_t -p tcp 2024

4、配置firewall防火墙允许站点端口

由于我的2024端口已经被定义,接下来演示将2025端口放行(如果你的定义的站点端口没有出现被定义的情况,可以参考接下来的步骤实验

firewall-cmd --permanent --add-port=2025/tcp
firewall-cmd --reload 
firewall-cmd --list-ports

在这里插入图片描述

5、此时测试端口是否可被访问

在这里插入图片描述

其他站点
在这里插入图片描述
在这里插入图片描述

7、设置selinux为强制状态并重启http服务

接着验证2025端口和2024端口是否被访问

setenforce 1
getenforce 

在这里插入图片描述
访问成功
在这里插入图片描述

总结

以上就是Linux上使用SELinux保护网络服务的简单演示,通过修改SELinux的安全上下文保证httpd进程能够访问存放网页的目录;通过修改布尔值控制httpd进程行为本身,从而访问用户设置的主目录下的文件;通过修改SELinux的端口标签,放行指定的站点端口,确保安全的访问虚拟站点信息。
如有不足,感谢指正

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

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

相关文章

【Linux】僵尸进程、进程状态简介

本文内容均来自个人笔记并重新梳理&#xff0c;如有错误欢迎指正&#xff01; 如果对您有帮助&#xff0c;烦请点赞、关注、转发、订阅专栏&#xff01; 专栏订阅入口 | 精选文章 | Kubernetes | Docker | Linux | 羊毛资源 | 工具推荐 | 往期精彩文章 【Docker】&#xff08;全…

uniapp 选择 省市区 省市 以及 回显

从gitee仓库可以拿到demo 以及 json省市区 文件 // 这是组件部分 <template><uni-popup ref"popup" type"bottom"><view class"popup"><view class"picker-btn"><view class"left" click"…

Unity Dots下的动画合批工具:GPU ECS Animation Baker

书接上文&#xff0c;为了实现大批量物体的生成&#xff0c;我们准备使用Unity最新的dots系统&#xff0c;在该系统下找到了动画解决方案&#xff1a;GPU ECS Animation Baker。 导入的同时&#xff0c;也需要导入以下两个插件&#xff0c;否则会提示报错&#xff1a; PS&…

windows上部署flask程序

文章目录 前言一、准备工作二、配置 Gunicorn 或 uWSGI1.安装 Waitress2.修改启动文件来使用 Waitress 启动 Flask 应用3.配置反向代理&#xff08;可选&#xff09;4.启动程序访问 三.Flask 程序在 Windows 启动时自动启动1.使用 nssm&#xff08;Non-Sucking Service Manager…

共享单车管理系统项目学习实战

前言 Spring Boot Vue前后端分离 前端&#xff1a;Vue&#xff08;CDN&#xff09; Element axios(前后端交互) BaiDuMap ECharts(图表展示) 后端&#xff1a;Spring Boot Spring MVC(Web) MyBatis Plus(数据库) 数据库:MySQL 验证码请求

python中Pandas操作excel补全内容

补全ID、InStore、Date import random from datetime import datetime, timedeltaimport pandas as pdfile_path r"C:\Users\xb\Desktop\Books_1.xlsx" books pd.read_excel(iofile_path, skiprows3, usecols"C:F", dtype{"ID": str, "I…

40分钟学 Go 语言高并发:Goroutine基础与原理

Day 03 - goroutine基础与原理 1. goroutine创建和调度 1.1 goroutine基本特性 特性说明轻量级初始栈大小仅2KB&#xff0c;可动态增长调度方式协作式调度&#xff0c;由Go运行时管理创建成本创建成本很低&#xff0c;可同时运行数十万个通信方式通过channel进行通信&#x…

Python学习------第十天

数据容器-----元组 定义格式&#xff0c;特点&#xff0c;相关操作 元组一旦定义&#xff0c;就无法修改 元组内只有一个数据&#xff0c;后面必须加逗号 """ #元组 (1,"hello",True) #定义元组 t1 (1,"hello") t2 () t3 tuple() prin…

nwjs崩溃复现、 nwjs-控制台手动操纵、nwjs崩溃调用栈解码、剪切板例子中、nwjs混合模式、xdotool显示nwjs所有进程窗口列表

-1. nwjs在低版本ubuntu运行情况 ubuntu16.04运行nw-v0.93或0.89报错找不到NSS_3.30、GLIBC_2.25 uname -a #Linux Asus 4.15.0-112-generic #113~16.04.1-Ubuntu SMP Fri Jul 10 04:37:08 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux cat /etc/issue #Ubuntu 16.04.7 LTS \n \l…

在自动驾驶进行大数据量因果推理实验时,如何减少无用功,提高实验效率?

在对实验结果做反事实推理时&#xff0c;通常需要对数据进行多次循环&#xff0c;然后对多次循环的结果进行处理&#xff0c;如果只在最后结果结束时&#xff0c;再进行处理&#xff0c;可能会由于反事实过程中某个参数设置错误&#xff0c;导致整个反事实实验出现错误&#xf…

DAY1 网络编程(TCP客户端服务器)

作业&#xff1a; TCP客户端服务器。 server服务器代码&#xff1a; #include <myhead.h> #define IP "192.168.110.52" #define PORT 8886 #define BACKLOG 20 int main(int argc, const char *argv[]) {int oldfdsocket(AF_INET,SOCK_STREAM,0);//IPV4通信…

Kafka怎么发送JAVA对象并在消费者端解析出JAVA对象--示例

1、在pom.xml中加入依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-stream-kafka</artifactId><version>3.1.6</version></dependency> 2、配置application.yml 加入Kafk…

【SQL实验】视图操作(菜单操作和命令操作)

完整代码在文章末尾【代码是自己的解答&#xff0c;并非标准答案&#xff0c;也有可能写错&#xff0c;文中可能会有不准确或待完善之处&#xff0c;恳请各位读者不吝批评指正&#xff0c;共同促进学习交流】 &#xff08;一&#xff09;菜单操作 1.建立视图“课程”&#xff…

python基础知识(七)——写入excel

一、写入excel 写入数据到excel wb load_workbook("testcase_api_wuye.xlsx") #打开一个已经存在的excel文件 sh wb["register"] #识别某一个表单 sh.cell(row 2,column 8).value "pass" #写入数据&#xff0c;单元格的值赋值 wb.sav…

MATLAB绘图基础11:3D图形绘制

参考书&#xff1a;《 M A T L A B {\rm MATLAB} MATLAB与学术图表绘制》(关东升)。 11.3D图形绘制 11.1 3D图概述 M A T L A B {\rm MATLAB} MATLAB的 3 D {\rm 3D} 3D图主要有&#xff1a; 3 D {\rm 3D} 3D散点图、 3 D {\rm 3D} 3D线图、 3 D {\rm 3D} 3D曲面图、 3 D {\rm…

ssm148基于Spring MVC框架的在线电影评价系统设计与实现+jsp(论文+源码)_kaic

毕 业 设 计&#xff08;论 文&#xff09; 题目&#xff1a;在线电影评价系统设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本在线电影评价系…

激光slam学习笔记5---ubuntu2004部署运行fastlivo踩坑记录

背景&#xff1a;看看fastlivo论文&#xff0c;觉得挺有意思的&#xff0c;就本地部署跑跑看看效果。个人环境&#xff0c;ubuntu20.04。 一、概要 由于依赖比较多&#xff0c;个人构建工作空间&#xff0c;使用catkin_make编译 src├── FAST-LIVO├── livox_ros_driver…

12. 利用“文件组织”实现石头剪刀布小游戏

文章目录 概要整体架构流程技术名词解释小结 1. 概要 ~ Jack Qiao对米粒说&#xff1a;“前面咱们了解过“文件组织”&#xff0c;让我们利用“文件组织”来制作一个有趣的“石头、剪刀、布”小游戏。”举个栗子&#xff1a; > 程序随机生成一个选择&#xff08;石头、剪刀…

VRT: 关于视频修复的模型

VRT: 关于视频修复的模型 1. 视频修复的背景与重要性背景介绍&#xff1a;重要性&#xff1a; 2. VRT的重要性和研究背景VRT的背景&#xff1a;VRT的重要性&#xff1a; 3. 视频修复概述3.1 定义与目标3.2 与单图像修复的区别3.3 对时间信息利用的需求 4. VRT模型详解4.1 整体框…

Stable Diffusion经典应用场景

&#x1f33a;系列文章推荐&#x1f33a; 扩散模型系列文章正在持续的更新&#xff0c;更新节奏如下&#xff0c;先更新SD模型讲解&#xff0c;再更新相关的微调方法文章&#xff0c;敬请期待&#xff01;&#xff01;&#xff01;&#xff08;本文及其之前的文章均已更新&…