看到Linux系统安全这个标题可能有人会觉得又是一个老生常谈的话题。但实际带过线上环境、处理过入侵告警的人心里都清楚这个命题从来不过时真正能把系统安全做到位、出问题时能快速止血的人并不多。这篇文章不是我坐在电脑前翻文档写出来的理论而是基于多年实际维护、巡检、应急处理的经验整理的一套可以照着做的内容。我会从整体防守思路开始依次拆解系统加固、日志审计、自动化巡检、事件响应这几个核心环节每一步都给出具体命令、配置和参数也会讲清楚背后的逻辑和踩过的坑。无论是刚接手服务器的新手还是已有一定基础、想系统性补齐安全短板的工程师都可以从中找到能直接落地的部分。1. 先把威胁想清楚Linux安全的基本盘1.1 常见攻击路径与破窗效应做安全防御最忌讳的就是不知道自己在防谁。我常把攻击者比作小偷小偷踩点时如果发现这栋楼门禁森严、楼道亮着灯大概率会转向下一家。攻击者扫描全网服务器时也是一样的逻辑他们的自动化扫描脚本会优先关注那些端口开放异常、版本老旧、登录没有任何限制的主机。常见的攻击路径其实就几条暴力破解SSH密码针对22端口做字典撞库这是最普遍、最廉价的入侵尝试攻击者甚至不针对特定目标纯粹盲扫全网。利用未修补漏洞比如Web服务、数据库组件、内核驱动的公开漏洞一旦存在对应的版本特征就会被批量尝试利用。供应链与弱配置比如使用默认口令、密钥文件权限过大、不用的服务未关闭这些都属于破窗——系统里存在一处明显的松懈就可能被当作突破口深入。我自己经历过一个典型场景某台内网跳板机因为暴露了默认的SSH配置对外开放22端口后不到48小时就被扫描器盯上登录日志里全是来自境外IP的撞库尝试。那一刻我才真正意识到安全不是等出了问题再处理而是从系统上线第一天就要建立起完整的基线。1.2 安全基线的整体思路不少工程师一提到安全就想到买硬件防火墙、上态势感知平台、装EDR这些确实有用但对大多数中小规模系统而言成本高、运维复杂而且如果基础的主机安全都没做好这些高价设备也只是在带病运行的上层盖了张好看的保护网。我个人复现和总结下来一套靠谱的Linux安全基线应该包含四个层次收敛暴露面最小化安装、最小化开放端口、最小化账户权限让攻击者无从下手。身份与访问控制SSH密钥认证、sudo白名单、PAM限制、权限分离确保进来的人是本人且只能做该做的事。审计与感知能力完整记录关键行为日志对异常登录、文件变更、提权行为有可查询、可告警的渠道。加固与应急的闭环定期巡检配置漂移出安全事件时有明确的排查和处置流程。这四层里前两层是被动防守后两层是主动感知和响应。每次有人让我推荐安全方案我的建议都比较朴素先把这几个基础动作做完再做其他规划否则就是在沙滩上盖楼。2. 系统加固实操从账号到文件的逐个击破2.1 账户与权限最小化原则落地很多线上事故并不是外部攻击导致的而是内部权限失控。比如共用一个root账号、离职员工的账号未及时清理、普通用户被赋予了过高权限。我处理过的真实案例某团队所有开发共用一台测试服务器为了省事给某普通账号配了sudo ALL权限后来这个账号的密码被泄露到外部攻击者直接拿到了root权限。表面上这是一个密码泄露问题但根源在于权限设计不合理——如果每个开发者都只有自己目录和指定服务的权限即便账号泄露也不会造成全局沦陷。权限管理的落地细节关于账户的清理每次有人离开或有新的业务接入时都应该检查一遍 /etc/passwd 和 /etc/sudoers。常规操作是先禁用而非删除避免影响历史文件归属。# 锁定账号但不删除保留文件归属关系 usermod -L username # 查看所有具有登录Shell的账户 awk -F: $7 ~ /(bash|sh)$/ {print $1} /etc/passwdsudo白名单的设计避免使用ALL尽量细化到具体命令和参数。# 只允许重启指定服务而不是给予整个systemctl管理权限 username ALL(ALL) /usr/bin/systemctl restart nginx关键目录权限检查这个简单动作能挡住一大半利用弱权限文件提权的风险。# 检查全局可写目录 find / -xdev -type d -perm -0002 -print # 检查SUID与SGID文件异常出现的新SUID文件往往是入侵痕迹 find / -xdev -perm -4000 -o -perm -2000 -print对刚入行的读者多说一句最小权限原则的核心不是限制人而是控制风险边界。权限给得越宽出事时的爆炸半径就越大。2.2 SSH安全线上环境最危险的一扇门SSH是运维的生命线也是攻击者最常试探的目标。我见过太多服务器被入侵的起点就是一把弱口令或未限制来源的SSH服务。先列一组我实测过的加固配置每一行都有明确目的# 文件位置 /etc/ssh/sshd_config Port 32222 # 修改默认端口减少扫描命中率 PermitRootLogin no # 禁止root直接登录 PasswordAuthentication no # 禁用密码登录只允许密钥 PubkeyAuthentication yes MaxAuthTries 3 # 限制认证尝试次数 AllowUsers ops tony # 白名单仅允许指定用户登录 ClientAliveInterval 300 # 检测僵死连接 ClientAliveCountMax 2关于修改默认端口的争议我的观点是它确实防不住有耐心的人但能显著减少全网盲扫脚本的骚扰。我在实际环境中执行修改后/var/log/secure 里的暴力尝试数量从每小时几百次直接降到个位数效果立竿见影。密钥登录的部署逻辑也要说清楚。不少人复制公钥时喜欢用ssh-copy-id简单方便但要注意它的权限处理。如果因为操作不当导致某个普通用户目录权限被放大就等于给攻击者留了后门。严格做法是# 在目标服务器上手动配置 mkdir -p /home/username/.ssh chmod 700 /home/username/.ssh touch /home/username/.ssh/authorized_keys chmod 600 /home/username/.ssh/authorized_keys chown -R username:username /home/username/.ssh提示authorized_keys 文件的权限如果大于600sshd会直接拒绝该密钥登录。这个冷知识能帮你排查大量密钥配置没问题但就是登不上的诡异故障。最后再补一条容易被忽略的配置UseDNS no。这行能让SSH登录时的反向DNS解析跳过既加快登录速度又避免因DNS延迟或不可用导致登录超时。线上环境强烈建议开启。2.3 文件系统与内核参数加固文件系统和内核层面的加固容易被忽视但在权限被绕过时它是最后一道防线。独立分区与挂载选项是经典做法。比如 /tmp 目录经常被用来存放临时文件攻击者也常往这里写恶意脚本给 /tmp 单独分区并加上noexec,nosuid,nodev挂载选项可以从挂载层面阻止大部分利用行为。检查当前挂载状态mount -o remount,noexec,nosuid,nodev /tmp如果是全新系统建议在分区规划阶段就把 /tmp、/var、/home 拆分出来每个独立分区可以设置不同的挂载策略。内核参数加固部分有几个值得注意的参数。比如限制核心转储、禁掉IP转发除非确实需要路由功能、开启反向路径过滤等。下面这个配置片段可以直接落在/etc/sysctl.confnet.ipv4.conf.all.accept_redirects 0 net.ipv4.conf.all.secure_redirects 0 net.ipv4.conf.all.rp_filter 1 net.ipv4.tcp_syncookies 1 fs.suid_dumpable 0 kernel.core_uses_pid 1其中的rp_filter是反向路径过滤开启后内核会丢弃那些源地址路径与实际接口不符的包能在一定程度上防范IP欺骗。tcp_syncookies开启后能缓解简单的SYN洪泛。注意修改 sysctl 参数后要执行sysctl -p生效。另外在容器环境里很多内核参数受宿主机管控需要评估后决定是否需要调整。3. 日志审计与入侵检测发现问题才能止损3.1 日志体系搭建与集中管理如果说加固是关窗户那日志就是监控室内动静。没有日志的系统出了安全问题就是睁眼瞎。很多中小团队在日志这块的态度是装了 rsyslog 就算完事日志文件满了就删。这样其实丢掉了太多有价值的信息。我的习惯是先从最基本的几类日志开始梳理/var/log/messages系统通用日志服务报错、内核消息一般都在这里。/var/log/secure认证日志SSH登录、sudo执行记录都在这个文件里。/var/log/cron计划任务日志攻击者常利用后门任务实现持久化这里能发现蛛丝马迹。/var/log/audit/audit.log审计日志需要配合auditd服务启用。日志的集中管理方面我倾向于用 rsyslog 将关键主机日志转发到独立日志服务器既避免攻击者清理本地痕迹又能跨主机关联分析。配置也简单# 在客户端配置 /etc/rsyslog.conf 末尾追加 *.info;authpriv.none 192.168.1.100:514 authpriv.* 192.168.1.100:514第一行是明文传输第二行的表示TCP加密传输。生产环境建议用TCP方式避免UDP丢包。3.2 异常登录检测与Fail2ban实战单靠人工盯secure日志是不现实的自动化是第一需求。我的方案分为两层第一层是基础监控脚本用crontab定期扫描日志里的失败登录次数和异常IP。但更流行、更直接的处理是部署Fail2ban。它的原理很朴素监控日志里匹配的失败正则超过阈值就把来源IP加入防火墙拦截列表一段时间。一个针对SSH的典型配置如下# /etc/fail2ban/jail.local [sshd] enabled true port ssh filter sshd logpath /var/log/secure maxretry 3 bantime 86400 findtime 600参数含义maxretry在findtime时间内允许的最大失败次数超过即封禁。findtime时间窗口这里配置的是10分钟。bantime封禁时长86400秒即24小时。这里有个细节值得展开maxretry设成3会显得激进可能误伤正常用户。我在实际环境里通常先用5跑一两周观察确认误报率可控后再收紧到3。毕竟误封了自己的跳板机IP体验是比较痛苦的。第二层是检测新账户和新计划任务。入侵者拿到权限后通常会在系统里种下持久化后门最常见的动作就是添加账号或写crontab。我写过一个简易巡检脚本每天检查前一天的账户变化并推送告警#!/bin/bash # /usr/local/sbin/check_account.sh BASELINE_FILE/var/lib/account_baseline CURRENT_FILE/tmp/accounts_current awk -F: $3 1000 $7 ~ /bash|sh/ {print $1,$3,$7} /etc/passwd $CURRENT_FILE if [ ! -f $BASELINE_FILE ]; then cp $CURRENT_FILE $BASELINE_FILE exit 0 fi diff $BASELINE_FILE $CURRENT_FILE | mail -s 账户变更告警 opsexample.com cp $CURRENT_FILE $BASELINE_FILE经验之谈基线文件的保存位置要有保护建议放在root用户可读且普通用户不可写的目录否则攻击者可以先改基线再添加账户你的巡检就不会报警了。4. 自动化基线检查与工具选型4.1 安全工具横向对比与选型思路Linux安全领域的工具非常多但真正适合日常使用的其实可以梳理成一个小清单。我从实际效率角度出发把常用工具分为三类扫描评估类用于发现系统存在的潜在风险。工具用途特点OpenVAS漏洞扫描社区版可用覆盖全面扫描速度较慢Lynis安全审计一键式基线检查输出报告清晰适合日常巡检ClamAV病毒扫描偏向已知恶意特征对Linux后门有一定检出能力Lynis是我用下来性价比最高的工具。一条命令就能完成几十项检查从文件权限、用户配置到内核参数都会覆盖到输出结果里还会给出每项问题的建议级别。很适合作为半月一次的例行扫描项。实时防护类用于拦截和发现正在发生的攻击行为。工具用途特点Fail2ban暴力破解防护配置简单处理SSH/Web登录防护非常有效OSSEC主机入侵检测基于日志和文件完整性支持分布式部署Tripwire文件完整性通过哈希比对发现关键文件的篡改行为OSSEC和Tripwire这类文件完整性工具核心思路是你先给关键文件建立指纹库工具定期重新计算指纹并比对任何文件被改动都能检测到。备好这套工具特别适合那些上层文件权限配置得比较乱、担心关键配置被私自改动的场景。响应处置类用于事发后的排查和分析。工具用途特点lsof文件与进程关联分析查异常进程打开的配置文件非常有效netstat/ss网络连接分析快速识别异常外联strace系统调用追踪定位程序具体行为处理复杂后门时是利器4.2 自写基线巡检脚本的核心逻辑工具是别人的逻辑不一定匹配你的环境所以我一直建议团队维护一个自己的基线巡检脚本。这个脚本不追求大而全而是围绕最核心的安全指标做状态检查每天跑一次并输出结果。核心检查项可以包括关键配置文件是否被修改比如 /etc/ssh/sshd_config是否存在新增SUID文件是否有异常监听端口近期是否有非正常时间的登录记录系统计划任务是否被新增一个关键配置校验的实现思路是把当前文件的哈希和基线值比较#!/bin/bash # 核心文件哈希校验 HASH_FILE/var/lib/keyfile.sha256 FAIL_COUNT0 check_hash() { local file$1 echo $file if [ -f $file ]; then sha256sum $file /tmp/current_hash 2/dev/null fi } # 先创建一份 /tmp/current_hash再比对 # 生成当前哈希列表 : /tmp/current_hash for f in /etc/ssh/sshd_config /etc/passwd /etc/sudoers /etc/crontab; do check_hash $f done # 与基线比对 if [ -f $HASH_FILE ]; then diff /tmp/current_hash $HASH_FILE /dev/null 21 if [ $? -ne 0 ]; then echo [WARN] 关键配置文件被修改 FAIL_COUNT$((FAIL_COUNT1)) fi else echo 首次执行建立基线 cp /tmp/current_hash $HASH_FILE fi这个脚本里有一点需要注意你是在把当前哈希和基线比对基线文件本身如果被篡改就会失去意义。所以比较理想的做法是把基线存放在另一台独立的备份机上或者至少单独chmod 600权限并设置监控。端口和网络连接的检查也值得纳入脚本。利用ss命令可以实现# 列出所有监听状态的端口及对应进程 ss -tulnp | awk NR1 {print $4,$6} /tmp/listen_current # 对比基线 diff /tmp/listen_current /var/lib/listen_baseline端口监听出现新增项并不完全等于被入侵也可能是正常部署了新服务但配合变更流程来看这个脚本能在第一时间提醒你去确认这个变化是否经过审批。实操心得巡检脚本的告警不要只发邮件现在很多团队的邮箱并不会第一时间查看。我建议加上Webhook形式的IM机器人推送出问题后能第一时间弹出提醒处理实效会好很多。5. 安全事件排查实录从告警到处置5.1 一场真实的入侵排查过程有一次我在例行巡检时发现某台应用服务器的CPU持续接近100%但业务量并没有明显上升。登录到机器后top输出显示一个名为 /tmp/python-xyz 的进程占用了80%以上的CPU。当时的排查路径大致是这样确认进程归属用ls -l /proc/PID/exe查看进程对应的可执行文件路径发现它运行在 /tmp 下这个路径出现的高占用进程基本可以直接判断为可疑。查看网络连接执行ss -antp | grep PID后发现该进程持续和服务端的一个陌生IP通信。查看登录记录回头检查 last 和 secure日志发现两天前有一次来自陌生IP、凌晨时段的SSH登录记录。追查持久化后门检查 /etc/crontab 和 /var/spool/cron以及 /etc/rc.local最终在rc.local里发现一段下载恶意脚本并执行的指令。处置流程相对直接但必须按顺序执行# 1. 隔离网络先封禁外联IP iptables -A OUTPUT -d 203.0.113.x -j DROP # 2. 停止可疑进程并删除文件 kill -9 PID rm -f /tmp/python-xyz # 3. 清理持久化入口 sed -i /恶意下载地址/d /etc/rc.local # 4. 修改所有相关账号密码及密钥嫌疑范围内的都换掉 passwd root # 5. 拉取完整日志留证检查其他主机是否受影响整个过程里最容易被忽略的是排查命令本身的记录成本。我当时在排查时顺手把所有命令输出都记录到了本地文件后来复盘和写报告时就轻松很多。建议你也在排查时养成这个习惯。5.2 应急处置的几条铁律踩过几次坑之后我总结了几条安全事件处置时的基本原则也算对这段经历的复盘心得第一先隔离再操作。发现问题后最忌直接在机器上东点西点可能触发恶意进程的反制逻辑或不小心删掉了取证关键数据。第一步应该是断网或封禁可疑通信IP第二再展开排查。第二保全证据优先。取证和止损之间存在冲突但不建议一上来就kill进程。如果有条件先做一次系统状态快照查看并记录进程列表、网络连接、登录记录、文件修改时间然后把日志复制到外部存储。这样后面无论写复盘报告还是协助溯源都有据可查。第三一切口令和密钥都视为已泄露。发现被入侵后如果只改受害用户密码攻击者可能已经拿到其他账号的密钥。稳妥做法是把所有特权账号的密码、密钥都重生成一遍并对关键机器做全面排查。第四找到根因才算完事。清理文件、封禁IP都只是止血。没有找到攻击者是通过什么漏洞进来的强行恢复到之前的相同配置等于给下次入侵留了门。我见过一个团队连续两次被同一方式打穿的情况后来发现是因为第一次没做全量检查后门不止一处。真正闭环的标志是确认入口漏洞、完成修复、复查所有持久化位置。另外建议平时就把常见排查命令的内化清单准备好。这条清单不要临时搜索而是事先总结好放在运维知识库里保证出问题后的每一步操作都是心里有数的。用一个简化模板步骤核心命令检查目标定位可疑进程top→ls -l /proc/PID/exe异常名称、运行路径查看网络外联ss -antp异常IP、端口检查登录记录last、/var/log/secure登录来源、时间、用户检查计划任务crontab -l、ls /etc/cron.*新增定时任务检查开机启动systemctl list-unit-files异常服务检查用户/etc/passwd、awk -F: $30新增uid0账户写在最后Linux系统安全这件事做得好的话并不需要每天提心吊胆。它的本质就是一套可以重复执行、逐步收敛的过程多少人能进来、进来能做什么、做了会留下什么痕迹、出了事怎么最快响应。我个人在这些年比较深的体会是安全能力的高低很多时候不在于你买了多贵的工具而在于你是否把基础动作做到位了。配置一把密钥、给关键路径加密权限、日志集中起来、巡检写成自动化脚本这些听起来平平无奇的事情恰恰挡住了绝大多数不具针对性的攻击。要知道全网扫描脚本的目标从来都是那些配置松懈的机器你的服务器只要露出这块骨头有点硬的信号攻击者自然就会绕道。这篇文章里的所有配置和建议都是我实际用过的方案也期待你在落地时根据自己的业务场景做调整。如果你在实施过程中遇到其他问题或者想了解某个细节的更多玩法欢迎随时交流。
阅读完成 · 觉得有帮助?