Korzystanie z połączenia VPN jest najbezpieczniejszym sposobem uzyskania dostępu do sieci, jeśli pracujesz zdalnie, ale ponieważ ta konfiguracja może wymagać sprzętu, czasu i wiedzy, prawdopodobnie powinieneś znać inne alternatywy, aby to zrobić . Korzystanie z SSH to także bezpieczny sposób na dostęp do zdalnej sieci bez dodatkowego sprzętu, mniej czasochłonny i mniej wysiłku niż konfiguracja serwera VPN. W tym blogu zobaczymy, jak skonfigurować tunelowanie SSH, aby uzyskać bezpieczny dostęp do baz danych.
Co to jest SSH?
SSH (Secure SHell) to program/protokół, który umożliwia dostęp do zdalnego hosta/sieci, uruchamianie poleceń lub udostępnianie informacji. Możesz skonfigurować różne szyfrowane metody uwierzytelniania i domyślnie używa portu 22/TCP, ale ze względów bezpieczeństwa zaleca się jego zmianę.
Jak korzystać z SSH?
Najbezpieczniejszym sposobem korzystania z niego jest utworzenie pary kluczy SSH. Dzięki temu potrzebujesz nie tylko hasła, ale także klucza prywatnego, aby móc uzyskać dostęp do zdalnego hosta.
Ponadto powinieneś mieć hosta tylko z rolą serwera SSH i utrzymywać go w jak największej izolacji, aby w przypadku ataku zewnętrznego nie wpłynął on na twoje lokalne serwery. Coś takiego:
Zobaczmy najpierw, jak skonfigurować serwer SSH.
Konfiguracja serwera
Większość instalacji systemu Linux ma domyślnie zainstalowany serwer SSH, ale w niektórych przypadkach może go brakować (minimalne ISO), więc aby go zainstalować, wystarczy zainstalować następujące pakiety:
System operacyjny oparty na RedHat
$ yum install openssh-clients openssh-server
System operacyjny oparty na Debianie
$ apt update; apt install openssh-client openssh-server
Teraz masz zainstalowany serwer SSH, możesz go skonfigurować tak, aby akceptował połączenia tylko za pomocą klucza.
vi /etc/ssh/sshd_config
PasswordAuthentication no
Upewnij się, że zmieniłeś go po umieszczeniu klucza publicznego, w przeciwnym razie nie będziesz mógł się zalogować.
Możesz także zmienić port i odmówić dostępu roota, aby był bezpieczniejszy:
Port 20022
PermitRootLogin no
Musisz sprawdzić, czy wybrany port jest otwarty w konfiguracji zapory, aby mieć do niego dostęp.
To jest podstawowa konfiguracja. Aby poprawić bezpieczeństwo SSH, można tutaj zmienić różne parametry, więc możesz postępować zgodnie z dokumentacją dotyczącą tego zadania.
Konfiguracja klienta
Teraz wygenerujmy parę kluczy dla lokalnego użytkownika „zdalnego”, aby uzyskać dostęp do serwera SSH. Istnieją różne typy kluczy, w tym przypadku wygenerujemy klucz 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]-----+
Spowoduje to wygenerowanie następujących plików w katalogu o nazwie „.ssh” w katalogu domowym użytkownika:
$ 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
Plik „id_rsa” jest kluczem prywatnym (zachowuj go tak bezpiecznym, jak to możliwe), a „id_rsa.pub” jest plikiem publicznym, który należy skopiować na zdalny host, aby uzyskać do niego dostęp. W tym celu uruchom następujące polecenie jako odpowiedni użytkownik:
$ 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.
W tym przykładzie używam portu 20022 dla SSH, a mój zdalny host to 35.166.37.12. Mam również tego samego użytkownika (zdalnego) utworzonego zarówno na lokalnym, jak i zdalnym hoście. Możesz użyć innego użytkownika na zdalnym hoście, więc w takim przypadku powinieneś zmienić użytkownika na właściwego w poleceniu ssh-copy-id:
$ ssh-copy-id -p 20022 [email protected]
To polecenie skopiuje klucz publiczny do pliku Author_Keys w zdalnym katalogu .ssh. Tak więc na serwerze SSH powinieneś mieć to teraz:
$ 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
Teraz powinieneś mieć dostęp do zdalnego hosta:
$ ssh -p 20022 [email protected]
Ale to nie wystarczy, aby uzyskać dostęp do węzła bazy danych, ponieważ jesteś już na serwerze SSH.
Dostęp do bazy danych SSH
Aby uzyskać dostęp do węzła bazy danych, masz dwie możliwości. Klasyczny sposób polega na tym, że jeśli jesteś na serwerze SSH, możesz uzyskać do niego dostęp, tak jak w tej samej sieci, ale w tym celu powinieneś otworzyć dwa lub trzy połączenia.
Po pierwsze, połączenie SSH nawiązane z serwerem SSH:
$ ssh -p 20022 [email protected]
Następnie połączenie SSH z węzłem bazy danych:
$ ssh [email protected]
I na koniec połączenie z bazą danych, które w przypadku MySQL to:
$ mysql -h localhost -P3306 -udbuser -p
A dla PostgreSQL:
$ psql -h localhost -p 5432 -Udbuser postgres
Jeśli masz klienta bazy danych zainstalowanego na serwerze SSH, możesz uniknąć drugiego połączenia SSH i po prostu uruchomić połączenie z bazą danych bezpośrednio z serwera SSH:
$ mysql -h 192.168.100.120 -P3306 -udbuser -p
lub:
$ psql -h 192.168.100.120 -p 5432 -Udbuser postgres
Ale może to być denerwujące, ponieważ używałeś połączenia z bazą danych bezpośrednio z komputera podłączonego w biurze, więc zobaczmy, jak użyć do tego tunelowania SSH.
Tunelowanie SSH
W tym samym przykładzie mamy:
- Publiczny adres IP serwera SSH:35.166.37.12
- Port serwera SSH:20022
- Prywatny adres IP węzła bazy danych:192.168.100.120
- Port bazy danych:3306/5432
- Użytkownik SSH (lokalny i zdalny):zdalny
- Użytkownik bazy danych:dbuser
Wiersz poleceń
Tak więc, jeśli uruchomisz następujące polecenie na swoim komputerze lokalnym:
$ ssh -L 8888:192.168.100.120:3306 [email protected] -p 20022 -N
Spowoduje to otwarcie portu 8888 na komputerze lokalnym, który uzyska dostęp do zdalnego węzła bazy danych, port 3306, przez serwer SSH, port 20022, przy użyciu „zdalnego” użytkownika.
Więc, aby było to bardziej jasne, po uruchomieniu tego polecenia możesz uzyskać dostęp do zdalnego węzła bazy danych, uruchamiając to na komputerze lokalnym:
$ mysql -h localhost -P8888 -udbuser -p
Narzędzia graficzne
Jeśli używasz narzędzia graficznego do zarządzania bazami danych, najprawdopodobniej ma ono opcję korzystania z tunelowania SSH w celu uzyskania dostępu do węzła bazy danych.
Zobaczmy przykład korzystania z MySQL Workbench:
I to samo dla PgAdmin:
Jak widać, informacje tutaj zadane są dość podobne do używanych dla wiersza poleceń SSH Tunneling connection.
Wnioski
Bezpieczeństwo jest ważne dla wszystkich firm, więc jeśli pracujesz w domu, musisz przechowywać dane tak samo bezpieczne, jak podczas pracy w biurze. Jak wspomnieliśmy, w tym celu prawdopodobnie najlepszym rozwiązaniem jest posiadanie połączenia VPN w celu uzyskania dostępu do baz danych, ale jeśli z jakiegoś powodu nie jest to możliwe, musisz mieć alternatywę, aby uniknąć obsługi danych przez Internet w niezabezpieczony sposób. Jak widać, konfigurowanie tunelowania SSH w celu uzyskania dostępu do baz danych nie jest nauką rakietową i jest prawdopodobnie najlepszą alternatywą w tym przypadku.