Uso delle utility client OpenSSH

Eseguire i task comuni del client OpenSSH, ad esempio la connessione agli host, la copia dei file e l'esecuzione di agenti, porte e inoltri X11.

Utilizzare le utility client OpenSSH per connettersi a un sistema remoto, copiare i file tra i sistemi, ricordare le passphrase, l'accesso tramite un host bastion, caricare le applicazioni GUI e inoltrare la porta.

Connessione a un altro sistema mediante il comando SSH

Utilizzare il comando ssh per autenticare, eseguire comandi remoti e verificare le chiavi host.

Per impostazione predefinita, ogni volta che si utilizzano le utility OpenSSH per connettersi a un sistema remoto, è necessario fornire un nome utente e una password. Quando si esegue la connessione a un server OpenSSH per la prima volta, il client OpenSSH richiede di confermare la connessione al sistema corretto.

Utilizzare il comando ssh per eseguire il login a un sistema remoto o a eseguire un comando su un sistema remoto:

ssh [options] [user@]host [command]

Nell'esempio precedente, host è il nome del server OpenSSH remoto a cui si desidera connettersi.

Ad esempio, per eseguire il login a host04 utilizzando lo stesso nome utente utilizzato nel sistema locale, eseguire il comando seguente:

ssh host04

Per connettersi come utente diverso, specificare il nome utente e il simbolo @ prima del nome host remoto, ad esempio eseguire:

ssh joe@host04

Per eseguire un comando sul sistema remoto e tornare alla shell locale, specificare il comando come argomento:

ssh joe@host04 ls $HOME/.ssh

Il comando ssh esegue il login, esegue il comando e chiude la connessione.

Esempio di connessione a un sistema

Gli esempi riportati di seguito mostrano come connettersi a un host remoto, host04. Prima di stabilire la connessione, è necessario confermare l'azione del comando.

ssh host04
L'output dell'esempio riportato di seguito mostra l'output previsto dal comando precedente.
The authenticity of host 'host04 (192.0.2.104)'
can't be established.
ED25519 key fingerprint is SHA256:iunRrbwnhwqkUrahjaodhsngtzwtF+RFHEjiaUdYaP8I.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'host04,192.0.2.104' (ED25519) to the
list of known hosts.

Quando si digita yes per accettare la connessione al server, il client aggiunge la chiave host pubblica del server al file $HOME/.ssh/known_hosts. Al successivo collegamento al server remoto, il client confronta la chiave aggiunta a $HOME/.ssh/known_hosts con quella fornita dal server. Se le chiavi non corrispondono, viene visualizzato un avviso, ad esempio:


...
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the ED25519 key sent by the remote host is
SHA256:fingerprint.
Please contact your system administrator.
Add correct host key in /home/user/.ssh/known_hosts to get rid of this message.
Offending ED25519 key in /home/user/.ssh/known_hosts:1
Host key for ipa has changed and you have requested strict checking.
Host key verification failed
...

A meno che la chiave host del server remoto non sia stata modificata per un motivo noto, ad esempio un aggiornamento del software SSH o del server, evitare di connettersi a tale computer fino a quando non si è contattato l'amministratore per la situazione.

Per ulteriori informazioni, vedere la pagina del manuale ssh(1).

Impostazione delle opzioni di configurazione del client SSH per un host

Creare voci specifiche dell'host in $HOME/.ssh/config per connessioni semplificate.

È possibile configurare le voci host nel file $HOME/.ssh/config su un sistema client. Spesso i nomi utente non si allineano su sistemi diversi. A volte è possibile utilizzare una coppia di chiavi diversa dalla solita coppia di chiavi per un particolare sistema remoto. Per connettersi più facilmente con le credenziali corrette, è possibile aggiungere una voce host simile all'esempio seguente:

Host server1
  Hostname server1.example.com
  User remote_user
  IdentityFile $HOME/.ssh/id_sshkeyexample

Con la voce di configurazione fornita, l'utente può eseguire:

ssh server1

Il client SSH si connette al server remoto server1.example.com con il nome utente remote_user e utilizza il file della chiave privata all'indirizzo $HOME/.ssh/id_sshkeyexample.

