Решено: setuid-бит не работает со скриптами (скрипт для монтирования образов создан)

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

math
Сообщения: 286
Статус: Ъ участник
ОС: Artix (= Arch without systemd)

Решено: setuid-бит не работает со скриптами

Сообщение math »

есть скрипт, принадлежит root:root, для него установлен setuid-бит:

Код: Выделить всё

#!/bin/bash
mount "$1" /media/image -o loop,users,ro

Почему mount отказывается монтировать и как заставить?

ЗЫ: Не знаю, может в "Вопросы новичка" стоило запостить...
Спасибо сказали:
Аватара пользователя
agentprog
Сообщения: 362
Статус: Ad Astra per aspera
ОС: openSUSE 11.4, Arch

Re: Решено: setuid-бит не работает со скриптами

Сообщение agentprog »

(man) писал(а):`sticky-бит' не описывается в POSIX. Такое специфическое название он получил из-за первоначальной функции, которую он выполнял: сохранял исполняемый
код программы на устройстве подкачки. В настоящее время установка sticky-бита для каталога, приводит к тому, что только владелец файла и владелец этого
каталога могут удалять этот файл из каталога. (Обычно это используется в каталогах типа /tmp, куда все имеют права на запись).

предположительно Вам нужен setuid-бит. что-то вроде

Код: Выделить всё

chmod u+s script.sh


PS: тоже смотря что монтировать. если iso, то надо бы параметром mount указать -t iso9660
No problems - just solutions!
Спасибо сказали:
Аватара пользователя
ZyX
Сообщения: 355
ОС: Gentoo

Re: Решено: setuid-бит не работает со скриптами

Сообщение ZyX »

agentprog писал(а):
23.06.2010 06:52
PS: тоже смотря что монтировать. если iso, то надо бы параметром mount указать -t iso9660

Смотря где. У меня mount спокойно жрёт mount -o loop /path/to/file.iso /mnt/cdrom. О том, какая там ФС догадывается как-то сам.
Спасибо сказали:
math
Сообщения: 286
Статус: Ъ участник
ОС: Artix (= Arch without systemd)

Re: Решено: setuid-бит не работает со скриптами

Сообщение math »

agentprog писал(а):
23.06.2010 06:52
(man) писал(а):`sticky-бит' не описывается в POSIX. Такое специфическое название он получил из-за первоначальной функции, которую он выполнял: сохранял исполняемый
код программы на устройстве подкачки. В настоящее время установка sticky-бита для каталога, приводит к тому, что только владелец файла и владелец этого
каталога могут удалять этот файл из каталога. (Обычно это используется в каталогах типа /tmp, куда все имеют права на запись).

предположительно Вам нужен setuid-бит. что-то вроде

Код: Выделить всё

chmod u+s script.sh


PS: тоже смотря что монтировать. если iso, то надо бы параметром mount указать -t iso9660

я просто неправильно написал, конечно setuid-бит. Сейчас поправлю
Спасибо сказали:
Аватара пользователя
Hephaestus
Сообщения: 3728
Статус: Многоуважаемый джинн...
ОС: Slackware64-14.1/14.2

Re: Решено: setuid-бит не работает со скриптами

Сообщение Hephaestus »

math писал(а):
23.06.2010 02:30
Почему mount отказывается монтировать и как заставить?

А этот скрипт при выполнении ругается как-нибудь? Чего говорит?
Пускай скрипят мои конечности.
Я - повелитель бесконечности...
Мой блог
Спасибо сказали:
math
Сообщения: 286
Статус: Ъ участник
ОС: Artix (= Arch without systemd)

Re: Решено: setuid-бит не работает со скриптами

Сообщение math »

fflatx писал(а):
23.06.2010 09:17
math писал(а):
23.06.2010 02:30
Почему mount отказывается монтировать и как заставить?

А этот скрипт при выполнении ругается как-нибудь? Чего говорит?

mount: только root может сделать это


