☰
Ubuntu用户管理实战:用户、组、sudo权限与安全策略全解析
2026/10/8 2:41:30 网站建设 项目流程

刚折腾完一台Ubuntu Server,又帮朋友处理了一个“用户误删数据”的烂摊子,我越来越觉得Linux用户管理这玩意儿,就像房子的门锁和钥匙分配系统。你一个人住的时候觉得无所谓,一旦合租、有访客、或者请了保洁,怎么发钥匙、怎么设门禁、怎么在出问题时追溯是谁干的,就全得靠这套规则。今天这篇东西,我打算把Ubuntu(包括22.04和24.04 LTS)下用户管理这件事聊透,从基础的增删改查,到sudo权限分配、用户组策略,再到密码过期、锁定账户、批量创建用户这些实战场景,全程用命令说话,顺便把我踩过的坑和补救方案一起放出来。

需要说明的是,这篇内容主要适合三类人:刚把Ubuntu装好、准备拿它当主力开发机或家庭服务器的爱好者;公司里需要给同事开账号、做权限隔离的运维新手;还有那些想系统补一下Linux用户体系知识、但不想啃大部头文档的朋友。读完你可以直接照着操作,遇到问题也能按图索骥排查。

1. 先搞懂Ubuntu的用户体系:不只是“用户名+密码”

很多从Windows转过来的朋友,一开始对Linux用户管理最大的困惑是:为什么搞个用户这么麻烦,还有UID、GID、家目录、Shell一堆概念?其实没那么玄乎。Ubuntu里的每个用户,本质上就是/etc/passwd文件里的一行记录,每个组就是/etc/group里的一行记录。密码则单独存在/etc/shadow里,普通用户看不到。

1.1 用户、UID和家目录的关系拆解

你随便在终端敲一句cat /etc/passwd,能看到类似下面这样的内容:

root:x:0:0:root:/root:/bin/bash chen:x:1000:1000:chen,,,:/home/chen:/bin/bash testuser:x:1001:1001::/home/testuser:/bin/sh

一行有7个字段,用冒号分隔,含义依次是:用户名、密码占位符(真正的密码在shadow里)、UID、GID、注释信息、家目录、登录Shell。这里面最关键的是UID。系统判断“你是谁”,不看用户名,而是看UID。root的UID是0,普通用户一般从1000开始(Ubuntu的约定),1到999是系统用户,留给各种服务用的,比如sshd、mysql这些。

为什么要强调UID?因为你在做用户迁移、或者用usermod改用户属性时,很可能遇到UID冲突问题。我举个例子,你从旧服务器同步数据过来,新机器上已经有个用户UID是1001了,结果你把旧机器上UID也是1001的另一个用户的家目录直接拷过来,轻则权限混乱,重则两个用户能互相读对方的私密文件。所以我的习惯是,创建重要用户时直接指定UID,避免这种隐性问题。

家目录这块也值得展开一下。默认情况下,Ubuntu的useradd命令不会自动帮你创建家目录,而这个行为恰恰是新手最容易踩的第一个坑。后面我讲命令时会重点说。

1.2 用户组的作用:为什么不能只盯着单个用户

用户组解决的是“批量授权”问题。比如你公司服务器上有个/data/project目录,希望市场部的几个同事都能读写,你当然可以一个个用户去设置ACL,但更干净的做法是建一个market组,把相关用户都加进去,然后给目录设置组权限。

Ubuntu里有个有意思的特长:创建新用户时会默认创建一个与用户名同名的私有组(Initial Group)。这个设计叫“私有组机制”,好处是每个用户默认在自己的组里,方便用组权限控制家目录访问。比如你创建zhang这个用户,系统会同时创建zhang组,并且/home/zhang的属组就是这个组,权限是755,也就是说组内成员有读和执行权限,但没有写权限。这个细节很多人没注意,结果后面配置Samba共享或者git仓库时,发现同组用户能读不能写,卡了半天。

