彭于晏一个月带你玩转Linux操作系统13
Linux 交换空间管理
计算机存储器的层次结构
计算机存储器速度越快,成本较高。 为了获得好的性能/价格比,计算机中各种存储器组成一个层状的塔式结构,取长补短,协调工作。

-
CPU 寄存器,是 CPU 内部用来存放数据的一些小型存储区域,用来暂时存放参与运算的数据和运算结果以及一些 CPU 运行需要的信息。
-
CPU 高速缓存,也就是CPU Cache,是一种容量小、速度快的高缓冲存储器,由SRAM组成,直接制作在CPU芯片内,速度几乎与CPU一样快。在金字塔式存储体系中它位于自顶向下的第二层,仅次于CPU寄存器。其容量远小于内存,但速度却可以接近处理器的频率。
-
主存储器(Main memory),简称主存或内存,其作用是存放指令和数据,并能由中央处理器(CPU)直接随机存取。主存储器速度比CPU高速缓存慢,但存储容器却大的多。
主存储器的速度一般用存取时间衡量,即每次与CPU间数据处理耗费的时间,以纳秒(ns)为单位。大多数SDRAM内存芯片的存取时间为5、6、7、8或10ns。
主存储器的带宽计算公式:带宽=频率*位宽/8。
例如:DDR4 内存频率是3600 MHz,在64位系统(双通道位宽为128,以此类推),1B=8bit,
-
单通道 DDR4-3600:3600MHz * 64bit / 8=28800MB/S
-
双通道 DDR4-3600:3600MHz * 64bit * 2 / 8=57600MB/S
-
-
辅助存储器,速度慢的多,优点是容量大,可持久化存储。
计算机存储器的工作原理

- CPU运行程序时,先从寄存器中读取数据。如果在寄存器中可以找到数据,则直接从寄存器中读取。如果在寄存器中找不到数据,则从CPU Cache中读取数据,并将数据缓存在CPU Cache中。
- 如果在CPU cache中可以找到数据,则直接从CPU Cache中读取。如果在CPU cache中找不到数据,则从主存储器(内存)中读取数据,将数据缓存在主存储器中。
- 如果在内存中可以找到数据,则直接从内存中读取。如果在内存中找不到数据,则从辅助存储器中读取数据,例如机械磁盘、光盘、U盘等,并将数据缓存在内存中。
物理内存
计算机系统将内存划分为固定大小的块,称为 page,标准 page 大小为 4 KiB。进程并不直接对物理内存寻址,每个进程具有虚拟地址空间virtual address space。当进程请求内存时,MMU 将进程获得的虚拟地址(VA,Virtual Address )映射到物理地址(PA,Physical Address )。
MMU是Memory Management Unit的缩写,即内存管理单元,它是CPU中用来管理虚拟存储器、物理存储器的控制线路,负责将虚拟地址映射为物理地址,以及提供硬件机制的内存访问授权。
**思考:**为什么CPU不直接访问物理地址?
- 虚拟内存的容量是物理内存和交换空间的总和,而虚拟地址负责映射到物理内存地址和交换空间地址。
- 进程使用内存的过程中,希望内存是连续的。如果进程直接访问物理地址,则内核很难保证进程获得的物理地址空间是连续的,因为进程存在着运行和退出,就会出现内存碎片化。进程的虚拟地址在虚拟内存中是连续的,达到了内存连续的目的,而 MMU 会将进程的虚拟地址映射到物理地址。
Swap 空间
Swap,意思是“交换”、“实物交易”。Linux Swap(交换)空间是受Linux内核内存子系统控制的磁盘区域。
- 功能1:当内存使用量超过定义的限制时,内核寻找已分配给进程但空闲的内存页,将该空闲的内存页写入到交换空间,并向其他进程重新分配RAM页面。
- 功能2:如果某个程序需要访问磁盘上的页面,则内核会找到另一个空闲的内存页, 将其写入到磁盘,然后从交换区重新调用所需的页面。
- 功能3:如果某个程序需要访问数据,访问的数据存放在交换空间,则该程序直接从交换空间读取数据,而不需要从磁盘原始位置读取,进而提高速度。