ЗЫ. Нашёл вот
Сохраняемый идентификатор пользователя(SUID) применителен только к исполняемым модулям программ, которые обычно зовут бинарными файлами и имеющие соответствующие права запуска.


Собстевнно, проблему я решил. Надо сделать два скрипта:
loop_mount_core:

Код: Выделить всё

#!/bin/bash
mount "$1" /media/image -o loop,ro

loop_mount:

Код: Выделить всё

#!/bin/bash
sudo loop_mount_core "$@"


в sudoers надо разрешить запуск loop_mount_core без пароля
прада неясно, как в loop_mount_core узнать какой юзер это запустил (это нужно для проверки - можно монтировать, или отказать)
Спасибо сказали:
Аватара пользователя
Hephaestus
Сообщения: 3728
Статус: Многоуважаемый джинн...
ОС: Slackware64-14.1/14.2

Re: Решено: setuid-бит не работает со скриптами

Сообщение Hephaestus »

math писал(а):
23.06.2010 09:21
в sudoers надо разрешить запуск loop_mount_core без пароля
прада неясно, как в loop_mount_core узнать какой юзер это запустил (это нужно для проверки - можно монтировать, или отказать)

А это все ради чего вообще? Зачем такие сложности: два скрипта, sudoers, запуск без пароля...
Если уж влом монтировать от рута (хотя я привык), то может проще использовать fuse?
Пускай скрипят мои конечности.
Я - повелитель бесконечности...
Мой блог
Спасибо сказали:
math
Сообщения: 286
Статус: Ъ участник
ОС: Artix (= Arch without systemd)

Re: Решено: setuid-бит не работает со скриптами

Сообщение math »

fflatx писал(а):
23.06.2010 09:28
math писал(а):
23.06.2010 09:21
в sudoers надо разрешить запуск loop_mount_core без пароля
прада неясно, как в loop_mount_core узнать какой юзер это запустил (это нужно для проверки - можно монтировать, или отказать)

А это все ради чего вообще? Зачем такие сложности: два скрипта, sudoers, запуск без пароля...
Если уж влом монтировать от рута (хотя я привык), то может проще использовать fuse?

задача: разрешить юзерам монтировать свои образы.
осталась одна проблема: в скрипте, запущенном из-под sudo узнать имя юзера, который этот скрипт запустил
Спасибо сказали:
varuh
Сообщения: 111
ОС: arch

Re: Решено: setuid-бит не работает со скриптами

Сообщение varuh »

Math, как вариант могу Вам предложить Furius ISO Mount - GTK морда для стандартной mount. Она вообще пароль не запрашивает, и кроме ISO умеет монтировать IMG, BIN, MDF и NRG.
Спасибо сказали:
allez
Сообщения: 2223
Статус: Не очень злой админ :-)
ОС: SuSE, CentOS, FreeBSD, Windows

Re: Решено: setuid-бит не работает со скриптами

Сообщение allez »

math писал(а):
23.06.2010 09:40
осталась одна проблема: в скрипте, запущенном из-под sudo узнать имя юзера, который этот скрипт запустил
Гляньте на переменную окружения SUDO_USER.
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5403
ОС: Gentoo

Re: Решено: setuid-бит не работает со скриптами

Сообщение /dev/random »

Если что, бит SUID преднамеренно не работает на скриптах. Только на бинарниках.
Спасибо сказали:
Аватара пользователя
anonymous.ru
Сообщения: 614

Re: Решено: setuid-бит не работает со скриптами

Сообщение anonymous.ru »

math, Вы представляете какую дыру в безопасности, Вы сделали?
Если бы система разрешила suid на Ваш shell скрипт - любой пользователь смог бы вызвать любую команду от рута.
То же самое во втором решении - там конечно вообще suid не нужен, но опять же - кто угодно сможет вызвать произвольную команду от рута

