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
ssh
binario stesso, perché non ti ricorderai di copiarlo ogni volta che applichi gli aggiornamenti di sicurezza.
- E non utilizzare
root
come utente con più privilegi, per motivi di cui mi fido sono ovvi.
Questa è un'alternativa funzionalmente equivalente all'utilizzo sudo
per elevare i privilegi a quello support-ssh
dell'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 HOME
sulla support-ssh
home directory dell'utente, in modo che ssh
raccolga la ssh_config
chiave 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_PATH
e LD_PRELOAD
sono particolarmente pericolosi.
Un programma wrapper simile potrebbe essere fornito scp
se 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 sudo
sia appropriato per la situazione presentata.