简单地说,Linux Swap 空间就是在内存不够的情况下,操作系统先把内存中暂时不用的数据,存到硬盘的交换空间,腾出内存来让别的程序运行,和Windows的虚拟内存(pagefile.sys)的作用是一样的。
**交换空间只是临时的解决办法。**虽然交换空间能够作为"虚拟"内存使用,但由于交换区位于磁盘上,它的速度比物理内存慢的多,因此如果需要更快的速度的话,最好的办法仍然是加大物理内存。
查看内存
# 默认单位是KiB,使用-m选项,以MiB为单位
[root@centos7 ~]# free
total used free shared buff/cache available
Mem: 4026156 330460 3528844 12136 166852 3485576
Swap: 4063228 0 4063228
输出说明:
-
Mem:
-
total:物理内存空间大小。
-
used:使用的内存 (total - free - buffers - cache)。
-
free:未使用的内存空间大小(真正的空闲,未被任何程序占用)。
-
shared:多个进程共享的内存空间大小。
-
cached:从磁盘读取的数据占用的内存空间大小,待以后使用(数据没有被修改)。
-
buffers:被更改但未写回磁盘的数据占用的内存空间大小。
-
-
Swap:
-
total:交换空间大小。
-
used:使用的交换空间大小。
-
free:未使用交换空间大小。
-
Swap 空间大小
管理员应根据系统的内存工作负载来调整交换空间大小。 应用供应商有时会提供这方面的建议。根据物理内存总量,下表提供了一些指导。
| 物理内存(RAM) | 交换空间 | 允许HIBERNATE时的交换空间 |
|---|---|---|
| 2GiB或以下 | 两倍的RAM | 三倍的RAM |
| 2GiB和8GiB之间 | 同等的RAM | 两倍的RAM |
| 8GiB和64GiB之间 | 至少4GiB | 1.5倍的RAM |
| 64GiB以上 | 至少4GiB | 不建议Hibernate |
笔记本电脑和台式机的Hibernate功能会在关闭系统电源之前使用交换空间来保存RAM内容。重新打开系统时, 内核将从交换空间恢复RAM内容,无需完全启动。 对于这些系统而言,交换空间需要超过RAM量。
创建交换空间
parted命令
作用:是一个功能强大的磁盘分区工具,同时支持MBR和GPT两种区分表
语法:parted [选项] [设备名] [命令]
# 使用parted创建所需大小的分区并将其文件系统类型设置为linux-swap
[root@centos7 ~]# parted /dev/sdb mklabel gpt
[root@centos7 ~]# parted /dev/sdb unit MiB mkpart swap01 linux-swap 1 2049
[root@centos7 ~]# parted /dev/sdb unit MiB print
# 格式化swap空间
[root@centos7 ~]# mkswap /dev/sdb1
Setting up swapspace version 1, size = 2097148 KiB
no label, UUID=2bf4e179-3648-4412-9495-3b278df4acd6
激活 swap 空间
# 激活swap空间
[root@centos7 ~]# swapon /dev/sdb1
# 查看swap设备列表
[root@centos7 ~]# swapon -s
Filename Type Size Used Priority
/dev/dm-1 partition 4063228 0 -2
/dev/sdb1 partition 2097148 0 -3
默认情况下,多个交换空间具有相同的优先级时,系统会按顺序使用交换空间,即内核先使用第一个已激活交换空间,直至其空间已满,然后开始使用第二个交换空间。在激活交换分区的时候,可以为每个交换空间定义一个优先级,从而强制按该顺序使用交换空间。
swapon 命令使用-p选项指定优先级,优先级介于-1和32767之间,值越大优先级越高。
示例:
[root@centos7 ~]# swapon -p 4 /dev/sdb1
取消 swap 空间激活
[root@centos7 ~]# swapoff /dev/sdb1
[root@centos7 ~]# swapon -s
Filename Type Size Used Priority
/dev/dm-1 partition 4063228 0 -2
持久化激活 swap 空间
修改/etc/fstab文件,添加如下类似记录:
UUID=2bf4e179-3648-4412-9495-3b278df4acd6 swap swap pri=4 0 0
使用命令swapon -a激活/etc/fstab中所有交换设备。
使用命令swapoff -a取消/etc/fstab中所有交换设备激活。
[root@centos7 ~]# swapon -a
[root@centos7 ~]# swapon -s
Filename Type Size Used Priority
/dev/dm-1 partition 4063228 0 -2
/dev/sdb1 partition 2097148 0 -3
[root@centos7 ~]# swapoff -a
[root@centos7 ~]# swapon -s
Linux 网络安全加固
防火墙介绍
防火墙( FireWall ),工作在网络或主机边缘,对进出网络或主机的数据包基于一定的规则检查,并在匹配某规则时由规则定义的行为进行处理的一组功能的组件。基本上的实现都是默认情况下关闭所有的通过型访问,只开放允许访问的策略,将希望外网访问的主机放在 DMZ(demilitarized zone)网络中。
防火墙类型
按保护范围划分:
- 主机防火墙:服务范围为当前一台主机。
- 网络防火墙:服务范围为防火墙一侧的局域网。
按实现方式划分:
- 硬件防火墙:在专用硬件级别实现防火墙功能,例如华为、华三、天融信等产品。
- 软件防火墙:运行于通用硬件平台之上的防火墙的应用软件,例如iptables,firewalld。
按网络协议划分:
- 网络层防火墙:工作在OSI 模型下四层,又称为包过滤防火墙。
- 网络层对数据包进行选择,选择的依据是系统内设置的过滤逻辑,被称为访问控制列表(ACL),通过检查数据流中每个数据的源地址,目的地址,所用端口号和协议状态等因素,或他们的组合来确定是否允许该数据包通过。
- 优点:对用户来说透明,处理速度快且易于维护。
- 缺点:无法检查应用层数据,如病毒等。

-
应用层防火墙/代理服务器:工作在OSI 模型七层或者承担proxy 代理网关。
- 异常检测协议:Web应用防火墙会对HTTP的请求进行异常检测,拒绝不符合HTTP标准的请求。它也可以只允许HTTP协议的部分选项通过,从而减少攻击的影响范围。
- 增强的输入验证:可以有效防止网页篡改、信息泄露、木冯植入等恶意网络入侵行为。从而减小Web服务器被攻击的可能性。
- 及时补丁:修补Web安全漏洞,是Web应用开发者最头痛的问题,没人会知道下一秒有什么样的漏洞出现,会为Web应用带来什么样的危害。现在WAF(Web Application Firewall)可以为我们做这项工作了:只要有全面的漏洞信息WAF能在不到一个小时的时间内屏蔽掉这个漏洞。当然,这种屏蔽掉漏洞的方式不是非常完美的,没有安装对应的补丁本身就是一 种安全威胁,但我们在没有选择的情况下,任何保护措施都比没有保护措施更好。
- 基于规则的保护和基于异常的保护:基于规则的保护可以提供各种Web应用的安全规则,WAF(Web Application Firewall) 生产商会维护这个规则库,并时时为其更新。用户可以按照这些规测对应用进行全方面检测。
- **状态管理。**WAF能够判断用户是否是第一次访问并且将请求重定向到默认登录页面并且记录事件。通过检测用户的整个操作行为我们可以更容易识别攻击。状态管理模式还能检测出异常事件(比如登陆失败),并組在达到极限值时进行处理。这对暴力攻击的识别和响应是十分有利的。
- **其他防护技术。**WAF还有一安全增强的功能,可以用来解决WEB程序员过分信任输入数据带来的问题。比如:隐藏表单域保护、抗入侵规避技术、 响应监视和信息泄露保护。
- 优点:提供应用层保护。
- 缺点:处理速度慢等

