Articles

Come configurare l’autenticazione basata su chiave SSH su un server Linux

Posted on

Introduzione

SSH, o secure shell, è un protocollo criptato usato per amministrare e comunicare con i server. Quando si lavora con un server Linux, è probabile che si passi la maggior parte del tempo in una sessione terminale collegata al server attraverso SSH.

Mentre ci sono diversi modi per accedere a un server SSH, in questa guida, ci concentreremo sull’impostazione delle chiavi SSH. Le chiavi SSH forniscono un modo semplice, ma estremamente sicuro, per accedere al tuo server. Per questo motivo, questo è il metodo che raccomandiamo per tutti gli utenti.

Come funzionano le chiavi SSH?

Un server SSH può autenticare i client usando una varietà di metodi diversi. Il più basilare di questi è l’autenticazione tramite password, che è facile da usare, ma non il più sicuro.

Anche se le password sono inviate al server in modo sicuro, generalmente non sono abbastanza complesse o lunghe da essere resistenti ad attacchi ripetuti e persistenti. La moderna potenza di elaborazione combinata con script automatizzati rende molto possibile la forzatura brutale di un account protetto da password. Anche se ci sono altri metodi per aggiungere ulteriore sicurezza (fail2ban, ecc.), le chiavi SSH si dimostrano un’alternativa affidabile e sicura.

Le coppie di chiavi SSH sono due chiavi crittograficamente sicure che possono essere usate per autenticare un client a un server SSH. Ogni coppia di chiavi consiste in una chiave pubblica e una privata.

La chiave privata è conservata dal client e dovrebbe essere tenuta assolutamente segreta. Qualsiasi compromissione della chiave privata permetterà all’attaccante di accedere ai server che sono configurati con la chiave pubblica associata senza ulteriore autenticazione. Come ulteriore precauzione, la chiave può essere criptata su disco con una passphrase.

La chiave pubblica associata può essere condivisa liberamente senza conseguenze negative. La chiave pubblica può essere usata per cifrare messaggi che solo la chiave privata può decifrare. Questa proprietà è impiegata come un modo per autenticarsi usando la coppia di chiavi.

La chiave pubblica è caricata su un server remoto a cui si vuole essere in grado di accedere con SSH. La chiave viene aggiunta ad un file speciale all’interno dell’account utente in cui si farà il login chiamato ~/.ssh/authorized_keys.

Quando un client tenta di autenticarsi usando le chiavi SSH, il server può testare il client se è in possesso della chiave privata. Se il client può dimostrare di possedere la chiave privata, viene generata una sessione di shell o viene eseguito il comando richiesto.

Come creare le chiavi SSH

Il primo passo per configurare l’autenticazione con chiave SSH al tuo server è generare una coppia di chiavi SSH sul tuo computer locale.

Per fare questo, possiamo usare una speciale utility chiamata ssh-keygen, che è inclusa nella suite standard di strumenti OpenSSH. Per impostazione predefinita, questa creerà una coppia di chiavi RSA a 2048 bit, che va bene per la maggior parte degli usi.

Sul vostro computer locale, generate una coppia di chiavi SSH digitando:

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

L’utilità vi chiederà di selezionare una posizione per le chiavi che verranno generate. Per impostazione predefinita, le chiavi saranno memorizzate nella ~/.ssh directory all’interno della home directory dell’utente. La chiave privata sarà chiamata id_rsa e la chiave pubblica associata sarà chiamata id_rsa.pub. In questo modo il tuo client SSH troverà automaticamente le tue chiavi SSH quando tenterà di autenticarsi. Se vuoi scegliere un percorso non standard, inseriscilo ora, altrimenti premi INVIO per accettare il default.

Se avevi precedentemente generato una coppia di chiavi SSH, potresti vedere un prompt che assomiglia a questo:

/home/username/.ssh/id_rsa already exists.Overwrite (y/n)?

Se scegli di sovrascrivere la chiave sul disco, non sarai più in grado di autenticarti usando la chiave precedente. Fate molta attenzione quando selezionate yes, poiché questo è un processo distruttivo che non può essere invertito.

Created directory '/home/username/.ssh'.Enter passphrase (empty for no passphrase):Enter same passphrase again: 

In seguito, vi verrà richiesto di inserire una passphrase per la chiave. Questa è una passphrase opzionale che può essere usata per crittografare il file della chiave privata su disco.

