Як я можу скидати привілеї root на скрипти оболонки?


14

Опція "--up" у OpenVPN зазвичай використовується для маршрутизації тощо. Отже, вона обробляється до того, як OpenVPN скасує привілеї root для запуску як ніхто. Однак я посилаюся на сценарії оболонки, які потрібно запускати як непривілейований користувач.

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

Існує плагін OpenVPN ("openvpn-down-root.so"), який дає змогу запускати сценарії, викликані параметром "--down", скриптом. Можливо, існує еквівалент, наприклад, "openvpn-up-user.so", але я не знайшов його.

Правка0

За відповіддю Нікола Котура, я встановив пробіг Іана Мейєра . Хоча команда chpst працює в терміналі, в сценарії up вона не вдається з "командою не знайдено". Що працює "sudo chpst" плюс налаштування належного дисплея та мови. Будь ласка, див. Чому мій термінал не виводить символів unicode належним чином? Враховуючи це, сценарію вгору потрібні наступні чотири рядки:

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 &

Правка1

За коментарем 0xC0000022L я вважаю, що "sudo -u користувач" працює так само, як "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 &

Я буду вивчати людину-судори та оновлювати, якщо / коли я змушу себе працювати на самоті.


коментар, залишений користувачем @ user66229: "Можна запропонувати вам перейти на sourceforge.net/p/openvpn/mailman і підписатися на списки, які вам найбільш підходящі."
slm

@ user66229 Дякую Але я не вірю, що це питання, яке стосується OpenVPN. Чому ти вважаєш, що це так?
мирмир

Відповіді:


7

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

chpst -u nobody /path/to/script

Класно :) Дякую. Який github.com/imeyer/runit-rpm - найкращий спосіб перейти до Centos 6.5? Навіть з репост Red Red Hat я не знаходжу пакет.
мирмир

@mirimir, так, я використовую це репо, коли мені потрібно створити пакет runit для CentOS.
Микола Котур

11

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

  • Демонтоли Даніеля Бернштейна мають setuidgid:

    setuidgid user /home/user/unprivileged.sh
  • Адам Сампсон setuidgid:

    setuidgid user /home/user/unprivileged.sh
  • Демонтоли Брюса Гюнтера-бісора setuidgid:

    setuidgid user /home/user/unprivileged.sh
  • Герріт Папе має chpst:

    chpst -u user /home/user/unprivileged.sh
  • У вчителя Уейна Маршалла є runuid:

    runuid user /home/user/unprivileged.sh
  • Лоран Беркот s6 має s6-setuidgid:

    s6-setuidgid user /home/user/unprivileged.sh
  • мій ніш setuidgid:

    setuidgid user /home/user/unprivileged.sh

Вони не змішуються в різних завданнях додавання привілеїв і ніколи не потрапляють в інтерактивний режим.

Ваш лавірували-на проблеми трохи більше , ніж ваше упущення мати sbin, а також binв вашому PATH, до речі.

Подальше читання


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

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), є використання командного рунузера (1), який не встановлюється користувачем-ідентифікатором (1) , який не вимагає автентифікації та надання окремої конфігурації PAM. Якщо сеанс PAM взагалі не потрібен, тоді рекомендується використовувати команду setpriv (1) .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.