Linux服务器安全加固实战:从账号管理到入侵检测的完整指南
1. 项目概述为什么你的Linux服务器需要“加固”最近在帮朋友排查一个线上服务器被入侵的问题登录上去一看好家伙root密码是123456SSH端口默认22历史命令里一堆可疑的wget和curl。这让我想起一个老生常谈但总被忽视的话题Linux安全加固。很多人觉得服务器在云上、在内网或者装了防火墙就万事大吉了。但现实是自动化扫描工具24小时不间断地在全网“敲门”脆弱的配置就像没上锁的房门被攻破只是时间问题。所谓“安全加固”绝不是安装一个杀毒软件那么简单。它是一个系统性的工程目标是在不影响业务正常运行的前提下最大限度地减少系统的攻击面提升攻击者的入侵成本。这涉及到账号管理、服务管控、文件权限、日志审计等多个层面。今天我就结合自己这些年踩过的坑和积累的经验带你走一遍Linux服务器安全加固的核心流程。无论你是运维工程师、开发者还是个人项目管理者这套方法都能让你的系统更“硬核”。2. 账号与口令安全守住第一道门账号和密码是系统最外层的防线也是最容易被突破的一点。加固从这里开始目标是实现“最小权限”和“强认证”。2.1 清理与管控无用账号系统安装后会默认创建一些非登录账号如bin、daemon这些通常无害。危险的是那些被遗忘的、拥有登录权限的测试账号或前员工账号。操作与原理首先查看所有可登录的账号cat /etc/passwd | grep -v “/sbin/nologin” | grep -v “/bin/false” | cut -d: -f1这条命令筛选出/etc/passwd中shell不是/sbin/nologin或/bin/false的用户这些用户理论上可以通过SSH或本地终端登录。对于确认无用的账号直接删除是最彻底的方式sudo userdel -r username # -r 选项会同时删除用户的家目录和邮件池如果账号暂时不用但未来可能需要锁定是更稳妥的选择sudo passwd -l username # 锁定账号密码认证会失败 sudo usermod -L username # 另一种锁定方式效果相同解锁时使用sudo passwd -u username。实操心得在删除任何账号前务必确认该账号没有关联的正在运行的进程或定时任务。可以用ps -fu username和crontab -u username -l来检查。我曾误删过一个用于监控的账号结果导致一个重要的日志收集脚本失效教训深刻。2.2 实施强密码策略弱密码是安全最大的敌人。我们需要从策略上强制要求密码的复杂性。操作与原理Linux的密码策略主要通过两个文件配置/etc/login.defs和PAM模块。修改/etc/login.defs这个文件定义了新建用户的默认策略。sudo vim /etc/login.defs找到并修改以下关键参数PASS_MAX_DAYS 90 # 密码最长使用90天强制定期更换 PASS_MIN_DAYS 2 # 密码最短使用2天防止用户频繁改回原密码 PASS_MIN_LEN 12 # 密码最小长度12位 PASS_WARN_AGE 7 # 密码过期前7天开始警告这个配置只对新创建的用户生效。使用chage命令管理现有用户对于已存在的用户尤其是root和具有sudo权限的用户必须手动加固。sudo chage -M 90 -m 2 -W 7 username使用sudo chage -l root可以查看root账号的详细密码策略状态。通过PAM强制密码复杂度这是防止用户设置“123456”这类密码的关键。编辑PAM的密码策略配置文件不同发行版路径可能不同常见于/etc/pam.d/system-auth或/etc/pam.d/common-password。sudo vim /etc/pam.d/system-auth找到包含pam_pwquality.so或pam_cracklib.so的行修改或添加参数。对于pam_pwquality示例如下password requisite pam_pwquality.so try_first_pass local_users_only retry3 minlen12 difok3 ucredit-1 lcredit-1 dcredit-1 ocredit-1 enforce_for_rootminlen12最小长度12。difok3新密码中至少3个字符与旧密码不同。ucredit-1至少包含1个大写字母。lcredit-1至少包含1个小写字母。dcredit-1至少包含1个数字。ocredit-1至少包含1个特殊字符。enforce_for_root对root用户同样生效非常重要。注意事项修改PAM配置是高风险操作务必在另一个活跃的SSH会话中测试或者确保有控制台访问权限。一旦配置错误导致所有用户无法登录就只能通过单用户模式修复了。建议先在其他测试机上验证。2.3 限制特权提升与Root直接登录让所有用户都用root登录是灾难的开始。我们必须严格控制谁能成为超级用户。操作与原理禁止Root通过SSH登录这是必须做的一步。编辑SSH配置文件sudo vim /etc/ssh/sshd_config找到PermitRootLogin将其改为noPermitRootLogin no修改后重启SSH服务sudo systemctl restart sshd。务必先创建一个拥有sudo权限的普通用户并测试可以登录后再进行此操作限制可使用sudo或su的用户sudo通过visudo命令编辑/etc/sudoers文件可以精确控制哪个用户、在哪个主机、可以以哪个身份、运行哪些命令。推荐将用户加入wheel组CentOS/RHEL或sudo组Debian/Ubuntu然后配置该组的权限。su限制可以使用su命令切换到root的用户。编辑/etc/pam.d/su文件sudo vim /etc/pam.d/su取消以下行的注释或添加auth required pam_wheel.so use_uid groupwheel这意味着只有wheel组的成员才能使用su切换到root。3. 服务与网络端口管控关闭不必要的入口系统默认启动的许多服务可能你的业务根本用不到每一个监听网络端口的服务都是一个潜在的入口点。3.1 审计并关闭非必要服务操作与原理首先查看所有正在运行的服务和监听端口sudo systemctl list-units --typeservice --staterunning # 查看运行中的服务 sudo ss -tulnp # 或 netstat -tulnp查看所有监听端口及对应进程结合业务需求识别出非必要的服务。例如如果你的服务器是纯后端API服务器那么像bluetooth、cups打印服务、avahi-daemon零配置网络发现等服务通常可以关闭。关闭并禁用服务sudo systemctl stop service_name # 立即停止服务 sudo systemctl disable service_name # 禁止开机自启对于老式SysVinit系统使用service service_name stop和chkconfig service_name off。实操心得关闭服务前最好先了解一下它的作用。可以用systemctl cat service_name查看服务定义或者rpm -qf $(which daemon)RPM系查出来自哪个软件包。最安全的方法是先在测试环境操作并观察关闭后业务应用是否有异常。我曾经在关闭rpcbind服务后导致一个依赖NFS的文件共享功能失效。3.2 SSH服务深度加固SSH是运维的生命线也是攻击者的首要目标。默认配置非常不安全。操作与原理编辑/etc/ssh/sshd_config进行以下关键加固# 1. 修改监听端口非必须但能减少大量自动化扫描 Port 2222 # 改为一个非22的高位端口 # 2. 禁用密码登录强制使用密钥认证最有效的加固 PasswordAuthentication no PubkeyAuthentication yes # 3. 禁用其他不安全的认证方式 ChallengeResponseAuthentication no UsePAM yes # 通常保持yes用于账户和密码策略管理 # 4. 限制登录用户和用户组 AllowUsers alice bob admin192.168.1.0/24 # 只允许alice、bob和来自192.168.1.0/24网段的admin登录 # AllowGroups ssh-users # 或者只允许某个组的用户登录 # 5. 限制最大认证尝试次数和连接数 MaxAuthTries 3 # 每连接最大密码尝试次数配合密钥登录此设置影响不大 MaxSessions 10 # 最大并发会话数 ClientAliveInterval 300 # 客户端300秒无活动则发送保活消息 ClientAliveCountMax 2 # 发送最多2次保活消息后断开连接 # 6. 使用更安全的协议和加密算法高版本OpenSSH默认已较安全 Protocol 2 Ciphers chacha20-poly1305openssh.com,aes256-gcmopenssh.com,aes128-gcmopenssh.com,aes256-ctr,aes192-ctr,aes128-ctr MACs hmac-sha2-512-etmopenssh.com,hmac-sha2-256-etmopenssh.com,umac-128-etmopenssh.com每次修改后使用sudo sshd -t测试配置文件语法是否正确然后再sudo systemctl reload sshd重载配置。密钥对生成与部署在客户端机器生成密钥对ssh-keygen -t ed25519 -C “your_emailexample.com” -f ~/.ssh/my_server_key # -t 指定算法ed25519比RSA更安全高效 # -f 指定密钥文件路径和名称将公钥my_server_key.pub内容追加到服务器的~/.ssh/authorized_keys文件中。务必确保~/.ssh目录权限为700authorized_keys文件权限为600。常见问题问题修改SSH端口后无法连接。排查1. 检查防火墙是否放行了新端口sudo firewall-cmd --list-all或sudo iptables -L -n。2. 检查SELinux是否阻止了新端口sudo semanage port -l | grep ssh如需添加sudo semanage port -a -t ssh_port_t -p tcp 2222。3. 确认重启了sshd服务。问题配置密钥登录后仍然提示输入密码。排查1. 检查服务器上authorized_keys文件权限。2. 检查服务器sshd_config中PubkeyAuthentication是否为yes。3. 检查客户端私钥权限是否过于开放应为600。4. 使用ssh -vvv查看详细的调试信息这是排查SSH问题的利器。4. 文件系统与权限加固内核层面的防护不当的文件权限可能导致敏感信息泄露或提权漏洞。这里的原则也是“最小权限”。4.1 设置安全的umaskumask决定了新建文件和目录的默认权限。宽松的umask如022会导致新建文件对同组和其他用户可读。操作与原理umask是一个掩码用八进制表示。计算方式默认权限文件666目录777减去umask值。umask 022文件权限为644 (rw-r--r--)目录为755。umask 027文件权限为640 (rw-r-----)目录为750 (rwxr-x---)。推荐使用027这样新建文件对同组用户只读对其他用户无权限。全局设置修改/etc/profile或/etc/bashrcsudo sh -c “echo ‘umask 027’ /etc/profile”对于特定服务或用户可以在其启动脚本或.bashrc中单独设置。4.2 关键系统文件权限检查与设置一些关键文件必须拥有严格的权限。操作清单# 检查并设置关键文件权限根据实际情况调整 sudo chmod 644 /etc/passwd # 所有用户可读 sudo chmod 600 /etc/shadow # 仅root可读写存储加密密码 sudo chmod 600 /etc/gshadow # 仅root可读写组密码 sudo chmod 644 /etc/group # 所有用户可读 # 检查SUID/SGID文件这些文件执行时会以文件所有者权限运行风险较高 sudo find / -type f \( -perm -4000 -o -perm -2000 \) -exec ls -l {} \; 2/dev/null # 对于非必要的SUID文件如 /usr/bin/vim, /usr/bin/find可以考虑移除特殊权限sudo chmod u-s /path/to/file4.3 使用文件系统属性增强保护chattr命令可以设置文件的不可修改、只追加等属性防止被篡改。操作与原理sudo chattr i /etc/passwd /etc/shadow /etc/group /etc/gshadow # 设置为不可修改immutable sudo chattr i /etc/ssh/sshd_config # 保护SSH配置 sudo chattr a /var/log/secure /var/log/auth.log # 设置为只追加append-only日志只能增加不能删除要查看属性lsattr /path/to/file。 要取消属性sudo chattr -i /path/to/file。注意事项i属性非常强大在安装软件或系统更新时可能会因为无法修改这些文件而失败。在进行系统维护前需要先临时移除这些属性。这是一个“双刃剑”功能适用于高度稳定、极少变更的生产环境核心配置文件。5. 系统内核与资源限制加固通过调整内核参数可以防御一些常见的网络攻击如SYN Flood并限制用户资源防止本地拒绝服务。5.1 网络内核参数优化编辑/etc/sysctl.conf文件添加或修改以下参数# 1. 防御网络攻击 # 启用IP转发欺骗保护 net.ipv4.conf.all.rp_filter 1 net.ipv4.conf.default.rp_filter 1 # 忽略ICMP重定向防止恶意重定向 net.ipv4.conf.all.accept_redirects 0 net.ipv6.conf.all.accept_redirects 0 net.ipv4.conf.default.accept_redirects 0 net.ipv6.conf.default.accept_redirects 0 # 不发送ICMP重定向 net.ipv4.conf.all.send_redirects 0 net.ipv4.conf.default.send_redirects 0 # 忽略源路由包 net.ipv4.conf.all.accept_source_route 0 net.ipv6.conf.all.accept_source_route 0 # 2. 增强TCP栈安全性 # 启用SYN Cookie防御SYN Flood攻击 net.ipv4.tcp_syncookies 1 # 减少TIME-WAIT套接字加速回收高并发服务需调整 net.ipv4.tcp_tw_reuse 1 net.ipv4.tcp_fin_timeout 30 # 3. 控制核心转储防止敏感信息泄露 fs.suid_dumpable 0 # 4. 控制资源分配 # 禁止用户查看其他用户的进程增强隐私 kernel.yama.ptrace_scope 1使配置生效sudo sysctl -p。5.2 用户资源限制ulimit通过/etc/security/limits.conf文件可以限制用户或用户组打开的文件数、进程数等防止单个用户耗尽系统资源。示例配置# 格式domain type item value * soft nofile 65535 # 所有用户软限制最大打开文件数 * hard nofile 65535 # 所有用户硬限制 webusers soft nproc 200 # webusers组用户最大进程数软限制 webusers hard nproc 500 # 硬限制 root soft nproc unlimited # root用户不受限soft是警告限制hard是绝对上限。修改后需要重新登录用户会话才能生效。6. 日志审计与入侵检测留下证据主动发现“无日志无真相”。完善的日志能让你在发生安全事件后快速回溯、定位问题。6.1 配置集中化与完备的系统日志确保rsyslog或systemd-journald正常运行并配置关键日志的持久化存储。操作与原理对于rsyslog检查/etc/rsyslog.conf确保重要的facility如auth,authpriv,kern被记录到文件中。考虑将日志发送到远程的日志服务器如ELK Stack避免攻击者本地擦除日志。# 在 /etc/rsyslog.conf 中添加 *.* 192.168.1.100:514 # 将所有日志通过UDP发送到远程服务器192.168.1.100对于systemd系统使用journalctl查看日志并配置日志持久化默认某些发行版只保存在内存中sudo mkdir -p /var/log/journal sudo systemctl restart systemd-journald6.2 启用命令历史审计系统自带的history命令只记录在用户退出时才写入文件且容易被清空history -c。我们需要更强大的审计。操作与原理将以下脚本添加到/etc/profile或/etc/bashrc的末尾可以实现实时记录每个用户执行的每一条命令包含时间戳、来源IP等信息。# 记录所有用户的操作历史 export HISTTIMEFORMAT“%F %T “ # 为history命令加上时间戳 export PROMPT_COMMAND‘{ cmd$(history 1 | { read x y; echo $y; }); logger -p local1.notice -t bash -i “user$USER, cmd‘“$cmd”‘, pid$$, ppid$PPID, sid$BASHPID, tty$(tty), ruser$LOGNAME, host$(hostname -I)”; }‘这段复杂的命令会在每个命令执行后PROMPT_COMMAND通过logger工具将命令详情以notice级别发送给syslog的local1设施。然后在/etc/rsyslog.conf中配置local1.notice /var/log/command_audit.log这样所有用户的命令都会实时记录到/var/log/command_audit.log即使用户执行了history -c日志也已经写入文件。6.3 部署文件完整性校验与入侵检测系统IDS这是主动防御的一环。通过定期校验关键系统文件的哈希值来发现是否被篡改。简易实现生成基准快照在系统纯净刚安装并加固后时生成关键目录如/bin,/sbin,/usr/bin,/usr/sbin,/etc的文件哈希值清单。sudo find /etc -type f -exec sha256sum {} \; /root/etc_sha256sum_baseline.txt定期校验通过定时任务cron定期执行校验并与基准对比。# 脚本示例check_integrity.sh #!/bin/bash BASELINE“/root/etc_sha256sum_baseline.txt” CURRENT“/tmp/etc_sha256sum_current.txt” LOG“/var/log/integrity_check.log” find /etc -type f -exec sha256sum {} \; $CURRENT diff -u $BASELINE $CURRENT $LOG 21 if [ $? -ne 0 ]; then echo “[$(date)] WARNING: /etc directory integrity check failed!” | tee -a $LOG # 可以在这里添加邮件或钉钉告警 fi使用专业工具对于更全面的需求推荐使用开源的AIDE或商业版的Tripwire。它们功能更强大能记录文件权限、属性、inode等更多元数据的变化。高级方案入侵检测系统网络IDS如Suricata或Zeek部署在网络边界分析流量模式检测攻击行为。主机IDS如Wazuh或OSSEC它们集成了日志分析、文件完整性监控、rootkit检测、主动响应等多种功能是构建安全运维平台的有力工具。部署Wazuh Agent后可以将安全事件集中到Wazuh Manager进行管理和告警。7. 防火墙与访问控制构建网络边界即使系统内部固若金汤没有防火墙就像房子没有大门。7.1 配置系统防火墙以firewalld为例firewalld是CentOS/RHEL 7和Fedora的默认防火墙前端比原始的iptables更易管理。基础操作sudo systemctl start firewalld sudo systemctl enable firewalld sudo firewall-cmd --state # 查看状态策略配置默认策略应该是拒绝所有入站允许所有出站。# 设置默认区域为public默认已拒绝所有入站 sudo firewall-cmd --set-default-zonepublic # 放行必要的服务富规则更灵活 sudo firewall-cmd --permanent --add-servicessh # 放行SSH如果改了端口需用--add-port sudo firewall-cmd --permanent --add-servicehttp sudo firewall-cmd --permanent --add-servicehttps # 如果你改了SSH端口为2222 sudo firewall-cmd --permanent --add-port2222/tcp # 允许来自特定IP的访问例如管理IP sudo firewall-cmd --permanent --add-rich-rule‘rule family“ipv4” source address“192.168.1.100/32” port protocol“tcp” port“2222” accept’ # 重载配置使其生效 sudo firewall-cmd --reload # 查看当前生效的规则 sudo firewall-cmd --list-all7.2 使用TCP Wrappers作为额外控制层TCP Wrappers通过/etc/hosts.allow和/etc/hosts.deny文件可以对使用libwrap库的服务如sshd,vsftpd进行更细粒度的访问控制。它是防火墙的补充。配置示例首先在/etc/hosts.deny中拒绝所有ALL: ALL然后在/etc/hosts.allow中按需放行sshd: 192.168.1.0/24, 10.0.0.5 # 只允许指定网段和IP连接SSH vsftpd: LOCAL # 只允许本地网络连接FTP注意事项并非所有服务都支持TCP Wrappers。使用ldd /usr/sbin/sshd | grep libwrap可以检查sshd是否链接了libwrap库。这是一个轻量级的额外防线但不能替代防火墙。8. 定期维护与自动化检查安全加固不是一劳永逸的事情需要定期维护和检查。8.1 自动化安全扫描与合规检查可以使用自动化工具来检查系统的安全状态。Lynis一款开源的安全审计工具能对Linux系统进行全面的健康检查并给出详细的加固建议。git clone https://github.com/CISOfy/lynis cd lynis ./lynis audit systemOpenSCAP根据SCAP安全内容自动化协议标准进行检查特别适用于需要满足特定安全基线如CIS Benchmark的场景。8.2 建立补丁管理流程及时更新系统是修补已知漏洞最有效的方法。定期更新建立流程定期如每月在维护窗口内进行安全更新。对于RHEL/CentOS可以使用yum update --security。订阅安全通告关注发行版的安全邮件列表如security-announce或CVE数据库。谨慎对待内核更新内核更新可能需要重启务必做好业务影响评估和回滚计划。8.3 备份与恢复演练再坚固的堡垒也可能被攻破。完备的备份是最后的防线。备份策略至少包含系统配置文件/etc、应用程序数据、数据库和日志。采用全量增量的策略。异地备份备份数据必须存储在另一台物理隔离的服务器或对象存储中。定期恢复演练定期如每季度测试备份数据的可恢复性确保灾难发生时预案有效。安全是一个持续的过程而非一个静止的状态。这套加固方案覆盖了从外到内的多个层面你可以根据自己服务器的实际角色Web服务器、数据库服务器、跳板机等进行裁剪和深化。最重要的是将这些措施形成清单和自动化脚本并将其融入到服务器的生命周期管理中从镜像构建阶段就开始贯彻才能真正做到“安全左移”防患于未然。