Як я можу замінити lsof всередині Docker (рідний, а не LXC)


16

Я дещо збентежений тим, що всередині контейнера Docker lsof -iне дається жодного результату.

Приклад (усі команди / вихідні дані зсередини контейнера):

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

Також врахуйте, як не відображається ім'я PID або програми netstat. fuserтакож дає дещо заплутаний вихід і не може також точно визначити PID.

Чи може хтось пролити на це будь-яке світло?

  • Як я можу замінити lsof -i(щоб побачити також назву процесу !)
  • Чому також вихід netstatкалік?

Примітка: контейнер працює з "ExecDriver": "native-0.1", тобто власним шаром виконання Docker, а не 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:

(Я не одержимий Permission denied, тому що ці цифри. Що мене бентежить, це порожній список PID після 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)

Є ще якийсь вихід для підключеного користувача, який також правильно визначений, але це все. Мабуть, неможливо визначити, для якого типу ( lsof -iобмеження в Інтернет-розетках) є певний "об'єкт".


Що означає lsofзвіт? Той самий?
slm

@slm: геніальний запит! Це не залишає його порожнім. Натомість він показує цілу безліч (також sshdпов'язаних) ліній, деякі з яких можуть бути TCP-сокетами, як TYPE unknown. Своєрідний. Додавання висновку до мого питання.
0xC0000022L

Якщо ви запустите, strace -s 2000 -o lsof.log lsof -iце, ймовірно, дасть вам додаткову інформацію про те, що заблокується.
slm

1
@slm: хороший момент. Дякую, що нагадали. Я все-таки буду робити це завтра. Також цілком можливо, що straceвона обмежена в контейнері. Захоплюючі нові речі для навчання. Дякуємо за підстрибну ідею. Повинно вдарити по ліжку.
0xC0000022L

FYI: Це також порушує netstat -lp. Це, безумовно, спричинене припливом.
Алан Робертсон

Відповіді:


7

(ПРИМІТКА. У питанні про те, як запитувач заходить до контейнера докера, незрозуміло. Я припускаю, що docker exec -it CONTAINER bash його використовували.)

У мене була ця проблема під час використання зображення докера, заснованого на centos:7версії docker, 1.9.0і щоб подолати це, я просто запустив:

docker exec --privileged -it CONTAINER bash

Зверніть увагу на включення --privileged.

Моє наївне розуміння причини цього потрібно: схоже, докер робить зусилля, щоб контейнер був більш "безпечним", як це зафіксовано тут .


4

Га, сюжет товщає. Якщо хтось має кращу відповідь, будь ласка, напишіть її, і я прийму її, якщо це прийнятно. Але тут очевидна причина. Як недбало до мене ігнорувати файли журналів на хості :

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, хоча мені доведеться розібратися, як переконати це, щоб дозволити це без шкоди для безпеки хоста / контейнера чи побачити, чи це взагалі можливо без шкоди для безпеки.



3

Інша можливість, на цей раз із більш чітким налаштуванням безпеки: надайте привілей SYS_PTRACE контейнеру докера:

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

1
Якщо хтось цікавиться, навіщо це lsofпотрібно CAP_SYS_PTRACE: це потрібно прочитати /proc/*/stat. Дивіться ptrace (2)
David Röthlisberger

2

Я знайшов і цю проблему. Проблема пішла після того, як я відключив apparmorна docker:

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

довідковий URL: https://help.ubuntu.com/community/AppArmor


3
Ви можете розглянути можливість додавання додаткового пояснення до цієї відповіді (наприклад, що aa-complainробить, або деякої документації, яка підтримує це рішення).
HalosGhost

@HalosGhost Вибачте, я не дуже знайомий apparmor, я просто погуглив його і знайшов спосіб його відключити. Іншими словами, я не знаю, чому це працює чи чому він не працював. Мій хост ОС - Ubuntu 14.04, тому я шукав "ubuntu apparmor" і знайшов help.ubuntu.com/community/AppArmor . Я сподіваюся, що це буде корисно для вас.
menghan

2
У мене цього питання немає; я стурбований якістю вашої відповіді та наскільки корисним (і інформативним) це буде для ОП.
HalosGhost

@HalosGhost Дякую за вашу допомогу, я перечитав свою відповідь.
menghan

У ubuntu 14.04 команда була sudo aa-complain /etc/apparmor.d/docker. В основному він вимикає бронежилет програми для докерного процесу, що означає, що докер може читати будь-який файл у системі. Раніше він міг працювати лише з файлами, дозволеними у профілі. Кращим рішенням може бути зміна правил броні додатка, які б дозволяли отримати доступ до файлів / proc / pid / fd.
Мартінс Балодіс,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.