Lsof'u bir Docker içinde nasıl değiştirebilirim (yerel, LXC tabanlı değil)


16

Bir Docker konteynerinin içinde lsof -iherhangi bir çıktı vermediği için biraz şaşırdım .

Örnek (kabın içinden tüm komutlar / çıktılar):

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

Lütfen PID veya program adının nasıl gösterilmediğine de dikkat edin netstat. fuserayrıca biraz kafa karıştırıcı çıktı verir ve PID'leri de tam olarak belirleyemez.

Herkes buna ışık tutabilir mi?

  • Nasıl değiştirebilirim lsof -i( süreç adını da görmek için !)
  • Çıktı neden netstatsakat?

Not: Kap "ExecDriver": "native-0.1", LXC ile değil, Docker'ın kendi yürütme katmanıyla çalışır .


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

(Ben takıntılı değilim Permission denied, çünkü bu rakamlar. Beni şaşırtan şey PID'lerin boş listesidir 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)

Bağlı kullanıcı için doğru bir şekilde tanımlanmış daha fazla çıktı var, ama hepsi bu. lsof -iBelli bir "nesnenin" hangi tip ( internet soketleri ile ilgili sınırlar) olduğunu anlamak imkansızdır .


lsofRapor ne yapar ? Aynısı?
slm

@slm: parlak soruşturma! Boş tutmuyor. Bunun yerine sshd, bazıları TCP yuvaları olabilen bir dizi (ayrıca ilişkili) satır gösterir TYPE unknown. Acayip. Çıktılarıma sorum ekleniyor.
0xC0000022L

Eğer çalıştırırsanız strace -s 2000 -o lsof.log lsof -i, neyin engelleneceğine dair bazı ek bilgiler verir.
slm

1
@slm: iyi bir nokta. Bana hatırlattığın için teşekkürler. Bunu yarın yapacağım. Ayrıca stracekendisinin kapta sınırlı olması da mümkündür . Öğrenmek için heyecan verici yeni şeyler. Fikri geri çevirdiğiniz için teşekkürler. Yine de yatağa çarpması gerekir.
0xC0000022L

Bilginize: Bu aynı zamanda netstat -lp'yi de bozar. Kesinlikle apparmor neden olur.
Alan Robertson

Yanıtlar:


7

(NOT: asker liman işçisi kabı giriyor nasıl söz konusu belirsizdir ben değilim. Varsayılarak docker exec -it CONTAINER bash kullanılmıştır.)

centos:7Docker sürümüne dayalı bir docker görüntüsü kullanırken bu sorunu yaşadım 1.9.0ve bunun üstesinden gelmek için, sadece koştum:

docker exec --privileged -it CONTAINER bash

Dahil edildiğine dikkat edin --privileged.

Bunun gerekliliğine dair naif anlayışım: Docker, burada belgelendiği gibi, konteynerin daha "güvenli" olmasını sağlamaya çalışıyor gibi görünüyor .


4

Hah, arsa kalınlaşıyor. Birisinin daha iyi bir cevabı varsa, lütfen yazın ve kabul edersem kabul edeceğim. Ama burada bariz neden. Ana bilgisayardaki günlük dosyalarını görmezden gelmem ne kadar ihmalkar :

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"

Bu nedenle bariz suçlu gibi görünüyor, ancak ana bilgisayar / konteyner güvenliğinden ödün vermeden buna izin vermeye nasıl ikna edeceğimi ya da güvenlikten ödün vermeden mümkün olup olmadığını görmem gerekecek.


2
Açıklandığı 7276 Docker sorunu #
Anthony O.


2

Ben de bu problemi buldum. Ben devre dışı bıraktıktan sonra sorun gitti apparmorüzerinde docker:

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

referans url'si: https://help.ubuntu.com/community/AppArmor


3
Bu yanıta daha fazla açıklama eklemeyi düşünebilirsiniz (örn. Ne aa-complainyapar veya bu çözümü destekleyen bazı belgeler).
HalosGhost

@HalosGhost Üzgünüm, pek aşina değilim apparmor, sadece googled ve devre dışı bırakmanın bir yolunu buldum. Başka bir deyişle, neden çalıştığını veya neden çalışmadığını bilmiyorum. Ev sahibi işletim sistemim Ubuntu 14.04, bu yüzden "ubuntu apparmor" araması yaptım ve help.ubuntu.com/community/AppArmor buldum . Umarım bu sizin için yararlı olur.
menghan

2
Bu sorunum yok; benim endişem cevap kalitesi ve OP için ne kadar yararlı (ve bilgilendirici) oldu.
HalosGhost

@HalosGhost Yardımınız için teşekkürler, cevabımı tekrar ediyorum.
menghan

Ubuntu 14.04'te komut buydu sudo aa-complain /etc/apparmor.d/docker. Temel olarak docker işlemi için uygulama zırhını devre dışı bırakır, bu da docker'ın sistemdeki herhangi bir dosyayı okuyabileceği anlamına gelir. Önceden yalnızca profilde izin verilen dosyalarla çalışabiliyordu. / Proc / pid / fd dosyalarına erişime izin verecek uygulama zırhı kurallarını değiştirmek daha iyi bir çözüm olabilir.
Martins Balodis
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.