← 回目录
08 Week 02 · 权限和用户

建用户、改密码、锁账号

用户管理是运维的日常工单。命令不难,但有一个参数写错会引发真事故——今天重点讲它。

今天要敲的
$ sudo useradd -m -s /bin/bash devops
$ sudo passwd devops
$ id devops
$ sudo usermod -aG wheel devops     # 注意那个 a
$ sudo usermod -L devops            # 锁定
$ sudo userdel -r testuser          # -r 连家目录删

用户信息存在哪

三个文件,先认识
用户体系的三个核心文件
/etc/passwd
所有用户的基本信息,任何人都能读。名字里有 passwd 但不存密码——历史遗留的叫法。
/etc/shadow
加密后的密码放这,还有密码过期策略。只有 root 能读——这是安全设计。
/etc/group
组的信息,以及每个组里有哪些成员。
passwd 一行是什么意思
$ tail -1 /etc/passwd
devops:x:1000:1000::/home/devops:/bin/bash
                             

① 用户名   ② x 表示密码在 shadow 里   ③ UID   ④ 主组 GID
⑤ 备注     ⑥ 家目录                   ⑦ 登录用的 shell
第 ⑦ 项是个知识点

如果 shell 写的是 /sbin/nologin,说明这个账号不允许登录——系统里大部分账号(nginx、mysql 这些)都是这样,它们只是用来跑服务的身份,不是给人用的。

grep nologin /etc/passwd | wc -l 数一下,你会发现这种账号占了绝大多数。

useradd

建用户
两个参数别漏
$ sudo useradd -m -s /bin/bash devops
                       
       -m 建家目录        -s 指定 shell

$ sudo passwd devops        # 建完必须设密码,否则登录不了
$ id devops                 # 确认建好了
$ ls -ld /home/devops       # 确认家目录在,权限是 700
RHEL 系的默认值

Rocky / RHEL 上 useradd 默认就会建家目录,所以 -m 加不加都行。但 Debian/Ubuntu 上默认不建——养成一直带 -m 的习惯,换系统不会踩坑

usermod -aG

今天最重要的一个字母

把用户加进一个组,用 usermod -G。但必须带上 a

加不加 a,差别是灾难级的
-aG wheel
append,追加。原有的组都保留,再加一个 wheel。✅ 永远用这个。
-G wheel
覆盖。用户原来所在的所有附加组会被清空,只剩 wheel。
这个事故长什么样
# 某用户原本在 docker、wheel、developers 三个组里
$ id alice
uid=1001(alice) groups=1001(alice),10(wheel),995(docker),1050(developers)

# 你想给他加个新组,手滑漏了 a
$ sudo usermod -G newgroup alice

$ id alice
uid=1001(alice) groups=1001(alice),1060(newgroup)
  ↑ wheel 没了(不能 sudo 了)、docker 没了(用不了容器了)
    而且系统不会给你任何警告
改组之前先留个底

id 用户名 先跑一遍,把输出复制到记事本里。万一改错了,照着原样用 -aG 加回去。

这个习惯和 Day 02 的「改配置前先备份」是同一个道理。

锁定和删除

员工离职怎么办
锁 vs 删
$ sudo usermod -L devops     # 锁定,密码前加个 ! 让它失效
$ sudo usermod -U devops     # 解锁

$ sudo userdel devops        # 删账号,家目录留着
$ sudo userdel -r devops     # 连家目录一起删
这是道面试题

员工离职,应该先锁定而不是直接删。因为:

① 他可能有定时任务还在跑;② 系统里可能有文件属主是他,删了用户之后那些文件会变成孤儿(只显示 UID 数字);③ 审计需要保留痕迹。

确认没有依赖了,再删。

密码策略

知道有这回事
chage 看和改
$ sudo chage -l devops        # 看密码过期策略
$ sudo chage -M 90 devops     # 密码最长 90 天必须改
$ sudo passwd -e devops       # 强制下次登录必须改密码

企业环境(尤其等保合规)经常要求密码定期更换,这几条能直接派上用场

今天的面试点

「员工离职,账号怎么处理?」

usermod -L 锁定,不直接删。因为可能还有定时任务在跑,或者有文件属主是他——删了之后那些文件会变成没主的 UID 数字。确认没有依赖了再 userdel -r。」

「怎么给用户加 sudo 权限?」

「加进 wheel 组:usermod -aG wheel 用户名。」

然后主动补一句:「那个 a 一定要带,是 append 的意思。不加的话会把用户原有的附加组全清掉,我见过因为这个把人踢出 docker 组的。」——这句话说明你踩过坑或者知道坑在哪。

今天的练习

敲完再走 · 约 12 分钟
  • 建一个用户:sudo useradd -m -s /bin/bash test01,然后 sudo passwd test01 设密码
  • tail -3 /etc/passwd,把最后一行的七个字段对着上面的图认一遍
  • sudo tail -3 /etc/shadow,看看密码是怎么存的(一串加密后的乱码)
  • grep nologin /etc/passwd | wc -l,数数系统里有多少不能登录的服务账号
  • 重点id test01 记下结果 → sudo usermod -aG wheel test01 → 再 id 对比,确认原有的组还在
  • 锁定再解锁:sudo usermod -L test01sudo grep test01 /etc/shadow 看密码前面多了个 !,然后 -U 解锁
  • 练完清理:sudo userdel -r test01
明天预告

Day 09 讲 sudo:为什么不直接用 root,以及那个改错了会让所有人失去 sudo 权限的文件该怎么安全地编辑。