Запуск новых заданий в качестве непривилегированных пользователей

70417
aaronsw

Какой канонический способ заставить задание выскочки изменить свой ИД пользователя и запустить скрипт как непривилегированный пользователь?

Очевидно, что можно использовать suили sudo, но это кажется хакерским (и может генерировать ненужные строки журнала).

139

8 ответов на вопрос

108
qsun

В upstart v1.4 setuid и setgid изначально поддерживаются в конфигурационном файле.

Смотрите кулинарную книгу для подробностей об этом: http://upstart.ubuntu.com/cookbook/#run-a-job-as-a-different-user Jason Navarrete 11 лет назад 7
Другими словами, он поддерживается в Precise (12.04) и новее. Edward Anderson 11 лет назад 10
Другими словами, не поддерживается в Centos 6 socketpair 10 лет назад 8
Лучший ответ, если у вас есть Upstart> = 1.4. Вы должны добавить в закладки решение 'su', так как оно может пригодиться, когда вам это нужно. tiktak 9 лет назад 0
Для записи, `initctl --version`, чтобы найти вашу текущую версию upstart. Mahn 9 лет назад 5
Досадно, что в дистрибутиве Amazon Linux на AWS используется обновленная версия RHEL 6 (0.6.5 !!!!), поэтому любой, кто использует это, должен будет использовать решение 'su'. Asfand Qazi 8 лет назад 4
Например, добавьте следующую строку в ваш скрипт выскочки: `setuid www-data` J0hnG4lt 7 лет назад 0
85
Roman Gaufman

Спрашивая на канале #upstart на freenode, официальный ответ на этот вопрос таков:

Будущий выпуск Upstart будет иметь встроенную поддержку для этого, но сейчас вы можете использовать что-то вроде:

exec su -s /bin/sh -c 'exec "$0" "$@"' username -- /path/to/command [parameters...] 
Это единственный ответ, который работал на Amazon Linue EC2 (я пробовал все варианты sudo и su, включая --session-command, -c, ad nauseum); ни один из них не позволил остановить процесс после запуска; Большое спасибо за это. Kato 12 лет назад 7
Это какая-то необычная магия раковины, +1. Steve Kehlet 9 лет назад 0
Это не сработало для меня в CentOS 6 (Upstart 0.6.5). Существует ряд форков (я думаю, 4 глубоких), инициированных `su`, что означает, что` ожидайте разветвления 'и даже' ожидайте демона`, не поймайте окончательный PID. Mark Lakata 9 лет назад 5
Я использовал это в Amazon Linux (Upstart 0.6.5) для загрузки процесса Jenkins (который, к счастью, не демонизируется), и это сработало! Мне пришлось немного изменить его, чтобы перенаправить стандартный вывод в файл журнала и установить некоторые переменные среды, но это сработало! Моя версия выглядит так: `exec su -s / bin / sh -c 'HOME = / foo / bar exec" $ 0 "" $ @ "&> / var / log / foobar.log' username - / path / to / команда [параметры ...] ` Asfand Qazi 8 лет назад 2
17
Jason R. Coombs

Как насчет использования start-stop-daemon?

exec start-stop-daemon --start --chuid daemonuser --exec /bin/server_cmd 

Из кулинарной книги Upstart :

Рекомендуемый метод для систем Debian и Ubuntu - использовать вспомогательную утилиту start-stop-daemon. […] start-stop-daemonНе накладывает ограничения PAM («сменный модуль аутентификации») на процесс, который он запускает.

Примечание: start-stop-daemonне поддерживается в RHEL.

Вы также можете использовать группу, если вам это нужно. С --chuid daemonuser: daemongroup Evgeny 12 лет назад 2
13
Jason Holt

