Essenziali di SSH: Lavorare con server, client e chiavi SSH

Introduzione

SSH è un protocollo sicuro utilizzato come principale metodo di connessione ai server Linux in remoto. Fornisce un’interfaccia basata su testo generando una shell remota. Dopo la connessione, tutti i comandi digitati nel terminale locale vengono inviati al server remoto ed eseguiti lì.

In questa guida in stile foglio di trucchi, copriremo alcuni modi comuni di connessione con SSH per raggiungere i tuoi obiettivi. Questo può essere utilizzato come un riferimento rapido quando hai bisogno di sapere come connetterti o configurare il tuo server in modi diversi.

Effettua il deploy delle tue applicazioni frontend da GitHub utilizzando la Piattaforma App di DigitalOcean. Lascia che DigitalOcean si concentri sullo scalare la tua app.

Come Utilizzare Questa Guida

  • Leggi prima la sezione Panoramica su SSH se non sei familiare con SSH in generale o stai appena iniziando.
  • Utilizza le sezioni successive che sono pertinenti a ciò che stai cercando di realizzare. La maggior parte delle sezioni non è basata su altre, quindi puoi utilizzare gli esempi seguenti indipendentemente.
  • Usa il menu di navigazione a sinistra di questa pagina (con ampiezza di pagina ampia) o la funzione di ricerca del tuo browser per individuare le sezioni di cui hai bisogno.
  • Copia e incolla gli esempi di comando forniti, sostituendo i valori in evidenza con i tuoi valori.

Panoramica di SSH

Il modo più comune per connettersi a un server Linux remoto è tramite SSH. SSH sta per Secure Shell e fornisce un modo sicuro e protetto per eseguire comandi, apportare modifiche e configurare servizi in remoto. Quando ti connetti tramite SSH, accedi utilizzando un account che esiste sul server remoto.

Come funziona SSH

Quando ti connetti tramite SSH, verrai lasciato in una sessione shell, che è un’interfaccia basata su testo in cui puoi interagire con il tuo server. Per la durata della tua sessione SSH, tutti i comandi che inserisci nel terminale locale vengono inviati attraverso un tunnel SSH crittografato ed eseguiti sul tuo server.

La connessione SSH è implementata utilizzando un modello client-server. Ciò significa che per stabilire una connessione SSH, la macchina remota deve eseguire un software chiamato demone SSH. Questo software ascolta le connessioni su una porta di rete specifica, autentica le richieste di connessione e avvia l’ambiente appropriato se l’utente fornisce le credenziali corrette.

Il computer dell’utente deve avere un client SSH. Si tratta di un software che sa come comunicare utilizzando il protocollo SSH e può ricevere informazioni sull’host remoto a cui connettersi, l’username da utilizzare e le credenziali che dovrebbero essere passate per l’autenticazione. Il client può anche specificare determinati dettagli sul tipo di connessione che desidera stabilire.

Come SSH autentica gli utenti

I client generalmente si autenticano utilizzando password (meno sicure e non raccomandate) o chiavi SSH, che sono molto sicure.

Le autenticazioni con password sono crittografate e sono facili da comprendere per gli utenti nuovi. Tuttavia, bot automatizzati e utenti malintenzionati spesso cercano ripetutamente di autenticarsi ad account che consentono l’accesso basato su password, il che può portare a compromissioni della sicurezza. Per questo motivo, raccomandiamo sempre di configurare l’autenticazione basata su chiavi SSH per la maggior parte delle configurazioni.

Le chiavi SSH sono un insieme di chiavi crittografiche che possono essere utilizzate per l’autenticazione. Ogni set contiene una chiave pubblica e una chiave privata. La chiave pubblica può essere condivisa liberamente senza preoccupazioni, mentre la chiave privata deve essere custodita attentamente e mai esposta a nessuno.

Per autenticarsi usando le chiavi SSH, un utente deve avere una coppia di chiavi SSH sul proprio computer locale. Sul server remoto, la chiave pubblica deve essere copiata in un file all’interno della directory home dell’utente in ~/.ssh/authorized_keys. Questo file contiene un elenco di chiavi pubbliche, una per riga, autorizzate ad accedere a questo account.

Quando un client si connette all’host, desiderando utilizzare l’autenticazione mediante chiave SSH, informerà il server di questa intenzione e dirà al server quale chiave pubblica utilizzare. Il server quindi controlla il suo file authorized_keys per la chiave pubblica, genera una stringa casuale e la cifra utilizzando la chiave pubblica. Questo messaggio cifrato può essere decifrato solo con la chiave privata associata. Il server invierà questo messaggio cifrato al client per verificare se effettivamente ha la chiave privata associata.

Alla ricezione di questo messaggio, il client lo decifrerà utilizzando la chiave privata e combinerà la stringa casuale che viene rivelata con un ID di sessione negoziato precedentemente. Quindi genera un hash MD5 di questo valore e lo trasmette nuovamente al server. Il server aveva già il messaggio originale e l’ID di sessione, quindi può confrontare un hash MD5 generato da quei valori e determinare che il client deve avere la chiave privata.

Ora che sai come funziona SSH, possiamo iniziare a discutere alcuni esempi per mostrare diversi modi di lavorare con SSH.

Generazione e Lavoro con Chiavi SSH

Questa sezione tratterà di come generare le chiavi SSH su una macchina client e distribuire la chiave pubblica ai server dove devono essere utilizzate. Questa è una buona sezione con cui iniziare se non hai precedentemente generato chiavi a causa dell’aumentata sicurezza che consente per le future connessioni.

Generazione di una Coppia di Chiavi SSH

Generare una nuova coppia di chiavi pubbliche e private SSH sul tuo computer locale è il primo passo per autenticarsi con un server remoto senza una password. A meno che non ci sia una buona ragione per non farlo, dovresti sempre autenticarti utilizzando le chiavi SSH.

A number of cryptographic algorithms can be used to generate SSH keys, including RSA, DSA, and ECDSA. RSA keys are generally preferred and are the default key type.

Per generare una coppia di chiavi RSA sul tuo computer locale, digita:

  1. ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/demo/.ssh/id_rsa):

