GNU/Linux >> Linux Esercitazione >  >> Linux

Come impedire agli utenti sudo di eseguire comandi specifici?

Utilizzando CmndAlias ​​ALL non sarà mai al sicuro

Ci sono 1000 modi per eseguire service network restart senza fare sudo service network restart . Ecco un esempio di cosa potrebbe provare un utente cattivo:

$ echo "service network restart" > /tmp/hax
$ chmod a+x /tmp/hax
$ sudo /tmp/hax

Se fornisci agli utenti ALL command alias, e quindi provare a creare una lista nera, saranno sempre in grado di trovare un modo per aggirarlo. Blacklist bash e useranno python. Blacklist python e useranno Perl. Blacklist Perl e useranno PHP. Nessuno lo vuole!

Se davvero non vuoi che qualcuno faccia qualcosa, dovresti fare come dice Thomas e creare una lista bianca di cose che sono permesso di fare.

Impostazione di una whitelist con un'eccezione

Un esempio di una piccola lista bianca con un'esclusione è disponibile nella parte inferiore di man sudoers :

 pete           HPPA = /usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd root

The user pete is allowed to change anyone's password except for root on the HPPA
machines.  Note that this assumes passwd(1) does not take multiple user names
on the command line.

(In effetti questo esempio dalla manpage non è sicuro e può essere sfruttato per cambiare la password di root! Vedi i commenti sotto per come.)

Possiamo provare ad adattarlo al tuo caso, per offrire tutti i service comandi al gruppo staff, ma exclude il service network comandi che ti riguardano:

%staff ALL =   /usr/sbin/service *,                            \
             ! /usr/sbin/service *network*,                    \
             ! /usr/sbin/service *NetworkManager*