Vi starete chiedendo quali vantaggi fornisce una chiave SSH se avete ancora bisogno di inserire una passphrase. Alcuni dei vantaggi sono:

  • La chiave privata SSH (la parte che può essere protetta dalla passphrase), non è mai esposta in rete. La passphrase è usata solo per decifrare la chiave sulla macchina locale. Questo significa che la forza bruta basata sulla rete non sarà possibile contro la passphrase.
  • La chiave privata è tenuta in una directory riservata. Il client SSH non riconoscerà le chiavi private che non sono tenute in directory riservate. La chiave stessa deve anche avere permessi ristretti (lettura e scrittura disponibili solo per il proprietario). Questo significa che gli altri utenti del sistema non possono curiosare.
  • Qualunque attaccante che spera di decifrare la passphrase della chiave privata SSH deve già avere accesso al sistema. Questo significa che avrà già accesso al vostro account utente o all’account di root. Se siete in questa posizione, la passphrase può impedire all’attaccante di accedere immediatamente agli altri server. Questo vi darà il tempo di creare e implementare una nuova coppia di chiavi SSH e rimuovere l’accesso dalla chiave compromessa.

Siccome la chiave privata non è mai esposta alla rete ed è protetta attraverso i permessi dei file, questo file non dovrebbe mai essere accessibile a nessuno oltre a voi (e all’utente root). La passphrase serve come un ulteriore livello di protezione nel caso in cui queste condizioni siano compromesse.

La passphrase è un’aggiunta opzionale. Se ne inserisci una, dovrai fornirla ogni volta che usi questa chiave (a meno che tu non stia usando un software agente SSH che memorizza la chiave decriptata). Raccomandiamo di usare una passphrase, ma se non vuoi impostare una passphrase, puoi semplicemente premere INVIO per bypassare questa richiesta.

Your identification has been saved in /home/username/.ssh/id_rsa.Your public key has been saved in /home/username/.ssh/id_rsa.pub.The key fingerprint is:a9:49:2e:2a:5e:33:3e:a9:de:4e:77:11:58:b6:90:26 username@remote_hostThe key's randomart image is:+------+| ..o || E o= . || o. o || .. || ..S || o o. || =o.+. ||. =++.. ||o=++. |+-----------------+

Ora hai una chiave pubblica e privata che puoi usare per autenticarti. Il prossimo passo è quello di posizionare la chiave pubblica sul vostro server in modo da poter utilizzare l’autenticazione con chiave SSH per accedere.

Come incorporare la vostra chiave pubblica quando create il vostro server

Se state avviando un nuovo server DigitalOcean, potete incorporare automaticamente la vostra chiave pubblica SSH nell’account root del vostro nuovo server.

In fondo alla pagina di creazione del Droplet, c’è un’opzione per aggiungere chiavi SSH al vostro server:

Integrazione chiave SSH

Se avete già aggiunto un file di chiave pubblica al vostro account DigitalOcean, lo vedrete qui come opzione selezionabile (ci sono due chiavi esistenti nell’esempio sopra: “Work key” e “Home key”). Per incorporare una chiave esistente, basta cliccare su di essa e si evidenzierà. Puoi incorporare più chiavi su un singolo server:

Selezione chiave SSH

Se non hai già una chiave SSH pubblica caricata sul tuo account, o se vuoi aggiungere una nuova chiave al tuo account, clicca sul pulsante “+ Add SSH Key”. Questo si espanderà in un prompt:

richiesta chiave SSH

Nella casella “SSH Key content”, incolla il contenuto della tua chiave pubblica SSH. Supponendo che tu abbia generato le tue chiavi usando il metodo sopra, puoi ottenere il contenuto della tua chiave pubblica sul tuo computer locale digitando:

cat ~/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDNqqi1mHLnryb1FdbePrSZQdmXRZxGZbo0gTfglysq6KMNUNY2VhzmYN9JYW39yNtjhVxqfW6ewc+eHiL+IRRM1P5ecDAaL3V0ou6ecSurU+t9DR4114mzNJ5SqNxMgiJzbXdhR+j55GjfXdk0FyzxM3a5qpVcGZEXiAzGzhHytUV51+YGnuLGaZ37nebh3UlYC+KJev4MYIVww0tWmY+9GniRSQlgLLUQZ+FcBUjaqhwqVqsHe4F/woW1IHe7mfm63GXyBavVc+llrEzRbMO111MogZUcoWDI9w7UIm8ZOTnhJsk7jhJzG2GpSXZHmly/a/buFaaFnmfZ4MYPkgJD [email protected]

