Memorizza la password se le chiavi SSH sono vietate


46

Ho un server a cui devo accedere frequentemente tramite ssh, perché ci calcolo. Ora, il centro di calcolo proibisce esplicitamente le chiavi SSH perché sono "insicure". Pensano che digitare la mia password, su una tastiera, ogni volta, possibile di fronte ad altri umani, sia un modo molto più sicuro di accedere.

Adesso; Non posso cambiare idea (ho provato).

Esiste un modo per archiviare almeno temporaneamente le password SSH, come GIT può archiviare le password in una cache per un periodo di tempo definito?


55
the computing center explicitly forbids SSH-keys because they are "insecure"- la mia opinione in merito? Trova un nuovo host server, perché il tuo è ovviamente inetto.
Matt Clark,

18
@Matt: "centro di calcolo" suona più come un sistema a griglia accademico, che non ha quasi la stessa concorrenza immagino
gravità

27
Si sbagliano. Probabilmente hanno dimenticato di disabilitare le chiavi ssh quando scadono gli account, quindi hanno deciso che le chiavi ssh sono il problema.
Giosuè,

10
la gravità è giusta. è un supercomputer nazionale, quindi sono bloccato con esso. per quello che vale, la macchina è bella. Probabilmente anche Joshua ha ragione, ma, beh, questo è il tipo di diritto che non va bene per niente
user2667180

7
@TheHansinator Se è installato un keylogger, sei già stato compromesso al punto in cui non importa più se stai proteggendo le tue connessioni ssh. Ma ci sono altri vantaggi publickeydell'autenticazione. Se si disabilita l' passwordautenticazione sul server, si impedisce a tutti quegli aggressori che cercano di indovinare le password. E se un utente malintenzionato tenta un attacco mitm contro un client che non ha precedentemente archiviato la chiave pubblica del server, si è molto meglio protetti publickeyrispetto all'utilizzo passworddell'autenticazione.
Kasperd,

Risposte:


63

Riutilizzo della connessione

SSHv2 consente alla stessa connessione autenticata di stabilire più 'canali': shell interattiva, comando batch, SFTP, insieme a quelli secondari come l'inoltro dell'agente o l'inoltro TCP. Il server probabilmente supporta il multiplexing delle connessioni per impostazione predefinita. (Se i tuoi amministratori si lamentano, non memorizza nella cache la tua password da nessuna parte, ma memorizza nella cache l'intera connessione.)

Con OpenSSH hai ControlMastere ControlPathopzioni (-M e -S) per usare questo:

  1. Avviare una connessione SSH "master" utilizzando -M. (Dato che non hai ancora un ControlPath nella tua configurazione, devi specificarlo nella riga di comando usando -S. Deve vivere a lungo, quindi aggiungo le -fNopzioni per passare allo sfondo; tecnicamente sono facoltative altrimenti.)

    $ ssh foo@bar.example.com -fNMS ~/.ssh/bar.socket
    foo@bar.example.com's password:
    

    Sei tornato alla shell locale.

  2. Avvia una nuova connessione tramite il master:

    $ ssh foo@bar.example.com -S ~/.ssh/bar.socket
    

    Sei in.

  3. Per renderlo utile per Git / rsync / SFTP, è necessario impostare ControlPathnella configurazione, poiché non sarà possibile specificare -Stutto il tempo:

    Host *
        ControlPath ~/.ssh/S.%r@%h:%p
    

Puoi automatizzarlo: anche le recenti versioni di OpenSSH hanno ControlPersistche stabilisce automaticamente una connessione principale in background se non ce n'è ancora una. Questo ti permette di saltare il passaggio 1 e usare ssh come faresti normalmente.

  1. Configurazione in ~/.ssh/config:

    Host *
        ControlPath ~/.ssh/S.%r@%h:%p
        ControlMaster auto
        ControlPersist 15m
    
  2. La prima connessione richiede la password:

    $ ssh foo@bar.example.com
    foo@bar.example.com's password:
    [foo@bar:~]$ exit
    
  3. Il secondo no:

    $ ssh foo@bar.example.com
    [foo@bar:~]$ yay
    

Per controllare il master multiplex (arrestarlo o configurare gli inoltri TCP), utilizzare l' -Oopzione.

Un metodo simile è supportato dalle recenti versioni di PuTTY .


1
grazie mille per questa bella risposta. google non è stato utile su questo problema, poiché si è sempre rivolto a ssh-keys e non conoscevo le parole chiave giuste. mi ha aiutato molto!
user2667180

1
Va da sé, ma se si utilizza questa configurazione è indispensabile assicurarsi che il proprio account sia protetto e che la propria cartella .ssh sia correttamente bloccata poiché chiunque abbia accesso ai file del canale su quella macchina può spostarsi sulle spalle del proprio connessione e accedi al server come te.
shellster

3
@shellster: Intendi "chiunque abbia lo stesso UID", proprio come nel caso di ssh-agent. Anche se si aprono deliberatamente le autorizzazioni del file socket (che sono 0600 per impostazione predefinita), altri utenti otterranno semplicemente "multiplex uid mismatch" da esso.
Grawity

3
@shellster Qualcuno con root potrebbe installare un keylogger e rubare la tua password al sistema remoto, o fare qualsiasi numero di cose nefaste. Se siamo preoccupati per il root locale, questo non è meno sicuro del salvataggio di una chiave privata SSH.
amalloy,

