为什么对Linux系统要进行安全基线检查和加固:
虽然说Linux操作系统相比Windows系统更为安全一点,但是在实际使用当中,由于管理员的一些安全意识不够全面或者一时的疏忽,可能会导致Linux系统中的一些账户和服务没有进行正确的配置,这样就可能产生被黑客利用的风险,因此需要。
注意:以下安全操作是基于centos 7
注意:在做所有的操作之前,对源文件都要进行备份以防止意外情况
一.账号管理
1.1 口令锁定策略
实践:
运行命令:more /etc/pam.d/password-auth,发现并没有限制内容,之后需要进行安全加固。
备份:cp -p /etc/pam.d/password-auth /etc/pam.d/password-auth_bak
进行安全加固:在文件的上方添加一行即可
这个配置用来防止账户被暴力破解:
auth required pam_tally2.so deny=5 onerr=fail unlock_time=300 even_deny_root=5 root_unlock_time=600
既然有用户锁定,那就可以使用root给锁定用户解锁
先使用命令:pam_tally2 -u 显示已锁定用户
解锁用户使用命令:pam_tally2 -u <要解锁的用户> -r
1.2 口令生存期
先执行配置文件备份:cp -p /etc/login.defs /etc/login.defs_bak
查看文件配置:
对其进行修改,改为90天。
注意:这里修改之后,只会对之后新建的账号生效,对之前已经存在的不会生效。所以这个时候需要使用命令让修改对已有的账户生效:chage -M 90 -W 7 <username>
可以使用命令:cat /etc/shadow查看相关账户的信息。
1.3 口令复杂度
使用命令:grep -E '^minlen|^minclass' /etc/security/pwquality.conf,可以看到当前对密码复杂度并无要求和规定。
执行修改命令:authconfig --passminlen=8 --passminclass=3 --update
然后再进行查询:
如果要解除这些限制,直接到文件/etc/security/pwquality.conf,然后将minlen和minclass两行参数删除即可。
1.4 检查密码重用是否受限制
输入命令查看:vim /etc/pam.d/system-auth,发现并未进行规范
后面添加参数进行修改,代表密码必须进行五次轮换,不能使用一样的密码:
1.5 检查是否存在除root之外UID为0的用户
使用命令:awk -F: '($3 == 0){print $1}' /etc/passwd
命令解释:
这条命令的作用是查找
/etc/passwd
文件中,用户ID(第3个字段)为0的所有账户,并打印出这些账户的用户名(第1个字段)。在Unix/Linux系统中,用户ID为0通常对应于root用户。但实际上,/etc/passwd
文件中根用户的UID字段不会显示为0,而是会看到一个x(例如,root:x:0:0...
),而实际的UID信息存储在/etc/shadow
文件中。因此,此命令可能不会直接找到表示为0的UID,除非/etc/passwd
被非标准地修改过。
1.6 禁止存在空密码的帐户
使用命令:awk -F: '($2 == ""){print $1}' /etc/passwd
不存在账户密码为空的账户。
二.服务管理
2.1 禁止SSH空密码用户登录
使用命令:more /etc/ssh/sshd_config |grep PermitEmptyPasswords,可以看出查询结果为no,但是被#注销了。
如若查询结果不符合要求,可以在文件中进行配置,将其改为no,这里需要将行首的#删除掉:
当然,最后是需要重启服务来进行生效的:systemctl restart sshd
2.2 SSH多次登录失败后锁定用户
先对配置文件进行查看,可以发现并未有限制:
然后在里面添加登录错误次数限制:
auth required pam_tally2.so deny=5 unlock_time=300 even_deny_root=5 root_unlock_time=600
同样,这里也需要重启服务进行配置生效:systemctl restart sshd
2.3 限制root用户远程登录
查询配置文件:more /etc/ssh/sshd_config |grep PermitRootLogin
对配置文件进行修改,取消掉行首的注释,然后修改为no即可:
同理,更改完成之后重启服务:systemctl restart sshd
2.4 检查ssh使用的端口
查询配置文件:more /etc/ssh/sshd_config |grep Port
对配置文件进行修改,改为多少看需求:
这里的自定义的ssh端口还需要额外做点其他的配置:
semanage port -a -t ssh_port_t -p tcp 222
命令
semanage port -a -t ssh_port_t -p tcp 222
是在Selinux环境下用于添加一个新的端口定义的命令。下面是对这条命令的简单解析:
semanage
是 Security Enhanced Linux 管理工具,用于管理SELinux策略和配置。
port
子命令用于管理SELinux中端口的类型标签(security context),即指定哪些端口应该被赋予什么样的安全上下文。
-a
选项表示添加(add)一个新的端口定义。
-t ssh_port_t
指定了端口的安全上下文类型(type)。在这个例子中,ssh_port_t
是与SSH服务关联的安全上下文,意味着您希望将端口222标记为与SSH服务相同的安全级别,允许SSH服务通过这个端口通信。
-p tcp
指定了协议类型为TCP。SELinux规则可以基于协议分别设置,这里指定的就是TCP协议。
222
是您要添加和配置的端口号。综上所述,这条命令的作用是告诉SELinux系统,将TCP协议下的222端口标记为
ssh_port_t
类型,通常这一步骤是为了允许SSH服务或者其他需要类似安全上下文的服务通过222端口进行通信。这在修改了SSH服务默认监听端口或者设置额外的SSH服务端口时非常有用,确保SELinux不会阻止这些端口的正常通信。
firewall-cmd --zone=public --add-port=222/tcp --permanent
解释如下:
firewall-cmd
:是管理Linux防火墙(通常是firewalld服务)的命令行工具。
--zone=public
:指定操作的区域为public。Firewalld将网络流量划分到不同的区域,public是默认区域之一,适用于外部网络,如互联网。
--add-port=222/tcp
:添加一个端口规则,指定打开TCP协议的222端口。这里直接指定了端口号和协议,不需要像您提到的那样在ssh
后面重复端口信息。
--permanent
:表示该规则在系统重启后仍然有效,如果没有这个参数,则规则只会临时生效,直到下次重启或防火墙规则被刷新。成功执行此命令后,会开放TCP 222端口用于SSH连接,并且这个更改是持久化的。需要注意的是,如果之前有运行过没有
--permanent
参数的相同命令,应当先用firewall-cmd --reload
命令来载入永久规则,或者重启firewalld服务使改动生效。
同理,更改完成之后重启服务:systemctl restart sshd
2.5 设置登录超时自动注销
查询配置:more /etc/profile |grep export ,可以看到并未存在相关配置参数
现在手动进行配置修改,直接在文件的最后一行添加 export TMOUT=180 就行:
注意:等号前后不能有空格
同理,更改完成之后重启服务:systemctl restart sshd
三.权限管理
3.1 检查默认umask值
什么是umask值?
umask值(用户文件创建掩码)是在Linux和其他类Unix系统中使用的一个重要概念,用于控制用户在创建新文件或目录时,默认赋予这些文件或目录的权限。umask是一个由三个八进制数字组成的值,分别对应文件或目录的用户(owner)、组(group)、其他人(others)的权限位。
每个数字分别代表要从默认的最大权限中移除的权限位。在八进制表示中,数字4表示读权限(r),2表示写权限(w),1表示执行权限(x),而0表示没有任何权限。因此,一个典型的umask值如022,意味着:
- 第一位0表示用户(owner)没有权限被去除(保持全部权限);
- 第二位2表示组(group)的写权限被去除;
- 第三位2同样表示其他人(others)的写权限被去除。
根据这个umask值,新创建的文件默认权限会是666(-rw-rw-rw-)减去022,结果是644(-rw-r--r--),即文件所有者有读写权限,而组和其他用户只有读权限。对于目录,默认是从777开始减去umask值,因此umask 022下的新目录权限会是755(drwxr-xr-x)。
通过调整umask值,系统管理员和用户可以微调系统上的安全策略,限制不必要的访问权限,从而增强系统安全性。umask可以在用户的配置文件中设置,如
~/.bashrc
或/etc/profile
,也可以通过运行umask
命令临时或永久地修改。
查看配置文件,文件末尾并未配置umask值:
更改配置文件,然后启用生效:source /etc/profile:
设置好umask之后,新建文件夹的权限就会按umark分配,其中也包括新建的文件:
3.2 检查重要目录和文件的权限设置
ls -l /etc/passwd /etc/shadow /etc/group /etc/gshadow /etc/hosts.allow /etc/services /etc/ssh/sshd_config
/etc/passwd
:存储用户账户信息的文件/etc/shadow
:存储用户密码哈希和账户过期信息等敏感数据的文件/etc/group
:定义用户组信息的文件/etc/gshadow
:类似于/etc/group
,但包含组密码等敏感信息/etc/hosts.allow
:定义哪些主机被允许访问本机网络服务的访问控制列表文件/etc/services
:定义网络服务与其对应的端口号的文件/etc/ssh/sshd_config
:SSH服务器的配置文件,控制SSH服务的行为和安全设置
3.3 限制可以SU为root的用户
做这一步的目的是防止root密码泄露之后,使用其他低权限账户su,然后进行高危操作:
查看配置文件,已被注释,存在不合规行为:
更改完之后,再su就不行了
然后,如何添加用户能够su到root呢:usermod -G wheel <需要添加的用户名>
移除操作命令:gpasswd -d <需要移除的用户名> wheel
四.日志管理
4.1 检查rsyslog服务启用状态以及对登录事件的记录
对于/etc/rsyslog.conf文件的解析,可以参考两篇文章:
日志管理-rsyslogd服务(/etc/rsyslog.conf 配置文件)-CSDN博客
Linux 系统日志管理 rsyslogd配置文件 - lizhouwei - 博客园 (cnblogs.com)
查看配置文件:more /etc/rsyslog.conf,是符合规定的。如果没有或者不一致,可以自己配置和添加
校验rsyslog服务状态,确认是否启动:systemctl status rsyslog
若未启动,使用命令:systemctl start rsyslog 开启服务
但是为了以防万一,最好将其添加到开机自启动服务中去:systemctl enable rsyslog
对配置文件及服务修改完成之后,记得重启rsyslog服务:systemctl restart rsyslog
4.2 检查是否启用记录定时任务行为日志功能
查看配置文件:more /etc/rsyslog.conf
如果不符合规定,可以按照这个进行配置修改或添加,然后重启服务:systemctl restart rsyslog
4.3 查看SSH LogLevel设置是否为INFO
查看配置文件:more /etc/ssh/sshd_config | grep LogLevel,这里虽然配置的级别是INFO,但是已经被注释掉了,需要将行首的#删除。
修改完成之后,重启服务:systemctl restart sshd
4.4 是否将/var/log/messages文件设置为只可追加
查看隐藏权限:lsattr /var/log/messages,这里并未设置只可追加
使用
lsattr
命令,你可以看到文件是否被设置了以下一些特殊的属性:
i
(Immutable):文件不能被修改、删除或重命名。a
(Append Only):文件只能被追加内容,不能被删除或重写。S
(Sparse file):稀疏文件属性,用于大文件优化存储。s
(Secure Deletion):当文件被删除时,会安全擦除其数据,防止恢复。u
(Undelete):一种“防删除”标志,尽管Linux系统中很少直接支持此特性。c
(Compressed):文件内容被压缩。d
(No dump):在系统备份时,该文件不会被dump程序备份。e
(Extent format):文件使用extent来记录其磁盘空间的分配情况,主要针对大文件优化。A
(No atime updates):访问文件时不更新访问时间戳。基本用法如下:
- 查看指定文件或目录的属性:
lsattr [选项] 文件或目录
- 若要查看目录下的所有文件属性(递归),需加上
-R
选项:lsattr -R 目录
使用命令:chattr +a /var/log/messages,配置日志文件只可追加。
转载自CSDN-专业IT技术社区
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/Just_like_this/article/details/138824050