Ricerca nel sito web

Elementi essenziali di SSH: utilizzo di server, client e chiavi SSH


introduzione

SSH è un protocollo sicuro utilizzato come mezzo principale per connettersi 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 cheat sheet, tratteremo alcuni modi comuni per connettersi con SSH per raggiungere i tuoi obiettivi. Questo può essere utilizzato come riferimento rapido quando è necessario sapere come connettersi o configurare il server in modi diversi.

Come utilizzare questa guida

  • Leggi prima la sezione Panoramica SSH se non hai familiarità con SSH in generale o se hai appena iniziato.
  • Utilizza le sezioni successive applicabili a ciò che stai cercando di ottenere. La maggior parte delle sezioni non è basata su nessun'altra, quindi puoi utilizzare i seguenti esempi in modo indipendente.
  • Utilizza il menu Contenuti sul lato sinistro di questa pagina (a pagine larghe) o la funzione di ricerca del tuo browser per individuare le sezioni di cui hai bisogno.
  • Copia e incolla gli esempi della riga di comando forniti, sostituendo i valori evidenziati con i tuoi valori.

Panoramica SSH

Il modo più comune per connettersi a un server Linux remoto è tramite SSH. SSH è l'acronimo di Secure Shell e fornisce un modo sicuro e protetto per eseguire comandi, apportare modifiche e configurare i 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 trascinato in una sessione di shell, che è un'interfaccia basata su testo in cui puoi interagire con il tuo server. Per tutta la durata della tua sessione SSH, tutti i comandi che digiti nel tuo 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 genera l'ambiente appropriato se l'utente fornisce le credenziali corrette.

Il computer dell'utente deve disporre di 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, il nome utente da utilizzare e le credenziali da passare per l'autenticazione. Il cliente può anche specificare alcuni dettagli sul tipo di connessione che desidera stabilire.

Come SSH autentica gli utenti

I client generalmente eseguono l'autenticazione utilizzando password (meno sicure e sconsigliate) o chiavi SSH, che sono molto sicure.

Gli accessi con password sono crittografati e sono facili da capire per i nuovi utenti. Tuttavia, i bot automatizzati e gli utenti malintenzionati spesso tentano ripetutamente di autenticarsi su account che consentono accessi basati su password, il che può portare a compromissioni della sicurezza. Per questo motivo, consigliamo di configurare sempre l'autenticazione basata su chiave SSH per la maggior parte delle configurazioni.

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

Per eseguire l'autenticazione utilizzando le chiavi SSH, un utente deve disporre di una coppia di chiavi SSH sul proprio computer locale. Sul server remoto, la chiave pubblica deve essere copiata in un file all'interno della home directory 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 con chiave SSH, informerà il server di questo intento e dirà al server quale chiave pubblica utilizzare. Il server controlla quindi il suo file authorized_keys per la chiave pubblica, genera una stringa casuale e la crittografa utilizzando la chiave pubblica. Questo messaggio crittografato può essere decrittografato solo con la chiave privata associata. Il server invierà questo messaggio crittografato al client per verificare se dispone effettivamente della chiave privata associata.

Alla ricezione di questo messaggio, il client lo decrittograferà utilizzando la chiave privata e combinerà la stringa casuale rivelata con un ID di sessione negoziato in precedenza. Quindi genera un hash MD5 di questo valore e lo ritrasmette 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 dimostrare diversi modi di lavorare con SSH

Generazione e utilizzo delle chiavi SSH

Questa sezione tratterà come generare chiavi SSH su un computer client e distribuire la chiave pubblica ai server dove dovrebbero essere utilizzate. Questa è una buona sezione da cui iniziare se non hai precedentemente generato chiavi a causa della maggiore sicurezza che consente per le connessioni future.

Generazione di una coppia di chiavi SSH

La generazione di una nuova coppia di chiavi pubblica e privata SSH sul computer locale è il primo passo verso l'autenticazione con un server remoto senza password. A meno che non ci sia una buona ragione per non farlo, dovresti sempre autenticarti usando le chiavi SSH.