Questa voce di configurazione consente di connettersi con le credenziali corrette ogni volta che si desidera connettersi. Senza la voce di configurazione, è necessario immettere quanto segue:

ssh -i $HOME/.ssh/id_sshkeyexample remote_user@server1.example.com 

È possibile utilizzare il file $HOME/.ssh/config per memorizzare altre opzioni di configurazione per qualsiasi sistema a cui ci si connette. Ad esempio, se si utilizzano spesso le opzioni ForwardAgent o ProxyJump, prendere in considerazione l'aggiunta di voci per ogni host in cui vengono utilizzate. Per ulteriori informazioni, consultare la pagina del manuale ssh_config(5).

Copia dei file tra i sistemi mediante i comandi SCP e SFTP

Trasferisci i file in modo sicuro con scp o in modo interattivo con sftp.

Uso di SCP

Nota

In Oracle Linux 9 e Oracle Linux 10 l'utility scp viene utilizzata per impostazione predefinita come SSH File Transfer Protocol. Per ulteriori informazioni, vedere la sezione Sicurezza nel capitolo Funzioni non più valide di Oracle Linux 9: Note di rilascio per Oracle Linux 9 e la pagina del manuale scp(1).

Il comando scp permette di copiare file o directory tra i sistemi. La scp stabilisce una connessione, copia i file e chiude la connessione.

Gli esempi seguenti mostrano come utilizzare il comando scp.

  • Caricamento di un file locale in un sistema remoto

    scp [options] local_file [user @]host[: remote_file]

    Gli esempi riportati di seguito mostrano come caricare un file utilizzando scp.

    • Copiare testfile nella directory home in host04.

      scp testfile host04:
    • Copiare testfile nella stessa directory, ma cambiarne il nome in new_testfile.

      scp testfile host04:new_testfile
  • Download di un file da un sistema remoto al sistema locale

    scp [options] [user@]host[:remote_file] local_file
  • Copia dei file in modo ricorsivo

    L'opzione -r copia in modo ricorsivo il contenuto delle directory.

    Ad esempio, per copiare la directory remdir e il relativo contenuto dalla directory home su host04 remoto nella directory home locale, digitare:

    scp -r host04:/home/user/remdir $HOME

    Si noti che l'espansione della shell della variabile $HOME può generare percorsi di file non previsti se utilizzati con il comando scp per specificare un percorso su un host remoto. Utilizzare sempre il percorso completo del file remoto con un comando scp.

Uso di SFTP

Il comando sftp è un'alternativa sicura al comando ftp utilizzato per trasferire i file tra i sistemi. A differenza del comando scp, il comando sftp fornisce funzionalità per sfogliare il file system sul server remoto prima di copiare qualsiasi file.

Per aprire una connessione FTP a un sistema remoto tramite SSH, utilizzare il comando seguente:

sftp [options] [user@]host

Ad esempio, è possibile aprire una connessione FTP al sistema, host04, come indicato di seguito.

sftp host04
Connecting to host04...
guest@host04’s password: password
sftp>

Digitare i comandi sftp al prompt sftp>.

Nell'esempio seguente, il comando put viene utilizzato per caricare il file newfile dal sistema locale al sistema remoto, quindi viene utilizzato il comando ls per elencarlo.

sftp> put newfile
Uploading newfile to /home/guest/newfile
foo                                           100% 1198     1.2KB/s   00:01    
sftp> ls newfile
newfile        

Digitare help o ? per visualizzare un elenco dei comandi disponibili. Digitare bye, exit o quit per chiudere la connessione e uscire dalla sessione interattiva sftp.

Per ulteriori informazioni, vedere le pagine del manuale ssh(1) e sftp(1).

Utilizzo dell'agente chiave SSH per ricordare le passphrase

Caricare le chiavi private nell'agente SSH in modo da immettere le passphrase una sola volta per sessione.

