系统安全加固检查清单
一、用户与权限安全
- 检查可登录且密码为空的用户
1 2 3 4
# 结合可登录用户列表,进一步检查密码为空的用户 awk -F ":" '{if ($7!="/sbin/nologin" && $7!="/bin/false") print $1 }' /etc/passwd | while read user; do passwd -S $user | grep -q "NP" && echo "警告:用户 $user 可登录且密码为空" done
说明:
passwd -S显示用户密码状态,”NP” 表示无密码(空密码),需为这类用户设置强密码。
awk是一种强大的文本处理工具,主要用于对结构化文本(如日志、配置文件、CSV 等)进行分析、提取、转换和统计。它以行为单位处理文本,支持模式匹配和复杂的逻辑操作,广泛应用于 Shell 脚本和数据处理场景。 - 检查 UID 与 root 相同的用户(UID=0)
1
awk -F ":" '$3 == 0 {print $1 " (UID=0)"}' /etc/passwd
处理:除 root 外,若存在其他 UID=0 用户,需先修改其 UID(
usermod -u 新UID 用户名),再删除冗余用户(如userdel user42,若有主目录可加-r一并删除)。
二、系统配置安全
- 检查 core dump 内存快照启用状态
- 查看配置:
cat /etc/security/limits.conf | grep -E "hard core|soft core" - 安全标准:
hard core 0和soft core 0表示禁用 core dump(防止敏感信息泄露),若不为 0,需修改为 0 并重启生效。
- 查看配置:
- 检查硬盘利用率
1 2
df -h # 查看整体磁盘使用率 du -sh /home/* # 检查用户目录占用(按需扩展路径)
预警:若分区使用率超过 85%,需清理冗余文件(如日志、临时文件),避免磁盘满导致系统异常。
- history 历史命令条数限制
- 配置文件:
/etc/profile(全局)或~/.bashrc(用户级) - 检查命令:
grep "HISTSIZE" /etc/profile - 安全建议:设置合理值(如
HISTSIZE=1000),并添加HISTFILESIZE=1000限制历史文件大小,减少命令泄露风险。
- 配置文件:
- 检查 umask 值
- 查看当前 umask:
umask - 全局配置:
grep "umask" /etc/profile或/etc/bashrc - 安全标准:建议为
022(默认文件权限644,目录755),避免新建文件/目录权限过松(如000会导致任意用户可读写)。
- 查看当前 umask:
- 密码策略检查
- 最小长度:
grep "PASS_MIN_LEN" /etc/login.defs(建议 ≥8 位) - 过期时间:
grep "PASS_MAX_DAYS" /etc/login.defs(建议 ≤90 天) - 过期警告天数:
grep "PASS_WARN_AGE" /etc/login.defs(建议 ≥7 天) - 复杂度:通过 PAM 模块配置,检查
/etc/pam.d/system-auth或/etc/pam.d/common-password中是否包含pam_cracklib.so或pam_pwquality.so,示例配置:1 2
# 要求密码至少8位,包含大小写、数字和特殊字符 password requisite pam_pwquality.so minlen=8 ucredit=-1 lcredit=-1 dcredit=-1 ocredit=-1
- 认证失败次数限制:
grep "deny" /etc/pam.d/login(建议设置deny=3,即连续3次失败锁定),可配合pam_tally2.so实现临时锁定。
- 最小长度:
三、日志与审计安全
- 检查系统日志审计服务(auditd)
- 查看状态:
systemctl status auditd或ps -ef | grep auditd - 启用建议:若未启动,执行
systemctl enable --now auditd(记录系统关键操作,如用户登录、权限变更)。
- 查看状态:
- 检查登录日志
- 查看历史登录记录:
last(默认读取/var/log/wtmp) - 查看失败登录记录:
lastb(默认读取/var/log/btmp) - 日志保护:确保
/var/log/目录权限为755,日志文件不可被普通用户修改。
- 查看历史登录记录:
补充
关于Linux新增的知识放在 之前的博客文章:Linux 终端命令 从入门到入土😀 里了
文件系统安全加固
安全加固-基础加固
文件系统安全
设置系统磁盘分区
一个分区必须挂载在一个目录下才能使用,分区可以提高安全性
检查是否挂载
mount | grep <目录名称>目录名称>
设置分区挂载选项
如禁止挂载特殊设备或禁止执行二进制文件等
编辑/etc/fstab 挂载选项增加到第四列default后
一般/tmp /var/tmp /dev/shm 及可移动介质设置:
nodev 不解析挂在上的块特殊设备 (/home设置)
nosuid 分区不允许suid位
noexec 不允许二进制文件
运行重新挂载目录使挂载控制选项生效
设置挂载分区控制选项
mount -o remount <挂载控制选项><目录名称> 可以同时指定多个选项,用逗号分隔 mount | grep <目录名称>目录名称>目录名称>挂载控制选项>
设置配置用户权限文件的权限
/etc/passwd /etc/shadow /etc/group /etc/gshadow(用户组密码)
对这些基础配置文件进行权限限制
chown root:root /etc/passwd /etc/shadow /etc/group /etc/gshadow
只有root是配置文件所有者
chmod 0644 /etc/group /etc/passwd
chmod 0400 /etc/shadow /etc/gshadow
限制读写
ls -l /etc/passwd /etc/shadow /etc/group /etc/gshadow
检查权限正确
1
2
3
4
5
[root@localhost ~]# ls -l /etc/passwd /etc/shadow /etc/group /etc/gshadow
-rw-r--r--. 1 root root 1024 12月 19 2024 /etc/group
-r--------. 1 root root 816 12月 19 2024 /etc/gshadow
-rw-r--r--. 1 root root 2539 12月 19 2024 /etc/passwd
-r--------. 1 root root 1932 12月 19 2024 /etc/shadow
更新和启动设置
系统更新设置
定期更新可以增强安全性,注意软件兼容性
yum update centos 更新全部软件包
yum check-update 验证有无需安装软件和补丁
设置bootloader配置的权限
grub配置文件包含关于启动设备和解锁启动选项的密码信息,在/boot/grub2/grub.conf 并链接到/etc/grub2.conf
对引导加载程序bootloder设置root才能进行读写和执行,防止未授权操作和获取系统弱点
chown root:root /boot/grub2/grub.cfg
chmod og-rwx /boot/grub2/grub.cfg
移除「同组用户」和「其他用户」对该文件的所有权限
stat /boot/grub2/grub.cfg
验证文件Uid和Gid都为0/root Access权限不授予其他组/用户
确保单用户模式需要身份验证
类Unix系统工作时的一种拥有超级用户权限的模式,当系统引导期间检测到问题或从引导加载程序手动选择时,会使用单用户模式进行恢复,单用户模式下的ROOt用户对系统有完全操作权限,设置单用户身份验证可以提高安全性。
检测:
grep /sbin/sulogin /usr/lib/systemd/system/rescue.service
grep /sbin/sulogin /uer/lib/systemd/system/emergency.service
加固:
/usr/lib/systemd/system/rescue.service
/uer/lib/systemd/system/emergency.service
设置ExecStart为/usr/sbin/sulogin:
加固内核参数
限制核心转储
核心转储用于确定程序终止的原因,还能从核心文件中收集机密信息。
设置核心转储的硬限制可以防止用户覆盖软变量,如需要,请为组用户设置限制
检测
grep “hard core” /etc/security/limits.conf /etc/security/limits.d/*
sysctl fs.suid_dumpable #查看当前系统内核中 fs.suid_dumpable 参数值
grep “fs.suid_dumpable” /etc/sysctl.conf #在 /etc/sysctl.conf 文件中搜索包含 fs.suid_dumpable 配置项
加固
限制所有用户创建 core dump 文件 在/etc/security/limits.conf /etc/security/limits.d/* 中添加
* hard core 0
禁止 SUID 程序生成 core dump 文件 在/etc/sysctl.conf文件中设置
fs.suid_dumpable = 0
临时禁用具有 SUID 权限的程序生成 core dump 文件 运行以下命令设置活动内核参数
sysctl -w fs.suid_dumpable = 0
启用地址空间布局随机化(ASLR)
增加入侵者预测目的地址难度
在/etc/sysctl.conf文件设置
kernel.randomize_va_space = 2
设置内核活动参数
sysctl -w kernel.randomize_va_space = 2
网络配置安全加固
网络参数配置
禁止数据包发送重定向
ICMP重定向用于向其他主机发送路由信息,为防止主机充当无效ICMP数据包中转站,禁止其发送。因为攻击者可使受攻击的主机将无效的ICMP数据包重定向到其他路由设备且破坏路由设备,让用户访问攻击者设置的系统。
检测方法
1
2
3
4
sysctl net.ipv4.conf.all.send_redirects
sysctl net.ipv4.conf.default.send_redirects
grep "net\.ipv4.conf.all.send_redirects" /etc/sysctl.conf
grep "net\.ipv4.conf.default.send_redirects" /etc/sysctl.conf
加固:
数据包发送重定向默认开启,在/etc/sysctl.conf文件设置关闭
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
设置活动内核参数
sysctl -w net.ipv4.conf.all.send_redirects=0
sysctl -w net.ipv4.conf.default.send_redirects=0
刷新路由缓存
sysctl -w net.ipv4.route.flush=1
不接受源路由信息包
源路由数据包是一种特殊的数据包,其头部包含了完整的传输路径信息
禁用对发送方指定路径的数据包处理,防止攻击者利用源路由特性绕过安全机制
在/etc/sysctl.conf设置
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
设置活动内核参数并刷新路由缓存
1
2
3
sysctl -w net.ipv4.conf.all.accept_source_route = 0
sysctl -w net.ipv4.conf.default.accept_source_route = 0
sysctl -w net.ipv4.route.flush=1
记录可疑的数据包
将不是路由发送的源地址的包记录到内核日志
检测方法同上
加固:在/etc/sysctl.conf设置
1
2
net.ipv4.conf.all.log_martians = 1
net.ipv4.conf.default.log_martians = 1
活动内核设置
1
2
3
sysctl -w net.ipv4.conf.all.log_martians = 1
sysctl -w net.ipv4.conf.default.log_martians = 1
sysctl -w net.ipv4.route.flush=1
禁止响应ICMP广播请求
检测方法同上
加固方法,在/etc/sysctl.conf设置
net.ipv4.icmp_echo_ignore_broadcasts=1
活动内核
1
2
sysctl -w net.ipv4.icmp_echo_ignore_broadcasts=1
sysctl -w net.ipv4.route.flush=1
确保伪造ICMP包被丢弃
net.ipv4.icmp_ignore_bogus_weeor_responses = 1
启用反向过滤
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
启用TCP SYN Cookies
SYN洪范攻击来执行拒绝服务攻击,通过发送大量SYN包但是不完成三次握手过程,这样就耗尽了内核半开放链接队列空间。
而SYN cookie 在半连接队列满了后启用,其将本应该在本地保存的信息放到返回给客户端的SYN-ACK的初始化序列号或时间戳里,等到ACK最终来了之后,再从ACK序列号里解码出保存的信息,建立TCP链接,握手完成可重新分配资源。
加固方法,在/etc/sysctl.conf设置
net.ipv4.tcp_syncookies = 1
活动内核
1
2
sysctl -w net.ipv4.tcp_syncookies = 1
sysctl -w net.ipv4.route.flush = 1
检测生效(其实同上)
1
2
sysctl net.ipv4.tcp_syncookies
grep "net\.ipv4\.tcp_syncookies" /etc/sysctl.conf
IPV6
如果不使用IPv6,禁用以减少可能的攻击
编辑 /etc/default/grub 对 GRUB_CMDLINE_LINUX 变量添加参数 ipv6.disable=1:
1
GRUB_CMDLINE_LINUX="crashkernel=1G-4G:192M,4G-64G:256M,64G-:512M resume=/dev/mapper/cs-swap rd.lvm.lv=cs/root rd.lvm.lv=cs/swap rhgb quiet ipv6.disable=1"
更新grub配置
1
grub2-mkconfig > /boot/grub2/grub.cfg
不接受IPV6路由器广播包
net.ipv6.conf.all.accept_ra = 0
net.ipv6.conf.default.accept_ra = 0
grep “^\s*linux” /boot/grub2/grub.cfg
系统网络访问控制
/etc/host.allow 文件指定允许连接的地址
/etc/host.deny 文件指定不允许连接的地址
而 allow 的优先级大于 deny 的优先级
注意:不适用于较新系统
配置格式
程序名称列表:主机名/IP地址列表
如;在hosts.deny 中有 sshd:192.168.10.10 则禁止用户从此地址远程ssh登录
强制使用 SSH 协议 2
1
2
vim /etc/ssh/sshd_config
Protocol 2 # 仅启用 SSH 协议 2,彻底禁用协议 1
不允许root远程ssh连接
找到 PermitRootLogin 配置项
1
PermitRootLogin no # 禁止 root 用户通过 SSH 远程登录
重启 SSH 服务,使配置生效
sudo systemctl restart sshd
访问控制检查
无操作超时时间
1
2
vim /etc/profile
export TMOUT=100 #结尾添加
不必要服务禁用
- 禁用 talk 服务(远程聊天,高风险)
1 2
systemctl stop talk.socket talk.service systemctl disable talk.socket talk.service
- 禁用 sendmail 服务(非必要邮件服务)
1 2 3 4
systemctl stop sendmail systemctl disable sendmail # 若使用 postfix 替代,非必要也建议禁用 systemctl stop postfix && systemctl disable postfix
- 禁用 FTP 服务(明文传输,风险高)
1 2 3 4
# 常见 FTP 服务:vsftpd、proftpd 等 systemctl stop vsftpd systemctl disable vsftpd # 替代方案:使用 SFTP(基于 SSH,默认随 sshd 启用)
- 禁用 telnet 服务(明文传输,风险高)
1 2 3
systemctl stop telnet.socket systemctl disable telnet.socket # 替代方案:使用 SSH(`sshd` 服务,确保启用并配置密钥登录)