所以说,理解用户组不是为了背概念,而是为了在实际分配权限时能做出干净、好维护的方案。你花5分钟规划好组结构,能省下后面大量“为什么他访问不了”的排查时间。

2. 核心实操:用命令玩转用户增删改查

这一节是全文的重头戏。我不打算把man手册抄一遍,而是结合高频场景,把最常用的命令和参数讲透,并解释每个关键选项背后的“为什么”。

2.1 创建用户:useradd和adduser,我该用哪个

Ubuntu下创建用户有两条路:adduser和useradd。这俩名字很像,但爹不一样。useradd是系统原生的低层工具,参数多、灵活,但不会自动帮你做很多“贴心”的事;adduser是Ubuntu封装的高层工具,本质是调用了useradd,但会交互式地帮你设密码、填用户信息、自动创建家目录,对新手极其友好。

我的建议:日常交互操作,用adduser;写脚本批量创建,用useradd。原因很实在,adduser的交互式流程能帮你减少遗漏,尤其是家目录、密码、Shell这些基本属性的设置,但它在自动化场景下一路next式的提问反而碍事。

先看adduser的典型用法:

sudo adduser zhangshan

执行后系统会问你新用户密码、全名、电话等一堆信息,一路回车其实也行,就是密码必须输,而且输的时候不显示任何字符,新手容易以为自己键盘坏了。全程自动创建家目录/home/zhangshan、用户组、Shell(默认是/bin/bash),还会把/etc/skel目录下的骨架文件复制进家目录。这也是为什么adduser创建的用户一登录就有.bashrc、.profile这些配置文件,而用useradd创建的用户可能干干净净什么都没有。

再看useradd批量和精细化创建:

sudo useradd -m -d /home/zhangshan -s /bin/bash -c "Zhang Shan" -u 1050 -G sudo,dev zhangshan

各参数含义:-m创建家目录,-d指定家目录路径,-s指定登录Shell,-c注释信息(一般写全名),-u手动指定UID,-G附加组(可以多个,逗号分隔)。尤其提醒:如果不加-m,默认没有家目录,很多教程里没提,结果用户建好了登录进去发现在/根目录下面,瞬间懵圈。

2.2 修改用户和密码策略:usermod与chage实战

用户创建好之后,改属性是家常便饭。usermod是主力工具,用法跟useradd很相似,因为底层的用户数据库操作逻辑是一样的。常见场景:

把用户加进sudo组:

sudo usermod -aG sudo zhangshan

这里-aG里的-a是append的意思,这个参数极其重要。如果不加-a,直接用-G sudo zhangshan,系统会用sudo组替换掉用户当前所有的附加组,比如他原本在www-data组、docker组里,一下全没了。这种“覆盖式修改”的坑我踩过不止一次,排查问题时发现用户突然无法访问某些目录了,一查组关系全变了,吓得一身冷汗。所以,凡是往已有用户上加组,永远用-aG,写进你的肌肉记忆里。

锁定和解锁账户,比如员工离职、或者怀疑账号被盗:

sudo usermod -L zhangshan # 锁定 sudo usermod -U zhangshan # 解锁

锁定的原理,是在/etc/shadow对应行的密码哈希前加个!前缀,让任何密码都无法匹配。这种方式比直接删用户稳妥,因为保留了用户的数据和配置。

密码策略管理用chage,很多人忽略这个工具,但它确实好用。比如强制用户每90天改一次密码,提前7天提醒,密码最长使用120天:

sudo chage -M 90 -W 7 -I 120 zhangshan

查一下用户密码状态:

sudo chage -l zhangshan

输出会告诉你密码上次修改时间、过期时间、宽限期等。强制新用户首次登录必须改密码的办法,也是用chage:

sudo chage -d 0 zhangshan

把“密码最后修改日期”设为0,逼着用户下次登录时必须先改密码,这对初始账号发放场景尤其有用。上述命令执行后,建议顺手验证一下/etc/shadow里的变化,能帮你更直观地理解所以然。

2.3 删除用户:一个容易出问题的危险操作

