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


Каков канонический способ заставить выскочить работу изменить его userid и запустить сценарий как непривилегированный пользователь?

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


138
2018-03-11 14:26


происхождения




ответы:


С выскочкой v1.4, УИП а также setgid поддерживаются изначально в файле конфигурации.


108
2017-09-09 11:26



См. Поваренную книгу для подробностей по этому вопросу: upstart.ubuntu.com/cookbook/#run-a-job-as-a-different-user - Jason Navarrete
Другими словами, он поддерживается в Precise (12.04) и новее. - Edward Anderson
Другими словами, не поддерживается в centos 6 - socketpair
Для записи, initctl --version чтобы найти текущую версию выскочки. - Mahn
Раздражающе, дистрибутив Amazon Linux на AWS использует вывернутую версию RHEL 6 (0.6.5 !!!!), поэтому любой, кто использует это, должен будет использовать решение «su». - Asfand Qazi


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

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

exec su -s /bin/sh -c 'exec "$0" "$@"' username -- /path/to/command [parameters...]

84
2018-01-18 01:41



Это единственный ответ, который работал на Amazon Linue EC2 (я пробовал все варианты sudo и su, в том числе --session-command, -c, ad nauseum); ни один из них не позволил остановить процесс после его запуска; Большое спасибо за это. - Kato
Это какая-то причудливая магия оболочки, +1. - Steve Kehlet
Это не сработало для меня на CentOS 6 (Upstart 0.6.5). Есть ряд вилок (по глубине, я думаю), инициированных su что означает, что expect fork и даже expect daemon не поймайте окончательный PID. - Mark Lakata
Я использовал это на 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/command [parameters...] - Asfand Qazi


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

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

Из Кулинарная книга с аппетитом:

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

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


17
2017-12-23 15:11



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


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

  • 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, поэтому, вероятно, это путь к наименьшему удивлению.


13
2017-12-24 00:00





использование setuidgid из пакета daemontools,

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


8
2018-03-11 15:50



daemontools не является предварительным условием выскочки, поэтому это не похоже на «канонический» ответ - Adam Nelson
Кроме того, daemontools находится во вселенной (ubuntu 10.04), а выскочка в основном. - jtimberman


На примере 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 заключается в том, чтобы установить некоторые пакеты из источника в ПИТОН когда этот запуск выполняется. Я должен был делать все в абсолютных путях, потому что chdir строфа, похоже, не работала.


4
2018-01-06 19:52



У меня также были проблемы с окр переменные, используемые с exec start-stop-daemon, - Thomas Bratt


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

Я в итоге просто сделал

chown user:group executable
chmod +s executable

(т. е. установить бит setuid и изменить право собственности).

Возможно, это не самый безопасный метод, но для внутреннего проекта R & D это не имело значения в нашем случае.


3
2017-08-27 21:56



Если вы должны были сделать chmod 1700 или, по крайней мере, chmod u+sx,go-x там, а не просто +s, он квалифицируется как «достаточно безопасный». :) - dannysauer


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

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

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

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


0
2018-03-11 17:07