È possibile utilizzare numerosi algoritmi crittografici per generare chiavi SSH, inclusi RSA, DSA ed ECDSA. Le chiavi RSA sono generalmente preferite e sono il tipo di chiave predefinito.

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):

Questa richiesta ti consente di scegliere la posizione in cui archiviare la tua chiave privata RSA. Premi INVIO per lasciare questo come predefinito, che li memorizzerà nella directory nascosta .ssh nella home directory del tuo utente. Lasciare selezionata la posizione predefinita consentirà al client SSH di trovare automaticamente le chiavi.

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

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

Se scegli di inserire una passphrase, durante la digitazione non verrà visualizzato nulla. 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 RSA SSH, situata nella directory nascosta .ssh all'interno della home directory dell'utente. Questi file sono:

  • ~/.ssh/id_rsa: la chiave privata. NON CONDIVIDERE QUESTO FILE!
  • ~/.ssh/id_rsa.pub: la chiave pubblica associata. Questo può essere condiviso liberamente senza conseguenze.

Genera una coppia di chiavi SSH con un numero maggiore di bit

Le chiavi SSH sono 2048 bit per impostazione predefinita. Questo è generalmente considerato abbastanza buono per la sicurezza, ma è possibile specificare un numero maggiore di bit per una chiave più sicura.

Per fare ciò, includi l'argomento -b con il numero di bit che desideri. La maggior parte dei server supporta chiavi con una lunghezza di almeno 4096 bit. Chiavi più lunghe potrebbero non essere accettate ai fini della protezione DDOS:

  1. ssh-keygen -b 4096

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

Overwrite (y/n)?

Se scegli \yes, 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, è necessario conoscere la passphrase originale. Se hai perso la passphrase della chiave, non c'è ricorso e dovrai generare una nuova coppia di chiavi.

Per modificare o rimuovere la passphrase, digita semplicemente:

  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 modificare. Ti verrà quindi richiesta 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 digitale crittografica che può essere utilizzata per identificare in modo univoco le chiavi. Ciò può essere utile in una varietà di situazioni.

Per scoprire l'impronta digitale di una chiave SSH, digitare:

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

Puoi premere INVIO se quella è la posizione corretta della chiave, altrimenti inserisci la posizione rivista. Ti verrà fornita una stringa che contiene la lunghezza in bit della chiave, l'impronta digitale, l'account e l'host per cui è stato creato 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)

Copia della tua chiave SSH pubblica su un server con SSH-Copy-ID

Per copiare la tua chiave pubblica su un server, permettendoti di autenticarti senza una password, puoi adottare una serie di approcci.

Se al momento hai configurato l'accesso SSH basato su password al tuo server e hai installato l'utility ssh-copy-id, questo è un processo semplice. Lo strumento ssh-copy-id è incluso nei pacchetti OpenSSH di molte distribuzioni Linux, quindi molto probabilmente potrebbe essere installato per impostazione predefinita.

Se hai questa opzione, puoi trasferire facilmente la tua chiave pubblica digitando:

  1. ssh-copy-id username@remote_host

Questo ti chiederà 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
demo@111.111.11.111's password:

Dopo aver digitato la password, il contenuto della 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 'demo@111.111.11.111'" 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

Copia della tua chiave SSH pubblica su un server senza SSH-Copy-ID

Se non hai l'utility ssh-copy-id disponibile, ma hai ancora accesso SSH basato su password al server remoto, puoi copiare il contenuto della tua chiave pubblica in un altro modo.

Puoi emettere il contenuto della chiave e inserirlo nel comando ssh. Sul lato remoto, puoi assicurarti che la directory ~/.ssh esista, quindi aggiungere i contenuti reindirizzati 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
demo@111.111.11.111's password:

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

  1. ssh username@remote_IP_host

Copia manuale della chiave SSH pubblica su un server

Se non disponi di un accesso SSH basato su password, 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

È possibile 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

Successivamente, 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 connessione di base

La sezione seguente tratterà alcune delle nozioni di base su come connettersi a un server con SSH.

Connessione a un server remoto