Netfilter 子系统
Netfilter子系统是Linux内核中一个强大的网络过滤子系统,对进入系统的每个数据包,在到达用户空间组件或应用之前进行检查,通过编程方式来修改、丟弃或路由数据包。
Netfilter子系统工作在内核态,用户使用以下命令配置防火墙规则,告诉Netfilter子系统如何处理数据包:
-
iptables,用于过滤 IPv4 协议的数据包。
如果 Linux 系统连接到LAN或因特网, 则iptables可用于在 Linux 系统上更好地控制 IP 信息包过滤和防火墙配置。
-
ip6tables,用于过滤 IPv6 协议的数据包,效果等同iptables工具。
-
arptables,用于过滤 arp 协议的数据包。
arptables既能防止别的机器对自己进行arp欺骗,又能防止本机病毒或错误程序向其他机器发起arp攻击。如果善于运用的话,不失为一个优秀的arp防火墙。
-
ebtables,用于过滤数据链路层数据包。
ebtables 过滤数据包比 iptables 更靠前,获得的数据更“原始”,ebtables 多用于桥模式,比如控制 VLAN ID 等。
[root@centos7 ~]# ls -1 /sbin/*tables
-rwxr-xr-x 1 root root 59872 11月 6 2016 /sbin/arptables
-rwxr-xr-x. 1 root root 7016 4月 11 2018 /sbin/ebtables
lrwxrwxrwx. 1 root root 13 8月 1 15:45 /sbin/ip6tables -> xtables-multi
lrwxrwxrwx. 1 root root 13 8月 1 15:45 /sbin/iptables -> xtables-multi
Nftables 子系统
Nftables子系统是netfilter的增强版,其仍保留了netfilter的架构。
nftables优点:
- 更快的数据包处理
- 更快的规则集更新
- 使用单个 nft 用户空间实用程序,通过一个接口来管理所有协议,消除了以往不同前端和多个netfilter接口引起的争用问题。
静态防火墙和动态防火墙
静态防火墙
用户管理防火墙规则时,为了让规则永久保存,防火墙服务会重新加载所有防火墙规则,哪怕只修改一条规则也要重新读取所有规则,这种载入模式称为静态模式。静态模式加载规则时,会导致网络连接丢失。
我们称使用静态模式载入规则的防火墙为静态防火墙。例如iptables,用户执行 service iptables reload 命令将变更的规则保存到配置文件里,并重新加载所有防火墙规则。
动态防火墙
用户管理防火墙规则时,为了让规则永久保存,防火墙只需要将变更部分保存并更新到运行中的 iptables 即可,而不需要对整个防火墙规则列表进行重新加载,这种载入模式称为动态模式。
我们称使用动态模式载入规则的防火墙为动态防火墙,例如 firewalld。
Firewalld 防火墙
Firewalld 介绍
Firewalld 是 Red Hat 公司开发的防火墙软件,默认后端为 nftables。
- 在 CentOS 7 之前的发行版中,默认使用 iptables 命令来管理防火墙。
- 在 CentOS 7 之后的发行版中, firewalld 取代 iptables 成为了默认防火墙软件。
- 用户可以同时使用 iptables 和 firewalld 两个防火墙软件,但容易搞混规则。建议将一个防火墙关闭或默认允许所有流量,只使用另一个防火墙。
- Firewalld 防火墙的另外一个特点就是动态加载防火墙规则。
Firewalld 和 iptables 之间的关系
- firewalld 提供了一个 daemon 和 service,还有命令行和图形界面配置工具,它仅仅是替代了 iptables service 部分,其底层还是使用 iptables 作为防火墙规则管理入口。
- firewalld 和 iptables 一样,他们的作用都是用于维护规则,自身并不具备防火墙的功能,而真正使用规则干活的是内核的 netfilter,只不过 firewalld 和 iptables 的结构以及使用方法不一样罢了。
Firewalld 区域
firewalld 防火墙为了简化管理,将所有网络流量分为多个区域(zone),每个 zone 就是一套过滤规则集。
Firewalld 提供的区域
firewalld 防火墙提供了如下zone:
- trusted(信任区域):允许所有的传入流量。
- public(公共区域):允许与ssh或dhcpv6-client预定义服务匹配的传入流量,其余均拒绝。是新添加网络接口的默认区域。
- external(外部区域):允许与ssh预定义服务匹配的传入流量,其余均拒绝。默认将通过此区域转发的IPv4传出流量将进行地址伪装,可用于为路由器启用了伪装功能的外部网络。
- home(家庭区域):允许与ssh、mdn3、samba-client或dhcpv6-client预定义服务匹配的传入流量,其余均拒绝。
- internal(内部区域):默认值时与homel区域相同。
- work(工作区域):允许与 ssh、dhcpv6-client预定义服务匹配的传入流量,其余均拒绝。
- dmz(隔离区域也称为非军事区域):允许与ssh 预定义服务匹配的传入流量,其余均拒绝。
- block(限制区域):拒绝所有传入流量。
- drop(丢弃区域):丢弃所有传入流量,并且不产生包含ICMP的错误响应。
数据包与区域匹配规则
数据包与zone匹配规则如下:
-
该源地址被分配给特定区域, 则应用该区域的规则。
-
如果数据包未匹配源地址,则分配给与传入网络接口关联的区域,并应用该区域的规则。
-
如果以上都未匹配,firewalld将数据包分配给默认区域。
注意事项:
- firewalld默认指定public区域为默认区域,并将lo 回环接口映射至 trusted 区域。
- 如果流量不与允许的端口或协议或服务匹配,则通常会被拒绝。
Firewalld 规则
对于所有区域,区域内规则的优先级是相同的。
区域内规则匹配优先级如下:
- 首先匹配为该区域设置的任何端口转发和伪装原则。
- 其次匹配该区域设置的任何允许规则。
- 最后匹配该区域设置的任何拒绝规则。
- 还可以同时为以上3个规则设置记录和审计规则,可以同时生效。
- 富规则中的规则优先级高于区域中其他规则。
- 如果区域中所有规则都不匹配,那么通常会拒绝该包,trusted 例外。
Firewalld 配置
Firewalld 配置方法
- 直接编辑 /etc/firewalld/ 中的配置文件
- firewall-cmd 命令行工具
- firewall-config 图形工具
Firewalld 配置文件
Firewalld 配置配置文件存放在:
- /usr/lib/firewalld/目录,Firewalld软件包自带配置位置。
- /etc/firewalld/目录,目录结构与 /usr/lib/firewalld/ 一致,管理员自定义配置保存在该位置。
提示: 我们不建议大家通过修改 /etc/firewalld/ 目录配置防火墙。
查看zone配置
[root@centos7 ~]# cd /usr/lib/firewalld/
[root@centos7 firewalld]# ls
helpers icmptypes ipsets services zones
# 查看zone配置
[root@centos7 firewalld]# ls zones/
block.xml drop.xml home.xml public.xml work.xml
dmz.xml external.xml internal.xml trusted.xml
[root@centos7 firewalld]# cat zones/trusted.xml
<?xml version="1.0" encoding="utf-8"?>
<zone target="ACCEPT">
<short>Trusted</short>
<description>All network connections are accepted.</description>
</zone>
[root@centos7 firewalld]# cat zones/block.xml
<?xml version="1.0" encoding="utf-8"?>
<zone target="%%REJECT%%">
<short>Block</short>
<description>Unsolicited incoming network packets are rejected. Incoming packets that are related to outgoing network connections are accepted. Outgoing network connections are allowed.</description>
</zone>
[root@centos7 firewalld]# cat zones/drop.xml
<?xml version="1.0" encoding="utf-8"?>
<zone target="DROP">
<short>Drop</short>
<description>Unsolicited incoming network packets are dropped. Incoming packets that are related to outgoing network connections are accepted. Outgoing network connections are allowed.</description>
</zone>
查看服务配置
[root@centos7 firewalld]# ls -1 services
amanda-client.xml
......
[root@centos7 firewalld]# cat services/http.xml
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>WWW (HTTP)</short>
<description>HTTP is the protocol used to serve Web pages. If you plan to make your Web server publicly available, enable this option. This option is not required for viewing pages locally or developing Web pages.</description>
<port protocol="tcp" port="80"/>
</service>
[root@centos7 firewalld]# cat services/https.xml
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>Secure WWW (HTTPS)</short>
<description>HTTPS is a modified HTTP used to serve Web pages when security is important. Examples are sites that require logins like stores or web mail. This option is not required for viewing pages locally or developing Web pages. You need the httpd package installed for this option to be useful.</description>
<port protocol="tcp" port="443"/>
</service>
firewall-cmd 命令行工具
两个基本概念
配置防火墙必须知道两个基本概念:
-
防火墙的配置有两个状态:
- runtime(运行时),命令行执行是的默认状态,该状态下的配置立刻生效。
- permanent(永久),通过选项
--permanent指定,该状态下的配置不会立刻生效,而是写入配置文件,需要通过选项--reload重新reload才会生效,重新reload将导致运行时状态下未保存的配置丢失,但会保留当前连接状态。如果使用选项--complete-reload重新reload永久配置,将导致当前连接状态也丢失。
建议配置防火墙一次性写两条规则:
第一条使用选项
--permanent永久生效;第二条不使用选项
--permanent立刻生效。 -
配置防火墙的规则必须一个区域内(直接规则除外),如果不使用选项
--zone明确指明区域,则使用默认区域。默认区域是public。
zone 管理
# 查看zone清单
[root@centos7 ~]# firewall-cmd --get-zones
block dmz drop external home internal public trusted work
# 查看激活的zone清单,也就是分配了interface和source的zone
[root@centos7 ~]# firewall-cmd --get-active-zones
public
interfaces: ens32
# 查看默认zone
[root@centos7 ~]# firewall-cmd --get-default-zone
public
# 设置默认zone,例如设置为trusted,该操作同时设置永久态默认zone
[root@centos7 ~]# firewall-cmd --set-default-zone=trusted
[root@centos7 ~]# firewall-cmd --get-default-zone
trusted
# 再次设置回来
[root@centos7 ~]# firewall-cmd --set-default-zone=public
######################## 以下关于 zone的命令-请自学 ########################
# 如果有需要还可以创建新zone,必须配合--permanent
[root@centos7 ~]# firewall-cmd --permanent --new-zone=myweb
[root@centos7 ~]# firewall-cmd --permanent --get-zones
block dmz drop external home internal myweb public trusted work
[root@centos7 ~]# firewall-cmd --get-zones
block dmz drop external home internal public trusted work
# 使用--reload选项重新加载所有防火墙规则,再次查看zone清单
[root@centos7 ~]# firewall-cmd --reload
[root@centos7 ~]# firewall-cmd --get-zones
block dmz drop external home internal myweb public trusted work
# 查看zone target
[root@centos7 ~]# firewall-cmd --permanent --zone=myweb --get-target
default
# 设置zone target,可用target值为:
# default,默认值,也就是拒绝数据包进入用户空间。
# ACCEPT,允许数据包进入用户空间。
# DROP,丢弃数据包,不对客户端做出任何响应。
# REJECT,拒绝数据包进入用户空间。
[root@centos7 ~]# firewall-cmd --permanent --zone=myweb --set-target=REJECT
[root@centos7 ~]# firewall-cmd --permanent --zone=myweb --get-target
REJECT
# zone不需要的时候,也可以删除,必须配合--permanent
[root@centos7 ~]# firewall-cmd --permanent --delete-zone=myweb
[root@centos7 ~]# firewall-cmd --permanent --get-zones
block dmz drop external home internal public trusted work
[root@centos7 ~]# firewall-cmd --reload
[root@centos7 ~]# firewall-cmd --get-zones
block dmz drop external home internal public trusted work
######################## 以下关于 zone的命令-请自学 ########################
# 查看所有zone中的规则
[root@centos7 ~]# firewall-cmd --list-all-zones
block
target: %%REJECT%%
icmp-block-inversion: no
interfaces:
sources:
services:
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
dmz
target: default
......
# 查看默认zone中的规则
[root@centos7 ~]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens32
sources:
services: cockpit dhcpv6-client ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
# 查看特定zone中的规则
[root@centos7 ~]# firewall-cmd --list-all --zone=home
home
target: default
icmp-block-inversion: no
interfaces:
sources:
services: dhcpv6-client mdns samba-client ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
source 管理
# 来源于特定source的数据包交给特定zone处理
[root@centos7 ~]# firewall-cmd --add-source=10.1.1.0/24 --zone=home
# 查看source清单
[root@centos7 ~]# firewall-cmd --list-sources --zone=home
10.1.1.0/24
# 查看source属于哪个zone
[root@centos7 ~]# firewall-cmd --get-zone-of-source=10.1.1.0/24
home
# 查看source是否添加
[root@centos7 ~]# firewall-cmd --query-source=10.1.1.0/24 --zone=home
yes
# 变更source到其他zone
[root@centos7 ~]# firewall-cmd --change-source=10.1.1.0/24 --zone=public
# 删除zone中source
[root@centos7 ~]# firewall-cmd --remove-source=10.1.1.0/24 --zone=public
interface 管理(自学)
# 查看zone中interface
[root@centos7 ~]# firewall-cmd --list-interfaces
ens32
# 查看interface属于哪个zone
[root@centos7 ~]# firewall-cmd --get-zone-of-interface=ens32
public
# 查看interface是否添加
[root@centos7 ~]# firewall-cmd --query-interface=ens32
yes
# 将interface变更到其他zone
[root@centos7 ~]# firewall-cmd --change-interface=ens32 --zone=home
# 删除zone中interface
[root@centos7 ~]# firewall-cmd --remove-interface=ens32 --zone=home
# 如果interface不属于任何zone,使用以下命令将interface绑定到特定zone
[root@centos7 ~]# firewall-cmd --add-interface=ens32 --zone=public
service 管理
准备nginx服务
yum install -y nginx systemctl start nginx
# 查看系统中预定义了哪些服务
[root@centos7 ~]# firewall-cmd --get-services
# 添加放行服务
[root@centos7 ~]# firewall-cmd --add-service=http
# 查看放行服务列表
[root@centos7 ~]# firewall-cmd --list-services
cockpit dhcpv6-client http ssh
# 查看服务是否放行
[root@centos7 ~]# firewall-cmd --query-service=http
yes
# 删除服务
[root@centos7 ~]# firewall-cmd --remove-service=http
firewall-cmd 命令行还可以定义新的服务。
常用选项如下:
--permanent --new-service=service Add a new permanent and empty service. --permanent --delete-service=service Delete an existing permanent service. --permanent --service=service --set-description=description Set new description to service --permanent --service=service --get-description Print description for service --permanent --service=service --set-short=description Set short description to service --permanent --service=service --get-short Print short description for service --permanent --service=service --add-port=portid[-portid]/protocol Add a new port to the permanent service. --permanent --service=service --remove-port=portid[-portid]/protocol Remove a port from the permanent service. --permanent --service=service --get-ports List ports added to the permanent service. --permanent --service=service --add-protocol=protocol Add a new protocol to the permanent service. --permanent --service=service --remove-protocol=protocol Remove a protocol from the permanent service. --permanent --service=service --get-protocols List protocols added to the permanent service. --permanent --service=service --add-source-port=portid[-portid]/protocol Add a new source port to the permanent service. --permanent --service=service --remove-source-port=portid[-portid]/protocol Remove a source port from the permanent service. --permanent --service=service --get-source-ports List source ports added to the permanent service.
port 管理
# 添加放行端口
[root@centos7 ~]# firewall-cmd --add-port=5900/tcp
# 查看端口放行列表
[root@centos7 ~]# firewall-cmd --list-ports
5900/tcp
# 查看端口是否放行
[root@centos7 ~]# firewall-cmd --query-port=5900/tcp
yes
# 删除端口
[root@centos7 ~]# firewall-cmd --remove-port=5900/tcp
masquerade 管理
网络拓扑:
- server: 10.1.1.10、10.1.8.10(可以访问公网)
- client:10.1.1.11 网关 10.1.1.10
需求:确保client 能访问公网。
环境准备:
server 增加一块关联vmnet1模式的网卡
[root@server ~ 16:00:32]# nmcli device
DEVICE TYPE STATE CONNECTION
ens33 ethernet 已连接 ens33
virbr0 bridge 已连接 virbr0
ens35 ethernet 连接中(正在获取 IP 配置) 有线连接 1
lo loopback 未托管 --
virbr0-nic tun 未托管 --
[root@server ~ 16:00:39]# nmcli connection show
NAME UUID TYPE DEVICE
有线连接 1 d4aee466-961c-3f52-b2d1-6e9a8fd92285 ethernet ens35
ens33 688ddc36-06c4-4392-bcf5-56ad860443c9 ethernet ens33
virbr0 919f64bb-a73c-40a9-b112-a9068d21b5f2 bridge virbr0
[root@server ~ 16:00:55]# nmcli connection delete 有线连接\ 1
成功删除连接 "有线连接 1" (d4aee466-961c-3f52-b2d1-6e9a8fd92285)。
[root@server ~ 16:01:12]# nmcli connection add type ethernet ifname ens35 con-name ens35 ipv4.method manual ipv4.addresses 10.1.1.10/24
连接 "ens35" (1e4bfff4-3b57-4f88-ad03-5d1cf132c7d3) 已成功添加。
[root@server ~ 16:01:55]# nmcli connection up ens35
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/8)
client 网卡模式更改为vmnet1(仅主机)
[root@client ~ 16:10:22]# nmcli connection modify ens33 ipv4.addresses 10.1.1.11/24 ipv4.gateway 10.1.1.10
[root@client ~ 16:10:22]# nmcli connection up ens33
配置伪装:SNAT
# 查看masquerade是否启动
[root@server ~]# firewall-cmd --query-masquerade
no
# 启动 masquerade
[root@server ~]# firewall-cmd --add-masquerade
[root@server ~]# firewall-cmd --query-masquerade
yes
# 禁用masquerade
[root@server ~]# firewall-cmd --remove-masquerade
client 验证
[root@client ~ 16:30:22]# mtr 1.1.1.1


