Използването на VPN връзка е най-сигурният начин за достъп до мрежа, ако работите отдалечено, но тъй като тази конфигурация може да изисква хардуер, време и знания, вероятно трябва да искате да знаете алтернативи за това . Използването на SSH също е сигурен начин за достъп до отдалечена мрежа без допълнителен хардуер, отнема по-малко време и по-малко усилия от конфигурирането на VPN сървър. В този блог ще видим как да конфигурирате SSH тунелиране за достъп до вашите бази данни по защитен начин.
Какво е SSH?
SSH (Secure Shell) е програма/протокол, който ви позволява да осъществявате достъп до отдалечен хост/мрежа, да изпълнявате команди или да споделяте информация. Можете да конфигурирате различни криптирани методи за удостоверяване и той използва 22/TCP порта по подразбиране, но се препоръчва да го промените от съображения за сигурност.
Как да използвам SSH?
Най-сигурният начин да го използвате е чрез създаване на двойка ключове SSH. С това не е необходимо да имате само парола, но и частен ключ, за да имате достъп до отдалечения хост.
Освен това трябва да имате хост само с ролята на SSH сървър и да го държите възможно най-изолиран, така че в случай на външна атака, тя няма да засегне вашите локални сървъри. Нещо като това:

Нека първо да видим как да конфигурирате SSH сървъра.
Конфигурация на сървъра
По-голямата част от инсталацията на Linux има инсталиран SSH сървър по подразбиране, но има някои случаи, в които може да липсва (минимален ISO), така че за да го инсталирате, просто трябва да инсталирате следните пакети:
ОС, базирана на RedHat
$ yum install openssh-clients openssh-server базирана на Debian ОС
$ apt update; apt install openssh-client openssh-server Сега имате инсталиран SSH сървър, можете да го конфигурирате да приема връзки само с помощта на ключ.
vi /etc/ssh/sshd_config
PasswordAuthentication no Уверете се, че сте го променили, след като сте поставили публичния ключ, в противен случай няма да можете да влезете.
Можете също да промените порта и да откажете root достъпа, за да го направите по-сигурен:
Port 20022
PermitRootLogin no Трябва да проверите дали избраният порт е отворен в конфигурацията на защитната стена, за да имате достъп до него.
Това е основна конфигурация. Тук има различни параметри, които трябва да промените, за да подобрите SSH сигурността, така че можете да следвате документацията за тази задача.
Конфигурация на клиента
Сега нека генерираме двойката ключове за локалния потребител „отдалечено“ за достъп до SSH сървъра. Има различни типове ключове, в този случай ще генерираме 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 example@sqldat.com
The key's randomart image is:
+---[RSA 3072]----+
| |
| .. . |
| o.+.=. |
| *o+.o.. |
| +S+o+=o . |
| . o +==o+ |
| =oo=ooo.|
| .E=*o* .+|
| ..BB ooo|
+----[SHA256]-----+ Това ще генерира следните файлове в директория, наречена „.ssh“ в домашната директория на потребителя:
$ 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 Файлът „id_rsa“ е частният ключ (пазете го възможно най-безопасен), а „id_rsa.pub“ е публичният, който трябва да бъде копиран на отдалечения хост, за да получите достъп до него. За това изпълнете следната команда като съответния потребител:
$ whoami
remote
$ ssh-copy-id -p 20022 example@sqldat.com
/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
example@sqldat.com's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh -p '20022' 'example@sqldat.com"
and check to make sure that only the key(s) you wanted were added. В този пример използвам порт 20022 за SSH и моят отдалечен хост е 35.166.37.12. Също така имам един и същ потребител (отдалечен), създаден както в локални, така и в отдалечени хостове. Можете да използвате друг потребител в отдалечения хост, така че в този случай трябва да промените потребителя на правилния в командата ssh-copy-id:
$ ssh-copy-id -p 20022 example@sqldat.com Тази команда ще копира публичния ключ във файла authorized_keys в отдалечената .ssh директория. Така че в SSH сървъра трябва да имате това сега:
$ 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 Сега трябва да имате достъп до отдалечения хост:
$ ssh -p 20022 example@sqldat.com Но това не е достатъчно за достъп до вашия възел на базата данни, тъй като все още сте в SSH сървъра.
SSH достъп до база данни
За достъп до вашия възел на базата данни имате две възможности. Класическият начин е, ако сте в SSH сървъра, можете да получите достъп до него от там, тъй като сте в същата мрежа, но за това трябва да отворите две или три връзки.
Първо, SSH връзката е установена към SSH сървъра:
$ ssh -p 20022 example@sqldat.com След това SSH връзката към възела на базата данни:
$ ssh example@sqldat.com И накрая, връзката към базата данни, в случай на MySQL, е:
$ mysql -h localhost -P3306 -udbuser -p И за PostgreSQL:
$ psql -h localhost -p 5432 -Udbuser postgres Ако имате инсталиран клиент на база данни в SSH сървъра, можете да избегнете втората SSH връзка и просто да стартирате връзката към базата данни директно от SSH сървъра:
$ mysql -h 192.168.100.120 -P3306 -udbuser -p или:
$ psql -h 192.168.100.120 -p 5432 -Udbuser postgres Но това може да е досадно, тъй като сте използвали връзката към базата данни директно от компютъра, свързан в офиса, така че нека да видим как да използвате SSH тунелирането за това.
SSH тунелиране
Следвайки същия пример, имаме:
- Обществен IP адрес на SSH сървъра:35.166.37.12
- SSH сървър порт:20022
- Частен IP адрес на възел на базата данни:192.168.100.120
- Порт на базата данни:3306/5432
- SSH потребител (локален и отдалечен):отдалечен
- Потребител на базата данни:dbuser
Команден ред
И така, ако изпълните следната команда на вашата локална машина:
$ ssh -L 8888:192.168.100.120:3306 example@sqldat.com -p 20022 -N Това ще отвори порт 8888 във вашата локална машина, който ще има достъп до отдалечения възел на базата данни, порт 3306, през SSH сървъра, порт 20022, използвайки „отдалечения“ потребител.
И така, за да стане по-ясно, след като изпълните тази команда, можете да получите достъп до отдалечения възел на базата данни, изпълнявайки това на вашата локална машина:
$ mysql -h localhost -P8888 -udbuser -p Графични инструменти
Ако използвате графичен инструмент за управление на бази данни, най-вероятно той има опцията да използва SSH тунелиране за достъп до възела на базата данни.
Нека видим пример с MySQL Workbench:

И същото за PgAdmin:

Както можете да видите, информацията, зададена тук, е доста подобна на използваната за връзка с SSH тунел на командния ред.
Заключение
Сигурността е важна за всички компании, така че ако работите от вкъщи, трябва да поддържате данните толкова сигурни, колкото сте, докато работите в офиса. Както споменахме, за това вероятно най-доброто решение е да имате VPN връзка за достъп до базите данни, но ако по някаква причина това не е възможно, трябва да имате алтернатива, за да избегнете обработката на данни през интернет по несигурен начин. Както можете да видите, конфигурирането на SSH тунелиране за достъп до вашите бази данни не е ракетна наука и вероятно е най-добрата алтернатива в този случай.