точки монтирования файловой системы для каждого процесса

24

Я проверял unshareкоманду и, согласно ее man-странице,

   unshare - run program with some namespaces unshared from parent

Я также вижу, что есть тип пространства имен, перечисленных как,

 mount namespace
              mounting and unmounting filesystems will not affect rest of the system.

Какова цель этого пространства имен монтирования ? Я пытаюсь понять эту концепцию с помощью некоторого примера.

Рамеш
источник
@ Жиль, спасибо. Я это проверю. В то же время, пожалуйста, дайте мне знать, если что-то еще нужно добавить в ответ.
Рамеш

Ответы:

29

Запуск unshare -mдает вызывающему процессу личную копию его пространства имен монтирования, а также отменяет общий доступ к атрибутам файловой системы, так что он больше не разделяет свой корневой каталог, текущий каталог или атрибуты umask с любым другим процессом.

Так, что говорит вышеупомянутый параграф? Давайте попробуем понять, используя простой пример.

Терминал 1:

Я делаю следующие команды в первом терминале.

#Creating a new process
unshare -m /bin/bash
#creating a new mount point
secret_dir=`mktemp -d --tmpdir=/tmp`
#creating a new mount point for the above created directory. 
mount -n -o size=1m -t tmpfs tmpfs $secret_dir
#checking the available mount points. 
grep /tmp /proc/mounts 

Последняя команда дает мне вывод как,

tmpfs /tmp/tmp.7KtrAsd9lx tmpfs rw,relatime,size=1024k 0 0

Теперь я выполнил следующие команды.

cd /tmp/tmp.7KtrAsd9lx
touch hello
touch helloagain
ls - lFa

Вывод lsкоманды:

ls -lFa
total 4
drwxrwxrwt   2 root root   80 Sep  3 22:23 ./
drwxrwxrwt. 16 root root 4096 Sep  3 22:22 ../
-rw-r--r--   1 root root    0 Sep  3 22:23 hello
-rw-r--r--   1 root root    0 Sep  3 22:23 helloagain

Так в чем же дело всего этого? Зачем мне это делать?

Теперь я открываю другой терминал ( терминал 2 ) и выполняю следующие команды.

cd /tmp/tmp.7KtrAsd9lx
ls - lFa

Вывод как показано ниже.

ls -lFa
total 8
drwx------   2 root root 4096 Sep  3 22:22 ./
drwxrwxrwt. 16 root root 4096 Sep  3 22:22 ../

Файлы helloи helloagainне видны, и я даже вошел в систему как пользователь root, чтобы проверить эти файлы. Таким образом, преимущество заключается в том, что эта функция позволяет нам создавать частные временные файловые системы, которые даже другие процессы, принадлежащие корню, не могут просматривать или просматривать.

Из справочной страницы unshare,

mount namespace Монтирование и размонтирование файловых систем не повлияет на остальную систему (флаг CLONE_NEWNS), за исключением файловых систем, которые явно помечены как общие (с помощью mount --make-shared; см. / proc / self / mountinfo для общих флагов).

Рекомендуется использовать mount --make-rprivate или mount --make-rslave после unshare --mount, чтобы убедиться, что точки монтирования в новом пространстве имен действительно не разделены из родительского пространства имен.

Память, используемая для пространства имен, - это VFS от ядра. И - если мы настроим его в первую очередь - мы можем создать целые виртуальные среды, в которых мы являемся пользователем root без прав root.

Ссылки:

Пример оформлен с использованием деталей из этого поста в блоге . Кроме того, цитаты из этого ответа взяты из этого замечательного объяснения Майка . Еще одно замечательное прочтение об этом можно найти в ответе здесь .

Рамеш
источник
1
this feature makes it possible for us to create a private temporary filesystem that even other root-owned processes cannot see or browse through.И по сравнению с chroot, chrootфайлы видны другим. Это удивительно, и это предложение, вероятно, должно быть как в верхней части ответа. + 1ed.
Сергей Колодяжный
1
Ничто не ускользает от корня! С помощью nsenterвы можете войти в пространство имен и просмотреть временные файлы. Если предположить, что у вас только один общий ресурс (тот, у кого есть tempdir), то sudo nsenter -t $(pgrep -P $(ps aux | grep unshare | grep -v grep | awk '{print $2}')) -m -pсодержимое будет
доступно
2

Если в вашей системе установлен bubblewrap , вы можете легко сделать это за один шаг:

bwrap --dev-bind / / --tmpfs /tmp bash

В приведенном выше примере внутренний bash будет иметь свой собственный вид на / tmp.

Решение вдохновлено ответом @ Ramesh-s - спасибо за это!

VasyaNovikov
источник