Linux系统安全加固
1、操作系统加固-Firewalld/IPTables
1.1 IPTables
1.1.1 概述
IPTables是Linux系统用于定义防火墙规则的工具,他是由两部分组成的,一个是IPTables,另一个是netfilter,主要工作在网络层,针对IP数据包。
1.1.2 IPTables与NetFilter的关系
NetFilter:是内核的一部分,由数据包的过滤表组成,这些表包含内核用来控制数据包过滤处理的规则。
IPTables:是一种用来管理Linux防火墙的命令程序,它使插入、修改和删除数据包过滤表中的规则变得容易
1.1.3 IPTables的四表五链
规则表:容纳各种规则表
规则链:容纳各种防火墙规则
原理总结:表中包含链,链中包含规则。
1.1.3.1 四表
1、Filter表:Filter表是最常用的表,用于过滤数据包,包含 INPUT、OUTPUT 和 FORWARD 三个默认的链。
2、Nat 表:用于网络地址转换(NAT功能),它包含了 PREROUTING、POSTROUTING 和 OUTPUT 三个默认的链。用于修改数据包的IP地址和端口。
3、Mangle表:Mangle 表用于修改数据包的特定字段,如 TTL(生存时间)、TOS(服务类型)等。它包含了 PREROUTING、INPUT、FORWARD、OUTPUT 和 POSTROUTING 五个默认的链。
4、Raw表:Raw 表用于跳过一些内核处理的步骤。它包含了 PREROUTING 和 OUTPUT 两个默认的链。raw 表主要用于设置连接跟踪规则。
四表的优先级:Raw > Mangle > Nat > Filter
1.1.3.1 五链
1、INPUT 链:处理入站数据,目标IP为本机IP的数据包流量
2、OUTPUT 链:处理出站数据,从本机IP出去的数据包流量
3、FORWARD 链:处理通过本地系统进行转发的数据流量。如果 Linux 系统被配置成路由器或网关,数据包将经过 FORWARD 链。
4、PREROUTING 链:处理数据包路由之前修改数据包,来修改目的地址,用来做DNAT。
5、POSTROUTING 链:处理数据包路由之后修改数据包,来修改源地址,用来做SNAT。
1.1.4 规则链之间的匹配顺序
匹配优先级分为两种情况,一种是主机防火墙,一种是网络防火墙,主机防火墙指的是,目的都是自己,不需要流量转发,网络防火墙指的是需要防火墙进行转发的数据包,比如网关是防火墙的
主机防火墙:
入站数据:来自外部的数据包,目标地址是本机,PREROUTING --> INPUT -->本机的应用程序
出站数据:从防火墙本机出去的数据包,向外部发送的本机的应用程序–> OUTPUT --> POSTROUTING
网络防火墙:
转发数据(需要经过防火墙转发): PREROUTING --> FORWARD --> POSTROUTING
1.1.5 规则链内的匹配顺序
a、自上而下依次匹配策略,匹配到执行相应的动作(允许、拒绝),并停止向下匹配
b、如果没有匹配到策略,按照这条链的默认策略,如果没改过,默认是允许
1.1.6 IPTables语法
语法格式:
iptables -t 表名 参数 规则链 -p 匹配的对象 -j 动作
参数参考:https://www.linuxcool.com/iptables
1. 不指定表名时,默认指filter表
2. 不指定链名时,默认指表内的所有链
3. 除非设置链的默认策略,否则必须指定匹配条件
4. 控制类型使用大写字母,其余均为小写
#禁止所有的ICMP协议流量进入
[root@anolis ~]# iptables -t filter -A INPUT -p icmp -j REJECT
#禁止所有的IP访问3396端口
[root@anolis ~]# iptables -t filter -A INPUT -p tcp --dport 3396 -j DROP
#禁止源IP为192.168.1.235的访问6547端口
[root@anolis ~]# iptables -t filter -A INPUT -p tcp -s 192.168.1.235 --dport 6547 -j DROP
#禁止本机流量访问外部的33端口
[root@anolis ~]# iptables -t filter -A OUTPUT -p tcp --dport 33 -j DROP
#禁止本机流量访问192.168.54.22的33端口
[root@anolis ~]# iptables -t filter -A OUTPUT -p tcp -d 192.168.54.22 --dport 33 -j DROP
#作为网络防火墙的时候,允许源IP为10.32.13.234访问目的IP为10.32.13.233的3367端口
[root@anolis ~]# iptables -t filter -A FORWARD -p tcp -s 10.32.13.234 -d 10.32.13.233 --dport 3367 -j ACCEPT
1.2 Firewalld
1.2.1 概述
Firewalld是用于定义防火墙规则的工具,而且Firewalld是对域进行管控,可以通过不同的域制定不同的规则,需要切换规则的时候可以直接切换域即可
1.2.2 IPTables与Firewalld
1.2.2.1 分析
二者都是用来定义防火墙规则的工具,而且都是指向NetFilter网络过滤系统来实现包过滤防火墙的功能。但是Firewalld有两种工作状态,一个是运行时配置一个是永久配置。
1.2.2.2 区别
- IPTables是基于接口和四表五链,来设置规则,并进行匹配执行动作
- Firewalld是基于区域,来设置规则,不同的区域有不同的规则,与硬件防火墙相似
- 二者的配置文件不同,IPTables会存储在/etc/sysconfig/iptables下面,Firewalld的配置文件在/etc/firewalld,/usr/lib/firewalld/。/etc/下面的配置文件会被优先加载。/usr/下面的是默认配置文件,各种xml文件组成
- IPTables在更改现有规则时,更改后,会清除当前的旧规则,并从/etc/sysconfig/iptables读取新的规则,但是Firewalld不会,Firewalld在改变现有规则时,不会中断现行链接
- IPTables是静态防火墙,Firewalld是动态防火墙
1.2.3 Firewalld区域描述
- trusted(信任区)∶允许所有的传入流量。
- public(公共区)∶允许与ssh或dhcpv6-client预定义服务匹配的传入流量,其余均拒绝
- external (外部区): 允许与 ssh预定义服务匹配的传入流量,其余均拒绝。默认将通过此区域转发的IPv4传出流量将进行地址伪装, 可用于为路由器启用了伪装功能的外部网络。
- home (家庭区)∶允许与ssh、ipp-client、mdns、samba-client或dhcpv6-client预定义服务匹配的传入流量,其余均拒绝。
- internal (内部区)∶ 默认值时与home区域相同。
- work (工作区)∶允许与 ssh、ipp-client、dhcpv6-client 预定义服务匹配的传入流量,其余均拒绝。
- dmz (隔离区)∶允许与 ssh 预定义服务匹配的传入流量,其余均拒绝。
- block(限制区)∶拒绝所有传入流量。
- drop(丢弃区)∶任何接收的网络数据包都被丢弃,没有任何回复。仅能有发送出去的网络连接
1.2.4 Firewalld语法
1.2.4.1 域管理语法
#查看默认的域
[root@anolis ~]# firewall-cmd --get-default-zone
public
#查看所有可用的域
[root@anolis ~]# firewall-cmd --get-zones
AnolisServer block dmz drop external home internal nm-shared public trusted work
#查看当前活跃的域
#这个地方要注意,Firewalld的原理是根据不同的域来进行规则的匹配的,也就是说,你写的规则要和你网卡绑定的域一致才会生效,比如我把规则卸写在了Work域,但是网卡绑定了public域,此时规则是不生效的
[root@anolis ~]# firewall-cmd --get-active-zones
public
interfaces: ens33
#语法格式
firewall-cmd --zone=区域 --list-内容
#查看public区域的开放port
[root@anolis ~]# firewall-cmd --zone=public --list-port
22/tcp
#查看public区域的开放service
[root@anolis ~]# firewall-cmd --zone=public --list-service
dhcpv6-client ssh
#查看public区域的所有配置
[root@anolis ~]# firewall-cmd --zone=public --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens33
sources:
services: dhcpv6-client ssh
ports: 22/tcp
protocols:
forward: yes
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
#查看ens33网卡绑定的域
[root@anolis ~]# firewall-cmd --get-zone-of-interface=ens33
public
#给lo网卡绑定work域,实际工作lo换成对应网卡即可
[root@anolis ~]# firewall-cmd --zone=work --add-interface=lo
success
#查看活动域,发现work域已经绑定了lo
[root@anolis ~]# firewall-cmd --get-active-zones
public
interfaces: ens33
work
interfaces: lo
#修改lo网卡的work域为home域
[root@anolis ~]# firewall-cmd --zone=home --change-interface=lo
success
#查看,修改成功
[root@anolis ~]# firewall-cmd --get-active-zones
home
interfaces: lo
public
interfaces: ens33
#移除home域下的lo网卡
[root@anolis ~]# firewall-cmd --zone=home --remove-interface=lo
success
#移除成功
[root@anolis ~]# firewall-cmd --get-active-zones
public
interfaces: ens33
1.2.4.2 规则管理语法
#允许访问SSH服务
[root@anolis ~]# firewall-cmd --permanent --add-service=ssh
success
#允许访问22/tcp的端口
[root@anolis ~]# firewall-cmd --permanent --add-port=22/tcp
success
#刷新配置
[root@anolis ~]# firewall-cmd --reload
success
#列出配置
[root@anolis ~]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens33
sources:
services: ssh
ports: 22/tcp
protocols:
forward: yes
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
#允许源IP访问80端口
[root@anolis ~]# firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.32.13.110" port port="80" protocol="tcp" accept'
success
#刷新配置
[root@anolis ~]# firewall-cmd --reload
success
#查看rich-rule
[root@anolis ~]# firewall-cmd --list-rich-rules
rule family="ipv4" source address="10.32.13.110" port port="80" protocol="tcp" accept
#允许源IP为10.32.13.110的,访问目的IP为10.32.100.100的7761端口
#如果是拒绝访问,accept换成reject即可,这种带目的IP参数,多用于Firewalld为中间网关,需要转发流量的情况下
[root@anolis ~]# firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.32.13.110" destination address="10.32.100.100" port port="7761" protocol="tcp" accept'
success
[root@anolis ~]# firewall-cmd --reload
success
[root@anolis ~]# firewall-cmd --list-rich-rules
rule family="ipv4" source address="10.32.13.110" destination address="10.32.100.100" port port="7761" protocol="tcp" accept
rule family="ipv4" source address="10.32.13.110" port port="80" protocol="tcp" accept
1.2.5 Firewalld优先级说明
按照从大到小的优先级
1、直接规则(direct):由于直接规则直接操作iptables,它们拥有最高的优先级,语法示例:
[root@anolis ~]# firewall-cmd --direct --permanent --add-rule ipv4 raw PREROUTING 0 -s 162.12.12.0/24 -j blacklist
success
#--direct: 表示直接操作 iptables 规则,而不是通过 firewalld 的抽象层。
#--permanent: 表示将规则永久保存,即使在防火墙重启后也会生效。
#--add-rule ipv4 raw PREROUTING 0 -s 162.12.12.0/24 -j blacklist: 添加一条针对IPv4 的规则。
#raw PREROUTING: 在 PREROUTING 链中添加规则,raw 表用于配置不进行连接跟踪的数据包。
#0: 规则的优先级,数值越小优先级越高。在这里设置为 0,表示最高优先级。
#-s 162.12.12.0/24: 匹配源 IP 地址为 162.12.12.0/24 的数据包。
#-j blacklist: 将匹配到的数据包跳转到名为 blacklist 的自定义链进行处理。
2、预定义服务和端口规则: 在区域中定义的服务(即预定义端口)和额外端口规则。语法示例:
#允许访问SSH服务
[root@anolis ~]# firewall-cmd --permanent --add-service=ssh
success
#允许访问22/tcp的端口
[root@anolis ~]# firewall-cmd --permanent --add-port=22/tcp
success
3、丰富规则: 使用firewall-cmd --add-rich-rule添加的规则,提供更细致控制。语法示例:
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.32.13.110" destination address="10.32.100.100" port port="7761" protocol="tcp" accept'
4、区域默认策略: 如果没有规则匹配,区域中的默认策略(通常是accept或reject)最后被应用。
2、身份鉴别加固
2.1 概述
身份鉴别安全加固主要是针对密码复杂度的调整,主要是包括密码大小写、字母、符号以及密码更换期限等,以及登录限制,重试次数。
2.2 /etc/login_defs
2.2.1 /etc/login_defs概述
/etc/login_defs是设置用户账号限制的文件,但是该文件默认配置是对root不生效的,而且如果说与/etc/shadow文件中的用户信息有冲突的话,/etc/shadown的优先级会大于/etc/login_defs的。
2.2.2 /etc/login_defs参数配置
[root@anolis ~]# vim /etc/login.defs
# 密码最大有效期
PASS_MAX_DAYS 30
# 两次修改密码的最短间隔时间
PASS_MIN_DAYS 1
# 密码过期前七天进行提示
PASS_WARN_AGE 7
# 密码最小长度是8
PASS_MIN_LEN 8
2.3 /etc/pam.d/password-auth
PAM详情,请参考PAM中文手册https://www.docs4dev.com/docs/zh/linux-pam/1.1.2/reference/sag-configuration-file.html
2.3.1 /etc/pam.d/password-auth概述
用来设置密码强度的文件,比如至少包含几个大写字母,几个小写字母,几个数字
2.3.2 /etc/pam.d/password-auth参数配置
[root@anolis ~]# vim /etc/pam.d/password-auth
auth required pam_faillock.so preauth silent audit deny=3
auth sufficient pam_unix.so nullok try_first_pass
auth [default=die] pam_faillock.so authfail audit deny=3
account required pam_faillock.so
#auth: 表示这是一个身份验证指令。
#required: 表示此模块是必需的,如果失败,则整个身份验证过程将失败。
#pam_faillock.so: 是要使用的 PAM 模块,用于在登录之前检查失败次数并在达到指定次数后锁定用户。
#preauth: 表示此模块将在实际身份验证之前执行。
#silent: 表示在处理过程中不显示任何消息。
#audit: 表示记录审计信息。
#deny=3: 表示在连续三次密码错误后锁定用户。
#sufficient: 表示如果此模块成功,则整个身份验证过程将成功,无需继续其他模块。
#pam_unix.so: 是要使用的 PAM 模块,用于执行标准的 Unix 身份验证(如密码检查)。
#nullok: 表示允许空密码(即没有密码的用户)。
#try_first_pass: 表示尝试使用上一次传递给模块的密码,而不是要求用户重新输入密码。
#[default=die]: 表示如果此模块失败,则整个身份验证过程将失败。
#authfail: 表示此模块将在实际身份验证失败时执行。
#account: 表示这是一个帐户管理指令,用于检查用户帐户的状态(如是否可用、是否过期等)。
[root@anolis ~]# vim /etc/profile
export TMOUT=120
[root@anolis ~]# source /etc/profile
2.3.3 验证
#创建一个newuser用户,密码随意,使用newuser用户登录修改密码
#距离上次修改密码太近,禁止修改密码
[newuser@anolis ~]$ passwd
Changing password for user newuser.
Changing password for newuser.
Current password:
You must wait longer to change your password.
#root用户ssh新建的用户,前三次输入错误密码,造成锁定,后续重新登录,输入正确密码,发现账户已经被锁定
[root@anolis ~]# ssh newuser@192.10.10.10
newuser@192.10.10.10's password:
Permission denied, please try again.
newuser@192.10.10.10's password:
Permission denied, please try again.
newuser@192.10.10.10's password:
newuser@192.10.10.10: Permission denied (publickey,gssapi-with-mic,password).
#通过faillock命令,查看失败的情况
[root@localhost ~]# faillock --user newuser
newuser:
When Type Source Valid
2024-06-30 13:24:27 RHOST 10.128.0.1 V
2024-06-30 13:24:33 RHOST 10.128.0.1 V
2024-06-30 13:24:38 RHOST 10.128.0.1 V
#手动解锁命令,reset后发现计数清0
[root@localhost ~]# faillock --user newuser --reset
[root@localhost ~]# faillock --user newuser
newuser:
When Type Source Valid
#另一个终端测试,可以登录
[root@localhost ~]# ssh newuser@10.128.100.100
newuser@10.128.100.100's password:
Last failed login: Sun Jun 30 13:37:39 CST 2024 from 10.128.0.1 on ssh:notty
There were 4 failed login attempts since the last successful login.
Last login: Sun Jun 30 13:35:21 2024 from 10.128.0.1
[newuser@localhost ~]$ exit
注销
Connection to 10.128.100.100 closed.
3、文件访问加固
3.1 Umask设置
umask 原理解析
umask 默认值一般都是 0002,其中第一个 0 与特殊权限有关,可以暂时不用理会,后三位 002 则与普通权限(rwx)有关,其中 002 中第一个 0 与用户(user)权限有关,表示从用户权限减 0,也就是权限不变,所以文件的创建者的权限是默认权限(rw),第二个 0 与组权限(group)有关,表示从组的权限减 0,所以群组的权限也保持默认权限(rw),最后一位 2 则与系统中其他用户(others)的权限有关,由于 w=2,所以需要从其他用户默认权限(rw)减去 2,也就是去掉写( w )权限,则其他人的权限为 rw - w = r,则创建文件的最终默认权限为 -rw-rw-r– 。
[root@localhost ~]# vim /etc/profile
umask 027
[root@localhost ~]# source /etc/profile
[root@localhost ~]# touch a.txt
[root@localhost ~]# ll -a a.txt
-rw-r-----. 1 root root 0 6月 30 13:53 a.txt
#新创建的文件属主拥有读写执行权限,同组用户拥有读和执行权限,其他用户无权限。