Модул 2 · 2.3
Умно използване на SSH
Модул 2: SSH и ключове · Време за четене: 10 минути
Цел на урока: След този урок ще можете удобно да използвате SSH всеки ден със собствен конфигурационен файл, да копирате файлове със scp и rsync и да достигате до база данни през тунел, без портът на базата данни да трябва да е отворен към интернет.
Основни понятия: ~/.ssh/config, Host, HostName, User, IdentityFile, scp, rsync, sftp, port forwarding, -L, тунел, ProxyJump, ServerAliveInterval, друг номер на порт, отнемане на ключ
По-малко писане с ~/.ssh/config
След няколко седмици ще пишете това десетки пъти на ден:
anna@laptop:~$ ssh -i ~/.ssh/id_ed25519 anna@192.0.2.10С конфигурационен файл за клиента командата става по-кратка и правите по-малко грешки. Файлът се намира на Вашия собствен компютър: ~/.ssh/config (Windows: C:\Users\anna\.ssh\config, без разширение).
Host web1
HostName 192.0.2.10
User anna
IdentityFile ~/.ssh/id_ed25519
ServerAliveInterval 60
Host test
HostName test.example.com
User anna
Port 2222Сега е просто:
anna@laptop:~$ ssh web1
anna@web1:~$Какво правят редовете?
- Host е псевдонимът, който избирате сами. Пишете го след
ssh,scpиrsync. - HostName е истинският адрес: IP адрес или име, което е записано в DNS.
- User и Port са потребителското име и портът, така че вече не е нужно да ги помните.
- IdentityFile посочва ключа. Полезно е, ако имате няколко ключа; без този ред ssh опитва стандартните Ви ключове.
- ServerAliveInterval 60 изпраща на всеки 60 секунди малък сигнал, че връзката е жива. Много домашни рутери и wifi мрежи прекъсват неактивна връзка след няколко минути; така сесията Ви остава отворена.
И тук важи правилото, че първата стойност е тази, която се взема предвид, точно както при сървъра. Затова поставяйте общи правила като Host * в края на файла.
Копиране на файлове: scp, rsync и sftp
scp копира файл със същата форма като cp, но с host: отпред:
anna@laptop:~$ scp backup.sql web1:/home/anna/
anna@laptop:~$ scp web1:/var/log/nginx/error.log .rsync е по-умен при папки и големи количества данни: изпраща само това, което е променено, и може да продължи прекъснато копиране. Трябва да е инсталиран и от двете страни (apt install rsync).
anna@laptop:~$ rsync -avz --progress ./site/ web1:/var/www/example.com/Обърнете внимание на наклонената черта след ./site/: с наклонена черта rsync копира съдържанието на папката, без нея копира самата папка (тогава получавате /var/www/example.com/site/). При съмнение опитайте първо с --dry-run и бъдете много внимателни с --delete, която изтрива от приемащата страна всичко, което не съществува при Вас.
sftp и графични програми като FileZilla или WinSCP използват същата SSH връзка и същия ключ. Затова не е нужен отделен FTP сървър. Старомоден FTP сървър на VPS не се препоръчва: обикновеният FTP изпраща паролата Ви по мрежата некриптирана.
Тунел вместо отворен порт
Това е може би най-полезното, което SSH може. Да предположим, че на Вашия сървър работи база данни PostgreSQL. Искате да стигнете до нея от лаптопа си с графична програма. Изкушението да отворите порт 5432 към интернет е голямо. Не го правете: отворените портове на бази данни са една от най-честите причини за изтичане на данни (урок 10.2), а курсът по-късно проверява отвън дали са затворени (задача Z5.1).
С локално port forwarding карате SSH да изгради тунел:
anna@laptop:~$ ssh -L 5432:127.0.0.1:5432 web1Четете го така: „слушай на моя лаптоп на порт 5432 и препращай всичко, което пристига там, през SSH връзката към 127.0.0.1:5432, погледнато от сървъра“. Докато тази сесия е отворена, свързвате програмата си за бази данни с localhost порт 5432 на собствения си лаптоп и стигате до базата данни на сървъра.
Какво го прави толкова добро?
- Базата данни слуша само на
127.0.0.1на сървъра и е недостъпна отвън. - Връзката е криптирана от SSH, дори ако самата база данни няма криптиране.
- Само който може да влезе през SSH, има достъп. Така използвате силната защита, която вече имате.
Ако на лаптопа Ви вече работи нещо на 5432, изберете друг номер вляво: -L 15432:127.0.0.1:5432, и се свържете с порт 15432. Ако запишете тунела в ~/.ssh/config, той винаги ще Ви е под ръка:
Host web1-db
HostName 192.0.2.10
User anna
LocalForward 15432 127.0.0.1:5432С ssh -N web1-db получавате само тунела, без команден ред.
През междинен сървър: ProxyJump
Понякога до даден сървър може да се стигне само през друг, например сървър за бази данни без публичен IP адрес зад Вашия уеб сървър. ProxyJump преминава през първия сървър до втория:
Host db1
HostName 10.0.0.5
User anna
ProxyJump web1Разликата с agent forwarding (урок 2.1): при ProxyJump криптирането е от край до край между Вашия лаптоп и db1. Междинният сървър само препраща пакетите и не може да използва Вашия ключ.
Друг номер на порт: да или не?
Много ръководства препоръчват SSH да се премести на друг порт, например 2222. Какво постига това в действителност?
- То намалява шума: повечето автоматизирани опити за отгатване пробват само порт 22. Логът Ви става по-спокоен.
- То не е защита. Скенер, който обхожда всички портове, намира SSH за секунди по банера с версията.
С ключове и изключено влизане с парола (урок 2.2) портът няма голямо значение за сигурността. Ако все пак искате да го смените, направете го в правилния ред: отворете новия порт в защитната стена, накарайте SSH да слуша и на двата порта, тествайте във втори прозорец и едва тогава затворете стария порт. При Ubuntu 24.04 и по-нови към това спадат systemctl daemon-reload и systemctl restart ssh.socket (урок 2.2). Не забравяйте, че Вашият доставчик може също да има защитна стена.
Отнемане на достъп
Бивш колега или уеб разработчик е имал ключ на Вашия сървър и вече не работи за Вас? Отнемането на достъпа е лесно, ако водите отчет:
- Прегледайте всички ключове:
ssh-keygen -lf ~/.ssh/authorized_keys, и го направете за всеки потребител (също и за/root/.ssh/authorized_keys). - Изтрийте реда на този човек.
- Ако е използвал собствен потребителски акаунт, заключете го (урок 3.1) и проверете дали е бил в групата
sudo(урок 3.2). - Ако е виждал пароли, например парола за база данни в конфигурационен файл, сменете и тях.
Обикновеният ключ няма срок на валидност. Това, което не изтриете, продължава да работи, дори години по-късно. Ако давате на някого временен достъп, можете да поставите опцията expiry-time="20261231" пред неговия ред в authorized_keys; след тази дата сървърът отказва ключа.
Обобщение
~/.ssh/configна собствения Ви компютър пази за всеки сървър името, потребителя, порта и ключа;Host *е мястото в края.- scp за отделни файлове, rsync за папки (внимавайте с наклонената черта и с
--delete), sftp вместо FTP. - С
ssh -Lдостигате до база данни през криптиран тунел, докато портът на базата данни остава затворен отвън. - ProxyJump преминава безопасно през междинен сървър; по-добре е от agent forwarding.
- Друг номер на порт намалява шума, но не защитава. Ключовете, които не изтриете, продължават да работят.
Тест (quiz)
Задача
Задача O2.3: SSH config и тунел. Създайте на собствения си компютър ~/.ssh/config с псевдоним за Вашия сървър, влезте само с ssh <bijnaam>, копирайте файл със scp или rsync и изградете тунел с -L към услуга, която на сървъра Ви слуша само на 127.0.0.1 (ако все още нямате база данни, използвайте порт 22 на самия сървър: ssh -L 2200:127.0.0.1:22 <bijnaam> и след това ssh -p 2200 anna@localhost). Отговорете на въпросите какво прави тунелът и защо портът не трябва да е отворен.
Задача O2.3: SSH config и тунел
Тази задача изпълнявате сами; никой не я проверява. Отбележете какво сте направили и маркирайте задачата като изпълнена.
Вашият лаптоп слуша на левия порт, трафикът минава криптиран през SSH и излиза на сървъра при 127.0.0.1:<poort>. Услугата остава недостъпна отвън. Друг SSH порт дава по-малко шум в лога Ви, но не е защита; ключовете и изключеният вход с парола са защита.
Вашите отметки и бележки остават само в този браузър; не ги изпращаме никъде. Ако сте влезли, в Моите курсове запазваме само че сте изпълнили задачата.
Още за четене
Стъпките в тези статии се отнасят за VPS сървърите и панелите на WebOké; при други доставчици работи по подобен начин.
- Вход във VPS чрез SSH (и създаване на SSH ключ)
- Ръководство за ssh_config (настройки на клиента): https://man.openbsd.org/ssh_config
- Ръководство за ssh (опции
-L,-J,-N): https://man.openbsd.org/ssh
