Jak usunąć uprawnienia roota w skryptach powłoki?

14

Opcja „--up” w OpenVPN jest zwykle używana do routingu itp. Tak więc jest przetwarzana, zanim OpenVPN zrzuci uprawnienia roota do działania jak nikt. Jednak wywołuję skrypty powłoki, które muszą działać jako nieuprzywilejowany użytkownik.

Jak mogę to zrobić? Studiowałem uprawnienia Drop Process , w szczególności odpowiedzi wielomianowe i tylerl, ale nie rozumiem, jak je wdrożyć. Pracuję w Centos 6.5, a suid jest zablokowany, zarówno jako „chmod u + s”, jak i „setuid ()”.

Istnieje wtyczka OpenVPN („openvpn-down-root.so”), która umożliwia uruchamianie skryptów wywoływanych przez opcję „--down” jako root. Może istnieć odpowiednik, taki jak „openvpn-up-user.so”, ale go nie znalazłem.

Edytuj0

Według odpowiedzi Nikoli Kotur zainstalowałem runit-rpm Iana Meyera . Chociaż polecenie chpst działa w terminalu, w skrypcie up kończy się niepowodzeniem z „nie znaleziono polecenia”. Działa „sudo chpst” plus ustawienie odpowiedniego wyświetlacza i języka. Zobacz Dlaczego mój terminal nie wyświetla poprawnie znaków Unicode? Biorąc to pod uwagę, skrypt up potrzebuje następujących czterech linii:

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 &

Edytuj1

Według komentarza 0xC0000022L stwierdzam, że „sudo -u użytkownik” działa tak samo jak „sudo chpst -u użytkownik -U użytkownik”:

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 &

Będę studiować sudoers i zaktualizować, czy / kiedy dostanę sudo sam do pracy.

mirimir
źródło
komentarz pozostawiony przez @ user66229: „Czy mogę zasugerować, abyś surfował na sourceforge.net/p/openvpn/mailman i subskrybował listy, które uważasz za najbardziej odpowiednie”.
slm
@ user66229 Dziękujemy. Ale nie wierzę, że jest to pytanie specyficzne dla OpenVPN. Dlaczego w to wierzysz?
mirimir

Odpowiedzi:

7

Używam runit „s chpstnarzędzie do zadań takich jak ten. Na przykład z poziomu skryptu wywołaj swój nieuprzywilejowany skrypt:

chpst -u nobody /path/to/script
Nikola Kotur
źródło
Fajnie :) Dziękuję. Czy github.com/imeyer/runit-rpm jest najlepszym sposobem na uruchomienie Runit w Centos 6.5? Nawet w przypadku repozytoriów Red Hat nie znajduję paczki.
mirimir
@mirimir, tak, używam tego repozytorium, gdy muszę zbudować pakiet runit dla CentOS.
Nikola Kotur
11

Obejmując tylko runit i sudo bardzo brakuje. W rzeczywistości istnieje cała rodzina zestawów narzędzi, takich jak runit, i szeroki wybór narzędzi do robienia dokładnie tego, właśnie tego zadania, do którego zostały zaprojektowane:

  • Daemontools Daniela J. Bernsteina ma setuidgid:

    użytkownik setuidgid /home/user/unprivileged.sh
  • Freedt Adama Sampsona ma setuidgid:

    użytkownik setuidgid /home/user/unprivileged.sh
  • Daemontools-encore Bruce'a Guentera ma setuidgid:

    użytkownik setuidgid /home/user/unprivileged.sh
  • Runit Gerrit Pape ma chpst:

    chpst -u użytkownik /home/user/unprivileged.sh
  • Sprawca Wayne'a Marshalla ma runuid:

    użytkownik runuid /home/user/unprivileged.sh
  • Laurent Bercot s6 ma s6-setuidgid:

    użytkownik s6-setuidgid /home/user/unprivileged.sh
  • mój nosh ma setuidgid:

    użytkownik setuidgid /home/user/unprivileged.sh

Nie łączą różnych zadań związanych z dodawaniem uprawnień i nigdy nie wchodzą w tryb interaktywny.

Nawiasem mówiąc, twoje problemy z załatwieniem to niewiele więcej niż zapomnienie o tym, sbinjak je mieć .binPATH

Dalsza lektura

JdeBP
źródło
3

skrypt, który upuszcza uprawnienia i uruchamia inny skrypt (ale tutaj właśnie go uruchomiłem):

#!/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

Przykład:

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)
Yaroslaff
źródło
Chociaż używanie „sudo -u user” działa w przypadku niektórych poleceń, nie zapewnia ono wystarczającego środowiska użytkownika do moich celów. I chociaż „su -l user” działa dobrze w terminalu, nie robi nic w skryptach. Przypuszczam, że to funkcja bezpieczeństwa. Wygląda więc na to, że zostałem zainstalowany.
mirimir
1
@mirimir: dlaczego? /etc/sudoerspozwala na bardzo szczegółowe określenie, jakie zmienne środowiskowe mogą być przekazywane do uruchomionego programu sudoi tak dalej. man sudoers. Szczerze mówiąc, ktokolwiek używa sudotylko sudo su -do przełączania kontekstu użytkownika lub do zmiany kontekstu użytkownika, nie ma pojęcia, co kryje się za tym niesamowitym programem i ile można zablokować dla poszczególnych programów, użytkowników, hostów itp.
0xC0000022L
@ 0xC0000022L Dzięki. Ponownie spojrzałem na sudo. I tak, „sudo -u user” oraz wyświetlacz i język również działają.
mirimir
1
Mówiąc o niebezpiecznym - nie można ufać $0; osoba dzwoniąca może ustawić skrypt na $0dosłownie wszystko, co chce. I użyj więcej cytatów.
Charles Duffy
2
... jeśli skryptu $0jest /directory/name with spaces/script(i pamiętać, użytkownicy mogą tworzyć dowolne dowiązania w miejscach, których są właścicielami, nawet jeśli nie korzystać exec -a somename yourscriptzadzwonić yourscriptz $0od somename), to by się sudo -u nobody /directory/name with spaces, ze withi spacesprzekazywane jako osobne argumenty polecenia .
Charles Duffy
1

Co powiesz na:

sudo -Eu <user> <command>

Skarżyłeś się na środowisko w poprzednim komentarzu, więc możesz również porównać różnice między wyjściami:

sudo -u <user> printenv
sudo -Eu <user> printenv
thiagowfx
źródło
1

W systemie Linux możesz użyć runuserlub setprivjeśli sesja PAM nie jest wymagana (oba z 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)

Ze strony podręcznika su:

su jest głównie zaprojektowany dla nieuprzywilejowanych użytkowników, zalecanym rozwiązaniem dla uprzywilejowanych użytkowników (np. skrypty wykonywane przez roota) jest użycie runuser komend (1) , który nie wymaga uwierzytelnienia i nie wymaga uwierzytelnienia i zapewnia osobną konfigurację PAM. Jeśli sesja PAM wcale nie jest wymagana, zalecanym rozwiązaniem jest użycie polecenia setpriv (1) .

dcoles
źródło