Più amministratori di sistema Linux che lavorano come root


40

Nel nostro team abbiamo tre amministratori di sistema Linux esperti che devono amministrare alcune dozzine di server Debian. In precedenza abbiamo lavorato tutti come root utilizzando l'autenticazione con chiave pubblica SSH. Ma abbiamo discusso su quale sia la migliore pratica per quello scenario e non siamo riusciti a concordare nulla.

La chiave pubblica SSH di tutti è messa in ~ root / .ssh / authorized_keys2

  • Vantaggio: facile da usare, l'inoltro dell'agente SSH funziona facilmente, un piccolo sovraccarico
  • Svantaggio: auditing mancante (non si sa mai quale "root" ha apportato una modifica), gli incidenti sono più probabili

Utilizzando account personalizzati e sudo

In questo modo avremmo effettuato l'accesso con account personalizzati utilizzando le chiavi pubbliche SSH e utilizzato sudo per eseguire singole attività con autorizzazioni di root . Inoltre potremmo darci il gruppo "adm" che ci consente di visualizzare i file di registro.

  • Vantaggio: buon controllo, sudo ci impedisce di fare cose idiote troppo facilmente
  • Svantaggio: l'inoltro dell'agente SSH si interrompe, è una seccatura perché a malapena tutto può essere fatto come non root

Utilizzo di più utenti UID 0

Questa è una proposta davvero unica di uno dei amministratori di sistema. Suggerisce di creare tre utenti in / etc / passwd tutti con UID 0 ma nomi di accesso diversi. Sostiene che ciò non è in realtà vietato e consente a tutti di essere UID 0 ma di poter comunque controllare.

  • Vantaggio: l'inoltro dell'agente SSH funziona, il controllo potrebbe funzionare (non testato), nessuna seccatura sudo
  • Svantaggio: sembra piuttosto sporco - non è stato trovato documentato da nessuna parte come un modo consentito

Che cosa suggeriresti?


2
Informazioni sulla tua affermazione "impossibile trovarla documentata da nessuna parte come modo consentito": dai un'occhiata alla -obandiera nella useraddpagina del manuale. Questo flag è lì per consentire a più utenti di condividere lo stesso uid.
jlliagre,

6
Puoi spiegare cosa intendi con "interruzioni di inoltro dell'agente SSH" nella seconda opzione? Lo usiamo nel mio lavoro e l'inoltro dell'agente ssh funziona perfettamente.
Patrick,

4
Dovresti uscire dal tuo account non root invece che da sudo.
Casuale 832,

4
Un'altra conseguenza del metodo sudo: non è più possibile SCP / FTP come root. Eventuali trasferimenti di file dovranno prima essere spostati nella home directory della persona e quindi copiati nel terminale. Questo è un vantaggio e uno svantaggio a seconda della prospettiva.
user606723,

1
Perché i sistemi di tipo fantoccio / cuoco / ansible non vengono considerati?
Alex Holst,

Risposte:


64

La seconda opzione è la migliore IMHO. Account personali, accesso sudo. Disabilita completamente l'accesso root tramite SSH. Abbiamo poche centinaia di server e mezza dozzina di amministratori di sistema, ecco come lo facciamo.

Come si interrompe esattamente l'inoltro dell'agente?

Inoltre, se si tratta di una seccatura che si trova sudodavanti a ogni attività, puoi invocare una shell sudo con sudo -so passare a una shell root consudo su -


10
Invece di disabilitare completamente l'accesso root da parte di SSH, consiglio di fare in modo che l'accesso root da SSH richieda le chiavi, creando una chiave con una frase molto forte e tenendola bloccata solo per un utilizzo di emergenza. Se hai accesso permanente alla console, questo è meno utile, ma in caso contrario, può essere molto utile.
EightBitTony,

17
Raccomando di disabilitare l'accesso root su SSH per motivi di sicurezza. Se devi davvero accedere come root, accedi come utente non root e su.
taz,

+1 .. Andrei oltre il dire "La seconda opzione è la migliore". Vorrei che fosse l'unica opzione ragionevole. Le opzioni 1 e 3 riducono notevolmente la sicurezza del sistema sia da attacchi che da errori esterni. Inoltre, # 2 è il modo in cui il sistema è stato progettato per essere utilizzato principalmente.
Ben Lee,

2
Per favore, approfondisci sudo -s. Sono corretto nel capire che sudo -inon c'è alcuna differenza nell'utilizzare su -o sostanzialmente accedere come root oltre alla voce di registro aggiuntiva rispetto al semplice accesso root? Se questo è vero, come e perché è meglio del semplice login root?
PF4 Pubblico

9

Per quanto riguarda la terza strategia suggerita, oltre alla lettura del useradd -o -u userXXX opzioni come raccomandato da @jlliagre, non ho familiarità con l'esecuzione di più utenti come lo stesso uid. (quindi se vai avanti con questo, sarei interessato se potessi aggiornare il post con eventuali problemi (o successi) che si presentano ...)

Immagino che la mia prima osservazione riguardo alla prima opzione "La chiave pubblica SSH di tutti è messa in ~ root / .ssh / authorized_keys2", è che a meno che tu non abbia mai intenzione di lavorare su altri sistemi;

  1. poi almeno qualche volta , dovrai lavorare con gli account utente esudo

La seconda osservazione sarebbe che se si lavora su sistemi che aspirano a HIPAA, conformità PCI-DSS o cose come CAPP ed EAL, allora si dovrà aggirare i problemi di sudo perché;

  1. È uno standard industriale per fornire account utente individuali non root, che possono essere controllati, disabilitati, scaduti, ecc., In genere utilizzando un database utente centralizzato.

Così; Utilizzando account personalizzati e sudo

È un peccato che come amministratore di sistema, quasi tutto ciò che dovrai fare su una macchina remota richiederà alcune autorizzazioni elevate, tuttavia è fastidioso che la maggior parte degli strumenti e delle utilità basati su SSH siano bloccati mentre sei in sudo

Quindi posso passare alcuni trucchi che uso per aggirare i fastidi di sudocui parli. Il primo problema è che se l'accesso root è bloccato usandoPermitRootLogin=no o che non si ha il root usando la chiave ssh, i file SCP diventano qualcosa di PITA.

Problema 1 : si desidera scp i file dal lato remoto, ma richiedono l'accesso come root, tuttavia non è possibile accedere direttamente alla casella remota come root.

Soluzione noiosa : copia i file nella home directory, chown e scp down.

ssh userXXX@remotesystem, sudo su -ecc. cp /etc/somefilesa/home/userXXX/somefiles , chown -R userXXX /home/userXXX/somefiles, uso SCP per il recupero di file da remoto.

Davvero molto noioso.

Soluzione meno noiosa : sftp supporta il -s sftp_serverflag, quindi puoi fare qualcosa di simile al seguente (se hai configurato sudo senza password /etc/sudoers);

sftp  -s '/usr/bin/sudo /usr/libexec/openssh/sftp-server' \
userXXX@remotehost:/etc/resolv.conf 

(puoi anche usare questo hack-around con sshfs, ma non sono sicuro che sia consigliato ... ;-)

Se non si dispone di diritti sudo senza password, o per qualche motivo configurato che il metodo sopra è rotto, posso suggerire un altro metodo di trasferimento file meno noioso, per accedere ai file root remoti.

Metodo Ninja Port Forward :

Accedere all'host remoto, ma specificare che la porta remota 3022 (può essere qualsiasi cosa libera e non riservata agli amministratori, ovvero> 1024) deve essere inoltrata di nuovo alla porta 22 sul lato locale.

 [localuser@localmachine ~]$ ssh userXXX@remotehost -R 3022:localhost:22
Last login: Mon May 21 05:46:07 2012 from 123.123.123.123
------------------------------------------------------------------------
This is a private system; blah blah blah
------------------------------------------------------------------------

Radica come di consueto ...

-bash-3.2$ sudo su -
[root@remotehost ~]# 

Ora puoi scp i file nell'altra direzione evitando la noiosa fase noiosa di fare una copia intermedia dei file;

[root@remotehost ~]#  scp -o NoHostAuthenticationForLocalhost=yes \
 -P3022 /etc/resolv.conf localuser@localhost:~
localuser@localhost's password: 
resolv.conf                                 100%  
[root@remotehost ~]#  

 

 

Problema 2: inoltro dell'agente SSH : se si carica il profilo radice, ad esempio specificando una shell di accesso, le variabili di ambiente necessarie per l'inoltro dell'agente SSH, come ad esempio SSH_AUTH_SOCKvengono ripristinate, pertanto l'inoltro dell'agente SSH viene "interrotto" in sudo su -.

Risposta a metà cottura :

Tutto ciò che carica correttamente una shell di root reimposterà correttamente l'ambiente, tuttavia c'è un leggero accorgimento che puoi usare quando hai bisogno di ENTRAMBI i permessi di root E la possibilità di usare l'agente SSH, ALLO STESSO TEMPO

Ciò consente di ottenere una sorta di profilo chimera, che in realtà non deve essere utilizzato, poiché è un brutto hack , ma è utile quando è necessario eseguire il SCP dei file dall'host remoto come root, ad alcuni altri host remoti.

Ad ogni modo, puoi abilitare il tuo utente a preservare le sue variabili ENV, impostando quanto segue in sudoers;

 Defaults:userXXX    !env_reset

questo ti permette di creare cattivi ambienti di login ibridi in questo modo;

accedi normalmente;

[localuser@localmachine ~]$ ssh userXXX@remotehost 
Last login: Mon May 21 12:33:12 2012 from 123.123.123.123
------------------------------------------------------------------------
This is a private system; blah blah blah
------------------------------------------------------------------------
-bash-3.2$ env | grep SSH_AUTH
SSH_AUTH_SOCK=/tmp/ssh-qwO715/agent.1971

creare una shell bash, che viene eseguita /root/.profilee /root/.bashrc. ma conservaSSH_AUTH_SOCK

-bash-3.2$ sudo -E bash -l

Quindi questa shell ha i permessi di root e root $PATH(ma una home directory borked ...)

bash-3.2# id
uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel) context=user_u:system_r:unconfined_t
bash-3.2# echo $PATH
/usr/kerberos/sbin:/usr/local/sbin:/usr/sbin:/sbin:/home/xtrabm/xtrabackup-manager:/usr/kerberos/bin:/opt/admin/bin:/usr/local/bin:/bin:/usr/bin:/opt/mx/bin

Ma puoi usare quell'invocazione per fare cose che richiedono sudo root remoto, ma anche l'accesso dell'agente SSH in questo modo;

bash-3.2# scp /root/.ssh/authorized_keys ssh-agent-user@some-other-remote-host:~
/root/.ssh/authorized_keys              100%  126     0.1KB/s   00:00    
bash-3.2# 

1
Mi piacciono gli hack.
sjbotha,

2

La terza opzione sembra ideale, ma l'hai davvero provata per vedere cosa sta succedendo? Mentre tu potresti vedere i nomi utente aggiuntivi nel passaggio di autenticazione, qualsiasi ricerca inversa restituirà lo stesso valore.

Consentire l'accesso root diretto a ssh è una cattiva idea, anche se i tuoi computer non sono connessi a Internet / usano password complesse.

Di solito uso 'su' piuttosto che sudo per l'accesso root.


