Come posso eliminare i privilegi di root negli script di shell?


13

L'opzione "--up" in OpenVPN viene normalmente utilizzata per il routing ecc. E quindi viene elaborata prima che OpenVPN elimini i privilegi di root per funzionare come nessuno. Tuttavia, sto invocando script di shell che devono essere eseguiti come utente senza privilegi.

Come lo faccio? Ho studiato i privilegi di Drop Process , in particolare le risposte del polinomio e di tylerl, ma non capisco come implementarlo. Sto lavorando in Centos 6.5 e il suid è bloccato, sia come "chmod u + s" che come "setuid ()".

Esiste un plug-in OpenVPN ("openvpn-down-root.so") che consente agli script richiamati dall'opzione "--down" di essere eseguiti come root. Potrebbe esserci un equivalente, come "openvpn-up-user.so", ma non l'ho trovato.

Edit0

Secondo la risposta di Nikola Kotur, ho installato i runit-rpm di Ian Meyer . Sebbene il comando chpst funzioni nel terminale, nello script up non riesce con "comando non trovato". Ciò che funziona è "sudo chpst" oltre a impostare la visualizzazione e la lingua corrette. Vedere Perché il mio terminale non emette correttamente i caratteri Unicode? Detto questo, lo script up ha bisogno di queste quattro righe:

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

Per il commento di 0xC0000022L, trovo che "sudo -u user" funziona così come "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 &

Studierò man sudoers e aggiornerò se / quando farò funzionare sudo da solo.


commento lasciato da @ user66229: "Posso suggerirti di navigare su sourceforge.net/p/openvpn/mailman e iscriverti agli elenchi che ritieni più appropriati."
slm

@ user66229 Grazie. Ma non credo che questa sia una domanda specifica per OpenVPN. Perché credi che lo sia?
mirimir

Risposte:


7

Io uso runit 's chpststrumento per operazioni di questo tipo. Ad esempio, dallo script up chiama lo script senza privilegi:

chpst -u nobody /path/to/script

Cool :) Grazie. Github.com/imeyer/runit-rpm è il modo migliore per accedere a Centos 6.5? Anche con i repository Red Hat, non trovo un pacchetto.
mirimir

@mirimir, sì, uso quel repository quando devo creare un pacchetto runit per CentOS.
Nikola Kotur,

10

Coprire solo runit e sudo manca molto. In realtà esiste un'intera famiglia di strumenti come runit e un'ampia scelta di strumenti per fare esattamente questo, proprio il compito per cui sono stati progettati:

  • I daemontools di Daniel J. Bernstein, hanno setuidgid:

    setuidgid user /home/user/unprivileged.sh
  • La libertà di Adam Sampson ha setuidgid:

    setuidgid user /home/user/unprivileged.sh
  • Il daemontools-encore di Bruce Guenter ha setuidgid:

    setuidgid user /home/user/unprivileged.sh
  • La runit di Gerrit Pape ha chpst:

    chpst -u user /home/user/unprivileged.sh
  • Il criminale di Wayne Marshall ha runuid:

    utente runuid /home/user/unprivileged.sh
  • La s6 di Laurent Bercot ha s6-setuidgid:

    s6-setuidgid user /home/user/unprivileged.sh
  • il mio nosh ha setuidgid:

    setuidgid user /home/user/unprivileged.sh

Non si mescolano al diverso compito di aggiungere privilegi e non rientrano mai in una modalità interattiva.

A proposito, i tuoi problemi specifici sono poco più che dimenticare di avere sbin, oltre che binnel tuo PATH.

Ulteriori letture


3

script che rilascia privilegi ed esegue altri script (ma qui l'ho appena fatto funzionare da solo):

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

Esempio:

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)

Mentre l'uso di "sudo -u user" funziona per alcuni comandi, non fornisce un ambiente utente sufficiente per i miei scopi. E mentre "su -l user" funziona bene nel terminale, non fa nulla negli script. Suppongo che sia una funzione di sicurezza. Quindi sembra che rimanga con l'installazione di runit.
mirimir

1
@mirimir: perché? /etc/sudoerspermette di essere molto specifici su quali variabili di ambiente possono essere trasmesse al programma gestito da sudoe così via. man sudoers. Onestamente, chiunque usi sudosemplicemente sudo su -o per cambiare il contesto dell'utente non ha idea di cosa c'è dietro questo fantastico programma e di quanto puoi bloccare le cose per singoli programmi, utenti, host ecc ...
0xC0000022L

@ 0xC0000022L Grazie. Ho dato un'altra occhiata a sudo. E sì, anche "sudo -u user" più display e lingua funzionano.
mirimir

1
Parlando di pericoloso - non puoi fidarti $0; il chiamante può impostare uno script $0letteralmente su tutto ciò che vuole che sia. E usa più citazioni.
Charles Duffy,

2
... se il tuo script $0è /directory/name with spaces/script(e ricorda, gli utenti possono creare collegamenti simbolici arbitrari in posizioni che possiedono, anche se non usano exec -a somename yourscriptper chiamare yourscriptcon un $0di somename), allora otterrai sudo -u nobody /directory/name with spaces, con withe spacespassano come argomenti separati al tuo comando .
Charles Duffy,

1

Che dire:

sudo -Eu <user> <command>

Ti sei lamentato dell'ambiente in un commento precedente, quindi potresti anche confrontare le differenze tra gli output:

sudo -u <user> printenv
sudo -Eu <user> printenv

1

Su Linux puoi usare runusero setprivse non è richiesta una sessione PAM (entrambe da 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)

Dalla supagina man:

su è progettato principalmente per utenti non privilegiati, la soluzione consigliata per utenti privilegiati (ad es. script eseguiti da root) è quella di utilizzare il comando runuser (1) non set-user-ID che non richiede autenticazione e fornisce una configurazione PAM separata. Se la sessione PAM non è richiesta, la soluzione consigliata è utilizzare il comando setpriv (1) .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.