Perché è una shell all'interno di un contenitore docker che mostra contenuti dmesg dall'host?

Ho un contenitore docker che esegue Debian jessie su Ubuntu yakkety.

Quando all'interno del docker (collegato tramite ssh per esempio) sono isolata dall'host (che è previsto). Tuttavia ho capito che dmesg mi mostra i messaggi per l'host e non per il contenitore. Come può avere accesso alle informazioni del suo host?

La configuration del contenitore docker non è speciale (salvo che utilizza un ponte specifico, diverso da docker0 ), in particolare non viene eseguito in alcuna modalità privilegiata ( "Privileged": false sotto):

 [email protected] ~# docker inspect minecraft-1-8 [ { "Id": "748cfdfbf3fb5526cb7151cbc0857117af3c7bd8ab9e086c4f2efb897290d66e", "Created": "2016-12-01T15:35:05.287672787Z", "Path": "/usr/bin/supervisord", "Args": [], "State": { "Status": "running", "Running": true, "Paused": false, "Restarting": false, "OOMKilled": false, "Dead": false, "Pid": 28650, "ExitCode": 0, "Error": "", "StartedAt": "2016-12-15T18:37:08.409564695Z", "FinishedAt": "2016-12-15T18:37:07.457274028Z" }, "Image": "sha256:78a2f88d47e29523503c2196ed2faaa3d1039d948d73987edc03b2abd338595d", "ResolvConfPath": "/var/lib/docker/containers/748cfdfbf3fb5526cb7151cbc0857117af3c7bd8ab9e086c4f2efb897290d66e/resolv.conf", "HostnamePath": "/var/lib/docker/containers/748cfdfbf3fb5526cb7151cbc0857117af3c7bd8ab9e086c4f2efb897290d66e/hostname", "HostsPath": "/var/lib/docker/containers/748cfdfbf3fb5526cb7151cbc0857117af3c7bd8ab9e086c4f2efb897290d66e/hosts", "LogPath": "/var/lib/docker/containers/748cfdfbf3fb5526cb7151cbc0857117af3c7bd8ab9e086c4f2efb897290d66e/748cfdfbf3fb5526cb7151cbc0857117af3c7bd8ab9e086c4f2efb897290d66e-json.log", "Name": "/minecraft-1-8", "RestartCount": 0, "Driver": "overlay", "MountLabel": "", "ProcessLabel": "", "AppArmorProfile": "", "ExecIDs": null, "HostConfig": { "Binds": null, "ContainerIDFile": "", "LogConfig": { "Type": "json-file", "Config": {} }, "NetworkMode": "docker", "PortBindings": {}, "RestartPolicy": { "Name": "no", "MaximumRetryCount": 0 }, "AutoRemove": false, "VolumeDriver": "", "VolumesFrom": null, "CapAdd": null, "CapDrop": null, "Dns": [], "DnsOptions": [], "DnsSearch": [], "ExtraHosts": null, "GroupAdd": null, "IpcMode": "", "Cgroup": "", "Links": null, "OomScoreAdj": 0, "PidMode": "", "Privileged": false, "PublishAllPorts": false, "ReadonlyRootfs": false, "SecurityOpt": null, "UTSMode": "", "UsernsMode": "", "ShmSize": 67108864, "Runtime": "runc", "ConsoleSize": [ 0, 0 ], "Isolation": "", "CpuShares": 0, "Memory": 0, "CgroupParent": "", "BlkioWeight": 0, "BlkioWeightDevice": null, "BlkioDeviceReadBps": null, "BlkioDeviceWriteBps": null, "BlkioDeviceReadIOps": null, "BlkioDeviceWriteIOps": null, "CpuPeriod": 0, "CpuQuota": 0, "CpusetCpus": "", "CpusetMems": "", "Devices": [], "DiskQuota": 0, "KernelMemory": 0, "MemoryReservation": 0, "MemorySwap": 0, "MemorySwappiness": -1, "OomKillDisable": false, "PidsLimit": 0, "Ulimits": null, "CpuCount": 0, "CpuPercent": 0, "IOMaximumIOps": 0, "IOMaximumBandwidth": 0 }, "GraphDriver": { "Name": "overlay", "Data": { "LowerDir": "/var/lib/docker/overlay/e78ce9dbcedd6974429a4aada8f38913b7d35da41f586f203dd99a568f38b6c3/root", "MergedDir": "/var/lib/docker/overlay/e8422e4707d95db8ea747af2367626cc8bf16e95f8eb05dfad9a63461c9ade86/merged", "UpperDir": "/var/lib/docker/overlay/e8422e4707d95db8ea747af2367626cc8bf16e95f8eb05dfad9a63461c9ade86/upper", "WorkDir": "/var/lib/docker/overlay/e8422e4707d95db8ea747af2367626cc8bf16e95f8eb05dfad9a63461c9ade86/work" } }, "Mounts": [], "Config": { "Hostname": "minecraft-1-8", "Domainname": "", "User": "", "AttachStdin": false, "AttachStdout": true, "AttachStderr": true, "Tty": false, "OpenStdin": false, "StdinOnce": false, "Env": [ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" ], "Cmd": [ "/usr/bin/supervisord" ], "Image": "minecraft", "Volumes": null, "WorkingDir": "", "Entrypoint": null, "OnBuild": null, "Labels": {} }, "NetworkSettings": { "Bridge": "", "SandboxID": "cf411634babad31138ab4572b9cd7306f74a54dd1baf4cd8d7706d7e7020c594", "HairpinMode": false, "LinkLocalIPv6Address": "", "LinkLocalIPv6PrefixLen": 0, "Ports": {}, "SandboxKey": "/var/run/docker/netns/cf411634baba", "SecondaryIPAddresses": null, "SecondaryIPv6Addresses": null, "EndpointID": "", "Gateway": "", "GlobalIPv6Address": "", "GlobalIPv6PrefixLen": 0, "IPAddress": "", "IPPrefixLen": 0, "IPv6Gateway": "", "MacAddress": "", "Networks": { "docker": { "IPAMConfig": { "IPv4Address": "10.200.0.100" }, "Links": null, "Aliases": [ "748cfdfbf3fb" ], "NetworkID": "7b20560b36032d36ffe6c0ebece6b4408355d207f4e203a2957b0434ee0afdc1", "EndpointID": "9fa4fc914dfe76022ce0db02e48a7e7c85c57bc2a15b0b3e5d81b1f24d95f376", "Gateway": "10.200.0.1", "IPAddress": "10.200.0.100", "IPPrefixLen": 24, "IPv6Gateway": "", "GlobalIPv6Address": "", "GlobalIPv6PrefixLen": 0, "MacAddress": "02:42:0a:c8:00:64" } } } } ] 

