在 Ubuntu 服务器环境中,用户与权限管理是安全与运维的基础。错误的权限设置可能导致服务无法启动、数据泄露、误删除关键文件,甚至被恶意利用提权。本文聚焦生产环境最实用、最常踩坑的部分,减少代码堆砌,更多用文字说明思路与场景,帮助你建立清晰的权限思维框架。
一、核心概念快速建立认知
- 用户:每个能登录或运行进程的实体都有唯一标识(UID),root 是 0,普通用户通常从 1000 开始。
- 组:用户可以属于多个组,组是批量授权的快捷方式(例如把用户加到 docker 组就能无 sudo 用 docker)。
- 权限三元组:文件/目录的权限分为“拥有者”“所属组”“其他用户”三类,每类有读(r)、写(w)、执行(x)三种权限。
- sudo:普通用户临时以 root 或其他用户身份执行命令,是日常运维最常用的提权方式。
- 特殊权限:SUID(程序以文件拥有者身份运行)、SGID(目录新建文件继承组)、Sticky bit(只有文件拥有者能删除)——生产中慎用。
二、用户管理的核心思路与常用操作
- 查看自己和他人信息 登录后第一件事:确认“我是谁、在哪些组”。 常用命令:whoami(当前用户名)、id(UID、GID、所有组)、groups(所属组列表)。
- 创建用户 生产环境强烈推荐用 adduser 而非 useradd:
- 交互式创建家目录、设置密码、填写备注信息。
- 适合给开发、运维、测试人员创建账号。 创建后立即加入必要组,例如 sudo(可提权)、docker(容器管理)等。
- 修改与禁用用户
- 加入/移除组:usermod -aG 组名 用户名(-a 千万别忘,否则会覆盖原有组)。
- 禁止登录:把 shell 改为 /usr/sbin/nologin 或 /bin/false(服务账号常用)。
- 锁定/解锁账号:usermod -L / -U。
- 查看密码策略:chage -l 用户名(过期时间、最短使用天数等)。
- 删除用户 务必带上 –remove-home 参数,彻底清理家目录,避免残留敏感文件(如 .ssh/authorized_keys)。
三、组管理的实用原则
- 系统常用组:sudo(提权)、adm(读日志)、www-data(Web 服务进程)、docker、video(GPU 访问)等。
- 批量授权优先用组而非单个用户:例如把运维团队加到一个 ops 组,再给 ops 组授权特定命令。
- 避免把普通用户加到 root 组(极度危险)。
四、文件与目录权限的正确思维
- 读懂 ls -l 输出 示例:-rw-r—– 1 root www-data 4096 Oct 10 config.conf → 拥有者 root 可读写,所属组 www-data 只读,其他人无权限。
- 常用权限设置原则
- 脚本/可执行文件 → 755(拥有者全权,其他人可读可执行)
- 配置文件 → 640 或 600(拥有者读写,组只读或无权)
- 敏感目录 → 750(拥有者全权,组可进入,其他人无权)
- 公开读取目录(如 /var/www/html)→ 755
- 禁止写入 → 避免 777(极度危险,任何人都可修改)
- 递归修改 目录权限变更通常要加 -R(递归),但先 ls 确认范围,避免误改系统目录。
五、sudo 的安全精细化配置(生产必做)
- 永远不要直接编辑 /etc/sudoers,改用 /etc/sudoers.d/ 下的独立文件。
- 典型安全写法思路:
- 允许特定用户无密码执行有限命令(例如重启 nginx、查看日志)。
- 允许某个组成员以特定身份运行特定程序。
- 禁止危险命令或要求密码验证关键操作。
- 验证语法:visudo -c(检查所有 sudoers 文件是否合法)。
六、生产环境权限管理最佳实践
- 最小权限原则 所有服务进程尽量用独立非 root 用户运行(nginx 用 www-data,mysql 用 mysql,postgres 用 postgres)。
- 禁用 root 直接登录 SSH 只允许密钥登录,且禁用 root 密码/密钥登录。
- 密钥优先,密码为辅 全面转向 ed25519 密钥,禁用密码认证(PasswordAuthentication no)。
- 家目录与 umask 默认新建文件/目录权限建议 umask 027(文件 640,目录 750),防止其他用户意外读取。
- 定期审计
- 查看最近 sudo 使用记录(grep sudo /var/log/auth.log)。
- 检查 SUID/SGID 文件(find / -perm -4000 -o -perm -2000)。
- 监控暴力破解尝试(grep Failed /var/log/auth.log)。
- fail2ban + ufw 组合 防暴力破解 + 最小端口开放,是权限安全的最后一道防线。
七、快速排查口诀(背下来用)
- 我是谁? → whoami / id
- 我有哪些权限? → groups / id -Gn
- 这个文件谁能动? → ls -l(再看 getfacl 如果用了 ACL)
- 谁最近登录/用了 sudo? → last / grep sudo /var/log/auth.log
- 密码策略如何? → chage -l 用户名
掌握这些思路后,你不再是“看到权限问题就 chmod 777”,而是能精准判断“这个文件应该给谁、给多少权限”。权限管理没有捷径,但建立好“最小权限 + 组批量授权 + sudo 精细控制”的思维,90% 的安全与误操作问题都能避免。