☰
Linux多用户账号开通与权限隔离:UID统一及NAS共享权限实战
2026/10/22 3:42:40 网站建设 项目流程

2. 账号开通全流程:从申请到登录的标准动作

1. 先说点实在的:为什么这套 SOP 能省掉一堆麻烦

我在多家公司管过 Linux 服务器,最让人头大的不是服务挂了,而是账号管理这摊看似简单的事。刚接手一台测试服务器时,光清理历史遗留账号就花了一整天:有人离职半年了账号还在,有人直接在 root 下跑了百来天,各部门的人互相不知道对方的账号密码,文件删错了根本没法追溯。那台机器上发生过一次乌龙——某个测试目录被人整目录清掉,当时连谁删的都不知道,最后只能靠日志时间反查,才发现是几个人共用一个账号惹的祸。

账号开通这件小事,如果没有一套 SOP,短期看是省事,长期看全是坑。多用户 Linux 服务器的账号开通与权限隔离,核心目标是两件事:一是每个人能用统一的、可审计的身份进系统;二是人和人之间、组和组之间的文件互不干涉,又能按需协作。再加上公司内部普遍存在 NAS 这类共享存储,用户的 UID 如果不统一,NAS 上的文件权限会乱到让人崩溃。

这篇文章我会完整讲一遍我在生产环境里落地的账号开通流程,包括命名规范、useradd 的关键参数、权限隔离的技术细节,以及 NAS 统一 UID 场景下的完整处理办法。适合所有需要管多用户 Linux 服务器的运维、研发负责人、以及刚接触服务器管理但不想踩坑的朋友。照着这套 SOP 走,至少能避免 80% 的权限纠纷和账号安全问题。


2. 账号开通全流程:从申请到登录的标准动作

2.1 开通前先登记:一个账号需要带哪些信息

我见过很多团队开账号,就是群里喊一句"给我开个账号",然后管理员随手useradd完事。等到哪天要审计或者找人的时候,才发现账号背后对应的是谁、哪个部门、做什么用的,全得靠猜。

所以在动手执行命令之前,必须先要一张登记信息,哪怕简单到只有几行字。一份合格的账号申请信息应该包含:

  • 申请人姓名/工号,以及所在部门
  • 账号用途(日常开发、数据查询、定时任务、仅文件访问等)
  • 需要的访问级别(普通用户、sudo 白名单用户、特定目录读写)
  • 是否需要访问 NAS 共享目录,以及所属的共享组
  • 预计使用周期,是否有明确到期时间

这张表不需要做成复杂的审批系统,一个共享表格就够了。但有了它,后面做账号生命周期管理(尤其是离职清理)会轻松太多。我自己的习惯是:没有登记信息绝不开号,这是第一条红线。

2.2 账号命名与 UID 规划:从第一天就定好规则

账号命名统一规则,能避免以后一堆"不知道是谁"的账号。我常用的规则是:姓名全拼或姓名全拼.工号后缀。例如张伟就是zhangwei,如果重名再加后缀区分。不建议用拼音缩写,zw这种账号过三个月你自己也不记得是谁。

UID 规划是很多人忽略的部分。Linux 内核真正识别用户靠的是 UID 数字,不是用户名。/etc/passwd 里的名字只是给人看的。系统用户默认占 UID 0-999,普通用户从 1000 开始。如果公司规模不大,我建议给每个正式员工分配一个固定 UID 段,比如 10000-19999;临时/外包人员用 20000-29999。这样不仅本地服务器好用,后面对齐 NAS 存储 UID 时也能看出账号来源。

分配 UID 前先查一下当前已用的最大 UID:

awk -F: '{print $3}' /etc/passwd | sort -n | tail -5

有了这个结果,再手动指定新用户的 UID,避免冲突。

2.3 useradd 命令的完整打开方式

创建一个标准账号,我推荐用显式指定所有关键参数的写法,而不是useradd zhangsan这种依赖系统默认值的方式。默认值在不同发行版上差异不小,一旦埋下隐患,后期很难追溯。

以下是一条完整的用户创建命令:

# 创建一个 UID 为 10001 的用户,主组为 staff,附加组为 devs,家目录在 /home/zhangwei,shell 为 bash useradd -u 10001 -g staff -G devs -m -d /home/zhangwei -s /bin/bash -c "Zhang Wei - Dev" zhangwei

这里每个参数对应的含义:

参数作用说明
-u 10001指定 UID必须唯一,且要和 NAS 对齐时需要手动规划
-g staff指定主组建议按部门预建组,不要默认创建同名用户组
-G devs指定附加组用于补充额外权限,一个人可以属多个组
-m创建家目录同时会复制/etc/skel下的文件
-d /home/zhangwei指定家目录路径不写就默认用用户名做目录名
-s /bin/bash指定 shell如果是纯 NAS 用户,可以给nologin
-c "Zhang Wei - Dev"备注信息建议格式:姓名 - 部门/角色

需要注意的地方:如果用户只需要登录 NAS 而不用登录服务器,shell 应该给/usr/sbin/nologin,防止多了一个潜在的攻击入口。开发用户则照常给 bash。家目录的权限创建后默认是 755,我建议改成 750,敏感信息更安全:

chmod 750 /home/zhangwei chown zhangwei:staff /home/zhangwei

2.4 密码策略:不设强策略等于白开账号

账号创建完成后,密码初始化绝不是简单的passwd zhangwei就结束了。我会顺手做三件事:

# 设置初始密码,并通知用户在第一次登录时修改 passwd zhangwei # 设置密码最长有效期为 90 天,提前 7 天警告 chage -M 90 -W 7 zhangwei # 查看账号密码策略是否生效 chage -l zhangwei

关于密码策略,我建议至少做到:

  • 密码有效期不超过 90 天
  • 密码最短长度不低于 12 位,且要设置复杂度要求
  • 用户首次登录后强制改密码(让用户自己设,管理员不知道密码)

如果你用的是 RHEL/CentOS 系,可以直接在/etc/login.defs里改默认值,这样以后useradd完就有了默认密码策略,不需要一条条chage。

还有一个在很多公司会被忽略的点:禁用 root 密码登录,服务器上所有运维动作走个人账号 + sudo。配合上面的流程,每个用户都能被追溯到,不会出现"这台服务器那个账号是系统自动创建的,没人知道密码"这种鬼话。

2.5 公钥登录初始化:比密码更省心的选择

如果团队规模不大,我强烈建议从账号开通那天直接把 SSH 公钥一起配好,免得用户自己上去乱搞。在用户家目录下操作:

# 如果用的是 root 创建的账号,需要先切到用户身份 mkdir -p /home/zhangwei/.ssh chmod 700 /home/zhangwei/.ssh touch /home/zhangwei/.ssh/authorized_keys chmod 600 /home/zhangwei/.ssh/authorized_keys # 把用户提供的公钥写进 authorized_keys chown -R zhangwei:staff /home/zhangwei/.ssh

养成一个习惯:创建账号后立即配置密钥登录,然后尝试用密钥登录一次。确认没问题后再考虑要不要关闭密码登录。对公司内部服务器,我经验是密码登录和密钥登录同时保留,但必须启用 SSH 双因素或限制密码登录的失败重试次数,避免暴力破解。


3. 权限隔离的三个核心层:权限位、SGID 目录和 ACL

3.1 别小看基本权限位:它决定了用户能做什么

Linux 权限模型理解起来不复杂,就三个角色(属主、属组、其他)和三种操作(读、写、执行),用rwx表示。但实操中很多问题恰恰出在基础权限设置上。

举个例子,创建一个共享目录/data/teamshare,想让"研发一组"的人都能读写:

# 创建目录并设置属组 mkdir -p /data/teamshare chown :devs /data/teamshare chmod 770 /data/teamshare

这个770表示:属主(root)有完整权限,组 devs 的成员有读写执行权限,其他人一无所有。看起来很对,但只做到这里还不够——因为用户在这个目录下新建的文件,属组默认可能是用户自己的私有组,devs 组里的其他人照样进不去。

3.2 SGID 目录:让新建文件自动继承组权限

解决上面"别人进不去"的问题,靠的是目录的SGID 特殊权限位。给目录设置 SGID 后,新建的子目录和文件会自动继承目录的属组,而不是使用创建者的默认主组。

chmod g+s /data/teamshare

设置完之后,可以用ls -ld /data/teamshare查看:权限位上会多一个s,变成drwxrws---。这是多用户共享目录的标准做法。没有这一步,组协作迟早卡壳。

组合排查思路是这样的:

  1. 先在共享目录下建一个测试文件,确认ls -l显示的属组是不是devs
  2. 让另一个 devs 组的用户尝试读取、编辑这个文件,验证是否可行
  3. 如果不可行,八成是文件权限本身不够,或者文件的属组没有继承,再回头查目录是否设置了 SGID

3.3 控制新文件默认权限:umask 的取舍

umask 决定了新建文件的默认权限。普通用户的默认 umask 通常是022,新建文件就是 644,新建目录是 755。但在多用户共享场景下,如果你希望组内成员对新建文件可写,umask 得调整为002或007。

umask 002

002的效果是:文件默认 664(属主和组可读写),目录默认 775(组内成员可进入并协作)。

对于共享目录的用户,我会建议他们在自己的~/.bashrc里设置:

umask 002

这样新建文件别人也能改,协作效率高很多。但要注意,umask 设置太宽松会带来安全风险,如果共享目录里有敏感数据,建议用 007(即文件默认 660,目录 770),严格限制"其他用户"不可见。

3.4 ACL:当基本权限不够用的时候

有时候权限需求不是简单的三组能搞定的。比如/data/teamshare归 devs 组所有,但运营部的李兰也需要临时读一下某个子目录里的报表,不能直接把她加入 devs 组(那样权限太大)。这时候就是ACL(访问控制列表)的场景。

# 给特定用户追加指定权限 setfacl -m u:lilan:rx /data/teamshare/report # 查看当前 ACL 设置 getfacl /data/teamshare/report # 删除该用户的 ACL 条目 setfacl -x u:lilan /data/teamshare/report

ACL 的好处是灵活,不用动组的归属就能给个人授权。缺点是排错时更复杂,因为ls -l只能看到基本权限,ACL 隐藏在后面。所以我的经验是:如果权限规则简单,优先用基本权限 + 组;只有组搞不定时再用 ACL,而且要在注释里写清楚为什么。每次给 ACL 授权,我会顺手在目录下放一个README说明规则,省得后面的人一脸懵。

3.5 隔离的底线:防止用户删除别人的文件

共享目录里最头疼的问题之一:A 用户创建了一个文件,B 用户因为同组权限能写这个文件,但如果目录本身允许写,B 完全可以把文件删掉。这经常引发"谁删了我的文件"的惨案。

Linux 的Sticky Bit(粘滞位)专门解决这个问题。常见的/tmp目录权限就是drwxrwxrwt,t就是 Sticky Bit。它规定:只有文件的属主、目录的属主或者 root 能删除文件,同组用户即使有目录写权限也不行。

chmod +t /data/teamshare/tmp

这个设计非常符合共享目录的使用习惯:大家都能往里丢文件,但谁建的就只有谁能删(以及管理员)。如果你管理的服务器上存在一个所有人都可写的目录,我强烈建议加上 Sticky Bit,不然迟早有人误删。


4. NAS 统一 UID 场景:为什么 UID 不一致文件权限就乱套

4.1 问题的根源:内核只认 UID 数字

很多第一次接触 NAS 共享存储的运维同学都会遇到一个诡异现象:在服务器上明明看到了一个文件,属主显示是一个名字,但用ls -ln查看会发现底层属主是一个完全不同的数字;或者说在两台服务器上看同一个 NAS 目录,属主显示不一致。

原因很简单:Linux 内核不认用户名,只认 UID。文件属主在磁盘上记录的是 UID 数字,系统只是根据 UID 去/etc/passwd里查找对应的用户名并显示而已。用户名是"马甲",UID 才是身份证号。

想象一下:服务器 A 上小李的 UID 是 10001,服务器 B 上小张的 UID 也恰好是 10001。两人同时访问 NAS 上的同一个共享目录时,NAS 侧认为"UID 10001 就是同一个人",于是小李写的文件,小张会发现自己也能改。这就是 UID 不一致导致的权限错乱。

4.2 统一 UID 的意义:让 NAS 上的文件归属始终清晰

统一 UID 的核心理念是:在一套共享存储体系内,同一个真实用户在所有服务器和 NAS 上应使用相同的 UID 和 GID。这样才能保证不管从哪台机器看,同一个文件的属主都是同一个人,权限判断才准确。

具体落地包含两块:

  • 用户的 UID 在创建时指定,并记录在统一的账号登记表里
  • NAS 侧也要建立相同 UID 的账号(很多 NAS 的管理界面支持手动指定 UID 创建用户)

4.3 实操:如何在服务器和 NAS 上都配置同一 UID

假设公司 NAS 上已经有一个共享目录/volume1/shared,需要给新员工赵六开通访问权限,UID 规划为 10005:

第一步,在 NAS 管理界面创建用户。这里以通用 NAS 系统为例,在用户设置中找到"允许自定义 UID"一类的选项,新建用户zhaoliu,UID 手动填 10005,并加入对应的共享用户组devs-nas(GID 也要记住,比如 5005)。

第二步,在 Linux 服务器上创建用户时保持 UID 一致:

useradd -u 10005 -g devs -G nas-users -m -d /home/zhaoliu -s /bin/bash -c "Zhao Liu - Dev" zhaoliu

第三步,在服务器上确认 UID:

id zhaoliu # 输出类似 uid=10005(zhaoliu) gid=6000(devs) groups=6000(devs),6001(nas-users)

第四步,挂载 NAS 共享目录并验证权限。假设 NAS 的 NFS 导出了/volume1/shared,服务器上挂载:

mount -t nfs -o rw,hard,intr nas_ip:/volume1/shared /mnt/shared ls -ln /mnt/shared

如果看到文件属主是 10005,说明 UID 对齐成功;如果看到 65534(nobody),说明 NAS 侧没有识别到 UID 10005 这个用户,需要回 NAS 侧复查账号是否创建成功。

4.4 NFS 导出与映射细节

NFS 是 NAS 文件共享最常用的协议之一。NFSv3 下,内核直接基于 UID/GID 数字做权限判断;NFSv4 引入了 idmapd 这类映射机制,可以自己定义 idmap 规则把远程 UID 映射到本地用户。但我的建议是:能用 UID 对齐解决的,就不要依赖 idmap。idmap 配置一旦出错,排错难度直线上升,而且不同系统之间行为差异很大。

在服务器侧挂载 NFS 时,建议明确参数:

# 写在 /etc/fstab,便于开机自动挂载 nas_ip:/volume1/shared /mnt/shared nfs rw,hard,intr,noatime,nodiratime,vers=3 0 0

vers=3强制使用 NFSv3,配合 UID 对齐方案是最简单可靠的组合。如果你必须用 NFSv4,那要额外确认 idmapd 配置正确,而且所有客户端和服务端的域名配置需一致,否则会出现"同一个 UID 被映射成不同用户"的怪问题。

4.5 文件属主显示 nobody 怎么排查

实际操作中,最常遇到的是 NAS 上文件显示nobody。遇到这种情况按顺序排查:

# 1. 在服务器上查用户的本地 UID id username # 2. 在 NAS 上确认该 UID 是否有对应账号 # 3. 在 NAS 共享目录下用 ls -ln 查看文件的真实 UID 和 GID # 4. 检查服务器挂载参数里有没有 root_squash / no_root_squash 等影响权限的选项 # 5. 如果 NAS 侧你无法直接用 shell,就在文件管理器里看用户的 UID 设置是否可自定义

大部分 nobody 都是因为 NAS 侧缺少对应 UID 的账号,导致 NAS 不知道 UID 10005 是谁,于是显示为 nobody。只要在 NAS 管理界面补上相同 UID 的用户,问题立刻消失。


5. 验收检查清单与常见坑:别等出事了再操心

5.1 开完账号别急着交差,先过一遍验收

账号开完了、权限配好了,不是直接告诉用户"可以用了"就结束了。我会在交付前跑一遍自查,避免把问题留给用户去发现。

检查项命令预期结果
用户信息正确id zhaoliuUID、GID、附加组都符合规划
家目录存在且权限正确ls -ld /home/zhaoliu目录存在,权限 750,属主属组正确
密码策略生效chage -l zhaoliu最长有效期 90 天,告警提前 7 天
能正常登录ssh zhaoliu@server登录成功,shell 正常
共享目录权限正确getfacl /data/teamshareSGID 已设置,组权限符合预期
NAS 挂载后权限正常ls -ln /mnt/shared看到预期 UID 而非 nobody

跑完这些,再把账号信息(用户名、UID、所属组、有效期、用途)登记到台账里,才算是真正交付。

5.2 常见坑一:用户组规划混乱

很多管理员图省事,用useradd zhangsan默认方式创建,系统自动生成一个和用户名同名的组。这样一台服务器上有多少用户就会有多少组,共享时反而没人用组权限,全靠 ACL 补丁,最后配置一团糟。

我的建议是:提前按团队规划好主组和附加组。例如:

  • staff:所有正式员工的主组
  • devs:研发团队成员附加组
  • ops:运维组附加组
  • finance:财务组附加组

组名不跟用户名绑定,你才能灵活调整权限。中途改用户的主组可以用usermod -g,但遗留文件属组还要用chown -R user:newgroup手动修正,难度比一开始规划好大得多。

5.3 常见坑二:sudo 权限给得太随意

"Sudo 权限相关的问题,几乎每个服务器上都发生过几回。"

开账号时顺便把用户加进sudoers是很多人的习惯性操作,但这恰恰是最危险的。sudo 权限一定要走白名单 + 按需申请。具体做法是在/etc/sudoers.d/下为特定角色建立独立文件,例如给运维组成员加权限:

# /etc/sudoers.d/ops-team %ops ALL=(ALL) ALL

或者更细粒度,只允许执行特定命令:

# /etc/sudoers.d/dev-team %devs ALL=(ALL) /usr/bin/systemctl, /usr/bin/docker

这样即使账号被攻破,攻击者能做的事情也有限。普通用户一律不授 sudo,需要的单独走审批流程。这个原则能极大缩小故障和入侵的影响面。

5.4 常见坑三:umask 和 SGID 被各种二创覆盖

用户在自己~/.bashrc里写umask 022,或者系统里有某种"环境初始化脚本"将共享目录下新建的文件权限强制改动,都会让前面配好的协作权限秒变鸡肋。遇到这种问题,排查思路是先确认实际生效的 umask:

# 切到用户身份后检查 umask su - zhaoliu -c 'umask'

如果发现共享协作用户用 022,就得看是哪个文件覆盖了bashrc里的设置。顺序一般是:/etc/profile->~/.bash_profile->~/.bashrc,越靠后越优先。我在共享使用的 shell 初始化文件里会注释掉一切可能改 umask 的内容,确保协作场景行为可预测。

5.5 账号生命周期:开通只是开始,清理才是关键

新员工账号的开通只是第一步,离职账号的禁用和清理如果没人负责,才是安全漏洞的来源。我见过某公司离职员工的账号半年后还在用旧权限登录 NAS,只因为管理员忘了把他在 NAS 上删除。

建议在台账里记录每个账号的到期时间,并在到期前自动提醒:

# 查看所有账号的过期信息 chage -l username

对于确认离职的用户,标准操作是:

# 锁定账号,禁止登录 usermod -L username # 如果有 NAS 访问权限,同步在 NAS 侧禁用该 UID 的账号 # 根据公司策略决定家目录是删除还是归档,一般建议先归档一个月再删

账号生命周期管理的核心是:入职开通、变更调整、离职禁用、按时巡检。四步缺一不可。

5.6 巡检与审计:让权限问题提前暴露

最后聊一下周期巡检。我个人的习惯是每季度做一次账号权限审计,方法很简单,几个命令就能跑完:

# 列出所有 uid>=1000 的普通用户 awk -F: '$3>=1000 {print $1,$3,$7}' /etc/passwd # 找出没有密码或密码异常的账号 awk -F: '($2=="" || $2=="!") {print $1}' /etc/shadow # 列出 sudoers 中所有有 root 权限的条目 grep -E '^\s*(%|[^#])' /etc/sudoers /etc/sudoers.d/* 2>/dev/null # 找出 UID 重复的用户(极端情况下可能出现) awk -F: '{print $3}' /etc/passwd | sort | uniq -d

每次巡检结果和台账一对照,谁多了权限、谁该被清理一目了然。很多问题都能在演变成事故之前被拦住。


6. 个人经验与两个小建议

这套 SOP 在我管理的几台服务器上跑了一年多,最大的变化是:再也没有人因为误删文件来扯皮,也不会再出现"这个账号是谁的"的考古题。权限隔离不是要让团队互相提防,而是让合作有边界,数据有归属,事后有记录。

最后分享两个小建议。

第一个建议:如果公司已经有统一的身份认证服务,账号开通的流程应该往自动化的方向走。手动 useradd 配上台账是过渡方案,我当时用了一个简单的初始化脚本,从 CSV 读取账号信息、UID、组、SSH 公钥,然后批量执行创建流程。这样既能保证操作一致,也避免人工敲命令抄错 UID。哪怕只是几十个人的团队,写个几十行的 Bash 脚本也值得。

第二个建议:NAS 统一 UID 这件事,越早做越轻松。人少的时候改 UID 成本很低,等人多了、NAS 上堆了几万个文件之后再想统一,光处理历史文件的属主就得掉一层皮。如果你们公司已经用了很久的 NAS 且 UID 乱成一团,那就从今天开始定新规:所有新账号按统一 UID 创建,旧账号逐步用usermod -u修正,配合find / -nouser -o -nogroup找出孤儿文件再手动认领。过程虽然有点烦,但每修正一个账号,系统的权限混乱就少一分。

这些工作没有太多高深的技术含量,胜在坚持和细致。把这套流程跑顺了,再复杂的多用户环境,也乱不到哪去。

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

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

立即咨询