安恒培训-安全加固

终于要学到点真东西了吗

Posted by hangyangjun on September 24, 2025

系统安全加固检查清单

一、用户与权限安全

  1. 检查可登录且密码为空的用户
    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 脚本和数据处理场景。

  2. 检查 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 一并删除)。

二、系统配置安全

  1. 检查 core dump 内存快照启用状态
    • 查看配置:cat /etc/security/limits.conf | grep -E "hard core|soft core"
    • 安全标准:hard core 0soft core 0 表示禁用 core dump(防止敏感信息泄露),若不为 0,需修改为 0 并重启生效。
  2. 检查硬盘利用率
    1
    2
    
    df -h  # 查看整体磁盘使用率
    du -sh /home/*  # 检查用户目录占用(按需扩展路径)
    

    预警:若分区使用率超过 85%,需清理冗余文件(如日志、临时文件),避免磁盘满导致系统异常。

  3. history 历史命令条数限制
    • 配置文件:/etc/profile(全局)或 ~/.bashrc(用户级)
    • 检查命令:grep "HISTSIZE" /etc/profile
    • 安全建议:设置合理值(如 HISTSIZE=1000),并添加 HISTFILESIZE=1000 限制历史文件大小,减少命令泄露风险。
  4. 检查 umask 值
    • 查看当前 umask:umask
    • 全局配置:grep "umask" /etc/profile/etc/bashrc
    • 安全标准:建议为 022(默认文件权限 644,目录 755),避免新建文件/目录权限过松(如 000 会导致任意用户可读写)。
  5. 密码策略检查
    • 最小长度: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.sopam_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 实现临时锁定。

三、日志与审计安全

  1. 检查系统日志审计服务(auditd)
    • 查看状态:systemctl status auditdps -ef | grep auditd
    • 启用建议:若未启动,执行 systemctl enable --now auditd(记录系统关键操作,如用户登录、权限变更)。
  2. 检查登录日志
    • 查看历史登录记录: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/grubGRUB_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   #结尾添加

不必要服务禁用

  1. 禁用 talk 服务(远程聊天,高风险)
    1
    2
    
    systemctl stop talk.socket talk.service
    systemctl disable talk.socket talk.service
    
  2. 禁用 sendmail 服务(非必要邮件服务)
    1
    2
    3
    4
    
    systemctl stop sendmail
    systemctl disable sendmail
    # 若使用 postfix 替代,非必要也建议禁用
    systemctl stop postfix && systemctl disable postfix
    
  3. 禁用 FTP 服务(明文传输,风险高)
    1
    2
    3
    4
    
    # 常见 FTP 服务:vsftpd、proftpd 等
    systemctl stop vsftpd
    systemctl disable vsftpd
    # 替代方案:使用 SFTP(基于 SSH,默认随 sshd 启用)
    
  4. 禁用 telnet 服务(明文传输,风险高)
    1
    2
    3
    
    systemctl stop telnet.socket
    systemctl disable telnet.socket
    # 替代方案:使用 SSH(`sshd` 服务,确保启用并配置密钥登录)