ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Linux安全加固实战:从默认配置到纵深防御的完整指南

Linux安全加固实战:从默认配置到纵深防御的完整指南

简介:面向Linux系统管理员、运维工程师及安全初学者的一份安全加固参考手册,聚焦操作系统层面的基线配置与风险收敛,帮助读者在服务器上线前后系统梳理加固要点。压缩包内仅含1个PDF文件,约40KB,篇幅精简、目录结构清晰,按概述、安装、用户帐号安全、网络服务安全四大板块组织,便于快速定位查阅。内容覆盖安装阶段的安全设置、密码安全策略与密码强度检查、Password Shadowing及密码管理,并延伸至服务过滤、/etc/inetd.conf、R服务、Tcp_wrapper、/etc/hosts.equiv、NFS、tftp、Sendmail、finger、UUCP等网络服务的安全配置,兼顾账号与网络两个维度。目前已有1338人学习,适合作为日常加固检查清单与配置对照材料,也可用于安全培训或自查排错时快速回顾关键项。

1. 到底什么是 Linux 安全加固:从一把没锁的后门说起

很多人第一次听到「Linux 安全加固」,脑子里浮现的是一堆看不懂的命令和配置文件。其实换个生活场景就明白了:你搬进一栋新房子,开发商交房时门锁是统一的、窗户能开、水电总闸在楼道里谁都能碰——住着方便,但真出了事,谁都能进来。Linux 系统装好那一刻,差不多就是这个状态:默认配置优先考虑「能用」,而不是「安全」。所谓安全加固,就是把这栋房子的锁换掉、多余的钥匙收走、不用的窗户封死、总闸加个盖子,让系统从「默认能用」变成「默认难被攻破」。

这份《LINUX安全加固手册》讲的正是这套动作。它从安装阶段就开始提醒你隔离网络、卸载用不上的软件包,再一路讲到账号密码、网络服务、系统设置、文件系统,最后落到防火墙和第三方工具。整本手册的核心逻辑只有一句话:关掉不需要的,管好必须留的。搞懂这个概念,你再看任何一台 Linux 机器的安全状态,心里都会有一杆秤。

2. 为什么默认配置靠不住:加固到底在防什么

2.1 默认配置的假设是「信任」,加固的假设是「不信任」

操作系统出厂时的默认配置,隐含了一个前提:使用者知道自己要干什么,环境是可控的。但现实是,一台连上网络的 Linux 机器,面对的是全世界自动化的扫描和尝试。手册开篇就点破了这件事——网络通信量越来越大,重要交易越来越多地走网络,数据被损坏、截取、修改的风险同步上升。只要有值得偷的东西,就有人想办法偷。

打个比方,默认配置像一间开着门的便利店,方便顾客进出,也方便顺手牵羊。加固不是把店封死,而是把贵重商品锁进柜台、把后门焊上、把监控打开。手册里反复出现的两个基本原则,其实就是这个思路的浓缩:只对外开放所需要的服务,关闭所有不需要的服务;把不同服务分散到不同主机上。服务越少,暴露面越小,能被利用的漏洞自然越少。

2.2 加固防的不是「某一个黑客」,而是「一整类风险」

初学者容易以为安全加固是防某个具体攻击者,其实它防的是一整类风险。手册里列出的服务过滤清单很能说明问题:echo、systat、netstat、tftp、sunrpc、snmp、exec、login、shell、printer、nfs、x11 等等,这些端口和服务如果开着,就等于在墙上多开了几扇窗。手册特别提醒,有些 UDP 服务可以导致拒绝服务攻击和远程溢出,比如 rpc.ypupdated、rpcbind、rpc.cmsd、rpc.statd、rpc.ttdbserver、sadmind 这类。

