Credo che una soluzione appropriata per la maggior parte dei casi semplici [ad esempio se un framework come Puppet/Chef/CfEngine/Ansible è eccessivo], ma è richiesto un alto livello di controllo del sistema remoto è
(a) Richiedere l'autenticazione basata su chiave (b) Bloccare le posizioni che possono essere utilizzate da SSH, in particolare per bloccare gli indirizzi IP che gli utenti root possono utilizzare (c) Assicurarsi che le macchine con questa relazione di fiducia siano adeguatamente protette.
Non credo che "accedere come root sia disapprovato", tanto quanto "accedere come root per fare cose che non richiedono permessi di root" sia disapprovato. Avere una password indovinabile rende possibile che l'account sia forzato, quindi questo è un problema da affrontare, e consentendo alle persone di accedere come root possono commettere errori stupidi con una portata più ampia e fare cose discutibili che nascondono attività dannose, ma a seconda dell'architettura ciò potrebbe non essere effettivamente significativo.
Questo fumetto XKCD sottolinea che, a seconda dell'ambiente, potrebbe non avere importanza se un account root è compromesso.
Probabilmente la soluzione più semplice ed efficace per il caso generale è limitare esattamente chi può accedere come root controllando le chiavi insieme alla specifica di una riga AllowUsers appropriata in /etc/ssh/sshd.conf. Una riga appropriata per consentire agli utenti normali ma bloccare l'accesso root potrebbe essere simile a:
AllowUsers normaluser1 normaluser2 [email protected]
Naturalmente, è importante che l'accesso basato su password non sia consentito o che l'account root non abbia una password (ovvero abbia un "!" o "*" nel campo della password del file delle password.)
Come hai postulato, se è necessario eseguire solo un singolo (o un numero limitato di) programmi, potrebbe essere meglio configurare un utente specifico con l'autenticazione basata su chiave e consentire l'accesso sudo appropriato ai comandi richiesti.
Ci sono, ovviamente, molte cose che possono essere fatte per "bloccare" ulteriormente l'accesso, a seconda del valore dei dati:selinux, registrazione remota, shell limitata, vincoli di ora del giorno, notifiche immediatamente agli accessi , il monitoraggio attivo dei log come fail2ban [oltre alle restrizioni di rete che considero non facoltative] possono tutti far parte di una soluzione. Detto questo, se stai semplicemente controllando un sistema che può essere spazzato via e ricreato facilmente, molto di questo è probabilmente eccessivo.
Ricorda che la sicurezza è costruita su livelli, per essere in grado di ottenere l'accesso root, un account dovrebbe aver bisogno di superare un numero di livelli. Il blocco dell'accesso, le chiavi private SSH, i firewall, le restrizioni dell'ora del giorno [e il principio dell'accesso minimo, ovvero fornire l'accesso solo a ciò che è necessario, non di più, la registrazione, i backup] dovrebbero funzionare tutti insieme come parte di una buona sicurezza.
Ulteriori - Accesso SUDO
Sudo è un meccanismo per consentire a un utente normale di eseguire determinati comandi con accesso elevato ed è abbastanza flessibile e di portata variabile. Mentre una carrellata di sudo non è appropriata qui (ma è ben documentata se digiti man sudo nella maggior parte delle distribuzioni, i passaggi appropriati potrebbero essere -
-
Modifica /etc/sudoers - La maggior parte delle varianti di Linux ha un programma speciale per fare questo chiamato "visudo" che deve essere eseguito come root, e più o meno equivale all'uso dell'editor di sistema per modificare /etc/sudoers (che è un altro modo per fare questo - anche se probabilmente basato su)
-
Aggiungi/modifica righe appropriate per consentire a un determinato utente di eseguire operazioni particolari. Se, ad esempio, desideri che siano in grado di montare le directory, ad esempio e senza dover inserire una password, devi inserire una riga come :
username ALL=/sbin/mount NOPASSWD: ALL
Per poi eseguire questo comando, l'utente appropriato eseguirà qualcosa come
sudo mount /dev/xxx /path/to/mount
Puoi elencare più righe per più comandi, utilizzare gruppi piuttosto che usi:sudoers è un sottosistema abbastanza flessibile. In molte distribuzioni è anche possibile aggiungere file con comandi a una sottodirectory come /etc/sudoers.d
Quella che segue è una risposta dal post di Unix Stackexchange
Come eseguire in remoto il comando ssh un comando sudo senza password.
Questo metodo consente all'amministratore del server di consentire al tuo account di eseguire un comando come sudo
senza specificare la password. Il comando è probabilmente la chiamata al tuo script ed è consentito solo se eseguito con il tuo account. Poiché il comando consentito è interamente specificato inclusi gli argomenti, credo che questo metodo sia abbastanza sicuro.
puoi dire a sudo di saltare la password per alcuni comandi.
per esempio. in
/etc/sudoers
archemar ALL = (www-data) NOPASSWD: /bin/rm -rf /var/www/log/upload.*
questo mi permette di usare
sudo -u www-data /bin/rm -rf /var/www/log/upload.*
come archemar senza password.
Nota che
sudo -u www-data rm -rf /var/www/log/upload.*
non funzionerà (chiederà una password) come
rm
differiscono da/bin/rm
.Assicurati di modificare
/etc/sudoers
usandovisudo
comando.Una volta raggiunto il livello avanzato, potresti desiderare di avere il tuo
sudo
file in/etc/sudoers.d
.