Utilizzare un file binario wrapper
Per questo particolare caso d'uso (vedere la nota importante di seguito), una possibilità è quella di creare un utente (diciamo support-ssh) specificamente per queste connessioni SSH in uscita, quindi installare un piccolo binario wrapper che esegua /usr/bin/ssh.
- Non copiare + chmod il file
sshbinario stesso, perché non ti ricorderai di copiarlo ogni volta che applichi gli aggiornamenti di sicurezza.
- E non utilizzare
rootcome utente con più privilegi, per motivi di cui mi fido sono ovvi.
Questa è un'alternativa funzionalmente equivalente all'utilizzo sudoper elevare i privilegi a quello support-sshdell'account con i seguenti compromessi:
- Questo è più piccolo e più sottile di
sudo, quindi c'è meno rischio di errore di configurazione che si apre più del previsto.
- È responsabilità dell'utente codificarlo correttamente: farlo solo se si è estremamente cauti e (idealmente) si ha esperienza di codifica critica per la sicurezza.
- Può essere personalizzato per essere più specifico di
sudo(ma più codice scrivi, più devi controllare per motivi di sicurezza).
Il file binario del wrapper deve essere impostato HOMEsulla support-sshhome directory dell'utente, in modo che sshraccolga la ssh_configchiave appropriata e privata. Ma l'utente che invoca non dovrebbe essere autorizzato a leggere ~support-ssh/.ssh/o al suo contenuto.
Il wrapper potrebbe essere semplice come:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char **argv)
{
setenv("HOME", "/home/support-ssh", 1);
/* allow only a single, non-option argument */
if (argc!=2 || *argv[1]=='-') {
fprintf(stderr, "Usage: %s <hostname>", argv[0]);
exit(EXIT_FAILURE);
}
execv("/usr/bin/ssh", argv);
return EXIT_FAILURE;
}
Potresti voler essere più restrittivo e verificare che l'argomento argv[1]si trovi in un set di nomi host consentiti. O meno restrittivo e consenti (un sottoinsieme di) argomenti di opzioni. Si potrebbe desiderare di sostituire completamente le variabili d'ambiente (ma mantenere quelli importanti come TERM, LC_*, ecc); notare che LD_LIBRARY_PATHe LD_PRELOADsono particolarmente pericolosi.
Un programma wrapper simile potrebbe essere fornito scpse necessario.
Una nota sull'applicabilità
Questa risposta affronta le circostanze specifiche della domanda, in cui gli utenti sono contrattualmente obbligati a seguire le procedure e vi sono sanzioni (ad esempio il licenziamento) per la loro violazione. Suppone che tu voglia impedire ai dipendenti di copiare casualmente le chiavi private in giro, piuttosto che impedire a un determinato aggressore di ottenere accesso non autorizzato.
Ritengo che la sicurezza sia raggiunta attraverso difese sia tecniche che non tecniche e che l'equilibrio raggiunto qui o utilizzando sudosia appropriato per la situazione presentata.