Linux系统安全加固指南
Linux系统安全加固指南
概述
系统加固(System Hardening)是指通过配置调整和安全措施来减少系统攻击面、提升系统安全性的过程。Linux 系统虽然以安全著称,但默认安装配置往往为了易用性而牺牲了一部分安全性。在生产环境中,必须根据最小权限原则和纵深防御策略对系统进行全面加固。
Linux 系统加固的主要领域包括:账户安全加固、文件系统安全、网络服务最小化、SSH 安全配置、内核安全参数调优和审计日志配置。每个领域都有具体的配置项和最佳实践,需要系统管理员和安全工程师逐一落实。
加固工作应以权威的安全基线标准为参考,如 CIS Benchmark(Center for Internet Security)和等保 2.0 要求。这些标准提供了经过行业验证的安全配置建议,可以作为加固工作的检查清单。
核心概念
账户安全加固
密码策略配置:设置密码复杂度要求(大小写字母+数字+特殊字符,最少 12 位),配置密码过期策略(/etc/login.defs 中设置 PASS_MAX_DAYS 90),限制密码修改间隔(PASS_MIN_DAYS 7),启用密码强度检查(使用 pam_pwquality 模块)。
账户锁定策略:通过 pam_faillock 或 pam_tally2 配置登录失败锁定策略,例如连续 5 次失败锁定 15 分钟。在 /etc/pam.d/system-auth 中添加相应配置。同时限制 root 账户的直接登录,强制通过普通用户 su 或 sudo 提权。
禁用和清理不必要的账户:锁定系统中不使用的账户(usermod -L <username>),删除不必要的测试账户,确保所有有登录权限的账户都有明确的业务需求和责任人。定期审查 /etc/passwd 中有登录 shell 的用户列表。
文件系统安全
关键文件权限设置:/etc/passwd(644)、/etc/shadow(600,属主为 root)、/etc/group(644)、/etc/ssh/sshd_config(600)。使用 chmod 和 chown 确保关键配置文件只能由 root 用户读写。
SUID/SGID 文件管理:使用 find / -perm -4000 -type f 和 find / -perm -2000 -type f 定期扫描系统中的 SUID/SGID 文件,移除不必要的 SUID/SGID 权限。特别是用户自编译的程序和第三方软件,不应设置 SUID 位。
/tmp 和 /var/tmp 目录加固:将这些目录挂载在独立分区上,使用 noexec,nosuid,nodev 选项挂载,防止攻击者在临时目录中执行恶意程序。设置目录的 sticky bit(chmod +t /tmp),确保用户只能删除自己创建的文件。
服务最小化
禁用不必要的服务:使用 systemctl list-unit-files --type=service 列出所有服务,禁用不需要的服务(如 rpcbind、avahi-daemon、cups 等)。每个不必要的服务都是潜在的攻击面,遵循"默认拒绝"的原则,只保留业务必需的服务。
端口管理:使用 ss -tlnp 或 netstat -tlnp 查看当前监听的端口,确认每个监听端口都有明确的业务用途。对于仅需本地访问的服务(如数据库),绑定到 127.0.0.1 而非 0.0.0.0。
软件包管理:定期更新系统软件包(yum update 或 apt upgrade),移除不需要的软件包,特别是编译工具(gcc、make)在生产环境中通常不需要保留。
SSH安全加固
关键配置项(修改 /etc/ssh/sshd_config):禁用 root 直接登录(PermitRootLogin no)、禁用密码认证仅允许密钥登录(PasswordAuthentication no)、修改默认端口(Port 22222)、限制登录用户(AllowUsers user1 user2)、设置连接超时(ClientAliveInterval 300、ClientAliveCountMax 2)。
密钥管理:使用 Ed25519 或 RSA 4096 位密钥对,定期轮换密钥,移除不再使用的公钥。设置 MaxAuthTries 3 限制认证尝试次数,使用 AllowGroups 限制允许 SSH 登录的用户组。
使用 fail2ban 或类似工具防止 SSH 暴力破解:配置在连续失败后自动封禁 IP 地址。示例配置:maxretry = 5,bantime = 3600,findtime = 600。
内核安全参数
通过 /etc/sysctl.conf 或 /etc/sysctl.d/ 配置内核安全参数:禁用 IP 转发(net.ipv4.ip_forward = 0,除非作为路由器)、启用 SYN Cookie 防护(net.ipv4.tcp_syncookies = 1)、忽略 ICMP 广播(net.ipv4.icmp_echo_ignore_broadcasts = 1)、禁止源路由(net.ipv4.conf.all.accept_source_route = 0)。
启用地址空间随机化(ASLR):kernel.randomize_va_space = 2。限制 core dump(fs.suid_dumpable = 0)。限制 dmesg 访问(kernel.dmesg_restrict = 1)。
实战要点
- 加固前先建立基线:在进行加固配置之前,先对系统当前状态进行全面的快照和记录,便于加固后进行对比验证,也方便在出现问题时快速回滚。
- 逐步加固逐一验证:不要一次性进行所有加固操作,应分批次逐步进行,每完成一项加固后验证业务功能是否正常。某些加固操作可能影响业务兼容性。
- 自动化加固脚本:将加固操作编写为自动化脚本,结合 Ansible、Puppet 等配置管理工具实现批量部署和持续合规检查。CIS-CAT 等工具可以自动检查系统配置是否符合 CIS Benchmark。
- 建立加固检查清单:将加固项目按优先级整理为检查清单,定期进行安全巡检。高优先级项目包括 SSH 加固、账户策略、防火墙配置等。
- 关注加固对业务的影响:某些加固措施(如 SELinux 强制模式、严格的文件权限)可能影响应用的正常运行。在实施前应充分评估兼容性,必要时为特定应用配置例外规则。
总结
Linux 系统加固是一个持续的过程,而非一次性的工作。随着新漏洞的披露和业务需求的变化,安全配置也需要不断调整和优化。以 CIS Benchmark 或等保 2.0 标准为指导,结合自动化工具实现持续合规管理,是维持系统安全状态的有效方法。加固工作的核心原则是最小权限和纵深防御,确保单一层级的安全措施被突破后,仍有其他层级的防护来阻止攻击。