Utilizzare una connessione VPN è il modo più sicuro per accedere a una rete se si lavora in remoto, ma poiché questa configurazione potrebbe richiedere hardware, tempo e conoscenze, probabilmente dovresti conoscere le alternative per farlo . L'utilizzo di SSH è anche un modo sicuro per accedere a una rete remota senza hardware aggiuntivo, richiede meno tempo e meno sforzo rispetto alla configurazione di un server VPN. In questo blog vedremo come configurare SSH Tunneling per accedere ai tuoi database in modo sicuro.
Cos'è SSH?
SSH (Secure SHell), è un programma/protocollo che consente di accedere a un host/rete remoti, eseguire comandi o condividere informazioni. Puoi configurare diversi metodi di autenticazione crittografati e utilizza la porta 22/TCP per impostazione predefinita, ma si consiglia di cambiarla per motivi di sicurezza.
Come utilizzare SSH?
Il modo più sicuro per usarlo è creare una coppia di chiavi SSH. Con questo, non devi solo avere la password ma anche la chiave privata per poter accedere all'host remoto.
Inoltre, dovresti avere un host con solo il ruolo del server SSH e mantenerlo il più isolato possibile, così in caso di un attacco esterno, non influirà sui tuoi server locali. Qualcosa del genere:
Vediamo prima come configurare il server SSH.
Configurazione del server
La maggior parte dell'installazione Linux ha SSH Server installato per impostazione predefinita, ma ci sono alcuni casi in cui potrebbe mancare (ISO minimo), quindi per installarlo, devi solo installare i seguenti pacchetti:
sistema operativo basato su RedHat
$ yum install openssh-clients openssh-server
sistema operativo basato su Debian
$ apt update; apt install openssh-client openssh-server
Ora che hai installato il server SSH, puoi configurarlo per accettare solo connessioni usando una chiave.
vi /etc/ssh/sshd_config
PasswordAuthentication no
Assicurati di cambiarla dopo aver inserito la chiave pubblica, altrimenti non potrai accedere.
Puoi anche cambiare la porta e negare l'accesso come root per renderlo più sicuro:
Port 20022
PermitRootLogin no
Devi controllare se la porta selezionata è aperta nella configurazione del firewall per potervi accedere.
Questa è una configurazione di base. Ci sono diversi parametri da modificare qui per migliorare la sicurezza SSH, quindi puoi seguire la documentazione per questa attività.
Configurazione client
Ora generiamo la coppia di chiavi per l'utente locale "remoto" per accedere al server SSH. Esistono diversi tipi di chiavi, in questo caso genereremo una chiave RSA.
$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/remote/.ssh/id_rsa):
Created directory '/home/remote/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/remote/.ssh/id_rsa.
Your public key has been saved in /home/remote/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:hT/36miDBbRa3Povz2FktC/zNb8ehAsjNZOiX7eSO4w [email protected]
The key's randomart image is:
+---[RSA 3072]----+
| |
| .. . |
| o.+.=. |
| *o+.o.. |
| +S+o+=o . |
| . o +==o+ |
| =oo=ooo.|
| .E=*o* .+|
| ..BB ooo|
+----[SHA256]-----+
Questo genererà i seguenti file in una directory chiamata ".ssh" all'interno della home directory dell'utente:
$ whoami
remote
$ pwd
/home/remote/.ssh
$ ls -la
total 20
drwx------ 2 remote remote 4096 Apr 16 15:40 .
drwx------ 3 remote remote 4096 Apr 16 15:27 ..
-rw------- 1 remote remote 2655 Apr 16 15:26 id_rsa
-rw-r--r-- 1 remote remote 569 Apr 16 15:26 id_rsa.pub
Il file “id_rsa” è la chiave privata (mantienila il più sicura possibile), e “id_rsa.pub” è quella pubblica che deve essere copiata sull'host remoto per accedervi. Per questo, esegui il seguente comando come utente corrispondente:
$ whoami
remote
$ ssh-copy-id -p 20022 [email protected]
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/remote/.ssh/id_rsa.pub"
/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:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh -p '20022' '[email protected]"
and check to make sure that only the key(s) you wanted were added.
In questo esempio, sto usando la porta 20022 per SSH e il mio host remoto è 35.166.37.12. Ho anche lo stesso utente (remoto) creato sia negli host locali che remoti. Puoi usare un altro utente nell'host remoto, quindi in tal caso dovresti cambiare l'utente con quello corretto nel comando ssh-copy-id:
$ ssh-copy-id -p 20022 [email protected]
Questo comando copierà la chiave pubblica nel file authorized_keys nella directory .ssh remota. Quindi, nel server SSH dovresti avere questo ora:
$ pwd
/home/remote/.ssh
$ ls -la
total 20
drwx------ 2 remote remote 4096 Apr 16 15:40 .
drwx------ 3 remote remote 4096 Apr 16 15:27 ..
-rw------- 1 remote remote 422 Apr 16 15:40 authorized_keys
-rw------- 1 remote remote 2655 Apr 16 15:26 id_rsa
-rw-r--r-- 1 remote remote 569 Apr 16 15:26 id_rsa.pub
Ora dovresti essere in grado di accedere all'host remoto:
$ ssh -p 20022 [email protected]
Ma questo non è sufficiente per accedere al nodo del tuo database, dato che sei ancora nel server SSH.
Accesso al database SSH
Per accedere al nodo del database hai due opzioni. Il modo classico è, se sei nel server SSH, puoi accedervi da lì poiché sei nella stessa rete, ma per questo dovresti aprire due o tre connessioni.
In primo luogo, la connessione SSH stabilita al server SSH:
$ ssh -p 20022 [email protected]
Quindi, la connessione SSH al Nodo Database:
$ ssh [email protected]
E infine la connessione al database, che nel caso di MySQL, è:
$ mysql -h localhost -P3306 -udbuser -p
E per PostgreSQL:
$ psql -h localhost -p 5432 -Udbuser postgres
Se hai il client database installato nel server SSH, puoi evitare la seconda connessione SSH ed eseguire semplicemente la connessione al database direttamente dal server SSH:
$ mysql -h 192.168.100.120 -P3306 -udbuser -p
oppure:
$ psql -h 192.168.100.120 -p 5432 -Udbuser postgres
Ma questo potrebbe essere fastidioso poiché usavi la connessione al database direttamente dal tuo computer connesso in ufficio, quindi vediamo come utilizzare SSH Tunneling per questo.
Tunnel SSH
Seguendo lo stesso esempio, abbiamo:
- Indirizzo IP pubblico del server SSH:35.166.37.12
- Porta server SSH:20022
- Indirizzo IP privato del nodo database:192.168.100.120
- Porta database:3306/5432
- Utente SSH (locale e remoto):remoto
- Utente database:dbuser
Riga di comando
Quindi, se esegui il seguente comando nella tua macchina locale:
$ ssh -L 8888:192.168.100.120:3306 [email protected] -p 20022 -N
Questo aprirà la porta 8888 nella tua macchina locale, che accederà al nodo del database remoto, porta 3306, tramite il server SSH, porta 20022, usando l'utente "remoto".
Quindi, per chiarire, dopo aver eseguito questo comando, puoi accedere al nodo database remoto, eseguendo questo nella tua macchina locale:
$ mysql -h localhost -P8888 -udbuser -p
Strumenti grafici
Se stai utilizzando uno strumento grafico per gestire i database, molto probabilmente ha la possibilità di utilizzare SSH Tunneling per accedere al nodo del database.
Vediamo un esempio usando MySQL Workbench:
E lo stesso per PgAdmin:
Come puoi vedere, le informazioni richieste qui sono abbastanza simili a quelle utilizzate per la connessione di tunneling SSH della riga di comando.
Conclusione
La sicurezza è importante per tutte le aziende, quindi se lavori da casa, devi mantenere i dati al sicuro come lo sei mentre lavori in ufficio. Come accennato, per questo, probabilmente la soluzione migliore è avere una connessione VPN per accedere ai database, ma se per qualche motivo non è possibile, è necessario disporre di un'alternativa per evitare di gestire i dati su Internet in modo non sicuro. Come puoi vedere, la configurazione di SSH Tunneling per l'accesso ai tuoi database non è scienza missilistica ed è probabilmente la migliore alternativa in questo caso.