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 sudoedit
o 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_config
limitare 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_keys
file 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 sudo
con i singoli comandi e provo a impedire l'uso di sudo -i
o sudo su -
. Provo a non usare, sudo vim /path/to/file
ma uso sudoedit
invece.
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_profile
aumentare 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.