usermod 如何让你绕过 sudo?

usermod 如何让你绕过 sudo?

我的团队最近举行了一次展示会,我介绍了我的发现Docker。我解释了如何使用以下命令安装 Docker:

curl -sSL https://get.docker.com/ | sh

然后我解释说,在这种安装中,你需要在所有 Docker 命令前面加上前缀sudo(例如sudo docker info),除非你运行:

sudo usermod -aG docker myUser

完成此操作后,您就可以运行,例如docker info

另一个初级工程师问我这个usermod命令是如何工作的,我根据我对 Linux 用户/组的理解进行了解释:

  • 所有 Docker 二进制文件都安装在属于名为docker
  • 由于myUser默认情况下不是的成员docker,因此它没有 rwx 权限来对 Docker 二进制文件执行任何操作
  • 因此,解决方案是使用sudo为您提供给定命令的 root 权限,或者授予您组成员myUser身份docker

当我这样解释的时候,一位高级工程师非常突然地告诉我我错了,并且“事实上情况比这稍微复杂一些。

所以我想问:我是否误解了 Linux 的安全模型?这位高级工程师说得对吗?如果是这样,我遗漏了什么(到底是什么“如此复杂”)?或者我是否正确,在这种情况下,有人可以给我指出一些可靠的文档来证明这一点吗?

答案1

所有 Docker 二进制文件都安装在属于名为 docker 的组的系统上

不正确。docker二进制文件归以下人员所有root:root

$ stat `which docker`
  File: ‘/usr/bin/docker’
  Size: 16296881    Blocks: 31832      IO Block: 4096   regular file
Device: fc00h/64512d    Inode: 143202      Links: 1
Access: (0755/-rwxr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)

由于 myUser 默认不是 docker 的成员,因此它没有 rwx 权限来对 Docker 二进制文件执行任何操作

每个人都可以读取和执行这些二进制文件。

因此,解决方案是使用 sudo 为您提供给定命令的 root 权限,或者授予 myUser docker 组成员身份

Docker 服务使用套接字来监听命令。套接字通常是:

  • 位于/var/run/docker.sock
  • 拥有root:docker
  • 并且可以被组写入,但是其他用户不能读取或写入:

例如:

$ stat /var/run/docker.sock
  File: ‘/var/run/docker.sock’
  Size: 0           Blocks: 0          IO Block: 4096   socket
Device: 10h/16d Inode: 13619       Links: 1
Access: (0660/srw-rw----)  Uid: (    0/    root)   Gid: (  997/  docker)

这就是为什么作为该组的成员docker可以让你运行docker命令。

请注意,您可以指定应该将哪个组用作服务的参数docker。来自man docker

   -G, --group=""
 Group  to assign the unix socket specified by -H when running in dae‐
   mon mode.
 use '' (the empty string) to disable setting of a group.  Default  is
   docker.

所以,这并不docker,但它是docker默认的。

答案2

如果您在谈论 Linux 有多安全以及它可能存在的漏洞,答案是肯定的。如果我足够清楚地理解了您的问题,那么答案是肯定的,我的解释是,据我所知,无论 Linux 发行版如何,它都可能像任何其他操作系统一样感染病毒,这取决于您是否安装了什么。以 Flash Player 为例,即使在 Windows 上,它也会在操作系统上造成许多安全漏洞,使其比刚推出时更容易受到攻击

如果你运行没有桌面和所有其他花哨特权的 Linux,如果我没记错的话,它会比我们所有最喜欢的应用程序更安全,我不知道我的回答是否有帮助,但我希望这有帮助

相关内容