补充:普通主机和路由器区别。
- 普通主机:目的地不是我的数据包,丢弃。
- 路由器:目的地不是我的数据包,根据路由表进行转发。
forward-port 管理
使用 port forward前,确保对应zone启用masquerade功能。
# 启动 masquerade
[root@centos7 ~]# firewall-cmd --add-masquerade
# 添加端口转发语法:
--add-forward-port=port=portid[-portid]:proto=protocol[:toport=portid[-portid]][:toaddr=address[/mask]]

# 访问本机端口8000转发到本机80
[root@centos7 ~]# firewall-cmd --add-forward-port=port=8000:proto=tcp:toport=80
# 查看是否具有特定端口转发规则
[root@centos7 ~]# firewall-cmd --query-forward-port=port=8000:proto=tcp:toport=80
yes
# 访问本机端口1022转发到10.1.1.11:22
[root@centos7 ~]# firewall-cmd --add-forward-port=port=1022:proto=tcp:toport=22:toaddr=10.1.1.11
# 查询端口转发清单
[root@centos7 ~]# firewall-cmd --list-forward-ports
port=8000:proto=tcp:toport=80:toaddr=
port=1022:proto=tcp:toport=22:toaddr=10.1.1.11

# 删除端口转发
[root@centos7 ~]# firewall-cmd --remove-forward-port=port=8000:proto=tcp:toport=80:toaddr=
[root@centos7 ~]# firewall-cmd --remove-forward-port=port=1022:proto=tcp:toport=22:toaddr=10.1.8.80
icmp-block-inversion 管理
-
icmp-block-inversion默认为no,放行所有的icmp type。此时可以通过富规则禁用特定主机ping本机。
-
icmp-block-inversion设置为yes,禁止所有的icmp type。此时可以通过富规则放行特定主机ping本机。
# 查看icmp-block-inversion是否启用
[root@centos7 ~]# firewall-cmd --query-icmp-block-inversion
no
# 设置icmp-block-inversion为yes
[root@centos7 ~]# firewall-cmd --add-icmp-block-inversion
[root@centos7 ~]# firewall-cmd --add-icmp-block-inversion --permanent
[root@centos7 ~]# firewall-cmd --query-icmp-block-inversion
yes
# 客户端ping测试
[c:\~]$ ping -n 1 10.1.8.88
正在 Ping 10.1.8.88 具有 32 字节的数据:
来自 10.1.8.88 的回复: 无法访问目标主机。
10.1.8.88 的 Ping 统计信息:
数据包: 已发送 = 1,已接收 = 1,丢失 = 0 (0% 丢失),
# 由于firewalld会保留之前的连接状态,如果此时仍能ping通,
# 则需要重启firewalld服务或使用选项 --complete-reload彻底重新加载防火墙规则。
[root@centos7 ~]# firewall-cmd --complete-reload
# 改回默认值
[root@centos7 ~]# firewall-cmd --remove-icmp-block-inversion
[root@centos7 ~]# firewall-cmd --remove-icmp-block-inversion --permanent
icmp-blocks 管理
# 查看系统中预定义了哪些icmptypes
[root@centos7 ~]# firewall-cmd --get-icmptypes
# 常用的ICMP类型有
# echo-request:icmp请求报文
# echo-reply:icmp响应回复报文
# 添加禁止通过的icmp类型,例如通过添加echo-request实现禁止ping
[root@centos7 ~]# firewall-cmd --add-icmp-block echo-request
[root@centos7 ~]# firewall-cmd --add-icmp-block echo-request --permanent
# 查看 icmp-block 禁止清单
[root@centos7 ~]# firewall-cmd --list-icmp-blocks
echo-request
# 查看echo-request是否添加
[root@centos7 ~]# firewall-cmd --query-icmp-block echo-request
yes
# 客户端ping测试
[c:\~]$ ping -n 1 10.1.8.88
正在 Ping 10.1.8.88 具有 32 字节的数据:
来自 10.1.8.88 的回复: 无法访问目标主机。
10.1.8.88 的 Ping 统计信息:
数据包: 已发送 = 1,已接收 = 1,丢失 = 0 (0% 丢失),
# 由于firewalld会保留之前的连接状态,如果此时仍能ping通,
# 则需要重启firewalld服务或使用选项 --complete-reload彻底重新加载防火墙规则。
[root@centos7 ~]# firewall-cmd --complete-reload
# 改回默认值
[root@centos7 ~]# firewall-cmd --remove-icmp-block echo-request
[root@centos7 ~]# firewall-cmd --remove-icmp-block echo-request --permanent
protocol 管理
# 添加protocol
[root@centos7 ~]# firewall-cmd --add-protocol=icmp
# 查看放行protocol清单
[root@centos7 ~]# firewall-cmd --list-protocol
icmp
# 查看protocol是否放行
[root@centos7 ~]# firewall-cmd --query-protocol=icmp
yes
# 删除放行protocol
[root@centos7 ~]# firewall-cmd --remove-protocol=icmp
source-ports 管理
限制客户端 source-ports,很少用,设置方法同 source管理 部分。
rich rule 管理
富规则可灵活自定义各种规则,例如:
- 允许单个IP地址或者网段连接到某个服务
- 配置记录和审计
- 限制速率
富规则参考 firewalld.richlanguage(5)。
富规则语法:
rule
[source]
[destination]
service|port|protocol|icmp-block|icmp-type|masquerade|forward-port|source-port
[log]
[audit]
[accept|reject|drop|mark]

