Как мне удалить привилегии root в скриптах оболочки?

13

Параметр «--up» в OpenVPN обычно используется для маршрутизации и т. Д. И поэтому он обрабатывается до того, как OpenVPN отбрасывает привилегии root для запуска как никто. Тем не менее, я вызываю сценарии оболочки, которые должны запускаться как непривилегированный пользователь.

Как мне это сделать? Я изучил привилегии Drop Process , особенно ответы полинома и Тайлера, но я не понимаю, как это реализовать. Я работаю в Centos 6.5, и suid заблокирован как chmod u + s, так и setuid ().

Существует плагин OpenVPN ("openvpn-down-root.so"), который позволяет сценариям, вызываемым опцией "--down", запускаться от имени пользователя root. Может быть эквивалент, такой как "openvpn-up-user.so", но я не нашел его.

Edit0

Согласно ответу Николы Котура, я установил run-rpm Яна Мейера . Хотя команда chpst работает в терминале, в сценарии up она завершается с ошибкой «команда не найдена». Что работает, так это «sudo chpst» плюс установка правильного отображения и языка. Посмотрите, почему мой терминал не выводит символы Юникода должным образом? Учитывая это, сценарию up нужны эти четыре строки:

LANG="en_US.UTF-8"; export LANG
GDM_LANG="en_US.UTF-8"; export GDM_LANG
DISPLAY=:0; export DISPLAY
sudo chpst -u user -U user /home/user/unprivileged.sh &

Edit1

Согласно комментарию 0xC0000022L, я обнаружил, что «sudo -u user» работает так же, как «sudo chpst -u user -U user»:

LANG="en_US.UTF-8"; export LANG
GDM_LANG="en_US.UTF-8"; export GDM_LANG
DISPLAY=:0; export DISPLAY
sudo -u user /home/user/unprivileged.sh &

Я буду изучать человека sudoers и сообщу, если / когда я получу sudo на работу один.

mirimir
источник
комментарий, оставленный @ user66229: «Могу ли я предложить вам перейти на sourceforge.net/p/openvpn/mailman и подписаться на списки, которые вы считаете наиболее подходящими».
СЛМ
@ user66229 Спасибо. Но я не верю, что это вопрос OpenVPN. Почему вы верите, что это так?
Миримир

Ответы:

7

Я использую runit «s chpstинструмент для таких задач , как это. Например, из сценария up вызовите свой непривилегированный сценарий:

chpst -u nobody /path/to/script
Никола Котур
источник
Круто :) Спасибо. Является ли github.com/imeyer/runit-rpm лучшим способом запустить runit в Centos 6.5? Даже с репозиториями Red Hat я не нахожу пакет.
Миримир
@mirimir, да, я использую это репо, когда мне нужно собрать пакет runit для CentOS.
Никола Котур
10

Покрытие только рунит и судо очень скучает. На самом деле существует целое семейство наборов инструментов, таких как runit, и широкий выбор инструментов для выполнения именно этого, той самой задачи, для которой они были разработаны:

  • Daemontools Дэниела Дж. Бернштейна, имеет setuidgid:

    Пользователь setuidgid /home/user/unprivileged.sh
  • Свобода Адама Сэмпсона имеет setuidgid:

    Пользователь setuidgid /home/user/unprivileged.sh
  • Демон-выход на бис Брюса Гюнтера имеет setuidgid:

    Пользователь setuidgid /home/user/unprivileged.sh
  • Рунит Геррита Папе имеет chpst:

    chpst -u пользователь /home/user/unprivileged.sh
  • Подозреваемый Уэйна Маршалла имеет runuid:

    Пользователь runuid /home/user/unprivileged.sh
  • S6 Лорана Берко имеет s6-setuidgid:

    s6-setuidgid user /home/user/unprivileged.sh
  • моя ноша имеет setuidgid:

    Пользователь setuidgid /home/user/unprivileged.sh

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

Ваши зацикленные проблемы - это нечто большее, чем то, что вы забыли иметь, sbinкак и binваши PATH, кстати.

дальнейшее чтение

JdeBP
источник
3

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

#!/bin/sh

id=`id -u`
safeuser="nobody"

if [ $id = "0" ]
then
         # we're root. dangerous!
        sudo -u $safeuser $0
else
    echo "I'm not root"
    id
fi

Пример:

root@n3:/tmp/x# id
uid=0(root) gid=0(root) группы=0(root)
root@n3:/tmp/x# ./drop.sh
I'm not root
uid=65534(nobody) gid=65534(nogroup) группы=65534(nogroup)
Ярослава
источник
Хотя использование «sudo -u user» работает для некоторых команд, оно не обеспечивает достаточную пользовательскую среду для моих целей. И хотя «su -l user» отлично работает в терминале, он ничего не делает в скриптах. Я полагаю, это функция безопасности. Так что кажется, что я остался с установкой runit.
Миримир
1
@mirimir: почему? /etc/sudoersпозволяет очень точно указать, какие переменные среды могут быть переданы в программу sudoи т. д. man sudoers, Честно говоря, тот, кто использует sudoпросто для sudo su -или для переключения пользовательского контекста, не имеет ни малейшего представления о том, что стоит за этой удивительной программой и насколько вы можете заблокировать вещи для отдельных программ, пользователей, хостов и т. Д.
0xC0000022L
@ 0xC0000022L Спасибо. Я еще раз взглянул на Судо. И да, «sudo -u user» плюс дисплей и язык тоже работает.
Миримир
1
Говоря об опасности - нельзя доверять $0; вызывающая сторона может установить сценарий $0буквально на все, что он хочет. И используйте больше цитат.
Чарльз Даффи
2
... если ваш сценария $0является /directory/name with spaces/script(и помните, что пользователи могут создавать произвольные символические ссылки в тех местах , которыми они владеют, даже если они не используют , exec -a somename yourscriptчтобы позвонить yourscriptс $0из somename), то вы получите sudo -u nobody /directory/name with spaces, с withи spacesпередаются как отдельные аргументы в вашу команду ,
Чарльз Даффи
1

Как насчет:

sudo -Eu <user> <command>

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

sudo -u <user> printenv
sudo -Eu <user> printenv
thiagowfx
источник
1

В Linux вы можете использовать runuserили, setprivесли сеанс PAM не требуется (оба из util-linux):

runuser -u USER [--] COMMAND [ARGUMENTS...]

setpriv --reuid=1000 --regid=1000 --init-groups COMMAND [ARGUMENTS...]  # Like su/runuser/sudo
setpriv --reuid=1000 --regid=1000 --clear-groups COMMAND [ARGUMENTS...]  # Like daemontools setuid(8)

Со suстраницы руководства :

su в основном предназначен для непривилегированных пользователей, рекомендуемое решение для привилегированных пользователей (например, скрипты, выполняемые пользователем root) состоит в использовании команды runuser (1) не-set-user-ID , которая не требует аутентификации и обеспечивает отдельную конфигурацию PAM. Если сеанс PAM вообще не требуется, рекомендуется использовать команду setpriv (1) .

dcoles
источник