Надійний спосіб ув’язнити дочірніх процесів за допомогою `nsenter:`


15

Я знаю, що простори імен Linux, крім усього іншого, можна використовувати для безпечного управління обмежувальними процесами та ув'язненням дочірніх процесів, не маючи жодного шансу їх зомбізувати та скидати init. Але я нечіткий щодо деталей реалізації. Як я можу використовувати такі інструменти util-linux, як mountі nsenterспостерігати, контролювати та гарантувати, що всі запущені процеси є прямими нащадками простору імен іншого процесу?

Відповіді:


19

Створіть простір імен PID

Тут використовується правильна команда unshare. Зауважте, що необхідні варіанти для цього доступні лише з util-linux 2.23. Ідея полягає у створенні нового простору імен PID для програми, яку ви запускаєте, щоб усі її діти також були створені в цьому просторі імен. Ви можете запустити команду в новому просторі імен PID, просто виконавши:

sudo unshare -fp some_command

Щоб запустити оболонку, просто опустіть команду. Це створить процес, який разом із будь-яким із його дітей матиме PID, як зазвичай, у батьківському (системному) просторі імен. Однак у новому просторі імен він матиме PID 1разом із деякими особливими характеристиками initпроцесу. Мабуть, найрелевантніша характеристика з точки зору моніторингу полягає в тому, що якщо хтось із його нащадків осиротів, вони будуть перероджені для цього процесу, а не до реального initпроцесу.

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

Поєднайте з простором імен для кріплення

Однак ми не можемо контролювати процес щодо PID, який, на його думку , є таким. Для цього і, зокрема, щоб мати можливість використовувати psкоманду в новому просторі імен, потрібно встановити окрему procfsфайлову систему для простору імен. Це , в свою чергу , призводить до іншої проблеми , так як єдине місце , яке psприймає для procfsIS /proc. Одним з рішень було б створити chrootв'язницю та встановити procfsтам нову . Але це громіздкий підхід, оскільки як мінімум нам потрібно буде скопіювати (або принаймні жорстке посилання) будь-яких двійкових файлів, які ми маємо намір використовувати разом із будь-якими бібліотеками, від яких вони залежать, до нового кореня.

Рішення полягає також у використанні нового простору імен для кріплення . У межах цього ми можемо змонтувати нове procfsтаким чином, що використовує справжній кореневий /procкаталог, може бути корисним у просторі імен PID та не заважати нічому іншому. Щоб зробити цей процес дуже простим, unshareкоманда дає --mount-procможливість:

sudo unshare -fp --mount-proc some_command

Тепер, що працює psв комбінованих просторах імен, будуть показані лише процеси з NID-простором PID, і він буде показувати процес верхнього рівня, як PID 1.

Про що nsenter?

Як випливає з назви, nsenterйого можна використовувати для введення простору імен, для якого вже створено unshare. Це корисно, якщо ми хочемо отримати інформацію, доступну лише з простору імен, з інакше не пов'язаного сценарію. Найпростіший спосіб - це отримати дані PID будь-якої програми, що працює в просторі імен. Щоб було зрозуміло, це повинен бути PID цільової програми в просторі імен, з якого nsenterзапускається (оскільки простори імен можуть бути вкладені, для одного процесу можливо мати багато PID). Для запуску оболонки в цільовому просторі імен PID / mount просто виконайте такі дії:

sudo nsenter -t $PID -m -p

Якщо цей простір імен налаштовано як вище, psтепер буде перераховано лише процеси в цьому просторі імен.


Спасибі, Греме. Це вже відповіло на запитання та інше. Насправді мене запитували читання приміток зі сторінки profs man про різні файли в / proc / pid / ns / *, де сказано: "Прив’яжіть монтаж цього файлу (див. Mount (2)) десь ще у файловій системі. ... простір імен процесу, визначений pid живим, навіть якщо всі процеси, що перебувають в даний час у просторі імен, закінчуються. " Навряд чи те саме питання, я знаю, але це вже так добре, я думав, що якщо ви вважаєте, що це актуально, ви можете додати його. Linux.die.net/man/5/proc
mikeserv

Це висвітлено в останньому розділі статті LWN (просто пошук кріплення прив’язки). Я не дуже впевнений в цьому, хоча, оскільки він підтримує простір імен PID, але після того, як initпроцес стилю верхнього рівня вмирає, ви більше не можете створювати його.
Graeme

Так, я не надто впевнений у решті. Але з цією відповіддю і manна вихідні для себе я маю на увазі ознайомитися трохи з цим. Знову дякую. Можливо, це має більше значення в --user просторі імен.
mikeserv
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.