Per connetterti a un server remoto e aprire lì una sessione shell, puoi usare il comando ssh.

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

  1. ssh remote_host

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

  1. ssh username@remote_host

La prima volta che ti connetti 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

Digita yes per accettare l'autenticità dell'host remoto.

Se stai utilizzando l'autenticazione tramite password, ti verrà richiesta qui la password per l'account remoto. Se stai utilizzando le chiavi SSH, ti verrà richiesta la passphrase della tua chiave privata se ne è impostata una, altrimenti verrai loggato automaticamente.

Esecuzione di un singolo comando su un server remoto

Per eseguire un singolo comando su un server remoto invece di generare una sessione shell, puoi 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, si autenticherà con le tue credenziali ed eseguirà il comando che hai specificato. La connessione verrà chiusa 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 tuo client SSH presumerà che questo sia il caso durante il tentativo di connessione. Se il tuo server SSH è in ascolto su una porta non standard (questo è dimostrato in una sezione successiva), dovrai specificare il nuovo numero di porta quando ti connetti con il tuo client.

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

  1. ssh -p port_num username@remote_host

Per evitare di dover eseguire questa operazione ogni volta che accedi al tuo server remoto, puoi creare o modificare un file di configurazione nella directory ~/.ssh all'interno della home directory 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 tua nuova porta, usa un formato come questo:

Host remote_alias
    HostName remote_host
    Port port_num

Ciò ti consentirà di accedere senza specificare il numero di porta specifico sulla riga di comando.

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

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

Per evitare di dover eseguire questa operazione ripetutamente, è possibile eseguire un agente SSH. Questa piccola utility memorizza la tua chiave privata dopo che hai inserito la passphrase per la prima volta. Sarà disponibile per la durata della sessione del terminale, consentendoti di connetterti in futuro senza reinserire la passphrase.

Questo è importante anche se devi inoltrare le tue credenziali SSH (mostrate più avanti).

Per avviare l'agente SSH, digitare 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 ne è impostata una). Successivamente, il tuo 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 da utilizzare su un server

Se desideri essere in grado di connetterti senza password a un server dall'interno di un altro server, dovrai inoltrare le informazioni sulla tua chiave SSH. Ciò ti consentirà di autenticarti su un altro server tramite il server a cui sei connesso, utilizzando le credenziali sul tuo computer locale.

Per iniziare, è necessario avviare l'agente SSH e aggiungere la chiave SSH all'agente (vedere in precedenza). 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 si trovasse su questo server.

Opzioni di configurazione lato server

Questa sezione contiene alcune opzioni di configurazione lato server comuni che possono modellare il modo in cui il server risponde e i tipi di connessioni consentiti.

Disattivazione dell'autenticazione tramite password

Se hai le chiavi SSH configurate, testate e funzionanti correttamente, è probabilmente una buona idea disabilitare l'autenticazione della password. Ciò impedirà a qualsiasi utente di accedere con SSH utilizzando una password.

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

  1. sudo nano /etc/ssh/sshd_config

All'interno del file, cerca la direttiva PasswordAuthentication. Se è commentato, decommentalo. Impostalo su no per disabilitare gli accessi con password:

PasswordAuthentication no

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

Su Ubuntu/Debian:

  1. sudo service ssh restart

Su CentOS/Fedora:

  1. sudo service sshd restart

Ora, tutti gli account sul sistema non saranno in grado di accedere con SSH utilizzando le password.

Modifica della porta su cui viene eseguito il demone SSH

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

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

  1. sudo nano /etc/ssh/sshd_config

Una volta dentro, puoi cambiare la porta su cui gira SSH trovando la specifica Port 22 e modificandola per riflettere la porta che desideri utilizzare. Ad esempio, per cambiare la porta in 4444, inserisci questo nel tuo file:

#Port 22
Port 4444

Salva e chiudi il file quando hai finito. Per implementare le modifiche, è necessario 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, sarà necessario autenticarsi specificando il numero di porta (dimostrato in una sezione precedente).

Limitazione degli utenti che possono connettersi tramite SSH