删除用户是用户管理里“最危险”的操作。直接userdel username只会删除用户记录,但家目录、邮件池、文件都留着;加上-r参数会连家目录一起删掉:

sudo userdel -r zhangshan

问题来了:如果这个用户不是普通用户比如程序创建的,或者他在系统其他地方比如/var/www、/data下还有文件,光靠-r是扫不干净的。删完后系统里会留下一堆“孤儿文件”,显示UID数字而不是用户名,你甚至不知道这是谁留下的。而且,如果当时这个UID后面又被新用户占用了,那你简直是在给新用户“送装备”——他莫名其妙就拥有了前主人的数据访问权限。

所以我的建议是:删用户之前,先全面搜索他的文件:

sudo find / -user zhangshan -not -path "/proc/*" -not -path "/sys/*" 2>/dev/null

然后人工确认哪些该留、哪些该清。还有一个思路更稳:不立刻删,先用usermod -L锁定账户,过一两个月确认无人反馈异常了,再删除。这个“冷静期”操作对服务器环境尤其推荐。

3. 权限管理进阶:sudo、组权限与特殊场景

用户管理不只是“开门发钥匙”,更重要的是“门禁划分”。Ubuntu的权限模型分三层:普通权限(rwx)、特殊权限(SUID/SGID/Sticky Bit)、以及sudo授权。我们一层层看。

3.1 sudo的配置逻辑与风险控制

如果说普通用户是“合租室友”,root是“房东”,那sudo就是房东临时给的“万能钥匙”,还是可以随时收回的那种。Ubuntu桌面版安装时创建的第一个用户默认在sudo组里,服务器版则安装时让你指定一个用户,同样默认加进sudo组。

看一下当前用户有什么sudo权限:

sudo -l

编辑sudo权限(非常危险的操作,要小心):

sudo visudo

visudo之所以用这个名字,是因为它在保存时会校验语法,防止你写错导致sudo直接崩溃。千万别用普通的vim或nano直接编辑/etc/sudoers,一旦语法错误,所有用户(包括你自己)都无法再sudo了,那就是事故现场。

sudo权限不仅仅是“给不给root”的问题,可以做得非常精细。比如允许某个用户只重启服务而不给全部root权限:

zhangshan ALL=(root) /usr/bin/systemctl restart nginx

这行的意思是,zhangshan可以在任何主机(ALL)上,以root身份执行/usr/bin/systemctl restart nginx这一条命令。这种按需授权的做法,适合给那种“只需要管一个服务”的同事,最大程度降低风险。

sudo组和root组是两个概念。有些人喜欢把用户加到root组里,这在Ubuntu上几乎没什么意义,因为root组的权限并不等价于root用户;真正的管理员权限只认sudo组或sudoers配置。我以前就看到有教程教人“把用户加进root组获得root权限”,纯粹误导,多亏了下半句的正解,不然读者照做发现没用,又要绕远路。

3.2 用户组管理:从创建到应用全链路

组管理的命令相对简单,groupadd、groupmod、groupdel。需要注意的坑,主要有两个。

其一,删除组时如果组是某个用户的主组(Initial Group),会删除失败。这时你需要先把用户的主组改到别的组,比如usermod -g othergroup zhang,然后再groupdel oldgroup。

其二,组成员信息修改后,已登录的会话不会自动刷新组权限。比如你把用户加到docker组,但这个用户已经开着终端了,他直接敲docker ps还是会报权限不足。必须重新登录(退出再ssh进来,或者newgrp docker切换一下),组权限才生效。这个坑在Docker、以及访问USB设备等场景下非常常见,几乎每周都有人问“为什么加了组没用”。

查看一个用户属于哪些组,用:

id zhangshan

或者groups zhangshan。id信息更详细,带UID、GID和SELinux上下文(如果启用的话),排查问题时第一件事就是敲id,能快速确认身份和组关系是否正常。

3.3 特殊目录权限与ACL:当基础权限不够用时