**示例1:**禁止所有主机ping本机。
# 添加富规则
[root@centos7 ~]# firewall-cmd --add-rich-rule='rule protocol value=icmp drop'
# 明确拒绝类型
[root@centos7 ~]# firewall-cmd --add-rich-rule='rule family=ipv4 protocol value=icmp reject type=net-prohib'
# 决绝类型包括:
# icmp-host-prohibited, host-prohib, icmp-net-unreachable, net-unreach, icmp-host-unreachable, host-unreach, icmp-port-unreachable, port-unreach, icmp-proto-unreachable, proto-unreach, icmp-net-prohibited, net-prohib, tcp-reset, tcp-rst, icmp-admin-prohibited, admin-prohib
# 查看富规则清单
[root@centos7 ~]# firewall-cmd --list-rich-rules
rule protocol value="icmp" drop
# 查看富规则是否添加
[root@centos7 ~]# firewall-cmd --query-rich-rule='rule protocol value=icmp drop'
yes
# 删除富规则
[root@centos7 ~]# firewall-cmd --remove-rich-rule='rule protocol value="icmp" drop'
示例2:
- 针对IPv4
- 来源主机10.1.8.10
- 允许ping本机
[root@centos7 ~]# firewall-cmd --add-rich-rule='rule family=ipv4 source address="10.1.8.10" icmp-type name="echo-request" accept'
示例3:
- 针对IPv4
- 来源10.1.8.0/24网段中主机
- 访问非172.16.0.0/24网段中主机的http服务
- 1秒中只允许访问3次
- 做好日志记录,前缀为" http-error “,日志级别为"error”,每秒记录2次
- 做好审计,每秒记录1次
[root@centos7 ~]# firewall-cmd --add-rich-rule 'rule family="ipv4" source address="10.1.8.0/24" destination not address="172.16.0.0/24" service name="http" log prefix=" http-error " level="error" limit value="2/s" audit limit value="1/s" accept limit value="3/s"'
direct rule 管理
Firewalld 防火墙还支持直接规则:
- 直接规则优先级高于firewalld规则,即防火墙解析直接规则, 然后才会解析firewalld规则。还可以显式地将直接规则插入到某个区域。
- **直接规则用于补充firewalld规则。**使用firewalld规则能实现的需求,尽可能使用firewalld规则实现。
- 直接规则的语法,类似于iptable的语法,所以读者需要知道iptables概念:
- table (filter/mangle/nat/…)
- chain (INPUT/OUTPUT/FORWARD/…)
- commands (-A/-D/-I/…)
- parameters (-p/-s/-d/-j/…)
- targets (ACCEPT/DROP/REJECT/…).
常见选项:
-
[–permanent] --direct --get-all-chains
查看所有表中所有chain清单
-
[–permanent] --direct --get-chains { ipv4 | ipv6 | eb } table
查看特定表中chain清单
-
[–permanent] --direct --add-chain { ipv4 | ipv6 | eb } table chain
特定表中添加chain
-
[–permanent] --direct --remove-chain { ipv4 | ipv6 | eb } table chain
特定表中删除chain
-
[–permanent] --direct --get-all-rules
查看所有表中所有chain中所有规则
-
[–permanent] --direct --get-rules { ipv4 | ipv6 | eb } table chain
查看特定表中特定chain中规则
-
[–permanent] --direct --add-rule { ipv4 | ipv6 | eb } table chain priority args
特定表中特定chain中添加规则
-
[–permanent] --direct --remove-rule { ipv4 | ipv6 | eb } table chain priority args
特定表中特定chain中删除规则
-
[–permanent] --direct --remove-rules { ipv4 | ipv6 | eb } table chain
删除特定表中特定chain中所有规则
**示例:**将192.168.0.0/24列入黑名单,单个IP每分钟最高连接并发是1,超过并发的连接都丢弃。
[root@centos7 ~]# firewall-cmd --direct --permanent --add-chain ipv4 raw blacklist
[root@centos7 ~]# firewall-cmd --direct --permanent --add-rule ipv4 raw PREROUTING 0 -s 192.168.0.0/24 -j blacklist
[root@centos7 ~]# firewall-cmd --direct --permanent --add-rule ipv4 raw blacklist 0 -m limit --limit 1/min -j LOG --log-prefix "blacklisted "
[root@centos7 ~]# firewall-cmd --direct --permanent --add-rule ipv4 raw blacklist 1 -j DROP
[root@centos7 ~]# firewall-cmd --reload
[root@centos7 ~]# firewall-cmd --direct --get-all-rules
ipv4 raw PREROUTING 0 -s 192.168.0.0/24 -j blacklist
ipv4 raw blacklist 0 -m limit --limit 1/min -j LOG --log-prefix 'blacklisted '
ipv4 raw blacklist 1 -j DROP
清理规则
[root@centos7 ~]# firewall-cmd --permanent --direct --remove-rules ipv4 raw blacklist
[root@centos7 ~]# firewall-cmd --permanent --direct --remove-rules ipv4 raw PREROUTING
[root@centos7 ~]# firewall-cmd --direct --remove-rules ipv4 raw blacklist
[root@centos7 ~]# firewall-cmd --direct --remove-rules ipv4 raw PREROUTING
[root@centos7 ~]# firewall-cmd --direct --remove-chain ipv4 raw blacklist
[root@centos7 ~]# firewall-cmd --reload
panic 模式
- 使用选项 **–panic-on,启用panic模式,所有进出流量将会被丢弃。**一般服务器被黑客攻击,使用该选项断开所有网络。
- 使用选项 --query-panic,查询panic模式。
- 使用选项 --panic-off,禁用panic模式。
其他配置
# 使用选项--runtime-to-permanent将运行时的配置写入到配置文件
root@centos7 ~]# firewall-cmd --runtime-to-permanent
# 使用选项 --timeout设置规则生效时间,单位秒,一般用于调试规则。
[root@centos7 ~]# firewall-cmd --add-service=http --timeout=10
综合案例
案例1: 禁止10.1.8.10主机ping本机。
# 确保icmp-block-inversion是默认值no
[root@centos7 ~]# firewall-cmd --list-all|grep inversion
icmp-block-inversion: no
# 如果icmp-block-inversion是yes,执行以下命令设置为no
[root@centos7 ~]# firewall-cmd --permanent --remove-icmp-block-inversion
# 确保icmp-blocks不包含echo-request
[root@centos7 ~]# firewall-cmd --list-icmp-blocks
# 如果icmp-blocks包含echo-request,执行以下命令删除icmp-blocks中echo-request
[root@centos7 ~]# firewall-cmd --permanent --remove-icmp-block=echo-request
# 禁止10.1.8.10主机ping本机
[root@centos7 ~]# firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.1.8.10" icmp-type name="echo-request" reject'
# 彻底重新加载防火墙规则
[root@centos7 ~]# firewall-cmd --complete-reload
**案例2:**只允许10.1.8.10主机ping本机。
# 禁止所有来源ping本机
[root@centos7 ~]# firewall-cmd --permanent --add-icmp-block-inversion
# 允许10.1.8.10主机ping本机
[root@centos7 ~]# firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address="10.1.8.10" icmp-type name="echo-request" accept'
# 彻底重新加载防火墙规则
[root@centos7 ~]# firewall-cmd --complete-reload
**案例3:**通过富规则实现 只允许10.1.8.10主机ping本机。
firewall-config 图形工具
通过firewall-config命令,打开防火墙图形管理工具。
该界面可以直观地配置防火,注意防火墙的配置状态和选择的区域。
需要安装的软件包:firewall-config、xorg-x11-xauth、libglvnd-glx