math писал(а):
23.06.2010 09:40
осталась одна проблема: в скрипте, запущенном из-под sudo узнать имя юзера, который этот скрипт запустил

программа sudo сама по себе прекрасно проверяет имя пользователя и разрешает или запрещает выполнение команды в зависимости от правил в sudoers
:drinks:
Спасибо сказали:
Аватара пользователя
Hephaestus
Сообщения: 3728
Статус: Многоуважаемый джинн...
ОС: Slackware64-14.1/14.2

Re: Решено: setuid-бит не работает со скриптами

Сообщение Hephaestus »

math писал(а):
23.06.2010 09:40
задача: разрешить юзерам монтировать свои образы.
Если я ничего не путаю, то fuse именно для этого и существует. Ибо это Filesystem in Userspace
Думаю, корифеи не дадут соврать и поправят меня, если я ошибаюсь. :)

UPD: Точнее речь идет об утилите fuseiso.
Пускай скрипят мои конечности.
Я - повелитель бесконечности...
Мой блог
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: Решено: setuid-бит не работает со скриптами

Сообщение watashiwa_daredeska »

anonymous.ru писал(а):
23.06.2010 11:55
там конечно вообще suid не нужен, но опять же - кто угодно сможет вызвать произвольную команду от рута
Почему произвольную? Только loop_mount_core.
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: Решено: setuid-бит не работает со скриптами

Сообщение t.t »

anonymous.ru писал(а):
23.06.2010 11:55
math писал(а):
23.06.2010 09:40
осталась одна проблема: в скрипте, запущенном из-под sudo узнать имя юзера, который этот скрипт запустил
программа sudo сама по себе прекрасно проверяет имя пользователя и разрешает или запрещает выполнение команды в зависимости от правил в sudoers
Автору темы нужно узнать имя пользователя не для проверки прав на выполнение команды, а для того, чтобы каждому позволить монтировать только его собственные образы.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
anonymous.ru
Сообщения: 614

Re: Решено: setuid-бит не работает со скриптами

Сообщение anonymous.ru »

watashiwa_darede... писал(а):
23.06.2010 12:25
Почему произвольную? Только loop_mount_core.

ну для начала: есть такая замечательная переменная PATH ;)
:drinks:
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: Решено: setuid-бит не работает со скриптами

Сообщение t.t »

anonymous.ru писал(а):
23.06.2010 13:13
watashiwa_darede... писал(а):
23.06.2010 12:25
Почему произвольную? Только loop_mount_core.
ну для начала: есть такая замечательная переменная PATH ;)
И?
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5403
ОС: Gentoo

Re: Решено: setuid-бит не работает со скриптами

Сообщение /dev/random »

Вообще, тут возможно только 3 решения, два из которых уже назвали.
1) использовать fuseiso вместо mount

Shell

* sys-fs/fuseiso Available versions: 20070708 Homepage: http://fuseiso.sourceforge.net/ Description: Fuse module to mount ISO9660
fuseiso позволяет любому пользователю монтировать принадлежащие ему образы в принадлежащиеему каталоги.

2) Использовать в скрипте переменную SUDO_USER для проверки того, от какого пользователя он выполнялся, и запускать его через sudo.

3) Написать несложную программу на C. Для них можно устанавливать бит SUID.
Спасибо сказали:
Аватара пользователя
anonymous.ru
Сообщения: 614

Re: Решено: setuid-бит не работает со скриптами

Сообщение anonymous.ru »

t.t писал(а):
23.06.2010 13:16
anonymous.ru писал(а):
23.06.2010 13:13
watashiwa_darede... писал(а):
23.06.2010 12:25
Почему произвольную? Только loop_mount_core.
ну для начала: есть такая замечательная переменная PATH ;)
И?

И какая из программ по имени mount будет выполнена?
:drinks:
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: Решено: setuid-бит не работает со скриптами

Сообщение t.t »