Utilizzare l'agente chiave SSH per immettere le passphrase per una qualsiasi delle chiavi SSH una sola volta durante la sessione di login. In questo modo, si evita la scarsa pratica di sicurezza della creazione di chiavi SSH senza passphrase.

  1. Dopo aver eseguito il login, controllare che l'agente sia stata avviata.

    ps -ef | grep -i ssh-agent
    Se l'agente non viene avviato, avviarlo eseguendo il seguente comando:
    eval $(ssh-agent -s)
  2. Eseguire il comando ssh-add per aggiungere una qualsiasi delle chiavi SSH all'agente. Ad esempio:

    ssh-add $HOME/.ssh/id_sshkey

    Il comando richiede la passphrase della chiave. La passphrase viene applicata durante l'intera sessione di login. Se si utilizza la chiave per connettersi a un altro sistema, il prompt di una passphrase non viene più visualizzato.

    Nota

    Il messaggio di errore Could not open a connection to your authentication agent indica che l'agente potrebbe non essere in esecuzione.

  3. Ripetere il comando per ogni chiave che si desidera aggiungere.

  4. Dopo aver aggiunto le chiavi all'agente, è possibile aprire connessioni SSH a qualsiasi sistema in cui la chiave pubblica accoppiata è configurata nel file authorized_keys, senza che venga richiesta una passphrase. Questo comportamento si applica anche a tutti gli script eseguiti come utente.

Utilizzo dell'inoltro dell'agente SSH per l'accesso tramite un host bastion

Inoltrare l'agente SSH tramite host di salto senza copiare le chiavi private nei sistemi remoti.

Attenzione

Abilitare l'inoltro degli agenti con cautela. Gli utenti con privilegi escalati sull'host remoto possono accedere all'agente tramite la sessione SSH inoltrata. Anche se gli utenti malintenzionati non possono accedere direttamente alle chiavi, possono dirottare la sessione dell'agente e utilizzare le chiavi nell'agente per connettersi ad altri sistemi. Se si sta eseguendo la connessione a un sistema che potrebbe avere utenti non affidabili, evitare di utilizzare l'inoltro agente.

SSH Agent Forwarding è un potente strumento che consente di mantenere centralizzate e sicure le chiavi private. Evitare di copiare il più possibile le chiavi private in altri sistemi. SSH Agent Forwarding consente di connettersi a un sistema remoto e quindi utilizzare il client SSH su tale sistema per connettersi a un altro sistema utilizzando la stessa autenticazione basata su chiave, ma senza dover copiare la chiave privata nell'host a cui si è connessi in precedenza.

Configurazione lato server

Modificare il file /etc/ssh/sshd_config per configurare l'inoltro dell'agente SSH. Nel server verificare il parametro AllowAgentForwarding, che attiva l'inoltro dell'agente SSH ed è abilitato per impostazione predefinita.

Configurazione client

Per abilitare questa funzionalità, è necessario utilizzare l'opzione ForwardAgent quando si effettua una connessione a un sistema intermedio nella catena di host a cui ci si connette. È inoltre necessario disporre della chiave privata già caricata nell'agente SSH sull'host client primario. Vedere Utilizzo dell'agente chiave SSH per ricordare le passphrase.

Per utilizzare l'inoltro dell'agente SSH:

  1. Verificare che l'agente SSH sia in esecuzione e che la chiave SSH sia caricata. Eseguire il comando seguente sul sistema client per visualizzare le chiavi caricate dall'agente:
    ssh-add -L
  2. Connettersi a un host utilizzando l'opzione ForwardAgent=yes:
    ssh -o ForwardAgent=yes server1.example.com
  3. Utilizzare il client SSH sull'host remoto per connettersi a un altro server con la chiave pubblica configurata nel relativo authorized_keys:
    ssh server2.example.com

Se si utilizza spesso questa opzione per un determinato server, è consigliabile aggiungere l'opzione ForwardAgent a una voce di configurazione Host nel file $HOME/.ssh/config. Per ulteriori informazioni, vedere Impostazione delle opzioni di configurazione del client SSH per un host.

Uso di ProxyJump per l'accesso tramite un host Jump

Instradare le connessioni SSH tramite gli host bastion con l'opzione ProxyJump.

L'inoltro dell'agente SSH consente ai client di connettersi da un server all'altro utilizzando l'autenticazione basata su chiavi senza copiare la chiave privata in ciascun server della catena. Questo approccio non è considerato una buona pratica di sicurezza, perché gli utenti con i privilegi appropriati sul server remoto potrebbero dirottare l'agente e usarlo per connettersi ad altri sistemi senza richiedere l'autenticazione.