-
选项菜单可执行如下操作:
-
重载防火墙
-
改变默认区域
-
应急模式
-
将 Runtime 设定为永久配置

-
-
查看菜单用于显示额外的配置信息。


服务配置
勾选对应服务即可,例如http。

端口配置
单击添加。

输入相应值,例如tcp/5900。

根据需要进行 编辑 和 删除。

单击添加。

输入相应值,例如icmp。

根据需要进行 编辑 和 删除。

源端口配置
单击添加。

输入相应值,例如tcp/32760

根据需要进行 编辑 和 删除。

伪装配置
通过勾选或取消勾选,来启用或禁用该区域伪装功能。

端口转发配置
单击添加。

输入相应值,例如:访问本地1022端口转发到10.1.8.80:22。

根据需要进行 编辑 和 删除。

ICMP过滤配置
勾选对应icmp类型即可,例如echo-request。

输入相应值,例如。
根据需要进行 编辑 和 删除。
富规则配置
单击添加。

输入相应值,例如:

根据需要进行 编辑 和 删除。

网卡配置
单击添加。

输入相应值,例如ens33。

根据需要进行 编辑 和 删除。

来源配置
单击添加。

输入相应值,例如192.168.1.0/24。



根据需要进行 编辑 和 删除。

Linux 系统安全加固
SELinux 介绍
SELinux 概述
文件权限控制了哪些用户或用户组可以访问哪些特定文件,但未限定用户访问文件的方式。
例如:对于文件的写入权限而言, 结构化数据文件是否应当设计为只能使用特定的程序写入,但其他编辑器仍可以打开和修改此文件,而这可能会导致损坏。文件权限仅仅是控制谁可以读取、写入或运行文件,无法控制如何使用文件。
Security Enhanced Linux (SELinux)是一个额外的系统安全层,主要目标是防止已遭泄露的系统服务访问用户数据。
例如:恶意人员成功入侵了 Web服务器进程,获得进程的权限,也就是apache用户和apache组的权限。该用户和组对文档根目录/var/www/html具有读取权限,还可以访问/tmp和/var/tmp,以及全局可写的其他任何文件和目录。
SELinux 强制执行一组访问规则,明确定义进程和资源之间允许的操作。每个进程、文件、目录和端口都具有专门的安全标签, 称为SELinux上下文。上下文是一个名称, SELinux策略使用它来确定某个进程能否访问文件、目录或端口。除非显式规则授予访问权限,否则,在默认情况下,策略不允许任何交互。
SELinux 标签有多个内容:用户,角色,类型和敏感度。rhel中默认策略targeted,基于类型部分。类型部分通常以_t结尾。
示例:

