Ogni tanto ricevo la strana richiesta di fornire supporto remoto, risoluzione dei problemi e / o ottimizzazione delle prestazioni su sistemi Linux.
Le aziende più grandi spesso dispongono già di procedure ben definite per fornire accesso remoto a venditori / fornitori e devo solo attenermi a queste. (Nel bene e nel male.)
D'altra parte, piccole aziende e individui si rivolgono invariabilmente a me per istruirli su ciò che devono fare per installarmi. In genere i loro server sono direttamente collegati a Internet e le misure di sicurezza esistenti consistono nelle impostazioni predefinite per qualunque sia la loro distribuzione Linux.
Quasi sempre avrò bisogno dell'accesso a livello di root e chiunque configurerà l'accesso per me non è un amministratore di sistema esperto. Non voglio la loro password di root e sono anche abbastanza sicuro che le mie azioni non saranno dannose, ma quali istruzioni ragionevolmente semplici dovrei dare a:
- creare un account e scambiare credenziali in modo sicuro
- imposta l'accesso root (sudo)
- limitare l'accesso al mio account
- fornire audit trail
(E sì, sono consapevole e avverto sempre quei clienti che una volta che ho accesso come amministratore per nascondere eventuali azioni dannose è banale, ma supponiamo che non ho nulla da nascondere e partecipare attivamente alla creazione di una pista di controllo.)
Cosa può essere migliorato con i passaggi seguenti?
Il mio set di istruzioni corrente:
creare un account e scambiare credenziali in modo sicuro
Fornisco un hash di password e chiedo che il mio account sia configurato con quella password crittografata, quindi non avremo bisogno di trasmettere una password di testo chiaro, sarò l'unico a conoscere la password e non inizieremo con una password debole prevedibile.
sudo useradd -p '$1$********' hbruijn
Fornisco una chiave pubblica SSH (specifica coppia di chiavi per client) e chiedo che abbiano impostato il mio account con quella chiave:
sudo su - hbruijn
mkdir -p ~/.ssh
chmod 0700 ~/.ssh
echo 'from="10.80.0.0/14,192.168.1.2" ssh-rsa AAAAB3NzaC1y***...***== hbruijn@serverfault' >> ~/.ssh/authorized_keys
chmod 0600 ~/.ssh/authorized_keys
imposta l'accesso root (sudo)
Chiedo al cliente di impostare sudo per me con sudo sudoedito usando il loro editor preferito e aggiungo a /etc/sudoers:
hbruijn ALL=(ALL) ALL
limitare l'accesso al mio account
In genere il client consente ancora accessi basati su password e chiedo loro di aggiungere le seguenti due righe per /etc/ssh/sshd_configlimitare almeno il mio account solo alle chiavi SSH:
Match user hbruijn
PasswordAuthentication no
A seconda del client instraderò tutto il mio accesso SSH attraverso un singolo host bastion per fornire sempre un singolo indirizzo IP statico (ad esempio 192.168.1.2) e / o fornire l'intervallo di indirizzi IP utilizzato dal mio ISP (ad esempio 10.80. 0.0 / 14). Il client potrebbe dover aggiungere quelli a una whitelist del firewall se l'accesso a SSH è limitato (il più delle volte ssh non è filtrato).
Hai già visto quegli indirizzi IP come la from=restrizione nel ~.ssh/authorized_keysfile che limita gli host da cui la mia chiave può essere usata per accedere ai loro sistemi.
fornire audit trail
Fino ad ora nessun cliente me lo ha chiesto e non ho fatto nulla di specifico oltre a quello che segue per coprirmi il culo:
Cerco di utilizzare coerentemente sudocon i singoli comandi e provo a impedire l'uso di sudo -io sudo su -. Provo a non usare, sudo vim /path/to/file ma uso sudoeditinvece.
Per impostazione predefinita, tutte le azioni privilegiate verranno quindi registrate su syslog (e /var/log/secure):
Sep 26 11:00:03 hostname sudo: hbruijn : TTY=pts/0 ; PWD=/home/hbruijn ; USER=jboss ; COMMAND=sudoedit /usr/share/jbossas/domain/configuration/domain.xml
Sep 26 11:00:34 hostname sudo: hbruijn : TTY=pts/0 ; PWD=/home/hbruijn ; USER=root ; COMMAND=/usr/bin/tail -n 5 /var/log/messages
Mi arrendo principalmente alla personalizzazione dei miei ambienti di lavoro, l'unica cosa che faccio veramente è impostare quanto segue nel mio ~/.bash_profileaumentare la storia di bash e includere i timestamp:
export HISTSIZE=99999999999
export HISTFILESIZE=99999999999
export HISTIGNORE="w:ls:ls -lart:dmesg:history:fg"
export HISTTIMEFORMAT='%F %H:%M:%S '
shopt -s histappend
screen, quindi in casi estremi, il tuo cliente può vedere dal vivo quello che stai facendo.