网络安全运维一直是被误解最深的岗位,很多新人以为这份工作就是装个防火墙、装个杀毒软件,剩下的时间喝喝茶。真上手之后才发现,白天被各种合规检查追着跑,半夜被告警电话叫起来重启服务,第二天还要顶着黑眼圈写复盘报告。我做了这些年运维,最深的体会是:想告别996,靠的不是增加工时,而是把那些反复发生的“救火”场景,用十个核心操作提前消解掉。这篇分享我就把这十个网络安全运维操作完整拆开,从账户口令到日志监控,从端口收敛到备份恢复,每个操作都会讲清楚原理、步骤、命令和最容易踩的坑。零基础的人照着做也能把一台机器的安全水平拉起来,有经验的人可以当一次系统自查。这十件事做完,不是说你从此不加班,而是你加班的次数会肉眼可见地变少,因为大部分事故在你还没睡觉前就被例行操作拦住了。1. 先看思路:安全运维为什么能治加班1.1 救火型运维的死循环一个典型的“救火型”运维节奏是这样的:白天收到漏洞通报,临时开会确定修复方案,晚上业务低峰期上线补丁,结果补丁和现有环境冲突,回滚;第二天业务方反馈服务变慢,排查发现是日志把磁盘写满了;刚清理完日志,又收到暴力破解告警,发现某个测试账号密码过于简单被扫了。一整天下来,什么都没做成,但每一步都很忙。这种忙的本质是没有建立基线。所谓基线,就是一台机器在正常情况下应该长什么样:有哪些用户、开放哪些端口、跑哪些服务、日志存在哪、告警阈值是多少。没有基线,任何异常都需要临时判断,任何判断都会消耗时间,任何误判都会引发连锁故障。所以后面讲的所有操作,核心都是在帮你把“不确定”变成“确定”。1.2 从“看运气”到“看清单”我做运维的前两年,最怕的就是“未知的未知”——不知道哪个端口对外开着,不知道哪个账号三个月没动过,不知道备份到底能不能恢复。后来我把安全检查项整理成一张手工清单,每周五下午花一个小时逐项过一遍。第一个月问题很多,第二个月问题变少,第三个月基本能在半小时内跑完,而且大部分检查项都可以写成脚本自动执行。这时候你的加班就明显少了,因为绝大多数风险在变成故障之前已经被清掉了。零基础的人我建议按这个顺序学习:阶段学习内容目标基础期系统命令、用户权限、网络基础、防火墙概念能看懂机器的状态进阶期日志分析、加固基线、补丁管理、备份恢复能独立处理常见风险熟练期自动化巡检、入侵排查、应急响应演练能主导安全体系建设标题里说的十大操作,其实就是把这个学习路线落到了具体的工作里。2. 先管人:账户口令和SSH登录防护2.1 操作一:账户与口令基线检查为什么要先做账户?因为大部分入侵最终都要落到一个合法的账号上,要么是弱口令被猜中,要么是离职员工的账号还在用,要么是一个闲置的测试账号刚好有sudo权限。你不需要对抗神乎其技的黑客,你只需要先把大门上那把生锈的锁换掉。第一步是摸清系统里有哪些账户。看两个文件就能确定最终所有账户:# 查看所有本地账户 awk -F: '{print $1, $3}' /etc/passwd # 查看哪些账户有shell(有可能登录系统) awk -F: '$7 != "/usr/sbin/nologin" && $7 != "/bin/false" {print $1, $3, $7}' /etc/passwd拿到清单后重点核对三件事:uid为0的非root账户,这代表超级管理员权限。shell字段不是nologin的账户,这些账户理论上可以登录。密码字段是否为空。# 检查uid为0的账户 awk -F: '$3==0 {print $1}' /etc/passwd # 检查空密码账户 awk -F: '($2=="") {print $1}' /etc/shadow大多数发行版会把没有密码的账户显示为!或*,如果出现空字段,这个账户就是裸奔状态。对确认不用的账户,不要只删,最好先锁定并备份关键信息:# 锁定账户 usermod -L username # 设置账户永不登录 usermod -s /usr/sbin/nologin username # 如果环境允许,再加一个过期时间 chage -E 2026-01-01 username锁账户比直接删除安全,因为删除会连带历史属主信息,文件还能查出来,但账户没了容易影响后续审计追踪。口令策略方面,我建议至少做到:密码长度12位以上,90天轮换,连续输错5次锁定15分钟。这些都写在系统配置里:# 修改用户密码有效期 chage -M 90 -m 7 -W 14 username # /etc/login.defs 里设置默认值 PASS_MAX_DAYS 90 PASS_MIN_DAYS 7 PASS_WARN_AGE 14启用PAM的密码复杂度校验,在/etc/pam.d/common-password或pam_pwquality.conf里配置:minlen=12 dcredit=-1 ucredit=-1 lcredit=-1 ocredit=-1这段的意思是密码最短12位,且必须至少包含一位数字、一位大写字母、一位小写字母、一位特殊符号。刚推行的时候业务方会很抗拒,你的话术可以简单一点:不强制密码复杂度,下次被撞库恢复数据的成本远比你被骂几句高得多。2.2 操作二:SSH登录防护的完整配置SSH是运维的生命线,也是被爆破的重灾区。任何一台暴露在公网上的主机,一天被扫描撞库几千次都是家常便饭。日志里全是这种记录:Invalid user test from 203.0.113.5 port 51234 Failed password for root from 198.51.100.7 port 55210SSH加固的核心配置,我直接给出可以用的方案:# 编辑 /etc/ssh/sshd_config Port 2299 PermitRootLogin no MaxAuthTries 3 LoginGraceTime 30 PasswordAuthentication no PubkeyAuthentication yes AllowUsers ops admin解释几个关键项:Port 2299是变更默认端口,能挡掉一大波只扫22端口的脚本。PermitRootLogin no是禁止root直接登录,管理员用普通用户登录后su切换。PasswordAuthentication no是彻底关闭密码登录,只允许密钥登录。MaxAuthTries 3是限制单次连接的最大认证尝试次数。AllowUsers是白名单,只允许指定用户登录。改完之前一定要先做配置校验:sshd -t这个命令检查语法,如果报错就说明配置有问题,不要盲目重启。校验通过后再重新加载服务:systemctl reload sshd在你确认密钥登录完全正常之前,千万别关掉当前终端窗口,也别把登录方式切换成密码认证关掉。我见过不止一次,有人改完配置顺手一关,结果密钥权限不对,又没开密码登录,最后只能跑机房或者通过管理控制台重置。正确习惯是:改完配置后新开一个终端测试能否登录,确认没问题再退出旧会话。密钥生成命令也一并给出:ssh-keygen -t ed25519 -a 100 -f ops_ed25519 -C "ops-key-2025"公钥写到服务器的~/.ssh/authorized_keys,注意这个文件的权限必须是600,所在目录权限必须是700,否则SSH会拒绝读取:chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys如果团队人不多,还可以把登录来源IP收得更紧,在防火墙层面只允许固定来源访问,这个放到端口和访问控制里一起讲。3. 管住系统:补丁、端口和防火墙3.1 操作三:补丁与软件最小化补丁管理是很多人觉得“重要但没时间做”的事,等出了漏洞通报才临时上。实际上只要把补丁工作拆成固定的节奏,它就不那么占时间。我的方式是:每天快速检查一遍更新:apt list --upgradable或yum check-update。每周挑一个低峰期,把系统补丁按“测试机→非核心机→核心机”的顺序推。每次升级前用apt list --upgradable确认影响面,做个快照备份,升级失败能回滚。命令层面,以Debian系为例:# 查看可升级的包 apt list --upgradable # 先只下载不安装 apt install --download-only -y package_name # 低峰期安装 apt upgrade -y核心服务器升级前,我强烈建议先拍快照或者做一次完整备份。现实中我遇到过内核补丁装上后网卡驱动异常的情况,如果没有快照,恢复起来会非常痛苦。补丁这件事考验的从来不是安装速度,而是回滚能力。软件最小化是另一个被忽略的问题。很多机器装了一堆用不上的软件包,每个包都有依赖组件,每个组件都可能存在漏洞。常规清理思路:# 查看安装时间较久且最近没用过的包(仅供参考,需人工确认) awk '/^Install Date/{date=$4" "$5} !/^Install Date/{print} ' /var/log/dpkg.log | tail -50 # 查看当前监听端口对应的服务,找出不认识的 ss -tlnp我的原则是:一台服务器只干一件事。如果数据库服务器上装了web服务、开发工具、图形界面,安全暴露面直接翻倍。卸载软件时顺便清理不需要的系统服务,后面讲端口收敛时会用到。3.2 操作四:端口与服务收敛端口不进则退,多开一个端口就多一个被探测的入口。我最常遇到的问题是:数据库装了bind-address=127.0.0.1还好,改配置时不小心监听在所有接口上;或者测试环境临时起了个服务,线上的防火墙规则没更新,服务一直对外暴露。排查端口第一步,用ss替代已经过时的netstat:ss -tlnp这个命令会显示当前所有TCP监听端口和对应进程。看到异常的高位端口,或者不应该对外暴露的数据库、容器管理端口,要立刻确认来源进程。确认服务名称后,停止并禁用不需要的服务:# 停止服务 systemctl stop myservice # 禁止开机自启动 systemctl disable myservice有些服务是其他服务的依赖,不要一上来就disable。先用systemctl list-dependencies看依赖树,确认没有连带影响再动手。还有个常见场景:MySQL这类组件默认监听3306,它本身没问题,可怕的是监听在0.0.0.0上。正确姿势是让数据库只监听内网IP,甚至仅本机回环:bind-address = 127.0.0.1如果应用和数据库不在同一台机器,至少要限定在内部网络地址,再由防火墙控制访问来源。我见过最夸张的一次是Redis没设密码,监听在公网IP的6379端口上,被扫到之后直接被写入了定时任务。这个事故后,凡是有类似中间件暴露风险,我都建议遵循同一原则:默认不对外,需要对外再明确配置。3.3 操作五:防火墙白名单与默认拒绝防火墙的核心思想很简单:先拒绝所有,再放行必要。很多服务器默认策略是允许全部,这相当于把安全员的筛选工作全交给了应用,风险太大。在用了很多年iptables之后,我的习惯是在多数服务器上用firewalld,因为它分层清晰,容易管理。开局先看现状:firewall-cmd --list-all然后把默认zone设置为drop或减少放行规则:# 默认拒绝绝大多数入站 firewall-cmd --set-default-zone=drop # 放行SSH(注意端口如果改过,这里也要同步) firewall-cmd --permanent --add-service=ssh # 放行固定来源访问某个端口,例如只允许内部网段访问数据库 firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.0.0.0/8" port port="3306" protocol="tcp" accept' # 重新加载使配置生效 firewall-cmd --reload如果是用iptables直接管理,可以这样建立一套基础规则:# 清空并设置默认策略 iptables -P INPUT DROP iptables -P FORWARD DROP # 放行已建立的连接,避免误伤正常会话 iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT # 放行回环 iptables -A INPUT -i lo -j ACCEPT # 放行SSH iptables -A INPUT -p tcp --dport 2299 -j ACCEPT操作顺序非常关键:先放行必要端口,再设置默认拒绝。如果顺序反了,配置下发的瞬间你的SSH就断了。就算顺序正确,批量操作前也要先把现有规则备份:iptables-save > /root/iptables-backup-$(date +%F).txt防火墙规则属于“改动小、影响大”的典型,任何变更都要留后路。我还会在规则里加注释,写明这条规则是哪天为什么加的,否则三个月后回看配置,根本不知道某条规则能不能删。4. 看得见威胁:日志、告警与完整性校验4.1 操作六:日志统一采集与留存安全运维里最怕的不是没日志,而是日志散落在每台机器上,出事时找半天才发现某台机器日志只留了两天。统一采集日志,本质上是把“事后翻箱倒柜”变成“平时一眼看清”。Linux自带systemd-journald,配合rsyslog,可以满足大多数中小环境的日志集中需求。基础配置如下:# journald限制最大占用 journalctl --vacuum-size=500M # 永久化存储,编辑/etc/systemd/journald.conf Storage=persistent SystemMaxUse=500M MaxRetentionSec=90如果机器多,可以配置rsyslog将日志转发到集中的日志服务器:# 在/etc/rsyslog.d/remote.conf里加上 *.* @192.168.10.20:514集中日志服务器那边打开514端口接收即可。这里要注意防火墙,尤其是rsyslog端口如果暴露在公网,会被用来做日志伪造或流量放大,一定要限制访问来源。日志量估算是个实操难点。我用一个具体例子:假设每秒产生1000条日志,每条平均1KB,一天的日志量就是约86GB。如果你的磁盘分配只有100GB,那不到两天就会写满。所以在做日志留存前,先算清楚三个数字:每天产生多少量、希望保留多久、磁盘能装多大。据此设定轮转策略和告警阈值:# 日志轮转示例,/etc/logrotate.d/nginx /var/log/nginx/*.log { daily rotate 90 compress delaycompress missingok notifempty create 640 nginx adm }需要重点留存的日志包括:认证日志、audit日志、sudo记录、数据库慢查询、应用的登录/支付/管理操作记录。每一类都想清楚:出问题时我要从哪里查清楚“谁在什么时间做了什么”。4.2 操作七:暴力破解与异常登录检测日志集中了之后,下一步就是让它自动告诉你“有人正在撞门”。最经典的暴力破解特征就是短时间内同一个源IP对SSH大量尝试失败。用开源工具fail2ban就能拦截,配置不复杂。安装后,在/etc/fail2ban/jail.local里写:[sshd] enabled = true port = ssh filter = sshd logpath = /var/log/auth.log maxretry = 5 findtime = 600 bantime = 600 ignoreip = 127.0.0.1/8 10.0.0.0/8 172.16.0.0/12参数含义:10分钟(findtime)内同一个IP失败5次(maxretry)就封禁10分钟(bantime)。内网地址加进ignoreip,避免误伤正常办公出口。启动后查看状态:fail2ban-client status sshd输出里能看到被封禁的IP列表,记为违规IP,之后可以在防火墙层做长期拒绝。这里有一个典型坑:如果你们整个办公室通过同一个出口IP访问服务器,这个IP很容易因为某个人输错几次密码被fail2ban封掉,然后全办公室都上不去。所以ignoreip一定要配置好,至少把你的办公网和运维跳板机网段放进去。除了fail2ban,我还会每周手动看一次认证日志,重点是那些从未见过的用户登录记录:# 最近一条登录记录 last -n 20 # 查看近期所有登录会话及其来源 last -i -n 50 # 检查登录失败记录 lastb -n 50另外,useradd和sudo日志也要纳入主动巡检。如果有人频繁切换root并执行敏感命令,应该能够直接从/var/log/auth.log或audit日志里拉出一条完整时间线。4.3 操作八:文件完整性校验与防篡改木马和后门最常干的事就是替换核心命令、修改配置文件、在启动项里加坑。文件完整性校验的作用是:定期对关键文件做哈希比对,发现任何异常变化立刻告警。AIDE是这类工具里经得起时间考验的一个。初始化数据库:# 安装后先初始化,生成数据库 aide -i # 生成的数据库文件路径在 /var/lib/aide/aide.db.new.gz mv /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz之后每次比对:aide --check初次初始化后,先跑一次对比,会有大量误报,因为你自己的配置更新、日志轮转都会触发差异。需要把动态目录排除掉,在/etc/aide.conf里增加规则,例如:!/var/log/.* !/var/tmp/.* !/proc/.* !/sys/.*然后重新初始化数据库,再启用计划任务,每周自动比对并发送结果。auditd是另一个好用的内核级审计组件,适合持续监控关键路径:# 监控/etc/passwd和/etc/shadow的写和执行行为 auditctl -w /etc/passwd -p wa -k identity_changes auditctl -w /etc/shadow -p wa -k identity_changes # 查看审计记录 ausearch -k identity_changes -ts recent这类监控的核心思路就是“预警而非追溯”。你不想在系统被入侵两天后才发现文件被改了,更希望改动发生的当下就收到告警。如果你有日志监控平台,把AIDE输出的告警接入进去,效果会好很多。5. 留好后路:备份恢复和应急响应5.1 操作九:备份策略与恢复演练备份和恢复听起来人尽皆知,但多数人的备份方案经不起一次真正的故障。我做过的教训很深刻:某次业务系统故障,备份文件确实在,但恢复时发现备份脚本只备份了数据库文件,没备份配置文件;更麻烦的是,密钥文件缺失导致备份内容无法解密。先记住一个硬性原则:3-2-1。数据至少3份副本,存2种不同介质,其中1份放异地或离线。这里“离线”强调的是机房断电、勒索病毒加密等极端事件下的最后防线。常用备份工具组合:文件备份:rsync + hardlink / duplicity / borgbackup数据库逻辑备份:mysqldump / pg_dump系统级快照:云平台快照或本机LVM快照# 示例:使用rsync做文件级备份 rsync -av --delete /data/ /backup/data/ # 示例:MySQL逻辑备份 mysqldump -uxxx -pxxx --single-transaction --routines --triggers > /backup/mysql-$(date +%F).sql关于备份窗口,需要估算。假设数据量2TB,千兆网络理论峰值大概是每秒110MB左右,全量备份理想状态也要5小时以上。所以备份设计从来不是“每天全量”,而是“周一全量+每天增量”或者“每天增量+周末全量”。增量备份的恢复顺序和依赖关系要写清楚,不要等到故障才发现少了一个中间环节。恢复演练才是重点。我建议至少每季度做一次演练,在隔离环境里从备份完整恢复一套系统,记录三个关键指标:恢复需要多长时间(RTO)恢复出来的数据会丢多少(RPO)恢复后应用能否正常启动把演练结果记下来,比备份任务成功日志重要十倍。因为你最终交付的不是“备份文件”,而是“可用的恢复能力”。5.2 操作十:应急响应SOP与模拟演练第10个操作,是把之前的成果固化成一整套应急流程。没有预案的攻击就像是火警响了才现找灭火器,很容易手忙脚乱再添新错。事件分级可以先按影响定义:级别定义响应要求P1核心业务中断、数据泄露或勒索加密15分钟内启动应急,隔离受影响系统P2疑似入侵、异常登录、重要配置被篡改30分钟内初判,保留现场,上报P3低危扫描、误报告警、合规整改项当天确认,按周整理响应流程按六步固定下来:发现→上报→隔离→取证→恢复→复盘。发现:告警触发的源头是什么,日志保留在哪里。上报:通知到谁,用哪个群、哪条电话线,话术预先写清楚。隔离:防火墙层直接封禁异常IP,必要时断网或挂载只读,先止血再排查。取证:复制日志、保存进程状态、快照内存信息,按时间线梳理。恢复:从干净备份重建,收紧登录入口,变更所有受影响密码。复盘:痛点是规则未覆盖,还是监控阈值不当,还是人的操作习惯问题,形成改进项。这里的关键是预案要具体到“谁在什么条件下执行哪条命令”。不要写“迅速切断网络”,要写“在防火墙执行firewall-cmd --permanent --add-rich-rule去屏蔽来源IP,然后reload”。不要写“联系相关人员”,要写“电话联系运维负责人,若未响应则升级到平台负责人”。只有能直接照着执行的才算预案,否则只是文档。团队建议每月做一次模拟演练。场景可以轮流设计:比如“某服务器多了一个公网监听端口”“某个管理员账号在凌晨三点登录”。演练的价值不在于动作多专业,而在于发现预案里那些没说清的地方。我做完几次演练后,明显感觉到平时战战兢兢的加班变少了,因为真出事时大家知道第一步干什么。6. 常见问题速查与避坑实录表面现象可能原因排查方向避坑建议远程登录突然失败禁用了密码登录但密钥权限不对确认authorized_keys权限,控制台登录检查sshd配置改配置前先新开终端测试业务访问被断防火墙规则顺序错误,默认拒绝先生效查看iptables/firewalld规则命中计数变更前必须备份规则,先放行必要端口再设默认拒绝磁盘被日志写满日志量估算不足,轮转策略缺失df -h看使用率,du找大日志先算清每日日志量和保留周期,再定磁盘分配办公网出口IP被fail2ban误封阈值太低,共享出口IP触发条件fail2ban-client status 查看封禁列表ignoreip加上办公网和跳板机网段AIDE误报太多排除规则没写好,动态文件被纳入监控查看审计日志确认触发文件初始化前关闭动态路径,更新基线后再启用备份恢复失败备份不完整或缺少配置文件在隔离环境做完整恢复验证每季度做恢复演练,记录RTO和RPO还有一些实操细节值得单独提醒。不要为了“安全”把所有服务都塞进同一台跳板机,跳板机被攻破等于内网被打穿。重要系统的分批补丁窗口之间保持至少1小时,万一第一批出问题,你还有时间处理,不用全网一起回滚。权限变更和防火墙规则变更,尽量走固定变更流程,记录好每一笔操作。变更是事故最大的来源,也是最容易被忽视的风险点。7. 我的经验与建议做了这些年网络安全运维,我最大的转变是:从追求“会不会被入侵”变成追求“入侵发生之后我能不能在10分钟内发现问题并在1小时内恢复”。这两者的技术动作差不多,但心态完全不一样。现在我会建议刚入行的朋友,不要一上来就冲锋各种高级防护设备,先把这十件事做到位——账户管起来,SSH锁上,端口收敛,日志能看到,备份能恢复,应急有流程。这些看起来基础,但基本上能解决日常80%以上的安全风险。最后再分享一个小技巧:把这十项检查做成一个自检脚本文档,每月跑一遍,结果发给团队。不需要所有人都懂安全,只需要所有人都在同一份检查清单里看到偏差。很多时候告别996不是靠某个单点操作,而是靠每天周二下午那雷打不动的20分钟巡检,把问题提前拦在事故发生之前。这套东西坚持三个月,你会回来感谢当时的自己。
网络安全运维一直是被误解最深的岗位,很多新人以为这份工作就是装个防火墙、装个杀毒软件,剩下的时间喝喝茶。真上手之后才发现,白天被各种合规检查追着跑,半夜被告警电话叫起来重启服务,第二天还要顶着黑眼圈写复盘报告。我做了这些年运维,最深的体会是:想告别996,靠的不是增加工时,而是把那些反复发生的“救火”场景,用十个核心操作提前消解掉。这篇分享我就把这十个网络安全运维操作完整拆开,从账户口令到日志监控,从端口收敛到备份恢复,每个操作都会讲清楚原理、步骤、命令和最容易踩的坑。零基础的人照着做也能把一台机器的安全水平拉起来,有经验的人可以当一次系统自查。这十件事做完,不是说你从此不加班,而是你加班的次数会肉眼可见地变少,因为大部分事故在你还没睡觉前就被例行操作拦住了。1. 先看思路:安全运维为什么能治加班1.1 救火型运维的死循环一个典型的“救火型”运维节奏是这样的:白天收到漏洞通报,临时开会确定修复方案,晚上业务低峰期上线补丁,结果补丁和现有环境冲突,回滚;第二天业务方反馈服务变慢,排查发现是日志把磁盘写满了;刚清理完日志,又收到暴力破解告警,发现某个测试账号密码过于简单被扫了。一整天下来,什么都没做成,但每一步都很忙。这种忙的本质是没有建立基线。所谓基线,就是一台机器在正常情况下应该长什么样:有哪些用户、开放哪些端口、跑哪些服务、日志存在哪、告警阈值是多少。没有基线,任何异常都需要临时判断,任何判断都会消耗时间,任何误判都会引发连锁故障。所以后面讲的所有操作,核心都是在帮你把“不确定”变成“确定”。1.2 从“看运气”到“看清单”我做运维的前两年,最怕的就是“未知的未知”——不知道哪个端口对外开着,不知道哪个账号三个月没动过,不知道备份到底能不能恢复。后来我把安全检查项整理成一张手工清单,每周五下午花一个小时逐项过一遍。第一个月问题很多,第二个月问题变少,第三个月基本能在半小时内跑完,而且大部分检查项都可以写成脚本自动执行。这时候你的加班就明显少了,因为绝大多数风险在变成故障之前已经被清掉了。零基础的人我建议按这个顺序学习:阶段学习内容目标基础期系统命令、用户权限、网络基础、防火墙概念能看懂机器的状态进阶期日志分析、加固基线、补丁管理、备份恢复能独立处理常见风险熟练期自动化巡检、入侵排查、应急响应演练能主导安全体系建设标题里说的十大操作,其实就是把这个学习路线落到了具体的工作里。2. 先管人:账户口令和SSH登录防护2.1 操作一:账户与口令基线检查为什么要先做账户?因为大部分入侵最终都要落到一个合法的账号上,要么是弱口令被猜中,要么是离职员工的账号还在用,要么是一个闲置的测试账号刚好有sudo权限。你不需要对抗神乎其技的黑客,你只需要先把大门上那把生锈的锁换掉。第一步是摸清系统里有哪些账户。看两个文件就能确定最终所有账户:# 查看所有本地账户 awk -F: '{print $1, $3}' /etc/passwd # 查看哪些账户有shell(有可能登录系统) awk -F: '$7 != "/usr/sbin/nologin" && $7 != "/bin/false" {print $1, $3, $7}' /etc/passwd拿到清单后重点核对三件事:uid为0的非root账户,这代表超级管理员权限。shell字段不是nologin的账户,这些账户理论上可以登录。密码字段是否为空。# 检查uid为0的账户 awk -F: '$3==0 {print $1}' /etc/passwd # 检查空密码账户 awk -F: '($2=="") {print $1}' /etc/shadow大多数发行版会把没有密码的账户显示为!或*,如果出现空字段,这个账户就是裸奔状态。对确认不用的账户,不要只删,最好先锁定并备份关键信息:# 锁定账户 usermod -L username # 设置账户永不登录 usermod -s /usr/sbin/nologin username # 如果环境允许,再加一个过期时间 chage -E 2026-01-01 username锁账户比直接删除安全,因为删除会连带历史属主信息,文件还能查出来,但账户没了容易影响后续审计追踪。口令策略方面,我建议至少做到:密码长度12位以上,90天轮换,连续输错5次锁定15分钟。这些都写在系统配置里:# 修改用户密码有效期 chage -M 90 -m 7 -W 14 username # /etc/login.defs 里设置默认值 PASS_MAX_DAYS 90 PASS_MIN_DAYS 7 PASS_WARN_AGE 14启用PAM的密码复杂度校验,在/etc/pam.d/common-password或pam_pwquality.conf里配置:minlen=12 dcredit=-1 ucredit=-1 lcredit=-1 ocredit=-1这段的意思是密码最短12位,且必须至少包含一位数字、一位大写字母、一位小写字母、一位特殊符号。刚推行的时候业务方会很抗拒,你的话术可以简单一点:不强制密码复杂度,下次被撞库恢复数据的成本远比你被骂几句高得多。2.2 操作二:SSH登录防护的完整配置SSH是运维的生命线,也是被爆破的重灾区。任何一台暴露在公网上的主机,一天被扫描撞库几千次都是家常便饭。日志里全是这种记录:Invalid user test from 203.0.113.5 port 51234 Failed password for root from 198.51.100.7 port 55210SSH加固的核心配置,我直接给出可以用的方案:# 编辑 /etc/ssh/sshd_config Port 2299 PermitRootLogin no MaxAuthTries 3 LoginGraceTime 30 PasswordAuthentication no PubkeyAuthentication yes AllowUsers ops admin解释几个关键项:Port 2299是变更默认端口,能挡掉一大波只扫22端口的脚本。PermitRootLogin no是禁止root直接登录,管理员用普通用户登录后su切换。PasswordAuthentication no是彻底关闭密码登录,只允许密钥登录。MaxAuthTries 3是限制单次连接的最大认证尝试次数。AllowUsers是白名单,只允许指定用户登录。改完之前一定要先做配置校验:sshd -t这个命令检查语法,如果报错就说明配置有问题,不要盲目重启。校验通过后再重新加载服务:systemctl reload sshd在你确认密钥登录完全正常之前,千万别关掉当前终端窗口,也别把登录方式切换成密码认证关掉。我见过不止一次,有人改完配置顺手一关,结果密钥权限不对,又没开密码登录,最后只能跑机房或者通过管理控制台重置。正确习惯是:改完配置后新开一个终端测试能否登录,确认没问题再退出旧会话。密钥生成命令也一并给出:ssh-keygen -t ed25519 -a 100 -f ops_ed25519 -C "ops-key-2025"公钥写到服务器的~/.ssh/authorized_keys,注意这个文件的权限必须是600,所在目录权限必须是700,否则SSH会拒绝读取:chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys如果团队人不多,还可以把登录来源IP收得更紧,在防火墙层面只允许固定来源访问,这个放到端口和访问控制里一起讲。3. 管住系统:补丁、端口和防火墙3.1 操作三:补丁与软件最小化补丁管理是很多人觉得“重要但没时间做”的事,等出了漏洞通报才临时上。实际上只要把补丁工作拆成固定的节奏,它就不那么占时间。我的方式是:每天快速检查一遍更新:apt list --upgradable或yum check-update。每周挑一个低峰期,把系统补丁按“测试机→非核心机→核心机”的顺序推。每次升级前用apt list --upgradable确认影响面,做个快照备份,升级失败能回滚。命令层面,以Debian系为例:# 查看可升级的包 apt list --upgradable # 先只下载不安装 apt install --download-only -y package_name # 低峰期安装 apt upgrade -y核心服务器升级前,我强烈建议先拍快照或者做一次完整备份。现实中我遇到过内核补丁装上后网卡驱动异常的情况,如果没有快照,恢复起来会非常痛苦。补丁这件事考验的从来不是安装速度,而是回滚能力。软件最小化是另一个被忽略的问题。很多机器装了一堆用不上的软件包,每个包都有依赖组件,每个组件都可能存在漏洞。常规清理思路:# 查看安装时间较久且最近没用过的包(仅供参考,需人工确认) awk '/^Install Date/{date=$4" "$5} !/^Install Date/{print} ' /var/log/dpkg.log | tail -50 # 查看当前监听端口对应的服务,找出不认识的 ss -tlnp我的原则是:一台服务器只干一件事。如果数据库服务器上装了web服务、开发工具、图形界面,安全暴露面直接翻倍。卸载软件时顺便清理不需要的系统服务,后面讲端口收敛时会用到。3.2 操作四:端口与服务收敛端口不进则退,多开一个端口就多一个被探测的入口。我最常遇到的问题是:数据库装了bind-address=127.0.0.1还好,改配置时不小心监听在所有接口上;或者测试环境临时起了个服务,线上的防火墙规则没更新,服务一直对外暴露。排查端口第一步,用ss替代已经过时的netstat:ss -tlnp这个命令会显示当前所有TCP监听端口和对应进程。看到异常的高位端口,或者不应该对外暴露的数据库、容器管理端口,要立刻确认来源进程。确认服务名称后,停止并禁用不需要的服务:# 停止服务 systemctl stop myservice # 禁止开机自启动 systemctl disable myservice有些服务是其他服务的依赖,不要一上来就disable。先用systemctl list-dependencies看依赖树,确认没有连带影响再动手。还有个常见场景:MySQL这类组件默认监听3306,它本身没问题,可怕的是监听在0.0.0.0上。正确姿势是让数据库只监听内网IP,甚至仅本机回环:bind-address = 127.0.0.1如果应用和数据库不在同一台机器,至少要限定在内部网络地址,再由防火墙控制访问来源。我见过最夸张的一次是Redis没设密码,监听在公网IP的6379端口上,被扫到之后直接被写入了定时任务。这个事故后,凡是有类似中间件暴露风险,我都建议遵循同一原则:默认不对外,需要对外再明确配置。3.3 操作五:防火墙白名单与默认拒绝防火墙的核心思想很简单:先拒绝所有,再放行必要。很多服务器默认策略是允许全部,这相当于把安全员的筛选工作全交给了应用,风险太大。在用了很多年iptables之后,我的习惯是在多数服务器上用firewalld,因为它分层清晰,容易管理。开局先看现状:firewall-cmd --list-all然后把默认zone设置为drop或减少放行规则:# 默认拒绝绝大多数入站 firewall-cmd --set-default-zone=drop # 放行SSH(注意端口如果改过,这里也要同步) firewall-cmd --permanent --add-service=ssh # 放行固定来源访问某个端口,例如只允许内部网段访问数据库 firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.0.0.0/8" port port="3306" protocol="tcp" accept' # 重新加载使配置生效 firewall-cmd --reload如果是用iptables直接管理,可以这样建立一套基础规则:# 清空并设置默认策略 iptables -P INPUT DROP iptables -P FORWARD DROP # 放行已建立的连接,避免误伤正常会话 iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT # 放行回环 iptables -A INPUT -i lo -j ACCEPT # 放行SSH iptables -A INPUT -p tcp --dport 2299 -j ACCEPT操作顺序非常关键:先放行必要端口,再设置默认拒绝。如果顺序反了,配置下发的瞬间你的SSH就断了。就算顺序正确,批量操作前也要先把现有规则备份:iptables-save > /root/iptables-backup-$(date +%F).txt防火墙规则属于“改动小、影响大”的典型,任何变更都要留后路。我还会在规则里加注释,写明这条规则是哪天为什么加的,否则三个月后回看配置,根本不知道某条规则能不能删。4. 看得见威胁:日志、告警与完整性校验4.1 操作六:日志统一采集与留存安全运维里最怕的不是没日志,而是日志散落在每台机器上,出事时找半天才发现某台机器日志只留了两天。统一采集日志,本质上是把“事后翻箱倒柜”变成“平时一眼看清”。Linux自带systemd-journald,配合rsyslog,可以满足大多数中小环境的日志集中需求。基础配置如下:# journald限制最大占用 journalctl --vacuum-size=500M # 永久化存储,编辑/etc/systemd/journald.conf Storage=persistent SystemMaxUse=500M MaxRetentionSec=90如果机器多,可以配置rsyslog将日志转发到集中的日志服务器:# 在/etc/rsyslog.d/remote.conf里加上 *.* @192.168.10.20:514集中日志服务器那边打开514端口接收即可。这里要注意防火墙,尤其是rsyslog端口如果暴露在公网,会被用来做日志伪造或流量放大,一定要限制访问来源。日志量估算是个实操难点。我用一个具体例子:假设每秒产生1000条日志,每条平均1KB,一天的日志量就是约86GB。如果你的磁盘分配只有100GB,那不到两天就会写满。所以在做日志留存前,先算清楚三个数字:每天产生多少量、希望保留多久、磁盘能装多大。据此设定轮转策略和告警阈值:# 日志轮转示例,/etc/logrotate.d/nginx /var/log/nginx/*.log { daily rotate 90 compress delaycompress missingok notifempty create 640 nginx adm }需要重点留存的日志包括:认证日志、audit日志、sudo记录、数据库慢查询、应用的登录/支付/管理操作记录。每一类都想清楚:出问题时我要从哪里查清楚“谁在什么时间做了什么”。4.2 操作七:暴力破解与异常登录检测日志集中了之后,下一步就是让它自动告诉你“有人正在撞门”。最经典的暴力破解特征就是短时间内同一个源IP对SSH大量尝试失败。用开源工具fail2ban就能拦截,配置不复杂。安装后,在/etc/fail2ban/jail.local里写:[sshd] enabled = true port = ssh filter = sshd logpath = /var/log/auth.log maxretry = 5 findtime = 600 bantime = 600 ignoreip = 127.0.0.1/8 10.0.0.0/8 172.16.0.0/12参数含义:10分钟(findtime)内同一个IP失败5次(maxretry)就封禁10分钟(bantime)。内网地址加进ignoreip,避免误伤正常办公出口。启动后查看状态:fail2ban-client status sshd输出里能看到被封禁的IP列表,记为违规IP,之后可以在防火墙层做长期拒绝。这里有一个典型坑:如果你们整个办公室通过同一个出口IP访问服务器,这个IP很容易因为某个人输错几次密码被fail2ban封掉,然后全办公室都上不去。所以ignoreip一定要配置好,至少把你的办公网和运维跳板机网段放进去。除了fail2ban,我还会每周手动看一次认证日志,重点是那些从未见过的用户登录记录:# 最近一条登录记录 last -n 20 # 查看近期所有登录会话及其来源 last -i -n 50 # 检查登录失败记录 lastb -n 50另外,useradd和sudo日志也要纳入主动巡检。如果有人频繁切换root并执行敏感命令,应该能够直接从/var/log/auth.log或audit日志里拉出一条完整时间线。4.3 操作八:文件完整性校验与防篡改木马和后门最常干的事就是替换核心命令、修改配置文件、在启动项里加坑。文件完整性校验的作用是:定期对关键文件做哈希比对,发现任何异常变化立刻告警。AIDE是这类工具里经得起时间考验的一个。初始化数据库:# 安装后先初始化,生成数据库 aide -i # 生成的数据库文件路径在 /var/lib/aide/aide.db.new.gz mv /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz之后每次比对:aide --check初次初始化后,先跑一次对比,会有大量误报,因为你自己的配置更新、日志轮转都会触发差异。需要把动态目录排除掉,在/etc/aide.conf里增加规则,例如:!/var/log/.* !/var/tmp/.* !/proc/.* !/sys/.*然后重新初始化数据库,再启用计划任务,每周自动比对并发送结果。auditd是另一个好用的内核级审计组件,适合持续监控关键路径:# 监控/etc/passwd和/etc/shadow的写和执行行为 auditctl -w /etc/passwd -p wa -k identity_changes auditctl -w /etc/shadow -p wa -k identity_changes # 查看审计记录 ausearch -k identity_changes -ts recent这类监控的核心思路就是“预警而非追溯”。你不想在系统被入侵两天后才发现文件被改了,更希望改动发生的当下就收到告警。如果你有日志监控平台,把AIDE输出的告警接入进去,效果会好很多。5. 留好后路:备份恢复和应急响应5.1 操作九:备份策略与恢复演练备份和恢复听起来人尽皆知,但多数人的备份方案经不起一次真正的故障。我做过的教训很深刻:某次业务系统故障,备份文件确实在,但恢复时发现备份脚本只备份了数据库文件,没备份配置文件;更麻烦的是,密钥文件缺失导致备份内容无法解密。先记住一个硬性原则:3-2-1。数据至少3份副本,存2种不同介质,其中1份放异地或离线。这里“离线”强调的是机房断电、勒索病毒加密等极端事件下的最后防线。常用备份工具组合:文件备份:rsync + hardlink / duplicity / borgbackup数据库逻辑备份:mysqldump / pg_dump系统级快照:云平台快照或本机LVM快照# 示例:使用rsync做文件级备份 rsync -av --delete /data/ /backup/data/ # 示例:MySQL逻辑备份 mysqldump -uxxx -pxxx --single-transaction --routines --triggers > /backup/mysql-$(date +%F).sql关于备份窗口,需要估算。假设数据量2TB,千兆网络理论峰值大概是每秒110MB左右,全量备份理想状态也要5小时以上。所以备份设计从来不是“每天全量”,而是“周一全量+每天增量”或者“每天增量+周末全量”。增量备份的恢复顺序和依赖关系要写清楚,不要等到故障才发现少了一个中间环节。恢复演练才是重点。我建议至少每季度做一次演练,在隔离环境里从备份完整恢复一套系统,记录三个关键指标:恢复需要多长时间(RTO)恢复出来的数据会丢多少(RPO)恢复后应用能否正常启动把演练结果记下来,比备份任务成功日志重要十倍。因为你最终交付的不是“备份文件”,而是“可用的恢复能力”。5.2 操作十:应急响应SOP与模拟演练第10个操作,是把之前的成果固化成一整套应急流程。没有预案的攻击就像是火警响了才现找灭火器,很容易手忙脚乱再添新错。事件分级可以先按影响定义:级别定义响应要求P1核心业务中断、数据泄露或勒索加密15分钟内启动应急,隔离受影响系统P2疑似入侵、异常登录、重要配置被篡改30分钟内初判,保留现场,上报P3低危扫描、误报告警、合规整改项当天确认,按周整理响应流程按六步固定下来:发现→上报→隔离→取证→恢复→复盘。发现:告警触发的源头是什么,日志保留在哪里。上报:通知到谁,用哪个群、哪条电话线,话术预先写清楚。隔离:防火墙层直接封禁异常IP,必要时断网或挂载只读,先止血再排查。取证:复制日志、保存进程状态、快照内存信息,按时间线梳理。恢复:从干净备份重建,收紧登录入口,变更所有受影响密码。复盘:痛点是规则未覆盖,还是监控阈值不当,还是人的操作习惯问题,形成改进项。这里的关键是预案要具体到“谁在什么条件下执行哪条命令”。不要写“迅速切断网络”,要写“在防火墙执行firewall-cmd --permanent --add-rich-rule去屏蔽来源IP,然后reload”。不要写“联系相关人员”,要写“电话联系运维负责人,若未响应则升级到平台负责人”。只有能直接照着执行的才算预案,否则只是文档。团队建议每月做一次模拟演练。场景可以轮流设计:比如“某服务器多了一个公网监听端口”“某个管理员账号在凌晨三点登录”。演练的价值不在于动作多专业,而在于发现预案里那些没说清的地方。我做完几次演练后,明显感觉到平时战战兢兢的加班变少了,因为真出事时大家知道第一步干什么。6. 常见问题速查与避坑实录表面现象可能原因排查方向避坑建议远程登录突然失败禁用了密码登录但密钥权限不对确认authorized_keys权限,控制台登录检查sshd配置改配置前先新开终端测试业务访问被断防火墙规则顺序错误,默认拒绝先生效查看iptables/firewalld规则命中计数变更前必须备份规则,先放行必要端口再设默认拒绝磁盘被日志写满日志量估算不足,轮转策略缺失df -h看使用率,du找大日志先算清每日日志量和保留周期,再定磁盘分配办公网出口IP被fail2ban误封阈值太低,共享出口IP触发条件fail2ban-client status 查看封禁列表ignoreip加上办公网和跳板机网段AIDE误报太多排除规则没写好,动态文件被纳入监控查看审计日志确认触发文件初始化前关闭动态路径,更新基线后再启用备份恢复失败备份不完整或缺少配置文件在隔离环境做完整恢复验证每季度做恢复演练,记录RTO和RPO还有一些实操细节值得单独提醒。不要为了“安全”把所有服务都塞进同一台跳板机,跳板机被攻破等于内网被打穿。重要系统的分批补丁窗口之间保持至少1小时,万一第一批出问题,你还有时间处理,不用全网一起回滚。权限变更和防火墙规则变更,尽量走固定变更流程,记录好每一笔操作。变更是事故最大的来源,也是最容易被忽视的风险点。7. 我的经验与建议做了这些年网络安全运维,我最大的转变是:从追求“会不会被入侵”变成追求“入侵发生之后我能不能在10分钟内发现问题并在1小时内恢复”。这两者的技术动作差不多,但心态完全不一样。现在我会建议刚入行的朋友,不要一上来就冲锋各种高级防护设备,先把这十件事做到位——账户管起来,SSH锁上,端口收敛,日志能看到,备份能恢复,应急有流程。这些看起来基础,但基本上能解决日常80%以上的安全风险。最后再分享一个小技巧:把这十项检查做成一个自检脚本文档,每月跑一遍,结果发给团队。不需要所有人都懂安全,只需要所有人都在同一份检查清单里看到偏差。很多时候告别996不是靠某个单点操作,而是靠每天周二下午那雷打不动的20分钟巡检,把问题提前拦在事故发生之前。这套东西坚持三个月,你会回来感谢当时的自己。