通俗地说,加固是在做「减法」:每关掉一个不需要的服务,就少一个可能被翻车的入口。这也是为什么手册在安装章节就要求把系统放在隔离网络里,装完立刻卸载 pump、apmd、kudzu、linuxconf 这类用不上的软件包——不是它们本身有罪,而是它们增加了不必要的攻击面。血泪经验往往来自「这个服务我以后可能用得上」的侥幸,结果它成了最先被利用的那个。

2.3 加固的价值在于「把损失控制在可预期范围」

安全没有绝对,加固也不承诺「攻不破」。它真正的作用是抬高攻击成本、缩短被发现的时间、把损失圈在可控范围内。手册在日志系统安全、备份与恢复、文件权限这些章节里体现的正是这个思路:即使真出事,你也能从日志里查到痕迹,从备份里恢复数据,从权限设置上限制影响范围。

提示:加固不是一次性动作。手册在 /etc/hosts.equiv 相关章节特别强调,每次安装补丁程序或操作系统之后,都应该重新检查这些文件的设置情况。配置会随升级被覆盖,这是很多人踩过的坑。

3. 加固的几大板块:账号、服务、系统、文件各管一摊

3.1 账号与密码:把钥匙管住

账号安全是整本手册着墨最多的部分之一,因为它直接对应「谁能进门」。手册给出的密码策略很朴素:口令至少 6 位,包含特殊字符;不要用生日、电话、姓名拼音或缩写、单位简称这类信息构成;口令必须有有效期;发现有人长时间猜测口令,就要更换口令。这几条听起来老生常谈,但每一条背后都是真实的翻车案例。

密码存储上,手册提到 Password Shadowing,也就是用 shadow 文件隐藏密文,现在已经是默认配置。但默认不等于可以不管,手册建议定期检查 shadow 文件里有没有空口令,给出的命令是:

# 检查 /etc/shadow 中第二字段(密码哈希)为空的账号 awk -F: 'length($2)==0 {print $1}' /etc/shadow

这段命令的逻辑很直白:以冒号分隔读取每一行,如果第二个字段长度为 0,说明这个账号没有设密码,直接打印出账号名。参数上,-F:指定分隔符为冒号,$2就是密码哈希那一列。空口令账号是加固里最不该出现的低级问题,一条命令就能筛出来。

密码管理上还有几个关键动作:编辑 /etc/login.defs 设置口令最长有效时限和最短字符数;只允许特定用户用 su 成为 root,做法是编辑 /etc/pam.d/su,启用 pam_wheel.so 并指定 wheel 组,再用usermod -G10 admin把用户加进 wheel 组。另外,手册建议清除 adm、lp、sync、shutdown、halt、news、uucp、operator、games、gopher、ftp 这些不必要的系统账户,并给 passwd、shadow、group、gshadow 加上不可改变位:

# 给关键账号文件加不可改变位,防止被意外或恶意修改 chattr +i /etc/passwd chattr +i /etc/shadow chattr +i /etc/group chattr +i /etc/gshadow

chattr +i的含义是让文件变成「不可变」,连 root 都不能直接改,必须先去掉这个位。这相当于给钥匙柜焊了层铁皮,代价是以后改账号得先解锁,所以要想清楚再上。

3.2 网络服务:把多余的窗户封死

网络服务安全是加固里最考验判断力的部分。手册的原则前面说过:只开需要的,关掉其余。具体落地时,/etc/inetd.conf 是重点对象——确保文件权限 600、属主 root,注释掉所有不需要的服务,改完重启 inetd 进程,再用netstat -an查看本机实际在提供哪些服务,确认该停的都停了。

R 服务(rlogin、rsh、exec 对应 512、513、514 端口)是手册明确建议关闭的。Red Hat 6.2 在 /etc/inetd.conf 里注释,Red Hat 7.0 在 /etc/xinetd.d 目录里删除。如果确实要用,手册建议用更安全的版本,并在路由或防火墙上禁止外部访问这几个端口,再用 TCP Wrappers 限定信任机器。这里有个细节值得记住:预先生成 $HOME/.rhosts 和 /etc/hosts.equiv 并设为 0000,是为了防止攻击者写入+ +这种「任何主机任何用户免密进入」的配置。这个手法在真实入侵里非常常见,属于典型的踩坑点。

