Dare accesso a una serie di comandi a un utente non root senza sudo


13

Voglio dare un accesso non sudo a un utente non root sulla mia macchina, c'è un utente dns-manager, il suo unico ruolo è quello di eseguire tutti i comandi BIND (rndc, dnssec-keygen) ecc.

Ora ogni volta che deve eseguire un comando, digita,

sudo rndc reload

C'è un modo per sbarazzarmi di questo sudo, ma solo su un particolare set di comandi (e solo per dns-manager)?


5
Il controllo di accesso discrezionale come questo è praticamente ciò che sudoserve. Quali sono le tue obiezioni commerciali da utilizzare sudoper questo?
MadHatter,

1
@peterh Ripeto la mia domanda: il controllo discrezionale dell'accesso (ovvero la delega parziale del sistema) è il ruolo di sudo. Quali sono le obiezioni?
MadHatter,

3
Che ne dici di senza password sudo, allora? O sudo con password per eseguire lo strumento di gestione DNS , che può quindi operare con namedil privilegio di gruppo o utente o privilegio di root, se necessario.
MadHatter,

4
@peterh "un buon motivo per farlo in questo modo" sarebbe il pezzo mancante. Di solito domande come questa si rivelano essere problemi XY sotto mentite spoglie, e trovo che comprendere la questione di fondo sia la chiave per rispondere in modo completo e professionale.
MadHatter,

2
@peterh Penso che siamo d'accordo l'uno con l'altro. Anch'io voglio vedere l'OP migliorare la sua domanda; approfondire funziona bene per me come un modo per aiutare l'autore a pensare fuori dagli schemi che ha costruito intorno a se stesso. Potrebbe anche avere una buona ragione per voler evitare sudo. Nel tentativo di esprimercelo, può chiarire la nostra confusione, o la sua - o entrambe!
MadHatter,

Risposte:


31

Se capisco correttamente i tuoi commenti, il problema qui è che il comando verrà emesso attraverso una connessione che non ha alcuna possibilità di inserire la password che sudo imposta per impostazione predefinita su richiesta. Inoltre, in molte distribuzioni del sistema operativo, sudo per impostazione predefinita richiederà un TTY, che questo programma potrebbe non avere.

Tuttavia, sudo è in grado di avere una struttura di autorizzazioni molto dettagliata, che consente a uno o più utenti di emettere un comando particolare senza password e TTY. Di seguito, mostrerò tre modi per configurarlo per le tue esigenze. Qualunque sia la tua scelta, l'utente sarà ora in grado di emettere il comando sudo rndc reloadsenza dover inserire una password.

(Inoltre, questo potrebbe non essere necessario, ma ... si prega di ricordarsi di fare una copia di backup del file sudoers prima di modificarlo, per mantenere un guscio in cui siete aperti radici in caso di necessità di ripristinare il backup, e per modificare usando visudoinvece di sudo vi /etc/sudoers. Speriamo che queste precauzioni non siano necessarie, ma ... meglio averle e non averne bisogno rispetto al contrario!)

1. Se non si desidera richiedere un TTY per eventuali richieste

Il modo più semplice per sbarazzarsi dei requisiti TTY (se ne esiste uno) è assicurarsi che la riga che inizia con Defaultsin /etc/sudoersnon contenga la parola requiretty, invece dovrebbe contenere !requiretty. Tuttavia, se lo fai, significa che nessun comando sudo richiederà un tty!

Sarà inoltre necessario aggiungere la riga

rndcuser ALL = (root) NOPASSWD: /path/to/rndc reload, /path/to/dnssec-keygen, /path/to/other/program

2. Se si desidera richiedere un TTY per tutti gli utenti tranne questo

Questo può essere fatto impostando un valore predefinito per questo utente, in questo modo:

Defaults:rndcuser        !requiretty
rndcuser ALL = (root) NOPASSWD: /path/to/rndc reload, /path/to/dnssec-keygen, /path/to/other/program

3. Se si desidera richiedere un TTY per tutti i comandi tranne questo comando da parte di questo singolo utente

Questo è un po 'più complesso, a causa della sintassi del file sudoers. Dovresti creare un alias di comando per il comando, quindi impostare un valore predefinito per tale alias di comando, in questo modo:

