1. 为什么每个运维人都该认真啃一遍 Linux 安全
说来有点惭愧,我早期带团队维护某电商平台的 Linux 服务器时,安全意识其实很粗糙。当时公司有个内部论坛,密码设得简单,SSH 端口用的是默认的 22,root 远程登录也开着。有一天某同事的办公电脑中了木马,攻击者很轻松地拿到了跳板机的权限,然后在内网横向移动,顺着运维线上的管理网段一直摸到了生产库。等我们发现时,数据库的 binlog 已经被删除,勒索提示直接写在了首页文件里。
那次事件之后,我才意识到,安全运维不是装个杀毒软件、设个复杂密码那么简单。Linux 系统安全技术是一套环环相扣的体系,它牵扯到账号权限、文件保护、网络隔离、进程隔离、日志审计、内核加固等多个层面。任何一个环节出现短板,攻击者都能顺着短板撕开口子。
这篇文章我不打算写成安全加固手册的堆砌,而是想把我自己从踩坑到理解、再到落地的一套思路完整讲清楚。无论你是刚接手 Linux 服务器的新人,还是已经维护了几百台实例的工程师,只要你还关心服务器“到底安不安全”,这篇文章应该能帮你把散落的知识点串成一张完整的网。
2. 账号与权限:一切安全的地基
2.1 最小权限原则不是口号,是要落到每个用户身上的
Linux 安全里最容易被忽视的,其实是账号体系的管理。很多人觉得“权限嘛,就是 root 和普通用户的区别”,但真实运维中,一个微小的授权偏移就可能在故障排查时被放大成灾难。
我在某公司维护过一套多租户平台系统,当时后端某模块运行在专用账号下,为了排查某个“诡异的内存溢出”问题,组内的某位工程师临时把这个账号加入到了sudo组。当时只想着“这个模块我负责,需要随时看日志”,问题定位完也没移除。结果一个月后,攻击者通过该模块的接口注入漏洞获取了 webshell,反向连接回来后发现这个账户拥有无密码 sudo 权限,瞬间拿到了整台机器的 root 控制权。
所以我的第一个强烈建议是:对系统内每一个账号做一遍“最小权限盘点”。包括:
- 用户是否还需要登录 shell;
- 用户是否真的需要 sudo 权限,需要的具体命令是什么;
- 用户是否已经被参与了某个已解散项目组但从未禁用;
- 服务专用账号与人工登录账号是否严格分离。
实际操作中,合理配合/etc/sudoers的精细配置能够显著减少风险。不要图省事直接给用户授予ALL=(ALL) ALL。我一般会写成:
# 允许 appdeploy 用户仅能执行部署脚本和 systemctl 管理特定服务 appdeploy ALL=(ALL) /usr/bin/systemctl restart webapp, /usr/local/bin/deploy.sh这样即使该账号被盗用,攻击者能执行的操作也被锁定在极小的范围内,横向提权的难度会大幅提升。
2.2 SUID/SGID 与特殊权限位:隐藏的提权入口
Linux 的权限模型除了常见的 rwx 之外,还有三个特殊权限位:SUID、SGID 和 Sticky Bit。其中 SUID 是最危险的:一个带有 SUID 的程序在执行时,其有效用户 ID 会被设置为文件属主,也就是说,如果某个 root 所有的程序开启了 SUID,普通用户执行它时就能临时拥有 root 权限。
我处理过一次真实案例。某台服务器上被放置了一个伪装成“系统日志查看器”的文件,文件名和路径很像/usr/bin/下的正常程序,但它的属主是 root,并带上了-rwsr-xr-x权限。攻击者通过另一个低权限漏洞上传了它,然后执行一个普通用户命名的 shell 脚本,就顺利完成了提权。
定期扫描整个文件系统中所有带 SUID/SGID 位的文件,是每台服务器都该做的例行安全巡检。比如,可以用一句话命令快速排查:
find / -xdev -type f -perm /4000 -o -type f -perm /2000 2>/dev/null然后逐条核对,确认哪些是操作系统安装时自带的二进制(如passwd、sudo等),哪些是第三方软件引入的,哪些看着就很可疑。对于可疑文件,立即移除执行权限并做哈希快照归档。
2.3 密码策略与认证加固
密码策略这块,很多人会觉得“设置强密码就够了”,但 Linux 系统里真正决定账户安全的是PAM(可插拔认证模块)体系。通过/etc/pam.d/下的配置文件,你可以控制系统层面统一的认证策略。
我建议将 PAM 的密码强度策略和登录失败锁定结合使用。一个常见的配置示例:
# /etc/pam.d/system-auth 中启用密码复杂度和历史记录 password requisite pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type= password sufficient pam_unix.so sha512 shadow nullok try_first_pass use_authtok remember=5同时在/etc/pam.d/sshd或system-auth中启用pam_faillock.so,让连续失败 5 次的 IP 地址及用户名在 15 分钟内被锁定。
还有一个容易被忽略的细节:系统默认的 root 邮箱、cron 任务所使用的系统账号,它们的登录 shell 往往是/bin/bash,但这些账号根本不需要交互登录。我通常会把所有非人工使用账号的 shell 改为/sbin/nologin,并且锁定密码:
usermod -s /sbin/nologin daemon usermod -L daemon这一步操作很简单,却是减少攻击面的有效手段。攻击者在拿到系统账号列表后,能尝试爆破的账号数量会大大减少。
3. 文件系统与数据保护:让敏感数据即使被拿走也读不懂
3.1 文件属性与不可变标记
Linux 文件系统层有一个比权限更底层的保护机制,就是chattr命令设置的扩展属性。i属性(immutable)表示文件无法被修改、删除或重命名,即使是 root 用户也不行,除非先移除该属性。这在抵御勒索病毒、防止关键配置被篡改时非常有效。
我在某台核心跳板机上,把/etc/passwd、/etc/shadow、/etc/sudoers等关键文件全部加上了i属性:
chattr +i /etc/passwd chattr +i /etc/shadow chattr +i /etc/sudoers这样即使攻击者拿到了 root 权限,想要向/etc/sudoers里写入一条提权规则,也会收到“Operation not permitted”的提示。不过要注意,系统的某些程序在正常运行(比如用户密码修改、添加新用户)时,可能也会因为这种保护而报错,需要临时chattr -i解锁,操作完再重新锁定。
同样的思路也可以用在 Web 目录。对于纯静态目录,可以给整个目录递归设置i属性或a(append only)属性,防篡改效果很好。但做动态站点时要注意,写入上传目录、缓存目录需要保留写权限,不能一刀切。
3.2 挂载选项:对不需要执行的文件系统关闭执行权限
文件系统挂载选项是我在实际排查渗透测试报告时反复强调的另一个细节。很多攻击者拿到低权限后,第一反应是下载一个反弹 shell 的二进制文件,然后在某个可写目录里执行它。如果服务器上所有可写分区都禁用了exec权限,这种攻击路径就会被轻松堵死。
我将/boot之外的大量非系统分区设置为挂载选项时禁用exec,例如:
# /etc/fstab 中对于临时目录和上传目录统一禁用执行 /tmp ext4 defaults,noexec,nosuid,nodev 0 0 /var/tmp ext4 defaults,noexec,nosuid,nodev 0 0 /home ext4 defaults,noexec,nosuid,nodev 0 0有一点要特别提醒:不要在/tmp上直接挂载 noexec 后忽视系统更新脚本。某些软件安装程序会在/tmp下编译临时二进制,或者某些低版本的 Java 进程会把临时可执行文件放在这里。如果出现程序启动异常,需要重新评估哪些目录必须在运行时执行业务生成的二进制文件,而不是一禁了之。
3.3 磁盘加密与敏感数据脱敏
磁盘加密是很多 Linux 用户在“安全”话题下最容易漏掉的一环。服务器物理被盗、硬盘被拔出后,如果没有磁盘加密,整个数据等同于裸露在攻击者面前。对于个人笔记本和重要工作站,建议直接开启 LUKS 全盘加密;对于服务器,至少要保证备份介质和保存敏感数据的分区是加密的。
我在实践中发现,LUKS 配合 TPM 2.0 自动解锁的方案,既保证了数据加密,又避免了每次开机都要手动输入密码的窘迫。在启动时利用 TPM 2.0 存储密钥,只有完整的引导链没有变化时才自动释放加密密钥。这样物理攻击者拿不到密钥,而正常运维重启也不会被锁在外面。
数据脱敏则是另一个维度:数据库里的用户手机号、身份证号、银行卡号等敏感字段,在非生产环境中一律用脱敏脚本随机替换。这个看似不是“Linux 技术”,但若不落地,任何文件系统层保护都防不住开发人员把导出数据拷贝到个人电脑。
4. 网络层防护:把不该出现的人和流量挡在门外
4.1 SSH 加固:易守难攻的第一道门
SSH 是几乎所有 Linux 服务器的远程管理通道,同时也是被暴力破解最频繁的服务。我见过太多因为 SSH 默认配置而被攻破的案例,而且大多不是靠极度复杂的 0-day,而是靠字典爆破和弱密码撞库。
先上个我目前在生产环境使用的 SSH 加固模板作为参考:
# /etc/ssh/sshd_config 关键配置 # 禁止 root 直接登录 PermitRootLogin no # 只允许 key 认证,禁用密码认证(如果是纯 key 环境) PasswordAuthentication no PubkeyAuthentication yes # 仅监听必要网段,不必全部监听 ListenAddress 192.0.2.10 # 最大认证次数限制 MaxAuthTries 3 LoginGraceTime 20 # 不同用户组/用户使用不同策略 Match Group admins PasswordAuthentication yes Match Address 192.0.2.0/24 PasswordAuthentication yes需要明确的是,完全禁用密码认证适合团队规模较小、密钥管理规范的场景。如果团队人多且有一线值守需求,可以先从“禁止 root + 密码延迟 + 失败锁定 + 限制来源 IP”开始过渡,逐步收紧。
还有一个大家容易忽略的参数是AllowUsers和AllowGroups。在sshd_config中明确列出允许登录的用户,比单纯依赖密码策略更靠谱。我一般会写:
AllowGroups sshlogin sudo这样只有sshlogin组里的成员才能登录 SSH。临时需要某同事登录时,把他加进组;离职或转岗时,直接从组里移除,同时保留完整的 audit 记录。
4.2 防火墙策略:从“默认放行”到“默认拒绝”
很多发行版默认防火墙策略是“放行一切流量”,这对于面向公网的服务器来说是巨大的隐患。我管理过的服务器都会第一时间把默认策略切换为“拒绝所有入站”,再按需放行特定端口。
以 nftables 和 firewalld 为例。如果你用的是原生 nftables,可以参考下面这套思路:
# 清空并重建规则表 table inet filter { chain input { type filter hook input priority filter; policy drop; ct state established,related accept iif lo accept ip protocol icmp accept tcp dport 22 accept tcp dport 443 accept } chain forward { type filter hook forward priority filter; policy drop; } chain output { type filter hook output priority filter; policy accept; } }注意这里的ct state established,related accept很关键,它确保出站连接的回包能进入服务器。很多人调试防火墙时发现“明明放行了 80 端口,但外部访问不了”,多数原因是把established,related漏掉了,导致回包被拦截。
如果使用 firewalld,则注意它默认的 zone 模型:建议把不信任的网卡全部划入dropzone,只将受信任网段划入trusted或自定义的internalzone。不要在publiczone 上放一堆服务端口,这会慢慢变成一团乱麻。
4.3 入侵检测与反暴力破解工具
即使在防火墙层面做了端口限制,SSH 依然可能遭遇大量来自不同来源 IP 的爆破。此时fail2ban是简单好用的自动封禁工具。
我用fail2ban时通常不只是用它默认的 sshd jail,还会针对 nginx、apache、postfix 等业务服务配置特定 jail。例如,针对 Web 登录接口的暴力破解,可以监控 access log 中的 401/403 状态:
# /etc/fail2ban/jail.local [web-login] enabled = true backend = systemd port = http,https filter = web-login logpath = /var/log/nginx/access.log maxretry = 10 findtime = 60 bantime = 3600对应 filter 定义在/etc/fail2ban/filter.d/web-login.conf中,匹配正则需要精确到 URI 和状态码。我建议在 Web 前端的日志里额外记录请求体中的用户名,便于后续对同一账号的异地登录行为做关联分析。
fail2ban 最大的好处是“发生了才动作”,不会误伤正常流量,但它的局限也很明显:一旦攻击者是分布式 IP,每一个 IP 只试一两次,限速就形同虚设。此时还需要结合后续章节的日志和流量分析体系,把行为分析上升到统计层面。
5. 进程与内核层安全:让攻击者即使进来也走不远
5.1 SELinux 和 AppArmor:强制访问控制
很多运维人对 SELinux 的第一反应是“麻烦”,因为一旦开启,各种服务可能突然无法读写文件。但从安全角度看,SELinux 提供的 MAC(强制访问控制)机制,能在进程被攻陷后显著限制其影响范围。
我记得某次在处理某 Java 应用的内存马时,攻击者通过反序列化漏洞执行了系统命令,但因为服务器上严格启用了 SELinux,且该服务被限制在自定义的httpd_t域内,攻击者尝试下载并执行 bash 脚本时直接被 SELinux 拦截。虽然 Web 服务本身被渗透,但攻击者始终无法提权,也无法访问其他目录的文件,这给应急响应争取了宝贵的时间。
要真正用好 SELinux,关键不是“关闭它”,而是“学会为服务写策略”。现代发行版大多支持audit2allow辅助生成所需的自定义策略模块。当遇到某个服务被 SELinux 拦截时,按照以下步骤排查:
# 1. 查看被拒绝的日志 ausearch -m avc -ts recent # 2. 用 audit2allow 生成临时放行模块 audit2allow -a -M myservice_local # 3. 启用模块 semodule -i myservice_local.pp不过要谨慎:audit2allow生成的是“放行已拒绝的一切”,容易把过多的权限也释放出去。更稳妥的做法是手动逐条分析 AVC 日志,只放行特定路径或端口的访问。
相比 SELinux,AppArmor 基于路径的配置对普通运维更友好。比如限制某业务进程只能访问某个特定目录:
# /etc/apparmor.d/usr.local.bin.myapp #include <tunables/global> /usr/local/bin/myapp { /etc/myapp/** r, /var/lib/myapp/** rw, /tmp/myapp_* rw, /bin/bash ix, }强制访问控制的价值在于“纵深防御”:即使攻击者成功利用了应用漏洞,也无法直接对系统做全局破坏。这是一层经常被“嫌麻烦”跳过、但关键时刻能救命的安全防线。
5.2 系统内核参数加固:通过网络栈和内存行为收缩攻击面
sysctl内核参数是很多人容易忽略、但是性价比极高的加固手段。通过调整 TCP/IP 栈的行为,可以在系统层面抵御一部分扫描和畸形包攻击。
一组常见的 sysctl 加固配置:
# /etc/sysctl.d/99-security.conf # 禁止 ICMP 重定向 net.ipv4.conf.all.accept_redirects = 0 net.ipv6.conf.all.accept_redirects = 0 # 禁止 IP 转发(如果不是路由器) net.ipv4.ip_forward = 0 # 开启 TCP SYN Cookie,预防 SYN Flood net.ipv4.tcp_syncookies = 1 # 减小 SYN 重试次数 net.ipv4.tcp_syn_retries = 5 # 关闭路由通告 net.ipv4.conf.all.send_redirects = 0 # 限制核心转储文件生成 kernel.core_uses_pid = 1 fs.suid_dumpable = 0特别是fs.suid_dumpable = 0,它防止带 SUID 的程序崩溃时生成可被普通用户读取的核心转储文件。否则攻击者可能利用一个精心构造的崩溃,从 core dump 中提取到内存里的敏感数据。
内核参数调整后一定要:
sysctl --system并实际验证一下sysctl net.ipv4.tcp_syncookies输出是否生效,避免配置写错后,系统重启应用新配置时报“未知键”错误。
5.3 容器与沙箱技术:动态隔离新型威胁
如果你用的是容器或 Kubernetes 环境,Linux 安全技术还会延伸到 namespace、cgroups、seccomp 等底层机制。默认情况下docker run并不会开启 seccomp 的严格策略,容器内的进程实际上可以发起部分危险的系统调用。
我在部署某个容器化微服务时,给所有非特权容器启用了默认的 seccomp profile,并关闭了容器内的 root 能力:
docker run -d \ --name myapp \ --security-opt seccomp=default.json \ --security-opt no-new-privileges \ --cap-drop ALL \ myapp:latest--cap-drop ALL会让你在容器内执行ping、mount、iptables等操作时遇到“Operation not permitted”,但正常工作不需要这些能力。如果业务确实需要绑定低端口,可以通过--cap-add NET_BIND_SERVICE精确放开单一能力。
对于比较关键的业务,还可以考虑用bwrap(bubblewrap)或者 user namespace 隔离,让普通用户也能运行受限沙箱。关键在于把“隔离”能力从小工具到容器,再到虚拟机形成梯度,让攻击者每一步都面临新的壁垒。
6. 日志审计与应急预案:看不见的入侵才最可怕
6.1 日志集中收集与完整性保护
安全的一个基本事实是:攻击者入侵后通常会清理日志。如果日志只存在本地,攻击者在拿到 root 权限后可以轻松删除关键日志文件,整个入侵路径就无从查起。所以日志安全的第一步是“集中化”。
我用rsyslog+ 独立的日志服务器方案比较成熟稳定。在客户端配置:
# /etc/rsyslog.conf *.* @@logserver.example.internal:514在日志服务器端开启可靠传输协议(RELP 或 TLS 加密),避免日志在传输过程中被篡改。同时,日志服务器本身的/var/log/目录建议挂载到独立磁盘,并启用只读或追加属性。
还有一个很细节但很有用的做法:给每台服务器的系统时间配置 NTP 同步,并强制 NTP 服务使用只读配置。没有统一精确的时间源,攻击者篡改日志时间线后,你根本无法分辨入侵发生的先后顺序,这在应急处置中会十分被动。
6.2 用 auditd 记录关键行为
Linux 自带的auditd工具是我做安全基线检查时最常用的利器。它能在内核层面记录文件访问、系统调用、用户权限变化等关键行为。
为一个关键业务文件启用审计,示例配置如下:
# /etc/audit/rules.d/audit.rules -w /etc/shadow -p wa -k identity -w /usr/local/bin/myapp -p wa -k myapp_integrity -a always,exit -F arch=b64 -S execve -k user_command注意事项:audit 规则过多会导致系统 I/O 和 CPU 的开销显著上升。我在大批量部署审计规则后,曾经因为规则过宽导致核心业务出现 200ms 级别的偶发延迟。因此建议:
- 优先针对敏感文件,而不是全文件系统;
- 启用
-b 8192调整 backlog 限制; - 消费端(如远程日志接收)必须有足够的性能余量。
有了 auditd 记录,入侵溯源时就能准确地回答“谁在什么时间通过什么进程访问了哪些文件”,在取证时是无可替代的证据链。
6.3 从日志到入侵检测的闭环思路
收集日志并不代表安全,日志必须被分析和响应才有意义。在没有复杂 SIEM 平台的情况下,我通常会保留一组定时的分析脚本,去扫描日志中的异常模式。
比较实用的异常排查组合命令包括:
# 登录失败来源 IP 聚合统计 grep "Failed password" /var/log/secure | awk '{print $(NF-3)}' | sort | uniq -c | sort -rn | head -20 # 查看当前所有外向连接 ss -antp | awk '$5 ~ /ESTAB/' # 查找最近被修改的可疑文件 find / -xdev -mtime -3 -type f \( -name "*.php" -o -name "*.jsp" -o -name "*.sh" \) 2>/dev/null但在实际应急响应时,光靠命令聚合可能在成千上万条日志面前力不从心。稍微成熟一点的环境,我建议部署开源的 Wazuh 或 OSSEC 作为 HIDS,并配合YARA规则对 webshell 做定期扫描。安全不是单点,而是“日志-告警-阻断-取证”的一个闭环。
7. 安全加固实战检查单:从零到一落地
7.1 初期评估与基线扫描
在正式开展加固之前,需要知道当前系统的“安全起点”。我一般会用lynis做一次基线扫描:
lynis audit system它会输出一个评分,并列出各种脱敏建议。注意:不能只是对着输出一条条执行,因为 lynis 的很多建议需要结合服务器角色(是数据库服务器、Web 服务器还是跳板机)去判断。有的建议在业务服务器上是合理的,在核心数据库上反而会增加过多重启风险。
拿到基线后,再结合业务进程和访问来源,把加固清单整理为三档:
第一档:立即执行(不涉及业务影响的)
- root 禁止远程登录
- 修改 SSH 默认端口或绑定来源 IP
- 关闭不必要的系统服务
- 防火墙默认拒绝
第二档:短窗执行(需要重启服务或短暂影响的)
- SELinux/AppArmor 策略调整
- 内核参数更新
- 文件系统挂载选项变更
第三档:规划执行(涉及业务改造的)
- 应用层代码加固
- 数据脱敏
- 容器安全策略
7.2 加固策略与业务可用性的平衡
安全加固最大的难点不是“会不会做”,而是“如何做到不影响业务”。我见过某团队为了让服务器通过某个等保检查,直接在 Java 服务的目录上开启了 noexec 挂载,导致 Java 运行时的临时 JIT 编译文件无法执行,服务直接崩溃。
正确的做法是:将业务数据和可执行文件分区隔离。例如,Java 应用的安装目录放在/opt/app/java(保留 exec),上传目录和数据目录放在/data/upload(noexec, nosuid),临时目录/tmp用 tmpfs 并设置 noexec。只有真正需要执行代码的分区继续保持可执行,其他分区一律收紧。
对于更新频繁的应用(比如每月发布多个小版本),加固后必须跑一遍发布流程验证。不要把安全策略“一次性配置完后不管”,它会随着业务的演进而逐渐失配。
7.3 定期复检与自动化巡检
定期巡检是一个系统工程。我通常的做法是用 Ansible 将安全基线固化为可重复执行的 playbook,角色包括用户管理、SSH 加固、防火墙规则、fail2ban 配置、auditd 规则、sysctl 参数等。将全网机器纳入统一管控,任何一台新增服务器上线,都按同一套 playbook 自动加固。
自动化巡检脚本至少应该覆盖如下检查项:
| 检查项 | 检查方法 | 期望值 |
|---|---|---|
| SSH 是否允许 root 登录 | sshd -T | grep permitrootlogin | no |
| 未锁定用户账号 | awk -F: '$7!="/sbin/nologin" && $1!="root"{print}' /etc/passwd | 无多余账号 |
| 存在 SUID 位异常文件 | find / -xdev -type f -perm /4000 | 仅有系统白名单 |
| 防火墙默认策略 | nft list ruleset | grep policy drop | drop |
| 关键文件属性 | lsattr /etc/shadow | 含 i/ a 属性 |
| 日志是否集中传输 | grep '@@' /etc/rsyslog.conf | 有远程地址 |
这些检查项不一定全部适用于所有机器,比如 GPU 训练服务器可能由于驱动原因,不能直接开启 SELinux。通过自动化巡检把差异转化为“例外清单”,比所有机器一刀切更靠谱。
7.4 常见问题与排查技巧实录
我在加固 Linux 服务器的过程中,经常遇到一些看起来不起眼但非常坑的问题,这里挑几个典型的:
问题一:修改 sshd_config 后无法登录
排查思路:
- 出现这种情况,多是因为
PermitRootLogin no和PasswordAuthentication no没有配合好。 - 建议在修改 SSH 配置之前,不要关闭现有会话。用
screen或tmux保留一个备用会话,然后执行sshd -t验证语法,再看systemctl reload sshd。 - 如果已经断了,去带外管理口(IPMI/iDRAC)打开会话修复,或通过云厂商的 VNC 控制台进入系统。
问题二:firewalld 和 iptables 叠加后规则冲突
我曾经在一台业务服务器上同时保留了 firewalld 和原生 iptables,它们通过 nft 后端都加载了规则集,导致部分端口出现“只通不通”的诡异现象。排查方式:
- 先确认当前系统使用的是
iptables-nft还是旧的兼容模式。 - 明确策略:要么使用 firewalld,要么使用原生 nftables,不要混用。
- 临时情况下,用
iptables-save和nft list ruleset对比,查看是否有重复链冲突。
问题三:SELinux 开启后服务起不来
这种问题通常表现为:Permission denied或/var/log/audit/audit.log中出现大量 AVC denied。处理方式:
- 先用
ausearch -m avc -ts recent确认具体被拒绝的对象。 - 判断是文件标不了正确的类型,还是端口上下文未定义。
- 对文件,使用
restorecon -Rv重置上下文;对端口,使用semanage port -a -t http_port_t -p tcp 8080添加策略。 - 切忌直接
setenforce 0,这会瞬间抹掉整个 MAC 防线。
问题四:日志轮转与磁盘占满
审计日志或应用日志一旦突然暴涨,容易被攻击者用来掩盖恶意行为。处理经验:
- 为
/var/log独立分区,设置容量阈值监控。 logrotate不能只配置了轮转,还要配置compress、delaycompress、maxsize和rotate份数。- 给 auditd 日志设置专用的
max_log_file和num_logs参数,并开启space_left_action告警。
8. 最后分享几个小习惯
这篇文章从账号、文件、网络、内核、日志等多个角度把 Linux 安全技术串了起来,但说一千道一万,安全本质上不是“装好工具”就结束的。用我自己的话说:安全是一种工程习惯,而不是一次性的加固项目。
我在实际运维中体会最深的是:定期做“红色小队”自检非常有效。每半年,我会用自己的测试环境模拟一次攻击路径:从弱口令尝试到提权利用,再到横向移动,看当前加固措施能否挡住。这种模拟多次帮我提前发现了问题,比如某台测试环境的目录权限过宽、某个旧版服务组件已经被公开披露漏洞但未升级等。
另外,每一次安全事件后,我都会把经验教训写成一篇复盘笔记,不只是记录“改了什么”,更会记录“当初为什么没发现”。安全这条路的敌人往往不是技术大牛,而是侥幸心理和管理盲区。如果你能把上面那些细节一点点落到自己的环境里,再结合定期的巡检和模拟攻击,至少能挡住常见的绝大多数攻击者。别嫌麻烦,经历过一次深夜抢修和安全通报,你就会明白,今天的每一步加固都值回票价。