TCP Wrappers 的作用手册讲得很清楚:它过滤 TCP/UDP 服务,用 tcpd 程序取代原来的 in.telnetd,截获请求、记录时间和 IP、按访问控制检查,符合预设才放行。配置上,/etc/hosts.deny 设成ALL: ALL@ALL, PARANOID默认全拒,/etc/hosts.allow 里再逐个放行,比如sshd: 208.164.186.1 gate.openarch.com。用 tcpdchk 可以检查配置有没有写错。这套「默认拒绝、白名单放行」的思路,是加固里最值得内化的思维模型。

其他服务上,手册的态度很干脆:tftp 无论何种情况都不应启动;finger 不应启动,非要用就用最新版本;UUCP 建议不用;NFS 要在外部路由过滤 111 和 2049 端口,检查 /etc/exports 权限,用 exportfs 管理导出目录;Sendmail 要慎用 promiscuous_relay、accept_unqualified_senders、loose_relay_check 这些削弱安全控制的特性,建议配置 SMTP 认证;httpd 不要用 root 运行,尽量在 chroot 环境里跑,对 CGI 脚本做安全审计;FTP 要检查默认配置、设置 /etc/ftpusers、在 chroot 环境运行、配置 /etc/ftpaccess 和 /etc/ftphosts,并经常查看 /var/log/xferlog。

3.3 系统设置与文件系统:把总闸和保险箱管好

系统设置安全这一块,手册处理的是那些「平时不注意、出事很要命」的开关。限制控制台使用,就是删除 /etc/security/console.apps 里的 halt、poweroff、reboot、shutdown、xserver 等程序,并在 /etc/pam.d 里注释掉包含 pam_console.so 的行,防止普通用户在控制台直接关机或启动 X。关闭 Ping 则是让系统对 ping 不做反应,命令是往 /proc/sys/net/ipv4/icmp_echo_ignore 写入 1,减少被扫描探测的机会。

文件系统安全落在文件权限、mount 控制和备份恢复上。手册建议用 noexec、nodev、nosuid 等选项控制挂载的文件系统,在 /etc/fstab 里设置。这三个选项的含义分别是:不允许执行程序、不解释设备文件、不保留 setuid 权限,等于给挂载点加了层保险。备份与恢复则是最后一道后悔药——真被改了、删了,能不能快速回到干净状态,全看这一步有没有做。

4. 常见误区与易混概念:这几组最容易搞混

4.1 误区一:加固等于装个防火墙

易混点:很多人以为 Linux 安全加固就是配一下防火墙规则。为什么混?因为防火墙是最直观的「安全设备」。怎么区分:防火墙只是手册第 7 章「其它」里的一节,前面还有账号、服务、系统设置、文件系统四大块。防火墙管的是网络进出,管不了弱口令、管不了多余的系统账户、也管不了文件权限。加固是整套动作,防火墙只是其中一道门。

4.2 误区二:关掉的服务越多越安全

易混点:既然原则是「关掉不需要的」,那是不是关得越狠越好?为什么混?因为「不需要」这三个字被忽略了。怎么区分:手册的原则是「只对外开放所需要的服务」,前提是搞清楚业务到底依赖什么。盲目关服务可能把正常业务也关掉,造成可用性问题。正确做法是先netstat -an摸清现状,再对照业务判断哪些该留,而不是一刀切。

4.3 误区三:Password Shadowing 开了就万事大吉

易混点:以为启用了 shadow 就安全了。为什么混?因为 shadow 确实是默认配置,容易让人以为不用管。怎么区分:shadow 只是把密文从 /etc/passwd 挪到 /etc/shadow,防止普通用户读到哈希。它不解决空口令、弱口令、口令永不过期这些问题。手册要求定期用 awk 检查空口令、设置有效期、限制 su 权限,这些才是配套动作。