1
Non considero la radice locale una minaccia perché, se mai dovesse diventare una minaccia, brinderai, qualunque cosa accada. (Come con il governo-grade spionaggio.) Francamente una radice locale potrebbe semplicemente sostituire il vostro client ssh e ssh-agent con tutto quello che vogliono. Memorizzare tutte le password e le chiavi private in /root/.secret? Sicuro.
Grawity

19

Uso sshpass

sshpass ( github , pagina man ) è uno strumento che invia automaticamente la password a ssh. Il modo sicuro per usarlo è questo:

% echo 'correct horse battery staple' > ~/.ssh/compute_password
% chmod go-rw ~/.ssh/compute_password

% sshpass -f ~/.ssh/compute_password ssh foo@host

Questo leggerà la password ~/.ssh/compute_password, proprio come un file di chiave privata senza passphrase. È possibile inserire il sshpasscomando in un piccolo script shell o in un alias shell per evitare di digitare quel comando completo. Purtroppo, non ho trovato un modo per farlo ~/.ssh/config.

(È anche possibile specificare la password direttamente dalla riga di comando a sshpass, ma questo dovrebbe essere evitato, poiché perde la password a chiunque possa farlo ps)

Confronto con altri metodi

Questo approccio è ovviamente meno sicuro rispetto all'autenticazione della chiave pubblica correttamente impostata, ma probabilmente lo sapete già.

È anche meno sicuro della risposta di @ grawity sul riutilizzo della connessione, ma ha il vantaggio di non dover inserire la password in modo interattivo.

Potresti considerare la risposta di @ grawity un'alternativa all'autorizzazione pubkey con una passphrase e una memorizzazione nella chiave privata (es ssh-agent.). Quindi la mia risposta sarebbe un'alternativa all'autorizzazione pubkey senza una passphrase nel file della chiave privata.


3
Se la politica del centro di calcolo è stata scritta sulla base di "ma le coppie di chiavi sono memorizzate su disco dove qualcuno potrebbe rubarle!", Allora sembra che questa politica si ritorcerà contro.
Grawity

6
@grawity Bene, le cattive politiche portano a soluzioni ancora peggiori ¯ \ _ (ツ) _ / ¯
marcelm

1
Se generi la tua password come un flusso sufficientemente lungo di caratteri casuali (diciamo head -c 16 /dev/urandom | base64per 128 bit) e non la usi su altri sistemi, è per quanto riguarda la sicurezza simile a una chiave. Difficile da forzare e altrettanto semplice da usare dal file se non crittografato. Questo vale anche per il cattivo, se ottengono il file. L'unica differenza è che la password viene inviata così com'è al server, mentre le chiavi hanno una migliore matematica per dimostrare che possiedi la chiave privata corretta senza rivelarla e, dal punto di vista dell'usabilità, è più difficile crittografare il file contenente la password (no strumenti standard).
ilkkachu,

1

Usa password manager.

Alcuni gestori di password (es. KeePassXC) hanno la funzione di "auto-type". Memorizzi la password sul gestore password, sblocchi il database quando esegui il gestore e ogni volta che sshti viene richiesta la password, premi una combinazione di tasti che consente al gestore password di scrivere la tua password lunga sulla console.

Non c'è bisogno di copiare, ricorda qualcosa (tranne la password per sbloccare il database) e puoi avere una password sicura senza schiacciare quei 30 caratteri ogni volta che provi ad accedere.

Puoi scegliere il tuo preferito da questo elenco: https://en.wikipedia.org/wiki/List_of_password_managers


3
Non sono sicuro che la funzione di digitazione automatica funzioni bene con i programmi basati su terminali. Il rilevamento cercherà un titolo specifico per la finestra e l'autotipazione stessa non avrebbe le fantasiose funzionalità "anti-keylogging" che KeePass2 aveva ...
Grawity

1
@grawity gnome-terminalcambia il suo titolo in ssh somehostquando ssh mi chiede la password in modo da poter confrontare la finestra del titolo con questo senza problemi. Non so nulla delle funzionalità di "anti-keylogging": sto usando KeePassXC nel terminale su base giornaliera e il peggio che ho dovuto affrontare è scegliere l'account appropriato dall'elenco.
polistirolo vola

2
@grawity Le funzioni anti-keylogging devono comunque essere abilitate in base alla voce (esattamente per il motivo che molti programmi non supportano il comando incolla).
Bob,

0

Un'altra alternativa è utilizzare un client ssh GUI. Su Windows la scelta più ovvia sarebbe PuTTY . C'è anche una versione Linux di PuTTY, in particolare la maggior parte delle distribuzioni basate su Debian come Ubuntu normalmente includono PuTTY nel loro repository.

Un altro cliente davvero buono è Termius . Supporta non solo Windows e Linux ma anche OSX, iOS e Android. Sebbene sia stata progettata principalmente per i telefoni, la versione desktop è in realtà abbastanza buona.

Se non sbaglio, anche il venerabile Hyperterminal su Windows ha / aveva un client ssh incorporato ma non uso Windows da molto tempo, quindi non ne sono del tutto sicuro.

Tutti i client GUI includono la possibilità di salvare le impostazioni di connessione che includono nome utente e password.


2
"Basato sulla GUI" non implica automaticamente che consentirà la memorizzazione della password, cosa che PuTTY si rifiuta esplicitamente di fare . La versione di HyperTerminal in bundle con Windows era solo Telnet, focalizzata maggiormente sui collegamenti seriali. Forse stai pensando a CKermit per Windows che ha il supporto SSH, ma il suo supporto di cifratura è così obsoleto che non si connetterà facilmente a molti server attuali.
Grawity,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.