Questo prompt ti consente di scegliere la posizione in cui memorizzare la tua chiave privata RSA. Premi INVIO per lasciare questa impostazione come predefinita, che le memorizzerà nella directory nascosta .ssh nella directory home del tuo utente. Lasciare selezionata la posizione predefinita consentirà al tuo client SSH di trovare automaticamente le chiavi.

Enter passphrase (empty for no passphrase):
Enter same passphrase again:

Il prossimo prompt ti consente di inserire una passphrase di lunghezza arbitraria per proteggere la tua chiave privata. Per impostazione predefinita, dovrai inserire la passphrase che imposti qui ogni volta che utilizzi la chiave privata, come misura di sicurezza aggiuntiva. Sentiti libero di premere INVIO per lasciare questo campo vuoto se non desideri una passphrase. Tuttavia, tieni presente che ciò consentirà a chiunque ottenga il controllo della tua chiave privata di accedere ai tuoi server.

Se scegli di inserire una passphrase, nulla verrà visualizzato mentre la digiti. Questa è una precauzione di sicurezza.

Output
Your identification has been saved in /root/.ssh/id_rsa. Your public key has been saved in /root/.ssh/id_rsa.pub. The key fingerprint is: 8c:e9:7c:fa:bf:c4:e5:9c:c9:b8:60:1f:fe:1c:d3:8a root@here The key's randomart image is: +--[ RSA 2048]----+ | | | | | | | + | | o S . | | o . * + | | o + = O . | | + = = + | | ....Eo+ | +-----------------+

Questa procedura ha generato una coppia di chiavi SSH RSA, situata nella directory nascosta .ssh all’interno della directory home del tuo utente. Questi file sono:

  • ~/.ssh/id_rsa: La chiave privata. NON CONDIVIDERE QUESTO FILE!
  • ~/.ssh/id_rsa.pub: La chiave pubblica associata. Questa può essere condivisa liberamente senza conseguenze.

Genera una Coppia di Chiavi SSH con un Numero Maggiore di Bit

Le chiavi SSH sono di 2048 bit per impostazione predefinita. Questo è generalmente considerato sufficiente per la sicurezza, ma puoi specificare un numero maggiore di bit per ottenere una chiave più resistente.

Per fare ciò, includi l’argomento -b con il numero di bit desiderato. La maggior parte dei server supporta chiavi con una lunghezza di almeno 4096 bit. Le chiavi più lunghe potrebbero non essere accettate per motivi di protezione DDOS:

  1. ssh-keygen -b 4096

Se hai creato in precedenza una chiave diversa, ti verrà chiesto se desideri sovrascrivere la tua chiave precedente:

Overwrite (y/n)?

Se scegli “sì”, la tua chiave precedente verrà sovrascritta e non sarai più in grado di accedere ai server utilizzando quella chiave. Per questo motivo, assicurati di sovrascrivere le chiavi con cautela.

Rimozione o Modifica della Passphrase su una Chiave Privata

Se hai generato una passphrase per la tua chiave privata e desideri modificarla o rimuoverla, puoi farlo facilmente.

Nota: Per modificare o rimuovere la passphrase, devi conoscere la passphrase originale. Se hai perso la passphrase della chiave, non c’è alcun rimedio e dovrai generare una nuova coppia di chiavi.

Per modificare o rimuovere la passphrase, basta digitare:

  1. ssh-keygen -p
Enter file in which the key is (/root/.ssh/id_rsa):

Puoi digitare la posizione della chiave che desideri modificare o premere INVIO per accettare il valore predefinito:

Enter old passphrase:

Inserisci la vecchia passphrase che desideri cambiare. Ti verrà quindi chiesta una nuova passphrase:

Enter new passphrase (empty for no passphrase):
Enter same passphrase again:

Qui, inserisci la tua nuova passphrase o premi INVIO per rimuovere la passphrase.

Visualizzazione dell’Impronta Digitale della Chiave SSH

Ogni coppia di chiavi SSH condivide una singola “impronta crittografica” che può essere utilizzata per identificare univocamente le chiavi. Ciò può essere utile in una varietà di situazioni.

Per scoprire l’impronta di una chiave SSH, digitare:

  1. ssh-keygen -l
Enter file in which the key is (/root/.ssh/id_rsa):

È possibile premere INVIO se quella è la posizione corretta della chiave, altrimenti inserire la posizione corretta. Ti verrà restituita una stringa che contiene la lunghezza in bit della chiave, l’impronta, l’account e l’host per cui è stata creata, e l’algoritmo utilizzato:

Output
4096 8e:c4:82:47:87:c2:26:4b:68:ff:96:1a:39:62:9e:4e demo@test (RSA)

Copiare la propria chiave pubblica SSH su un server con SSH-Copy-ID

Per copiare la propria chiave pubblica su un server, consentendo l’autenticazione senza password, è possibile adottare diversi approcci.

Se attualmente si dispone di un accesso SSH basato su password configurato per il proprio server e si ha l’utilità ssh-copy-id installata, questo è un processo semplice. Lo strumento ssh-copy-id è incluso in molti pacchetti OpenSSH delle distribuzioni Linux, quindi è molto probabile che sia installato per impostazione predefinita.

Se si dispone di questa opzione, è possibile trasferire facilmente la propria chiave pubblica digitando:

  1. ssh-copy-id username@remote_host

Ciò richiederà la password dell’account utente sul sistema remoto:

The authenticity of host '111.111.11.111 (111.111.11.111)' can't be established.
ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
[email protected]'s password:

Dopo aver digitato la password, il contenuto della propria chiave ~/.ssh/id_rsa.pub verrà aggiunto alla fine del file ~/.ssh/authorized_keys dell’account utente:

Output
Number of key(s) added: 1 Now try logging into the machine, with: "ssh '[email protected]'" and check to make sure that only the key(s) you wanted were added.

Ora puoi accedere a quell’account senza password:

  1. ssh username@remote_host

Copiare la tua chiave pubblica SSH su un server senza SSH-Copy-ID

Se non hai l’utilità ssh-copy-id disponibile, ma hai comunque accesso SSH basato su password al server remoto, puoi copiare il contenuto della tua chiave pubblica in un modo diverso.