示例:
- web 服务器守护进程类型是 httpd_exec_t
- web 服务器的网页类型是 httpd_sys_content_t
- web 服务器的端口类型是 http_port_t
- /tmp 标签 tmp_t
基本原理
- SELinux默认策略允许apache进程访问在/var/www/html文件夹下的文件和文件夹,以及其他一些具有httpd_sys_content_t上下文的文件夹,禁止访问具有其他不匹配标签的目录。
- 在 SELinux 的保护下,apache进程不允许访问/tmp和/var/tmp目录。因为/tmp、/var/tmp目录的标签是tmp_t,与默认策略不匹配。
命令选项 -Z
许多处理文件的命令都一个-Z 选项,用于显示和设置SELinux上下文。
[root@centos7 ~]# ps -C sshd -Z
LABEL PID TTY TIME CMD
system_u:system_r:sshd_t:s0-s0:c0.c1023 951 ? 00:00:00 sshd
system_u:system_r:sshd_t:s0-s0:c0.c1023 1261 ? 00:00:00 sshd
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 1276 ? 00:00:00 sshd
system_u:system_r:sshd_t:s0-s0:c0.c1023 2455 ? 00:00:00 sshd
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 2459 ? 00:00:00 sshd
[root@centos7 ~]# ls -Z /home
unconfined_u:object_r:user_home_dir_t:s0 laoma
# 其他命令中 -Z 选项
# cp -Z set SELinux security context of destination file to default type
# mkdir -Z set SELinux security context of each created directory to the default type
SELinux 模式
- enforcing 模式: SELinux强制执行访问控制规则。 在强制模式下,如果规则没有明确允许访问,则拒绝访问,并写入日志。此模式是默认模式。
- Permissive 模式:SELinux 加载策略并处于活动状态,但不强制执行访问控制规则,⽽是记录访问违规。此模式有助于对应用和规则进行测试和故障排除。
- disable 模式:完全关闭 SELinux。不拒绝任何SELinux违规,不予记录。
查看当前模式
[root@centos7 ~]# getenforce
更改当前模式
[root@centos7 ~]# setenforce
usage: setenforce [ Enforcing | Permissive | 1 | 0 ]
# 强制模式临时切换为允许模式
[root@centos7 ~]# setenforce 0
# 或者
[root@centos7 ~]# setenforce Permissive
# 允许模式临时切换为强制模式
[root@centos7 ~]# setenforce 1
# 或者
[root@centos7 ~]# setenforce Enforcing
模式切换注意事项:
- 强制模式和允许模式之间变更,不需要重启系统。
- 从强制模式或者允许模式变更到禁用模式,或者从禁用模式变更到强制模式或者允许模式都需要重启系统。
更改 SELinux 默认模式
[root@centos7 ~]# vim /etc/selinux/config
SELINUX=enforcing
SELINUXTYPE=targeted
在启动时通过将向内核传递参数来设置SELinux 模式:
- enforcing=1,设置强制模式。
- enforcing=0,设置许可模式。
- selinux=0,来彻底禁用 SELinux。
- selinux=1,启用 SELinux(当设置enforcing参数是,该参数可以省略)。
实验: selinux模式为enforcing情况下,破解root密码。破解完成后不执行 touch /.autorelabel命令。
重启测试:使用正确的密码登录。结果:登录失败。原因:用户验证程序无法访问/etc/shadow,因为破解密码过程中/etc/shadow文件标签被破坏了。
处理方法:系统启动时,内核添加参数 selinux=1 enforcing=0
0 laoma
其他命令中 -Z 选项
cp -Z set SELinux security context of destination file to default type
mkdir -Z set SELinux security context of each created directory to the default type
### SELinux 模式
- **enforcing 模式**: SELinux**强制执行**访问控制规则。 在强制模式下,如果规则没有明确允许访问,则拒绝访问,并写入日志。此模式是默认模式。
- **Permissive 模式**:SELinux 加载策略并处于活动状态,但**不强制执行**访问控制规则,**⽽是记录访问违规**。此模式有助于对应用和规则进行测试和故障排除。
- **disable 模式**:完全**关闭 SELinux**。不拒绝任何SELinux违规,不予记录。
**查看当前模式**
```bash
[root@centos7 ~]# getenforce
更改当前模式
[root@centos7 ~]# setenforce
usage: setenforce [ Enforcing | Permissive | 1 | 0 ]
# 强制模式临时切换为允许模式
[root@centos7 ~]# setenforce 0
# 或者
[root@centos7 ~]# setenforce Permissive
# 允许模式临时切换为强制模式
[root@centos7 ~]# setenforce 1
# 或者
[root@centos7 ~]# setenforce Enforcing
模式切换注意事项:
- 强制模式和允许模式之间变更,不需要重启系统。
- 从强制模式或者允许模式变更到禁用模式,或者从禁用模式变更到强制模式或者允许模式都需要重启系统。
更改 SELinux 默认模式
[root@centos7 ~]# vim /etc/selinux/config
SELINUX=enforcing
SELINUXTYPE=targeted
在启动时通过将向内核传递参数来设置SELinux 模式:
- enforcing=1,设置强制模式。
- enforcing=0,设置许可模式。
- selinux=0,来彻底禁用 SELinux。
- selinux=1,启用 SELinux(当设置enforcing参数是,该参数可以省略)。
实验: selinux模式为enforcing情况下,破解root密码。破解完成后不执行 touch /.autorelabel命令。
重启测试:使用正确的密码登录。结果:登录失败。原因:用户验证程序无法访问/etc/shadow,因为破解密码过程中/etc/shadow文件标签被破坏了。
处理方法:系统启动时,内核添加参数 selinux=1 enforcing=0
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐


所有评论(0)