Linux安全加固三层防线:帐号、网络与系统配置实战 简介LINUX安全加固手册是一份系统安全配置的实用指南主要面向LINUX系统管理员、运维工程师及安全从业者帮助其在系统安装、账号管理与网络服务部署等多个环节落实安全基线是提升服务器整体防护能力的基础参考。手册从密码安全策略入手详细讲解了密码强度检查、Password Shadowing机制、密码唯一性和周期更新要求以及密码管理流程并进一步延伸到网络服务安全覆盖服务过滤、/etc/inetd.conf配置、R服务、Tcp_wrapper访问控制、/etc/hosts.equiv文件设置等多个关键模块。每个模块均给出可执行的具体操作与核查思路便于读者在真实服务器环境中直接应用从而有效降低常见的账号爆破、未授权访问等风险。资源为单个PDF文件压缩包体积40KB内容紧凑、结构清晰手册共16页适合作为日常运维排查和基线安全审计的速查工具。该手册已有1333人学习使用反馈其覆盖全面且偏重实践对LINUX安全入门与进阶均有较强参考价值。1. LINUX安全加固的知识地图帐号、网络、系统三层防线LINUX安全加固从来不是装个监控软件、跑一条命令就算完成的任务而是一条从“谁能进来”到“能访问什么”再到“系统本身扛不扛得住”的纵深防线。很多人习惯先调防火墙、再装安全工具把帐号管理和服务最小化放到后面可实际攻破路径里最常见的突破口恰恰是空口令、明文r服务、多余端口这类老问题。把加固拆成用户帐号安全、网络服务安全、系统与文件系统安全三层以后每一层都有对应的配置文件和检查命令密码策略管住人服务过滤管住路mount参数和内核开关管住系统暴露面。这条主线就是这份笔记的目录适合正在系统复习Linux运维安全、或准备相关面试考证的人按层排查比零散翻文档要高效得多。2. 用户帐号安全密码策略、shadow 机制与 su 权限管控2.1 密码策略先把规则定死再谈怎么查手册对密码的口径很直接口令至少6位且包含特殊字符不要用生日、电话、姓名拼音或缩写这一类相关信息构成口令口令必须有有效期发现有人长时间猜测口令就要更换。这套规则放到今天6位只是底线生产环境建议把最小长度提到12到14位并配合强度校验模块来强制复杂度和历史口令去重。实际操作中密码策略要同时落到两个层面一是为新用户定默认值二是对存量用户做一次批量检查。默认值在 /etc/login.defs 里控制存量用户用 chage 命令单独处理# 强制用户下次登录时修改口令 chage -d 0 opsuser # 查看指定用户的口令有效期信息 chage -l opsuser # 设置最长90天、最短5天、到期前7天警告 chage -M 90 -m 5 -W 7 opsuser-d 0 是把口令最后一次修改时间置为过去的日期等于强制系统要求用户立即重设-M / -m / -W 分别对应最长使用天数、两次修改最小间隔和到期前警告天数。只看 login.defs 而不碰存量账号是这部分最常漏的一步新策略对老账号根本不生效等于定了规则没执行。策略维度可以按一张小表来记维度手册要求落地位置最小长度至少6位建议更高/etc/login.defs 的 PASS_MIN_LEN复杂度包含特殊字符系统认证模块的强度校验配置有效期必须有有效期PASS_MAX_DAYS / chage -M异常猜测长时间猜测需更换登录日志审计配合口令更换流程2.2 shadow密文隔离与空口令排查shadow 文件的意义是把加密后的口令从 passwd 里分离出来普通用户不读得到密文离线破解的难度随之上升。现在这已经是默认配置真正容易漏的是定期检查 shadow 内容本身。空口令是最危险的状态之一原文给出了一个很实用的排查命令awk -F: length($2)0 {print $1} /etc/shadow-F: 表示按冒号分隔字段shadow 每行的第二个字段是口令密文段length($2)0 说明这个字段为空也就是该账号没有口令保护。如果这条命令有输出逐行把对应账号锁掉或补上口令不要只看一眼就放过去。shadow、passwd 这些文件的权限也要顺手确认属主是 root权限不要超过600shadow 一般400或000。检查密码是否真的扛打可以用暴力破解工具在测试环境里对测试账号做强度验证也可以对存量口令做批量弱口令检查。注意一点这类工具不要直接对生产账号跑一是耗资源二是可能触发账号锁定机制属于典型的自己给自己挖坑。2.3 密码管理login.defs 与 pam_wheel 的配合/etc/login.defs 控制的是新建用户的默认参数常见的加固配置长这样PASS_MAX_DAYS 90 PASS_MIN_DAYS 5 PASS_MIN_LEN 12 PASS_WARN_AGE 7含义分别是口令最长可用90天、两次修改最小间隔5天、最小长度12位、到期前7天开始告警。改完之后新建用户自动继承这套策略但前面说过存量用户要用 chage 逐个对齐。su 权限管控是另一个高频重点。要让普通用户不能随意切换 root编辑 /etc/pam.d/su在文件头部加入两行auth sufficient pam_rootok.so debug auth required pam_wheel.so groupwheel第一行表示 root 自己 su 到 root 不需要额外验证第二行表示只有 wheel 组成员才允许 su 成功。然后把具体账号加进 wheel 组usermod -aG wheel opsadmin用组名而不是 GID 去操作因为不同发行版下 wheel 的 GID 并不固定。这里有个真实的翻车场景先改了 pam 配置、后加组成员等你用普通账号 su 时发现被拒绝而 root 窗口又已经关了只能去物理机或单用户模式救属于典型的顺序问题。正确顺序是先加组、再改 pam 配置。2.4 帐号清理与关键文件锁定系统默认自带的一堆服务帐号很多业务场景根本用不到加固时建议逐个清理。手册列出的清单包括 adm、lp、sync、shutdown、halt、news、uucp、operator、games、gopher、ftp对应命令是 userdel 用户名。删除之前先确认该帐号没有承载实际服务不跑打印服务才删 lp不对外提供 ftp 服务才删 ftpgames 这类只在 X 窗口环境用到的帐号不用 X 窗口就可以删。另一个容易被忽略的步骤是给关键文件加不可变位chattr i /etc/passwd chattr i /etc/shadow chattr i /etc/group chattr i /etc/gshadow加了 i 之后文件不能被修改、删除或改名连 root 也不行攻击者想往 passwd 里追加一个后门帐号就会直接失败。代价是后续的正常维护也会被挡住useradd、passwd、groupadd 都会报错必须先 chattr -i 解锁再操作。建议维护流程固定成三步解锁、修改、重新加锁。注意chattr i 是双刃剑。加锁之前先确认这台机器后续有没有批量改密码、批量建用户的计划别把自动化脚本一起锁死在门外。最后还有几条容易被忽略的“小动作”不要使用 .netrc预先创建 $HOME/.netrc 并设置权限0000touch /.rhosts 然后 chmod 0 /.rhosts防止信任文件里被塞进 “ ”。凡是涉及密码和数据明文传输的服务telnetd、ftpd、pop能换 ssh 就换 ssh这是手册明确的态度也是现在依然有效的基线。3. 网络服务安全最小化、访问控制与 R 服务风险3.1 服务过滤只留必要端口UDP 别忽略网络服务部分的开头就是两条原则只对外开放所需的服务关闭所有不需要的服务不同服务尽可能分布到不同主机既方便配置也缩小风险面。需要重点过滤的服务手册给了一张很长的端口表。挑几条最容易出事的整理如下服务端口协议常见风险echo7TCP/UDP反射放大、DoStftp69UDP无认证文件传输sunrpc111TCP/UDPRPC 漏洞面较大snmp161UDP系统信息泄露exec / login / shell512/513/514TCPR 服务明文免密风险route520UDP路由欺骗X116000TCPX 授权透传风险NFS2049TCP/UDP共享目录暴露另外一类要单独记住的是 UDP 上的 RPC 衍生服务rpc.ypupdated、rpcbind、rpc.cmsd、rpc.statd、rpc.ttdbserver、sadmind它们既可能被用于 DoS也可能存在远程溢出漏洞。配置完成之后从外部网络用网络扫描器做一轮端口扫描确认没有漏网端口扫描结果和上面的清单逐行比对而不是“看起来差不多”就结束。3.2 /etc/inetd.conf 与监听端口收口老式发行版把一堆网络服务挂在 inetd 底下加固动作是确认文件权限600、属主 root注释掉所有不需要的服务重启 inetd 进程再用 netstat 核对监听状态。chmod 600 /etc/inetd.conf chown root:root /etc/inetd.conf # 注释不需要的服务行后重启 service inetd restart # 核对本机所有监听端口 netstat -an | grep LISTEN后来很多发行版换成了 xinetd服务配置分散在 /etc/xinetd.d 目录里收口方式是修改对应配置的 disableyes或者直接删除不用的服务文件。无论哪种最后都要回归到同一个检查动作netstat -an新环境用 ss -tln 和 ss -uln看监听列表和预想中的服务清单对比多出来的端口要么关进程要么确认是业务必需。最容易漏的是 UDP 监听很多人只看 TCP 行结果 tftp、snmp 这类 UDP 服务还在外面裸奔。3.3 R 服务与 hosts.equiv信任链条上的高风险点R 服务exec、rlogin、rshell的历史包袱很重它们信任来源 IP 或主机名基本不验证口令而出问题的关键往往不是服务本身而是配套的信任文件。手册对 R 服务的处理分两条路。不用 R 服务直接删掉 /etc/hosts.equiv 和 $HOME/.rhosts并在 inetd/xinetd 里注释或禁掉 exec(512)、rlogin(513)、rshell(514)。必须用 R 服务采用加固过的替代程序在路由器或防火墙上禁止外部网络访问 512/513/514 端口并用 TCP wrappers 限制只有可信机器能连。/etc/hosts.equiv 这个文件如果非留不可几条纪律必须记住任何时候都不能出现 字符因为 代表所有主机上的所有用户都可以免密访问不要用 ! 和 #在这个文件里它们不代表注释写上去只会把规则弄混乱文件首字符不能是 -信任主机用全名hostname.domainname 这种格式文件权限600、属主 root每次打完补丁或重装系统后重新检查一次。这里最典型的问题场景是攻击者通过符号链接或 root shell 往 hosts.equiv 里写入 “ ”一瞬间等于向全网开放了系统。手册给出的应对很简单能删就删不能删就预生成一个权限0000的空文件占位让写入动作失败。3.4 Tcp_wrapper先默认拒绝再显式放行Tcp_wrapper 的工作原理类似一个“二传手”服务请求先打到 tcpdtcpd 记录请求时间、来源 IP并按照访问控制规则检查匹配才转发给真正的服务程序比如 in.telnetd不匹配就直接拒绝。ftp、rsh、finger 这类走 TCP/UDP 的标准服务都可以用这个机制包一层。配置的核心是两条规则文件。先把默认策略设为拒绝一切ALL: ALLALL, PARANOID再在 /etc/hosts.allow 里显式放行需要的来源sshd: 10.0.0.8 host-ops这段配置的意思是只有源 IP 为 10.0.0.8 且主机名为 host-ops 的连接才允许访问 sshd。注意规则检查顺序是 hosts.allow 优先于 hosts.deny所以“先在 deny 里拒绝全部再在 allow 里放行”是安全且不冲突的写法。PARANOID 选项的含义是匹配一切主机名与 IP 地址对应不上的请求配合 /etc/hosts 里的正反解析使用。配置完成后用 tcpdchk 检查规则语法和依赖是否完整。需要记住一个历史细节UDP 服务挂 tcp_wrapper 时inetd.conf 里必须配 nowait 选项否则服务会卡在等待状态。另外某些新版服务尤其 sshd默认不走 inetd/xinetd 启动tcp_wrapper 对它们是否生效要看具体编译和启动参数复习时不要拿老文档硬套新系统。3.5 常用服务专项NFS、Sendmail、FTP 与 httpdNFS 的加固集中在导出和挂载两个环节在外部路由器上过滤 111 和 2049 端口禁止外部访问/etc/exports 权限设为644、属主 root只有 root 能改用 exportfs 命令动态管理导出目录比如exportfs -o accessengineering,rodancer /usr表示给指定工程组只读权限exportfs -u /usr撤销导出用 showmount -e 自查本机开放了哪些共享。挂载端记得在 fstab 里加 noexec、nodev、nosuid不给上传程序执行机会。Sendmail 的部分主要是 relay 相关特性每种开关的取舍可以这样记特性作用建议promiscuous_relay打开任意转发不要开等于放弃防滥用accept_unqualified_senders接受无完整主机地址的 MAIL FROM别轻易开loose_relay_check改变源路由域名的转发检查别轻易开accept_unresolvable_domains接受无法解析的主机地址防火墙后收邮件场景可考虑blacklist_recipients启用接收黑名单建议开relay_entire_domain为整个本地域提供转发范围过大慎用另外还提到用 smrsh 作为 sendmail 受限 shell、关闭 expn/vrfy 命令避免系统信息泄漏、配置 smtp 认证防滥用。这些点的共同思路是邮件服务默认越保守越安全每一项“放开”都要先问是否必要。FTP 的加固要落到几个文件上/etc/ftpusers 列禁用用户/etc/ftpaccess 禁止泄露系统信息和设置最大连接数/etc/ftphosts 限定允许访问的主机和用户服务端用 chroot 环境运行不给穿越目录的机会日志看 /var/log/xferlog并放到 root 可见的权限下。匿名 ftp 只给读权限涉及 NIS/NIS 这类分布式密码时要专门确认密码文件配置正确。httpd 的要点比较集中不要用 root 身份运行 Web 服务进程能放进 chroot 环境更好CGI 脚本能少用就少用必须用的做安全审计并过滤危险字符\n、\r 以及 (.,/;~!)|^$ 这一串关键业务传输走 https。这些条目拆开看都是老生常谈合在一起就是 Web 服务进程权限最小化的完整做法。4. 系统与文件系统安全控制台、内核参数与 mount 收口4.1 控制台程序与 pam_console 收口本地物理控制台往往比远程攻击更容易被忽略。手册的做法分两层先从 /etc/security/console.apps 目录下删掉一些控制台程序再注释 PAM 配置里的控制台权限。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这些文件删除后普通控制台用户就不能再从本地界面直接触发关机、重启Xserver 也只能由 root 启动。接着把 /etc/pam.d 下所有包含 pam_console.so 的行加上注释等于把控制台程序通过 PAM 获得授权的通道一并关闭。这段操作在纯远程服务器上往往被跳过但一旦有人拿到物理接触条件控制台程序关不关的差别就很明显了。加固文档里用它来兜底“本地面板”这一层。4.2 网络层加固关闭 Ping、禁止源路径路由与 securetty关闭 ping 的临时命令是echo 1 /proc/sys/net/ipv4/icmp_echo_ignore_all这个值只对当前运行状态生效重启后要重新写。更稳妥的是追加到 /etc/sysctl.confnet.ipv4.icmp_echo_ignore_all 1 net.ipv4.conf.all.accept_source_route 0 net.ipv4.conf.default.accept_source_route 0icmp_echo_ignore_all 置 1 后系统对 ping 不回应探测者会少一个最基础的存活判断依据。accept_source_route 关闭的是 IP 源路径路由允许源路由的数据包能携带自己的路径信息绕过网络设备的正常选路攻击者可能借此到达本不该被访问的目标这两项在加固清单里应该一起改。/etc/securetty 限定的是 root 可以从哪些终端登录。加固思路通常是只保留本机物理终端 tty1 到 tty6注释掉所有的 pts 伪终端和远程图形登录入口文件属主 root、权限600。需要额外记住securetty 只管 login/tty 链路管不到 sshd 的 root 直登ssh 那边是另一个独立的开关。两者不是一回事复习时不要混在一起。4.3 资源限制与引导装载器安全资源限制走 /etc/security/limits.conf作用是防止本地用户把系统资源耗尽。常见配置* soft nproc 512 * hard nproc 1024 * soft nofile 4096 opsuser hard maxlogins 3soft 和 hard 分别对应软限制和硬限制nproc 是最大进程数nofile 是最大打开文件数maxlogins 限制同时登录数量。设置完重新登录终端才会完全生效。这一块内容是手册里点到为止的部分但实际运维中资源耗尽导致的“假死”比暴力攻击更常见整理笔记时专门补了一条。引导装载器安全对应手册里的“LILO 安全”。LILO 时代可以通过给引导配置加 restricted 和 password 来防止普通用户进入单用户模式现代环境工具换成了 GRUB等效操作是为引导器设置密码。核心目的只有一个避免攻击者在引导界面进行编辑进入单用户模式后不输入 root 密码直接改系统。4.4 文件系统权限、mount 选项与备份恢复文件系统部分可以拆成三个动作。第一是权限最小化修正 /etc/rc.d/init.d 目录下脚本的权限不允许所有人可写用 ls -l 按目录过一遍777 的脚本文件在加固后的系统里不该出现。第二是对挂载分区加保护参数在 /etc/fstab 里这样写/dev/sdb1 /data ext4 defaults,noexec,nodev,nosuid 0 0noexec 表示该分区禁止直接执行程序nodev 表示不解析设备文件nosuid 表示忽略 suid/sgid 位。把这三项加到 /tmp、/home 这类可写分区后即使攻击者上传了脚本或二进制也少了一条直接执行的路径。第三是备份与恢复。手册把它放在文件系统安全里是有原因的备份是对抗删库和误操作的最后防线。务实的执行标准不是“每天在跑备份脚本”而是“每个月能在测试环境完整恢复一次”。恢复演练按目录恢复、数据库恢复分别做确认备份文件的完整性和可读性再谈备份周期和保留策略。5. 易漏点与易错点安全加固中最常翻车的五处加固做完不等于安全落地以下五类问题在查漏补缺时反复出现每条都按“漏在哪、为什么漏、怎么补”来梳理。5.1 只设密码策略不检查存量账号最容易漏的是以为改完 /etc/login.defs 就万事大吉。实际上这个文件只影响新建用户已有的老账号口令有效期、最小长度都不会自动随之更新。怎么补用 chage -l 把每个账号过一遍再配合 awk 脚本扫描 shadow 里的空密文字段把存量账号和新策略对齐。5.2 hosts.equiv 被写入 “ ”这个文件是 R 服务信任体系的核心攻击者一旦通过符号链接或临时 root 权限往里面写一行 “”等于对所有主机所有用户免密开放。很多人删了 R 服务就以为安全了却忘了 hosts.equiv 文件还躺在原地。怎么补能删直接删不能删就预先生成权限0000的空文件占位每次补丁、升级后复查一次。同理适用于 $HOME/.rhosts。5.3 chattr i 锁了文件后续维护被自己卡住给 passwd、shadow 加不可变位是标准加固动作但没人提醒你加锁之后 useradd、passwd、chpasswd 全部会失败。运维现场最容易出现的情况是变更时报错为了“赶紧把事办完”直接取消加固而不是走解锁、修改、重新加锁的三步流程。怎么补维护流程里固定写进“先 lsattr 查看锁状态再决定是否解锁”这一条变更单里同步记录解锁命令。5.4 只查 TCP 端口UDP 服务继续裸奔netstat -an 的输出里 TCP 行多、UDP 行少很容易让人扫一眼 TCP 就收工。tftp、snmp、sunrpc 这些 UDP 服务一旦开着既可能泄露信息也可能被用来做 DoS。怎么补强制加一条检查命令 ss -uln把 UDP 监听列表也逐行对照服务清单确认没有多余的 UDP 端口。5.5 备份只管做不演练恢复最典型的“安心式翻车”备份脚本状态一切正常日志里全是成功真到误删数据那一刻才发现备份文件损坏或恢复流程断在中间。备份的价值不在“有备份”而在“能恢复”。怎么补每个月在测试环境挑一个目录或一个小型数据库做一次真实恢复把恢复成功作为备份任务的完成标准。6. 复习清单30 分钟跑完的加固自查流程把前面所有模块浓缩成一张自查表照着执行可以快速发现遗漏模块检查项命令或文件预期结果帐号空口令awk -F: length($2)0 {print $1} /etc/shadow无输出帐号口令有效期chage -l 逐个账号均设最大/最短天数帐号su 白名单/etc/pam.d/su仅 wheel 组可 su网络监听端口netstat -an / ss -tln、ss -uln无多余 TCP/UDP 监听网络信任文件/etc/hosts.equiv、~/.rhosts不存在或权限0000网络访问控制/etc/hosts.deny默认 ALL:ALL系统关闭 ping/proc/sys/net/ipv4/icmp_echo_ignore_all值为1系统源路由sysctl net.ipv4.conf.all.accept_source_route值为0文件挂载选项/etc/fstab/tmp、/home 含 noexec、nodev、nosuid文件关键文件锁lsattr /etc/passwd /etc/shadow显示 i按顺序走一遍流程先看帐号再查端口和信任文件接着核对内核参数和挂载选项最后做一次备份恢复演练。每条命令的执行结果都对照“预期结果”列不一致的项单独列到待办清单里。这个流程熟练之后十分钟能跑完定成月度巡检脚本也不难。我自己最早做加固时就吃过只设密码策略、不查存量账号的亏——改完 login.defs 以为完事结果影子文件里好几个老账号的密文段还是空的。现在每套新环境加固完都强制按这张自查表走一遍先命令、后文件、再服务确认每一项都落在预期结果上才收工。安全加固里的所谓“玄学翻车”多半不是某个操作多难而是这些条目太琐碎、没人愿意逐行核对。希望这份自查清单能帮你少踩几个这样的坑把加固这件事从“做了”变成“做对”。本文还有配套的精品资源点击获取