Wie kann ich lsof in einem Docker ersetzen (nativ, nicht LXC-basiert)?


16

Ich bin etwas verblüfft, dass in einem Docker-Container lsof -ikeine Ausgabe erfolgt.

Beispiel (alle Befehle / Ausgaben aus dem Container):

[1] root@ec016481cf5f:/# lsof -i
[1] root@ec016481cf5f:/# netstat -tulpn
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      -
tcp6       0      0 :::22                   :::*                    LISTEN      -

Bitte beachten Sie auch, dass kein PID- oder Programmname angezeigt wird netstat. fusergibt auch etwas verwirrende Ausgabe und ist nicht in der Lage, die PIDs auch zu lokalisieren.

Kann jemand Licht ins Dunkel bringen?

  • Wie kann ich ersetzen lsof -i(um auch den Prozessnamen zu sehen !)
  • Warum ist die Ausgabe von auch netstatverkrüppelt?

Hinweis: Der Container wird mit der "ExecDriver": "native-0.1"Docker-eigenen Ausführungsebene ausgeführt, nicht mit LXC.


[1] root@ec016481cf5f:/# fuser -a4n tcp 22
Cannot stat file /proc/1/fd/0: Permission denied
Cannot stat file /proc/1/fd/1: Permission denied
Cannot stat file /proc/1/fd/2: Permission denied
Cannot stat file /proc/1/fd/3: Permission denied
Cannot stat file /proc/1/fd/255: Permission denied
Cannot stat file /proc/6377/fd/0: Permission denied
Cannot stat file /proc/6377/fd/1: Permission denied
Cannot stat file /proc/6377/fd/2: Permission denied
Cannot stat file /proc/6377/fd/3: Permission denied
Cannot stat file /proc/6377/fd/4: Permission denied
22/tcp:

(Ich bin nicht besessen von der Permission denied, weil diese Zahlen. Was mich verwirrt, ist die leere Liste der PIDs nach 22/tcp.)


# lsof|awk '$1 ~ /^sshd/ && $3 ~ /root/ {print}'
sshd    6377      root  cwd   unknown                        /proc/6377/cwd (readlink: Permission denied)
sshd    6377      root  rtd   unknown                        /proc/6377/root (readlink: Permission denied)
sshd    6377      root  txt   unknown                        /proc/6377/exe (readlink: Permission denied)
sshd    6377      root    0   unknown                        /proc/6377/fd/0 (readlink: Permission denied)
sshd    6377      root    1   unknown                        /proc/6377/fd/1 (readlink: Permission denied)
sshd    6377      root    2   unknown                        /proc/6377/fd/2 (readlink: Permission denied)
sshd    6377      root    3   unknown                        /proc/6377/fd/3 (readlink: Permission denied)
sshd    6377      root    4   unknown                        /proc/6377/fd/4 (readlink: Permission denied)
sshd    6442      root  cwd   unknown                        /proc/6442/cwd (readlink: Permission denied)
sshd    6442      root  rtd   unknown                        /proc/6442/root (readlink: Permission denied)
sshd    6442      root  txt   unknown                        /proc/6442/exe (readlink: Permission denied)
sshd    6442      root    0   unknown                        /proc/6442/fd/0 (readlink: Permission denied)
sshd    6442      root    1   unknown                        /proc/6442/fd/1 (readlink: Permission denied)
sshd    6442      root    2   unknown                        /proc/6442/fd/2 (readlink: Permission denied)
sshd    6442      root    3   unknown                        /proc/6442/fd/3 (readlink: Permission denied)
sshd    6442      root    4   unknown                        /proc/6442/fd/4 (readlink: Permission denied)
sshd    6442      root    5   unknown                        /proc/6442/fd/5 (readlink: Permission denied)