Есть несколько способов сделать это, все с немного другой семантикой, особенно относящейся к членству в группе:

  • setuidgid поместит вас в указанную вами группу.

    • Исходные daemontools 'поместят setuidgidвас только в эту группу, поэтому вы не сможете получить доступ к файлам, принадлежащим другим группам, членом которых вы являетесь.
    • setuidgidОт DaemonTools-бис а setuidgidиз Nosh набора инструментов оба имеют -s(он же --supplementary) вариант, который поставит вас в этой группе, а также поставить вас во всех дополнительных групп для пользователя, который вы укажете.
  • Использование, как newgrpтолько вы станете менее привилегированным пользователем, добавит одну группу к вашему набору групп, но также создаст новый подоболочек, что затруднит использование внутри скриптов.

  • start-stop-daemon сохраняет членство в вашей группе и делает намного больше, чем просто setuid / setgid.

  • chpst -u username:group1:group2:group3... commandnameпозволит вам точно указать, какое членство в группе следует принять, но (в Ubuntu ) он поставляется только с runitпакетом, который является альтернативой upstart.

  • su -c commandname usernameсобирает все членство в группах с именами пользователей, как, впрочем sudo -u username commandname, и, вероятно, это путь к наименьшему удивлению.

8
aaronsw

Используйте setuidgidиз пакета daemontools.

Документация здесь: http://cr.yp.to/daemontools/setuidgid.html

daemontools не является обязательным условием выскочки, так что это не похоже на «канонический» ответ Adam Nelson 14 лет назад 7
Кроме того, daemontools находится во вселенной (Ubuntu 10.04), а выскочка в основном. jtimberman 13 лет назад 2
4
Jesse Smith

На экземпляре Ubuntu 10.10 в Amazon EC2 мне повезло с start-stop-daemonкомандой.

Я также боролся с некоторыми другими выскочившими строфами . Я вызываю приложение Python с конкретными virtualenvи некоторыми параметрами для моей исполняемой программы.

Вот что сработало для меня.

script export PYTHONPATH=.:/home/ubuntu/.local/lib/python2.7/site-packages/:/home/ubuntu/python/lib/python2.7/site-packages/ exec start-stop-daemon --start --chuid ubuntu --exec /home/ubuntu/python_envs/MyProj/bin/python /home/ubuntu/www/MyProj/MyProj.py -- --config-file-dir=/home/ubuntu/www/MyProj/config/ >> /home/ubuntu/startup.log 2>&1 & end script 

PYTHONPATH, Чтобы получить некоторые пакеты, установленные из источника в PYTHON путь модуля при выполнении этого выскочки работы. Я должен был делать все по абсолютному пути, потому что chdirстрофа, похоже, не работала.

У меня также были проблемы с * env * переменными, используемыми с * exec start-stop-daemon *. Thomas Bratt 10 лет назад 0
3
Mark Lakata

Я использовал CentOS 6, и я не смог заставить рекомендованный хак (для Upstart 0.6.5) работать на меня или трюк 'su', потому что количество задействованных вилок (я думаю, 4) не отслеживалось ожидаемым форком или ожидать демона.

В конце концов я просто сделал

chown user:group executable chmod +s executable 

(т.е. установите бит setuid и измените владельца).

Возможно, это не самый безопасный метод, но для внутреннего проекта НИОКР в нашем случае это не имело значения.

Если бы вы использовали там `chmod 1700` или хотя бы` chmod u + sx, go-x` вместо просто `+ s`, это можно было бы квалифицировать как" достаточно безопасное ". :) dannysauer 8 лет назад 0
0
Chris Nava

Существует третья возможность в зависимости от того, что вы пытаетесь достичь. Возможно, вы сможете ослабить контроль доступа к файлам / устройствам, о которых идет речь . Это может позволить непривилегированному пользователю монтировать или получать доступ к элементам, к которым он обычно не имеет права. Просто убедитесь, что вы не отдаете ключи от королевства в процессе.

Вы также можете изменить тайм-аут кэша паролей sudo . Но я не рекомендую его, если ваша машина физически не защищена (то есть вы считаете, что маловероятно, что прохожий попытается получить доступ к sudo).

Есть веская причина, по которой существует очень мало способов выполнения привилегированных действий и что они выполняют ненужную необходимую регистрацию. Свободные ограничения могут быть угрозой безопасности для вашей системы, а отсутствие журналирования означает, что невозможно узнать, что произошло, когда вы были скомпрометированы.

Если размер ваших файлов журнала является проблемой, то, вероятно, что-то не так. Судо генерирует только одну линию за использование в нормальных условиях.

Похожие вопросы