Puoi stampare il contenuto della chiave e reindirizzarlo nel comando ssh. Sul lato remoto, puoi assicurarti che la directory ~/.ssh esista, e quindi aggiungere il contenuto reindirizzato nel file ~/.ssh/authorized_keys:

  1. cat ~/.ssh/id_rsa.pub | ssh username@remote_host "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"

Ti verrà chiesto di fornire la password per l’account remoto:

The authenticity of host '111.111.11.111 (111.111.11.111)' can't be established.
ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe.
Are you sure you want to continue connecting (yes/no)? yes
[email protected]'s password:

Dopo aver inserito la password, la tua chiave verrà copiata, consentendoti di accedere senza password:

  1. ssh username@remote_IP_host

Copiare la tua chiave pubblica SSH su un server manualmente

Se non hai accesso SSH basato su password disponibile, dovrai aggiungere manualmente la tua chiave pubblica al server remoto.

Sul tuo computer locale, puoi trovare il contenuto del tuo file di chiave pubblica digitando:

  1. cat ~/.ssh/id_rsa.pub
Output
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCqql6MzstZYh1TmWWv11q5O3pISj2ZFl9HgH1JLknLLx44+tXfJ7mIrKNxOOwxIxvcBF8PXSYvobFYEZjGIVCEAjrUzLiIxbyCoxVyle7Q+bqgZ8SeeM8wzytsY+dVGcBxF6N4JS+zVk5eMcV385gG3Y6ON3EG112n6d+SMXY0OEBIcO6x+PnUSGHrSgpBgX7Ks1r7xqFa7heJLLt2wWwkARptX7udSq05paBhcpB0pHtA1Rfz3K2B+ZVIpSDfki9UVKzT8JUmwW6NNzSgxUfQHGwnW7kj4jp4AT0VZk3ADw497M2G/12N0PPB5CnhHf7ovgy6nL1ikrygTKRFmNZISvAcywB9GVqNAVE+ZHDSCuURNsAInVzgYo9xgJDW8wUw2o8U77+xiFxgI5QSZX3Iq7YLMgeksaO4rBJEa54k8m5wEiEE1nUhLuJ0X/vh2xPff6SQ1BL/zkOhvJCACK6Vb15mDOeCSq54Cr7kvS46itMosi/uS66+PujOO+xt/2FWYepz6ZlN70bRly57Q06J+ZJoc9FfBCbCyYH7U/ASsmY095ywPsBo1XQ9PqhnN1/YOorJ068foQDNVpm146mUpILVxmq41Cj55YKHEazXGsdBIbXWhcrRf4G2fJLRcGUr9q8/lERo9oxRm5JFX6TCmj6kmiFqv+Ow9gI0x8GvaQ== demo@test

Puoi copiare questo valore e incollarlo manualmente nella posizione appropriata sul server remoto. Dovrai accedere al server remoto attraverso altri mezzi (come la console web di DigitalOcean).

Sul server remoto, crea la directory ~/.ssh se non esiste già:

  1. mkdir -p ~/.ssh

In seguito, puoi creare o aggiungere il file ~/.ssh/authorized_keys digitando:

  1. echo public_key_string >> ~/.ssh/authorized_keys

Ora dovresti essere in grado di accedere al server remoto senza password.

Istruzioni di base per la connessione

La seguente sezione coprirà alcuni concetti di base su come connettersi a un server con SSH.

Connessione a un server remoto

Per connettersi a un server remoto e aprire una sessione shell, puoi utilizzare il comando ssh.

La forma più semplice assume che il tuo nome utente sulla tua macchina locale sia lo stesso di quello sul server remoto. Se è così, puoi connetterti usando:

  1. ssh remote_host

Se il tuo nome utente è diverso sul server remoto, devi passare il nome utente remoto in questo modo:

  1. ssh username@remote_host

La prima volta che ti colleghi a un nuovo host, vedrai un messaggio simile a questo:

The authenticity of host '111.111.11.111 (111.111.11.111)' can't be established.
ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe.
Are you sure you want to continue connecting (yes/no)? yes

Digitare per accettare l’autenticità dell’host remoto.

Se si sta utilizzando l’autenticazione tramite password, verrà richiesta la password per l’account remoto qui. Se si stanno utilizzando chiavi SSH, verrà richiesta la passphrase della chiave privata, se impostata, altrimenti si effettuerà l’accesso automaticamente.

Eseguire un singolo comando su un server remoto

Per eseguire un singolo comando su un server remoto anziché avviare una sessione della shell, è possibile aggiungere il comando dopo le informazioni di connessione, in questo modo:

  1. ssh username@remote_host command_to_run

Questo si collegherà all’host remoto, autenticandosi con le proprie credenziali, ed eseguirà il comando specificato. La connessione si chiuderà immediatamente dopo.

Accesso a un server con una porta diversa

Per impostazione predefinita, il demone SSH su un server viene eseguito sulla porta 22. Il client SSH assumerà che questo sia il caso quando si tenta di connettersi. Se il server SSH è in ascolto su una porta non standard (come mostrato in una sezione successiva), sarà necessario specificare il nuovo numero di porta durante la connessione con il client.

Puoi farlo specificando il numero di porta con l’opzione -p:

  1. ssh -p port_num username@remote_host

Per evitare di dover fare questo ogni volta che accedi al tuo server remoto, puoi creare o modificare un file di configurazione nella directory ~/.ssh all’interno della directory home del tuo computer locale.

Modifica o crea il file ora digitando:

  1. nano ~/.ssh/config

Qui puoi impostare le opzioni di configurazione specifiche dell’host. Per specificare la nuova porta, utilizza un formato simile a questo:

~/.ssh/config
Host remote_alias
    HostName remote_host
    Port port_num

Questo ti permetterà di accedere senza specificare il numero di porta specifico sulla riga di comando.

Aggiunta delle tue chiavi SSH a un agente SSH per evitare di digitare la passphrase

Se hai una passphrase sulla tua chiave privata SSH, ti verrà richiesto di inserire la passphrase ogni volta che la usi per connetterti a un host remoto.

Per evitare di doverlo fare ripetutamente, puoi eseguire un agente SSH. Questa piccola utility memorizza la tua chiave privata dopo aver inserito la passphrase per la prima volta. Sarà disponibile per la durata della sessione del tuo terminale, consentendoti di connetterti in futuro senza dover reinserire la passphrase.

Questo è anche importante se devi inoltrare le tue credenziali SSH (mostrato in seguito).

Per avviare l’agente SSH, digita quanto segue nella sessione del terminale locale:

  1. eval $(ssh-agent)
Output
Agent pid 10891

Questo avvierà il programma agente e lo metterà in background. Ora devi aggiungere la tua chiave privata all’agente, in modo che possa gestire la tua chiave:

  1. ssh-add
Enter passphrase for /home/demo/.ssh/id_rsa:
Identity added: /home/demo/.ssh/id_rsa (/home/demo/.ssh/id_rsa)

Dovrai inserire la tua passphrase (se è impostata). Successivamente, il file di identità viene aggiunto all’agente, consentendoti di utilizzare la tua chiave per accedere senza dover reinserire nuovamente la passphrase.

Inoltro delle credenziali SSH per l’utilizzo su un server

Se desideri connetterti a un server senza password da un altro server, dovrai inoltrare le informazioni sulla tua chiave SSH. Questo ti permetterà di autenticarti su un altro server attraverso il server a cui sei connesso, utilizzando le credenziali sul tuo computer locale.

Per iniziare, devi avere avviato il tuo agente SSH e aggiunto la tua chiave SSH all’agente (vedi sopra). Dopo aver fatto ciò, devi connetterti al tuo primo server usando l’opzione -A. Questo inoltra le tue credenziali al server per questa sessione:

  1. ssh -A username@remote_host

Da qui, puoi accedere tramite SSH a qualsiasi altro host a cui la tua chiave SSH è autorizzata ad accedere. Ti connetterai come se la tua chiave SSH privata fosse situata su questo server.

Opzioni di configurazione lato server

Questa sezione contiene alcune opzioni comuni di configurazione lato server che possono influenzare il modo in cui il server risponde e quali tipi di connessioni sono consentite.

Disattivazione dell’autenticazione tramite password

Se hai le chiavi SSH configurate, testate e funzionanti correttamente, è probabilmente una buona idea disabilitare l’autenticazione tramite password. Questo impedirà a qualsiasi utente di accedere tramite SSH utilizzando una password.

Per farlo, connettiti al tuo server remoto e apri il file /etc/ssh/sshd_config con privilegi di root o sudo:

  1. sudo nano /etc/ssh/sshd_config

All’interno del file, cerca la direttiva PasswordAuthentication. Se è commentata, rimuovi il commento. Impostala su no per disabilitare gli accessi tramite password:

/etc/ssh/sshd_config
PasswordAuthentication no

Dopo aver apportato la modifica, salva e chiudi il file. Per implementare le modifiche, riavvia il servizio SSH.

Su Ubuntu/Debian:

  1. sudo service ssh restart

Su CentOS/Fedora:

  1. sudo service sshd restart

Ora, tutti gli account nel sistema non potranno effettuare l’accesso tramite SSH utilizzando le password.

Cambiare la porta su cui il demone SSH è in esecuzione

Alcuni amministratori suggeriscono di cambiare la porta predefinita su cui viene eseguito SSH. Questo può aiutare a diminuire il numero di tentativi di autenticazione a cui il tuo server è soggetto da parte di bot automatizzati.

Per cambiare la porta su cui il demone SSH è in ascolto, dovrai accedere al tuo server remoto. Apri il file sshd_config sul sistema remoto con privilegi di root, sia accedendo con quell’utente sia utilizzando sudo:

  1. sudo nano /etc/ssh/sshd_config

Una volta all’interno, puoi cambiare la porta su cui viene eseguito SSH trovando la specifica Port 22 e modificandola per riflettere la porta che desideri utilizzare. Ad esempio, per cambiare la porta a 4444, inserisci questo nel tuo file:

/etc/ssh/sshd_config
#Port 22
Port 4444

Salva e chiudi il file quando hai finito. Per implementare le modifiche, devi riavviare il demone SSH.

Su Ubuntu/Debian:

  1. sudo service ssh restart

Su CentOS/Fedora:

  1. sudo service sshd restart

Dopo il riavvio del demone, dovrai autenticarti specificando il numero di porta (dimostrato in una sezione precedente).

Limitare gli Utenti che Possono Connettersi tramite SSH

Per limitare esplicitamente gli account utente che possono accedere tramite SSH, puoi adottare diversi approcci, ognuno dei quali comporta la modifica del file di configurazione del demone SSH.

Sul tuo server remoto, apri questo file ora con privilegi di root o sudo:

  1. sudo nano /etc/ssh/sshd_config

Il primo metodo per specificare gli account che sono autorizzati a effettuare il login è utilizzare la direttiva AllowUsers. Cerca la direttiva AllowUsers nel file. Se non esiste, creala ovunque. Dopo la direttiva, elenca gli account utente che dovrebbero essere autorizzati a effettuare il login tramite SSH:

/etc/ssh/sshd_config
AllowUsers user1 user2

Salva e chiudi il file. Riavvia il demone per implementare le tue modifiche.

Su Ubuntu/Debian:

  1. sudo service ssh restart

Su CentOS/Fedora:

  1. sudo service sshd restart

Se ti senti più a tuo agio con la gestione dei gruppi, puoi utilizzare invece la direttiva AllowGroups. In tal caso, aggiungi semplicemente un singolo gruppo che dovrebbe avere accesso SSH (creeremo questo gruppo e aggiungeremo membri tra poco):

/etc/ssh/sshd_config
AllowGroups sshmembers

Salva e chiudi il file.

Ora puoi creare un gruppo di sistema (senza una directory home) corrispondente al gruppo che hai specificato digitando:

  1. sudo groupadd -r sshmembers

Assicurati di aggiungere tutti gli account utente di cui hai bisogno a questo gruppo. Ciò può essere fatto digitando:

  1. sudo usermod -a -G sshmembers user1
  2. sudo usermod -a -G sshmembers user2

Ora riavvia il demone SSH per implementare le tue modifiche.

Su Ubuntu/Debian:

  1. sudo service ssh restart

Su CentOS/Fedora:

  1. sudo service sshd restart

Disabilitazione del Login di Root

È spesso consigliabile disabilitare completamente il login di root tramite SSH dopo aver configurato un account utente SSH con i privilegi sudo.

Per farlo, apri il file di configurazione del demone SSH con privilegi di root o sudo sul tuo server remoto.

  1. sudo nano /etc/ssh/sshd_config

All’interno, cerca una direttiva chiamata PermitRootLogin. Se è commentata, decommentala. Cambia il valore in “no”:

/etc/ssh/sshd_config
PermitRootLogin no

Salva e chiudi il file. Per implementare le modifiche, riavvia il demone SSH.

Su Ubuntu/Debian:

  1. sudo service ssh restart

Su CentOS/Fedora:

  1. sudo service sshd restart

Consentire l’Accesso Root per Determinati Comandi

Ci sono alcuni casi in cui potresti voler disabilitare generalmente l’accesso root, ma abilitarlo per consentire a determinate applicazioni di funzionare correttamente. Un esempio di questo potrebbe essere una routine di backup.

Questo può essere realizzato tramite il file authorized_keys dell’utente root, che contiene le chiavi SSH autorizzate per utilizzare l’account.

Aggiungi la chiave dal tuo computer locale che desideri utilizzare per questo processo (ti consigliamo di creare una nuova chiave per ogni processo automatico) al file authorized_keys dell’utente root sul server. Noi lo dimostreremo con il comando ssh-copy-id qui, ma puoi utilizzare qualsiasi dei metodi di copia delle chiavi di cui discutiamo in altre sezioni:

  1. ssh-copy-id root@remote_host

Ora, accedi al server remoto. Dovremo regolare l’ingresso nel file authorized_keys, quindi aprilo con accesso root o sudo:

  1. sudo nano /root/.ssh/authorized_keys

All’inizio della riga con la chiave che hai caricato, aggiungi un command= elenco che definisce il comando per cui questa chiave è valida. Questo dovrebbe includere il percorso completo dell’eseguibile, oltre a eventuali argomenti:

/root/.ssh/authorized_keys
command="/path/to/command arg1 arg2" ssh-rsa ...

Salva e chiudi il file quando hai finito.

Ora, apri il file sshd_config con privilegi di root o sudo:

  1. sudo nano /etc/ssh/sshd_config

Trova la direttiva PermitRootLogin e cambia il valore in forced-commands-only. Questo permetterà solo ai login SSH con chiave di utilizzare root quando è stato specificato un comando per la chiave:

/etc/ssh/sshd_config
PermitRootLogin forced-commands-only

Salva e chiudi il file. Riavvia il demone SSH per implementare le tue modifiche.

Su Ubuntu/Debian:

  1. sudo service ssh restart

Su CentOS/Fedora:

  1. sudo service sshd restart

Inoltro della Visualizzazione delle Applicazioni X al Cliente

Il demone SSH può essere configurato per inoltrare automaticamente la visualizzazione delle applicazioni X sul server alla macchina client. Perché ciò funzioni correttamente, il client deve avere un sistema X windows configurato e abilitato.

Per abilitare questa funzionalità, accedi al tuo server remoto e modifica il file sshd_config come root o con privilegi sudo:

  1. sudo nano /etc/ssh/sshd_config

Cerca la direttiva X11Forwarding. Se è commentata, decommentala. Creala se necessario e imposta il valore su “yes”:

/etc/ssh/sshd_config
X11Forwarding yes

Salva e chiudi il file. Riavvia il demone SSH per implementare queste modifiche.

Su Ubuntu/Debian:

  1. sudo service ssh restart

Su CentOS/Fedora:

  1. sudo service sshd restart

Per connetterti al server e inoltrare la visualizzazione di un’applicazione, devi passare l’opzione -X dal client durante la connessione:

  1. ssh -X username@remote_host

Le applicazioni grafiche avviate sul server tramite questa sessione dovrebbero essere visualizzate sul computer locale. Le prestazioni potrebbero essere un po’ lente, ma è molto utile in caso di necessità.

Opzioni di configurazione lato client

Nella prossima sezione, ci concentreremo su alcune modifiche che è possibile apportare sul lato client della connessione.

Definizione delle informazioni di connessione specifiche del server

Sul tuo computer locale, puoi definire configurazioni individuali per alcuni o tutti i server a cui ti connetti. Queste possono essere memorizzate nel file ~/.ssh/config, che viene letto dal tuo client SSH ogni volta che viene chiamato.

Crea o apri questo file nel tuo editor di testo sul computer locale:

  1. nano ~/.ssh/config

All’interno, puoi definire singole opzioni di configurazione introducendo ognuna con una parola chiave Host, seguita da un alias. Sotto questo e indentato, puoi definire qualunque delle direttive trovate nella pagina di manuale di ssh_config:

  1. man ssh_config

Un esempio di configurazione sarebbe:

~/.ssh/config
Host testhost
    HostName your_domain
    Port 4444
    User demo

Potresti quindi connetterti a your_domain sulla porta 4444 utilizzando il nome utente demo semplicemente digitando:

  1. ssh testhost

Puoi anche usare caratteri jolly per corrispondere a più di un host. Tieni presente che le corrispondenze successive possono sovrascrivere quelle precedenti. Per questo motivo, dovresti mettere le corrispondenze più generali in cima. Ad esempio, potresti impostare per default tutte le connessioni per non consentire il forwarding di X, con un’override per your_domain avendo questo nel tuo file:

~/.ssh/config
Host *
    ForwardX11 no

Host testhost
    HostName your_domain
    ForwardX11 yes
    Port 4444
    User demo

Salva e chiudi il file quando hai finito.

Mantenere le Connessioni Attive per Evitare Timeout

Se ti trovi a essere disconnesso dalle sessioni SSH prima di essere pronto, è possibile che la tua connessione stia scadendo.

Puoi configurare il tuo client per inviare un pacchetto al server ogni tanto per evitare questa situazione:

Sul tuo computer locale, puoi configurare questo per ogni connessione modificando il tuo file ~/.ssh/config. Aprilo ora:

  1. nano ~/.ssh/config

Se non esiste già, in cima al file, definisci una sezione che corrisponderà a tutti gli host. Imposta il ServerAliveInterval su “120” per inviare un pacchetto al server ogni due minuti. Questo dovrebbe essere sufficiente per notificare al server di non chiudere la connessione:

~/.ssh/config
Host *
    ServerAliveInterval 120