Incolla questo valore, nella sua interezza, nella casella più grande. Nella casella “Commento (opzionale)”, puoi scegliere un’etichetta per la chiave. Questa sarà visualizzata come nome della chiave nell’interfaccia DigitalOcean:

SSH new key

Quando creerete il vostro Droplet, le chiavi pubbliche SSH che avete selezionato saranno inserite nel file ~/.ssh/authorized_keys dell’account dell’utente root. Questo ti permetterà di accedere al server dal computer con la tua chiave privata.

Come copiare una chiave pubblica sul tuo server

Se hai già un server disponibile e non hai incorporato le chiavi al momento della creazione, puoi comunque caricare la tua chiave pubblica e usarla per autenticarti al tuo server.

Il metodo che usi dipende in gran parte dagli strumenti che hai a disposizione e dai dettagli della tua configurazione attuale. I seguenti metodi danno tutti lo stesso risultato finale. Il metodo più semplice e automatizzato è il primo e quelli che seguono richiedono ulteriori passi manuali se non siete in grado di usare i metodi precedenti.

Copiare la vostra chiave pubblica usando SSH-Copy-ID

Il modo più semplice per copiare la vostra chiave pubblica su un server esistente è quello di usare una utility chiamata ssh-copy-id. A causa della sua semplicità, questo metodo è raccomandato se disponibile.

Lo strumento ssh-copy-id è incluso nei pacchetti OpenSSH in molte distribuzioni, quindi potresti averlo disponibile sul tuo sistema locale. Affinché questo metodo funzioni, dovete già avere un accesso SSH basato su password al vostro server.

Per usare l’utility, dovete semplicemente specificare l’host remoto a cui vorreste connettervi e l’account utente a cui avete accesso SSH tramite password. Questo è l’account dove verrà copiata la vostra chiave SSH pubblica.

La sintassi è:

ssh-copy-id username@remote_host

Potreste vedere un messaggio come 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

Questo significa solo che il vostro computer locale non riconosce l’host remoto. Questo accadrà la prima volta che vi connetterete a un nuovo host. Digitate “yes” e premete ENTER per continuare.

In seguito, l’utility farà una scansione del vostro account locale per la chiave id_rsa.pub che abbiamo creato in precedenza. Quando trova la chiave, vi chiederà la password dell’account dell’utente remoto:

/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 [email protected]'s password:

Digitate la password (la vostra digitazione non sarà visualizzata per motivi di sicurezza) e premete INVIO. L’utility si connetterà all’account sull’host remoto usando la password che avete fornito. Quindi copierà il contenuto della vostra ~/.ssh/id_rsa.pub chiave in un file nella home ~/.ssh directory dell’account remoto chiamato authorized_keys.

Vedrai un output simile a questo:

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

A questo punto, la tua id_rsa.pub chiave è stata caricata sull’account remoto. Potete continuare con la prossima sezione.

Copiare la vostra chiave pubblica usando SSH

Se non avete ssh-copy-id a disposizione, ma avete un accesso SSH basato su password a un account sul vostro server, potete caricare le vostre chiavi usando un metodo SSH convenzionale.

Possiamo fare questo estraendo il contenuto della nostra chiave pubblica SSH sul nostro computer locale e trasmettendolo attraverso una connessione SSH al server remoto. Dall’altro lato, possiamo assicurarci che la directory ~/.ssh esista sotto l’account che stiamo usando e quindi emettere il contenuto che abbiamo trasmesso in un file chiamato authorized_keys all’interno di questa directory.

Useremo il simbolo di reindirizzamento >> per aggiungere il contenuto invece di sovrascriverlo. Questo ci permetterà di aggiungere chiavi senza distruggere le chiavi precedentemente aggiunte.

Il comando completo sarà simile a questo:

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

Potreste vedere un messaggio come 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

Questo significa solo che il vostro computer locale non riconosce l’host remoto. Questo accadrà la prima volta che vi connetterete a un nuovo host. Digitate “sì” e premete INVIO per continuare.

In seguito, vi verrà richiesta la password dell’account a cui state tentando di connettervi:

[email protected]'s password:

Dopo aver inserito la password, il contenuto della vostra chiave id_rsa.pub verrà copiato alla fine del file authorized_keys dell’account dell’utente remoto. Continuate alla prossima sezione se questo ha avuto successo.

Copiare la chiave pubblica manualmente

