Linux 的权限管理围绕三个对象展开:用户(User)、用户组(Group)和文件权限(Permission)。服务器被入侵或误删数据,很多时候不是系统漏洞,而是账号共用、权限过大或离职账号没有及时停用。正确做法是“一人一号、按需授权、操作可追踪”。
一、root 和 sudo 是什么关系
root 是超级用户(Superuser),UID 为 0,几乎不受普通文件权限限制。Ubuntu 默认禁止 root 直接用密码登录,安装时创建的第一个用户通常属于 sudo 组,通过自己的密码临时取得管理员权限:
whoami
id
sudo whoami
sudo -l
最后两条分别验证提权后的身份,以及当前账号被允许执行的 sudo 命令。不要为了省事长期使用 root Shell,也不要给所有人 sudo 权限。sudo 的操作能与具体账号关联,比多人共用 root 密码更容易审计。
二、查看系统中的用户和组
getent passwd 用户名
getent group 组名
id 用户名
/etc/passwd 保存本地账号基本资料,但密码哈希在只有 root 可读的 /etc/shadow。系统服务也会创建账号,所以列表中出现很多不能登录的用户是正常现象。普通人工账号的 UID 通常从 1000 开始,服务账号多使用更小的 UID 或设置为 nologin Shell。
查看当前登录和历史登录:
who
w
last -n 20
lastlog | head
如果出现陌生来源地址或异常登录时间,应先保留日志、停用相关凭据,再调查 SSH 密钥和正在运行的进程。
三、创建用户并授予合适权限
Ubuntu 推荐使用交互更友好的 adduser:
sudo adduser alice
id alice
需要管理员权限时,再加入 sudo 组:
sudo adduser alice sudo
用户必须重新登录,新的附加组(Supplementary group)才会完全生效。添加用户到组时不要写成 usermod -G 后漏掉 -a,否则可能覆盖其原有附加组。正确写法是:
sudo usermod -aG developers alice
更安全的做法是创建业务专用组,只允许它访问对应目录:
sudo addgroup webeditors
sudo adduser alice webeditors
sudo chown -R root:webeditors /srv/website
sudo chmod 2770 /srv/website
2770 前面的 2 是 SGID 位,新文件会继承目录所属组,便于多人协作。不要用 chmod -R 777 解决权限问题,它等于允许所有本地用户读、写和进入目录。
四、锁定、解锁和删除账号
员工暂时离开或怀疑账号泄露时,优先锁定而不是立即删除:
sudo passwd -l alice
sudo passwd -S alice
sudo passwd -u alice
锁定密码不一定能阻止已经配置的 SSH 公钥或现有会话。彻底停用时还要检查 ~/.ssh/authorized_keys、计划任务(Cron jobs)、正在运行的进程和 sudo 权限,并设置账号过期:
sudo usermod --expiredate 1 alice
sudo pkill -u alice
确认资料已交接后可执行 sudo deluser alice。该命令默认不会删除家目录(Home directory)。是否删除 /home/alice 应根据备份和保留策略决定,不能把删账号等同于删数据。
五、理解 rwx 权限
ls -ld /home/alice
输出中的三组 rwx 依次属于所有者(Owner)、所属组(Group)和其他人(Others)。对文件而言,r 是读取、w 是修改、x 是执行;对目录而言,x 表示能够进入和访问目录内项目。
sudo chown alice:webeditors 文件
sudo chmod 0640 文件
sudo chmod 0750 /home/alice
0640 表示所有者可读写、组可读、其他人无权限;0750 常用于私人家目录。递归修改(Recursive)会影响下面所有文件,执行 chown -R 或 chmod -R 前必须先确认目标路径。
六、密码期限与定期审计
sudo chage -l alice
sudo chage alice
chage 可查看或设置密码最后修改时间、最大有效天数、警告期和账号到期日。家庭服务器不必机械地强迫频繁改密码,但应使用长且唯一的密码,优先配置 SSH 公钥,并为实际风险选择合适策略。
每月可检查:谁具有 sudo 权限、哪些账号长期未登录、哪些家目录权限过宽、是否存在未知 SSH 密钥。调整前记录原值,调整后用该用户实际登录验证。权限管理的目标不是“全部锁死”,而是让每个账号只拥有完成工作所需的最小权限(Least privilege)。
七、服务账号与登录 Shell
Web、数据库和备份程序常使用专门的服务账号(Service account)。这类账号用于确定文件归属和限制进程权限,一般不需要人直接登录。查看一个账号的登录 Shell:
getent passwd www-data
末尾若是 /usr/sbin/nologin 或 /bin/false,表示不提供普通交互登录。不要为了方便调试把服务账号改成可登录并设置弱密码;需要以该身份运行单条诊断命令时,可由管理员谨慎使用 sudo -u 用户名 命令。
创建只用于服务的系统账号可以使用:
sudo adduser --system --group --no-create-home appsvc
是否创建家目录取决于程序要求。应用数据建议放在 /srv 或 /var/lib/程序名 等明确位置,不要随意堆进管理员家目录。
八、谨慎编辑 sudoers
sudo 规则位于 /etc/sudoers 及 /etc/sudoers.d/。必须使用 visudo 检查语法:
sudo visudo -f /etc/sudoers.d/alice
能授予具体命令就不要直接给完整管理员权限。例如备份账号只需要运行固定备份程序时,应限制到明确的绝对路径。NOPASSWD 会取消密码确认,适合经过设计的自动化,不适合为了少输一次密码而给普通用户开放所有命令。
修改 sudo 规则前保留另一个管理员会话,完成后用 sudo -l -U alice 查看该用户规则,并实际测试允许与不允许的命令。规则文件权限通常应为 0440,文件名不要包含点号或临时编辑器后缀。
九、文件属于“旧 UID”怎么办
账号删除后,磁盘上的文件仍记录数字 UID/GID。可查找没有有效用户名的文件:
sudo find /home /srv -xdev \( -nouser -o -nogroup \)
先查看结果,不要直接接 -delete。确认业务归属后使用 chown 转交给新账号或归档。创建与旧账号相同 UID 的新用户可能意外获得这些文件,因此删除账号前应记录 UID、完成数据交接,并定期检查孤立文件。
本文为中文学习整理,并非逐句翻译。资料来源:Ubuntu Server 官方文档:User management。
评论一下?