ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Linux安全加固核心三支柱:权限管理、防火墙与入侵检测

Linux安全加固核心三支柱:权限管理、防火墙与入侵检测 干了这么多年的Linux运维和系统安全加固我最大的感触是安全加固这件事怕的不是你不会敲命令而是没有整体思路。很多朋友拿到一台服务器第一反应是“先找个加固脚本跑一遍”结果脚本一跑业务断了该堵的口子却一个没堵上。这篇内容我打算把Linux系统安全加固最核心的三个方向——权限管理、防火墙、入侵检测——从头到尾讲透。不光是命令怎么敲、规则怎么配更重要的是每一步为什么这么做、线上环境怎么落地、哪些坑我替你踩过了。适合刚接手服务器运维的新手也适合有一两年经验但想系统梳理一遍的老手。以下操作我都在CentOS 7/8、Rocky Linux 9、Ubuntu 20.04/22.04上实测过拿到手上可以直接照着做但建议你先别急着复制粘贴看完思路再动手。1. 安全加固的整体思路先想清楚防谁再动手1.1 威胁模型你的服务器到底在防谁我见过不少同行做加固第一步就是开一堆工具把端口全封了然后发现业务全挂。这个问题的根源在于没有做威胁模型分析。所谓威胁模型说白了就是回答三个问题这台服务器上有什么值得保护的数据谁可能来偷或者破坏被攻击后你能承受多大的损失这里要分场景看。一台直接暴露在公网、跑着电商业务的ECS和一台在公司机房内网、只对办公网提供文件的服务器面临的威胁是完全不一样的。公网服务器每天会被扫描器扫上千次重点是防暴力破解、防漏洞利用、防批量扫描内网服务器更多是防误操作、防内部人员越权、防已经进了内网的攻击者横向移动。你花在加固上的资源应该跟着威胁走而不是盲目堆砌。所以我建议第一件事就是给服务器做个体检清单开放了哪些端口、跑了哪些服务、有多少个账号、数据有多重要、业务方有没有明确的审计要求。把这些写下来再决定防火墙策略怎么定、权限怎么收紧、检测要做多深。没有这一步后面的配置全是无根之木。场景主要威胁加固重点公网业务服务器暴力破解、漏洞扫描、自动化攻击防火墙白名单、fail2ban、密码策略内网文件/应用服务器内部越权、误操作、横向移动权限收紧、ACL、审计开发测试环境账号混乱、配置泄露账号清理、基线管理1.2 三根柱子各自管什么我习惯把安全加固拆成三根柱子这个分类也是整篇文章的主线。权限管理解决的是“谁能做什么”的问题相当于给每扇门配不同的钥匙。用户账号、文件权限、sudo授权都归这一类控制的是系统内部的访问边界。防火墙解决的是“谁能进这栋楼”的问题相当于大楼门禁。它在网络层和服务层做过滤把不该进来的流量挡在门外。入侵检测解决的是“出了事我怎么知道”的问题相当于监控摄像头。日志记录、文件完整性校验、异常行为检测都归这一类它保证你已经做了前面两道防线之后万一还是被突破你能第一时间发现并止损。这三者不是互相替代的关系而是纵深防御的三层。一个常见的误区是“我装了防火墙就安全了”实际上防火墙防不住合法账号的越权也防不住被攻破后的横向移动。反过来只有权限管理没有防火墙公网扫描器能直接摸到SSH端口狂试密码。三层要一起做才能形成比较完整的防御闭环。2. 权限管理最小权限原则从账号到文件一层层收紧2.1 账号体系清理少一个多余账号就少一个攻击面权限管理的第一步不是改文件权限而是先清理账号。我接手的很多服务器里都躺着长期没人用的账号有些还是几年前项目上线时创建的密码可能早就泄露了。这样的账号每个都是风险点。先花几分钟过一遍系统里的账号。查账号列表用这条命令把输出重定向到文件里慢慢看awk -F: {print $1, $3, $6, $7} /etc/passwd重点关注三件事。第一UID为0的账号用这个命令找awk -F: $30 {print $1} /etc/passwd正常情况下应该只有root如果冒出别的账号多半是被人种了后门。第二有没有带可登录shell的账号那些/bin/bash、/bin/sh的账号都看看是不是还在用。第三/etc/shadow里密码哈希为空的账号这种账号等于没密码直接用用户名就能登录。对确定不用的账号不要急着删先锁定加改shell这样做可逆方便排查passwd -l username usermod -s /sbin/nologin username如果确认账号和它家目录里的数据都没用了再彻底删除userdel -r username另外一定要检查authorized_keys。很多人只知道改密码却忘了SSH公钥一样能登录。把root和各种高权限账号家目录下的authorized_keys全捞出来看看find /home -name authorized_keys -exec cat {} \; find /root -name authorized_keys -exec cat {} \;凡是不认识、对不上人的公钥一律删掉。这一步我每次做加固都不会跳因为公钥后门是最隐蔽的持久化手段之一。2.2 文件权限与特殊权限SUID、SGID、Sticky的坑账号清完了接下来是文件层面。Linux的常规权限rwx大家都熟但要特别注意三个特殊权限位因为它们和提权漏洞关系最密切。最常见的是SUID。当一个可执行文件设置了SUID位任何用户运行它都会以文件属主的身份执行。如果这个文件属主是root那就等于普通用户获得了一个root权限的入口。系统里确实有一些需要SUID的合法程序比如passwd、sudo、mount但攻击者如果往系统里丢一个自己的SUID程序那就是典型的提权后门。所以加固时必须把系统里所有SUID文件过一遍find / -perm -4000 -type f 2/dev/null -exec ls -l {} \;正常的SUID文件一般集中在/bin、/usr/bin、/usr/sbin这些路径下数量通常不会太多。如果你发现某些奇怪路径下比如/tmp、/var/tmp或者某个web目录里出现SUID的root文件基本可以断定有问题。对确认为后门的SUID程序去掉位用chmod u-s即可。历史上有不少通过SUID程序提权的CVE案例所以高危程序的新版本要及时更SUID文件也要定期重扫。SGID要分两种情况看文件设置了SGID运行时以文件属组身份执行目录设置了SGID新建文件的属组自动继承目录的属组。后者在团队协作目录里很好用一个组共享一个目录时大家创建的文件不用担心组归属不一致chmod gs /data/team_projectSticky位大家最熟悉的就是/tmp目录权限显示为drwxrwxrwt。它的作用是目录里谁都能写但只有文件属主、目录属主或root能删自己的东西。这能防止大家一起写公共目录时互相删文件。查看和设置ls -ld /tmp chmod t /tmp/shared我给的加固建议很简单先把系统里SUID文件扫一遍弄清楚每个是什么然后定每周或每月定期扫描的机制把新增的SUID文件当成告警看待。这一条对防提权后门非常有效。2.3 ACL与sudo把授权做到文件级和命令级有些场景常规权限搞不定比如要让用户alice对某个目录有读写权限但既不想把她加进目录属组又懒得起新组。以前只能改属组现在用ACL就行setfacl -m u:alice:rwx /data/project getfacl /data/projectACL比普通权限粒度更细可以针对单个用户或单个组设置。要注意的是ACL设置后用ls -l看权限位会多个加号比如drwxrwx---。如果之后有人用chmod改权限ACL里的mask可能会变导致本来授权的用户反而没权限了这是新手经常踩的坑。排查ACL问题优先getfacl而不是ls -l。再说sudo。系统里有种很常见的坏习惯直接给开发账号ALL(ALL) ALL的sudo权限等于把root钥匙复制了好几把。我建议sudo授权遵循两个原则一是能用普通权限就不给sudo二是非给不可时只授权那几条具体命令。visudo在配置文件里正确的做法长这样devops ALL(ALL) /usr/bin/systemctl restart nginx这样devops只能重启nginx不能执行systemctl stop更不能reboot。很多团队图省事写NOPASSWD:ALL我强烈不建议因为一旦开发机的密码被撞破攻击者拿到的就是完整root。sudo的每个执行记录都会留在/var/log/secureRHEL系或/var/log/auth.logDebian系定期翻一翻能发现很多“有人背着你在用root权限”的线索。密码策略也得一起收紧。编辑/etc/login.defs把PASS_MAX_DAYS设成90或更短PASS_MIN_LEN设成12以上再配PAM的pam_pwquality模块防止弱密码配合pam_faillock限制输错次数。这个组合能直接干掉大量暴力破解类攻击的前置条件。3. 防火墙策略先行规则才有意义3.1 firewalld还是iptables怎么选防火墙这块我以为大家早统一了结果每次群里讨论还是一堆争议。我给个实用性的结论RHEL系CentOS、Rocky、Alma默认的firewalld完全够用别再去手动起iptables服务捣鼓了Ubuntu/Debian系直接用ufw底层虽然是iptables但封装得很友好真要搞复杂NAT、策略路由这类场景就直接上iptables命令或者nftables别硬拿firewalld拼。firewalld比iptables强在两点一是动态更新改规则不中断现有连接这在线上环境简直是救命特性二是zone概念把网卡划分到不同信任区域比如外网网卡放public内网网卡放trusted一套规则管理多个接口。底层的规则最终还是会转成nftables或iptables规则但日常管理用firewalld省心得多。有个需要提醒的坑firewalld和iptables服务不要同时开两者会抢规则导致谁也管不住。我见过有服务器firewalld和iptables都enable结果重启后规则乱成一锅粥服务全连不上。选一个体系另一套服务mask掉systemctl stop iptables systemctl mask iptables3.2 规则设计与落地流程防火墙配置最忌讳上来就一梭子命令。我每次都是先在纸上把规则表写清楚默认策略是什么、必须放行哪些端口、哪些来源IP能访问管理端口。以一台典型的Web服务器举例上面跑Nginx和MySQLMySQL只允许办公网192.168.10.0/24访问。采用默认拒绝的思路firewalld的做法是先把默认zone改成drop只放行明确需要的服务firewall-cmd --set-default-zonedrop firewall-cmd --permanent --add-servicessh firewall-cmd --permanent --add-servicehttp firewall-cmd --permanent --add-servicehttps firewall-cmd --permanent --add-rich-rulerule familyipv4 source address192.168.10.0/24 port port3306 protocoltcp accept firewall-cmd --reload注意顺序所有修改都要带--permanent否则reload后规则就没了。改完一定要firewall-cmd --reload然后验证firewall-cmd --list-all firewall-cmd --list-rich-rules这套配置的逻辑是drop zone下所有连接默认丢弃SSH和HTTP/HTTPS对所有人开放MySQL只对办公网段开放。这就是最小开放原则比“先全部允许再一条条拒绝”稳妥得多。如果你更喜欢iptables风格等价的做法是iptables -P INPUT DROP iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -p tcp --dport 22 -j ACCEPT iptables -A INPUT -p tcp --dport 80 -j ACCEPT iptables -A INPUT -p tcp --dport 443 -j ACCEPT iptables -A INPUT -p tcp -s 192.168.10.0/24 --dport 3306 -j ACCEPT最后别忘了保存iptables-save写进配置否则重启就归零。这个是老生常谈的坑了但我真的见过不止一次。3.3 黑白名单与端口转发的实战玩法黑名单白名单这词被各种安全设备用得泛滥其实在Linux防火墙里就是来源IP的精确控制。白名单最典型的用途是SSH管理端口的来源限制只允许公司出口IP和堡垒机IP连SSH。firewall-cmd --permanent --add-rich-rulerule familyipv4 source address202.96.x.x port port22 protocoltcp accept配合默认drop这相当于给SSH上了把专属钥匙公网上其他IP扫这个端口等于撞墙。但要注意一个实际问题公司出口IP不是固定的话白名单会把你自己锁外面。所以要么配合堡垒机这种有独立审批流程的接入方式要么选一个你能随时通过其他途径登录的带外通道防止误封。黑名单就简单了发现某个IP在疯狂扫描直接dropfirewall-cmd --permanent --add-rich-rulerule familyipv4 source address203.0.113.66 drop不过单条黑名单治标不治本攻击者换IP很快所以黑名单更多是临时止血真正持久的防线还是后面讲fail2ban这种自动化封禁工具。端口转发在firewalld里也有原生支持比如把本机的8080转发到内网另一台服务器的80firewall-cmd --permanent --add-forward-portport8080:prototcp:toport80:toaddr192.168.1.10别忘了先开启内核转发参数echo net.ipv4.ip_forward1 /etc/sysctl.conf sysctl -p用到这种场景的通常是内网没有独立入口的机器。一句话总结防火墙永远从“默认拒绝”出发把每个放行规则都写成“因为什么业务需要”这样以后排查时每条规则都有据可查。4. 入侵检测日志留痕、文件校验、自动封堵三层联动4.1 auditd让敏感操作想赖账都难前面权限和防火墙做的是“防”但攻防是动态的谁也不敢保证系统百分百不会被突破。所以入侵检测这层必须做扎实。先说内核级审计工具auditd它是Linux安全体系里经常被忽略但非常好用的东西。安装好后直接systemctl enable --now auditd然后就可以加规则了。最常见的需求是监控关键文件被谁改了auditctl -w /etc/passwd -p wa -k passwd_changes auditctl -w /etc/shadow -p wa -k shadow_changes auditctl -w /etc/sudoers -p wa -k sudoers_changes-w表示watch指定文件-p wa表示监控写入和属性变更-k是给规则打个标签方便检索。想看结果用aureportaureport -k --key passwd_changes aureport -f如果想监控命令执行可以用系统调用级的规则auditctl -a always,exit -F archb64 -S execve -k exec_comm这条规则能记录所有execve调用相当于录下每条命令执行记录。但我要提醒一句生产环境慎开全量execve监控日志量非常恐怖磁盘小的能一天写满。我一般只在排查阶段开或者配合白名单只监控特定路径下的执行行为。比如监控某个web目录下有没有新增可执行文件auditctl -w /var/www/html -p wa -k web_changesauditd的日志在/var/log/audit/audit.log配合logrotate做轮转别让它无限制增长。有条件的话建议把审计日志同步到远程日志服务器因为攻击者拿到root后第一件事就是清日志本地日志并不可靠。4.2 fail2ban暴力破解的自动反击fail2ban是我认为性价比最高的入侵检测工具没有之一。它做的事情很简单监控日志文件里的失败认证记录发现某个IP在短时间内失败太多次就自动在防火墙里封掉它。安装后配置在/etc/fail2ban/jail.local我一般先只开sshd这个基本款[DEFAULT] bantime 3600 findtime 600 maxretry 5 ignoreip 127.0.0.1/8 你的IP [sshd] enabled true port ssh logpath %(sshd_log)s backend %(sshd_backend)s解释一下三个核心参数findtime是检测窗口600秒内maxretry是允许失败次数5次bantime是封禁时长3600秒。也就是说10分钟内输错5次密码这个IP就会被封一小时。ignoreip里一定要加上你自己的IP这样即使误触也不会把自己锁外面。配置好重启服务systemctl enable --now fail2ban fail2ban-client status fail2ban-client status sshd看到Banned IP list里开始出现IP就说明它在干活了。我见过最夸张的一台公网服务器装fail2ban之前每天几百次失败尝试装完封了一批IP之后日志立刻安静了。fail2ban还能配合邮件告警不过那个配置略烦不是必须的。它同样支持监控vsftpd、postfix、dovecot等服务的日志规则文件里都自带模板根据自己的服务挑需要的启用。4.3 AIDE与rkhunter文件完整性与rootkit扫描日志是事后看的fail2ban是响应式的那怎么发现系统文件被悄悄篡改过这就轮到文件完整性校验工具AIDE上场了。AIDE的思路是第一次运行时把系统里关键文件的哈希、权限、属主等信息存成一个基线数据库以后定期比对发现任何变化就报警。aide --init mv /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz初始化和基线建立之后用cron定期检查0 3 * * * /usr/sbin/aide --check /var/log/aide_check.log不过AIDE的初始基线要在系统刚装好、确认干净的时候生成如果在一台可能已经被入侵的机器上生成基线那对比出来的“安全状态”本来就是脏的查了等于没查。这点务必记住。再配合rkhunter做rootkit扫描rkhunter --check rkhunter --updaterkhunter会比对系统命令的哈希和已知rootkit特征库还会检查一些恶意软件喜欢藏身的路径和内核模块。第一次跑会有一堆warning很多是因为系统的某些配置和它默认要求不完全一致需要逐条看去白名单排除误报这个耐心活躲不掉。还有chkrootkit和rkhunter功能重叠扫得更快我通常是两把都用互补着来。这套三件套跑下来文件完整性、rootkit特征、系统命令异常就都覆盖到了。最后把AIDE、rkhunter、chkrootkit加入每周一次的计划任务并且把输出发到管理邮箱或监控平台形成定期体检机制。5. 常见问题与排查技巧实录现象常见原因快速定位命令SSH连不上防火墙默认策略或未持久化iptables -nvL / firewall-cmd --list-all新建文件权限不对umask被改umask; cat /etc/profile授权用户没权限ACL mask被chmod覆盖getfacl 目录目录能看不能进缺少目录x权限ls -ld 目录5.1 最典型的“加了防火墙就断连”这个我太有发言权了几乎每个刚学防火墙的人都会经历一次“把自己关在门外”。现象都一样执行完某条防火墙命令后当前SSH窗口卡住然后断开再也连不上。最常见的两种原因一是iptables先执行了iptables -P INPUT DROP却没先放行22端口当前连接也被拦了二是用firewalld改了规则但没带--permanent然后不知道谁执行了reload规则没了该放行的端口也关了。排查思路如果你还有带外通道机房console、云控制台的VNC一切都好办。如果没有就只能让现场同事从本机操作。教训是改防火墙之前永远先确认自己有一个可靠的备用登录通道。我自己的习惯是改关键规则前开两个SSH窗口一个窗口专门用来执行恢复命令防止主窗口断线后手足无措。还有个小经验iptables加完规则立刻保存别等全部改完再保存。firewalld也一样--permanent带上改一步验证一步出错了reload回上一个状态这是线上操作的基本法。5.2 改了权限没生效的几类原因权限问题排查起来比防火墙更隐蔽因为没有报错就是行为不符合预期。总结几类我经常看到的迷惑案例。第一类是新建文件权限不对。明明设了umask 022新文件却是640。大概率是有人的umask脚本里被改过或者是系统应用自己的umask。全局umask可以在/etc/profile里统一管理对服务进程还要看systemd service里的UMask配置这个参数不写的话默认是022写坏了很坑。第二类是ACL背锅。前面说过setfacl之后mask会变如果你先给用户alice加了ACL然后又chmod 750了目录在ACL里alice可能就会从rwx掉到r-x甚至没有权限。排查时一定先getfacl看实际情况不要只看ls -l。第三类是目录权限的“最后一公里”问题。很多人只知道读一个目录需要r却忘了要进入一个目录必须要有x权限。所以有时候ls能看到文件名列表但cd进不去、读不了文件就是因为目录没有x。这个在给web服务器配目录权限时特别常见。第四类是tar解包后特殊权限丢失或者反过来引入奇怪权限。归档包里如果不保留权限属性解出来就是当前shell的默认权限反过来如果你拿了一个别人打的包里面万一带着SUID位的程序解压到/tmp再一执行可能就是个提权工具。所以收到外部提供的tar包解压前先tar -tvf查看有没有异样权限的文件。5.3 fail2ban与auditd的误报和噪音处理自动化工具用久了最烦的不是不干活而是天天误报轰炸。fail2ban常见的问题是把自己人封了。公司网络出口IP是运营商动态分配的话今天从A段上来明天从B段上来一旦某个同事连续输错几次密码整个办公室都被封一小时。解决办法有三个ignoreip里放宽公司IP段、把maxretry调大一点、找IT把出口IP固定。我一般建议三管齐下。auditd的噪音问题主要是规则粒度太大。比如监控一个日志目录的写入结果应用自己每秒都在写日志审计日志就爆炸了。合理做法是把-w监控范围缩小到配置文件或者用exclude规则过滤常见进程。审计规则写完之后先用auditctl -l看看整体清单再放一晚上观察日志增长量别一上来就全开。还有logrotate的问题。auditd默认自己有轮转策略但有的发行版不会自动压缩存档时间久了/var/log/audit会占用很多空间。检查一下/etc/logrotate.d/里有没有对应配置没有就补上/var/log/audit/audit.log { weekly rotate 8 compress missingok notifempty }日志和数据一样是安全事件里最值钱的资产。丢了日志很多攻击行为你根本还原不出来。我自己做加固这些年体会最深的一点是安全最难的其实不是某一条命令而是坚持。每一次登录、每一次变更、每一次深夜被报警叫醒去处理都是在给系统增加一层韧性。别追求一步到位把账号清理、SUID扫描、AIDE周检、fail2ban监控这些动作固化成例行公事比装任何昂贵的扫描器都管用。如果你刚入门就从上面讲的三步做起清一遍账号、扫一遍SUID、给SSH设置来源白名单。这三步做完你的服务器已经比大部分同行的配置要稳了。
返回列表