拿到一台CentOS 7服务器第一件事不是急着装环境、怼业务而是先把系统里里外外收拾一遍。这不是洁癖是保命。我见过太多上来就跑业务的机器过两三个月被扫描器撞出弱口令数据库被拖走之后才想起来找安全基线。CentOS 7存量巨大很多老项目跑在上面已经很多年官方停止维护之后补丁和安全更新都得自己盯。做系统安全加固这件事不是等出事了再补救而是从装机那一刻起就搭好防护骨架。这篇文章是我在实际加固CentOS 7服务器过程中的完整总结从账号密码、SSH远程通道、防火墙和网络暴露面、文件权限与SELinux、审计日志到内核参数和补丁管理一项一项过一遍。适合运维工程师、自运维的开发者、以及刚接触服务器安全的同学当操作清单用。每个环节我都会把原理讲透给出可以直接复制的配置也把踩过的坑和排查思路一并写出来。1. 加固这件事先想清楚再动手1.1 CentOS 7明明老了为什么还要加固很多人的第一反应是CentOS 7生命周期都结束了还加什么固直接换系统不好吗。道理是这个道理但现实是大量业务系统还跑在CentOS 7上不是说换就能换的。数据库迁移、老版本运行时兼容、第三方闭源组件绑定的操作系统版本每一项都可能卡住升级计划。在业务真正迁走之前这台系统依然暴露在公网或者办公网里依然是攻击者眼里的目标。所以加固的意义就变成了在系统和业务既有约束条件下把能补的洞补上把能收的口子收窄。说得直白点就是让攻击者扫描你的机器时发现无从下手让弱口令、公开漏洞、裸奔端口这些低级问题不再出现。别小看“低级问题”现实里大量入侵事件根本不是多高深的手法就是撞库、爆破和已知漏洞利用。另外CentOS 7官方停更之后最麻烦的是安全补丁渠道断了。这意味着即便系统发现现有软件包的漏洞也没有常规渠道拿到修复版本。所以加固里面有一项很重要的动作——定期做安全更新检查和补丁评估同时通过系统审计、日志转发、文件监控等手段尽量在发生异常时第一时间发现而不是等业务挂掉才去排查。1.2 加固不是“改配置”而是建立一套基线我最早做加固的时候也是拿到一份网上下载的脚本对着执行一遍就以为完工了。后来被现实教育了几次才明白加固的核心是把系统拉到一个明确的、可验证的安全基线上而不是单纯执行几条命令。这个基线至少应该覆盖四个维度身份与认证包括账号密码策略、sudo授权、SSH登录方式和远程管理入口。网络暴露面包括防火墙策略、对外开放端口、不必要的网络服务。系统内核与文件包括SELinux状态、关键文件权限、内核网络参数。审计与日志包括系统审计规则、日志持久化、日志远程备份和异常行为追踪能力。每个维度都要有明确的“加固前”和“加固后”对照并且每一项做完都要能验证。比如ip端口关闭了没有用ss命令看一遍密码策略生效了没有用chage -l看一遍SELinux模式对不对用getenforce看一遍。验证做完才叫真正落地。1.3 动手之前必须先做三件事第一件事是备份。不需要说太多配置文件改错了、脚本写错了没有备份就只能靠记忆回滚这在生产环境上是最恐怖的事。至少把/etc目录打一个包放着比如tar czf /root/etc-backup-$(date %F).tar.gz /etc真出问题可以随时恢复。第二件事是记录当前状态。加固前先跑一遍信息收集命令把当前系统在跑的服务、开放的端口、已存在的用户、SELinux状态、防火墙默认策略都记下来。这既是加固前和加固后的对比基线也能防止你自己不小心关掉业务依赖的服务。第三件事是留好回滚通道。比如你在本机通过SSH改SSH配置那就要保证另一个终端里有一个已登录的会话没有断开或者云服务器开好VNC控制台或者机房里有KVM确保配置改坏之后还能进去救。我就干过改sshd_config然后语法检查漏了直接在远程把连接全部断掉的事最后只能靠控制台一点点救回来那滋味真不好受。2. 账号密码与登录认证先把入口管住2.1 密码策略和口令复杂度弱口令什么时候都不该有CentOS 7默认的密码策略整体偏宽松如果装机的时候没设置过系统里的口令策略可能还是默认值。账号安全的第一步就是把密码生命周期和复杂度卡死。修改/etc/login.defs重点看这几个参数参数建议值作用PASS_MAX_DAYS90密码最长期限90天强制换一次PASS_MIN_DAYS2两次修改密码最小间隔防止用户改完立刻改回原密码PASS_WARN_AGE14密码过期前14天开始告警PASS_MIN_LEN9最小密码长度配合pam_pwquality才能真正生效注意PASS_MIN_LEN在旧版本里只是给程序参考的真正起强制作用的是PAM模块。我一般会同时修改/etc/security/pwquality.conf打开密码复杂度检查minlen 9 dcredit -1 ucredit -1 lcredit -1 ocredit -1dcredit、ucredit、lcredit、ocredit分别代表数字、大写、小写和其他字符设置为负数表示这几种字符至少各出现一次。也就是说密码至少要9位且必须包含大写字母、小写字母、数字和特殊字符。这套规则配合起来基本能杜绝123456这类弱口令。除了策略文件还需要对已存在的用户做一次检查。重点看有没有用户是空密码有没有长期不用的僵尸账号有没有莫名其妙的UID为0的账号。检查命令awk -F: $2 /etc/shadow awk -F: $30 {print $1} /etc/passwd passwd -S 用户名对于不用的账户我一般直接用usermod -L锁定而不是删掉因为有些历史文件还要留着做审计追查。当然如果确认完全没用直接userdel -r也可以。2.2 登录失败锁定让爆破工具无从下手CentOS 7上做登录失败锁定我推荐用pam_faillock这也是当前PAM体系里的标准做法。之前很多人习惯用pam_tally2但维护状态不同两套混用还会出问题所以我统一用pam_faillock。在/etc/pam.d/system-auth和/etc/pam.d/password-auth两个文件里都加上同样的配置。需要注意放置位置一个放在认证开始的部分另一个放在authfail和authsucc之后两个部分必须都有否则锁定逻辑不生效。auth required pam_faillock.so preauth audit silent deny5 unlock_time300 auth [defaultdie] pam_faillock.so authfail audit deny5 unlock_time300 auth sufficient pam_faillock.so authsucc audit deny5 unlock_time300 auth required pam_unix.sodeny5表示失败5次后锁定unlock_time300表示锁定300秒也就是5分钟。第一次配的时候我漏了authsucc那段结果发现账户锁定了也没记录成功登录排查半天才发现是配置结构的问题。另外注意一点faillock锁的是用户名而不是IP同一个IP换不同用户名爆破每个账户都会被锁到5分钟这对自动化爆破已经能造成明显的阻碍。解锁可以用pam_faillock --user 用户名 --reset知道这招在误锁自己账号时很管用。2.3 sudo授权要收口别把root权限当福利发审计的时候我最怕看到两行东西一是root允许任何人su二是sudoers里一堆ALL(ALL) ALL。权限这个东西发出去容易收回来难所以从一开始就按最小化原则来。sudo授权文件放在/etc/sudoers.d/下面单独管理不要在/etc/sudoers主文件里加乱七八糟的规则。配置格式建议是opsuser ALL(ALL) /usr/bin/systemctl, /usr/bin/cp, /usr/bin/mv意思是给这个用户sudo权限但只允许执行systemctl、cp、mv这些命令不能执行任意命令。真要整包授权也尽量限制命令路径。很多攻击者拿到一个普通账号后第一件事就是看sudo -l能不能直接梭哈把sudo权限收窄这条路径就断了。每次改完sudo配置用visudo -c校验一下语法这个习惯非常重要。语法错误直接导致sudo无法使用严重的还会影响root切换。2.4 账号安全最容易忽视的细节账号这块我还有两个小提醒。第一改密码策略之前先确认系统里有没有对接了第三方认证的应用比如某些程序用LDAP或者自己的认证体系改了本地PAM策略可能会影响它们的登录。我遇到过改完PAM后某个老系统登录直接卡死的情况最后还是回滚策略才恢复。第二隐藏的SSH公钥账号要定期检查也就是.ssh/authorized_keys文件这事我会在下个部分详细讲。3. SSH服务加固远程通道的安全护栏3.1 sshd_config核心参数照着改就行SSH是Linux服务器最常用的远程管理通道也是最容易被爆破的攻击面。CentOS 7默认的sshd配置里root直接登录是允许的密码认证也默认开着这等于把大门敞开了一半。我这里给出一份可落地的安全配置清单修改文件/etc/ssh/sshd_config参数建议值说明PermitRootLoginno禁止root直接SSH登录需要root操作时先登录普通用户再su/sudoPasswordAuthenticationno关闭密码登录只允许密钥登录PubkeyAuthenticationyes开启公钥认证MaxAuthTries3单次连接最多尝试次数配合fail2ban效果更好ClientAliveInterval180客户端3分钟没响应就发心跳ClientAliveCountMax2心跳连续2次无响应则断开Protocol2只允许SSH v2协议X11Forwardingno关闭X11转发降低图形隧道风险Banner/etc/ssh/banner登录前显示告警横幅其中PermitRootLogin no和PasswordAuthentication no这两项是重点。企业环境里我强烈建议把这两条都关掉即使不考虑暴力破解也减少了账号密码泄露后被直接登root的风险。需要特别提醒PasswordAuthentication no必须在你确认密钥登录可用之后再做。我有一个习惯SSH配置修改后先开一个终端测试密钥登录能正常进去再关掉当前这个已经建立的会话最后才考虑禁用密码登录。顺序反了很可能把自己锁在外面。修改完配置文件第一动作是sshd -t检查语法然后systemctl reload sshd再开新窗口测试连接。reload不会断开已有连接这比restart要稳得多。3.2 密钥登录的正确打开方式密钥登录我建议直接用Ed25519算法比RSA短且更快安全性也足够。生成命令ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519 -N 生成之后把公钥拷到目标机器上一种方式是ssh-copy-id另一种是手动把公钥写入目标机器用户的~/.ssh/authorized_keys。手动写的话权限必须严格设置这是新手最容易犯的错mkdir -p ~/.ssh touch ~/.ssh/authorized_keys chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys如果authorized_keys权限是644很多平均值配置都会拒绝使用这个公钥文件然后你就看到Permission denied (publickey)报错还以为密钥有问题其实是权限问题。这个坑我踩过好几回写出来提醒一下。另外建议把SSH监听端口从22改成高位端口比如22022。注意改端口不是靠“隐蔽”保安全但能明显减少扫描器对默认端口的日常试探流量降低日志噪声。改完端口SELinux还需要同步放行这个在SELinux章节详细说。3.3 SSH加固后常见问题速查我把SSH加固后最容易翻车的场景整理成一个表照着排查能省很多时间现象可能原因修复思路Permission denied (publickey)authorized_keys权限过大或公钥内容错误检查.ssh和authorized_keys权限重新核对公钥字符修改端口后连接超时firewalld或安全组未放行新端口检查firewall-cmd放行新端口检查上层安全组规则连接被拒绝sshd没起来或配置错误sshd -t检查语法看/var/log/secure日志密码登录被拒绝PasswordAuthentication no生效了但密钥还没配好用控制台登录临时改回yes或恢复备份配置文件普通用户SSH登录后sudo提示错误sudoers语法错误用root登录visudo修复或恢复/etc/sudoers我最想强调的还是那句无论怎么改SSH始终给自己留一个控制台入口。云服务器就提前开好VNC物理机就确认能进单用户模式。这一条在运维生涯里救过我太多次。4. 防火墙与网络暴露面端口不是越多越好4.1 firewalld默认分区和端口策略CentOS 7自带的防火墙是firewalld很多人习惯把它停了然后装iptables这是没必要的firewalld底层还是iptables/nftables只是管理方式更现代化。我建议保留firewalld因为它按区域管理策略在服务器场景下更直观。服务器上一般只需要一个zone就是public。配置思路是默认拒绝一切外部访问只放行业务必须的端口。先看当前状态systemctl status firewalld firewall-cmd --get-default-zone firewall-cmd --list-all放行端口命令如下以SSH、HTTP、HTTPS为例firewall-cmd --permanent --add-port22022/tcp firewall-cmd --permanent --add-servicehttp firewall-cmd --permanent --add-servicehttps firewall-cmd --reload这里有个细节--permanent参数是把规则写入配置文件配合--reload才会生效。如果不加--permanent规则只对当前运行生效重启就没了。我见过有同事把规则加到临时区里服务器重启后服务全部连不上排错排了半天。另外生产环境的防火墙规则不是一次性配完就完事。每次发布新服务、开新端口都要同步更新防火墙策略并顺手跑一遍端口扫描确认只开放了该开放的端口。扫描工具用nmap就行从外部扫一遍nmap -sT -Pn 服务器地址看到扫描结果和预期一致才算验收通过。4.2 关闭不必要的系统服务多一个进程多一分风险网络上暴露的端口很多是由系统里跑着的服务带来的。CentOS 7最小化安装也不代表所有服务都是必要的可能有postfix邮件服务、avahi网络发现服务、abrtd崩溃报告服务等在后台跑着。这些并不是业务需要却占着端口有时还会引入组件漏洞。先看看当前有哪些服务在跑systemctl list-units --typeservice --staterunning再逐一确认哪些是业务依赖的哪些可以停。一般我会将下面这些服务停掉并禁止开机自启systemctl stop postfix systemctl disable postfix systemctl stop avahi-daemon systemctl disable avahi-daemon systemctl stop abrtd systemctl disable abrtd关闭前务必确认业务不依赖它。比如有些旧应用本地依赖postfix发通知邮件这种就不能一刀切得先看业务再决定停不停。打完“关闭”命令后再跑一遍systemctl list-units --typeservice --staterunning确认留下的服务列表干净了。4.3 防爆破思路fail2ban是SSH在互联网上的保命符即使关了密码登录、限制了root登录SSH密钥登录还有可能被扫描尝试。在公网环境下我给SSH端口挂一个fail2ban它会在日志里检测连续失败尝试并自动封禁来源IP。安装和基本配置yum install -y epel-release fail2ban cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local修改/etc/fail2ban/jail.local针对SSH设置[sshd] enabled true port 22022 filter sshd logpath /var/log/secure maxretry 3 bantime 3600maxretry表示3次失败就封禁bantime是封禁3600秒。这个配置放上去后爆破者再撞密码三次失败就会引出防火墙DROP规则。需要注意的是fail2ban是拿系统日志做判断的日志文件路径和filter配置必须对应改过SSH日志路径或日志级别的话要同步调整。fail2ban的封禁是实打实加到防火墙规则里的所以排查问题时如果发现某台机器连不上先看fail2ban-client status sshd确认是不是被它封了。这个是运维排查网络的常见“盲区”之一。5. 文件权限与SELinux最后一公里同样重要5.1 关键文件权限基线与不可变属性系统里有一些文件权限如果被放大等于给本地提权留了后门。最常见的例子是/etc/passwd、/etc/shadow、/etc/sudoers、/etc/ssh/ssh_host_*还有各用户的authorized_keys。我梳理了一套权限基线直接对应检查文件/目录标准权限说明/etc/passwd644所有用户可读但只有root可写/etc/shadow000或600密码哈希文件普通用户不应可读/etc/sudoers440root和wheel组可读不能随便写/etc/ssh/ssh_host_rsa_key600主机私钥/etc/ssh/ssh_host_ed25519_key600主机私钥~/.ssh 目录700用户SSH目录~/.ssh/authorized_keys600用户公钥授权文件/tmp1777带粘滞位用户只能删自己的文件检查完权限还可以考虑给关键文件加上不可变属性防止被篡改chattr i /etc/passwd chattr i /etc/shadow chattr i /etc/sudoerschattr i之后文件连root都不能改这是一个很强的保护但副作用也明显。再要添加用户或者改密码你得先chattr -i解除不可变属性否则会报错。所以我建议只在业务稳定的机器上用这招平时用户变更频繁的服务器别急着加免得自己给自己找麻烦。5.2 SELinux不是摆设先了解再决定要不要用很多人上服务器第一件事就是setenforce 0我建议你三思。SELinux是强制访问控制机制它能在进程层面限制程序行为即使程序被攻破它也逃不出预设的安全上下文。CentOS 7默认装在Linux系统里的SELinux大部分时候只需要保证它是Enforcing状态就够了真正需要配置的是一些业务相关的布尔值。先看当前状态getenforce如果返回Disabled那是真的没启用需要在/etc/selinux/config里改成SELINUXenforcing然后重启。如果返回Permissive说明是放行模式只记录不拦截可以通过setenforce 1临时切到强制模式验证正式生效还是改配置文件。业务部署中比如Nginx要往后端MySQL连网络SELinux默认会拦。这时候不是把SELinux整个关掉而是开放对应布尔值setsebool -P httpd_can_network_connect 1-P参数表示持久化重启后依然生效。用的时候可以先用getsebool -a查看当前布尔值列表再决定开哪个尽量不要一次性全放开。5.3 SELinux和自定义SSH端口的配合上一节提到SSH改端口后SELinux会拦截具体表现是连接直接被拒绝但防火墙端口明明放行了。SELinux默认只允许SSH在22端口监听自定义端口需要单独授权yum install -y policycoreutils-python semanage port -a -t ssh_port_t -p tcp 22022这条命令把22022端口添加到SELinux的ssh_port_t类型里SSHD才能正常监听。如果没有这一条你改了端口、放行了防火墙还是会发现连不上。如果遇到SELinux拦截的诡异现象查AVC日志是最直接的ausearch -m AVC -ts recent日志里能看到具体是哪个进程、哪个标签被拒绝了按提示restorecon -Rv修正文件上下文或者用semanage调整布尔值/端口问题基本都能定位。实在拿不准先用setenforce 0临时放行验证是不是SELinux导致确认后再精准修复然后立刻恢复Enforcing别一直停在关闭状态。6. 审计、日志与内核参数看不见的部分决定安全下限6.1 auditd审计规则让可疑行为无处遁形系统加固不能只做“防”还要做“发现”。auditd是Linux内核级的审计框架比应用日志更底层可以记录谁访问了关键文件、谁执行了命令、谁改了权限。CentOS 7默认装了auditd先确认它在跑systemctl status auditd yum install -y audit对关键文件加审计规则写入/etc/audit/rules.d/security.rules-w /etc/passwd -p wa -k identity -w /etc/shadow -p wa -k identity -w /etc/sudoers -p wa -k identity -w /etc/ssh/sshd_config -p wa -k sshd_config -a always,exit -F archb64 -S execve -k process_execute第一组-w规则表示对文件发生的写(w)和属性变化(a)动作进行审计-k是给规则打个标签方便后续检索。第二组-a规则是所有64位程序的执行都会记录syscall事件。打完规则后用auditctl -D清空旧的再restart auditd或者直接auditctl -R /etc/audit/rules.d/security.rules加载。查询审计记录用ausearchausearch -k identity -ts recent ausearch -k process_execute -ts today | head -50我一般会在告警事件里重点看两个方向一是/etc/passwd、/etc/shadow这些文件在非业务维护时段被写二是普通用户频繁执行可疑命令。有了审计规则即使攻击者渗透进来系统也能留下完整的行为痕迹。6.2 日志持久化与远程备份防止“销毁证据”日志是排查问题最重要的依据但CentOS 7默认使用rsyslog搭配journald默认情况下journald的日志不会持久化重启后就没了。先改journald配置编辑/etc/systemd/journald.confStoragepersistent然后重启服务systemctl restart systemd-journald更进一步的方案是把日志实时转发到远程日志服务器这样即使本机被清空日志远程也有副本。在/etc/rsyslog.d/remote.conf里加一行*.* 日志服务器内网地址:514代表TCP传输单独是UDP。TCP更可靠但会占用连接量大的时候要注意日志服务器的接收能力。配上之后记得systemctl restart rsyslog然后用logger test log发一条测试消息到日志服务器上看能不能收到。另外日志文件自身的轮转和空间管理也要管否则日志写满磁盘会导致业务卡死。系统默认的logrotate配置覆盖了/var/log下大部分文件但如果业务有自定义日志记得在/etc/logrotate.d/下单独写一个轮转配置比如按天轮转、保留7天、压缩旧日志。6.3 sysctl内核参数加固把网络层和内核层的漏洞堵上内核参数这块很多人忽略了其实不少网络攻击和内核漏洞缓解就是靠sysctl配置实现的。把下面的配置写入/etc/sysctl.confnet.ipv4.ip_forward 0 net.ipv4.conf.all.accept_redirects 0 net.ipv4.conf.all.send_redirects 0 net.ipv4.conf.all.rp_filter 1 net.ipv4.conf.default.rp_filter 1 net.ipv4.tcp_syncookies 1 net.ipv4.conf.all.accept_source_route 0 net.ipv4.conf.all.log_martians 1 kernel.randomize_va_space 2 kernel.sysrq 0 kernel.dmesg_restrict 1每个参数说下作用参数作用net.ipv4.ip_forward0关闭IP转发防止服务器被当跳板转发流量accept_redirects0禁止接受ICMP重定向消息防止路由劫持send_redirects0禁止发送重定向消息rp_filter1开启反向路径过滤防止源地址伪装tcp_syncookies1开启SYN Cookie缓解SYN洪水攻击accept_source_route0禁止接受带源路由的IP包log_martians1记录因反向路径过滤丢弃的包kernel.randomize_va_space2开启ASLR提高漏洞利用难度kernel.sysrq0关闭SysRq组合键防止物理接触者滥用kernel.dmesg_restrict1限制非root用户读取内核日志改完执行sysctl -p让配置生效。这里还是要老生常谈一句内核参数影响范围大改完一定要在业务低峰期观察几天确认无异常再长期保留。rp_filter在部分多网卡、多路由场景下可能会造成正常流量被丢弃如果发现网络异常先检查这一项。7. 补丁更新与自动化加固安全不是一锤子买卖7.1 官方源里的安全更新怎么筛出来CentOS 7官方停止维护之后开源社区和第三方镜像仓还会提供相当长时间的安全包更新尤其是针对内核和openssl这类底层组件。我的建议是系统源能更新的就定期更新更新范围要分清“全量更新”和“安全更新”。手工检查安全更新yum check-update --security注意yum子命令--security是依赖yum-security插件的没有的话先装yum-plugin-security。安装成功后列出来的是当前系统有安全更新影响的包。生产环境建议先小范围更新比如yum update -y openssl nss ca-certificates把最常用的底裤升级好然后挑一个维护窗口做全量yum update -y。全量更新有风险新内核开启后有兼容性隐患所以更新完最好重启验证一遍业务或者至少确认内核模块和依赖库没出问题。自动更新这一块我推荐用yum-cron并限制为“只更新安全补丁”。配置/etc/yum/yum-cron.confupdate_cmd security apply_updates yes然后启用服务systemctl enable yum-cron systemctl start yum-cron这样系统会定期检查安全更新并自动安装。但自动更新是把双刃剑存在某个包更新后起不来服务的可能所以至少要把日志和邮件通知配好让维护者第一时间知道更新了什么。更新前备份一遍rpm包清单很重要rpm -qa /root/rpm-list-$(date %F).txt万一更新后某个业务包兼容性崩了你能快速定位到具体包版本的回滚路径。7.2 一份可复制的半自动化加固脚本每次手动敲命令容易漏项我把核心加固动作整理成一个模块化脚本线上跑之前建议逐行评审一遍按自己业务环境删减。这里给出核心片段完整版本可以按这个思路扩展#!/bin/bash # CentOS 7 安全加固脚本 - 模块化执行使用前务必评审脚本 # 模块1: 关闭无用服务 systemctl disable postfix avahi-daemon abrtd 2/dev/null systemctl stop postfix avahi-daemon abrtd 2/dev/null # 模块2: 密码策略 sed -i s/^PASS_MAX_DAYS.*/PASS_MAX_DAYS 90/ /etc/login.defs sed -i s/^PASS_MIN_DAYS.*/PASS_MIN_DAYS 2/ /etc/login.defs sed -i s/^PASS_WARN_AGE.*/PASS_WARN_AGE 14/ /etc/login.defs echo minlen 9 /etc/security/pwquality.conf # 模块3: SSH加固 sed -i s/^#\?PermitRootLogin.*/PermitRootLogin no/ /etc/ssh/sshd_config sed -i s/^#\?PasswordAuthentication.*/PasswordAuthentication no/ /etc/ssh/sshd_config sed -i s/^#\?MaxAuthTries.*/MaxAuthTries 3/ /etc/ssh/sshd_config sshd -t systemctl reload sshd # 模块4: sysctl加固 cat /etc/sysctl.conf EOF net.ipv4.ip_forward 0 net.ipv4.conf.all.accept_redirects 0 net.ipv4.conf.all.send_redirects 0 net.ipv4.conf.all.rp_filter 1 net.ipv4.tcp_syncookies 1 kernel.randomize_va_space 2 EOF sysctl -p脚本里最有风险的就是SSH部分如果公钥没配好就把PasswordAuthentication置为no直接挂。所以我的建议是脚本分模块跑跑完一个模块先验证再跑下一个模块千万别图省事一口气全执行。7.3 加固完成后的验收动作加固不是命令执行完就结束的要做一轮完整验收确认每项都生效了。我整理了一个验收清单检查项命令或方法期望结果SELinux状态getenforceEnforcing防火墙运行状态systemctl status firewalldactive对外开放端口firewall-cmd --list-all仅业务端口及管理端口无用服务systemctl list-units --typeservice --staterunning无异常多余服务root远程登录grep PermitRootLogin /etc/ssh/sshd_configno密码认证方式grep PasswordAuthentication /etc/ssh/sshd_configno启用了密钥登录密码策略chage -l 普通用户生命周期不超过90天sudo配置visudo -cparsed OK审计规则auditctl -l关键文件规则存在内核参数sysctl net.ipv4.tcp_syncookies1备份文件ls /root/etc-backup-*.tar.gz备份存在验收过程中发现哪一项没生效就回到对应章节排查。加固这件事我个人的习惯是每季度复查一次尤其检查有没有新开的端口、新增加的生产用户、以及SSH配置是否被人动过。毕竟服务器是活的不是一次配好就一劳永逸。我在实际操盘过程中最大的感受是加固策略宁可少而精不要多而乱。与其堆一堆花哨配置制造管理负担不如把账号、SSH、防火墙、审计日志和补丁更新这五件事真正做扎实。这个思路在CentOS 7上适用在其它Linux服务器上其实也大差不差换汤不换药。把基础打牢再遇到新的漏洞公告或者新的安全威胁你至少知道自己站在一个相对稳固的底子上不用半夜爬起来紧急救火。