[glux] ssh... client

Cristian Rigamonti cri@linux.it
Mar 27 Apr 2004 00:28:27 CEST


On Mon, Apr 26, 2004 at 06:28:45PM +0200, @arminillo wrote:
> Idee per risolvere questo problema?
> 
> racf@kdeb:~$ ssh $altroipinterno
> Permission denied, please try again.
> Permission denied, please try again.
> Permission denied (publickey,password,keyboard-interactive).

Non riesce ad autenticarsi; che metodo usi? Password? Host key? Chiave
dell'utente? Prova ad aggiungere -v[vv] alla linea di comando...

> racf@kdeb:~$ rm -rf .ssh
> racf@kdeb:~$ ssh $altroipinterno
> Host key verification failed.

Ci credo, hai appena rimosso la directory che contiene le tue chiavi...

Prova a dare un'occhiata al file allegato: sono un po' di miei vecchi
appunti sull'uso di ssh, magari trovi qualche ispirazione.

Cri

-- 
[         Cristian Rigamonti  -  cri@linux.it  -  +39 347 1043466          ]
[      GPG/PGP Key-Id: 943A5F0E  -  http://www.linux.it/~cri/cri.asc       ]
[    GLUX! - http://www.lecco.linux.it  -  irc.eu.freenode.net -> #glux    ]
-------------- parte successiva --------------


*** 
ssh 
***



- Procedura di connessione in breve:

  - il client contatta il server sulla porta 22 e scambia informazioni (in
    chiaro) sulla propria versione di ssh (idem il server) e sui metodi di
    cifratura

  - autenticazione del server:

    - Protocollo 1: il server spedisce la propria host key (di solito 1024bit) e
      server key (768 bit, generata ogni ora, non scritta su disco). Il client
      confronta la chiave del server con quella contenuta nel proprio database
      (tranne la prima volta, per cui viene chiesto all'utente di accettarla
      esplicitamente), genera una chiave di sessione, la cifra con le chiavi
      ricevute e la invia al server (assieme all'indicazione sull'algoritmo di
      cifratura); il server decifra la chiave di sessione con la propria chiave
      privata e manda una risposta cifrata con essa (da questo punto in poi le
      comunicazioni sono cifrate)

    - Protocollo 2: non c'e' server key, ma scambio di chiave di sessione alla
      Diffie-Hellman; prevede metodi di cifratura e di integrita' della
      connessione (MAC) piu' robusti del protocollo 1
    
  - autenticazione del client (cfr oltre per dettagli): 
  
    - Protocollo 1: rhosts, rhosts+RSAhost, RSA, password
    - Protocollo 2:    -  , hostbased, pubkey, password
  
  - vengono eseguiti i programmi disponibili per la sessione: shell, X,
    forwarding di connessioni TCP/IP


- Tipi di autenticazione client (con i nomi usati in ssh_config):

  - Protocollo 1: 
  
    - RhostsAuthentication
      Usa i file /etc/hosts.equiv o /etc/ssh/shosts.equiv (oppure ~/.rhosts e
      ~/.shosts) sul server: se contengono una riga con "host utente" della
      macchina da cui ci si connette, il login e' automaticamente autorizzato.
      
      Implica che il client si fidi dell'utente root del server, del DNS e,
      parzialmente, della rete (e' possibile fare ip spoofing, ma non in modo
      "cieco" come e' possibile con rlogin, cfr documentazione per
      approfondimenti).
      
    - RhostsRSAAuthentication
      Simile al metodo precedente, ma viene fatta un'autenticazione con chiave
      pubblica a livello di host (non di utente, che e' ancora identificato
      tramite hosts.equiv); oltre alla coppia utente/host, il client invia anche
      la propria host key pubblica (del client, non dell'utente!); il server
      controlla di averla in /etc/ssh/ssh_known_hosts o ~/.ssh/known_hosts
      (il modo piu' veloce per mettercela e' connettersi una volta dal server al
      client, altrimenti occorre copiarla manualmente), spedisce un numero
      casuale (challenge) cifrato con la chiave del client, che rispondera'
      decifrandolo con la propria chiave privata; il server controlla la
      risposta e autorizza il client.

      Questo metodo evita la possibilita' di spoofing da parte del client
      (oltre a spoofare occorre avere la chiave privata del client!) ma implica
      fidarsi dell'utente root sul client.
      
    - RSAAuthentication
      Qui l'autenticazione a chiave pubblica viene fatta a livello di utente.
      L'utente crea sul client una coppia di chiavi RSA (ssh-keygen) e al
      momento della connessione manda al server la propria chiave pubblica,
      segue un meccanismo di challenge simile a quello descritto sopra (le
      chiavi pubbliche autorizzate devono essere copiate in
      ~/.ssh/authorized_keys sul server).
      
      Questo metodo implica fiducia SOLO sulla chiave privata in possesso del
      client.

      
    - PasswordAuthentication
      Il server chiede la password dell'account su cui si vuole fare login (la
      password viaggia cifrata, cfr come avviene la procedura di connessione).

      Questo metodo implica fiducia SOLO sulla password in possesso del client.

      

  - Protocollo 2 (non ha rhosts):

    - HostbasedAuthentication
      Autenticazione a chiave pubblica (su host); e' l'equivalente della
      RhostsRSAAuthentication del protocollo 1.

    - PubkeyAuthentication
      Autenticazione a chiave pubblica (su utente): oltre all'algoritmo RSA usa
      il DSA: il client all'inizio FIRMA l'identificativo di sessione (alla
      Diffie-Hellman) con la propria chiave privata (~/.ssh/id_dsa o
      ~/.ssh/id_rsa) e il server controlla.
      
    - PasswordAuthentication
      Come quella del protocollo 1

     

- Sicurezza:

  The SSH protocol offers major security advantages over existing telnet and
  rlogin protocols.  IP spoofing is restricted to closing a connection (by
  encryption, host keys, and the special random cookie).  If encryption is not
  used, IP spoofing is possible for those who can hear packets going out from
  the server.  DNS spoofing is made ineffective (by host keys).  Routing
  spoofing is made ineffective (by host keys).  All data is encrypted with
  strong algorithms to make eavesdropping as difficult as possible.  This
  includes encrypting any authentication information such as passwords.  The
  information for decrypting session keys is destroyed every hour.  Strong
  authentication methods: .rhosts combined with RSA host authentication, and
  pure RSA authentication.  X11 connections and arbitrary TCP/IP ports can be
  forwarded securely.  Man-in-the-middle attacks are deterred by using the
  server host key to encrypt the session key.  Trojan horses to catch a
  password by routing manipulation are deterred by checking that the host key
  of the server machine matches that stored on the client host.

  The security of SSH against man-in-the-middle attacks and the security of
  the new form of .rhosts authentication, as well as server host validation,
  depends on the integrity of the host key and the files containing known host
  keys.

  The host key is normally stored in a root-readable file.  If the host
  key is compromised, it permits attackers to use IP, DNS and routing
  spoofing as with current rlogin and rsh.  It should never be any
  worse than the current situation.

  The files containing known host keys are not sensitive.  However, if
  an attacker gets to modify the known host key files, it has the same
  consequences as a compromised host key, because the attacker can then
  change the recorded host key.

  The security improvements obtained by this protocol for X11 are of
  particular significance.  Previously, there has been no way to
  protect data communicated between an X server and a client running on
  a remote machine.  By creating a fake display on the server, and
  forwarding all X11 requests over the secure channel, SSH can be used
  to run any X11 applications securely without any cooperation with the
  vendors of the X server or the application.

  Finally, the security of this program relies on the strength of the
  underlying cryptographic algorithms.  The RSA algorithm is used for
  authentication key exchange.  It is widely believed to be secure.  Of
  the algorithms used to encrypt the session, DES has a rather small
  key these days, probably permitting governments and organized
  criminals to break it in very short time with specialized hardware.
  3DES is probably safe (but slower).  IDEA is widely believed to be
  secure.  People have varying degrees of confidence in the other
  algorithms.  This program is not secure if used with no encryption at
  all.




Installazione e configurazione (Debian)

  - La versione in uso su sistemi liberi e' OpenSSH, derivata da OpenBSD. Su
    Debian e' il pacchetto (non-US) ssh (esiste anche ssh-nonfree).

  - Generazione delle host key: dopo aver chiesto se avviare automaticamente al
    boot e se abilitare anche il protocollo 1 (considerato meno sicuro del 2),
    vengono generate le (coppie di) chiavi per l'host (RSA e DSA) e salvate in
    /etc/ssh/...  (da conservare con le solite precauzioni usate per le chiavi
    private). Possono essere generate anche manualmente da root con ssh-keygen.

  - Generazione delle chiavi utente:
  
    'ssh-keygen [-t tipo] [-C commento]'
    
    - Utility per creare coppie di chiavi (per utente o host) e per modificarne
      le proprieta' (es. per cambiare la passphrase: ssh-keygen -p)

    - Nota: se si perde la chiave pubblica, puo' sempre essere rigenerata a
      partire da quella privata con "ssh-keygen -t dsa -y"

  - (opzionale) Abilitare ssh-agent, che permette di gestire le autenticazioni
    in modo pratico (es. evitando di dover inserire la passphrase ogni volta che
    si compie un'operazione).

    ssh-agent viene avviato dall'utente al login (o all'inizio di una sessione
    X, come di default in Debian, cfr /etc/X11/Xsession.d) e vengono
    "registrate" le chiavi private da usare (con ssh-add) immettendo solo una
    volta la passphrase; per ogni operazione che richiede la chiave
    privata, il client ssh si rivolgera' ad ssh-agent (attraverso una socket
    unix che dev'essere leggibile dall'utente, di default /tmp/ssh.../agent...).

    'ssh-add nomefile' registra l'identita' contenuta nel nomefile (controllando
    che sia accessibile solo all'utente e chiedendo la passphrase); se non viene
    dato nessun nomefile, vengono letti ~/.ssh/id_rsa, ~/.ssh/id_dsa,
    ~/.ssh/identity). (cfr man ssh-add per altre opzioni utili: es 'ssh-add -l'
    elenca le identita' registrate, 'ssh-add -d identity' rimuove l'identita'
    dalla lista di quelle registrate, -t per dare scadenza...). Per
    automatizzare la procedura, ssh-add puo' essere inserito nel proprio .xsession.

    La connessione a ssh-agent viene automaticamente esportata alle connessioni
    ssh attive sull'host, senza che passphrase o chiavi private passino sulla
    rete (quindi un utente puo' avviare ssh-agent sulla sua macchina e poi
    "usarlo" in modo sicuro loggandosi via ssh da un'altra macchina).

  - Controllare /etc/hosts.allow e /etc/hosts.deny

  - Controllare che eventuali firewall non blocchino la porta TCP 22

  - Impostazioni predefinite in Debian:
    - PermitRootLogin e' a yes di default; metterla a no non aumenta la
      sicurezza se comunque gli utenti autorizzati a connettersi possono fare
      su.  
    - Protocollo di default del server: 2
    - X11 forwarding (ForwardX11) e' disabilitato di default: da abilitare solo
      per i server in cui ci si fidi dell'account root (altrimenti si renderebbe
      insicura la propria macchina, visto che ssh-agent e' suidroot); per lo 
      stesso motivo e' disabilitato il forward dell'autorizzazione


- Formati delle chiavi pubbliche

  Esempio SSH1: "[opzioni] lunghezza esponente modulo commento"
  Esempio SSH2 dsa: "[opzioni] ssh-dss (chiave in base64) commento"
  Esempio SSH2 rsa: "[opzioni] ssh-rsa (chiave in base64) commento"


- File di configurazione:

  /etc/ssh/sshd_config
  Configurazione del server (man sshd_config)

  ~/.ssh/config (/etc/ssh/ssh_config)
  Configurazione del client (man ssh_config)

  ~/.ssh/known_hosts (/etc/ssh/known_hosts preparato da root)
  Lista chiavi pubbliche DEGLI HOST a cui ci si e' connessi (sul client) o da
  cui sono arrivate connessioni (sul server).
  Usate dal server per l'autenticazione rhosts+RSA (protocollo 1) o per
  l'autenticazione host-based (protocollo 2).
  Usate dal client per assicurarsi dell'autenticita' del server (alla prima
  connessione viene chiesto all'utente di "riconoscere" la chiave, nelle
  connessioni successive ssh la confrontera' con quella comunicatagli dal
  server). 
  Formato: "hostname[,aliases] chiave"
  
  ~/.ssh/authorized_keys: contiene (una per linea) le chiavi pubbliche DEGLI
  UTENTI autorizzati a connettersi a questo account con autenticazione con
  chiave pubblica (protocollo2: id_dsa.pub o id_rsa.pub; protocollo 1:
  ~/.ssh/identity.pub)
  
  ~/.rhosts e /etc/hosts.equiv (usati anche da rlogin) o
  ~/.shosts e /etc/ssh/shosts.equiv (usati solo da ssh): file usati per
  autenticazione di tipo rhost (formato: "[+-] host [utente]")
  
      
  ~/.ssh/rc (e /etc/ssh/sshrc): comandi eseguiti da sshd appena prima di
  eseguire la shell dell'utente che ha fatto login al server

  ~/.ssh/environment: ambiente ereditato dalla shell ssh


- File delle chiavi:

  /etc/ssh/ssh_host_dsa_key, /etc/ssh/ssh_host_dsa_key.pub
  /etc/ssh/ssh_host_rsa_key, /etc/ssh/ssh_host_rsa_key.pub
  
  Chiavi dell'host (pubbliche e private, dsa e rsa) per l'autenticazione
  dell'HOST con chiave pubblica: le chiavi pubbliche vanno copiate in
  ~/.ssh/known_hosts sul server a cui si vuole accedere (un modo veloce, ma
  non sempre possibile, per farlo e' connettersi dal server al client).
  
    
  ~/.ssh/identity, ~/.ssh/identity.pub (prot 1, rsa)
  ~/.ssh/id_dsa, ~/.ssh/id_dsa.pub (prot 2, dsa)
  ~/.ssh/id_rsa, ~/.ssh/id_rsa.pub (prot 2, rsa)
  
  Chiavi private/pubbliche usate per l'autenticazione con chiave pubblica.
  Le chiavi private devono essere readonly dal proprietario e sono cifrate
  con 3DES (tramite una passphrase). Le chiavi pubbliche vanno copiate in
  ~/.ssh/authorized_keys sul server a cui si vuole accedere.
  


- Connessione

  ssh [-v] [-l user] [opzioni] host | user@host [comando]

- Trasferimento di file

  scp [opzioni] fonte destinazione

  fonte e/o destinazione possono essere in forma utente@host:/percorso


Funzionalita' avanzate:

- X: se ForwardX11 e' settata nella configurazione e il cliente sta usando X,
  viene avviato sul DISPLAY :1 un "proxy Xserver" che permette di visualizzare
  i programmi eseguiti sulla macchina remota. Anche Xauthority sulla macchina
  remota e' impostato automaticamente e in modo sicuro.
  cfr Remote-Xapps-mini-howto
    
- Forwarding di connessioni TCP/IP su canale sicuro
    


Maggiori informazioni sulla lista glux