![Was ist ein nicht vernetzter Unix-Domänensocket?](https://rvso.com/image/1671485/Was%20ist%20ein%20nicht%20vernetzter%20Unix-Dom%C3%A4nensocket%3F.png)
ich leseUngesicherte Docker-Daemons enthüllt
Es sagt
Docker daemon creates a non-networked Unix domain socket at /var/run/docker.sock
Was bedeutet ein nicht vernetzter Unix-Domänen-Socket?
Antwort1
Es handelt sich um einen Socket, dessen Adresse eineDateisystempfadanstelle einer Netzwerkadresse. Anstatt beispielsweise eine Verbindung zu einer IP-Adresse:Port wie herzustellen 127.0.0.1:4567
, „verbindet“ sich das Programm mit der speziellen Datei /var/run/docker.sock
.
(Die eigentliche API ist jedoch bei IP- und Unix-Sockets nahezu identisch – Programme verwenden für beide Typen die gleichen Aufrufe socket(), bind() und connect(). Sie müssen lediglich AF_UNIX
(oder AF_LOCAL) anstelle des üblichen AF_INET[6]
als Socket-Typ angeben. Dies macht sie zu einer sehr häufigen Wahl für die interne Kommunikation. Tatsächlicham meistenProgramme auf Ihrem Linux-System kommunizieren auf diese Weise.)
Es ist „nicht vernetzt“, da der Socket immer nur für lokal laufende Prozesse zugänglich ist. (Sie können es nicht über NFS oder SSHFS verwenden.) Im Gegensatz zu „IP-Domänen“-Sockets, die an localhost gebunden werden könnenoderBei jeder beliebigen Adresse (wie beispielsweise in dem von Ihnen verlinkten Artikel, in dem es um extern zugängliche IP-Sockets auf Port 2375 geht) ist ein „Unix-Domänen“-Socket garantiert nur lokal.
(Darüber hinaus können Unix-Sockets Dateiberechtigungen verwenden, um den Zugriff auf den Socket einzuschränken – z. B. nur auf Mitglieder der Gruppe „Docker“ – und der Daemon kennt die UID jedes verbindenden Clients. Schließlich verfügt der Socket natürlich über eine richtigeNamedamit nicht zwei verschiedene Programme um denselben Port konkurrieren …)
Der Begriff „Domäne“ hat nichts mit dem „Domain Name System“ des Internets zu tun und wird nur im allgemeinen Sinne von „Bereich“ oder „Gebiet“ verwendet – soweit ich weiß, sollte „Unix-Domäne“ einfach „das lokal laufende Betriebssystem“ bedeuten (im Gegensatz zu „alle mit dem Internet verbundenen Maschinen“), denn dieser Mechanismusals Teil der Socket-APIwar tatsächlich ursprünglich eine Unix-Funktion. Ein besserer Name wäre „lokale Sockets“, also AF_LOCAL, aber das hat sich nicht durchgesetzt.
Windows hat eine sehr ähnliche Funktion namens „Named Pipes“, z. B. \\.\pipe\docker_engine
. Windows-Named Pipes funktionieren tatsächlich eher wie Unix-Sockets als wie Unix-Pipes – Programme müssen jedoch unter Windows immer noch eine völlig andere API verwenden, um Named Pipes zu verwenden als Sockets (obwohl Win10 auch AF_UNIX-Sockets hat), und es ist immer noch möglich, über SMB auf ungesicherte Pipes zuzugreifen.
Antwort2
Basierend auf dem Kontext bedeutet dies, dass Docker nicht von außerhalb des Hosts (d. h. lokales und externes Netzwerk) zugänglich ist, aber„nur Prozesse [auf derselben Maschine] mit Root-Berechtigung oder Docker-Gruppenmitgliedschaft können zugreifen“