普通rwx权限解决不了所有问题。比如有个目录,希望同组的用户可以写,但不能删别人的文件。这时候就要用到粘滞位(Sticky Bit)。/tmp目录就是典型例子——任何人都能创建文件,但只能删除自己的文件。设置粘滞位:

sudo chmod +t /data/shared

再比如,希望某个用户或组对某个目录有指定权限,但你不想改变目录属主、也不想让所有同组人都获得权限,那就该上ACL了。Ubuntu默认的ext4文件系统支持ACL,通常无需额外安装,不过工具包要装一下:

sudo apt install acl

给用户zhang设置对/data/project目录的读写执行权限:

sudo setfacl -m u:zhang:rwx /data/project

查看ACL:

getfacl /data/project

删除特定ACL条目:

sudo setfacl -x u:zhang /data/project

ACL的隐藏好处是,ls -l只能看到第一层权限,真正的权限以+号标记,细节需要getfacl查看。你要是看到某个目录权限后面多了个+,别慌,那是ACL在起作用,赶紧用getfacl看清谁有额外权限。这个细节可以帮你透视图中的访问控制到底是怎么生效的。

4. 常见用户管理故障与排查实录

用户管理这块,出问题的频率比想象中高,尤其多用户服务器上。下面这几个场景我基本都实战处理过,直接把思路和命令给你,遇到类似问题照着来。

4.1 忘记登录密码怎么办

这是全网最热门的Ubuntu问题之一。如果你是在本机操作的机器前,可以通过GRUB进入恢复模式来重置密码。重启机器,开机时按住Shift键唤出GRUB菜单,选择Advanced options进去,找到recovery mode那一项,然后选root shell(有的版本是root Drop to root shell),执行:

mount -o remount,rw / passwd 你的用户名

如果是远程服务器,且你自己还有sudo权限,那就简单了:

sudo passwd 你的用户名

但如果你是唯一的管理员且sudo密码也忘了,那就比较痛苦了。如果机器上有另一个有sudo权限的用户,可以让那个人帮你重置;否则只能走物理访问恢复模式,或者用Live USB方式进入系统,挂载磁盘后直接修改/etc/shadow里的密码哈希。具体操作思路:在Live系统里chroot到原系统,然后passwd重置,或者直接删掉/etc/shadow中该用户密码哈希字段,让他下次免密登录,进去后再设置新密码。注意,最后这种方法极不安全,仅限本地物理机应急,服务器千万别这么干。

4.2 SSH无法连接或登录后被拒

SSH登录用户失败,一般分三种情况。第一种,用户不存在或者密码错误,服务端日志会明确提示。查看日志:

sudo tail -f /var/log/auth.log

这是排查SSH问题的第一利器,几乎所有登录失败的原因都能在这里看到。第二种,用户存在但密码对,却被公钥认证流程挡在外面。常见原因是家目录或~/.ssh/authorized_keys权限不对。Ubuntu对权限很敏感:家目录权限不能是777,.ssh目录必须是700,authorized_keys必须是600,否则服务器会出于安全考虑拒绝加载密钥。修复权限:

sudo chown -R 用户名:用户名 /home/用户名 sudo chmod 700 /home/用户名/.ssh sudo chmod 600 /home/用户名/.ssh/authorized_keys

第三种,更隐蔽一点:用户Shell配置有问题。如果用户被分配了不存在的Shell,在/etc/passwd里写的是/bin/fish但系统没装,登录时会直接失败或闪退。检查一下:

cat /etc/passwd | grep 用户名

改Shell用:

sudo usermod -s /bin/bash 用户名

4.3 误删用户与文件权限恢复

删用户一时爽,恢复火葬场。如果不小心删了用户但保留了他的家目录备份,恢复的思路是:先查原来的UID和GID(如果备份里有记录),然后用相同UID重新创建用户,再把家目录的所有权改回去:

sudo useradd -m -u 原UID -G sudo 用户名 sudo chown -R 用户名:用户名 /home/用户名

查UID的办法,如果备份的tar包里没有保留/etc/passwd,可以用:

sudo find /数据备份目录 -maxdepth 2 -printf "%u:%g\n" | sort -u