Per limitare in modo esplicito gli account utente che sono in grado di accedere tramite SSH, puoi adottare alcuni approcci diversi, ognuno dei quali comporta la modifica del file di configurazione del demone SSH.

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

  1. sudo nano /etc/ssh/sshd_config

Il primo metodo per specificare gli account a cui è consentito l'accesso è utilizzare la direttiva AllowUsers. Cerca la direttiva AllowUsers nel file. Se uno non esiste, crealo ovunque. Dopo la direttiva, elenca gli account utente a cui dovrebbe essere consentito l'accesso tramite SSH:

AllowUsers user1 user2

Salva e chiudi il file. Riavvia il demone per implementare le 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 invece utilizzare la direttiva AllowGroups. Se questo è il caso, basta aggiungere un singolo gruppo a cui dovrebbe essere consentito l'accesso SSH (creeremo questo gruppo e aggiungeremo membri momentaneamente):

AllowGroups sshmembers

Salva e chiudi il file.

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

  1. sudo groupadd -r sshmembers

Assicurati di aggiungere qualsiasi account utente necessario a questo gruppo. Questo 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 modifiche.

Su Ubuntu/Debian:

  1. sudo service ssh restart

Su CentOS/Fedora:

  1. sudo service sshd restart

Disattivazione dell'accesso root

Spesso è consigliabile disabilitare completamente l'accesso root tramite SSH dopo aver configurato un account utente SSH con privilegi sudo.

Per fare ciò, apri il file di configurazione del demone SSH con root o sudo sul tuo server remoto.

  1. sudo nano /etc/ssh/sshd_config

All'interno, cerca una direttiva chiamata PermitRootLogin. Se è commentato, decommentalo. Cambia il valore in \no:

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 comandi specifici

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

Questa operazione può essere eseguita tramite il file authorized_keys dell'utente root, che contiene le chiavi SSH autorizzate a 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. Dimostreremo qui con il comando ssh-copy-id, ma puoi utilizzare uno qualsiasi dei metodi di copia delle chiavi discussi in altre sezioni:

  1. ssh-copy-id root@remote_host

Ora accedi al server remoto. Avremo bisogno di modificare la voce 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 elenco command= che definisce il comando per cui questa chiave è valida. Questo dovrebbe includere il percorso completo dell'eseguibile, più eventuali argomenti:

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

Salva e chiudi il file quando hai finito.

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

  1. sudo nano /etc/ssh/sshd_config

Trova la direttiva PermitRootLogin e modifica il valore in forced-commands-only. Ciò consentirà solo agli accessi con chiave SSH di utilizzare root quando è stato specificato un comando per la chiave:

PermitRootLogin forced-commands-only

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

Su Ubuntu/Debian:

  1. sudo service ssh restart

Su CentOS/Fedora:

  1. sudo service sshd restart

Inoltro dei display dell'applicazione X al client

Il demone SSH può essere configurato per inoltrare automaticamente la visualizzazione delle applicazioni X sul server alla macchina client. Perché 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 è commentato, decommentalo. Crealo se necessario e imposta il valore su \yes:

X11Forwarding yes

Salva e chiudi il file. Riavvia il tuo 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 al momento della 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 puoi 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. Questi possono essere memorizzati 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 tuo 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. Al di sotto di questo e rientrato, puoi definire qualsiasi direttiva trovata nella pagina man ssh_config:

  1. man ssh_config

Una configurazione di esempio potrebbe essere:

Host testhost
    HostName your_domain
    Port 4444
    User demo

Puoi quindi connetterti a tuo_dominio sulla porta 4444 utilizzando il nome utente demo semplicemente digitando:

  1. ssh testhost

Puoi anche utilizzare i caratteri jolly per abbinare più di un host. Tieni presente che le corrispondenze successive possono sovrascrivere quelle precedenti. Per questo motivo, dovresti mettere le tue corrispondenze più generiche in cima. Ad esempio, puoi impostare come impostazione predefinita tutte le connessioni per non consentire l'inoltro X, con un override per tuo_dominio inserendo questo nel tuo file:

Host *
    ForwardX11 no

Host testhost
    HostName your_domain
    ForwardX11 yes
    Port 4444
    User demo

Salva e chiudi il file quando hai finito.

Mantenere attive le connessioni per evitare il timeout

Se ti ritrovi a essere disconnesso dalle sessioni SSH prima che tu sia pronto, è possibile che la tua connessione stia andando in timeout.

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

Sul tuo computer locale, puoi configurarlo per ogni connessione modificando il tuo file ~/.ssh/config. Apri ora:

  1. nano ~/.ssh/config

Se non ne esiste già uno, all'inizio del file definire una sezione che corrisponderà a tutti gli host. Imposta 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:

Host *
    ServerAliveInterval 120

Salva e chiudi il file quando hai finito.

Disattivazione del 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 da poter verificare l'autenticità dell'host a cui stai tentando di connetterti e individuare le istanze in cui un utente malintenzionato potrebbe tentare di mascherarsi come host remoto.

In determinate circostanze, potresti voler disabilitare questa funzione. Nota: questo può rappresentare un grosso rischio per la sicurezza, quindi assicurati di sapere cosa stai facendo se imposti 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 ne esiste già uno, all'inizio del file definire 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:

Host *
    StrictHostKeyChecking no
    UserKnownHostsFile /dev/null

È possibile abilitare il controllo caso per caso invertendo tali opzioni per altri host. L'impostazione predefinita per StrictHostKeyChecking è ask:

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

Ci sono situazioni in cui stabilire una nuova connessione TCP può richiedere più tempo di quanto vorresti. Se stai effettuando più connessioni alla stessa macchina, puoi sfruttare il multiplexing.

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

Per impostare il multiplexing, puoi impostare manualmente le connessioni oppure puoi configurare il tuo client in modo che utilizzi automaticamente il multiplexing quando disponibile. Dimostreremo qui la seconda opzione.

Per configurare il multiplexing, modifica il file di configurazione del tuo client SSH sul tuo computer locale:

  1. nano ~/.ssh/config

Se non hai già una definizione host con caratteri jolly all'inizio del file, aggiungine una ora (come Host *). Imposteremo i valori ControlMaster, ControlPath e ControlPersist per stabilire la nostra configurazione multiplexing.

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

L'impostazione dell'opzione ControlPersist su 1 consentirà il background della connessione master iniziale. Il 1 specifica che la connessione TCP deve terminare automaticamente un secondo dopo la chiusura dell'ultima sessione SSH:

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 che abbiamo specificato nel percorso di controllo:

  1. mkdir ~/.ssh/multiplex

Ora, qualsiasi sessione stabilita con la stessa macchina tenterà di utilizzare il socket esistente e la connessione TCP. Quando esiste l'ultima sessione, la connessione verrà interrotta dopo un secondo.

Se per qualche motivo hai bisogno di bypassare temporaneamente la configurazione multiplexing, puoi farlo passando il flag -S con none:

  1. ssh -S none username@remote_host

Configurazione di tunnel SSH

Il tunneling di altro traffico attraverso un tunnel SSH sicuro è un modo eccellente per aggirare le impostazioni restrittive del firewall. È anche un ottimo modo per crittografare il traffico di rete altrimenti non crittografato.

Configurazione del tunneling locale su un server

Le connessioni SSH possono essere utilizzate per incanalare il traffico dalle porte dell'host locale alle porte di un host remoto.

Una connessione locale è un modo per accedere a un percorso di rete dal tuo computer locale attraverso il tuo host remoto. Innanzitutto, viene stabilita una connessione SSH con il tuo host remoto. Sul server remoto, viene stabilita una connessione a un indirizzo di rete esterno (o interno) fornito dall'utente e il traffico verso questa posizione viene incanalato verso il computer locale su una porta specificata.

Viene spesso utilizzato per eseguire il tunneling verso un ambiente di rete meno limitato aggirando un firewall. Un altro utilizzo comune è l'accesso a un'interfaccia web \localhost-only da una postazione remota.

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

  • La porta locale da cui desideri accedere alla connessione con tunnel.
  • L'host a cui vuoi connettere il tuo host remoto.
  • La porta a cui vuoi connettere il tuo host remoto.

Questi sono dati, nell'ordine precedente (separati da due punti), come argomenti del flag -L. Useremo anche il flag -f, che fa sì che SSH vada in background prima dell'esecuzione e il flag -N, che non apre una shell o esegue un programma su il lato remoto.

Ad esempio, per connetterti a tuo_dominio sulla porta 80 del tuo host remoto, rendendo disponibile la connessione sulla tua macchina locale sulla porta 8888, puoi digitare:

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

Ora, se indirizzi il tuo browser web locale a 127.0.0.1:8888, dovresti vedere qualsiasi contenuto si trovi su tuo_dominio sulla porta 80.

Una guida più generale alla sintassi è:

  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 interromperla. 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

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. Ciò manterrà la connessione in primo piano, impedendoti di utilizzare la finestra del terminale per tutta la durata dell'inoltro. Il vantaggio di questo è che puoi facilmente terminare il tunnel digitando CTRL-C.

Configurazione del tunneling remoto su un server

Le connessioni SSH possono essere utilizzate per incanalare il traffico dalle porte dell'host locale alle porte di 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 trasferita a una combinazione di host e porta a cui è connesso dal computer locale. Ciò consentirà al computer remoto di accedere a un host tramite il computer locale.

Ciò può essere utile se è necessario consentire l'accesso a una rete interna bloccata alle connessioni esterne. Se il firewall consente connessioni fuori dalla rete, ciò ti consentirà di connetterti a una macchina remota e di incanalare il traffico da quella macchina a una posizione sulla rete interna.

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

  • La porta in cui l'host remoto può accedere alla connessione con tunnel.
  • L'host a cui desideri connettere il tuo computer locale.
  • La porta a cui desideri connettere il tuo computer locale.

Questi sono dati, nell'ordine precedente (separati da due punti), come argomenti del flag -R. Useremo anche il flag -f, che fa sì che SSH vada in background prima dell'esecuzione e il flag -N, che non apre una shell o esegue un programma su il lato remoto.

Ad esempio, per connetterti a tuo_dominio sulla porta 80 del nostro computer locale, rendendo disponibile la connessione sul nostro host remoto sulla porta 8888, potresti digitare:

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

Ora, sull'host remoto, l'apertura di un browser web su 127.0.0.1:8888 ti permetterebbe di vedere qualsiasi contenuto si trovi su tuo_dominio sulla porta 80.

Una guida più generale alla sintassi è:

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

Poiché la connessione è in background, dovrai trovare il suo PID per interromperla. 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. Ciò manterrà la connessione in primo piano, impedendoti di utilizzare la finestra del terminale per tutta la durata dell'inoltro. Il vantaggio di questo è che puoi facilmente terminare il tunnel digitando CTRL-C.

Configurazione del tunneling dinamico su un server remoto

Le connessioni SSH possono essere utilizzate per incanalare il traffico dalle porte dell'host locale alle porte di un host remoto.

Un tunnel dinamico è simile a un tunnel locale in quanto consente al computer locale di connettersi ad altre risorse attraverso un host remoto. Un tunnel dinamico esegue questa operazione semplicemente specificando una singola porta locale. Le applicazioni che desiderano sfruttare questa porta per il tunneling devono essere in grado di comunicare utilizzando il protocollo SOCKS in modo che i pacchetti possano essere reindirizzati correttamente dall'altra parte del tunnel.

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

Per stabilire la connessione, passeremo il flag -D insieme alla porta locale dove vogliamo accedere al tunnel. Useremo anche il flag -f, che fa sì che SSH vada in background prima dell'esecuzione e il flag -N, che non apre una shell o esegue un programma su il lato remoto.

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

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

Da qui, puoi iniziare a indirizzare la tua applicazione compatibile con SOCKS (come un browser Web) alla porta selezionata. L'applicazione invierà le sue informazioni in un socket associato alla porta.

Il metodo di indirizzamento del traffico alla porta SOCKS varia a seconda dell'applicazione. Ad esempio, in Firefox, la posizione generale è Preferenze > Avanzate > Impostazioni > Configurazioni proxy manuali. In Chrome, puoi avviare l'applicazione con il flag --proxy-server= impostato. Ti consigliamo di utilizzare l'interfaccia localhost e la porta che hai inoltrato.

Poiché la connessione è in background, dovrai trovare il suo PID per interromperla. 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 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. Ciò manterrà la connessione in primo piano, impedendoti di utilizzare la finestra del terminale per tutta la durata dell'inoltro. Il vantaggio di questo è che puoi facilmente terminare il tunnel digitando CTRL-C.

Utilizzo dei codici di escape SSH per controllare le connessioni

Anche dopo aver stabilito una sessione SSH, è possibile esercitare il 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 dall'interno di una sessione.

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

Una delle funzionalità più utili di OpenSSH che passa in gran parte inosservata è la capacità di controllare alcuni aspetti della sessione dall'interno.

Questi comandi possono essere eseguiti a partire dal carattere di controllo ~ all'interno di una sessione SSH. I comandi di controllo verranno interpretati solo se sono la prima cosa che viene digitata dopo una nuova riga, quindi premi sempre INVIO una o due volte prima di usarne uno.

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

Per chiudere una connessione dal client, usa il carattere di controllo (~), con un punto. Se la tua connessione ha problemi, probabilmente ti troverai in quella che sembra essere una sessione terminale bloccata. Digita i comandi nonostante la mancanza di feedback per eseguire una disconnessione lato client:

  1. [ENTER]
  2. ~.

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

Mettere una sessione SSH in background

Una delle funzionalità più utili di OpenSSH che passa in gran parte inosservata è la capacità di controllare alcuni aspetti della sessione dall'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 una nuova riga, quindi premi sempre INVIO una o due volte prima di usarne uno.

Una funzionalità che questo fornisce è quella di mettere una sessione SSH in background. Per fare ciò, dobbiamo fornire il carattere di controllo (~) e quindi eseguire la scorciatoia da tastiera convenzionale per mettere in secondo piano un'attività (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 del lavoro convenzionali.

Puoi riattivare immediatamente la tua attività in background più recente digitando:

  1. fg

Se hai più attività in background, puoi vedere i lavori disponibili digitando:

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

È quindi possibile portare in primo piano qualsiasi attività utilizzando l'indice nella prima colonna con un segno di percentuale:

  1. fg %2

Modifica delle opzioni di port forwarding su una connessione SSH esistente

Una delle funzionalità più utili di OpenSSH che passa in gran parte inosservata è la capacità di controllare alcuni aspetti della sessione dall'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 una nuova riga, quindi premi sempre INVIO una o due volte prima di usarne uno.

Ciò consente a un utente di modificare la configurazione del port forwarding dopo che la connessione è già stata stabilita. Ciò consente di creare o abbattere le regole di port forwarding al volo.

Queste funzionalità fanno parte dell'interfaccia della 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 set molto limitato di comandi validi. Per vedere le opzioni disponibili, puoi digitare -h da questo prompt. Se non viene restituito nulla, potresti dover aumentare la verbosità del tuo output SSH usando ~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 opzione di inoltro utilizzando le opzioni appropriate (vedi la sezione inoltro per maggiori informazioni). Puoi anche distruggere un tunnel con il comando \kill associato specificato con una \K prima della lettera del tipo di inoltro. Ad esempio, per uccidere un forward locale (-L), puoi usare il comando -KL. Dovrai solo fornire la porta per questo.

Quindi, per impostare un port forward 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 abbatterlo in avanti digitando:

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

Conclusione

Le istruzioni di cui sopra dovrebbero coprire la maggior parte delle informazioni di cui la maggior parte degli utenti avrà bisogno su SSH su base giornaliera. Se hai altri suggerimenti o desideri condividere le tue configurazioni e metodi preferiti, sentiti libero di usare i commenti qui sotto.