
简介面向运维人员与系统管理员的安全加固参考手册从安装阶段的关键安全设置入手系统梳理密码安全策略、用户帐号安全、网络服务安全等必备知识点。内容具体涵盖密码影子文件、密码强度检查与密码管理以及服务过滤、inetd配置、远程登录服务、TCP访问控制、hosts等效文件等网络服务加固细节同时延伸到NFS、Sendmail、finger等常见服务的风险收敛能帮助读者建立从账号密码到网络服务的完整加固思路。手册采用章节化结构每部分均给出针对性检查项和操作要点适合需要提升服务器基线安全水平的中级运维人员也可作为企业安全自查与配置整改的速查文档。资源包为单个PDF文档共一个文件大小约40KB便于下载后快速查阅已有1332人学习内容精炼无冗余实用性强。1. 先隔离再卸载装系统阶段就要做对的两件事LINUX 安全加固这件事大多数人开始的时机就错了系统已经连上公网、业务正在跑然后才想起来补洞。这份《LINUX 安全加固手册》开篇第一页就点名了正确顺序——先在隔离网络里完成安装把没必要的软件卸载干净再考虑接外网。手册把加固拆成用户账号、网络服务、系统设置、文件系统四个面一共 16 页每一面都给了可以直接抄的命令行。适合刚接手一台 Linux 服务器、准备做等保整改、或者面试前想把安全基线完整过一遍的人。读它不需要多深的基础但最好手边有一台能随便折腾的测试机因为里面有十几个命令执行完的后果是立竿见影的比如锁定 /etc/passwd 之后你连加个用户都会报错。2. 用户帐号安全密码、su 权限和文件锁的四道关2.1 先弄明白密文存哪/etc/shadow 的结构和密码基线早期 Linux 的密码哈希直接放在 /etc/passwd 第二字段这个文件所有用户都能读等于把密文公开给暴力破解工具。现在默认用 shadow 机制真正的哈希挪到 /etc/shadow只有 root 能读这就是手册里说的 Password Shadowing。我们做加固前先要清楚 shadow 每一列在说什么。/etc/shadow 一行有九个冒号分隔的字段常见顺序是用户名、加密口令、最近更改密码日期、最短使用天数、最长使用天数、提前警告天数、宽限天数、失效日期、保留位。实战中关键就看第二字段如果以$6$开头是 SHA-512 哈希$1$是 MD5!或*表示锁定或未设置密码第二字段为空则意味着这个账号根本没有密码保护是最危险的漏洞。密码基线上手册建议口令至少 6 位且包含特殊字符这个标准放到现在偏低等保和大多数企业基线已经要求 8 位以上、大小写字母加数字加特殊字符至少三类我一般直接把 PASS_MIN_LEN 提到 12下属服务器一律按新基线走。2.2 自查弱口令john、crack 和一条 awk 命令手册给了两条自查路径用 john、crack 这类离线暴力破解工具跑 shadow 文件或者用 Emailcrk、流光这类在线穷举工具。实际项目里我很少直接跑完整字典成本高、还容易被安全设备告警更常见的是先扫描空密码和弱密码账号再做人工抽查。awk -F: length($2)0 {print $1} /etc/shadow这条命令的要点是-F:把冒号当分隔符$2取第二列也就是密码哈希字段length($2)0判断该字段长度为 0命中的用户名直接打印出来。在旧的 NIS、NIS 环境或者迁移过的系统上空密码账号经常是历史残留这条命令一次扫完比翻遍 passwd 文件快得多。扫出来之后立刻passwd 用户名补上密码并短信或邮件通知使用者。2.3 密码有效期与 su 限制login.defs 和 pam_wheel光有复杂度不够密码还得有生命周期。编辑 /etc/login.defs重点调几个参数PASS_MAX_DAYS 控制最长使用天数建议 90PASS_MIN_DAYS 是最短修改间隔建议 5 到 7防止用户刚改完又改回弱密码PASS_WARN_AGE 是到期前提醒天数建议 7。注意一点login.defs 里的 PASS_MIN_LEN 在现代系统上经常不生效因为密码复杂度已经被 PAM 的 pam_pwquality 模块接管了这个坑后面排查章还会展开。再限制 su 的使用范围让只有 wheel 组的用户能切到 root。编辑 /etc/pam.d/su把这两行注释放开auth sufficient /lib/security/pam_rootok.so debug auth required /lib/security/pam_wheel.so groupwheel第一行的 pam_rootok.so 允许 root 自己免密通过所以 root 切 root 不受影响第二行是真正卡人的地方要求认证用户必须在 wheel 组里不在的直接拒绝。然后把运维账号加进组usermod -G10 admin注意这里-G是大写表示附加组-g小写是主组写错了会把用户从原来的主组里挪走。加完组之后用普通用户执行su -验证一次能不能切、提示什么都在这一步确认完再部署到生产。2.4 清理账户和锁文件userdel 与 chattr 的执行顺序系统装完默认带了一堆用不上的账户手册建议逐个删掉adm、lp、sync、shutdown、halt、news、uucp、operator、games、gopher、ftp。我的习惯是分两步走先确认服务没在用再删。games 在不用 X Window 的机器上删ftp 在不开 FTP 服务的机器上删剩下那些系统内部账户先ps -ef | grep 用户名看一眼有没有相关进程别拿着 userdel 一通乱删删完发现某个服务起不来就尴尬了。userdel adm userdel lp userdel sync userdel shutdown userdel halt userdel news userdel uucp userdel operator userdel games userdel gopher userdel ftp删账户本身不复杂真正让新手翻车的是后面这一步把关键文件锁死。手册建议用 chattr 给 passwd、shadow、group、gshadow 加上不可改变位chattr i /etc/passwd chattr i /etc/shadow chattr i /etc/group chattr i /etc/gshadowi的作用是文件变为 immutable连 root 都改不了、删不掉、不能创建硬链接。这是双刃剑锁上之后系统安全了一个量级但后续 useradd、passwd、给用户改组成员全部会报错。所以这个操作一定要放在所有账号调整的最后一步做做之前把该建的账号建完、该改的权限改完做完之后立刻测试一条useradd testuser确认会报错再删掉测试用户。要改动时先chattr -i解锁改完再加回这个习惯我从第一次锁死 passwd 之后就再也没丢过。3. 网络服务安全先关 19 个危险端口再给剩余服务上 tcp_wrapper3.1 服务过滤清单哪些端口不该对外开放手册反复强调两个原则只对外开放需要的服务把不同服务分散到不同主机。后者很多人不重视觉得多台机器麻烦但一台机器上跑着 Web、数据库、FTP、邮件任何一个服务被打穿其他服务的数据都在同一台机器上等着被翻物理隔离是最朴素也最有效的防线。服务过滤的清单我按手册整理了一张常用表服务端口协议加固建议echo7TCP/UDP默认关闭可被用于反射放大攻击systat11TCP泄露系统信息关闭netstat15TCP泄露网络信息关闭tftp69UDP无认证手册要求任何情况都不启动sunrpc111TCP/UDP配合 NFS 使用外部一律过滤snmp161UDP默认口令风险极高关闭或改 communityexec512TCPR 服务关闭login513TCPR 服务关闭shell514TCPR 服务关闭printer515TCP网络打印机多数场景用不到x116000TCPX Window 转发风险大外部过滤这里要特别提一句 UDP 服务手册明确点出 rpc.ypupdated、rpc.statd、rpc.ttdbserver、sadmind 这一类既能被用来做 DoS 放大、又存在远程溢出的老漏洞比 TCP 服务更容易被忽略。配置完之后用 nmap 从外部扫一遍nmap -sT -sU 目标IP把 TCP 和 UDP 都扫扫出来的开放端口和你的服务清单逐行比对多一个就查一个。3.2 /etc/inetd.conf 与 xinetd600 权限和注释的艺术老版本的 Linux 把一堆小服务挂在 inetd 超级守护进程下面手册里的操作思路今天依然适用只是配置文件的位置变了。先做权限和属主检查chmod 600 /etc/inetd.conf chown root:root /etc/inetd.conf600 权限意味着只有 root 能读写防止普通用户篡改服务配置。接着把不需要的服务在 inetd.conf 里逐行注释注释完重启 inetd 让配置生效再用 netstat 验证/etc/rc.d/init.d/inetd restart netstat -an | grep LISTENnetstat 输出里 LISTEN 状态的行就是当前对外监听的服务对照服务清单看有没有多出来的。红帽系的 CentOS 7 之后已经换成了 xinetd配置在 /etc/xinetd.d/ 目录下每个服务一个文件想停掉某个服务就把文件里的disable no改成disable yes。网上很多教程还在教老路径照着执行会发现根本没有这个文件先ls /etc/xinetd.d/确定自己系统属于哪一类再动手。3.3 tcp_wrapperhosts.deny 全拒hosts.allow 精准放行tcp_wrapper 的原理是让 tcpd 程序顶替真实服务程序先截获客户端请求记录来源 IP 和时间按访问控制规则检查符合规则才把连接转交给真正的服务程序。它相当于在服务前面加了一道门卫适合对 telnet、ftp、rsh 这类老协议做来源限制。配置分两个文件先写 /etc/hosts.deny默认拒绝一切ALL: ALLALL, PARANOIDALLALL 表示所有来源的所有服务PARANOID 是个特殊匹配项专门拦截主机名和 IP 地址无法对应的连接防止源地址伪造。然后写 /etc/hosts.allow精确放行需要访问的机器sshd: 208.164.186.1 gate.openarch.com这行的意思是允许 IP 为 208.164.186.1、主机名为 gate.openarch.com 的客户端访问 sshd。生产环境我习惯写成网段形式比如sshd: 192.168.1.放行整个内网段比逐个 IP 好维护。配置完用 tcpdchk 检查tcpdchktcpdchk 会遍历 inetd/xinetd 配置检查每个服务有没有正确使用 tcpd以及访问规则语法是否正确。这里有个容易忽略的细节使用 tcp_wrapper 时inetd.conf 里对应服务行要带 nowait 选项否则连接处理会被阻塞。另外要记住 tcp_wrapper 的匹配顺序是 hosts.allow 优先于 hosts.deny先匹配到谁就按谁执行白名单没写对就开始写黑名单很容易把管理员自己也关在门外这个翻车案例放到第 5 章详细讲。3.4 NFS 与 sendmail两个最容易留后门的服务NFS 的问题在于它依赖 sunrpc 和 mountd 这类动态端口服务防火墙规则很难收口。手册给的做法是在外部路由上直接过滤 111 和 2049 端口然后在 /etc/exports 里严格控制导出权限并用 exportfs 命令动态调整exportfs -o accessengineering,rodancer /usr exportfs -u /usr第一条命令把 /usr 目录导出accessengineering限定只有 engineering 组可以访问rodancer表示对 dancer 主机只读第二条-u是取消导出。每次改完 exports 文件用showmount -e 本机IP看看实际导出了什么和预期对比。我见过不止一次 exports 里写了 rw 全局共享一台测试机把整个 /home 挂成可写几天后数据被清空才被发现。另外 exports 文件权限建议 644、属主 root别让其他用户有机会改。sendmail 是另一个重灾区它的默认配置里有几个特性会让服务器变成开放转发中继。手册里列了六个特性我整理成一张决策表特性作用建议promiscuous_relay打开任意转发功能关闭否则变成垃圾邮件中继accept_unqualified_senders接受不含合法主机名的发件地址关闭loose_relay_check放宽源路由邮件的转发检查关闭accept_unresolvable_domains接受无法解析域名的主机发信按需开启防火墙后场景blacklist_recipients打开接收黑名单功能开启可用于拦截特定收件人relay_entire_domain为本地域所有主机提供转发关闭只信任 access db 里的 RELAY 主机配置方式是把特性写进 .mc 文件用 m4 宏工具生成 sendmail.cf。不过在 2024 年的环境里我建议新部署的邮件服务直接考虑 postfix 或 qmail配置思路更清晰、攻击面更小没必要在 sendmail 上死磕除非是既有系统迁移成本太高。3.5 FTP 与 finger能不开就不开FTP 服务手册里给了三条硬约束第一用最新版本wu-ftpd 2.6.1、proftp、ncftp 任选老版本漏洞多到数不清第二设置 /etc/ftpusers 文件把 root、bin、daemon 这些系统账户全部写进去禁止登录第三务必用 chroot 把 FTP 用户限制在自己的目录里否则登录用户能直接翻到 /etc/passwd。配置文件方面/etc/ftpaccess 设置最大连接数、禁止泄露系统信息/etc/ftphosts 按主机限制访问日志 /var/log/xferlog 权限改成 600、属主 root日志记录谁在什么时候传了什么文件出事是取证的第一手材料。finger 服务就一句话不该启动。它会把用户名、登录时间、终端信息全部暴露给任意远程访问者是信息收集阶段最好的帮手。生产环境有任何一个 finger 端口开着安全扫描第一时间就会标记出来。4. 系统设置与内核参数关 ping、锁控制台、堵住三个内核入口4.1 限制控制台console.apps 与 pam_console物理接触服务器的攻击者拥有最高权限所以控制台的访问控制不能省。手册的做法是删除 /etc/security/console.apps 里用不到的服务入口让普通用户无法通过控制台执行关机、重启、启动 X Server 这类操作rm -f /etc/security/console.apps/halt rm -f /etc/security/console.apps/poweroff rm -f /etc/security/console.apps/reboot rm -f /etc/security/console.apps/shutdown rm -f /etc/security/console.apps/xserver删掉这些文件之后普通用户在控制台上敲 reboot 或 shutdown 会直接提示没有权限只有 root 能操作。xserver 那一条影响比较大删掉之后普通用户无法从控制台启动图形界面如果你这台机器上有开发人员依赖图形登录删之前先沟通好。顺手把 /etc/pam.d/ 里所有包含 pam_console.so 的行注释掉控制台的本地授权就彻底收回了。4.2 内核三个开关icmp、源路由、rp_filter手册提到的关闭 ping本质是改内核参数 icmp_echo_ignore_all让它对 ICMP 回显请求不做任何响应。和它配套的还有两个同样重要的开关一起贴出来echo 1 /proc/sys/net/ipv4/icmp_echo_ignore_all echo 0 /proc/sys/net/ipv4/conf/all/accept_source_route echo 1 /proc/sys/net/ipv4/conf/all/rp_filter第一行设成 1 之后这台机器不再响应 ping扫描器少一个探测入口第二行把 IP 源路径路由关掉防止攻击者通过伪造路由路径绕过访问控制第三行的 rp_filter 是反向路径过滤检查进入的数据包源地址是否可从对应网卡返回设成 1 能挡住一部分 IP 欺骗。这三个参数直接写到 /proc 下只对当前运行生效重启就没了必须落进 /etc/sysctl.conf 才能持久化echo net.ipv4.icmp_echo_ignore_all1 /etc/sysctl.conf echo net.ipv4.conf.all.accept_source_route0 /etc/sysctl.conf echo net.ipv4.conf.all.rp_filter1 /etc/sysctl.conf sysctl -p最后一个sysctl -p重载配置让写入的值立即生效这是无数人重启服务器后发现 ping 又通了的原因只改了 /proc没写配置文件。4.3 /etc/securetty 与 /etc/host.conf登录终端和 DNS 顺序/etc/securetty 文件控制 root 能从哪些终端登录文件里的每一行是一个终端设备名。默认情况下包括 console、tty1 到 tty11把用不到的终端注释掉可以缩小 root 的物理登录入口。这里有个关键细节如果文件不存在系统会认为 root 可以在任何终端登录所以做加固时千万不要直接删掉这个文件注释行比删文件安全得多。改完文件之后最好开两个终端测试一个留着救急另一个测试配置是否生效防止改完 securetty 把 root 本地登录也禁了自己把自己锁在机器外面。/etc/host.conf 是名字解析顺序的配置文件手册给的思路是order hosts,bind nospoof on第一行规定先查 /etc/hosts 再查 DNS内网机器能少依赖 DNS 就少依赖第二行的 nospoof on 开启反欺骗检查防止 DNS 返回的 IP 地址和反向解析不一致时被利用。文件里注意不要出现!和#这类符号host.conf 里它们不表示注释写错了会影响解析行为。4.4 资源限制与启动引导把进程框进范围资源限制的配置在 /etc/security/limits.conf控制单个用户可以占用的资源总量防止一个被入侵的账号把整台机器拖垮。常用的几行配置* hard core 0 * hard nproc 100 admin soft nofile 65535第一行禁止所有用户产生 core dump 文件防止核心转储泄露内存数据第二行限制进程数上限为 100第三行给 admin 组放开文件描述符限制到 65535适合跑高并发服务的账号。注意 hard 和 soft 的区别soft 是警告阈值用户自己可以提高hard 是硬顶超过就拒绝加固场景用 hard 更有效。系统引导这一块老一代机器用 LILO/etc/lilo.conf 里可以加password...和restricted选项这样进入单用户模式需要密码防止有人通过改启动参数拿 root。现在主流是 GRUB做法换成给 GRUB 菜单设置密码思路是一样的没有密码的人连内核启动参数都不能改。另外手册提到注释 /etc/inittab 里的 Control-Alt-Delete 关机行对应现代 systemd 系统就是systemctl mask ctrl-alt-del.target防止误按组合键把生产服务器直接重启。4.5 日志与 init 脚本权限出事之后的取证基础日志是安全事件发生后唯一的现场。手册这一节的核心是把日志变成可靠的记录源而不是被攻击者顺手清掉的东西。先确认 syslog 在正常收集检查 /var/log/messages、/var/log/secure 是不是在持续写入再看 logrotate 有没有按期切割日志日志文件权限建议 600防止普通用户读到敏感信息。有条件的企业我建议把日志实时转发到独立的日志服务器本地日志被删了还有远程副本。然后是 /etc/rc.d/init.d 目录下启动脚本的权限chmod 600 /etc/rc.d/init.d/*启动脚本被普通用户改掉等于给了对方开机自动执行恶意代码的通道。但这里要谨慎个别第三方软件安装后会在 init.d 下放脚本脚本里如果有非 root 用户的执行需求600 权限可能导致服务无法启动。执行完这步之后把机器上所有服务 restart 一遍做回归比改完就收工稳妥得多。5. 文件系统加固与常见排查权限、挂载、备份里的四个翻车点5.1 文件权限600、644、755 分别该给谁文件权限是 linux 系统加固里成本最低、收益最稳定的动作。按这份手册和我的工程习惯核心配置文件优先收紧/etc/inetd.conf、/etc/services、/etc/hosts.equiv 给 600 属主 root/etc/exports 给 644 属主 root/etc/aliases 给 755 属主 rootFTP 日志 /var/log/xferlog 给 600。权限过宽的典型特征是出现全局可写用一条命令扫出来find / -perm -2 -type f 2/dev/null-perm -2表示查找包含其他用户可写位的文件这类文件一旦被攻击者利用就能改写系统内容。另外专门排查 setuid 文件find / -perm -4000 -type f 2/dev/nullsetuid 程序运行时会以文件属主身份执行属主是 root 的 setuid 文件就等于给了普通用户 root 执行权限是本地提权最喜欢的目标。扫出来的结果逐项确认不属于业务必需的全部去掉 setuid 位。5.2 控制挂载nodev、nosuid、noexec 组合可写目录是攻击者的落脚点尤其是 /tmp、/home、/var 这类目录通过挂载选项可以显著降低风险。在 /etc/fstab 里给对应的分区加上限制参数/dev/sdb1 /data ext4 defaults,noexec,nosuid,nodev 0 2noexec禁止在该分区上直接执行二进制文件nosuid忽略 suid 位nodev不识别设备文件。三个一起上之后攻击者即使拿到了写权限在这个目录下也跑不了上传的程序提不了权也挂不了设备。加完 fstab 之后执行mount -o remount /data让新参数立即生效再用mount | grep /data确认。这个方案对 /tmp 尤其有效但加之前先确认系统里没有依赖 /tmp 执行程序的安装包有些软件安装时会在 /tmp 解压并运行脚本撞上 noexec 直接安装失败。5.3 备份与恢复给加固上最后一层保险备份的意义在于加固操作本身也可能把系统改坏操作前留一份可回退的快照是所有变更的底线。我用得最多的还是 tar 打包关键目录tar czvf /backup/etc-$(date %F).tar.gz /etcczvf分别表示创建归档、gzip 压缩、显示过程、指定文件名$(date %F)自动拼上当天日期方便保留多个历史版本。恢复的时候不要直接覆盖mkdir -p /tmp/etc-restore tar xzvf /backup/etc-2024-01-01.tar.gz -C /tmp/etc-restore先解压到临时目录核对权限和属主再用 diff 对比关键文件确认没有异常再拷贝回 /etc。直接从备份覆盖 /etc 的操作我在生产上见过一次翻车恢复完所有服务起不来最后发现是解压时属主和权限位丢了。备份盘要和系统盘分开最好是独立挂载的磁盘或远程存储别备份放在被加固的同一台机器上。5.4 常见排查记录四个真实翻车案例案例一chattr 锁死 passwd用户加不进去。现象是加固完第二天 useradd 报错 cannot open /etc/passwd看权限一切正常。原因就是 /etc/passwd 被加了i不可改变位root 也没法写。解决方法是先chattr -i /etc/passwd解锁完成账号操作后重新chattr i /etc/passwd锁上批量处理账号时先统一解锁再统一加锁。案例二关 ping 重启失效扫描器又探测到主机。现象是 echo 1 到 icmp_echo_ignore_all 之后当时有效服务器一重启 ICMP 又恢复响应。原因是参数只写进了 /proc没有持久化到 /etc/sysctl.conf。解决办法是把参数写成net.ipv4.icmp_echo_ignore_all1追加到 sysctl.conf 并执行 sysctl -p。案例三hosts.deny 全拒之后 SSH 连不上。现象是写好ALL: ALL之后自己也登录不了网络层面通但 SSH 超时。原因是白名单 hosts.allow 没有先放行管理员来源。tcp_wrapper 的匹配顺序是 allow 优先必须先在 hosts.allow 写入管理员网段如sshd: 192.168.1.确认能连上之后再写 hosts.deny 的全拒规则。案例四NFS 导出了 ro 但还是被写。现象是 exports 里写了 ro客户端挂载后依然能创建文件。排查发现 exports 文件里同时存在ro和rw的冲突行修改后也没有重新加载。解决方法是清理冲突配置执行exportfs -ra重新加载全部导出再用showmount -e核对当前实际生效的导出列表确认无误后再通知客户端重挂。6. 加固后的日常巡检把 netstat 和日志检查变成习惯6.1 每天两分钟的巡检命令加固不是一次性的动作服务会被新装软件带起来账户会被遗忘的脚本创建内核参数会被其他同事顺手改掉所以我把巡检做成了每天早上必跑的一组命令netstat -an | grep LISTEN | awk {print $4} | sort -u lastb | head -20 awk -F: length($2)0 {print $1} /etc/shadow sysctl net.ipv4.icmp_echo_ignore_all第一条把当前所有 LISTEN 端口打印出来和初始服务清单比对多个端口立刻追查是哪个进程开的第二条 lastb 看最近的失败登录记录连续大量尝试说明有人在爆破第三条继续扫空密码账户第四条确认关 ping 的内核参数还在。这套命令我通常是挂 cron 每天 8 点自动执行输出追加到 /var/log/security_daily.log保留 180 天巡检不只是给自己看更是给未来的排查留现场。配合外部视角每季度用 nmap 从另一台机器扫一遍生产服务器nmap 看到的结果和 netstat 看到的结果对照如果有端口 netstat 没显示但外部能连通大概率是开了防火墙转发或者服务绑定在多网卡上这种隐蔽端口最适合藏后门。我刚做运维那会儿总觉得加固就是把该关的服务全关掉结果在一台测试机上把 chattr 锁死、又把 sshd 从 hosts.allow 里漏掉远程连不上最后跑机房用控制台解锁。从那以后我每次加固完成都强制自己走一遍巡检命令确认能进、能查、能退再宣布收工。希望帮到你也帮到你手里那台服务器。本文还有配套的精品资源点击获取