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 区别
  1. IPTables是基于接口和四表五链,来设置规则,并进行匹配执行动作
  2. Firewalld是基于区域,来设置规则,不同的区域有不同的规则,与硬件防火墙相似
  3. 二者的配置文件不同,IPTables会存储在/etc/sysconfig/iptables下面,Firewalld的配置文件在/etc/firewalld,/usr/lib/firewalld/。/etc/下面的配置文件会被优先加载。/usr/下面的是默认配置文件,各种xml文件组成
  4. IPTables在更改现有规则时,更改后,会清除当前的旧规则,并从/etc/sysconfig/iptables读取新的规则,但是Firewalld不会,Firewalld在改变现有规则时,不会中断现行链接
  5. IPTables是静态防火墙,Firewalld是动态防火墙

1.2.3 Firewalld区域描述

  1. trusted(信任区)∶允许所有的传入流量。
  2. public(公共区)∶允许与ssh或dhcpv6-client预定义服务匹配的传入流量,其余均拒绝
  3. external (外部区): 允许与 ssh预定义服务匹配的传入流量,其余均拒绝。默认将通过此区域转发的IPv4传出流量将进行地址伪装, 可用于为路由器启用了伪装功能的外部网络。
  4. home (家庭区)∶允许与ssh、ipp-client、mdns、samba-client或dhcpv6-client预定义服务匹配的传入流量,其余均拒绝。
  5. internal (内部区)∶ 默认值时与home区域相同。
  6. work (工作区)∶允许与 ssh、ipp-client、dhcpv6-client 预定义服务匹配的传入流量,其余均拒绝。
  7. dmz (隔离区)∶允许与 ssh 预定义服务匹配的传入流量,其余均拒绝。
  8. block(限制区)∶拒绝所有传入流量。
  9. 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  630 13:53 a.txt
#新创建的文件属主拥有读写执行权限,同组用户拥有读和执行权限,其他用户无权限。
  • 24
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值