Cmnd_Alias RNDC_CMD = /path/to/rndc reload, /path/to/dnssec-keygen, /path/to/other/program
Defaults!RNDC_CMD !requiretty
rndcuser ALL = (root) NOPASSWD: RNDC_CMD

Naturalmente, questo può essere combinato con uno script wrapper che chiama il comando utilizzando sudo, se per qualche motivo non è possibile utilizzare sudo direttamente anche quando è senza password.
Jenny D,

4

Sì. sudo può essere configurato in modo molto flessibile. Anche così, devo menzionare: questi tipi di soluzioni non dovrebbero essere considerati molto sicuri e dovrebbero essere utilizzati solo in un ambiente cooperativo in cui sono presenti altri controlli (quindi, puoi dare questi privilegi avanzati al tuo fedele subordinato, ma non dovrebbe farlo per un cliente che conosci solo dalla rete).

La configurazione sudo è presente /etc/sudoersnella maggior parte dei sistemi. Puoi scoprire la sua sintassi tramite Google o tramite un man sudocomando.

Non dovresti modificare questo file direttamente; farlo può portare a condizioni di gara di sicurezza. Invece, usa il visudocomando (che è un wrapper attorno alla tua $EDITORvariabile d'ambiente).


Dopo aver configurato sudo, puoi facilmente avvolgerlo attorno ai comandi visibili. È molto semplice:

  1. Crea una directory per un elenco dei tuoi script sudo wrapper (fe /usr/local/dnsadmin/bin)
  2. Crea uno script wrapper per i comandi che desideri possano renderli utilizzabili senza sudo. Sarà un comando molto semplice, ad esempio, /usr/local/dnsadmin/bin/rndcsarà:

    #!/bin/bash exec /usr/bin/sudo /usr/sbin/rndc "$@"

  3. Ottieni questa directory nella sua PATHvariabile d'ambiente (ad es. Da un sistema o dal suo locale .profile).


Per curiosità: perché dovresti usare execlo script della shell invece di chiamare direttamente il comando? (Non sto dicendo che è sbagliato, mi piace solo sapere perché lo faresti, così potrei forse imparare qualcosa)
Jenny D

2
Ho finito con il bit sudo senza password, l'idea degli script wrapper è fantastica.
Anss

2
@JennyD :-) A causa della stabilità e delle prestazioni. In caso affermativo exec, il comando chiamato verrà sostituito al posto della shell. Il guscio andrà via. Senza un exec, la shell avvierà quel comando, quindi attenderà la sua fine, e quindi uscirà. Questo secondo, exec-less significa molteplici processi cooperativi, che non sono necessari. Ma non c'è grande differenza, senza exec funzionerebbe altrettanto bene.
Peter - Ripristina Monica il

@JennyD Il mio motivo :-)
Peter - Ripristina Monica il

@Snowbody Grazie mille per il conferimento! È un grande onore.
Peter - Ripristina Monica il

2

Mentre questa non è una soluzione generale nel caso specifico di rndcte non è affatto necessario sudo.

rndcpuò comunicare con qualsiasi namedprocesso tramite un socket locale o una porta remota, utilizzando una chiave segreta per autenticarsi. Per impostazione predefinita (o almeno, per debian, che è la distro che uso), questo file può essere trovato /etc/bind/rndc.keyed è normalmente leggibile solo per utenti binde gruppi bind.

Chiunque abbia accesso in lettura a quel file chiave (o una copia identica di esso) può utilizzare rndcper controllare il server BIND, quindi la soluzione più semplice in questo caso particolare sarebbe quella di aggiungere l'utente al bindgruppo.

Un numero sorprendente di demoni comuni ha qualcosa di simile impostato (Personalmente sto ancora cercando di capire le possibilità dei powerdns in questo senso, ma finora sembra promettente). Se non vuoi farlo, sudodovrai verificare se ciò che vuoi realizzare è possibile caso per caso.


-1

Non vuoi usare sudo per concedere root per alcuni comandi. Invece potresti chmod 4750 un programma specifico [che può racchiudere il comando], per elevare i diritti di un normale utente di eseguirlo come root.

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.