新装的服务器暴露在公网,几小时内就会收到扫描和爆破------这不是危言耸听,是常态。安全加固不是「出了问题再补」,而是上线前的必修课。这一篇从账号、权限、服务、网络、审计五个维度,给出一份可落地的 Linux 安全加固清单,每一项都配上命令和配置,照着做就能把默认配置的「裸奔」状态升级为有基本防线的状态。
一、安全加固的四个维度
加固的本质是缩小攻击面。先建立清单框架:
| 维度 | 目标 |
|---|---|
| 账号 | 谁能登录,怎么登录 |
| 权限 | 能访问什么,权限是否最小 |
| 服务 | 对外开放哪些端口和服务 |
| 网络 | 谁能访问,访问控制 |
| 审计 | 出事了能不能查到 |
核心原则:最小权限(只给必要的)、最小暴露(只开必要的)、可追溯(记录能查)。
二、账号安全
账号是入侵的第一道门,也是爆破的主要目标。
1. 禁用或锁定不用的账号
bash
# 查看所有可登录用户(看 shell 是否是 nologin/false)
awk -F: '$7 !~ /(nologin|false)$/ {print $1, $7}' /etc/passwd
# 查看有密码的账号
sudo awk -F: '$2 ~ /^[$]/ {print $1}' /etc/shadow
# 锁定账号
sudo usermod -L olduser
# 解锁
sudo usermod -U olduser
2. 清理 UID 为 0 的账号
UID 0 = root,除了 root 本身,其他 UID 为 0 的都是后门嫌疑:
bash
awk -F: '$3==0 {print $1}' /etc/passwd
正常应只有 root 一行。
3. 设置密码策略
bash
sudo vim /etc/login.defs
text
PASS_MAX_DAYS 90 # 密码最长有效期
PASS_MIN_DAYS 7 # 最短修改间隔
PASS_MIN_LEN 12 # 最小长度
PASS_WARN_AGE 7 # 过期前警告天数
配合 pam_pwquality 强化复杂度:
bash
sudo vim /etc/security/pwquality.conf
text
minlen = 12
dcredit = -1 # 至少 1 个数字
ucredit = -1 # 至少 1 个大写
lcredit = -1 # 至少 1 个小写
ocredit = -1 # 至少 1 个特殊字符
4. 禁用 root 直接登录 + 密钥登录
bash
sudo vim /etc/ssh/sshd_config
text
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
MaxAuthTries 3
5. 防暴力破解
bash
# fail2ban:多次失败登录后封 IP
sudo apt install fail2ban -y
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
# 编辑 jail.local 启用 sshd
sudo systemctl enable --now fail2ban
# 查看封禁状态
sudo fail2ban-client status sshd
6. 登录超时与历史记录
bash
# 命令行超时(空闲 5 分钟自动登出)
echo 'TMOUT=300' | sudo tee -a /etc/profile
# 记录所有用户的命令历史到统一日志
echo 'export PROMPT_COMMAND="history -a"' | sudo tee -a /etc/profile
三、权限与文件安全
1. 检查危险权限文件
bash
# 全局可写的文件(除 /tmp、/var/tmp 外应极少)
sudo find / -xdev -type f -perm -0002 -print 2>/dev/null
# 无属主文件
sudo find / -xdev \( -nouser -o -nogroup \) -print 2>/dev/null
# 全局可写的 SUID 文件
sudo find / -xdev -perm -4000 -type f -print 2>/dev/null
2. SUID/SGID 审查
SUID 文件能以属主权限运行,是提权重点:
bash
# 列出所有 SUID 文件
sudo find / -perm -4000 -type f 2>/dev/null
# 列出所有 SGID 文件
sudo find / -perm -2000 -type f 2>/dev/null
对应已知的 SUID 列表,多出来的要警惕。
3. 关键文件权限
bash
sudo chmod 600 /etc/shadow # 密码哈希
sudo chmod 644 /etc/passwd
sudo chmod 600 /etc/ssh/sshd_config
sudo chmod 700 /root
4. 设置 umask
bash
# 默认新建文件权限:文件 644、目录 755
echo 'umask 022' | sudo tee -a /etc/profile
# 更严格:文件 640、目录 750
# umask 027
四、服务与端口收敛
用不到的服务和端口,就是攻击面。
1. 列出监听端口,逐个确认
bash
sudo ss -tlnp
sudo ss -ulnp
对每一个 0.0.0.0 监听的端口问:这个真的需要对外开放吗?
2. 关闭不需要的服务
bash
# 列出运行的服务
systemctl list-units --type=service --state=running
# 停用并禁用
sudo systemctl stop cups
sudo systemctl disable cups
3. 数据库只监听内网
bash
# MySQL:bind-address = 127.0.0.1 或内网 IP
# Redis:bind 127.0.0.1 + 设置密码
# MongoDB:配置 bindIp + 开启认证
这是最容易被忽略、后果最严重的问题------裸奔的 Redis/MongoDB 是挖矿木马的最爱。
4. 最小化安装
装系统时选 minimal,不装图形界面、不装的软件包,从源头减少攻击面。
五、网络与访问控制
1. 防火墙默认拒绝入站
bash
# ufw
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 22/tcp
sudo ufw enable
2. SSH 限制来源
bash
# 只允许特定网段访问 SSH
sudo ufw allow from 203.0.113.0/24 to any port 22
3. 限制服务访问源
数据库、缓存、内部 API 只允许内网访问,用防火墙 + 服务绑定双重限制。
4. 关闭不必要的 ICMP
视需求,可减少被探测:
bash
# 屏蔽 ping(按需)
echo 1 | sudo tee /proc/sys/net/ipv4/icmp_echo_ignore_all
5. 禁用 IPv6(如不用)
减少暴露面:
bash
# /etc/sysctl.conf
net.ipv6.conf.all.disable_ipv6 = 1
六、审计与日志
「出事了查不到」是最尴尬的状态。
1. 系统日志
bash
# systemd 系统
journalctl -u sshd --since "1 hour ago"
# 传统
tail -f /var/log/auth.log # Debian/Ubuntu
tail -f /var/log/secure # RHEL/CentOS
2. auditd:系统调用审计
auditd 能记录文件访问、命令执行、权限变更:
bash
sudo apt install auditd -y
# 监控敏感文件
sudo auditctl -w /etc/passwd -p wa -k passwd_change
sudo auditctl -w /etc/shadow -p wa -k shadow_change
# 监控提权
sudo auditctl -a always,exit -F arch=b64 -S execve -F euid=0 -k root_cmd
# 查询审计日志
sudo ausearch -k passwd_change
3. 登录审计
bash
# 最近登录
last
lastlog
# 失败登录
sudo lastb
# 当前登录
who
w
4. 日志集中化
重要的日志应发送到远程日志服务器 ,防止入侵者本地删日志掩盖痕迹。可以用 rsyslog 转发到远端(见第 91 篇)。
七、合规基线(CIS)
不想逐条手工检查,可以用自动化工具跑「安全基线」。
Lynis:系统安全审计
bash
sudo apt install lynis -y
sudo lynis audit system
它会给出一份安全评分和改进建议,覆盖认证、内核、服务、文件权限等:
text
[+] Hardening index : 68 [############ ]
[!] Suggestions:
* Consider hardening SSH configuration [SSH-7408]
* Set password aging for accounts [AUTH-9282]
OpenSCAP:合规扫描
面向 CIS、PCI-DSS 等标准的合规检查,适合企业:
bash
sudo oscap xccdf eval --profile cis --results report.xml \
--report report.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)
安全加固的本质,是缩小攻击面。攻击面 = 「外部可以从哪些入口接触系统」:
text
攻击面 = 暴露的端口 + 可登录的账号 + 可访问的服务 + 已知漏洞 + 危险配置
加固就是逐项缩小:
- 关掉不必要的端口 → 减少入口
- 禁用不用的账号 → 减少爆破目标
- 数据库只绑内网 → 减少暴露
- 及时打补丁 → 减少已知漏洞
- 收紧权限 → 减少提权可能
每减少一项,攻击者成功的概率就下降一分。
最小权限原则(Principle of Least Privilege)
每个账号、进程、服务都应该只拥有完成其职责所需的最小权限:
- 服务不用 root 跑 → 被攻破也拿不到 root(用
User=指定低权限用户) - 数据库账号只给必要库表的权限 → 拖库危害降低
- 文件权限最小化 → 敏感数据不易被读
- sudo 精细授权 → 不用「全开」的 sudoers
最小权限的核心逻辑:假设「一定会被攻破」,让攻破的后果尽可能小(纵深防御 defense in depth)。
分层防御(纵深防御)
没有任何单一措施是万无一失的。纵深防御是叠多层:
text
第 1 层:网络防火墙(谁不能进)
第 2 层:SSH 密钥 + 禁密码(怎么进)
第 3 层:最小权限用户(进去能干多少)
第 4 层:SELinux/AppArmor(进程能碰什么)
第 5 层:auditd 审计(干了什么有记录)
第 6 层:异地日志(证据不被销毁)
攻击者要得手,得同时突破所有层,难度呈指数级上升。
一个现实提醒
安全加固没有「完成」一说,只有持续改进。 系统在变、漏洞在出、配置会漂移。把加固当作周期性动作(上线前 + 定期复扫),用 Lynis/OpenSCAP 量化,用 auditd 追溯,才能长期维持在一个可接受的安全水位。
十、加固清单速查
bash
# 【账号】
awk -F: '$3==0 {print $1}' /etc/passwd # 检查 UID 0 账号
usermod -L 不用的账号
# sshd_config: PermitRootLogin no / PasswordAuthentication no
# 【权限】
find / -perm -4000 -type f 2>/dev/null # SUID 审查
find / -nouser -o -nogroup 2>/dev/null # 无属主文件
# 【服务】
ss -tlnp # 逐个确认监听端口
systemctl disable 不需要的服务
# 【网络】
ufw default deny incoming && ufw enable
# 【审计】
apt install auditd && auditctl -w /etc/passwd -p wa -k passwd
last / lastb / ausearch -k passwd
# 【基线扫描】
lynis audit system
一句话收尾:账号收紧、权限最小、服务收敛、网络设防、审计留痕 ------五道防线叠加,才是可用的服务器安全基线。记住核心心法:假设一定会被攻破,让每层都尽量扛住、让后果尽量小。下一篇讲 SELinux 与 AppArmor,把「强制访问控制」这层更底层的防线讲透。