LINUX.ORG.RU

Монтирование не из под рута (mount() syscall)


0

0

Задался вопросом как примонтировать раздел не из под рута. У программы mount есть опция user, которая позволяет монтировать ФС обычным пользователям. Работает эта опция просто, т.к. у файла /bin/mount установлен setuid бит, то /bin/mount просто изменяет euid на 0 и вызывает системный вызов mount(). Возник вопрос "зачем нужен setuid бит /bin/mount? нельзя ли примонтировать ФС без опции user?" стал пробовать: изменил права - rw-rw-rw user,user /dev/hda1 написал программку mymount которая вызывает mount("/dev/hda1", "/home/user/hda1",0,0) вызываю её под user - не работает, вызываю под root - работает. Почему? ведь пользователь user имеет права на чтение файла /dev/hda1 и монтировать он его хочет в свой каталог. man 2 mount дал ответ на вопрос, оказывается "Appropriate privilege (Linux: the CAP_SYS_ADMIN capability) is required to mount and unmount file systems." Хорошо на тебе эту капабилити, выполнил "root# setcap cap_sys_admin+ep /home/user/mymount" и все заработало, пользователь user получил возможность монтировать /dev/hda1. потом сменил права для /dev/hda1 на такие: rw-rw---- root,root /dev/hda1. запускаю свой mymount и раздел без проблем монтируется! как так ведь пользователь user не имеет права на чтение /dev/hda1! т.е. получается читать /dev/hda1 не могу, а вот монтировать (при наличии capability CAP_SYS_ADMIN) могу. Уважаемые разъясните пожалуйста так оно и должно быть? или я где-то что-то упустил из виду?


Re: Монтирование не из под рута (mount() syscall)

capability на файлы добавили недавно, возможно как вы описываете, так и должно быть. А может ещё не доработали. Особого противоречия не вижу, допустим, пользователь может сделать "chmod 000 файл" и даже если файл пренадлежит ему не сможет его прочитать, пока снова не изменить права доступа.

>Почему? ведь пользователь user имеет права на чтение файла /dev/hda1 и монтировать он его хочет в свой каталог.

Когда в файле fstab указывают опцию user, то подразумеваются опции noexec, nosuid, nodev. Вполне логично. А вам дали вызвать mount() без ограничений, как то это небезопасно.

mky ★★★★★ ()

Re: Монтирование не из под рута (mount() syscall)

а до добавления capability на файлы не было никакой возможности примонтировать раздел обычным пользователем, кроме как временно получить права root (setuid на mount)? Странно звучит. если у пользователя есть доступ к /dev/hda1 т.е. он может прочитать содержимое этого файла(раздела), то почему этот же пользователь не может представить содержимое файла /dev/hda1 в удобном для него виде - в виде каталога с файлами т.е. монтировать? получается я могу написать программу в userspace которая будет читать содержимое /dev/hda1 (выводить список файлов на экран, например), а вот сделать содержимое /dev/hda1 частью своего домашнего каталога нельзя?

psea ()

Re: Монтирование не из под рута (mount() syscall)

Отвечая на последний вопрос. Просто команду mount стоит рассматривать как более привилегированную операцию(системный вызов) на уровне ядра, нежели дающую просто что-то на чтение в удобном виде.

Valmont ★★★ ()

Re: Монтирование не из под рута (mount() syscall)

для этого есть простое основание:

чтение /dev/hda1 обычным пользователем - безопасно.
давать ему право монтировать этот раздел - нет. Поскольку там могут оказаться бинарники с setuid, позволяющие пользователю повысить привилегии. Элементарный rm. 

gorilych ★★ ()

Re: Монтирование не из под рута (mount() syscall)

pmount

ptah_alexs ★★★★★ ()
Ответ на: Re: Монтирование не из под рута (mount() syscall) от gorilych

Re: Монтирование не из под рута (mount() syscall)

