Linux 服务器是 Web 应用最常见的运行环境,一旦账户与权限配置存在疏漏,攻击者往往能以极低成本从 Web 层横向渗透到系统层。本文从账户管理、权限控制、SSH 加固和审计监控四个维度,梳理一套可落地的加固方案。
一、账户管理:减少攻击面
1.1 清理不必要的账户
系统预置账户(如 games、ftp、lp)如果未被使用,应直接锁定或删除。攻击者常利用这些默认账户进行暴力破解。
# 查看所有可登录账户
awk -F: '$7 !~ /(nologin|false)$/ {print $1}' /etc/passwd
# 锁定无用账户
usermod -L games
usermod -s /sbin/nologin ftp
对于确实需要保留但无需交互登录的服务账户,将 shell 设为 /sbin/nologin,并检查 /etc/shadow 中密码字段是否为 !! 或 *。
1.2 设置强密码策略
通过 pam_pwquality 模块强制密码复杂度:
# /etc/security/pwquality.conf
minlen = 12
dcredit = -1
ucredit = -1
lcredit = -1
ocredit = -1
maxrepeat = 3
同时配置 /etc/login.defs 中的密码有效期:
PASS_MAX_DAYS 90
PASS_MIN_DAYS 7
PASS_WARN_AGE 14
1.3 限制 root 直接登录
禁止 root 通过 SSH 登录,改为普通用户登录后 su 或 sudo 提权。这样即使 SSH 密码泄露,攻击者也无法直接获得最高权限。
二、权限控制:最小权限原则
2.1 文件权限与属主
Web 目录的权限配置是最容易出问题的地方。常见错误是将目录设为 777,或者让 Web 进程以 root 运行。
推荐配置:
# Web 根目录属主为部署用户,属组为 Web 服务组
chown -R deploy:www-data /var/www/html
find /var/www/html -type d -exec chmod 750 {} \;
find /var/www/html -type f -exec chmod 640 {} \;
# 上传目录禁止执行脚本
chmod 750 /var/www/html/uploads
Nginx/Apache 的 worker 进程应以 www-data 等低权限用户运行,绝不能是 root。
2.2 sudo 精细化授权
避免在 /etc/sudoers 中使用 ALL=(ALL) NOPASSWD: ALL。应按需授权:
deploy ALL=(root) NOPASSWD: /usr/bin/systemctl restart nginx
ops ALL=(root) /usr/bin/journalctl, /usr/bin/tail
使用 visudo -c 校验语法,并将自定义规则放入 /etc/sudoers.d/ 目录便于管理。
2.3 敏感文件的特殊权限
/etc/shadow应为0000或0400,属组shadow- 含密码的配置文件(如
.env、wp-config.php)设为600 - 使用
chattr +i锁定关键文件,防止被篡改:
chattr +i /etc/passwd /etc/shadow /etc/sudoers
三、SSH 加固:守住入口
SSH 是服务器最主要的入口,加固要点如下:
# /etc/ssh/sshd_config
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
PermitEmptyPasswords no
MaxAuthTries 3
LoginGraceTime 30
AllowUsers deploy ops
Protocol 2
关键措施包括:
- 禁用密码登录,仅允许密钥认证。生成密钥时使用
ed25519算法,并为私钥设置 passphrase。 - 修改默认端口(如改为 22022),可减少大量自动化扫描。
- 限制来源 IP,通过
AllowUsers、防火墙或安全组只放行可信网段。 - 部署 Fail2ban,自动封禁多次认证失败的 IP:
# /etc/fail2ban/jail.local
[sshd]
enabled = true
maxretry = 3
bantime = 3600
findtime = 600
四、审计与监控:及时发现异常
4.1 启用审计日志
使用 auditd 监控关键文件和命令:
# 监控 /etc/passwd 的写入和属性变更
auditctl -w /etc/passwd -p wa -k passwd_change
auditctl -w /etc/sudoers -p wa -k sudoers_change
# 监控提权命令
auditctl -a always,exit -F arch=b64 -S execve -F euid=0 -k rootcmd
4.2 定期检查账户异常
# 查看最近登录记录
last -n 20
# 查看失败登录
lastb -n 20
# 检查 UID 为 0 的账户
awk -F: '$3 == 0 {print $1}' /etc/passwd
# 检查空密码账户
awk -F: '$2 == "" {print $1}' /etc/shadow
将上述检查脚本化,配合 cron 定期执行并邮件告警。
4.3 文件完整性监控
使用 AIDE 或 Tripwire 建立文件基线,定期比对关键目录的哈希值。一旦 /bin、/sbin、/etc 出现非预期变更,立即排查是否被植入后门。
五、加固清单速查
| 类别 | 措施 | 优先级 |
|---|---|---|
| 账户 | 清理无用账户、锁定服务账户 | 高 |
| 密码 | 强密码策略、90 天有效期 | 高 |
| 权限 | Web 目录 750/640、禁止 777 | 高 |
| sudo | 精细化授权、禁用 NOPASSWD ALL | 高 |
| SSH | 禁用 root 和密码登录、密钥认证 | 高 |
| 防火墙 | 仅放行必要端口 | 高 |
| 审计 | auditd + Fail2ban + AIDE | 中 |
| 监控 | 登录日志巡检、UID 0 检查 | 中 |
结语
Linux 账户与权限加固的核心思路是最小权限和纵深防御:能不给的权限就不给,能给小的就不给大的,同时在入口、执行、审计三个层面都设置检查点。加固不是一次性的工作,而应纳入日常运维流程,配合自动化巡检和定期复查,才能持续保持系统的安全基线。
未经允许不得转载:任鹏个人博客 » Linux 账户与权限安全加固实践


朋友圈点赞图在线生成源码