看哪些文件归属那个已经消失的用户名,大概率能反推UID。不过说实话,这是兜底方案,最好养成备份/etc/passwd、/etc/group、/etc/shadow三个文件的习惯,用户管理出问题的时候,这三个文件就是“救命稻草”。我自己的服务器上写了个cron,每周日把这三个文件压缩备份到安全目录,这个习惯帮我省了不止一次大麻烦。

4.4 用户无法sudo的快速排查

“明明加进sudo组了,怎么还是无法sudo?”这是群里被问烂了的问题。一查原因,几乎都是忘了重新登录。组权限的生效需要新的会话,退出终端重进一次就解决了。

另外一个容易忽略的点:sudo组在sudoers文件里的引用写法。正常情况下,Ubuntu的/etc/sudoers默认有这么一行:

%sudo ALL=(ALL:ALL) ALL

千万别手贱把这行删了。以前帮人排查,发现他为了“安全加固”把sudo组从sudoers里清出去了,结果重启后所有普通用户全部失去sudo能力,包括他自己。如果真发生了这种情况,你只能再次进恢复模式,或者重新用root登录,把这一行加回去。这个教训的价值在于:安全加固之前先想清楚后果。

如果希望某个用户只能sudo特定命令,按我前面讲的,在/etc/sudoers.d/目录下新建一个文件(比直接改sudoers更规范,避免中心文件被改乱):

echo "zhangshan ALL=(root) /usr/bin/systemctl" | sudo tee /etc/sudoers.d/zhang-nginx

然后执行sudo visudo -c校验语法,没问题就生效。用/etc/sudoers.d/这个目录管理分权,是正规运维的做法,清晰可维护,也谈不上什么高深。

5. 批量创建用户与账号生命周期管理

服务器上经常有一次性要创建几十个账号的场景,比如学校机房、公司新入职一批实习生。一个个adduser显然太低效,这时就需要脚本出场。

5.1 用脚本批量创建用户的参考方案

先准备一个用户名列表文件users.txt,每行一个用户名,然后写脚本:

#!/bin/bash # 批量创建用户,并设置初始密码,强制首次登录修改 while read user; do if id "$user" &>/dev/null; then echo "用户 $user 已存在,跳过" continue fi sudo useradd -m -s /bin/bash "$user" echo "$user:初始密码123" | sudo chpasswd sudo chage -d 0 "$user" echo "已创建用户: $user" done < users.txt

这里用到chpasswd搭配chage -d 0,作用是批量设置初始密码并强制首次登录修改,比逐条交互式设密码高效得多,也比直接把密码hash写进shadow更稳。要注意,脚本里用了初始密码123这种弱口令,因为是初始密码、马上会被改掉,算是可接受的做法,但如果你面对的是高安全环境,建议直接用随机密码并打印出来交给用户。

5.2 账号生命周期管理:从创建到回收

创建账号只是开始,后续的审计和回收才是重点。有些用户长期不登录,该禁用就得禁用;有些账号要到期自动失效。这个场景用chage可以做到:

给一个临时账号设置到期日期,比如2025年12月31日失效:

sudo chage -E 2025-12-31 temp_employee

查看所有用户密码和到期状态,浏览一波:

sudo passwd -S 用户名 # 查看单个用户状态 sudo chage -l 用户名 # 更详细,包括到期时间、密码改动时间

批量查看哪些用户密码即将过期,可以写个简单循环,这里就不再赘述,核心就是围绕/etc/shadow的第三字段(密码最后修改日)和第五字段(密码最大有效期)做计算。说个更实操的思路,你可以用awk去解析/etc/shadow,把那些“密码已过期但账号还没锁定”的用户捞出来,主动联系他们改密码。这比等他们自己发现登录不了再找你,体验好得多。

5.3 用户审计与系统安全建议

用户管理做得好不好,体现在是否能回答“当前系统里有哪些用户、各自有什么权限”。定期审计是很有必要的,至少每季度来一次。

几个常用审计命令:

查看所有普通用户(UID大于等于1000):

