141

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

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

8 ответов8

108

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

86

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

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

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

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

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

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

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

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

13

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

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

    • Исходный setuidgid поместит вас только в эту группу, поэтому вы не сможете получить доступ к файлам, принадлежащим к другим группам, членом которых вы являетесь.
    • У setuidgid из daemontools -encore и setuidgid из набора инструментов nosh есть опция -s (aka --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

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

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

4

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

3

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

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

chown user:group executable
chmod +s executable

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

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

0

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

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .