Linux 用户与权限规范
2026/3/20大约 3 分钟
Linux 用户与权限规范
[!warning] > 永远不要用 root 用户运行业务应用! 这是服务器安全的第一原则。
核心原则
最小权限原则
每个用户/进程只应拥有完成其任务所需的最小权限,不多不少。
root → 仅用于系统管理,不运行任何业务
deploy → 部署操作专用,可 sudo
app-xxx → 应用运行专用,无 sudo 权限
用户体系设计
推荐的用户划分
| 用户名 | 用途 | sudo 权限 | 登录权限 |
|---|---|---|---|
root | 系统管理 | ✅ | 禁止远程登录 |
deploy | 部署操作 | ✅ 有限制 | ✅ SSH 密钥 |
www-data | Web 服务 | ❌ | ❌ |
app-xxx | 具体应用 | ❌ | ❌ |
创建部署用户
# 创建 deploy 用户
useradd -m -s /bin/bash deploy
# 设置密码(用于 sudo 验证)
passwd deploy
# 添加到 sudo 组(Debian/Ubuntu)
usermod -aG sudo deploy
# 或添加到 wheel 组(CentOS/RHEL)
usermod -aG wheel deploy
配置有限的 sudo 权限
编辑 /etc/sudoers.d/deploy:
# 允许 deploy 用户执行特定命令,无需密码
deploy ALL=(ALL) NOPASSWD: /bin/systemctl restart app-*, \
/bin/systemctl reload nginx, \
/bin/systemctl status *
# 如果需要更宽松的权限(不推荐生产环境)
# deploy ALL=(ALL) NOPASSWD: ALL
提示
使用 visudo -f /etc/sudoers.d/deploy 编辑,可以自动检查语法错误。
应用运行用户
为什么要创建专用用户?
- 隔离风险:应用被攻破时,攻击者只能获得该用户权限
- 审计追踪:可以清晰知道哪个进程属于哪个应用
- 资源限制:可以针对用户设置 cgroup 限制
创建应用用户
# 创建系统用户(无登录权限、无家目录)
useradd --system --shell /usr/sbin/nologin --no-create-home app-blog
# 如果应用需要家目录
useradd --system --shell /usr/sbin/nologin --home /opt/apps/blog --create-home app-blog
参数说明:
--system:创建系统用户,UID 在系统用户范围内--shell /usr/sbin/nologin:禁止登录--no-create-home:不创建家目录
常见应用用户示例
# Web 应用
useradd --system --shell /usr/sbin/nologin app-web
# API 服务
useradd --system --shell /usr/sbin/nologin app-api
# 后台任务
useradd --system --shell /usr/sbin/nologin app-worker
# 数据库(通常安装时自动创建)
# mysql, postgres, mongodb 等
用户组管理
推荐的用户组
# 创建应用组,统一管理
groupadd apps
# 将应用用户加入组
usermod -aG apps app-blog
usermod -aG apps app-api
# 将 deploy 用户加入 apps 组(方便部署时操作文件)
usermod -aG apps deploy
利用用户组共享权限
# 场景:deploy 用户需要操作 app-blog 的文件
# 方式 1:通过共同组
usermod -aG app-blog deploy
# 方式 2:使用 ACL(更精细)
setfacl -R -m u:deploy:rwx /opt/apps/blog
setfacl -R -d -m u:deploy:rwx /opt/apps/blog # 默认 ACL,新文件自动继承
实战:完整的用户初始化脚本
#!/bin/bash
# init-users.sh - 初始化服务器用户
set -e
echo "=== 创建部署用户 ==="
useradd -m -s /bin/bash deploy || echo "deploy 用户已存在"
usermod -aG sudo deploy 2>/dev/null || usermod -aG wheel deploy
echo "=== 创建应用用户组 ==="
groupadd apps 2>/dev/null || echo "apps 组已存在"
echo "=== 创建应用用户 ==="
for app in web api worker; do
useradd --system --shell /usr/sbin/nologin --no-create-home "app-${app}" 2>/dev/null \
|| echo "app-${app} 用户已存在"
usermod -aG apps "app-${app}"
done
echo "=== 配置 sudo 权限 ==="
cat > /etc/sudoers.d/deploy << 'EOF'
deploy ALL=(ALL) NOPASSWD: /bin/systemctl restart app-*
deploy ALL=(ALL) NOPASSWD: /bin/systemctl reload nginx
deploy ALL=(ALL) NOPASSWD: /bin/systemctl status *
deploy ALL=(ALL) NOPASSWD: /bin/journalctl *
EOF
chmod 440 /etc/sudoers.d/deploy
echo "=== 用户初始化完成 ==="
id deploy
getent group apps
常见错误
❌ 错误做法
# 1. 用 root 运行应用
root$ node app.js # 危险!
# 2. 给应用用户 sudo 权限
usermod -aG sudo app-blog # 不需要!
# 3. 所有应用用同一个用户
useradd app # 太粗糙,无法隔离
# 4. 密码写在脚本里
echo "password123" | passwd --stdin deploy # 泄露风险
✅ 正确做法
# 1. 用专用用户运行应用
sudo -u app-blog node app.js
# 2. 应用用户不需要 sudo
# 通过 systemd 的 User= 指令运行即可
# 3. 每个应用一个用户
useradd --system app-blog
useradd --system app-api
# 4. 使用 SSH 密钥,禁用密码登录