Es gibt noch etwas mehr Ausgabe für den verbundenen Benutzer, die ebenfalls korrekt identifiziert wird, aber das war's. Es ist anscheinend unmöglich zu erkennen, von welchem ​​Typ ( lsof -iBegrenzung auf Internet-Sockets) ein bestimmtes "Objekt" ist.


Was macht ein lsofBericht? Das Gleiche?
SLM

@slm: geniale anfrage! Es hält es nicht leer. Stattdessen werden eine ganze Reihe von (auch sshd-bezogenen) Zeilen angezeigt, von denen einige TCP-Sockets sein können TYPE unknown. Eigenartig. Die Ausgabe an meine Frage anhängen.
0xC0000022L

Wenn Sie es ausführen, erhalten strace -s 2000 -o lsof.log lsof -iSie wahrscheinlich einige zusätzliche Einblicke in das, was blockiert wird.
SLM

1
@slm: guter Punkt. Danke, dass du mich erinnert hast. Ich mache das aber morgen. Es ist auch gut möglich, dass stracesich dieser in dem Behälter befindet. Spannende neue Sachen zum Lernen. Vielen Dank für Ihre Idee. Muss aber aufs Bett gehen.
0xC0000022L

Zu Ihrer Information: Dies bricht auch netstat -lp. Es wird definitiv von Apparmor verursacht.
Alan Robertson

Antworten:


7

(HINWEIS: Es ist unklar, wie der Fragesteller in den Docker-Container eintritt. Ich gehe davon aus, dass er docker exec -it CONTAINER bash verwendet wurde.)

Ich hatte dieses Problem, als ich ein Docker-Image verwendet habe, das auf der centos:7Docker-Version basiert. Um dies 1.9.0zu überwinden, habe ich Folgendes ausgeführt:

docker exec --privileged -it CONTAINER bash

Beachten Sie die Aufnahme von --privileged.

Mein naives Verständnis des Grundes, warum dies erforderlich ist: Es scheint, dass Docker sich bemüht, den Container "sicherer" zu machen, wie hier dokumentiert .


4

Hah, die Handlung verdickt sich. Wenn jemand eine bessere Antwort hat, schreibe sie bitte auf und ich akzeptiere sie, falls akzeptabel. Aber hier der offensichtliche Grund. Wie nachlässig von mir, die Protokolldateien auf dem Host zu ignorieren :

Jun 12 01:29:46 hostmachine kernel: [140235.718807] audit_printk_skb: 183 callbacks suppressed
Jun 12 01:29:46 hostmachine kernel: [140235.718810] type=1400 audit(1402536586.521:477): apparmor="DENIED" operation="ptrace" profile="docker-default" pid=3782 comm="lsof" requested_mask="trace" denied_mask="trace" peer="docker-default"
Jun 12 01:29:46 hostmachine kernel: [140235.718860] type=1400 audit(1402536586.521:478): apparmor="DENIED" operation="ptrace" profile="docker-default" pid=3782 comm="lsof" requested_mask="read" denied_mask="read" peer="docker-default"
Jun 12 01:29:46 hostmachine kernel: [140235.718886] type=1400 audit(1402536586.521:479): apparmor="DENIED" operation="ptrace" profile="docker-default" pid=3782 comm="lsof" requested_mask="read" denied_mask="read" peer="docker-default"
Jun 12 01:29:46 hostmachine kernel: [140235.718899] type=1400 audit(1402536586.521:480): apparmor="DENIED" operation="ptrace" profile="docker-default" pid=3782 comm="lsof" requested_mask="read" denied_mask="read" peer="docker-default"
Jun 12 01:29:46 hostmachine kernel: [140235.718921] type=1400 audit(1402536586.521:481): apparmor="DENIED" operation="ptrace" profile="docker-default" pid=3782 comm="lsof" requested_mask="read" denied_mask="read" peer="docker-default"
Jun 12 01:29:46 hostmachine kernel: [140235.718954] type=1400 audit(1402536586.521:482): apparmor="DENIED" operation="ptrace" profile="docker-default" pid=3782 comm="lsof" requested_mask="read" denied_mask="read" peer="docker-default"
Jun 12 01:29:46 hostmachine kernel: [140235.719001] type=1400 audit(1402536586.521:483): apparmor="DENIED" operation="ptrace" profile="docker-default" pid=3782 comm="lsof" requested_mask="read" denied_mask="read" peer="docker-default"
Jun 12 01:29:46 hostmachine kernel: [140235.719043] type=1400 audit(1402536586.521:484): apparmor="DENIED" operation="ptrace" profile="docker-default" pid=3782 comm="lsof" requested_mask="read" denied_mask="read" peer="docker-default"
Jun 12 01:29:46 hostmachine kernel: [140235.719086] type=1400 audit(1402536586.521:485): apparmor="DENIED" operation="ptrace" profile="docker-default" pid=3782 comm="lsof" requested_mask="read" denied_mask="read" peer="docker-default"
Jun 12 01:29:46 hostmachine kernel: [140235.719126] type=1400 audit(1402536586.521:486): apparmor="DENIED" operation="ptrace" profile="docker-default" pid=3782 comm="lsof" requested_mask="read" denied_mask="read" peer="docker-default"