4
L'aggiunta di più utenti con lo stesso UID aggiunge problemi. Quando le applicazioni cercano il nome utente per un numero UID, possono cercare il nome utente sbagliato. Le applicazioni che funzionano sotto root possono pensare che stiano funzionando come l'utente sbagliato e un sacco di strani errori inizieranno ad apparire (l'ho provato una volta).
Patrick,

8
La terza opzione è solo una cattiva idea . Stai essenzialmente rompendo la relazione 1: 1 tra UID e nomi utente, e letteralmente tutto in unix si aspetta che tale relazione rimanga. Solo perché non esiste una regola esplicita per non farlo, non significa che sia una buona idea.
Shadur,

Ci dispiace, ma la terza opzione è un'idea orribile. Avere più UID 0 persone che accedono sta solo chiedendo di moltiplicare i problemi. L'opzione numero 2 è l'unica sana di mente.
Doug,

La terza opzione non merita molti downgrade. Non c'è alcun comando in Unix di cui sono consapevole che è confuso da questo trucco, la gente potrebbe esserlo ma ai comandi non dovrebbe interessare. È solo un nome di accesso diverso ma non appena si accede, viene utilizzato il primo nome trovato corrispondente all'UID nel database delle password, quindi assicurarsi che il vero nome utente (qui root) sia visualizzato per primo.
jlliagre,

@Patrick Hai visto questo in pratica? Per quanto ho testato, le applicazioni scelgono l' rootutente se l' rootutente è il primo /etc/passwdcon UID 0. Tendo a concordare con jlliagre. L'unico aspetto negativo che vedo è che ogni utente è un rootutente e talvolta potrebbe essere fonte di confusione capire chi ha fatto cosa.
Martin,

2

Uso (1), ma mi è capitato di digitare

rm -rf / tmp *

in un giorno sfortunato. Posso vedere di essere abbastanza cattivo se hai più di una manciata di amministratori.

(2) Probabilmente è più ingegnerizzato - e puoi diventare un vero e proprio root con sudo su -. Gli incidenti sono comunque possibili.

(3) Non vorrei toccare con un palo di chiatta. L'ho usato su Suns, al fine di avere un account root non barebone-sh (se ricordo bene) ma non è mai stato robusto - inoltre dubito che sarebbe molto controllabile.


2

Sicuramente rispondi 2.

  1. Significa che stai consentendo l'accesso SSH come root. Se questa macchina è in qualche modo di fronte al pubblico, questa è solo una terribile idea; quando ho eseguito SSH sulla porta 22, il mio VPS ha ricevuto più tentativi ogni ora per autenticarsi come root. Avevo impostato un IDS di base per registrare e vietare gli IP che facevano più tentativi falliti, ma continuavano ad arrivare. Per fortuna, avevo disabilitato l'accesso SSH come utente root non appena avevo configurato il mio account e sudo. Inoltre, non hai praticamente alcuna traccia di controllo in questo modo.

  2. Fornisce l'accesso root come e quando è necessario. Sì, non hai quasi nessun privilegio come utente standard, ma questo è praticamente esattamente quello che vuoi; se un account viene compromesso, si desidera che sia limitato nelle sue capacità. Desideri che qualsiasi accesso da superutente richieda un nuovo inserimento della password. Inoltre, l'accesso sudo può essere controllato tramite gruppi di utenti e limitato a comandi particolari, se lo desideri, dandoti un maggiore controllo su chi ha accesso a cosa. Inoltre, i comandi eseguiti come sudo possono essere registrati, quindi fornisce una pista di controllo molto migliore se le cose vanno male. Oh, e non limitarti a eseguire "sudo su -" non appena accedi. È una pratica terribile, terribile.

  3. L'idea del tuo amministratore di sistema è cattiva. E dovrebbe sentirsi male. No, le macchine * nix probabilmente non ti impediranno di farlo, ma entrambi i tuoi file system e praticamente ogni applicazione là fuori si aspetta che ogni utente abbia un UID univoco. Se inizi a percorrere questa strada, posso garantire che incontrerai dei problemi. Forse non immediatamente, ma alla fine. Ad esempio, nonostante mostrino nomi simpatici, file e directory usano numeri UID per designare i loro proprietari; se ti imbatti in un programma che ha un problema con UID duplicati lungo la linea, non puoi semplicemente cambiare un UID nel tuo file passwd in seguito senza dover eseguire una seria pulizia manuale del file system.

sudoè la via da seguire. Potrebbe causare ulteriori problemi con i comandi in esecuzione come root, ma ti offre una scatola più sicura, sia in termini di accesso che di controllo.


1

Sicuramente l'opzione 2, ma usa i gruppi per dare ad ogni utente il maggior controllo possibile senza usare sudo. sudo davanti a ogni comando perde metà del vantaggio perché sei sempre nella zona di pericolo. Se si rendono scrivibili le directory pertinenti dagli amministratori di sistema senza sudo, si restituisce sudo all'eccezione che rende tutti più sicuri.


1

Ai vecchi tempi, sudo non esisteva. Di conseguenza, avere più utenti UID 0 era l'unica alternativa disponibile. Ma non è ancora così buono, in particolare con la registrazione basata sull'UID per ottenere il nome utente.

Oggi sudo è l'unica soluzione appropriata. Dimentica qualsiasi altra cosa.


0

È documentato ammissibile di fatto. Gli unici BSD hanno avuto il loro account toor per molto tempo e gli utenti bashroot tendono ad essere una pratica accettata su sistemi in cui csh è standard (negligenza accettata;)


0

Forse sono strano, ma il metodo (3) è anche quello che mi è venuto in mente per primo. Pro: avresti tutti i nomi degli utenti nei registri e sapresti chi ha fatto cosa come root. Contro: ognuno di essi dovrebbe essere sempre root, quindi gli errori possono essere catastrofici.

Vorrei chiederti perché hai bisogno che tutti gli amministratori abbiano accesso come root. Tutti e 3 i metodi che proponi presentano uno svantaggio distinto: una volta che un amministratore esegue uno sudo bash -lo sudo su -tali, perdi la capacità di tenere traccia di chi fa cosa e dopo, un errore può essere catastrofico. Inoltre, in caso di possibile comportamento scorretto, ciò potrebbe anche andare molto peggio.

Invece potresti prendere in considerazione l'idea di andare in un altro modo:

  • Crea i tuoi utenti amministratori come utenti regolari
  • Decidi chi deve fare quale lavoro (gestione apache / gestione postfix ecc.)
  • Aggiungi utenti ai gruppi correlati (come aggiungi "martin" a "postfix" e "mail", "amavis" se lo usi, ecc.)
  • Autorizzazioni di correzione (chmod -R g + w postfix: postfix / etc / postfix)
  • dare solo i relativi poteri sudo: (visudo -> let martin usa /etc/init.d/postfix, / usr / bin / postsuper ecc.)

In questo modo, martin sarebbe in grado di gestire in sicurezza Postfix e, in caso di errore o comportamento scorretto, perderesti solo il tuo sistema Postfix, non l'intero server.

La stessa logica può essere applicata a qualsiasi altro sottosistema, come apache, mysql, ecc.

Naturalmente, questo è puramente teorico a questo punto e potrebbe essere difficile da configurare. Sembra un modo migliore per andare. Almeno per me. Se qualcuno ci prova, per favore fatemi sapere come è andata.


Dovrei aggiungere la gestione delle connessioni SSH è piuttosto semplice in questo contesto. Qualunque sia il metodo utilizzato, non consentire accessi root su SSH, lasciare che i singoli utenti ssh con le proprie credenziali e gestire sudo / nosudo / etc da lì.
Tuncay Göncüoğlu,
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.