User Namespace
Основна інформація
Простір користувача - це функція ядра Linux, яка забезпечує ізоляцію відображень ідентифікаторів користувача та групи, дозволяючи кожному простору користувача мати власний набір ідентифікаторів користувача та групи. Ця ізоляція дозволяє процесам, що працюють в різних просторах користувача, мати різні привілеї та власність, навіть якщо вони числово мають однакові ідентифікатори користувача та групи.
Простори користувача особливо корисні в контейнеризації, де кожен контейнер повинен мати свій власний незалежний набір ідентифікаторів користувача та групи, що дозволяє забезпечити кращу безпеку та ізоляцію між контейнерами та системою-хостом.
Як це працює:
При створенні нового простору користувача він починається з порожнього набору відображень ідентифікаторів користувача та групи. Це означає, що будь-який процес, що працює в новому просторі користувача, спочатку не матиме привілеїв поза простором.
Відображення ідентифікаторів можуть бути встановлені між ідентифікаторами користувача та групи в новому просторі та тими в батьківському (або системі-хості) просторі. Це дозволяє процесам в новому просторі мати привілеї та власність, що відповідають ідентифікаторам користувача та групи в батьківському просторі. Однак відображення ідентифікаторів можуть бути обмежені до конкретних діапазонів та підмножин ідентифікаторів, що дозволяє здійснювати деталізований контроль над привілеями, наданими процесам в новому просторі.
У межах простору користувача процеси можуть мати повні привілеї root (UID 0) для операцій всередині простору, при цьому вони все ще мають обмежені привілеї поза простором. Це дозволяє контейнерам працювати з можливостями, схожими на root всередині власного простору, не маючи повних привілеїв root на системі-хості.
Процеси можуть переміщатися між просторами за допомогою системного виклику
setns()
або створювати нові простори за допомогою системних викликівunshare()
абоclone()
з прапорцемCLONE_NEWUSER
. Коли процес переходить до нового простору або створює його, він починає використовувати відображення ідентифікаторів користувача та групи, що пов'язані з цим простором.
Лабораторія:
Створення різних просторів
CLI
Монтувавши новий екземпляр файлової системи /proc
, якщо ви використовуєте параметр --mount-proc
, ви забезпечуєте, що новий простір імен має точний та ізольований вид інформації про процес, специфічний для цього простору імен.
Docker
Для використання простору імен користувача потрібно запустити демон Docker з --userns-remap=default
(у Ubuntu 14.04 це можна зробити, змінивши /etc/default/docker
і потім виконавши sudo service docker restart
)
Перевірте, в якому просторі імен знаходиться ваш процес
Можливо перевірити карту користувача з контейнера Docker за допомогою:
Або з хост-системи за допомогою:
Знайдіть всі простори користувачів
Також, ви можете увійти в простір імен іншого процесу лише як root. І ви не можете увійти в інший простір імен без дескриптора, що вказує на нього (наприклад, /proc/self/ns/user
).
Створення нового простору імен користувача (з відображеннями)
Відновлення можливостей
У випадку просторів користувачів, коли створюється новий простір користувача, процес, який увійшов у простір, отримує повний набір можливостей у цьому просторі. Ці можливості дозволяють процесу виконувати привілейовані операції, такі як монтування файлових систем, створення пристроїв або зміна власності файлів, але тільки в контексті його простору користувача.
Наприклад, якщо у вас є можливість CAP_SYS_ADMIN
у просторі користувача, ви можете виконувати операції, які зазвичай вимагають цієї можливості, наприклад монтування файлових систем, але тільки в контексті вашого простору користувача. Будь-які операції, які ви виконуєте з цією можливістю, не впливатимуть на систему хоста або інші простори.
Отже, навіть якщо отримання нового процесу всередині нового простору користувача поверне вам всі можливості (CapEff: 000001ffffffffff), ви фактично можете використовувати лише ті, що стосуються простору (наприклад, монтування), але не всі. Таким чином, цього самого недостатньо для виходу з контейнера Docker.
```bash # There are the syscalls that are filtered after changing User namespace with: unshare -UmCpf bash
Probando: 0x067 . . . Error Probando: 0x070 . . . Error Probando: 0x074 . . . Error Probando: 0x09b . . . Error Probando: 0x0a3 . . . Error Probando: 0x0a4 . . . Error Probando: 0x0a7 . . . Error Probando: 0x0a8 . . . Error Probando: 0x0aa . . . Error Probando: 0x0ab . . . Error Probando: 0x0af . . . Error Probando: 0x0b0 . . . Error Probando: 0x0f6 . . . Error Probando: 0x12c . . . Error Probando: 0x130 . . . Error Probando: 0x139 . . . Error Probando: 0x140 . . . Error Probando: 0x141 . . . Error Probando: 0x143 . . . Error
Last updated