вот, если у меня есть права на чтение этого файла, значит я могу создать копию ФС /dev/hda1 у себя в домашнем каталоге. а если есть и запись в /dev/hda1 то я могу сохранить изменения сделанные в своей копии обратно в /dev/hda1. ну а если там бинарники с setuid, то можно же сдалать так что-бы при монтировании через вызов mount() от обычно пользователя права на все файлы были например такие rw-rw---- user,user и setuid бит или другие какие свойства файлов потенциально небезопасные игнорировать.

psea ()
Ответ на: Re: Монтирование не из под рута (mount() syscall) от ptah_alexs

Re: Монтирование не из под рута (mount() syscall)

>pmount не подходит, pmount использует стандартный mount, он только позволяет монтировать устройства без записи в fstab, т.е. параметры монтирования создает сам. получается так pmount->mount->mount() syscall-которому нужны права root чтобы примонтировать флешку например.

psea ()

Re: Монтирование не из под рута (mount() syscall)

> вот, если у меня есть права на чтение этого файла, значит я могу создать копию ФС /dev/hda1

грубейшее заблуждение. У обычного пользователя нет прав создавать файлы с произвольным владельцем. Обычный пользователь не сможет создать файл, который принадлежит root

> можно же сдалать так что-бы при монтировании через вызов mount() от обычно пользователя права на все файлы были например такие rw-rw---- user,user

это при монтировании fat. а при монтировании ext3 - нет.

gorilych ★★ ()
Ответ на: Re: Монтирование не из под рута (mount() syscall) от gorilych

Re: Монтирование не из под рута (mount() syscall)

to gorilych: ну это понятно что у обычно пользователя нет прав на создание файла с произвольным владельцем. вопрос в следующем почему я не могу примонтировать ФС с устройства rw-rw-rw- user,user /dev/hda1 в свой каталог с правами на файлы rw-rw---- user,user?

psea ()
Ответ на: Re: Монтирование не из под рута (mount() syscall) от gorilych

Re: Монтирование не из под рута (mount() syscall)

>ну.. не реализована такая возможность.. вот и всё

ну нет, так, нет. просто новичка как я это (сделать то на что я имею право чтения частью домашнего каталога) ввело в недоумение, поэтому и обратился сюда, думал может я что делаю не так... Хотя чего там только в линукс не сделано, и то есть и сё... а вот Эту простую вещь почему-то не сделали, наверно по какой-то совершенно определенной причине...

psea ()

Re: Монтирование не из под рута (mount() syscall)

Реализация подобной возможности достаточно сложна с точки зрения безопасности. Во первых, suid-бит, а сейчас ещё и capability-свойства файла (даже не знаю, есть ли флаг при монтировании, чтобы отключить эти свойства). Во вторых, файлы-устройства --- на файловой системе пользователя могут быть файлы (допустим /dev/hda2) с другими правами доступа, чем /dev/hda2 в исходной системе. А ещё монтирование может перекрыть пути поиска динамических библиотек, то есть монтировать в /lib нельзя. При этом ядро не знает где загрузчик исполняемых файлов ищет библиотеки, не знает какой каталог пользователя "домашиний".

Ну и как вам уже сказали, это в случае fat можно задать пользователя, который получит доступ к файлам, а в случае ext3 права определяются uid'ом (числом), которое на разных машинах может быть разным. То есть если на /dev/hda1 лежит ext3, созданная на другом компьютере, то подмонтировав её себе в каталог, пользователь скорее всего не получит доступ к файлам этой ФС. И чтобы дать этот доступ нужно будет ещё править код ядра.

mky ★★★★★ ()

Re: Монтирование не из под рута (mount() syscall)

сугубо imho.
сейчас вроде ваше setcap приравнивается к нарушению, ибо идёт тенденция рулить правами на уровне dbus+hal+PolicyKit и ещё одно грубейшее нарушение - это "rw-rw---- root,root /dev/hda1". более корректно следующее:

brw-rw---- 1 root disk 8, 0 2009-03-22 19:41 /dev/sda