anonymous.ru писал(а):
23.06.2010 13:19
t.t писал(а):
23.06.2010 13:16
anonymous.ru писал(а):
23.06.2010 13:13
watashiwa_darede... писал(а):
23.06.2010 12:25
Почему произвольную? Только loop_mount_core.
ну для начала: есть такая замечательная переменная PATH ;)
И?
И какая из программ по имени mount будет выполнена?
Во-первых, sudo использует $PATH рута. Во-вторых, никто не мешает прописать полный путь; но это и не обязательно (см. «во-первых»).
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
anonymous.ru
Сообщения: 614

Re: Решено: setuid-бит не работает со скриптами

Сообщение anonymous.ru »

t.t писал(а):
23.06.2010 13:31
Во-первых, sudo использует $PATH рута. Во-вторых, никто не мешает прописать полный путь; но это и не обязательно (см. «во-первых»).

Про первое не знал. прям как у рута? то есть как делает логин шелл?
Про второе - конечно можно.

Ок. смотрим дальше на опции mount: можно смонтировать любую фс с поддержкой suid и dev
:drinks:
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: Решено: setuid-бит не работает со скриптами

Сообщение watashiwa_daredeska »

t.t писал(а):
23.06.2010 13:31
Во-вторых, никто не мешает прописать полный путь; но это и не обязательно
Хм... крайний раз когда я пробовал, было необходимо прописывать полный путь, иначе правило не срабатывало.


anonymous.ru писал(а):
23.06.2010 13:38
смотрим дальше на опции mount: можно смонтировать любую фс с поддержкой suid и dev
Нельзя. Используется один аргумент "$1", опции фиксированы. Как смонтировать с suid и dev?
Спасибо сказали:
Аватара пользователя
anonymous.ru
Сообщения: 614

Re: Решено: setuid-бит не работает со скриптами

Сообщение anonymous.ru »

watashiwa_darede... писал(а):
23.06.2010 13:50
Нельзя. Используется один аргумент "$1", опции фиксированы. Как смонтировать с suid и dev?

это опции по умолчанию
:drinks:
Спасибо сказали:
Аватара пользователя
anonymous.ru
Сообщения: 614

Re: Решено: setuid-бит не работает со скриптами

Сообщение anonymous.ru »

watashiwa_darede... писал(а):
23.06.2010 13:50
Хм... крайний раз когда я пробовал, было необходимо прописывать полный путь, иначе правило не срабатывало.

глянул man sudoers
там пишут:
"env_reset"
Если установлено, то sudo обнулит значения переменных окружения оставив только следующие: HOME, LOGNAME, PATH, SHELL, TERM, и USER (в дополнение к переменным SUDO_*). Из них будет полностью скопирован в неизменном виде только TERM. Прочие переменные будут установлены в значения по умолчанию (возможно изменённые в соответствии со значениями параметра set_logname). Если sudo было собрано с параметром SECURE_PATH, то это значение быдет использовано для переменной окружения PATH. Другие переменные могут быть сохранены использованием параметра env_keep.
:drinks:
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: Решено: setuid-бит не работает со скриптами

Сообщение t.t »

watashiwa_daredeska писал(а):
23.06.2010 13:50
t.t писал(а):
23.06.2010 13:31
Во-вторых, никто не мешает прописать полный путь; но это и не обязательно
Хм... крайний раз когда я пробовал, было необходимо прописывать полный путь, иначе правило не срабатывало.
Речь про полный путь в скрипте, а не в sudoers.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: Решено: setuid-бит не работает со скриптами

Сообщение watashiwa_daredeska »

anonymous.ru писал(а):
23.06.2010 14:02
глянул man sudoers
там пишут:
"env_reset"
Да при чем тут env_reset... Я говорю о том, что если в sudoers прописать правило на команду «mount», то это правило никогда не сработает. Нет такого файла. Есть /bin/mount, /home/vasya/bin/mount, /tmp/angry-trojan/mount и т.п, где бы и как бы не были установлены PATH и как бы пользователь ни вызывал эту команду. Ибо sudo всегда для сравнения берет абсолютный путь к запускаемому файлу, но путь из sudoers берет без изменений и преобразований по PATH или как там еще.
Спасибо сказали:
Аватара пользователя
anonymous.ru
Сообщения: 614