Utilizzare l'opzione ProxyJump nel client OpenSSH per configurare l'accesso ai server remoti utilizzando gli host bastion e jump. La funzionalità ProxyJump funziona in modo simile a un tunnel SSH o a una porta in avanti, in quanto trasmette tutto il traffico direttamente attraverso l'host di salto. A differenza dell'inoltro delle porte, ProxyJump non richiede la configurazione lato server, pertanto è richiesto solo l'accesso SSH all'host di salto.

Configurazione di ProxyJump

Definire gli host ProxyJump in $HOME/.ssh/config o nella riga di comando.

Gli host Jump vengono configurati nel file $HOME/.ssh/config. Nell'esempio seguente, l'host di salto in jumphost.example.com è connesso alla rete interna e passa all'host in internal.example.com:

# File $HOME/.ssh/config with example of ProxyJump configuration

Host myjumphost
  HostName jumphost.example.com 

Host myremotehost
  HostName internal.example.com 
  ProxyJump myjumphost

Per connettersi all'host remoto tramite il server di salto utilizzando il file $HOME/.ssh/config precedente, eseguire il comando seguente:

ssh myremotehost

Se si sta eseguendo la connessione spontanea agli host remoti e non si dispone delle impostazioni ProxyJump configurate nel file $HOME/.ssh/config, è possibile specificare i dettagli di salto e host remoto richiesti utilizzando le seguenti opzioni di comando:

  • Utilizzo di ssh -J

    Il flag -J viene utilizzato per specificare le informazioni ProxyJump nella riga di comando. Ad esempio, è possibile eseguire:

    ssh -J jumphost.example.com internal.example.com
  • Utilizzo di ssh -o

    Il flag -o fornisce un metodo più generale (non limitato alla configurazione ProxyJump) che può essere utilizzato per passare le opzioni al comando ssh nel formato che verrebbe utilizzato nel file $HOME/.ssh/config. Ad esempio, è possibile eseguire:

    ssh -o 'ProxyJump=jumphost.example.com' internal.example.com

Per ulteriori informazioni, vedere Impostazione delle opzioni di configurazione del client SSH per un host e le pagine dei manuali ssh(1) e ssh_config(5).

Utilizzo dell'inoltro X11 per il caricamento di applicazioni grafiche remote

Abilitare l'inoltro X11 per visualizzare le applicazioni GUI remote su un desktop locale.

L'inoltro X11 consente all'utente di avviare applicazioni grafiche installate su un sistema Linux remoto in modo che vengano visualizzate nell'ambiente desktop del sistema locale. Il sistema remoto non deve avere un server X11 o un ambiente desktop grafico in esecuzione, ma il sistema locale deve avere un servizio compatibile con X11 in esecuzione.

Configurazione lato server

  1. Modificare il file /etc/ssh/sshd_config per abilitare l'inoltro X11. Sul server, verificare i seguenti parametri:

    X11Inoltro

    Consente l'inoltro X11. Se omesso, il valore predefinito è no. Per abilitare l'inoltro X11, aggiungere una voce che imposta il valore per questo parametro su yes.

  2. Se si modifica il file di configurazione, è necessario riavviare il servizio per rendere effettiva la modifica:

    sudo systemctl restart sshd
  3. Il sistema remoto deve inoltre supportare l'esecuzione delle applicazioni X11 e autenticare le sessioni X11. Il pacchetto xorg-x11-xauth è richiesto a questo scopo.

    dnf install xorg-x11-xauth
    Se non è mai stata eseguita un'applicazione grafica sul server remoto, la prima volta che si esegue la connessione al server remoto utilizzando l'inoltro X11, viene visualizzato un messaggio di avvertenza:
    /usr/bin/xauth: file /home/user/.Xauthority does not exist

    È possibile ignorare questo avviso poiché il file .Xauthority viene creato automaticamente.

Configurazione client

  1. Utilizzare l'opzione -Y con il client SSH quando ci si connette a un server remoto:

    ssh -Y user@server1.example.com
  2. Eseguire un'applicazione grafica sulla connessione SSH digitando il comando direttamente dal terminale SSH. Ad esempio, se gedit è installato sul sistema remoto, è possibile eseguire il comando seguente:

    gedit &
    Suggerimento

    Utilizzare l'operatore &, come mostrato nell'esempio precedente, per avviare il processo in background in modo che il terminale rimanga disponibile.