awk -F: '$3>=1000 && $3<65534 {print $1, $3, $6}' /etc/passwd

列出有sudo权限的所有用户:

getent group sudo | cut -d: -f4

列出当前所有登录用户:

who

查看登录历史:

last

查看最近所有sudo提权记录(会留下不少内容,建议认真看看):

sudo grep "sudo" /var/log/auth.log | tail -50

安全建议部分,我把个人的几条原则总结一下:

  • 不要日常用root操作。Ubuntu默认禁用了root登录不是没有道理,把日常操作放普通用户里,需要管理员权限时再sudo,出错概率和风险都低得多。
  • 用户分工要明确。一个用户只负责一个岗位的职责。比如跑web的、跑数据库的、做备份的,尽量分开,避免一个账号权限过大。
  • 定期轮换密码与密钥。重要服务器可以配合fail2ban之类工具防爆破,但那是另一个话题了,用户层面至少把密码策略设好。
  • 禁用空密码用户。检查一下:
sudo awk -F: '($2==""){print $1" 空密码"}' /etc/shadow

如果输出结果,第一时间passwd那个用户补上密码,或者usermod -L锁掉。空密码账号在裸奔,这可不是小事。

6. 关于工具链的几个补充:实用软件与替代方案

除了系统自带的命令,Ubuntu用户管理还有一些“高阶兵器”,在特定场景下能大幅省力。

6.1 为什么建议装一个web管理面板

如果你管理的机器不止一两台,或者你不太习惯全命令行操作,可以考虑安装Webmin或Cockpit。Cockpit是红帽系主导但在Ubuntu上也能装,模块化设计,轻量干净,通过浏览器就能管理用户、查看系统状态、配置网络和存储。安装很简单:

sudo apt install cockpit sudo systemctl enable --now cockpit.socket

然后浏览器访问https://你的服务器IP:9090,用系统用户登录即可。不过说实话,Web面板的管理范围还是受限,真要精细控制权限、改sudoers、搞ACL,终端永远是绕不开的。面板适合快速操作、可视化管理,命令行适合深度配置,两者不冲突,互补着用。

6.2 用LDAP或FreeIPA做集中用户认证

这个算是“进阶话题”了。当你有三台以上服务器、十几个用户时,每台机器都维护一套用户体系会让人抓狂——用户A在机器1改了密码,机器2上还是旧密码,ssh还得一台台同步。这时候就该上集中认证了。Ubuntu Server可以接入LDAP或FreeIPA域,统一管理用户、密码策略、sudo规则。配置过程比较繁琐,需要装sssd、配置/etc/sssd/conf.d/下的文件、启用NSS和PAM模块,一句话说不完。我只提一下思路:如果你的机器数量或用户数量已经让你感觉到“手工维护用户很痛”,那就是该上集中认证的明确信号了,不要等出问题再改。

6.3 别忘了云平台自带的安全组配合

如果你用的是云服务器(阿里云、腾讯云、AWS等),那么除了系统层面的用户管理,云平台的“安全组”或“防火墙策略”也要一起考虑。安全组控制的是网络层面的访问,系统用户控制的是系统层面的登录,两层配合才完整。比如你可以创建一个专门用于运维的用户,设置复杂密码和密钥,然后在安全组里限制只允许公司出口IP的SSH访问,这样即便用户被暴力破解,攻击者也没有网络通路可用。这套组合是日常最稳妥的运维姿势。


个人实际经验里,用户管理最容易出问题的,往往不是命令不会敲,而是对“权限变化什么时候生效”没有概念,或者没搞清楚“用户和组的生命周期”就贸然删改。我自己的服务器从Ubuntu 18.04一路用到24.04,吃过不少亏之后才养成了一个习惯:每次用户管理操作前,先更新一下三个核心配置文件备份;每次改权限后,立刻换新终端验证效果。这套流程看起来很笨,但确实能拦下绝大多数低级事故。希望这篇文章能帮你在Ubuntu用户管理这条路上,少走几个弯路。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询