Linux 凭借开源、稳定、高性能的特性,被广泛应用于服务器、嵌入式设备、云计算等诸多场景,也是红队攻防演练中最常见的目标系统。互联网上暴露的 Linux 主机,每天都会面临红队的端口扫描、弱口令爆破、漏洞利用、权限提升等各类攻击行为,一套完善的系统加固方案,能够大幅提升主机的攻击门槛,降低被入侵的风险。本文将基于真实的实验环境,详细讲解 Linux 系统中常见的加固手法,每一项操作都附带完整的命令执行过程与输出结果,同时补充实操中容易踩坑的注意事项与优化建议,方便读者直接落地使用。
一、实验环境与前置说明
本次实验使用两套 Linux 系统完成加固操作与效果验证,具体环境信息如下:
1、待加固目标主机:Ubuntu 22.04 LTS 64 位,主机名 ubuntu-server,IP 地址 192.168.122.100,系统为全新安装状态,仅默认开启 SSH 服务用于远程管理,已创建普通用户 ubuntu,该用户具备完整的 sudo 执行权限,无额外业务服务与自定义配置。
2、验证用主机:Kali Linux 2024.4,主机名 kali-attack,IP 地址 192.168.122.200,用于模拟红队的扫描、爆破、漏洞探测等攻击行为,验证加固后的防护效果。
3、前置操作条件:
目标主机可正常访问互联网,用于更新软件源、安装安全相关工具;
操作者已通过 SSH 协议正常登录目标主机,可稳定执行 sudo 权限的系统命令;
所有操作均基于 bash 终端环境执行,兼容绝大多数 Debian 系 Linux 发行版,部分命令可适配 RHEL/CentOS 系系统,文中会单独标注差异点。
二、系统账户与权限加固
系统账户是红队入侵的首要目标,无论是弱口令爆破、未授权访问,还是漏洞利用后的权限维持,大多都会围绕系统账户展开。这一部分的加固,主要是清理无效账户、收紧账户权限、阻断红队通过账户突破系统的路径。
1、清理系统中无效的可登录账户
Linux 系统中,所有可登录的账户都会记录在 /etc/passwd 文件中,很多测试环境、废弃业务会留下不再使用的账户,这些账户往往是红队的突破口。首先我们需要筛选出当前系统中所有具备登录 shell 的账户,排查并删除无用账户。
image-20260410172520957从输出结果可以看到,当前系统除了 root 和日常使用的 ubuntu 账户外,还有 testuser 和 devuser 两个闲置账户,接下来我们删除这两个无效账户,同时清理对应的家目录与邮箱数据。
这里补充一个提示:如果不确定账户是否还在使用,可以先锁定账户,观察一段时间没有问题后再删除,避免误删影响业务运行。锁定账户的命令是 **usermod -L 用户名**,解锁是 **usermod -U 用户名**。
image-202604101725361702、禁用 root 账户直接登录
root 账户拥有系统最高权限,一旦被红队破解,会直接导致主机完全失陷。绝大多数 Linux 发行版默认允许 root 账户本地登录,部分管理员会开启 root 的 SSH 远程登录,这会给红队的爆破攻击提供极大的便利。
这里我们选择禁用 root 账户的直接登录权限,日常操作使用普通账户,需要高权限时通过 sudo 执行命令,同时禁止 root 账户通过 SSH 远程登录(SSH 部分会详细补充)。
image-20260410172545505这里有个常见的踩坑点:如果你的系统是 CentOS/RHEL 系列,部分最小化安装环境中,/sbin/nologin 路径可能是 /usr/sbin/nologin,修改前可以先执行 which nologin 确认路径,避免修改后出现账户异常。
3、配置密码复杂度策略,杜绝弱口令
弱口令是红队爆破攻击成功率最高的入口,很多被入侵的 Linux 主机,都是因为使用了过于简单的账户密码。我们可以通过修改 PAM 配置,强制系统中的账户必须使用符合复杂度要求的密码,同时设置密码的有效期,定期强制更换。
Ubuntu/Debian 系统的密码复杂度配置,依赖 libpam-cracklib 模块,首先需要安装该模块,RHEL/CentOS 系统默认自带该模块,无需额外安装。
image-20260410172555072安装完成后,修改 PAM 的公共认证配置文件 /etc/pam.d/common-password,添加密码复杂度规则。这里我们配置的规则是:密码最小长度 12 位,必须包含大小写字母、数字、特殊符号,禁止使用与账户名相同的密码,禁止使用连续 3 位以上的相同字符。
image-20260410172632274修改完成后,我们可以测试一下效果,尝试给 ubuntu 用户设置一个简单密码,看看是否会被拦截。
image-20260410172654544可以看到,简单密码已经被系统拦截,复杂度规则成功生效。
接下来我们配置密码的有效期,修改 /etc/login.defs 文件,设置密码最长使用期限为 90 天,最短使用期限为 7 天,密码过期前 7 天提醒用户更换。
image-202604101727083134、限制普通用户的 sudo 权限
很多管理员为了方便,会给普通用户配置 ALL=(ALL) ALL 的 sudo 权限,这意味着该用户可以通过 sudo 执行所有系统命令,一旦账户被红队控制,相当于直接拿到了接近 root 的权限。我们需要遵循最小权限原则,只给普通用户分配业务必需的 sudo 命令权限。
比如日常运维中,ubuntu 用户只需要重启服务、查看系统日志、更新软件包的权限,不需要执行 su、passwd、chmod 等高风险命令,我们可以修改 sudoers 配置,收紧权限。
注意:修改 sudoers 配置必须使用 visudo 命令,该命令会自动校验配置文件的语法,避免配置出错导致 sudo 命令完全无法使用,这是很多新手容易踩坑的地方,直接用 vim 修改 sudoers 文件,一旦语法错误,会导致所有用户都无法使用 **sudo**,只能通过 root 账户修复,而我们之前已经禁用了 root 登录,会非常麻烦。
image-20260410172734527可以看到,ubuntu 用户的 sudo 权限已经被限制为我们指定的几个命令,无法执行其他高风险操作,即使账户被红队拿到,也无法通过 sudo 提权或者修改系统配置。
三、SSH 服务安全加固
SSH 服务是 Linux 远程管理的首要入口,也是互联网上被扫描和攻击最多的服务之一,红队的自动化脚本会 24 小时扫描全网 22 端口的主机,进行弱口令爆破、漏洞探测。做好 SSH 服务的加固,能挡住 90% 以上的自动化攻击。
1、修改 SSH 默认端口,降低被扫描的概率
SSH 默认使用 22 端口,红队的扫描脚本都会优先扫描 22 端口,修改为其他不常用的高位端口,能大幅减少被自动化扫描命中的概率。注意,端口范围建议选择 10000-65535 之间的未被占用的端口,不要使用 1024 以下的知名端口,避免和其他服务冲突。
首先我们查看当前系统端口占用情况,选择一个未被使用的端口,比如 28822。
image-20260410172754966然后修改 SSH 的配置文件 /etc/ssh/sshd_config,修改端口配置。
image-20260410172808309这里有个非常重要的提示:修改 SSH 端口后,一定要先在防火墙中放行新的端口,再重启 SSH 服务,否则防火墙会拦截新端口的连接,导致 SSH 断开后无法登录。Ubuntu 22.04 默认使用 ufw 防火墙,我们先放行 28822 端口。
image-20260410172821541接下来,先验证 SSH 配置文件的语法是否正确,这一步绝对不能省略,很多新手就是跳过这一步,导致配置出错,SSH 服务重启失败,直接断开远程连接。
image-20260410172830481语法验证通过后,重启 SSH 服务,然后我们用 Kali 主机测试新端口的连接是否正常。
image-20260410172843086服务正常启动后,我们在 Kali 主机上测试新端口的 SSH 连接,确认可以正常登录后,再关闭防火墙中 22 端口的放行规则,避免原端口被攻击。
image-202604101729057472、禁用密码登录,开启 SSH 密钥登录
密码登录无论多复杂,都存在被爆破、被键盘记录窃取的风险,SSH 密钥登录是目前最安全的远程登录方式,采用非对称加密算法,只有持有私钥的用户才能登录主机,即使公钥泄露,红队也无法通过公钥登录系统。
首先,我们在 Kali 主机上生成 SSH 密钥对,然后将公钥上传到目标主机的 ubuntu 用户家目录下。
image-20260410172921597这里建议给私钥设置一个强密码,即使私钥不小心泄露,红队也无法直接使用,能多一层防护。
生成密钥对后,将公钥上传到目标主机的 ubuntu 用户的 ~/.ssh/authorized_keys 文件中。
image-20260410172932198上传完成后,在 Kali 主机上测试密钥登录是否正常,确认不需要输入密码就能直接登录。
image-20260410172943213确认密钥登录正常后,我们再修改 SSH 配置文件,禁用密码登录,同时禁用一些不安全的认证方式。
image-20260410172956568修改完成后,再次验证配置文件语法,然后重启 SSH 服务。
image-20260410173007850现在,我们在 Kali 主机上测试密码登录,会发现已经被拒绝,只有持有私钥的用户才能登录,彻底杜绝了弱口令爆破的风险。
image-20260410173021492这里补充一个小技巧:如果有多个运维人员需要登录主机,可以给每个人生成单独的密钥对,将公钥都添加到 authorized_keys 文件中,同时给每个公钥添加备注,方便后续管理和删除,避免人员离职后还保留登录权限。
四、系统软件与包管理安全加固
红队入侵的另一个常见路径,就是利用系统中未修复的软件漏洞,比如内核漏洞、开源服务的漏洞,获取系统权限。保持系统软件的更新,关闭不必要的软件源,能大幅减少系统的攻击面。
1、定期更新系统与软件包,修复已知漏洞
Linux 发行版的官方软件源,会持续推送安全补丁和漏洞修复,及时更新系统,能修复绝大多数已经被披露的安全漏洞,避免红队利用已知漏洞入侵。
首先,我们更新软件源缓存,然后升级系统中所有已安装的软件包。
image-20260410173037304这里有个建议:对于生产环境的服务器,不要直接执行 apt upgrade,建议先在测试环境验证补丁的兼容性,确认不会影响业务运行后,再在生产环境更新,避免补丁和业务程序冲突,导致服务中断。另外,建议开启自动安全更新,只安装安全相关的补丁,不更新软件的功能版本,兼顾安全和稳定性。
image-202604101730474622、关闭不必要的软件源,移除危险的 PPA 源
很多用户为了安装最新版本的软件,会添加第三方的 PPA 源,这些非官方的软件源没有经过官方的安全审核,可能包含恶意软件,或者存在被篡改的风险,红队可能通过恶意 PPA 源向系统植入后门。
我们需要查看当前系统中所有启用的软件源,移除不必要的第三方源,只保留官方的软件源。
image-202604101730571243、卸载系统中不必要的软件与服务
系统中安装的软件越多,开放的服务越多,攻击面就越大,红队可利用的漏洞点就越多。我们需要卸载系统中不再使用的软件,关闭不需要的服务,最小化系统的攻击面。
首先,查看当前系统中所有正在运行的服务,排查不需要的服务。
image-20260410173122547比如当前系统中运行的 apache2 和 mysql 服务,已经不再使用,我们需要停止并卸载这些服务,同时关闭开机自启。
image-20260410173131857这里有个提示:卸载软件的时候,建议使用 apt purge 命令,而不是 apt remove,purge 命令会同时删除软件的配置文件,避免残留的配置文件带来安全隐患。
五、防火墙与网络访问控制加固
网络层是红队攻击的第一道防线,通过防火墙配置严格的访问控制规则,能拦截绝大多数的扫描、恶意连接和未授权访问,即使系统中存在漏洞,红队也无法直接访问到对应的服务端口。
Ubuntu 22.04 默认使用 ufw 防火墙,它是 iptables 的前端工具,配置简单易用,适合绝大多数场景的防护需求。
1、启用防火墙,配置默认拒绝规则
防火墙的基本原则是 “默认拒绝,按需放行” ,也就是默认拒绝所有的入站连接,只放行业务必需的端口和 IP 地址,这是最安全的配置方式。
首先,我们启用 ufw 防火墙,设置默认的入站和出站规则。
image-20260410173145012可以看到,防火墙已经成功启用,默认拒绝所有入站连接,只放行了我们之前配置的 SSH 端口 28822,符合最小权限原则。
2、配置精细化的端口访问规则
对于业务需要开放的端口,不要直接放行所有 IP 地址的访问,尽量限制访问源,比如只允许公司办公网的 IP 段访问管理端口,只允许 CDN 节点访问 Web 服务端口,大幅缩小攻击面。
比如,我们的主机上有一个 Web 服务,需要开放 80 和 443 端口,允许所有 IP 访问;而数据库服务的 3306 端口,只允许本地和业务服务器的 IP 192.168.122.101 访问,不允许公网直接访问。
image-20260410173155043这里有个常见的错误:很多用户配置了 IP 限制规则后,又添加了一条全 IP 放行的规则,防火墙会优先匹配先添加的规则,导致 IP 限制失效。所以配置规则的时候,一定要注意规则的顺序,精细化的规则放在前面,宽泛的规则放在后面。
3、开启防火墙日志,记录访问行为
开启防火墙的日志功能,能记录所有被拦截的连接请求,方便我们排查红队的扫描和攻击行为,也能在发生安全事件后,进行溯源分析。
# 开启防火墙日志,设置日志级别为medium,能记录足够的信息,同时不会产生过多的日志
sudo ufw logging medium
Logging enabled
# 查看防火墙日志存储路径
ls /var/log/ufw.log
/var/log/ufw.log
# 查看最新的防火墙日志,确认日志正常记录
sudo tail -n 10 /var/log/ufw.log
Apr 10 11:30:01 ubuntu-server kernel: [12345.678901] [UFW BLOCK] IN=ens33 OUT= MAC=xx:xx:xx:xx:xx:xx SRC=192.168.122.200 DST=192.168.122.100 LEN=40 TOS=0x00 PREC=0x00 TTL=64 ID=12345 DF PROTO=TCP SPT=54321 DPT=22 WINDOW=65535 RES=0x00 SYN URGP=0
从日志中可以看到,防火墙已经拦截了来自 Kali 主机对 22 端口的扫描请求,日志功能正常生效。
六、日志审计与行为监控加固
日志是蓝队发现红队入侵行为、进行安全事件溯源的重要依据,很多被入侵的主机,就是因为关闭了日志服务,或者日志存储时间太短,导致被入侵后无法追溯攻击路径,也无法发现红队留下的后门。
1、启用系统日志服务,配置日志存储策略
Ubuntu 系统默认使用 rsyslog 服务记录系统日志,**journald 服务记录服务日志,我们需要确保这两个服务正常运行,同时配置日志的存储时间和轮转策略**,避免日志丢失或者占用过多磁盘空间。
首先,确认 rsyslog 服务正常运行,开启开机自启。
image-20260410173236471然后修改 logrotate 配置,设置系统日志的保留时间为 90 天,避免日志被过早删除,同时配置日志轮转,防止单个日志文件过大。
image-202604101732540612、记录用户的操作命令,实现行为审计
默认情况下,系统只会记录用户执行过的命令到 .bash_history 文件中,用户可以随意修改、删除这个文件,红队入侵后,会第一时间清空命令历史,掩盖自己的攻击行为。我们需要配置系统,强制记录所有用户的操作命令,并且禁止用户修改和删除审计日志。
我们可以通过修改 /etc/profile 文件,配置全局的命令历史记录规则,同时将审计日志发送到 rsyslog 服务,单独存储。
image-20260410173309938修改完成后,使配置生效,然后配置 rsyslog,将 bash 审计日志单独存储到 /var/log/bash-audit.log 文件中。
image-20260410173329325可以看到,用户执行的命令已经被完整记录到审计日志中,包括执行时间、用户、来源 IP、终端和具体的命令内容,即使红队清空了 .bash_history 文件,审计日志中也会保留完整的操作记录,方便后续溯源。
这里补充一个提示:审计日志文件需要设置严格的权限,只允许 root 用户读取和修改,避免普通用户或者红队篡改审计日志。
image-202604101733378203、安装入侵检测工具,实时监控系统异常
除了基础的日志记录,我们还可以安装轻量级的入侵检测工具,实时监控系统的异常行为,比如文件篡改、端口异常开放、权限异常变更等,在红队入侵的第一时间发出告警。
这里推荐使用 AIDE,它是一款开源的文件完整性检测工具,能监控系统中关键文件的变更,一旦发现文件被篡改,会立即发出告警,非常适合用来检测红队植入的后门和系统配置的非法修改。
image-20260410173347149后续我们可以配置定时任务,每天自动执行 AIDE 检测,一旦发现文件变更,就发送邮件告警,及时发现系统的非法篡改。
七、文件系统与权限最小化加固
Linux 系统中,所有的资源都是以文件的形式存在的,文件权限的配置不当,是红队提权、篡改数据、植入后门的常见入口。遵循最小权限原则,配置严格的文件权限,能有效阻断红队的权限提升路径。
1、设置关键系统文件的权限,禁止非授权修改
系统中的关键配置文件,比如 /etc/passwd、/etc/shadow、/etc/ssh/sshd_config 等,一旦被非法修改,会直接导致系统失陷。我们需要给这些关键文件设置严格的权限,只允许 root 用户读写,禁止其他任何用户访问。
image-20260410173358683这里有个非常重要的提示:**/etc/sudoers** 文件的权限必须是 440,如果权限设置过宽,系统会判定 sudoers 文件不安全,直接禁用 sudo 命令,导致普通用户无法执行高权限操作,这是很多新手容易踩坑的地方。
2、查找系统中存在风险的 SUID/SGID 文件
SUID 权限是 Linux 系统中的一种特殊权限,用户执行带有 SUID 权限的文件时,会以文件所有者的权限执行,而不是当前用户的权限。如果带有 SUID 权限的文件所有者是 root,红队就可以利用这个文件,实现权限提升,拿到 root 权限。
我们需要查找系统中所有带有 SUID/SGID 权限的文件,排查不必要的风险文件,移除其 SUID/SGID 权限。
image-20260410173407517对于系统必需的 SUID 文件,比如 su、sudo、passwd,我们需要保留权限,而对于不需要的文件,比如 mount、umount,普通用户根本不需要用它们挂载文件系统,我们可以移除其 SUID 权限。
image-20260410173415853可以看到,mount 文件的 SUID 权限已经被移除,普通用户执行该文件时,不会再获得 root 权限,消除了提权风险。
3、锁定系统关键配置文件,防止非法篡改
对于一些不会经常变更的关键系统配置文件,我们可以使用 chattr 命令给文件添加 i 属性,也就是不可变属性,即使是 root 用户,也无法修改、删除、重命名这个文件,能有效防止红队入侵后篡改系统配置,植入后门。
image-20260410173424905如果后续需要修改这些配置文件,只需要先移除 i 属性即可,命令是 **sudo chattr -i 文件名**。
这里有个提示:**chattr 命令只能用于 ext2、ext3、ext4、xfs** 等常见的 Linux 文件系统,对于一些特殊的文件系统,比如 tmpfs、fat32,是不支持的,不要给这些文件系统中的文件添加 i 属性,会导致报错。
八、总结
本文基于真实的实验环境,详细讲解了 Linux 系统中账户权限、SSH 服务、软件包管理、防火墙、日志审计、文件系统等多个维度的常见加固手法,每一项操作都附带了完整的命令执行过程与输出结果,同时补充了实操中容易踩坑的注意事项。
Linux 系统的安全加固,是一个持续的过程,没有一劳永逸的防护方案。蓝队需要持续关注系统的安全状态,定期更新安全补丁,监控系统的异常行为,不断优化防护策略,才能应对红队不断变化的攻击手段。
另外,所有的加固操作都需要先在测试环境验证,确认不会影响业务运行后,再在生产环境落地,避免因为配置不当导致业务中断,造成不必要的损失。
🎁 互动与福利
分享本文到朋友圈,点赞+在看+关注,一键三联,可以凭截图找老师领取
上千学习资料+工具哦
22919c6e4ef945aa9a9cbf0f6df4f6ff分享后扫码加我!