• 发生时间: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/skel 配置了 DIR_MODE=0750,所以其他用户(包括 along 用户)没有权限访问 pat 的 HOME 目录。
    along:~$ ls -al /home
    total 16
    drwxr-xr-x 1 root  root  4096 Oct 17 06:55 .
    drwxr-xr-x 1 root  root  4096 Oct 17 06:39 ..
    drwxr-xr-x 2 along along 4096 Oct 17 06:55 along
    drwxr-x--- 2 pat   pat   4096 Oct 17 06:55 pat
    
    along:~$ ls -al /home/pat
    ls: cannot open directory '/home/pat': Permission denied
    
    • 接着我将 along 用户添加到 pat 群组。
    along:~$ sudo adduser along pat
    Adding user `along' to group `pat' ...
    Adding user along to group pat
    Done.
    
    along:~$ cat /etc/group | grep pat
    pat:x:1001:along
    
    • 但发现 along 用户依然没有权限访问 pat 的 HOME 目录。此目录的权限是 0750,是允许同一群组的成员访问的。为什么 along 用户却无法访问?
    along:~$ ls -al /home/pat
    ls: cannot open directory '/home/pat': Permission denied
    
    • 另外,我还注意到,如果使用 sudo -u along 来查看 pat 的 HOME 目录,则可以成功。既然当前登录用户就是 along,敲不敲 sudo -u along 的效果应该一样啊?
    along:~$ sudo -u along ls -al /home/pat
    total 20
    drwxr-x--- 2 pat  pat  4096 Oct 17 06:55 .
    drwxr-xr-x 1 root root 4096 Oct 17 06:55 ..
    -rw-r--r-- 1 pat  pat   220 Oct 17 06:55 .bash_logout
    -rw-r--r-- 1 pat  pat  3826 Oct 17 06:55 .bashrc
    -rw-r--r-- 1 pat  pat   807 Oct 17 06:55 .profile
    
  • 问题类别:软件部署

  • 原因分析:

    • 为确认 along 用户确实已添加到 pat 群组了,我使用 groups 命令再次进行检查。此时我发现不带用户名与带用户名的输出结果不一致。
    along:~$ groups along
    along : along sudo pat
    
    along:~$ groups
    along sudo
    
    • 查看 groups 命令的 manpage,有以下描述。也就是说,不带用户名时,groups 打印的是当前进程的群组信息;并且如果群组数据库(即/etc/group)被修改过,两者可能会不一致。
    Print group memberships for each USERNAME or, if no USERNAME is specified, for the current process (which may differ if the groups database has changed).
    
    • 看样子是将 along 用户添加到 pat 群组的这个修改还没立即生效,不妨重新登录试试,发现果然如此。
    # 重新登录后,群组权限会被重新加载,因此将 along 用户添加到 pat 群组终于生效了。
    along:~$ sudo -iu along
    along:~$ ls -al /home/pat
    total 20
    drwxr-x--- 2 pat  pat  4096 Oct 17 06:55 .
    drwxr-xr-x 1 root root 4096 Oct 17 06:55 ..
    -rw-r--r-- 1 pat  pat   220 Oct 17 06:55 .bash_logout
    -rw-r--r-- 1 pat  pat  3826 Oct 17 06:55 .bashrc
    -rw-r--r-- 1 pat  pat   807 Oct 17 06:55 .profile
    
    # 退出登录后,外层的 along 用户的群组权限还是旧的,因此还是无法访问 pat 的 HOME 目录。
    along:~$ exit
    logout
    along:~$ ls -al /home/pat
    ls: cannot open directory '/home/pat': Permission denied
    
    along:~$ ls -al /home/pat
    ls: cannot open directory '/home/pat': Permission denied
    
    along:~$ newgrp pat
    along:~$ ls -al /home/pat
    total 20
    drwxr-x--- 2 pat  pat  4096 Oct 17 06:55 .
    drwxr-xr-x 1 root root 4096 Oct 17 06:55 ..
    -rw-r--r-- 1 pat  pat   220 Oct 17 06:55 .bash_logout
    -rw-r--r-- 1 pat  pat  3826 Oct 17 06:55 .bashrc
    -rw-r--r-- 1 pat  pat   807 Oct 17 06:55 .profile
    
    • 至于上面执行 sudo -u along ls -al /home/pat 可以成功,应该也是执行 sudo -u along 时会刷新群组信息给子进程导致的。
  • 解决方案:

    • 执行 adduser user group 命令后,重新登录系统,或者执行 newgrp group 命令以刷新群组信息给当前进程。
  • 实施结果:

    • along 用户具有访问 pat 用户的 HOME 目录的权限。
  • 经验总结:

    • 使用 adduser user group 命令将用户添加到群组后,需要重新登录系统或者执行 newgrp group 命令,才能使配置生效。
    • 之前安装 docker 并将 along 用户添加到 docker 群组后,执行 docker run 报错 Permission denied,其实也是同样的原因造成的。详见 docker 官方文档