Salva e chiudi il file quando hai finito.

Disabilitare il Controllo dell’Host

Per impostazione predefinita, ogni volta che ti connetti a un nuovo server, ti verrà mostrata l’impronta digitale della chiave host del demone SSH remoto.

The authenticity of host '111.111.11.111 (111.111.11.111)' can't be established.
ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe.
Are you sure you want to continue connecting (yes/no)? yes

Questo è configurato in modo che tu possa verificare l’autenticità dell’host a cui stai tentando di connetterti e individuare casi in cui un utente malintenzionato potrebbe cercare di mascherarsi da host remoto.

In certe circostanze, potresti desiderare di disabilitare questa funzione. Nota: Questo può essere un grosso rischio per la sicurezza, quindi assicurati di sapere cosa stai facendo se configuri il tuo sistema in questo modo.

Per apportare la modifica, apri il file ~/.ssh/config sul tuo computer locale:

  1. nano ~/.ssh/config

Se non esiste già, in cima al file, definisci una sezione che corrisponderà a tutti gli host. Imposta la direttiva StrictHostKeyChecking su no per aggiungere automaticamente nuovi host al file known_hosts. Imposta UserKnownHostsFile su /dev/null per non avvisare su host nuovi o modificati:

~/.ssh/config
Host *
    StrictHostKeyChecking no
    UserKnownHostsFile /dev/null

È possibile abilitare il controllo caso per caso invertendo tali opzioni per altri host. Il valore predefinito per StrictHostKeyChecking è ask:

~/.ssh/config
Host *
    StrictHostKeyChecking no
    UserKnownHostsFile /dev/null

Host testhost
    HostName your_domain
    StrictHostKeyChecking ask
    UserKnownHostsFile /home/demo/.ssh/known_hosts

Multiplexing SSH su una singola connessione TCP

Esistono situazioni in cui stabilire una nuova connessione TCP può richiedere più tempo di quanto si desideri. Se si effettuano più connessioni alla stessa macchina, è possibile sfruttare il multiplexing.

Il multiplexing SSH riutilizza la stessa connessione TCP per più sessioni SSH. Questo elimina parte del lavoro necessario per stabilire una nuova sessione, velocizzando potenzialmente le cose. Limitare il numero di connessioni può anche essere utile per altri motivi.

Per configurare il multiplexing, è possibile impostare manualmente le connessioni o configurare il client per utilizzare automaticamente il multiplexing quando disponibile. Qui dimostreremo la seconda opzione.

Per configurare il multiplexing, modificare il file di configurazione del client SSH sulla propria macchina locale:

  1. nano ~/.ssh/config

Se non si dispone già di una definizione di host jolly all’inizio del file, aggiungerne una ora (come Host *). Imposteremo i valori ControlMaster, ControlPath e ControlPersist per stabilire la nostra configurazione di multiplexing.

Il ControlMaster dovrebbe essere impostato su “auto” per consentire automaticamente la multiplexing se possibile. Il ControlPath stabilirà il percorso al socket di controllo. La prima sessione creerà questo socket e le sessioni successive saranno in grado di trovarlo perché è etichettato con nome utente, host e porta.

Impostare l’opzione ControlPersist su 1 permetterà alla connessione master iniziale di essere messa in background. Il 1 specifica che la connessione TCP dovrebbe terminare automaticamente un secondo dopo la chiusura dell’ultima sessione SSH:

/.ssh/config
Host *
    ControlMaster auto
    ControlPath ~/.ssh/multiplex/%r@%h:%p
    ControlPersist 1

Salva e chiudi il file quando hai finito. Ora, dobbiamo effettivamente creare la directory specificata nel percorso di controllo:

  1. mkdir ~/.ssh/multiplex

Ora, tutte le sessioni che vengono stabilite con la stessa macchina cercheranno di utilizzare il socket esistente e la connessione TCP. Quando l’ultima sessione viene chiusa, la connessione verrà interrotta dopo un secondo.

Se per qualche motivo è necessario bypassare temporaneamente la configurazione della multiplexing, è possibile farlo passando il flag -S con none:

  1. ssh -S none username@remote_host

Configurazione dei tunnel SSH

Instradare altri traffici attraverso un tunnel SSH sicuro è un ottimo modo per aggirare le restrizioni del firewall. È anche un ottimo modo per crittografare il traffico di rete altrimenti non crittografato.

Configurazione del tunneling locale verso un server

Le connessioni SSH possono essere utilizzate per instradare il traffico dai porti sull’host locale ai porti su un host remoto.

A local connection is a way of accessing a network location from your local computer through your remote host. First, an SSH connection is established to your remote host. On the remote server, a connection is made to an external (or internal) network address provided by the user and traffic to this location is tunneled to your local computer on a specified port.

Questo viene spesso utilizzato per instradare verso un ambiente di rete meno restrittivo aggirando un firewall. Un altro uso comune è quello di accedere a un’interfaccia web “solo localhost” da una posizione remota.

Per stabilire un tunnel locale verso il tuo server remoto, è necessario utilizzare il parametro -L durante la connessione e devi fornire tre pezzi di informazioni aggiuntive:

  • La porta locale a cui desideri accedere alla connessione instradata.
  • L’host a cui desideri che il tuo host remoto si colleghi.
  • La porta su cui desideri che il tuo host remoto si colleghi.

Questi vengono forniti, nell’ordine sopra (separati dai due punti), come argomenti al flag -L. Utilizzeremo anche il flag -f, che fa entrare SSH in background prima di eseguire e il flag -N, che non apre una shell o esegue un programma sul lato remoto.

Ad esempio, per connettersi a il_tuo_dominio sulla porta 80 sul tuo host remoto, rendendo la connessione disponibile sulla tua macchina locale sulla porta 8888, potresti digitare:

  1. ssh -f -N -L 8888:your_domain:80 username@remote_host

Ora, se punti il tuo browser web locale su 127.0.0.1:8888, dovresti vedere qualsiasi contenuto sia su il_tuo_dominio sulla porta 80.

A more general guide to the syntax is:

  1. ssh -L your_port:site_or_IP_to_access:site_port username@host

Poiché la connessione è in background, dovrai trovare il suo PID per terminarla. Puoi farlo cercando la porta che hai inoltrato:

  1. ps aux | grep 8888
Output
1001 5965 0.0 0.0 48168 1136 ? Ss 12:28 0:00 ssh -f -N -L 8888:your_domain:80 username@remote_host 1001 6113 0.0 0.0 13648 952 pts/2 S+ 12:37 0:00 grep --colour=auto 8888

Successivamente, puoi terminare il processo prendendo di mira il PID, che è il numero nella seconda colonna della riga che corrisponde al tuo comando SSH:

  1. kill 5965

Un’altra opzione è avviare la connessione senza il flag -f. Questo manterrà la connessione in primo piano, impedendoti di utilizzare la finestra del terminale per la durata dell’inoltro. Il vantaggio di questo è che puoi terminare facilmente il tunnel digitando CTRL-C.

Configurazione dell’Inoltro Remoto verso un Server

Le connessioni SSH possono essere utilizzate per instradare il traffico dalle porte sull’host locale alle porte su un host remoto.

In un tunnel remoto, viene stabilita una connessione a un host remoto. Durante la creazione del tunnel, viene specificata una porta remota. Questa porta, sull’host remoto, verrà quindi instradata a una combinazione di host e porta a cui si connette dal computer locale. Questo permetterà al computer remoto di accedere a un host tramite il tuo computer locale.

Questo può essere utile se hai bisogno di consentire l’accesso a una rete interna che è bloccata dalle connessioni esterne. Se il firewall consente le connessioni in uscita dalla rete, questo ti consentirà di connetterti a una macchina remota e instradare il traffico da quella macchina a una posizione nella rete interna.

Per stabilire un tunnel remoto verso il tuo server remoto, devi utilizzare il parametro -R durante la connessione e devi fornire tre pezzi di informazioni aggiuntive:

  • La porta a cui l’host remoto può accedere alla connessione tunnel.
  • L’host a cui desideri che il tuo computer locale si connetta.
  • La porta a cui desideri che il tuo computer locale si connetta.

Questi sono forniti, nell’ordine sopra indicato (separati dai due punti), come argomenti per il flag -R. Utilizzeremo anche il flag -f, che fa sì che SSH vada in background prima di eseguire e il flag -N, che non apre una shell o esegue un programma sul lato remoto.

Ad esempio, per connettersi a your_domain sulla porta 80 sul nostro computer locale, rendendo la connessione disponibile sul nostro host remoto alla porta 8888, potresti digitare:

  1. ssh -f -N -R 8888:your_domain:80 username@remote_host

Ora, sull’host remoto, aprendo un browser web su 127.0.0.1:8888 ti consentirebbe di vedere qualunque contenuto sia presente su your_domain sulla porta 80.

A more general guide to the syntax is:

  1. ssh -R remote_port:site_or_IP_to_access:site_port username@host

Dato che la connessione è in background, dovrai trovare il suo PID per terminarla. Puoi farlo cercando la porta che hai inoltrato:

  1. ps aux | grep 8888
Output
1001 5965 0.0 0.0 48168 1136 ? Ss 12:28 0:00 ssh -f -N -R 8888:your_domain:80 username@remote_host 1001 6113 0.0 0.0 13648 952 pts/2 S+ 12:37 0:00 grep --colour=auto 8888

Puoi quindi terminare il processo prendendo di mira il PID, che è il numero nella seconda colonna, della riga che corrisponde al tuo comando SSH:

  1. kill 5965

Un’altra opzione è avviare la connessione senza il flag -f. Questo manterrà la connessione in primo piano, impedendoti di utilizzare la finestra del terminale per la durata dell’inoltro. Il vantaggio di questo è che puoi facilmente interrompere il tunnel digitando CTRL-C.

Configurare l’inoltro dinamico verso un server remoto

Le connessioni SSH possono essere utilizzate per instradare il traffico dai porti sull’host locale ai porti su un host remoto.

A dynamic tunnel is similar to a local tunnel in that it allows the local computer to connect to other resources through a remote host. A dynamic tunnel does this by simply specifying a single local port. Applications that wish to take advantage of this port for tunneling must be able to communicate using the SOCKS protocol so that the packets can be correctly redirected at the other side of the tunnel.

Il traffico passato a questa porta locale verrà inviato all’host remoto. Da lì, il protocollo SOCKS verrà interpretato per stabilire una connessione con la posizione finale desiderata. Questa configurazione consente a un’applicazione compatibile con SOCKS di connettersi a qualsiasi numero di posizioni tramite il server remoto, senza tunnel statici multipli.

Per stabilire la connessione, passeremo il flag -D insieme alla porta locale in cui desideriamo accedere al tunnel. Utilizzeremo anche il flag -f, che fa sì che SSH vada in background prima di eseguire e il flag -N, che non apre una shell o esegue un programma sul lato remoto.

Ad esempio, per stabilire un tunnel sulla porta 7777, è possibile digitare:

  1. ssh -f -N -D 7777 username@remote_host

Da qui, puoi iniziare a puntare la tua applicazione consapevole di SOCKS (come un browser web), alla porta che hai selezionato. L’applicazione invierà le sue informazioni in un socket associato alla porta.

Il metodo per indirizzare il traffico alla porta SOCKS varierà a seconda dell’applicazione. Ad esempio, in Firefox, la posizione generale è Preferenze > Avanzate > Impostazioni > Configurazioni proxy manuali. In Chrome, è possibile avviare l’applicazione con il flag --proxy-server= impostato. È necessario utilizzare l’interfaccia localhost e la porta che hai inoltrato.

Dato che la connessione è in background, dovrai trovare il suo PID per eliminarla. Puoi farlo cercando la porta che hai inoltrato:

  1. ps aux | grep 8888
Output
1001 5965 0.0 0.0 48168 1136 ? Ss 12:28 0:00 ssh -f -N -D 7777 username@remote_host 1001 6113 0.0 0.0 13648 952 pts/2 S+ 12:37 0:00 grep --colour=auto 8888

Puoi quindi terminare il processo mirando al PID, che è il numero nella seconda colonna, della riga che corrisponde al tuo comando SSH:

  1. kill 5965

Un’altra opzione è avviare la connessione senza il flag -f. Questo manterrà la connessione in primo piano, impedendoti di utilizzare la finestra del terminale per la durata dell’inoltro. Il vantaggio di ciò è che puoi facilmente interrompere il tunnel digitando CTRL-C.

Utilizzo dei Codici di Escape SSH per Controllare le Connessioni

Anche dopo aver stabilito una sessione SSH, è possibile esercitare controllo sulla connessione dall’interno del terminale. Possiamo farlo con qualcosa chiamato codici di escape SSH, che ci consentono di interagire con il nostro software SSH locale da all’interno di una sessione.

Forzare una disconnessione dal lato client (Come uscire da una sessione bloccata o congelata)

Una delle funzionalità più utili di OpenSSH che passa largamente inosservata è la capacità di controllare certi aspetti della sessione dall’interno.

Questi comandi possono essere eseguiti iniziando con il carattere di controllo ~ all’interno di una sessione SSH. I comandi di controllo saranno interpretati solo se sono la prima cosa digitata dopo un nuovo riga, quindi premere sempre INVIO una o due volte prima di utilizzarne uno.

Uno dei controlli più utili è la capacità di avviare una disconnessione dal client. Le connessioni SSH vengono solitamente chiuse dal server, ma questo può essere un problema se il server sta riscontrando problemi o se la connessione è stata interrotta. Utilizzando una disconnessione dal lato client, la connessione può essere chiusa in modo pulito dal client.

Per chiudere una connessione dal lato client, utilizzare il carattere di controllo (~), seguito da un punto. Se la tua connessione sta avendo problemi, probabilmente ti troverai in quello che sembra essere una sessione terminale bloccata. Digitare i comandi nonostante la mancanza di feedback per eseguire una disconnessione dal lato client:

  1. [ENTER]
  2. ~.

La connessione dovrebbe chiudersi immediatamente, riportandoti alla tua sessione di shell locale.

Mettere una sessione SSH in background

Una delle caratteristiche più utili di OpenSSH che passa largamente inosservata è la capacità di controllare alcuni aspetti della sessione all’interno della connessione.

Questi comandi possono essere eseguiti a partire dal carattere di controllo ~ all’interno di una connessione SSH. I comandi di controllo verranno interpretati solo se sono la prima cosa digitata dopo un ritorno a capo, quindi premere sempre INVIO una o due volte prima di utilizzarne uno.

Una delle funzionalità che questo fornisce è quella di mettere una sessione SSH in background. Per farlo, è necessario fornire il carattere di controllo (~) e quindi eseguire la convenzionale combinazione di tasti per mandare un compito in background (CTRL-z):

  1. [ENTER]
  2. ~[CTRL-z]

Questo metterà la connessione in background, riportandoti alla tua sessione shell locale. Per tornare alla tua sessione SSH, puoi utilizzare i meccanismi di controllo dei compiti convenzionali.

Puoi immediatamente riattivare il tuo compito più recente mandato in background digitando:

  1. fg

Se hai più compiti in background, puoi vedere i compiti disponibili digitando:

  1. jobs
Output
[1]+ Stopped ssh username@some_host [2] Stopped ssh username@another_host

Puoi quindi portare uno qualsiasi dei compiti in primo piano utilizzando l’indice nella prima colonna con un segno di percentuale:

  1. fg %2

Modifica delle opzioni di inoltro porta su una connessione SSH esistente

Una delle funzionalità più utili di OpenSSH che passa largamente inosservata è la capacità di controllare alcuni aspetti della sessione all’interno della connessione.

Questi comandi possono essere eseguiti a partire dal carattere di controllo ~ all’interno di una connessione SSH. I comandi di controllo verranno interpretati solo se sono la prima cosa che viene digitata dopo un newline, quindi premere sempre INVIO una o due volte prima di usarne uno.

Una cosa che ciò consente è la modifica della configurazione di inoltro porta dopo che la connessione è stata già stabilita. Ciò consente di creare o eliminare regole di inoltro porta al volo.

Queste capacità fanno parte dell’interfaccia a riga di comando SSH, a cui è possibile accedere durante una sessione utilizzando il carattere di controllo (~) e “C”:

  1. [ENTER]
  2. ~C
ssh>

Ti verrà fornito un prompt dei comandi SSH, che ha un insieme molto limitato di comandi validi. Per visualizzare le opzioni disponibili, è possibile digitare -h da questo prompt. Se non viene restituito nulla, potrebbe essere necessario aumentare la verbosità dell’output SSH utilizzando ~v alcune volte:

  1. [ENTER]
  2. ~v
  3. ~v
  4. ~v
  5. ~C
  6. -h
Commands:
      -L[bind_address:]port:host:hostport    Request local forward
      -R[bind_address:]port:host:hostport    Request remote forward
      -D[bind_address:]port                  Request dynamic forward
      -KL[bind_address:]port                 Cancel local forward
      -KR[bind_address:]port                 Cancel remote forward
      -KD[bind_address:]port                 Cancel dynamic forward

Come puoi vedere, puoi facilmente implementare qualsiasi delle opzioni di inoltro utilizzando le opzioni appropriate (consulta la sezione sull’inoltro per ulteriori informazioni). Puoi anche distruggere un tunnel con il comando associato “kill” specificato con una “K” prima della lettera del tipo di inoltro. Ad esempio, per interrompere un inoltro locale (-L), potresti utilizzare il comando -KL. Dovrai fornire solo la porta per questo.

Quindi, per configurare un inoltro di porta locale, puoi digitare:

  1. [ENTER]
  2. ~C
  3. -L 8888:127.0.0.1:80

La porta 8888 sul tuo computer locale sarà ora in grado di comunicare con il server web sull’host a cui ti stai connettendo. Quando hai finito, puoi smantellare quell’inoltro digitando:

  1. [ENTER]
  2. ~C
  3. -KL 8888

Conclusione

Le istruzioni sopra dovrebbero coprire la maggior parte delle informazioni di cui la maggior parte degli utenti avrà bisogno riguardo a SSH nella vita quotidiana. Se hai altri suggerimenti o desideri condividere le tue configurazioni e metodi preferiti, sentiti libero di utilizzare i commenti qui sotto.

Source:
https://www.digitalocean.com/community/tutorials/ssh-essentials-working-with-ssh-servers-clients-and-keys