新装的服务器暴露在公网几小时内就会收到扫描和爆破——这不是危言耸听是常态。安全加固不是「出了问题再补」而是上线前的必修课。这一篇从账号、权限、服务、网络、审计五个维度给出一份可落地的 Linux 安全加固清单每一项都配上命令和配置照着做就能把默认配置的「裸奔」状态升级为有基本防线的状态。一、安全加固的四个维度加固的本质是缩小攻击面。先建立清单框架维度目标账号谁能登录怎么登录权限能访问什么权限是否最小服务对外开放哪些端口和服务网络谁能访问访问控制审计出事了能不能查到核心原则最小权限只给必要的、最小暴露只开必要的、可追溯记录能查。二、账号安全账号是入侵的第一道门也是爆破的主要目标。1. 禁用或锁定不用的账号# 查看所有可登录用户看 shell 是否是 nologin/falseawk-F:$7 !~ /(nologin|false)$/ {print $1, $7}/etc/passwd# 查看有密码的账号sudoawk-F:$2 ~ /^[$]/ {print $1}/etc/shadow# 锁定账号sudousermod-Lolduser# 解锁sudousermod-Uolduser2. 清理 UID 为 0 的账号UID 0 root除了 root 本身其他 UID 为 0 的都是后门嫌疑awk-F:$30 {print $1}/etc/passwd正常应只有root一行。3. 设置密码策略sudovim/etc/login.defsPASS_MAX_DAYS 90 # 密码最长有效期 PASS_MIN_DAYS 7 # 最短修改间隔 PASS_MIN_LEN 12 # 最小长度 PASS_WARN_AGE 7 # 过期前警告天数配合pam_pwquality强化复杂度sudovim/etc/security/pwquality.confminlen 12 dcredit -1 # 至少 1 个数字 ucredit -1 # 至少 1 个大写 lcredit -1 # 至少 1 个小写 ocredit -1 # 至少 1 个特殊字符4. 禁用 root 直接登录 密钥登录sudovim/etc/ssh/sshd_configPermitRootLogin no PasswordAuthentication no PubkeyAuthentication yes MaxAuthTries 35. 防暴力破解# fail2ban多次失败登录后封 IPsudoaptinstallfail2ban-ysudocp/etc/fail2ban/jail.conf /etc/fail2ban/jail.local# 编辑 jail.local 启用 sshdsudosystemctlenable--nowfail2ban# 查看封禁状态sudofail2ban-client status sshd6. 登录超时与历史记录# 命令行超时空闲 5 分钟自动登出echoTMOUT300|sudotee-a/etc/profile# 记录所有用户的命令历史到统一日志echoexport PROMPT_COMMANDhistory -a|sudotee-a/etc/profile三、权限与文件安全1. 检查危险权限文件# 全局可写的文件除 /tmp、/var/tmp 外应极少sudofind/-xdev-typef-perm-0002-print2/dev/null# 无属主文件sudofind/-xdev\(-nouser-o-nogroup\)-print2/dev/null# 全局可写的 SUID 文件sudofind/-xdev-perm-4000-typef-print2/dev/null2. SUID/SGID 审查SUID 文件能以属主权限运行是提权重点# 列出所有 SUID 文件sudofind/-perm-4000-typef2/dev/null# 列出所有 SGID 文件sudofind/-perm-2000-typef2/dev/null对应已知的 SUID 列表多出来的要警惕。3. 关键文件权限sudochmod600/etc/shadow# 密码哈希sudochmod644/etc/passwdsudochmod600/etc/ssh/sshd_configsudochmod700/root4. 设置 umask# 默认新建文件权限文件 644、目录 755echoumask 022|sudotee-a/etc/profile# 更严格文件 640、目录 750# umask 027四、服务与端口收敛用不到的服务和端口就是攻击面。1. 列出监听端口逐个确认sudoss-tlnpsudoss-ulnp对每一个0.0.0.0监听的端口问这个真的需要对外开放吗2. 关闭不需要的服务# 列出运行的服务systemctl list-units--typeservice--staterunning# 停用并禁用sudosystemctl stop cupssudosystemctl disable cups3. 数据库只监听内网# MySQLbind-address 127.0.0.1 或内网 IP# Redisbind 127.0.0.1 设置密码# MongoDB配置 bindIp 开启认证这是最容易被忽略、后果最严重的问题——裸奔的 Redis/MongoDB 是挖矿木马的最爱。4. 最小化安装装系统时选 minimal不装图形界面、不装的软件包从源头减少攻击面。五、网络与访问控制1. 防火墙默认拒绝入站# ufwsudoufw default deny incomingsudoufw default allow outgoingsudoufw allow22/tcpsudoufwenable2. SSH 限制来源# 只允许特定网段访问 SSHsudoufw allow from203.0.113.0/24 to any port223. 限制服务访问源数据库、缓存、内部 API 只允许内网访问用防火墙 服务绑定双重限制。4. 关闭不必要的 ICMP视需求可减少被探测# 屏蔽 ping按需echo1|sudotee/proc/sys/net/ipv4/icmp_echo_ignore_all5. 禁用 IPv6如不用减少暴露面# /etc/sysctl.confnet.ipv6.conf.all.disable_ipv61六、审计与日志「出事了查不到」是最尴尬的状态。1. 系统日志# systemd 系统journalctl-usshd--since1 hour ago# 传统tail-f/var/log/auth.log# Debian/Ubuntutail-f/var/log/secure# RHEL/CentOS2. auditd系统调用审计auditd能记录文件访问、命令执行、权限变更sudoaptinstallauditd-y# 监控敏感文件sudoauditctl-w/etc/passwd-pwa-kpasswd_changesudoauditctl-w/etc/shadow-pwa-kshadow_change# 监控提权sudoauditctl-aalways,exit-Farchb64-Sexecve-Feuid0-kroot_cmd# 查询审计日志sudoausearch-kpasswd_change3. 登录审计# 最近登录last lastlog# 失败登录sudolastb# 当前登录whow4. 日志集中化重要的日志应发送到远程日志服务器防止入侵者本地删日志掩盖痕迹。可以用rsyslog转发到远端见第 91 篇。七、合规基线CIS不想逐条手工检查可以用自动化工具跑「安全基线」。Lynis系统安全审计sudoaptinstalllynis-ysudolynis audit system它会给出一份安全评分和改进建议覆盖认证、内核、服务、文件权限等[] Hardening index : 68 [############ ] [!] Suggestions: * Consider hardening SSH configuration [SSH-7408] * Set password aging for accounts [AUTH-9282]OpenSCAP合规扫描面向 CIS、PCI-DSS 等标准的合规检查适合企业sudooscap xccdfeval--profilecis--resultsreport.xml\--reportreport.html /usr/share/xml/scap/ssg/content/ssg-ubuntu2004-ds.xml自动化的价值手动加固容易漏、难复查、难审计。用 Lynis/OpenSCAP 定期跑把「是否合规」变成可量化、可追踪的指标。八、⚠️ 常见错误禁用密码登录前没配好密钥。直接把自己锁在门外只能去控制台救。先验证密钥能登录再禁用。数据库/缓存裸奔公网。Redis 无密码 0.0.0.0几分钟就被植入挖矿。这是最高频的入侵原因。只改默认端口不开防火墙。改 SSH 端口只是「降低被扫频率」不是安全措施防火墙仍要配。忽略 SUID 审查。攻击者拿到普通账号后靠 SUID 提权到 root。日志只留本地。入侵者第一步就是删日志必须异地集中。umask 太宽松。默认 022 已够配成 000 会让新建文件全局可写。不做变更记录。加固完不记录改了什么出问题无法回溯。一次性加固不复查。软件升级、配置漂移会让加固失效要定期复扫。九、原理探究攻击面与最小权限攻击面Attack Surface安全加固的本质是缩小攻击面。攻击面 「外部可以从哪些入口接触系统」攻击面 暴露的端口 可登录的账号 可访问的服务 已知漏洞 危险配置加固就是逐项缩小关掉不必要的端口 → 减少入口禁用不用的账号 → 减少爆破目标数据库只绑内网 → 减少暴露及时打补丁 → 减少已知漏洞收紧权限 → 减少提权可能每减少一项攻击者成功的概率就下降一分。最小权限原则Principle of Least Privilege每个账号、进程、服务都应该只拥有完成其职责所需的最小权限服务不用 root 跑 → 被攻破也拿不到 root用User指定低权限用户数据库账号只给必要库表的权限 → 拖库危害降低文件权限最小化 → 敏感数据不易被读sudo 精细授权 → 不用「全开」的 sudoers最小权限的核心逻辑假设「一定会被攻破」让攻破的后果尽可能小纵深防御 defense in depth。分层防御纵深防御没有任何单一措施是万无一失的。纵深防御是叠多层第 1 层网络防火墙谁不能进 第 2 层SSH 密钥 禁密码怎么进 第 3 层最小权限用户进去能干多少 第 4 层SELinux/AppArmor进程能碰什么 第 5 层auditd 审计干了什么有记录 第 6 层异地日志证据不被销毁攻击者要得手得同时突破所有层难度呈指数级上升。一个现实提醒安全加固没有「完成」一说只有持续改进。系统在变、漏洞在出、配置会漂移。把加固当作周期性动作上线前 定期复扫用 Lynis/OpenSCAP 量化用 auditd 追溯才能长期维持在一个可接受的安全水位。十、加固清单速查# 【账号】awk-F:$30 {print $1}/etc/passwd# 检查 UID 0 账号usermod-L不用的账号# sshd_config: PermitRootLogin no / PasswordAuthentication no# 【权限】find/-perm-4000-typef2/dev/null# SUID 审查find/-nouser-o-nogroup2/dev/null# 无属主文件# 【服务】ss-tlnp# 逐个确认监听端口systemctl disable 不需要的服务# 【网络】ufw default deny incomingufwenable# 【审计】aptinstallauditdauditctl-w/etc/passwd-pwa-kpasswdlast / lastb / ausearch-kpasswd# 【基线扫描】lynis audit system一句话收尾账号收紧、权限最小、服务收敛、网络设防、审计留痕——五道防线叠加才是可用的服务器安全基线。记住核心心法假设一定会被攻破让每层都尽量扛住、让后果尽量小。下一篇讲 SELinux 与 AppArmor把「强制访问控制」这层更底层的防线讲透。