什么是非联网Unix域套接字?

Mik*_*sta 10 linux sockets

我正在阅读《揭露不安全的 docker 守护进程》

它说

Docker daemon creates a non-networked Unix domain socket at /var/run/docker.sock 
Run Code Online (Sandbox Code Playgroud)

非联网Unix域套接字表示什么?

use*_*686 22

它是一个套接字,其地址是文件系统路径而不是某种形式的网络地址。例如,127.0.0.1:4567程序将“连接”到特殊文件 ,而不是连接到 IP 地址:端口(例如 ) /var/run/docker.sock

\n

(然而,IP 和 Unix 套接字之间的实际 API 几乎相同 \xe2\x80\x93 程序对这两种类型使用相同的 socket()、bind()、connect() 调用。它们只需要指定(AF_UNIX或 AF_LOCAL)通常的AF_INET[6]套接字类型。这使它们成为内部通信的非常常见的选择。事实上,Linux 系统上的大多数程序都以这种方式进行通信。)

\n

它是“非网络化”的,因为套接字只能由本地运行的进程访问。(您不能通过 NFS 或 SSHFS 使用它。)与可以绑定到 localhost任何地址的“IP 域”套接字不同(例如在链接的文章中讨论端口 2375 上的外部可访问 IP 套接字),“Unix域”套接字保证仅是本地的。

\n

(此外,Unix套接字可以使用文件权限来限制对套接字\xe2\x80\x93的访问,例如仅限“docker”组\xe2\x80\x93的成员,并且守护进程知道每个连接客户端的UID。最后,当然,套接字有一个正确的名称,因此不会有两个不同的程序争夺同一端口\xe2\x80\xa6)

\n

“域”一词与互联网的“域名系统”无关,仅用于一般意义上的“领域”或“区域” \xe2\x80\x93 据我所知,“Unix 域”只是应该意味着“本地运行的操作系统”(而不是“连接到互联网的所有机器”),因为将此机制作为套接字 API 的一部分确实最初是 Unix 功能。更好的名称是“本地套接字”,即 AF_LOCAL,但这并不适用。

\n

Windows 有一个非常相似的功能,称为“命名管道”,例如\\\\.\\pipe\\docker_engine. Windows 命名管道确实比 Unix 管道 \xe2\x80\x93 更像 Unix 套接字,但是,与使用套接字相比,程序仍然需要使用完全不同的 API 在 Windows 上使用命名管道(尽管 Win10 也有 AF_UNIX 套接字),并且仍然可以通过 SMB 访问不安全的管道。

\n

  • “与使用套接字相比,程序仍然需要使用完全不同的 API 在 Windows 上使用命名管道”——虽然如此,该 API 是文件 API(“CreateFile”、“ReadFile”、“WriteFile”等)。没有特定于管道的访问 API。 (3认同)
  • 仅供参考:Linux 有 FIFO,在手册页中也将其描述为命名管道,它似乎比 unix 套接字更类似于 Windows 命名管道。 (3认同)
  • @JensV:不是。 Unix 上的命名管道仍然是单向的(守护进程可以从客户端读取或写入客户端,但不能同时写入),并且它们只有一个“通道”(读取器无法区分多个写入器,也不知道一个客户端何时打开管道或何时打开管道)。另一个将其关闭)。同时,Windows 上的命名管道是双向的(如套接字)和多实例的(如套接字)。 (2认同)
  • Docker 套接字在这里是一个很糟糕的示例,因为它是罕见的示例之一[您不想将用户添加到组中以使他们能够与守护进程对话](https://github.com/0cjs /sedoc/blob/master/docker/security.md#leveraging-docker-for-root-access)。 (将某人放入“docker”组是一种迂回且令人困惑的方式,可以授予对整个系统的完全root访问权限;将获得root访问权限的人放入“sudo”组或类似组会更清晰、更安全,此时无论他们是否在“docker”组中,他们都可以访问套接字。) (2认同)