我的团队最近举行了一次展示会,我介绍了我的发现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,如果我没记错的话,它会比我们所有最喜欢的应用程序更安全,我不知道我的回答是否有帮助,但我希望这有帮助