Nella maggior parte dei distro dmesg non è un command privilegiato. Ogni utente può utilizzare l'interface klogctl per leggere il buffer dell'anello del kernel.

 $ id uid=1001(matt) gid=1001(matt) groups=1001(matt) $ dmesg | head -1 [ 0.000000] Initializing cgroup subsys cpuset 

Ma non può fare niente oltre che leggere

 $ dmesg -C dmesg: klogctl failed: Operation not permitted 

Quanto si estende a Docker

 $ sudo docker run debian dmesg | head -1 [ 0.000000] Initializing cgroup subsys cpuset $ sudo docker run debian dmesg -C dmesg: klogctl failed: Operation not permitted 

Limitazione dell'accesso

È ansible limitare l'accesso in lettura a utenti root e quelli con CAP_SYSLOG o CAP_SYS_ADMIN funzionalità tramite /proc/sys/kernel/dmesg_restrict .

 $ echo 1 > /proc/sys/kernel/dmesg_restrict 

Allora dovresti ricevere un messaggio di authorization negato:

 $ docker run ubuntu:yakkety dmesg dmesg: read kernel buffer failed: Operation not permitted 

L'esecuzione di un contenitore in modalità privilegiata riprenderà l'accesso al buffer dell'anello del kernel host

 $ docker run --privileged ubuntu:yakkety dmesg [146902.131915] br-fa26f1dc96a1: port 3(veth80d3d5d) entered disabled state ... 

Utilizza sysctl per configurare kernel.dmesg_restrict=1 se ne hai bisogno permanentemente.

namespacing

Quanto al motivo per cui il registro del kernel non ha spazi di nome come altre aree del kernel, credo che la risposta è "è difficile". C'è più dettaglio di quello che ti piacerebbe sapere in questa fase di 2012 più vicina ai contenitori pratici: i nomi dei "syslog" aprono il post LWN . Non riesco a vedere alcun riferimento per get ulteriori informazioni rispetto alle patch proposte: https://lwn.net/Articles/562389/ https://lwn.net/Articles/561271/ . Come si può vedere in questa patch di netfilter recenti , hanno un lavoro in giro per consentire alle regole in uno spazio del nome del contenitore di utilizzare il registro globale.