简介: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,权限不要超过600(shadow 一般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 group=wheel第一行表示 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 服务才删 ftp,games 这类只在 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 并设置权限0000;touch /.rhosts 然后 chmod 0 /.rhosts,防止信任文件里被塞进 “+ +”。凡是涉及密码和数据明文传输的服务(telnetd、ftpd、pop),能换 ssh 就换 ssh,这是手册明确的态度,也是现在依然有效的基线。
3. 网络服务安全:最小化、访问控制与 R 服务风险
3.1 服务过滤:只留必要端口,UDP 别忽略
网络服务部分的开头就是两条原则:只对外开放所需的服务,关闭所有不需要的服务;不同服务尽可能分布到不同主机,既方便配置也缩小风险面。
需要重点过滤的服务,手册给了一张很长的端口表。挑几条最容易出事的整理如下:
| 服务 | 端口 | 协议 | 常见风险 |
|---|---|---|---|
| echo | 7 | TCP/UDP | 反射放大、DoS |
| tftp | 69 | UDP | 无认证文件传输 |
| sunrpc | 111 | TCP/UDP | RPC 漏洞面较大 |
| snmp | 161 | UDP | 系统信息泄露 |
| exec / login / shell | 512/513/514 | TCP | R 服务明文免密风险 |
| route | 520 | UDP | 路由欺骗 |
| X11 | 6000+ | TCP | X 授权透传风险 |
| NFS | 2049 | TCP/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 目录里,收口方式是修改对应配置的 disable=yes,或者直接删除不用的服务文件。无论哪种,最后都要回归到同一个检查动作: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 的工作原理类似一个“二传手”:服务请求先打到 tcpd,tcpd 记录请求时间、来源 IP,并按照访问控制规则检查,匹配才转发给真正的服务程序(比如 in.telnetd),不匹配就直接拒绝。ftp、rsh、finger 这类走 TCP/UDP 的标准服务都可以用这个机制包一层。
配置的核心是两条规则文件。先把默认策略设为拒绝一切:
ALL: ALL@ALL, 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 与 httpd
NFS 的加固集中在导出和挂载两个环节:在外部路由器上过滤 111 和 2049 端口,禁止外部访问;/etc/exports 权限设为644、属主 root,只有 root 能改;用 exportfs 命令动态管理导出目录,比如exportfs -o access=engineering,ro=dancer /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.conf:
net.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 以为完事,结果影子文件里好几个老账号的密文段还是空的。现在每套新环境加固完,都强制按这张自查表走一遍,先命令、后文件、再服务,确认每一项都落在预期结果上才收工。安全加固里的所谓“玄学翻车”,多半不是某个操作多难,而是这些条目太琐碎、没人愿意逐行核对。希望这份自查清单能帮你少踩几个这样的坑,把加固这件事从“做了”变成“做对”。
本文还有配套的精品资源,点击获取