Как создать фейковых пользователей в Linux через User Namespaces

Представьте ситуацию: вам нужно протестировать скрипт от имени пользователя, которого нет в системе. Создавать аккаунты через useradd неудобно, да и права root не всегда доступны. Именно здесь на помощь приходят Linux Namespaces – механизм изоляции процессов, позволяющий “притвориться” другим пользователем без реальных изменений в системе.

Почему chown и fakeroot не всегда работают

Допустим, вы попробовали классический подход с unshare --user, чтобы создать изолированное пространство. Но при попытке изменить владельца файла через chown 1 a получили ошибку Invalid argument. Дело в том, что по умолчанию вашему текущему пользователю не разрешено мапить произвольные UID (это касается безопасности системы).

Кстати, ошибка возникает потому, что внутри namespace UID 1 не сопоставлен с реальным пользователем системы. Без явного указания диапазона через /etc/subuid ядро блокирует операцию.

Тут может показаться, что fakeroot – спасение. Он действительно эмулирует root-права через LD_PRELOAD, но есть нюанс: вы по-прежнему не можете запустить процесс от имени произвольного UID. Попытка su 3 упрётся в отсутствие записи в /etc/passwd, а создавать её без прав администратора – проблематично.

Как настроить User Namespace правильно

Всё решается через маппинг UID с помощью unshare --map-users. Для этого:

1. Проверьте свой выделенный диапазон в /etc/subuid. Например, строка user:2000000:65536 означает, что ваш аккаунт может использовать UID от 2000000 до 2065535.

2. Запустите namespace с маппингом:

unshare -r --map-users=1:2000000:1000 bash

Здесь 1 – начальный внутренний UID, 2000000 – внешний UID из subuid, 1000 – количество доступных ID.

3. Теперь внутри namespace можно свободно менять владельцев:

touch test_file
chown 1:1 test_file # больше не вызывает ошибки

Но как запустить процесс от имени другого UID? Тут пригодится setpriv – утилита для управления привилегиями:

setpriv --reuid=1 --regid=1 --init-groups /bin/bash -c "id"

Команда id в этом случае покажет uid=1 gid=1, хотя в реальной системе пользователя с таким ID нет. Если вдруг возникнет ошибка failed to drop privileges, проверьте, что в команде unshare использовался флаг -r (он активирует полный маппинг root внутри namespace).

Обход ограничений /etc/passwd

Некоторые инструменты (например, sudo) требуют наличия пользователя в системных файлах. Для изоляции можно подменить /etc/passwd через mount namespace:

  • Создайте файл passwd.fake с нужными записями
  • Примонтируйте его поверх оригинального:
    unshare -m -r
    mount --bind ~/passwd.fake /etc/passwd

Важно: после этого все процессы в namespace будут видеть только вашу “фейковую” версию файла. Но не забывайте – изменения остаются внутри namespace и не затрагивают основную систему.

Если столкнётесь с ошибкой mount: permission denied, проверьте, что namespace создан с флагом -m (активирует отдельный mount namespace) и что вы внутри выполнили unshare -r (подлючение user namespace).

Совет: для сложных сценариев комбинируйте разные типы namespaces. Например, добавьте --pid для изоляции процессов или --net для виртуальной сети.

Теперь вы можете эмулировать многопользовательскую среду без риска сломать систему. Этот подход особенно полезен для тестирования скриптов, разработки в изолированном окружении или обучения работе с правами в Linux. Главное – помните про границы namespaces: всё, что создаётся внутри, остаётся внутри.

Добавить комментарий

Все поля обязательны к заполнению. Ваш адрес email не будет виден никому.

Новое
Интересное