(Il ALL in quella posizione si riferisce all'Host_Alias, non al Cmnd_Alias ​​- confusione non è vero?)

L'utente non sarà in grado di eseguire sudo bash o sudo tee o sudo wget o sudo /path/to/malicious_script . Puoi autorizzare più comandi di amministrazione per i tuoi utenti se stai attento. Sii specifico!

Nota:ho aggiunto il * prima della parola network sopra, nel caso in cui venga aggiunto un flag innocuo al service strumento in futuro. Immaginiamo un --verbose flag è stato aggiunto in futuro, gli utenti saranno in grado di eseguire quanto segue:

$ sudo service --verbose network restart

Quindi abbiamo bisogno del * per consumare eventuali flag prima del nome del servizio. L'unico svantaggio è che questo potrebbe bloccare altri servizi che in realtà non ti dispiace che gli utenti eseguano, ad es. un servizio chiamato safe-network o network-monitor verrebbe anche rifiutato.

Consenti agli utenti di modificare un file utilizzando le autorizzazioni di gruppo

Di seguito puoi trovare vari tentativi usando rnano attraverso sudo per consentire agli utenti di modificare uno o più file. Ma in realtà sono più complesse e più pericolose di quanto dovrebbero essere.

Una soluzione molto più semplice e sicura consiste nel modificare le autorizzazioni di gruppo sui file specifici per i quali si desidera aprire i diritti di modifica. Ecco un paio di esempi:

### Give steve the ability to edit his nginx config:
$ chgrp steve /etc/nginx/sites-available/steves_dodgy_project
$ chmod g+rw /etc/nginx/sites-available/steves_dodgy_project

### Let all members of the staff group edit the group_website config:
$ chgrp staff /etc/nginx/sites-available/group_website
$ chmod g+rw /etc/nginx/sites-available/group_website

Se hai bisogno di un controllo più capillare (ad esempio:accesso solo per 3 utenti, ma non per tutti i membri dello staff) puoi creare un nuovo gruppo utilizzando il addgroup comando e aggiungervi solo pochi utenti.

Consenti agli utenti di modificare un file tramite sudo

Il resto di questa risposta è diventato un'indagine su quanto sia facile lasciare buchi nel tuo sudo configurazione quando cerchi di offrire flessibilità ai tuoi utenti. Non consiglierei di eseguire nessuna delle seguenti operazioni!

Se vuoi concedere ai tuoi utenti l'accesso per modificare un file specifico, puoi provare a utilizzare rnano :

%staff ALL = /bin/rnano /etc/nginx/sites-available/host

rnano permetterà loro di modificare solo il file specificato. Questo è importante per impedire a un utente malintenzionato di modificare un servizio nuovo arrivato diverso (ad esempio /etc/init.d/urandom ) e aggiungendovi una riga che eseguirà service network restart .

Sfortunatamente non ho trovato un modo per limitare rvim sufficientemente (l'utente può ancora aprire qualsiasi file utilizzando :e ), quindi siamo bloccati con nano .

Sfortunatamente consentire agli utenti di modificare più file è molto più difficile...

Consenti agli utenti di modificare più file (molto più difficile di quanto dovrebbe essere)

1. Approcci non sicuri

Attenti ai caratteri jolly! Se offri troppa flessibilità (o qualsiasi flessibilità), può essere sfruttata:

%staff ALL = /bin/rnano /etc/nginx/sites-available/*                # UNSAFE!

In questo caso, un utente malintenzionato sarebbe in grado di modificare qualsiasi altro script di servizio upstart e quindi eseguirlo:

$ sudo rnano /etc/nginx/sites-available/../../../any/file/on/the/system

(Sudo in realtà impedisce . e .. espansione sul comando, ma sfortunatamente non sugli argomenti.)

Speravo che qualcosa di simile potesse funzionare, ma è ancora insicuro:

%staff ALL = /bin/rnano /etc/nginx/sites-available/[A-Za-z0-9_-]*   # UNSAFE!

Da sudo attualmente offre solo glob modelli, che * corrisponderà a qualsiasi cosa - non è una regexp!

(Modifica:ho considerato se potresti farla franca nella tua situazione, perché non ci sono sottocartelle sotto sites-available . Abbiamo richiesto la corrispondenza di un carattere dopo la cartella e /.. dovrebbe fallire dopo un nome file. Tuttavia questa non è una soluzione praticabile, perché rnano accetta più argomentazioni. E comunque in generale questo sarebbe ancora non sicuro su una cartella che aveva sottocartelle!)

Anche se non abbiamo sottocartelle ed escludiamo qualsiasi riga contenente /../ , la regola che offre un * glob potrebbe ancora essere sfruttato, perché rnano accetta più argomenti (ciclandoli su <C-X> , e lo spazio è felicemente accettato dal * globo.

$ rnano /etc/nginx/sites-available/legal_file /then/any/file/on/the/system

2. Spingere la busta (anche in definitiva pericoloso)

Quindi cosa succede se rifiutiamo qualsiasi riga contenente spazi o se tentiamo di raggiungere /.. ? Quindi una soluzione praticabile finale potrebbe essere questa:

# I tried hard to make this safe, but in the end I failed again.
# Please don't use this unless you are really smart or really stupid.

%staff ALL =   /bin/rnano /etc/nginx/sites-available/*,    \
             ! /bin/rnano */..*,                           \
             ! /bin/rnano /etc/nginx/sites-available/,     \
             ! /bin/rnano */.,                             \
             ! /bin/rnano * *

# CONCLUSION: It is still NOT SAFE if there are any subfolders, due to
# the bug in rnano described below.

Accettiamo qualsiasi cosa "sotto" la cartella, ma rifiutiamo anche qualsiasi chiamata a rnano se /.. o /. o vengono passati o se la cartella è indirizzata direttamente. (Tecnicamente il /. l'esclusione rende il /.. esclusione ridondante, ma ho lasciato entrambi per chiarezza.)

Ho trovato la cartella e il /. le esclusioni erano necessarie perché altrimenti l'utente avrebbe potuto scegliere come target la cartella stessa. Ora potresti pensare a rnano si bloccherebbe se puntato su una cartella, ma ti sbaglieresti. In realtà la mia versione (2.2.6-1ubuntu1) si avvia con un lieve avviso e un file vuoto, quindi su <C-X> mi chiede di inserire qualsiasi nome di file che mi piace salvare, aprendo un nuovo vettore di attacco! Beh, almeno si è rifiutato di sovrascrivere un file esistente (nell'unico test che ho fatto). Ad ogni modo, poiché non c'è modo di inserire nella blacklist le sottocartelle con sudo, dobbiamo concludere che anche questo approccio non è sicuro. Scusate gli utenti!

Questa scoperta mi ha fatto dubitare della completezza di nano la modalità "ristretta". Dicono che una catena è forte quanto il suo anello più debole. Comincio a sentire la combinazione di sudo lista nera black-magic e rnano potrebbe non essere più sicuro di una catena di margherite.

3. Approcci sicuri ma limitati

I glob sono molto limitati:non ci consentono di abbinare più volte una classe di personaggi. Potresti offri più modifiche ai file, se tutti i tuoi nomi di file hanno la stessa lunghezza (in questo caso host seguito da una singola cifra):

%staff ALL = /bin/rnano /etc/nginx/sites-available/host[0-9]       # SAFE

Ma se vuoi dare all'utente l'accesso per modificare vari file, potresti dover specificare esplicitamente ogni singolo file:

%staff ALL = /bin/rnano /etc/nginx/sites-available/hothost    \
             /bin/rnano /etc/nginx/sites-available/coldhost   \    # SAFE
             /bin/rnano /etc/nginx/sites-available/wethost    \
             /bin/rnano /etc/nginx/sites-available/steves_dodgy_project

Non lasciarti tentare per usare un * in qualsiasi punto. Vedere le sezioni 1. e 2. sopra per il perché! Ricorda:un piccolo errore può compromettere l'intero account di superutente e l'intero sistema.

4. Scrivi il tuo correttore di argomenti (la sicurezza è ora una tua responsabilità)

Spero che aggiungano il supporto regexp a sudo nel futuro; potrebbe risolvere molti problemi se usato correttamente. Ma potremmo anche aver bisogno della possibilità di controllare le proprietà degli argomenti (per consentire solo file, solo cartelle o solo determinati flag).

Ma c'è un'alternativa per creare flessibilità in sudo. Passa il dollaro:

%staff ALL = /root/bin/staffedit *

Quindi scrivi il tuo staffedit script o eseguibile per verificare se gli argomenti passati dall'utente sono legali ed eseguire la richiesta solo se lo sono.


Innanzitutto, apri il file sudoers con sudo visudo . Aggiunta di user ALL=!/usr/sbin/service IIRC non consentirà il service comando per l'utente user .

Fonti:http://nixcraft.com/showthread.php/15132-Sudo-Exclude-Commands-And-Disable-sudo-su-Bash-Shell


Ho trovato la soluzione.

Ho aperto il terminale e sono passato all'utente root con su - poi ho digitato visudo da modificare.

poi alla fine ho scritto righe come

user ALL=!/etc/init.d/NetworkManager restart
user ALL=!/etc/init.d/network restart

Poi ho anche salvato, chiuso e riavviato.

Ora se sto digitando come service network restart o service NetworkManager restart allora non me lo permette e dà un errore come

Sorry user is not allowed to execute '/sbin/service NetowkrManager restart' as root on localhost.localdomain

e allo stesso modo per service network restart comando anche.


Linux
  1. Come cancellare un comando specifico dalla cronologia di Bash in Linux

  2. Journalctl:come impedire il troncamento del testo nel terminale?

  3. Come impostare il percorso per i comandi sudo

  4. Come impedire a un processo di scrivere file

  5. Come spegnere Linux a una data e ora specifica dal terminale?

Come eseguire comandi particolari senza password Sudo in Linux

Come creare un video da immagini in Linux

Come eseguire comandi Sudo senza password

Come aggiornare a Debian 11 da Debian 10

Come impedire agli utenti di accedere alla directory principale?

Come eseguire sudo comandi senza password