Come posso sostituire lsof all'interno di una Docker (nativa, non basata su LXC)


16

Sono un po 'sconcertato dal fatto che all'interno di un contenitore Docker lsof -inon produca alcun output.

Esempio (tutti i comandi / output dall'interno del contenitore):

[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      -

Nota anche come nessun PID o nome del programma è mostrato da netstat. fuserinoltre fornisce un output un po 'confuso e non è in grado di individuare anche i PID.

Qualcuno può far luce su questo?

  • Come posso sostituire lsof -i(per vedere anche il nome del processo !)
  • Perché anche l'output di netstatparalizzato?

NB: Il contenitore funziona con "ExecDriver": "native-0.1", ovvero il livello di esecuzione proprio di Docker, non 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:

(Non sono ossessionato dal Permission denied, perché quella cifra. Ciò che mi confonde è la lista vuota di PID dopo 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)

C'è dell'output in più per l'utente connesso, anch'esso correttamente identificato, ma questo è tutto. È apparentemente impossibile discernere di quale tipo ( lsof -ilimiti alle prese Internet) è un certo "oggetto".


Che cosa fa un lsofrapporto? Lo stesso?
slm

@slm: brillante richiesta! Non lo tiene vuoto. Invece mostra un intero host di sshdlinee (anche correlate), alcune delle quali potrebbero essere socket TCP, come TYPE unknown. Peculiar. Aggiungendo l'output alla mia domanda.
0xC0000022L

Se lo esegui strace -s 2000 -o lsof.log lsof -i, probabilmente ti darà alcune informazioni aggiuntive su ciò che viene bloccato.
slm

1
@slm: buon punto. Grazie per avermi ricordato. Lo farò domani, comunque. Inoltre è possibile che esso stracestesso sia limitato nel contenitore. Nuove cose interessanti da imparare. Grazie per l'idea di rimbalzo. Devo andare a letto, però.
0xC0000022L

Cordiali saluti: Anche questo interrompe netstat -lp. È sicuramente causato da apparmor.
Alan Robertson,

Risposte:


7

(NOTA: non è chiaro nella questione come il richiedente sta entrando nel contenitore di finestra mobile sto. Assumendo docker exec -it CONTAINER bash è stato utilizzato.)

Ho avuto questo problema durante l'utilizzo di un'immagine docker basata su centos:7con la versione docker 1.9.0e per ovviare a questo, ho appena eseguito:

docker exec --privileged -it CONTAINER bash

Si noti l'inclusione di --privileged.

La mia ingenua comprensione del motivo è necessaria: sembra che la finestra mobile si sforzi di rendere il contenitore più "sicuro", come documentato qui .


4

Ah, la trama si infittisce. Se qualcuno ha una risposta migliore, per favore scrivilo e lo accetterò, se accettabile. Ma qui la ragione apparente. Quanto negligente da parte mia ignorare i file di registro sull'host :

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"

Quindi l'apparmor sembra essere il colpevole, anche se dovrò capire come convincerlo a consentire ciò senza compromettere la sicurezza di host / container o per vedere se è possibile senza compromettere la sicurezza.



3

Un'altra possibilità, questa volta con un'impostazione di sicurezza più precisa: assegnare il privilegio SYS_PTRACE al contenitore della finestra mobile:

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

1
Nel caso qualcuno si stia chiedendo perché ne abbia lsofbisogno CAP_SYS_PTRACE: è necessario leggere /proc/*/stat. Vedi ptrace (2)
David Röthlisberger il

2

Ho riscontrato anche questo problema. Il problema è andato dopo che ho disabilitatoapparmor su docker:

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

URL di riferimento: https://help.ubuntu.com/community/AppArmor


3
Puoi prendere in considerazione l'idea di aggiungere ulteriori spiegazioni a questa risposta (ad es. Cosa aa-complainfa, o della documentazione che supporta questa soluzione).
HalosGhost

@HalosGhost Siamo spiacenti, non mi è abbastanza familiare apparmor, l'ho solo cercato su Google e ho trovato il modo di disabilitarlo. In altre parole, non so perché funzioni o perché non abbia funzionato. Il mio host host è Ubuntu 14.04, quindi ho cercato "Ubuntu Apparmor" e ho trovato help.ubuntu.com/community/AppArmor . Spero che questo possa esserti utile.
Menghan,

2
Non ho questo problema; la mia preoccupazione era per la qualità della risposta e quanto utile (e informativo) sarebbe stato per il PO.
HalosGhost

@HalosGhost Grazie per il tuo aiuto, ho rispedito la mia risposta.
Menghan,

Su Ubuntu 14.04 il comando era sudo aa-complain /etc/apparmor.d/docker. Fondamentalmente disabilita l'armatura dell'app per il processo docker, il che significa che la finestra mobile può leggere qualsiasi file sul sistema. In precedenza poteva funzionare solo con file consentiti nel profilo. Una soluzione migliore potrebbe essere quella di modificare le regole dell'armatura dell'app che consentirebbero l'accesso ai file / proc / pid / fd.
Martins Balodis,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.