со всеми вытекающими отсюда....

sda00 ★★★ ()

Re: Монтирование не из под рута (mount() syscall)

эт собсно к тому, что по-умолчанию ни чтения, ни тем паче монтирования обычному лузеру обламываться ни в коем разе не должно (если кто не понял)

sda00 ★★★ ()

Re: Монтирование не из под рута (mount() syscall)

to sda00: ну что кому должно или не должно обламывать это решает админ. и если он сказал что /dev/hda1 будет доступно пользователю (rw-rw---- user,user) то логично ожидать что пользователь может сделать /dev/hda1 частью своего домашнего каталога. и он таки может это сделать!
несколькими постами выше я писал о программе в userspace которая будет отображать rw-rw---- user,user /dev/hda1 в папку пользователя. и такая программа есть! она в userspace монтирует /dev/hda1 мне в домашнюю папку.
to const86: спасибо что ткнул носом.
называется эта программа FUSE и модуль к нему fusefat,fuseext2, etc. Эта связка делает ровно то что я и спрашивал, позволяет не привелигированному пользователю монтировать ФС если он имеен право читать /dev/hda1.
но вопрос остается всё же открытым. почему для этой возможности (монтировать то на что имеешь право чтения) необходимо использовать путь через FUSE (реализовывать отдельный драйвер ФС в userspace), почему нельзя использовать драйвер ядра и делать все через стандартный вызов mount()?

psea ()

Re: Монтирование не из под рута (mount() syscall)

>>ну что кому должно или не должно обламывать это решает админ. и если он сказал что /dev/hda1 будет доступно пользователю (rw-rw---- user,user) то логично ожидать что пользователь может сделать /dev/hda1 частью своего домашнего каталога. и он таки может это сделать!

imho: прекрасная демонстрация отсутствия базовых представлений о *nix в частности. рассмотрим простейший вариант:
* лузеров, кому можно/нужно монтирование, включаем в спец. группу - например в disk. если это надо будет всем лузерам на конкретной машине - правим "скелет".
* после чего пользуем опцию group + user/users
монтирование в userspace - fuse, а раздавать

/dev/hda1 rw-rw---- user,user

моветон.

sda00 ★★★ ()

Re: Монтирование не из под рута (mount() syscall)

to sda00: не совсем понятно (точнее, совсем не понятно), где Вы усмотрели отсутствие базовых представлений о *nix. ну да ладно, я и не претендую на всезнайство. Конечно можно сделать так как Вы говорите (что и сделано во многих дистрибутивах) и это будет правильно. Но вопрос был не об этом. Если я не четко выражаюсь и смысл моих предыдущих сообщений не ясен, то извиняюсь. Постараюсь выразить суть вопроса точнее:
Почему программа с euid=x и x!=0 (root) не может монтировать ФС находящуюся в файле /dev/hda1, причем /dev/hda1 имеет права доступа rw-rw---- x,x. А для того чтобы программа имела возможность монтировать ФС она должна получить права root. что в случае с утилитой mount достигается через setuid бит. Всё это выглядит тем более странным, потому что всё таки есть возможность монтировать эту ФС из под обычного пользователя (c euid=x), и эта возможность называется FUSE. Или такой вариант: Почему для того, чтобы монтировать iso диск (причем, имеея право чтения соответствующего файла устройства) в свой домашний каталог программа должна получить права root?

psea ()

Re: Монтирование не из под рута (mount() syscall)

наверное лучше задать встречные вопросы:
- а почему у простого пользователя не должно быть прав рихтовать правила таблицу роутинга например?
- почему у лузера не должно быть прав на забавы типа "gdb -p 1"?
я не могу сформулировать, почему у лузера должны быть права что-то монтировать. что Вам не понятно в man fstab, man getmntent и в сути механизма fstab/mtab? как ещё написать, что mount не должен иметь никакого отношения к userspace?

sda00 ★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.