Se non avete a disposizione un accesso SSH basato su password al vostro server, dovrete fare il processo di cui sopra manualmente.

Il contenuto del vostro file id_rsa.pub dovrà essere aggiunto ad un file a ~/.ssh/authorized_keys sulla vostra macchina remota in qualche modo.

Per visualizzare il contenuto della vostra chiave id_rsa.pub, digitate questo nel vostro computer locale:

cat ~/.ssh/id_rsa.pub

Vedrai il contenuto della chiave, che potrebbe essere simile a questo:

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

Accedi al tuo host remoto usando qualsiasi metodo tu abbia a disposizione. Per esempio, se il vostro server è un Droplet DigitalOcean, potete accedere usando la console web nel pannello di controllo:

Accesso console DigitalOcean

Una volta che avete accesso al vostro account sul server remoto, dovete assicurarvi che la directory ~/.ssh sia creata. Questo comando creerà la directory se necessario, o non farà nulla se esiste già:

mkdir -p ~/.ssh

Ora, potete creare o modificare il file authorized_keys all’interno di questa directory. Puoi aggiungere il contenuto del tuo file id_rsa.pub alla fine del file authorized_keys, creandolo se necessario, usando questo:

echo public_key_string >> ~/.ssh/authorized_keys

Nel comando precedente, sostituite il public_key_string con l’output del comando cat ~/.ssh/id_rsa.pub che avete eseguito sul vostro sistema locale. Dovrebbe iniziare con ssh-rsa AAAA....

Se questo funziona, potete passare a provare ad autenticarvi senza password.

Autenticatevi al vostro server usando le chiavi SSH

Se avete completato con successo una delle procedure precedenti, dovreste essere in grado di accedere all’host remoto senza la password dell’account remoto.

Il processo di base è lo stesso:

ssh username@remote_host

Se è la prima volta che ti connetti a questo host (se hai usato l’ultimo metodo sopra), potresti vedere qualcosa del genere:

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 significa solo che il tuo computer locale non riconosce l’host remoto. Digita “yes” e poi premi ENTER per continuare.

Se non hai fornito una passphrase per la tua chiave privata, sarai loggato immediatamente. Se avete fornito una passphrase per la chiave privata quando avete creato la chiave, vi sarà richiesto di inserirla ora. In seguito, una nuova sessione di shell dovrebbe essere generata per te con l’account sul sistema remoto.

Se ha successo, continua a scoprire come bloccare il server.

Disabilitare l’autenticazione con password sul tuo server

Se sei stato in grado di accedere al tuo account usando SSH senza una password, hai configurato con successo l’autenticazione basata su chiave SSH per il tuo account. Tuttavia, il tuo meccanismo di autenticazione basato su password è ancora attivo, il che significa che il tuo server è ancora esposto ad attacchi di forza bruta.

Prima di completare i passi di questa sezione, assicurati di avere l’autenticazione basata su chiave SSH configurata per l’account di root su questo server, o preferibilmente, che hai l’autenticazione basata su chiave SSH configurata per un account su questo server con sudo accesso. Questo passo bloccherà i login basati su password, quindi assicurarsi di avere ancora la possibilità di ottenere l’accesso amministrativo è essenziale.

Una volta che le condizioni di cui sopra sono vere, accedete al vostro server remoto con le chiavi SSH, o come root o con un account con privilegi sudo. Aprite il file di configurazione del demone SSH:

sudo nano /etc/ssh/sshd_config

All’interno del file, cercate una direttiva chiamata PasswordAuthentication. Questa potrebbe essere commentata. Decommenta la linea e imposta il valore su “no”. Questo disabiliterà la capacità di accedere tramite SSH usando le password degli account:

PasswordAuthentication no

Salva e chiudi il file quando hai finito. Per implementare effettivamente i cambiamenti che abbiamo appena fatto, è necessario riavviare il servizio.

Su macchine Ubuntu o Debian, potete lanciare questo comando:

sudo service ssh restart

Su macchine CentOS/Fedora, il demone si chiama sshd:

sudo service sshd restart

Dopo aver completato questo passo, avete trasformato con successo il vostro demone SSH per rispondere solo alle chiavi SSH.

Conclusione

Ora dovresti avere l’autenticazione basata su chiave SSH configurata e funzionante sul tuo server, permettendoti di accedere senza fornire la password di un account. Da qui, ci sono molte direzioni in cui puoi andare. Se vuoi saperne di più su come lavorare con SSH, dai un’occhiata alla nostra guida SSH essentials.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *