ARTICLE DETAIL

资讯详情

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

企业级Linux服务器安全基线落地:账号、内核、服务与审计全攻略

企业级Linux服务器安全基线落地:账号、内核、服务与审计全攻略 说真的每次看到有人拿着一份从网上抄来的Linux安全加固清单逐条往生产服务器上敲命令我都想拦住他问一句你知道这条配置是在防什么吗去年我陪一家企业做合规测评前的整改运维同事很自豪地说基线已经按CIS Benchmark配完了结果我扫了一圈SSH还开着密码登录root能远程直连系统里躺着三年前的Tomcat旧版本。那一刻我意识到安全基线最大的坑不是不知道怎么做而是以为做了就安全了。这篇上篇聚焦企业级Linux服务器安全基线的落地路径面向负责服务器运维和安全建设的同学——从刚接手服务器的新手到要对合规测评结果负责的安全工程师。我会把我实际做过的加固方案、踩过的坑以及从静态合规走向持续防护的思路讲清楚。上篇先把系统的底子打牢账号认证、内核参数、服务收敛、审计链路。下篇再聊漏洞管理、应急响应和自动化运营。1. 安全基线这件事合规要求背后到底在防什么1.1 从一次安全测评现场说起有一次测评师问客户/etc/shadow的权限是多少客户回答默认的。追问guest账号呢客户翻了半天说应该禁用了吧。实际上系统里不仅有guest还挂着nologin的Shell没清干净。这种场景我见过太多次。合规检查项其实并不深奥它考的就是最基础的账号管理、访问控制、日志审计。可恰恰是这些基础但不一定有人做的事最容易被忽略。安全基线的第一层价值就是把这类事项变成制度化的默认动作。合规项不是给测评师看的表演每一项背后都对应一条真实的攻击路径账号不清理 → 离职员工或测试账号成为跳板密码策略弱 → 暴力破解、撞库SSH裸奔 → 弱口令爆破日志不集中 → 被入侵后无法追溯这些路径环环相扣任何一个环节失守都可能导致整台服务器被控制甚至横向扩散到整个集群。所以我把基线当成用配置对抗攻击路径的手段而不是一张用来打勾的表格。测评只是校验手段真正的标准是这套配置能不能扛住一次真实的渗透尝试。1.2 合规加固的真正意义把人治变成机制很多团队觉得合规是负担我不这么看。合规加固的本质是把原本依赖某个老师傅经验记忆的安全配置变成一套任何新人接手时都能稳定复现的系统状态。一家企业几十台甚至上千台Linux服务器靠人工一台台配安全配置既不现实也极易出错。基线规范的价值就是把这台服务器应该处于什么安全状态用配置文件、脚本、检查清单固化下来。所以我在交付基线时永远不只是一份加固完的服务器而是一套包含基线配置说明、自动化脚本、巡检清单、回滚方案的完整交付包。这样无论面对合规测评、内审还是外部安全扫描都能以统一标准从容应对而不是每次从零开始讲故事。服务器集群规模越大这套机制的收益越明显。这也是为什么企业级安全基线不能停留在文档层面必须落到可执行、可验证、可回滚的工程层面。1.3 常见误区照抄CIS Benchmark并不是终点CIS Benchmark确实是很好的参考但直接照抄有三个问题。第一部分CIS建议在特定业务场景下不适用比如禁用IPv6、关闭USB存储在云服务器上也许没问题在物理机加特定硬件环境下可能导致驱动加载失败。第二CIS没有完整覆盖国内监管合规要求的测评维度比如远程管理加密审计记录保护CIS虽有对应项但粒度不同。第三纯手工配置无法持续今天配好明天被应用部署改回去没人知道。正确姿势是以CIS或合规条目为考核维度以实际业务为适用范围形成自己的基线库按高、中、低风险分级再配合自动化检查工具持续验证。这个思路会贯穿全篇后面的每个章节都是在这个框架下展开的。基线不是一堆命令的堆砌而是一套需要结合业务、威胁、运营能力不断迭代的体系。2. 账号与认证体系加固一切权限都必须有名有姓2.1 账号清理先从 /etc/passwd 开始盘点我第一次给客户做账号审计时在一个只有30台服务器的环境里翻出140多个账号三分之一不知道是干什么用的。账号清理不是简单地把不用的删掉而是要做一次完整的账号归口。先导出所有账号按UID分类cat /etc/passwd | awk -F: $31000 {print $1,$3,$6,$7}分成三类处理系统账号UID1000是服务运行账户不用动业务账号UID1000逐一确认归属人和用途疑似僵尸账号登录Shell不是nologin、但近90天无登录记录。针对僵尸账号我建议先锁定而不是直接删除usermod -L 用户名同时把Shell改成/sbin/nologin。直接删除的风险在于如果某些文件UID指向它文件属主会变成一串数字后续排查很头疼。锁定后观察一个完整业务周期再删除稳妥得多。2.2 密码策略与PAM让弱口令根本不存在很多人以为密码策略就是/etc/login.defs里改一下PASS_MAX_DAYS其实PAM层才是真正的执行者。我常用的组合是# /etc/login.defs PASS_MAX_DAYS 90 PASS_MIN_DAYS 7 PASS_WARN_AGE 14 # /etc/security/pwquality.conf minlen 12 dcredit -1 ucredit -1 lcredit -1 ocredit -1这样用户设置密码必须至少12位且必须同时包含数字、大写、小写和特殊字符。需要特别说明login.defs只影响新建用户已存在用户不会被追改所以要对存量账号批量执行chage -M 90 -m 7 -W 14 用户名。有一个很容易踩的坑PAM里password requisite那行的顺序。pam_pwquality.so必须放在pam_unix.so之前否则复杂度策略不生效。我踩过一次改了pwquality.conf重启后测试设置Admin123居然通过了查了半天才发现PAM配置里so库路径写错了校验模块根本没被加载。这提醒我每次改完PAM一定要用一个弱密码实际测一次而不是只看配置文件。2.3 SSH加固远程入口是攻击者的第一道门SSH是所有在线服务器的远程入口也是暴力破解和初始入侵的高发地带加固优先级永远排在第一位。下面这套是我在多套生产环境验证过的组合先看关键配置项及其作用SSH关键配置项推荐值作用PermitRootLoginno禁止root直接远程登录PasswordAuthenticationno关闭密码认证只允许密钥MaxAuthTries3限制单连接最大认证尝试次数LoginGraceTime20登录超时20秒ClientAliveInterval300空闲连接每300秒探活ClientAliveCountMax2连续两次无响应即断开AllowUsersops admin只允许白名单用户登录# /etc/ssh/sshd_config 关键配置 PermitRootLogin no PasswordAuthentication no PubkeyAuthentication yes MaxAuthTries 3 LoginGraceTime 20 ClientAliveInterval 300 ClientAliveCountMax 2 AllowUsers ops admin提示改成密钥登录之前务必先把公钥写入目标用户的~/.ssh/authorized_keys从新终端验证一次能登录再关闭密码认证。执行前记得备份sshd_config并运行sshd -t校验语法否则一条配置写错就可能把自己锁在门外。针对必须保留密码登录的堡垒机场景建议把密码认证限定在特定网段用Match Address块实现或把SSH端口迁移到非标准端口并配合防火墙限制来源IP。虽然迁移端口治标不治本但对暴露面收敛非常有效。实际攻击者的扫描器对非标准端口的命中率会下降一大截。2.4 sudo权限收敛最小授权是防内鬼和防手滑的基础sudo配置我见过很多灾难现场有人直接给普通用户ALL(ALL) ALL有人给了NOPASSWD: ALL还有人把/etc/sudoers改得乱七八糟。合理的设计思路是按角色建组wheel管理员组、deploy部署组、op只读组。wheel组允许执行所有命令但需要密码op组只允许systemctl status、ss -tlnp等只读命令deploy组只允许systemctl restart app、tail -f /var/log/app.log这类受控命令。一个实用的sudoers片段%wheel ALL(ALL) ALL %op ALL(ALL) /usr/bin/systemctl status, /usr/bin/ss, /usr/sbin/ss, /usr/bin/tail %deploy ALL(ALL) NOPASSWD: /usr/bin/systemctl restart app, /usr/bin/tail -f /var/log/app.log同时开启sudo日志审计这是很多人会漏掉的关键一步Defaults logfile/var/log/sudo.log Defaults log_input, log_output Defaults use_pty这样谁在什么时间执行了什么命令、输出是什么全部有记录。遇到临时授权需求用visudo在/etc/sudoers.d/下建独立文件不要直接改主文件方便回收。部署时我会把这些文件纳入配置管理防止有人手工改完不留痕迹。3. 内核参数与文件系统加固把系统底层的运行行为约束住3.1 sysctl内核参数网络层与内核行为的总闸内核参数加固的核心目标是减少攻击面、缓解常见攻击手法、避免意外风险。我常用的配置写在/etc/sysctl.d/99-security.conf# 内核地址空间随机化 kernel.randomize_va_space 2 # 禁止特权程序转储 fs.suid_dumpable 0 # 限制SysRq键 kernel.sysrq 0 # 防SYN Flood net.ipv4.tcp_syncookies 1 # 禁止IP转发 net.ipv4.ip_forward 0 # 关闭ICMP重定向 net.ipv4.conf.all.accept_redirects 0 net.ipv4.conf.default.accept_redirects 0 # 忽略广播ICMP net.ipv4.icmp_echo_ignore_broadcasts 1 # 关闭源路由 net.ipv4.conf.all.accept_source_route 0 net.ipv6.conf.all.accept_source_route 0有个容易踩的坑修改sysctl.conf后执行sysctl -p有时不生效因为/etc/sysctl.d/目录下文件的优先级更高个别参数还必须在网络栈初始化前设置。稳妥做法是执行sysctl --system重新加载全部再用sysctl net.ipv4.tcp_syncookies验证目标参数。至于IPv6如果业务没有强制要求我倾向于在内核引导参数里追加ipv6.disable1而不是net.ipv6.conf.all.disable_ipv6后者在某些网卡驱动下仍会保留IPv6地址容易出现漏网之鱼。3.2 文件与目录权限基线关键文件必须锁死Linux的权限模型不复杂但真要逐项核对工作量不小。我按优先级把关键文件分了三层第一层是认证与系统核心文件/etc/passwd必须644且属主root/etc/shadow要收紧到600或000RHEL系默认000Debian系默认640 root:shadow建议统一收严/etc/gshadow同理/etc/group保持644。第二层是sudo相关文件/etc/sudoers及其目录下文件统一0440。第三层是启动与服务配置/boot/grub2/grub.cfg建议600/etc/systemd/system/下的service文件保持644。光改权限还不够要定期检查有没有越权写的情况。比如/etc/passwd如果出现组写权限说明可能有程序在偷偷改账号这种异常比直接删文件更值得警惕。我习惯写一个定时脚本用stat校验这些关键文件的权限和变更时间一旦异常立刻告警。权限基线是那种平时感觉不到价值出事了才知道多重要的东西。3.3 GRUB引导与单用户模式物理接触也要纳入防守很多人只关注网络攻击忽略了物理接触。如果机房管理不严攻击者重启机器进单用户模式可以直接改root密码。所以GRUB引导必须设置密码保护grub2-setpassword执行后会提示输入两遍密码自动生成/boot/grub2/user.cfg。设置了GRUB密码后单用户模式会先要求输入GRUB用户名与密码再进入恢复Shell。同时/etc/sysconfig/grub中不应以明文方式暴露密码哈希。我还想提醒一句带IPMI/BMC的服务器BMC管理口同样要纳入基线。管理口的默认口令、网络隔离、访问控制很多人压根没管过。我之前处理过一台服务器攻击者就是通过BMC的默认口令拿到了系统控制权这个入口比SSH隐蔽得多。在物理机的安全基线里BMC绝对是高优先级的检查项。3.4 umask与默认权限策略先堵住新建文件默认可写的口子umask这个细节容易被忽略。很多系统默认umask是022新建文件权限644、新建目录755。如果运维同学习惯用root操作022会导致部分配置文件可被其他用户读取文件里万一藏着密码或密钥问题就大了。我建议把全局umask调整为027新建文件644、目录750其他用户一律无权读写。系统级在/etc/profile和/etc/bashrc里设置服务进程则在systemd unit里通过UMask0027指定。不过要小心umask调整会影响需要组共享的目录比如Git仓库、SVN共享目录。如果团队协作需要同组写权限应当单独给相关目录设置ACL或保留组写位而不是全局退回022。这个细节不做后面会有一堆文件怎么突然没法改的投诉找上你。4. 服务与端口最小化能不开的服务一个都不要开4.1 服务面盘点看看系统里到底跑了什么我接手过很多所谓全新上线的服务器上面除了业务服务还躺着一堆莫名其妙的东西avahi-daemon、cups、postfix、telnet-server。这些服务要么是装系统时默认带的要么是装某个依赖包时无意拉进来的部署完就再没人管过。服务最小化的第一步是把系统服务完整盘一遍systemctl list-unit-files --typeservice --stateenabled ss -tlnp对照清单逐一确认这个服务干什么的、谁在用、监听哪个端口。确认无用的直接禁停systemctl disable --now 服务名。默认服务里我最建议优先处理这几个autofs会自动挂载并触发内核模块存在被利用风险、cups打印服务历史上有多个RCE漏洞、avahi-daemonmDNS零配置网络企业环境基本用不到、rpcbindNFS依赖不跑NFS必关。每次收编服务面总能发现几台机器开着谁都不知道的端口而攻击者最喜欢的就是这种隐形服务。4.2 防火墙策略默认拒绝是最省心的安全感我做基线时永远遵循一个原则防火墙不是用来放行需要的而是用来拒绝所有不需要的。以firewalld为例把默认zone的target设为DROP然后只放行业务端口firewall-cmd --set-default-zonedrop firewall-cmd --permanent --add-servicessh firewall-cmd --permanent --add-rich-rulerule familyipv4 source address10.0.0.0/8 port port3306 protocoltcp accept firewall-cmd --reload这里尤其要注意MySQL、Redis、MongoDB这类数据库端口只允许应用服务器网段访问绝不要暴露在0.0.0.0。我见过不止一次Redis端口因无认证暴露在公网被人写入SSH公钥直接拿下整台服务器。用了默认拒绝之后Redis就算忘了设密码外部也无法直连至少止血了。防火墙策略的另一个好处是它能给应急响应争取时间——出问题时先切流量、缩暴露面再慢慢排查。4.3 端口收敛与进程管理监听端口的白名单化做完防火墙还要检查本机监听的端口。有时防火墙规则没问题但服务器上某个开发框架自带的调试端口还在监听。用ss -tlnp列出所有监听端口及对应进程建立一张本机监听端口白名单表端口号、进程、业务归属、负责人。不在白名单内的端口要么关服务要么在防火墙明确拒绝。容器或微服务架构下宿主机上会有很多动态端口建议用bridge或自定义网络收敛暴露面宿主机只映射必要的端口。还有一个小技巧把ss -tlnp的结果纳入每周巡检告警出现新监听的端口就通知负责人确认。很多安全问题最开始只是一个临时开一下的端口最后变成了长期口子。白名单机制能在口子出现的第一时间发出信号。5. 审计链路的完整性建设出了问题至少能说清楚谁在什么时候干了什么5.1 时间同步与日志统一收集先让审计聚得起来审计链路有个常被忽略的前提系统时间必须一致否则跨服务器的日志时间戳根本没法对齐。我会在基线中固定一套chrony同步配置让所有服务器同步到内网时间服务器并设置restrict规则限制访问来源。时间不同步导致的日志错位在溯源时非常致命——你以为攻击发生在凌晨3点另一台机器记录的却是凌晨2点59分差出来的那一分钟可能正是关键证据。日志统一收集方面我用rsyslog把所有关键日志集中到一台日志服务器或SIEM采集范围至少包括auth/secure、messages、sudo.log、audit.log、业务日志。服务端配置# /etc/rsyslog.conf 追加 module(loadimtcp) input(typeimtcp port514) $template RemoteLogs,/data/logs/%fromhost-ip%/%programname%.log *.* ?RemoteLogs客户端配置一行转发即可*.* 10.10.10.100:514需要注意rsyslog的TCP传输默认不加密跨公网建议配合TLS或专用加密通道内网至少要做访问控制限制只有服务器网段能访问514端口。日志服务器的磁盘要按日志量规划我的经验是日均1GB日志量至少保留90天单台日志服务器磁盘按100GB起步预留。日志聚得起来审计才有意义。5.2 auditd内核审计记录系统调用级别的关键行为rsyslog记录的是应用层日志auditd则能深入系统调用级别这是审计链路里不可替代的一环。我常用的审计规则# 监控账号与权限相关文件 -w /etc/passwd -p wa -k identity -w /etc/shadow -p wa -k identity -w /etc/sudoers -p wa -k privilege # 监控关键目录写入 -w /etc/ -p wa -k etc_modify -w /var/log/ -p wa -k log_modify # 记录root执行的命令 -a always,exit -F archb64 -S execve -F euid0 -k root_exec配置后必须重启auditd并确认规则生效auditctl -l。auditd的规则有个尺度问题写少了起不到溯源作用写多了会产生大量日志影响性能。我的建议是初期只覆盖账号文件、sudoers、定时任务、关键配置目录运行一周观察日志量再决定是否扩展系统调用级规则。audit.log目录也要纳入日志集中采集避免单机日志被攻击者清除后无据可查。5.3 日志轮转与保留策略日志不是无限长的日志如果不轮转早晚会把磁盘写满业务一挂又制造新的故障。我用logrotate统一管理轮转策略/var/log/secure /var/log/messages /var/log/cron { weekly rotate 12 compress missingok notifempty sharedscripts postrotate systemctl restart rsyslog endscript }轮转配置的关键参数是轮转频率、保留份数、是否压缩、是否通知。业务量大时改成daily保留份数按90天需求折算。特别要提醒的是postrotate里重启rsyslog这个动作——如果漏掉旧日志被重命名后rsyslog依然握着旧文件句柄新日志会继续写进已轮转的文件排查问题时你会看到日志卡在几天前非常误事。这个坑我踩过一次后来所有机器统一加上了。5.4 日志的完整性与防篡改审计日志自己也要被保护日志审计的高阶问题是攻击者拿到root后第一件事往往就是清理日志。所以日志的完整性保护必须前置。我常用的手段有几种日志服务器与业务服务器分离业务机被入侵时日志服务器上仍保留原始转发记录auditd配置不可变规则-e 2启用后要修改审计规则必须先进单用户模式条件允许时给日志服务器搭配防篡改存储或对象存储的不可变桶这是云端环境常用的兜底方案。很多人觉得日志防篡改是高级别合规才需要我建议哪怕只是二级合规至少也要做到日志服务器分离。我处理过的一起勒索事件里正是靠日志服务器上残留的转发记录定位到攻击者是通过一个半年未清理的测试账号登录的单机日志早被删得干干净净。没有那台日志服务器整起事件基本无法溯源。6. 前瞻防护基线不是一次性配置而是持续运行的安全能力6.1 文件完整性监控基线的哨兵合规加固做完之后最怕的就是配置被改回去业务同事紧急调优改了sysctl或者攻击者偷偷动了ssh配置。文件完整性监控就是这个问题的哨兵。AIDEAdvanced Intrusion Detection Environment是我用得比较多的方案。初始化数据库aide --init生成/var/lib/aide/aide.db.new.gz后改名为aide.db.gz。然后配置定时任务每日比对0 0 * * * /usr/sbin/aide --check /var/log/aide-check.log 21同时把aide-check.log纳入监控出现New filesRemoved filesChanged files关键词时立即告警确保配置被改动时第一时间收到通知。AIDE配置里有一个关键点必须注意对/var/log目录、临时目录、进程运行时文件/proc、/run要做排除否则每次比对都会出现大量误报三天下来就没人愿意看告警了监控形同虚设。宁可把排除规则设置得宽一些也要保证告警的可信度。文件完整性监控的价值不在于天天检查而在于关键变化能被看见。这个机制坚持半年以上你就能积累出一份属于自己的高危变更清单知道哪些文件是重点盯防对象。6.2 自动化巡检与基线核查用脚本避免人肉检查我推荐至少每周跑一次基线核查脚本核心逻辑是对照基线库逐项检查输出符合、不符合、异常三类结果。比如检查SSH配置的脚本片段#!/bin/bash # ssh_config_check.sh prohibit$(grep -E ^PermitRootLogin /etc/ssh/sshd_config | awk {print $2}) pass$(grep -E ^PasswordAuthentication /etc/ssh/sshd_config | awk {print $2}) echo PermitRootLogin$prohibit PasswordAuthentication$pass if [[ $prohibit no $pass no ]]; then echo SSH基线检查通过 else echo SSH基线检查失败 fi更进一步可以用Lynis做系统级安全扫描。Lynis是开源安全审计工具跑一遍会给出安全指数和建议项还能输出HTML报告。虽然很多建议项需要人工确认但作为常态化的体检工具很称职。巡检脚本和Lynis报告建议接入运维管理平台或邮件告警让不合规状态在第一时间暴露出来。这一层做扎实了安全基线才真正从文档变成了运行中的机制。6.3 漏洞与补丁管理节奏安全基线需要保鲜安全基线不是一成不变的。新CVE出现后旧基线就可能出现新缺口。我在企业里推的补丁管理节奏是每月一次例行补丁窗口每季度一次安全专项更新高危漏洞在7天内完成临时缓解措施——封禁端口、加防护规则、收缩访问来源都算。临时缓解措施很重要因为有时补丁跟不上旧版本停止支持、依赖冲突但至少可以通过缩小暴露面先止血。有一次OpenSSH爆出严重漏洞我们无法立刻升级就先在防火墙上把SSH端口限制为仅运维网段访问同时启用fail2ban做暴力破解防护撑到补丁发布。补丁之外还要关注软件供应链风险服务器上的第三方组件、容器镜像里的基础库都要引入镜像源和依赖库的漏洞扫描。这是很多企业安全基线的盲区但往往漏洞就藏在最不起眼的依赖里。6.4 异常检测与应急响应预案从合规达标走向主动防御最后我想强调基线加固解决的是已知风险的收敛但安全是攻防对抗不能只有防御。我建议在基线之上叠加三层能力。第一层是登录与命令的异常检测通过auditd日志或sudo.log定期分析异常时间点的登录行为、高频sudo执行、非常规进程。可以每天跑一条简单的统计journalctl --since yesterday 23:00 --until today 4:00 -u sshd | grep Accepted第二层是轻量级HIDS。如果团队没有专职安全人员可以从falco这类开源工具起步监控容器和主机的异常系统调用比如反弹Shell、写/root/.ssh/authorized_keys这类高危动作。第三层是应急响应预案明确什么人、在什么情况下、执行哪些应急动作隔离服务器、冻结账号、保留内存镜像、切换流量每个动作都要有操作人。否则出真事了大家只能在会议室里大眼瞪小眼。从合规加固到前瞻防护这条路径的核心其实就一句话不要把安全基线当成一次性交付物要把它当成一台始终在运行的机器。机器会磨损、会过时、会遇到新的攻击方式需要定期保养、升级、演练。这篇上篇先把账号、内核、服务、审计这四个地基部分讲透了后续下篇我继续聊漏洞管理、应急响应和自动化运营平台的搭建。如果你在落地过程中有独到的经验或踩到奇怪的坑欢迎来聊聊我们一起把这份企业级Linux服务器安全基线打磨得更好用。
返回列表