Impostazione dell'inoltro porta su SSH

Creare tunnel SSH per l'inoltro delle porte locale, dinamico o inverso.

L'inoltro della porta SSH crea un tunnel SSH cifrato tra un client e un sistema server.

Sono disponibili tre tipi di inoltro della porta SSH:

Perché utilizzare il port forwarding?

L'inoltro della porta consente ai server remoti di accedere ai dispositivi all'interno di una rete LAN (Local Area Network) privata e al contrario.

È possibile utilizzare l'inoltro delle porte per accedere a un servizio non esposto all'interfaccia di rete pubblica. È possibile impostare una porta locale di inoltro per accedere a un servizio (ad esempio un database) su un server remoto. Il database sul server non è esposto all'interfaccia di rete pubblica, ma è possibile creare un tunnel da un computer locale alla porta interna del database server. È quindi possibile connettersi a localhost e tutto il traffico verrà inoltrato attraverso il tunnel SSH al database remoto.

È possibile utilizzare l'inoltro della porta inversa per concedere a un utente esterno alla rete locale l'accesso a un servizio interno. Ad esempio, è possibile mostrare a un altro sviluppatore un'applicazione Web sviluppata sul computer locale. Poiché il computer non dispone di un IP pubblico, l'altro sviluppatore non può accedere all'applicazione su Internet. Tuttavia, se si ha accesso a un server SSH remoto, è possibile impostare l'inoltro della porta inversa per fornire l'accesso dello sviluppatore.

Configurazione lato server

Modificare il file /etc/ssh/sshd_config per configurare l'inoltro della porta SSH. Sul server verificare almeno i seguenti parametri:

  • AllowTCPForwarding

    Consente l'inoltro delle porte TCP. Se omesso, l'impostazione predefinita è yes che abilita gli inoltri di porte TCP singole e il proxy SOCKS

  • AllowStreamLocalForwarding

    Consente l'inoltro dei socket di dominio UNIX. Se omesso, l'impostazione predefinita è yes.

Inoltro porta locale

Per creare un tunnel in avanti TCP diretto, utilizzare l'opzione -L ssh:

ssh -L [bind_address:]port:destination:destination_port [user@]remote_ssh_server
  • bind_address è facoltativo e assegna un'interfaccia locale per l'ascolto delle connessioni. Se omesso, ssh si associa solo alle interfacce di loopback. Per eseguire l'associazione a tutte le interfacce, è possibile utilizzare 0.0.0.0 o ::.
  • port: il numero di porta locale. È possibile utilizzare un numero di porta qualsiasi maggiore di 1024.
  • destination: l'IP o il nome host del computer di destinazione. Se la destinazione si trova sul server remoto stesso, è possibile utilizzare localhost.
  • destination_port - Porta nel computer di destinazione.
  • [user@]remote_ssh_server: l'indirizzo IP dell'utente SSH remoto e del server.

Ad esempio, è possibile eseguire:

ssh -L 8080:localhost:8888 user@192.168.1.20

Questo comando apre una connessione SSH al server remoto all'indirizzo 192.168.1.20 e apre un tunnel alla porta localhost 8888.

Inoltro porta dinamico

Utilizzare l'inoltro dinamico delle porte per fare in modo che il client SSH ascolti una porta di associazione specificata e funga da server proxy SOCKS. Non è necessario specificare un host di destinazione come tutte le connessioni in entrata sulla porta specificata in avanti attraverso il tunnel a una porta dinamica nel computer di destinazione.

Per creare una porta dinamica in avanti, utilizzare l'opzione -D ssh.

ssh -D [bind_address:]port [user@]remote_ssh_server

Inoltro porta inversa

Un tunnel inverso inoltra alla rete client locale qualsiasi connessione ricevuta sul server SSH remoto.

Per creare una porta inversa, utilizzare l'opzione -R ssh.

Per l'inoltro inverso della porta locale:

ssh -R [bind_address:]port:destination:destination_port [user@]remote_ssh_server

Per l'inoltro inverso della porta dinamica:

ssh -R [bind_address:]port [user@]remote_ssh_server