Re: Решено: setuid-бит не работает со скриптами

Сообщение anonymous.ru »

watashiwa_darede..., как уже написал t.t, речь идет о mount внутри скрипта loop_mount_core.
:drinks:
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: Решено: setuid-бит не работает со скриптами

Сообщение watashiwa_daredeska »

anonymous.ru писал(а):
23.06.2010 13:54
это опции по умолчанию
Хм... в первом посте было правильно: -o loop,users,ro
users ... This option implies the options noexec, nosuid, and nodev
Ну что ж, значит надо прописать :)

anonymous.ru писал(а):
23.06.2010 14:08
как уже написал t.t, речь идет о mount внутри скрипта loop_mount_core.
А... ну да, тут ведь не mount в sudoers прописывается, а скрипт. Чо-то я затупил :)
Спасибо сказали:
math
Сообщения: 286
Статус: Ъ участник
ОС: Artix (= Arch without systemd)

Re: Решено: setuid-бит не работает со скриптами

Сообщение math »

allez писал(а):
23.06.2010 10:04
math писал(а):
23.06.2010 09:40
осталась одна проблема: в скрипте, запущенном из-под sudo узнать имя юзера, который этот скрипт запустил
Гляньте на переменную окружения SUDO_USER.

спасибо, это то что мне надо
по поводу fuser и др. - у меня стоит cdemu, но мне нужно loop-монтирование для юзеров

anonymous.ru писал(а):
23.06.2010 13:38
t.t писал(а):
23.06.2010 13:31
Во-первых, sudo использует $PATH рута. Во-вторых, никто не мешает прописать полный путь; но это и не обязательно (см. «во-первых»).

Про первое не знал. прям как у рута? то есть как делает логин шелл?
Про второе - конечно можно.

Ок. смотрим дальше на опции mount: можно смонтировать любую фс с поддержкой suid и dev

я просто не выкладывал полный скрипт, там есть ещё проверки безопасности и т.д. Сейчас доделаю и выложу. Может кому-нибудь будет интересно посмотреть, дыры поискать
Спасибо сказали:
math
Сообщения: 286
Статус: Ъ участник
ОС: Artix (= Arch without systemd)

Re: Решено: setuid-бит не работает со скриптами

Сообщение math »

итого:
/usr/bin/loop_mount:

Код: Выделить всё

#!/bin/bash
sudo /usr/bin/loop_mount_core "$@"

/usr/bin/loop_umount:

Код: Выделить всё

#!/bin/bash
sudo /usr/bin/loop_umount_core "$@"

/usr/bin/loop_mount_core:

Код: Выделить всё

#!/bin/bash
if [ ! -f "$1" ]; then
    exit 1
fi
if su $SUDO_USER -c "[ ! -r \"$1\" ]"; then
    exit 1
fi
if [ "$2" = rw ]; then
    if su $SUDO_USER -c "[ -w \"$1\" ]"; then
        /bin/umount /media/image 2>/dev/null
        /bin/mount "$1" /media/image -o loop,users
        exit 0
    fi
fi
/bin/umount /media/image 2>/dev/null
/bin/mount "$1" /media/image -o loop,users,ro

/usr/bin/loop_umount_core:

Код: Выделить всё

#!/bin/bash
/bin/umount /media/image 2>/dev/null

/etc/sudoers (часть):

Код: Выделить всё

Cmnd_Alias LOOP_MOUNT = /usr/bin/loop_mount_core,/usr/bin/loop_umount_core
%users    LOCALHOST = NOPASSWD: LOOP_MOUNT


теперь я могу монтировать любой образ, а не только iso9660
Спасибо сказали: