资讯详情

资讯详情

Linux安全加固实战:从账号认证到内核参数的层层设防

简介面向Linux运维、系统管理员及安全入门者这份PDF手册系统讲解Linux系统安全加固的核心要点覆盖系统安装阶段的安全设置、用户帐号与密码策略、网络服务安全等环节帮助读者建立从基础到进阶的加固思路。资源为单个PDF文件大小约40KB内容精炼但目录结构清晰按「概述、安装、用户帐号安全、网络服务安全」等模块组织便于快速定位和查阅。目前已有1333人学习下载。手册着重说明密码安全策略、密码强度检查、Password Shadowing机制、密码管理方法以及服务过滤、/etc/inetd.conf、R服务、Tcp_wrapper、/etc/hosts.equiv等网络服务安全配置并涉及NFS、Sendmail、finger、UUCP等常见服务的安全建议既有概念解释也有操作指引适合在系统上线或日常运维时对照自查快速补齐安全短板。1. 安全加固的本质为什么默认安装的 Linux 是个靶子拿到一台刚装好的 Linux最反直觉的事实是它默认开启的监听端口、信任机制和系统账号每一项都是潜在入口。所谓安全加固不是装个杀毒软件就完事而是把系统从「隐式信任一切」改造成「显式允许少数」。这份 LINUX 安全加固手册的价值在于它把散落在账号、网络服务、内核参数、文件系统里的加固点串成了一条可落地的检查链。但照抄命令容易翻车hosts.deny 里一行 ALL:ALL 可能让你连不上自己的服务器chattr i 锁完 /etc/passwd 之后 useradd 会直接报错。只有把每条加固命令背后的机制搞明白才知道哪些该做、哪些要改、顺序怎么排。这篇文章就按手册的骨架把每项加固从「结论」拆到「机制」。2. 账号与认证密码哈希、shadow 与 su 限制的层层设防账号安全是所有加固的地基。攻击者拿到一个弱口令账号比攻破一个内核漏洞省事得多。手册这一章看起来只是几条命令实际上覆盖了密码生命周期的三个阶段生成时要求复杂度存储时把哈希藏起来使用时限制谁能用 root。三个阶段对应三套完全不同的底层机制。2.1 /etc/passwd 到 /etc/shadow密码哈希为什么必须「藏」起来早期 Unix 系统把用户名、UID、GID 和密码哈希全部放在 /etc/passwd 里这个文件权限是 644因为 ls -l、getpwnam 这类日常操作都要读取它做 UID 到用户名的映射。问题是哈希也跟着暴露了。拿到哈希的攻击者不需要在线猜密码可以直接离线跑字典或暴力破解工具速度只受限于 CPU 和 GPU。在线猜测会有失败次数限制和日志记录离线破解毫无痕迹这是本质区别。shadow 机制就是把哈希从公开文件挪到 root 专属文件。现代发行版默认启用 shadow但理解这个历史脉络才能看懂手册里这句「使用 shadow 来隐藏密文」的分量。下面这条手册里的检查命令值得逐段拆解awk -F: length($2)0 {print $1} /etc/shadow-F: 指定冒号作为字段分隔符/etc/shadow 每行是一个账号$2 是第二个字段即加密后的哈希串。length($2)0 表示该字段为空说明这个账号没有口令任何人登录都不需要密码。这条命令把所有空口令账号打印出来是加固后必须执行的验证动作。实际生产中还要配合 chage 查看口令有效期字段含义加固建议用户名登录标识清除不必要系统账号加密哈希不可逆密文不允许为空最近改动日距上次改密天数结合 PASS_MAX_DAYS 设置上限最短使用日改密最小间隔防止连环改密绕过历史记录最长使用日口令最大有效期90 天以内为宜过期前警告日提前提醒窗口7 天左右失效宽限日过期后还能登录的天数尽量调小口令复杂度这块手册说「至少 6 位并且包含特殊字符」是那个年代的基线。真正执行的机制是 PAM 的密码质量模块它会检查长度、字符类别、是否与用户名相似、是否在字典里。现代建议至少 12 位关键是让攻击者的离线破解成本远高于口令本身的价值。2.2 su 的 PAM 认证链为什么 wheel 组能独享 root多人共用 root 密码是审计噩梦出了事不知道是谁干的人走了还得全员改密。wheel 组的思路是「不共享 root 密码只共享 su 的资格」。它的实现完全靠 PAM 认证链弄懂这条链就理解了 Linux 认证框架的设计。手册给出的配置是往 /etc/pam.d/su 头部加两行auth sufficient pam_rootok.so auth required pam_wheel.so groupwheelPAM 按行序执行。第一行root 执行 su 时pam_rootok 直接判定成功sufficient 意味着命中就跳过后续模块所以 root 不受 wheel 限制。第二行非 root 用户走到 pam_wheel系统检查该用户是否属于 wheel 组不属于则认证直接失败——注意是 required失败即整体拒绝连密码都不用输入。把管理员加入 wheel 组的命令是 usermod -aG wheel 用户名-a 表示追加避免覆盖用户原有的次要组列表。这是手册里没细说的坑后面排查章会展开。为什么这种「认证链」设计比单纯改 su 权限更优越因为 PAM 模块可以自由组合。想要双因子就在中间插一个 pam_google_authenticator想记录审计就在后面挂 pam_tty_audit。加固不是改一个配置而是拼接一条你信得过的认证流水线。理解了这个再看系统里 sudo 和 su 之争就清楚了sudo 走的是另一个 PAM 栈加 sudoers 授权表审计粒度更细这也是为什么现代运维更倾向 sudo 而不是共享 root 密码。2.3 空口令检查与不可变文件锁把账号文件「焊死」删系统账号也是这章的重点。userdel adm、lp、sync、halt、news、uucp、operator、games、gopher、ftp这些账号平时不用但它们是服务运行的身份载体。保留一个没有密码的 sync 账号等于给攻击者留了一个可以切换身份的入口。特别说明 games 和 gopher不用 X Window 就删避免给无关服务提供执行身份。账号清理完最后一道保险是给密码文件上不可变标志chattr i /etc/passwd chattr i /etc/shadow chattr i /etc/group chattr i /etc/gshadow这条命令的机制和 chmod 完全不同属于文件系统 inode 层面的标志位我放在第 4 章专门拆解。这里只需记住顺序先建账号、改密码、配 wheel 组全部完成后再锁。锁完之后任何进程——包括 root 自己——都改不了这几个文件入侵者即使提权成功也没法清空密码、添加后门账号。3. 网络服务收缩tcp_wrapper、inetd 与最小监听面的取舍网络服务是攻击面最集中的地方。一份加固手册用了最大篇幅讲服务安全不是因为服务配置难而是因为服务是系统默认对外开放的窗口。这一章的核心逻辑只有一句话只开放需要的服务其余的从监听端口上消失。3.1 inetd 超级守护进程按需拉起的服务模型在 systemd 之前Unix 管理杂项服务靠的是 inetd后来是 xinetd。它的模型很优雅一个常驻进程同时监听多个端口某个端口收到连接请求时inetd 才把对应的服务进程拉起来会话结束进程退出。好处是内存占用小、日志集中、访问控制统一坏处是每次连接都有 fork 开销慢速攻击可以拖垮进程调度。/etc/inetd.conf 每行描述一个服务格式是服务名 套接字类型 协议 标志 用户 服务程序路径 参数。手册要求把注释符加到不需要的服务行首改完重启 inetd 让配置生效。这里藏着第一个认知关键点inetd 只管它托管的服务。像 httpd、sendmail、sshd 这类独立守护进程有自己的启动脚本注释 inetd.conf 对它们毫无影响。所以「注释完端口还在」几乎必然发生排查办法放第 5 章。xinetd 作为增强版把每个服务拆成 /etc/xinetd.d 下的独立文件支持 only_from、no_access、per_source 这类更细的访问控制。今天的发行版里 inetd 系已经边缘化但它的设计遗产还在按需启动、集中管控、先裁决后转发这套思路直接继承给了 tcp_wrapper 和后来的 socket 激活。3.2 tcp_wrapper先裁决、再转发的「二传手」机制tcp_wrapper 是 Linux 安全加固史上最值得研究的中间层。它的实现思路是把真正提供服务的 daemon 换成它附带的 tcpd 程序由 tcpd 先做访问控制通过后才把请求转交给真正的服务进程。拿 telnet 举例原来连的是 in.telnetd配置后变成连 tcpdtcpd 记录来源 IP 和时间检查访问控制列表通过则 exec 真正的 in.telnetd拒绝则直接掐断连接。完全就是「二传手」。访问控制由两个文件决定匹配顺序极其重要# /etc/hosts.allow 先查 sshd: 192.168.1.0/255.255.255.0 .example.com # /etc/hosts.deny 后查 ALL: ALL先查 allow命中就放行不再看 deny再查 deny命中即拒绝两个文件都没命中经典 tcpd 的默认行为是放行。这就是为什么手册强调要在 deny 里写 ALL: ALL 兜底——不写的话遗漏的服务等于裸奔。allow 文件里常见的语法是「服务名: 主机名或 IP 列表」支持网段和域名后缀匹配。PARANOID 模式是手册里容易被忽略的点。它要求客户端的主机名反查 IP 必须与连接源 IP 一致不一致直接拒绝。这能挡住一部分 DNS 投毒和源 IP 伪造代价是 DNS 抖动或反向解析没配好时正常用户也会被挡在门外。所以生产环境启用 PARANOID 前先确认内部 DNS 的反向区域是完整的。配置完用 tcpdchk 检查语法UDP 服务走 tcp_wrapper 时要用 nowait 选项否则同一时刻的并发 UDP 请求会被串行处理。今天很多服务——包括 sshd、sendmail——编译时已经带了 libwrap 支持意味着它们即使不走 inetd 启动也会读 /etc/hosts.allow 和 /etc/hosts.deny。这条知识在排查 SSH 突然连不上的问题时价值千金。3.3 R 服务信任模型为什么「 」是系统里最危险的两个字符R 服务rlogin、rsh、rcp是那个年代远程管理的标准方案但它的信任模型在今天是灾难。机制是这样的系统有一个 /etc/hosts.equiv 文件记录「可信主机」用户家目录下可以放 .rhosts 文件记录「可信主机可信用户」。来源地址匹配且用户匹配就直接免密登录。问题在于它信任的是「声称的来源」——TCP 源 IP 可以伪造DNS 可以污染于是手册反复强调的「 」就成了噩梦它表示任何主机上的任何用户都可以免密访问系统等于把门锁拆了。加固方法分两级。不用 R 服务就彻底关闭在 inetd.conf 注释 exec、login、shell 三个服务删除 /etc/hosts.equiv预生成 $HOME/.rhosts 并设置为 0000防止用户权限提升后自助创建。必须用 R 服务时在路由和防火墙上把 512、513、514 端口对外封死只允许内网可信段访问再用 tcp_wrapper 加一层白名单。SSH 之所以是更好的替代品是因为它把信任对象从「来源 IP」换成了「私钥持有者」伪造 IP 不再有用没有私钥就过不了密钥验证。这就是为什么手册建议用 ssh 替代 telnetd、ftpd、pop 等明文服务——明文口令在网络上是可截获的加密通道让嗅探失效这是网络层信任模型的一次升级。3.4 端口过滤清单信息泄露与反射放大的重灾区手册第 4.1 节给出了一张服务过滤清单按风险类型可以分成三类信息泄露、反射放大、直接溢出。这张表比命令更值钱因为它解释了「为什么要过滤这些端口」端口服务风险类型机制7echo反射放大伪造源 IP 让目标主机向受害机器回包放大流量11/15systat/netstat信息泄露暴露运行中的服务和网络统计69tftp无认证文件读写不验证身份的文件传输协议111/2049sunrpc/nfsRPC 溢出面历史上多次远程溢出且难以正确过滤513/514rlogin/rsh信任模型缺陷基于主机名信任可被伪造源 IP 绕过177xdmcp远程图形登录X 的远程桌面协议暴露认证界面6000x11监听劫持未授权时可读取其他用户 X 窗口内容过滤手段不只是关闭服务。手册特别指出如果这些服务确实要开放必须通过防火墙和路由把来源限制到信任 IP。配合 /etc/services 文件的不可变锁定chattr i防止端口映射被篡改——攻击者改了 /etc/services 里的端口号防火墙规则就会全部失效这是「配置层面被调包」的典型手段。配置完成后手册要求用网络扫描器从外部模拟入侵者扫描一遍这是验证加固效果的必要闭环你以为关了扫描器会告诉你真相。4. 内核参数与文件系统关 ping、禁源路由、锁住不可变位系统层加固的四个动作——关 ping、禁源路由、chattr 加锁、fstab 挂载选项——分别作用在 TCP/IP 协议栈、路由子系统、文件系统 inode 和 VFS 层。它们的共同点是改的不是应用配置而是内核行为。4.1 关闭 ping让主机在 ICMP 层隐身但别迷信隐身命令很简单echo 1 /proc/sys/net/ipv4/icmp_echo_ignore_all写入这个值后内核的 ICMP 处理路径不再对 echo request 返回 reply。效果是外部发 ping 探测时主机「无应答」基础的网络扫描和主机发现工具会把它当成不存在的地址。持久化要写进 /etc/sysctl.conf或者用 sysctl -w 在运行时设置sysctl -w net.ipv4.icmp_echo_ignore_all1必须说清楚边界这只是让主机在 ICMP 层面静默TCP 端口扫描照样能发现它。TCP 连接的存在性和端口开放状态不需要 ICMP 参与nmap 的 -sS SYN 扫描直接和 80、443、22 端口握手就知道主机活着。所以关闭 ping 的价值是削减探测面、让自动化扫描脚本多一步麻烦不是隐身术。监控系统如果只依赖 ping 判断存活关掉这个参数后会把活着的机器报成宕机这是运维事故的常见来源第 5 章会讲解决方案。更精细的做法是在防火墙层只丢弃非信任来源的 echo request。4.2 源路由与反向路径过滤为什么回包路径也能被劫持IP 源路由是 IPv4 协议里的一个选项发送方可以在 IP 头里指定数据包到达目标后「应该沿哪条路径返回」。合法用途是网络排障恶意用途就大了攻击者可以指定回包路径绕过防火墙、访问本不可达的接口甚至让本应直达网关的流量被中间节点截获。这就是为什么手册坚持要「禁止 IP 源路径路由」。Linux 下的关闭方式写在 sysctl 里# 关闭源路由 net.ipv4.conf.all.accept_source_route 0 net.ipv4.conf.default.accept_source_route 0 # 开启反向路径过滤 net.ipv4.conf.all.rp_filter 1 net.ipv4.conf.default.rp_filter 1rp_filter 的机制值得一提内核在收到一个数据包时会查路由表确认「从该接口返回这个源地址」是否合理不合理就丢弃。这能有效防范源 IP 伪造。但多网卡、非对称路由的机器上rp_filter 的 strict 模式会误杀正常流量此时要用 loose 模式2或针对具体网卡调整。这是一个典型的「安全与可用性」拉锯点开太严业务包被误丢开太松伪造源 IP 的扫描和探测就进来了。4.3 chattr i比 chmod 000 更底层的不可变标志普通权限模型有个众所周知的空洞root 可以无视一切文件权限位rwx 000 对 root 只是摆设。chmod 000 /etc/passwd 挡得住普通用户和入侵后的低权限进程挡不住已经提权的攻击者。chattr i 补上的正是这个漏洞。机制在文件系统层chattr 修改的是 inode 上的标志位FS_IMMUTABLE_FL。VFS 在执行 write、unlink、rename、append 操作前会检查这个标志只要置位就返回错误即使进程有 CAP_DAC_OVERRIDE 能力也不能绕过。要改动只能先 chattr -i 解除标志改完再锁回去。这等于给关键文件加了第二道锁第一道锁是权限位第二道锁在文件系统元数据里。手段作用层root 能否绕过适用chmod 000文件权限位能普通用户防护文件属主改 root访问控制能所有权约束chattr iinode 标志不能防篡改、防删除手册要求给 /etc/passwd、/etc/shadow、/etc/group、/etc/gshadow、/etc/services、/etc/hosts.equiv 全部加锁。代价是系统升级、用户管理这类合法操作也会被拦所以正确姿势是分阶段先完成所有账号和配置变更最后统一加锁要改动时先 chattr -i操作完立即重新加锁别让文件处于未保护状态过夜。4.4 fstab 挂载安全noexec 能挡住什么、挡不住什么文件系统加固的另一个维度是挂载选项。在 /etc/fstab 里给特定分区加上限制让即使有写入权限的目录也无法成为攻击者的执行平台。# /tmp 目录禁执行、禁设备节点、禁 setuid tmpfs /tmp tmpfs defaults,noexec,nosuid,nodev,size512M 0 0 # /home 同样策略 /dev/sda3 /home ext4 defaults,noexec,nosuid,nodev 0 2noexec 的机制是 VFS 层在 execve() 系统调用时检查挂载标志禁止从该文件系统启动任何可执行文件。nosuid 会让 setuid 位失效攻击者放置的带位程序变成普通文件。nodev 忽略设备文件防止普通用户 mknod 出块设备访问底层磁盘。一个高频误区必须划重点noexec 挡不住「解释器显式读取脚本文件」。比如 noexec 分区上一个脚本直接执行 ./evil.sh 会被拦但运行 bash /mnt/evil.sh 能跑因为这种模式下内核只检查 bash 能否执行脚本只是被当作普通输入读进来。所以 noexec 不是万能沙箱它提高的是直接放置二进制木马的成本防不住带解释器的间接执行。这是设计取舍不是 bug。NFS 导出也有对应策略。手册提到用 exportfs -o accessengineering,rodancer 控制导出范围用 ro、no_root_squash 等选项约束权限。showmount -e 可以自查本机导出了什么配合只允许内网访问 111 和 2049 端口能把 NFS 的暴露面压到最小。5. 加固排查照抄手册必翻车的五个经典场景这一章是从血泪经验里挑出来的。每个场景都是真实故障命令照手册抄了系统也按预期「加固」了结果翻车了。问题不在手册在于没理解机制。下面按「现象 → 原因 → 解决」拆解。5.1 hosts.deny 写入 ALL:ALLSSH 当场断连现象在 /etc/hosts.deny 里加上 ALL: ALL 之后新的 SSH 连接全部超时已经建立的会话还活着但一旦断开就再也连不上了。原因sshd 编译时带了 tcp_wrapper 的 libwrap 支持连接建立前会读 hosts.allow 和 hosts.deny。ALL: ALL 是兜底拒绝规则而 hosts.allow 里没有 sshd 的白名单条目于是 SSH 也被拒绝连密码验证环节都到不了。很多人以为 tcp_wrapper 只管 telnet 和 ftp这是最大的误解。解决先给 hosts.allow 写好允许规则再动 deny# /etc/hosts.allow sshd: 192.168.1.0/255.255.255.0改任何访问控制文件之前先开一个 tmux 之类的长会话备用断开也不受影响改完用新终端验证一次确认能连上再注销旧会话。血的教训是别在唯一的 SSH 会话里改访问控制那是给自己断后路。5.2 chattr i 之后useradd 报 Permission denied现象执行完 chattr i /etc/passwd /etc/shadow第二天新增用户时报错 passwd: Permission denied。原因useradd 要同时改写 /etc/passwd、/etc/shadow、/etc/group 三个文件而 FS_IMMUTABLE_FL 标志把写操作全部拦截了连 root 也不能例外。这是 4.3 节说的机制很多人没意识到它会约束合法的用户管理操作。解决账号体系调整要在加锁之前完成。如果已经锁了按顺序解锁再操作chattr -i /etc/passwd chattr -i /etc/shadow chattr -i /etc/group # 执行 useradd / passwd 等操作 chattr i /etc/passwd chattr i /etc/shadow chattr i /etc/grouplsattr 可以查看当前文件的锁状态养成操作前先 lsattr 的习惯能少踩很多坑。5.3 关掉 ping 之后监控系统判定主机「死亡」现象按加固手册执行 echo 1 /proc/sys/net/ipv4/icmp_echo_ignore_all两个小时后监控平台发来大量主机宕机告警。原因监控探活脚本默认用 ping 判断主机存活。ICMP 无响应并不代表 TCP 服务不可用——web 服务和 SSH 都好好的只是内核不再回复 echo 请求。监控系统把「不回应 ICMP」等同于「主机离线」误报就产生了。解决监控探活改用 TCP 端口探测比如对 22 端口做 TCP 连接判断。如果必须保留基于 ICMP 的监控就不要用全局的 echo 1改成防火墙规则按来源细分只对非信任网段丢弃iptables -A INPUT -p icmp --icmp-type echo-request -s 监控网段 -j ACCEPT iptables -A INPUT -p icmp --icmp-type echo-request -j DROP优先保证监控通路再谈隐藏探测面。这就是前面说的「隐身不等于安全」的落地取舍。5.4 注释完 inetd.conf端口却还在监听现象按手册把 /etc/inetd.conf 里不需要的服务全部注释重启 inetd 后用 netstat -an 一看23、25、80 端口还在 LISTEN。原因inetd.conf 只管它托管的那批服务。sendmail、httpd 这类 stand-alone 服务有独立的守护进程根本不走 inetd还有些服务在 xinetd.d 目录下有单独配置inetd.conf 注释了它们也不会消失。netstat -an 只告诉你「端口开着」不告诉你「谁开的」。解决用 ss 或 lsof 定位进程ss -tlnp | grep :23输出会给出监听进程的 PID 和名称顺着进程去停。还要用 chkconfig --list 或 systemctl 检查开机自启项把不用的服务从启动序列里移除。记住端口开放是表象进程和启动项才是根源。5.5 删了 hosts.equiv老旧的 rsh 自动化直接崩现象加固时按手册删掉了 /etc/hosts.equiv 并设置 .rhosts 为 0000第二天就有同事反馈调度任务全部失败日志里是 remote: permission denied。原因内部某个遗留的自动化系统还在用 rsh/rcp 做跨机分发它依赖 hosts.equiv 的信任关系完成免密登录。删掉信任文件等于切断了它的认证通路。解决先迁移到 SSH 密钥再删除信任文件。生成密钥、配置 authorized_keys、把批处理脚本里的 rsh 换成 ssh确认新链路跑通后才允许删除 hosts.equiv。这里的原则是「先立后破」替代方案落地之前旧机制不要动。加固是工程变更不是清理现场。6. 设计取舍一台服务器到底需要「多硬」把手册从头串一遍会发现所有加固动作背后站着一对相反的安全哲学默认允许还是默认拒绝。经典 tcp_wrapper 的设计默认是「没匹配就放行」所以必须用 ALL: ALL 兜底iptables 的默认链策略是 ACCEPT所以要做端口过滤就要显式写 DROP。而加固手册做的事本质上是把系统从隐式信任逐步改造成显式允许关掉不用的服务是显式允许那些保留的wheel 组限制 su是显式允许管理员hosts.allow 白名单是显式允许来源 IP。每一层收紧都在用可用性换取安全性——关 ping 换来探测面上的安静代价是丢掉 ICMP 监控chattr i 换来防篡改代价是每次用户变更都要解锁删 R 服务换来免密信任的根除代价是老脚本全部要改造。6.1 设计取舍加固的时效性背命令不如懂机制手册有鲜明的时代印记R 服务、sendmail、6 位密码、inetd.conf今天的主流发行版基本都换了赛道。但机制是长寿的PAM 认证链仍然是所有认证的骨架tcp_wrapper 的决策模型仍然活在 libwrap 里immutable 标志和 noexec 挂载选项依然是文件系统加固的核心手段。这就是为什么我读这类老手册的习惯是跳过命令先读机制——命令会过时但「把哈希藏起来、把信任白名单、把执行权限收窄」这些思路不会。拿一台新机器我的习惯是先 ss -tlnp 把监听端口逐个过一遍问自己这个端口该不该对外开放然后按最小权限原则处理账号和服务最后从外部用扫描器走一遍确认加固后的状态和预期一致。从那以后我每次装机都强制走这一遍踩坑的次数少了一大半。希望帮到你。本文还有配套的精品资源点击获取
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →