• 发生时间:2022-10-14

  • 问题描述:

    • 我本地电脑的 Ubuntu 系统下有个 along 用户,它具有 sudo 权限。
    along:~$ cat /etc/group | grep along
    sudo:x:27:along
    along:x:1000:
    
    • 为研究 Linux 文件权限问题,我新建了 pat 用户。
    along:~$ sudo adduser pat
    Adding user `pat' ...
    Adding new group `pat' (1001) ...
    Adding new user `pat' (1001) with group `pat' ...
    Creating home directory `/home/pat' ...
    Copying files from `/etc/skel' ...
    New password:
    Retype new password:
    passwd: password updated successfully
    Changing the user information for pat
    # 这里使用默认配置,为节省篇幅,省略后面的打印信息
    
    • 由于 /etc/adduser.conf 配置了 DIR_MODE=0750,pat 的 HOME 目录权限为 750,所以其他用户(包括 along 用户)没有权限访问此目录。
    along:~$ ls -al /home
    total 16
    drwxr-xr-x 1 root  root  4096 Oct 17 02:54 .
    drwxr-xr-x 1 root  root  4096 Oct 17 02:50 ..
    drwxr-xr-x 2 along along 4096 Oct 17 02:52 along
    drwxr-x--- 2 pat   pat   4096 Oct 17 02:54 pat
    
    along:~$ ls /home/pat
    ls: cannot open directory '/home/pat': Permission denied
    
    • 接着我将 along 用户添加到 pat 群组,但发现 along 用户依然没有权限访问 pat 的 HOME 目录。
    along:~$ sudo usermod -G pat along
    along:~$ ls /home/pat
    42   ls: cannot open directory '/home/pat': Permission denied
    
    • 然而更奇怪的是,我发现 /etc/group 文件里 along 用户不再是 sudoer,但 along 用户依然具有 sudo 权限!
    # sudo 群组的第四列为空,代表现在没有任何 sudoer
    along:~$ cat /etc/group | grep sudo
    sudo:x:27:
    
    # 但 along 用户依然可以使用 sudo
    along:~$ sudo whoami
    root
    
    • 最后,我重启电脑,发现这时候 along 用户不再具有 sudo 权限了!
    along:~$ sudo whoami
    along is not in the sudoers file.  This incident will be reported.
    
  • 问题类别:软件部署

  • 原因分析:

    • 由于这个问题比较诡异,我一下子没找到思路,就请教了软件组的林少彪——他负责我司 setup 服务器的维护,对账号管理比较了解。
    • 他建议执行 history 命令来查看历史命令,看看哪些命令比较可疑。
    • 当看到 sudo usermod -G pat along 这条命令时,由于他很少使用 usermod 命令,于是建议我查看一下 usermod 的 manpage。
    • 在 usermod 的 manpage 中,我们发现了它的 -G 选项中有以下描述: If the user is currently a member of a group which is not listed, the user will be removed from the group.
    • 也就是说,当我执行 sudo usermod -G pat along 时,虽然把 along 用户加入到 pat 群组了,但也把 along 用户原有的群组都删除了!
    • 我之前是参考 How-To Geek 网站 的教程来使用这条命令的,于是重新查看该网站,发现自己看漏了还有一个 -a 选项,正确命令为 sudo usermod -a -G pat along
    • 林少彪建议以后使用 adduser user group 来将用户添加到群组,这条命令使用起来更方便,也不容易出错。
  • 解决方案:

    • 参考 StackExchange 网站,重新给 along 用户添加 sudo 权限,主要步骤为:
      • 重启电脑,在 grub 启动菜单中,选择 Advanced options for ubuntu,进入 recovery Menu。
      • 在 Recovery Menu,选择 root,以 root 用户登录终端。
      • 在终端中,输入 adduser along sudo,将 along 用户添加到 sudo 群组。
      • 重启电脑。
    • 重启电脑后,改用 adduser user group 命令将 along 用户添加到某些群组。
  • 实施结果:

    • along 用户重新获得了 sudo 权限,并且可以正常将 along 用户添加到目标群组了。
  • 经验总结:

    • 要将用户添加到群组,应该使用 adduser user group 命令,尽量不要使用 usermod 命令(有点危险!)。
    • 阅读文档要耐心、细心,否则可能由于看错文档而酿成意料之外的大错。