Apparmor scheint also der Schuldige zu sein, obwohl ich herausfinden muss, wie ich es davon überzeugen kann, dies zuzulassen, ohne die Sicherheit von Host / Container zu beeinträchtigen, oder zu prüfen, ob dies überhaupt möglich ist, ohne die Sicherheit zu beeinträchtigen.



3

Eine andere Möglichkeit, diesmal mit einer detaillierteren Sicherheitseinstellung: Gewähren Sie dem Docker-Container das Privileg SYS_PTRACE:

docker run --cap-add=SYS_PTRACE ...

1
Für den Fall, dass sich jemand fragt, warum er etwas lsofbraucht CAP_SYS_PTRACE: Es muss gelesen werden /proc/*/stat. Siehe ptrace (2)
David Röthlisberger

2

Ich habe dieses Problem auch gefunden. Das Problem ist , nachdem ich deaktiviert gegangen apparmorauf docker:

$ sudo aa-complain <docker apparmor profile name, "docker-default" on ubuntu>

Referenz-URL: https://help.ubuntu.com/community/AppArmor


3
Möglicherweise möchten Sie diese Antwort näher erläutern (z. B. was aa-complaintut oder eine Dokumentation, die diese Lösung unterstützt).
HalosGhost

@HalosGhost Entschuldigung, ich bin nicht ganz vertraut damit apparmor. Ich habe es nur gegoogelt und einen Weg gefunden, es zu deaktivieren. Mit anderen Worten, ich weiß nicht, warum es funktioniert oder warum es nicht funktioniert hat. Mein Host-Betriebssystem ist Ubuntu 14.04, daher habe ich nach "ubuntu apparmor" gesucht und help.ubuntu.com/community/AppArmor gefunden . Ich hoffe das wäre hilfreich für dich.
Menghan

2
Ich habe dieses Problem nicht. Mein Anliegen war die Qualität Ihrer Antwort und wie hilfreich (und informativ) sie für das OP sein würde.
HalosGhost

@HalosGhost Danke für Ihre Hilfe, ich bearbeite meine Antwort.
Menghan

Am Ubuntu 14.04 war der Befehl sudo aa-complain /etc/apparmor.d/docker. Grundsätzlich wird die App-Rüstung für den Docker-Prozess deaktiviert, was bedeutet, dass Docker alle Dateien auf dem System lesen kann. Bisher konnte es nur mit Dateien funktionieren, die im Profil zulässig waren. Eine bessere Lösung könnte darin bestehen, die App-Rüstungsregeln zu ändern, die den Zugriff auf die Dateien / proc / pid / fd ermöglichen.
Martins Balodis
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.