4.4 误区四:TCP Wrappers 和防火墙是一回事

易混点:两者都做访问控制,容易混为一谈。为什么混?因为都能「拒绝某个 IP」。怎么区分:防火墙在网络层拦包,TCP Wrappers 在主机上针对具体服务做应用层过滤,靠 /etc/hosts.allow 和 /etc/hosts.deny 配置,还能记录请求日志。手册里两者是配合关系:路由或防火墙先挡一层,TCP Wrappers 在主机上再挡一层,纵深防御。

4.5 误区五:加固做完就一劳永逸

易混点:配置改完就以为结束了。为什么混?因为配置文件看起来是静态的。怎么区分:手册明确说,每次安装补丁或操作系统之后都要重新检查 /etc/hosts.equiv 等文件的设置。升级会覆盖配置,新装的服务会带来新端口,攻击手法也在变。加固是持续动作,不是一次性任务。

5. 什么时候该用、什么时候别硬套:一份边界判断

加固这件事,最怕两种极端:一种是什么都不做,裸奔上网;另一种是照着清单无脑全上,结果把系统搞得自己都维护不了。判断边界,关键看这台机器承担什么角色、暴露在什么环境里。

如果是一台直接面向公网、承载业务的服务器的,手册里的服务过滤、TCP Wrappers 白名单、关闭 R 服务、限制 su、日志审计这些基本都要走一遍,因为这些措施直接对应外部威胁。如果是一台内网隔离环境里的测试机,那么像 chattr +i 锁死账号文件、关闭 Ping 这类操作可以缓一缓,优先保证你能正常调试,否则每次改账号都要先解锁,反而增加误操作风险。下面这张表可以帮你快速判断:

场景建议动作可以缓一缓的动作
公网业务服务器服务过滤、白名单、关 R 服务、日志审计无,基本都要做
内网测试机强口令、关多余服务、定期备份chattr 锁文件、关 Ping
个人学习机强口令、及时打补丁、备份复杂的服务白名单
承载敏感数据的机器全套加固 + 备份恢复演练无

举个具体例子。假设你接手一台对外提供 Web 服务的机器,手册的路径大致是:先确认它处在受控网络里,卸载用不上的软件包;然后检查账号,清掉多余系统账户、设好口令策略、限制 su;接着用netstat -an看开了哪些端口,对照业务把 echo、tftp、sunrpc、exec、login、shell 这些不需要的关掉,R 服务直接停;再配 TCP Wrappers,默认全拒、按需放行;httpd 不用 root 跑,尽量 chroot;最后把日志和备份配好,用扫描工具从外部模拟探测一遍,确认没有意外暴露的端口。

需要提醒的是,加固动作之间有依赖和副作用。比如给 /etc/services 加chattr +i能防止未授权修改,但以后你要改端口映射就得先解锁;关闭控制台的 shutdown 程序能防误关机,但也意味着现场只能走其他方式关机。这些取舍没有标准答案,取决于你对这台机器的掌控程度和运维习惯。

注意:手册里提到的很多命令和文件路径带有明显的年代痕迹(比如 Red Hat 6.2 与 7.0 的差异、inetd 与 xinetd 的并存),在不同发行版和版本上,文件位置和服务管理方式可能已经变化。理解思路比照抄命令更重要,落到自己机器上要先确认对应版本的实际结构。

我自己的习惯是,每次动一台新机器之前,先把netstat -an的输出和关键配置文件备份一份,改完再对比一遍,确认没有多开或误关。有一次就是因为没先备份 /etc/inetd.conf,注释服务时手滑多注释了一行,结果一个内部依赖的小服务断了,排查了半天才想起来是加固改的。从那以后我每次做加固都强制走一遍「先记录、再修改、后验证」的流程,宁可慢一点,也不让加固本身变成新的故障源。希望这些能帮到你,少走一点弯路。

本文还有配套的精品资源,点击获取

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进