У цьому посібнику ми розглянемо найбільш поширені способи підключення до сервера по SSH, а також базові налаштування для безпечної та зручної роботи. Ви можете використовувати його як шпаргалку, коли потрібно буде налаштувати SSH на новому сервері.

Огляд SSH

Цей розділ для тих, хто стикається з темою вперше. У ньому ми для загального розуміння відповімо на базові питання про SSH: що це за технологія, як вона працює та наскільки безпечно її використовувати.

Що таке SSH

SSH (англ. Secure Shell — «безпечна оболонка») — це протокол, який використовується як основний спосіб для віддаленого підключення до серверів з Linux. З його допомогою можна виконувати команди, вносити зміни до файлів та налаштовувати сервіси.

Як працює SSH

При підключенні через SSH ви потрапляєте у сеанс оболонки — текстовий інтерфейс для взаємодії із сервером. Усі команди, які ви вводите в локальному терміналі, відправляються зашифрованим каналом на віддалений сервер і виконуються там.

З’єднання SSH реалізовано за моделлю «клієнт-сервер». Це означає, що на віддаленій машині має працювати спеціальна програма — демон SSH. Ця програма слухає підключення на певному мережевому порту, перевіряє запити на підключення та створює потрібне середовище, якщо користувач вводить правильні облікові дані.

На комп’ютері користувача має бути встановлений SSH-клієнт — програма, яку можна налаштувати для підключення до потрібного сервера із зазначенням деталей від облікового запису та різних додаткових параметрів.

Аутентифікація користувачів у SSH

Клієнти зазвичай проходять автентифікацію або за допомогою паролів (менш безпечний спосіб) або за допомогою SSH-ключів (безпечніший спосіб).

Вхід по паролю більш простий для новачків і відбувається зашифрованим каналом, але боти та зловмисники часто намагаються зламати акаунти, що використовують такий спосіб аутентифікації. Тому краще за можливості використовувати вхід по SSH-ключу.

SSH-ключі — це пара криптографічних ключів (публічний та приватний). Публічний ключ можна вільно передавати іншим, а приватний потрібно зберігати в секреті та за жодних обставин нікому не показувати.

Для аутентифікації за допомогою SSH-ключів користувач повинен створити їх на комп’ютері. Потім публічний ключ потрібно скопіювати на сервер у файл, розташований за шляхом ~/.ssh/authorized_keys. Це системний файл, де зберігаються публічні ключі, з якими можна входити в систему.

Коли клієнт підключається до сервера, він повідомляє, який публічний ключ використовувати. Сервер знаходить цей ключ у файлі authorized_keys і використовує, щоб зашифрувати випадкове повідомлення, яке передасть клієнту. Розшифрувати повідомлення вийде лише приватним ключем з правильної пари.

Клієнт розшифровує повідомлення, генерує на основі цих даних MD5-хеш та відправляє його на сервер. Оскільки сервер вже знає текст повідомлення з ідентифікатором, він також може згенерувати MD5-хеш на основі цих даних, а потім порівняти два значення і визначити, чи правильний закритий ключ у клієнта.

Тепер, коли ви уявили загальний принцип роботи SSH, можемо перейти до прикладів, які демонструють різні способи роботи з SSH.

Робота з SSH-ключами

У цьому розділі розповімо, як створити SSH-ключі та завантажити публічний ключ на сервер. Якщо ви раніше не працювали з ключами, почніть з цього розділу, це значно підвищить безпеку майбутніх підключень.

Як створити SSH-ключі

Створення SSH-ключів на локальному комп’ютері — це перший крок до того, щоб підключатися до віддаленого сервера без пароля. Якщо немає вагомих причин відмовитися від такого способу, завжди рекомендуємо використовувати аутентифікацію з SSH-ключами.

Для генерації SSH-ключів можна використовувати такі криптографічні алгоритми як RSA, DSA та ECDSA. Алгоритм RSA вважається кращим та обраний за замовчуванням.

Щоб створити пару RSA-ключів на локальному комп’ютері, введіть:

ssh-keygen

Вам запропонують вказати шлях до файлу, в який зберігатиметься приватний ключ. Натисніть ENTER, щоб залишити значення за замовчуванням, яке збереже ключі у прихованій директорії .ssh у домашній директорії користувача. Якщо залишити місце за замовчуванням, SSH-клієнт зможе автоматично знаходити ключі.

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

Далі вам запропонують ввести парольну фразу для захисту приватного ключа. З метою безпеки вам доведеться вводити парольну фразу щоразу, коли ви використовуєте приватний ключ. Можна залишити це поле порожнім, і парольної фрази не буде. Але пам’ятайте, що це дозволить будь-кому, хто отримає доступ до вашого приватного ключа, підключитися до ваших серверів.

Enter passphrase (empty for no passphrase):
Enter same passphrase again:

Якщо ви вирішите встановити парольну фразу, під час введення нічого не відображатиметься з міркувань безпеки.

Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
8c:e9:7c:fa:bf:c4:e5:9c:c9:b8:60:1f:fe:1c:d3:8a username@123.45.67.89
The key's randomart image is:
+--[ RSA 2048]----+
|                 |
|                 |
|                 |
|       +         |
|      o S   .    |
|     o   . * +   |
|      o + = O .  |
|       + = = +   |
|      ....Eo+    |
+-----------------+

Ця процедура створила пару RSA SSH-ключів, розташовану в прихованій директорії .ssh у домашній директорії користувача. Ці файли:

  • ~/.ssh/id_rsa — Приватний ключ. НІКОМУ ЙОГО НЕ ПОКАЗАЙТЕ!
  • ~/.ssh/id_rsa.pub — Публічний ключ. Його можна вільно передавати, це безпечно.

Як створити SSH-ключі з більшою кількістю біт

SSH-ключі за замовчуванням мають довжину 2048 біт. Вона вважається досить безпечною, але ви можете вказати і більше біт для більш надійного ключа.

Для цього додайте аргумент -b із бажаною кількістю біт. Більшість серверів підтримують ключі завдовжки 4096 біт, а ось більш довгі ключі можуть і не працювати з метою захисту від DDoS-атак.

ssh-keygen -b 4096

Якщо раніше ви створили інший ключ, вам запропонують його перезаписати:

Overwrite (y/n)?

Якщо обрати “yes”, попередній ключ перезапишеться і ви більше не зможете підключитися до сервера за його допомогою. Майте це на увазі, коли перезаписуєте ключі.

Як видалити або змінити парольну фразу

Якщо ви створили парольну фразу для приватного ключа і хочете змінити або видалити її, зробити це легко. Для цього просто введіть:

ssh-keygen -p

Введіть розташування ключа, для якого хочете змінити фразу, або натисніть ENTER, щоб прийняти значення за замовчуванням.

Enter file in which the key is (/root/.ssh/id_rsa):

Введіть стару парольну фразу, яку потрібно змінити. Якщо ви забули її, відновити доступ не вийде, і вам доведеться створити нову пару ключів.

Enter old passphrase:

Потім вам запропонують запровадити нову парольну фразу. Введіть її або натисніть ENTER , щоб видалити парольну фразу.

Enter новий passphrase (empty for no passphrase):
Enter same passphrase again:

Як відобразити відбиток SSH-ключа

Кожна пара SSH-ключів має єдиний криптографічний відбиток, який можна використовувати для унікальної ідентифікації ключів. Щоб дізнатися про відбиток SSH-ключа, введіть:

ssh-keygen -l

Натисніть ENTER , якщо це правильне розташування ключа, або введіть нове розташування.

Enter file in which the key is (/root/.ssh/id_rsa):

З’явиться рядок, що містить довжину ключа, його відбиток, обліковий запис та хост, для якого він був створений, а також алгоритм, що використовується:

4096 8e:c4:82:47:87:c2:26:4b:68:ff:96:1a:39:62:9e:4e username@123.45.67.89 (RSA)

Як скопіювати публічний SSH-ключ на сервер за допомогою ssh-copy-id

Це найбільш простий варіант, якщо у вас є доступ до сервера SSH за допомогою пароля і встановлена утиліта ssh-copy-id. Ця утиліта включена в багато пакетів OpenSSH для Linux, тому вона, швидше за все, встановлена за замовчуванням.

Щоб передати публічний ключ на сервер за допомогою ssh-copy-id , введіть:

ssh-copy-id username@123.45.67.89

Потрібно ввести пароль для облікового запису користувача на віддаленому сервері:

The authenticity of host '123.45.67.89 (123.45.67.89)' can't be established.
ECAre you sure you want to continue connecting (yes/no)? yes
/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 keysusername@123.45.67.89's password:

Після введення пароля вміст вашого ключа ~/.ssh/id_rsa.pub буде додано до кінця файлу ~/.ssh/authorized_keys в обліковому записі користувача:

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

Тепер ви можете увійти до цього облікового запису без пароля:

ssh username@remote_host

Як скопіювати публічний SSH-ключ на сервер без ssh-copy-id

Якщо у вас немає утиліти ssh-copy-id, але є доступ до віддаленого сервера паролем, ви можете вивести вміст ключа і передати його в команду ssh.

На віддаленому сервері можна переконатися, що директорія ~/.ssh існує, а потім додати скопійовані дані у файл ~/.ssh/authorized_keys :

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

Потрібно ввести пароль від облікового запису на віддаленому сервері:

The authenticity of host '123.45.67.89 (123.45.67.89)' can't be established.
The authenticity of host '123.45.67.89 (123.45.67.89)' 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
username@123.45.67.89's password:

Після введення пароля ключ скопіюється у файл authorized_keys, що дозволить підключатися до сервера SSH без пароля:

ssh username@123.45.67.89

Як скопіювати публічний SSH-ключ на сервер вручну

Якщо у вас немає доступу до сервера SSH з паролем, доведеться додавати публічний ключ на віддалений сервер вручну. На вашому локальному комп’ютері знайдіть вміст файлу вашого публічного ключа за допомогою команди:

cat ~/.ssh/id_rsa.pub

Ви можете скопіювати отримане значення та вставити його у файл authorized_keys на віддаленому сервері. Для цього вам потрібно буде увійти на віддалений сервер іншим способом (наприклад, через панель керування хостингом).

ssh-rsa AAAAB3NzaC1yc2EAAAADK2B+ZVIpSDfki9UVKzT8JUmwW6NDSCuh1TmWWv11q5O3pISj2ZFl9HgH1JLknLLx44+tXfJ7mIrKNxOOwxIxvcBF8PXSYvobFYEZjGIVCEAjrUzLiIxbyCoxVyle7Q+bqgZ8SeeM8wzytsY+dVGcBxF6N4JS+zVk5eMcV385gG3Y6ON3EG112n6d+SMXY0OEBIcO6x+PnUSGHrSgpBgX7Ks1r7xqNzSgxUfQHURNsAInVzgYo9xgJDW8wUw2o8U77+xiFxgI5QSZX3Iq7YLMgeksaO4rBJEa54k8m5wEiEE1nUABAAACAQCqql6MzstZYGwnW7kj4jp4AT0VZk3ADw497M2G/12N0PPB5CnhHf7ovgy6nL1ikryghLuJ0X/vh2xPff6SQ1BL/zkOhvJCACK6Vb15mDOeCSq54Cr7kvS46itMosi/uS66+PujOO+xtAQTKRFmNZISvAcywB9GVqNAVE+ZHFa7heJLLt2wWwkARptX7udSq05paBhcpB0pHtA1Rfz3/2FWYepz6ZlN70bRly57Q06J+ZJoc9FfBCbCyYH7U/ASsmY095ywPsBo1XQ9PqhnN1/YOorJ068foQDNVpm146mUpILVxmq41Cj55YKHEazXGsdBIbXWhcrRf4G2fJLRcGUr9q8/lERo9oxRm5JFX6TCmj6kmiFqv+Ow9gI0x8GvaQ== username@123.45.67.89

На віддаленому сервері створіть директорію ~/.ssh, якщо її ще не існує:

mkdir -p ~/.ssh

Потім створіть файл ~/.ssh/authorized_keys або додайте до нього скопійований вміст за допомогою команди:

echo public_key_string >> ~/.ssh/authorized_keys

Після цього ви можете увійти на віддалений сервер без пароля.

Основні інструкції щодо підключення

У цьому розділі розглянемо основні моменти, як підключитися до сервера за допомогою SSH.

Як підключитися до віддаленого сервера

Щоб підключитися до віддаленого сервера та запустити сеанс оболонки, використовуйте команду ssh.

Якщо ім’я користувача на локальному комп’ютері збігається з ім’ям на віддаленому сервері, просто введіть:

ssh remote_host

Якщо імена користувачів відрізняються, вкажіть ім’я користувача на віддаленому сервері так:

ssh username@remote_host

При першому підключенні до нового хоста з’явиться повідомлення про достовірність хоста. Введіть “yes”, щоб продовжити.

The authenticity of host '123.45.67.89 (123.45.67.89)' 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

Далі знадобиться пройти аутентифікацію: або ввести пароль, або парольну фразу, або ви автоматично увійдете в систему (якщо парольну фразу вимкнено).

Як закрити SSH-підключення

Щоб вийти з оболонки та продовжити роботу в терміналі локального комп’ютера, використовуйте таку команду:

exit

Якщо з’єднання зависло, ви все одно можете закрити його з боку клієнта. Для цього використовуйте символ ~ з крапкою. Цей escape-код спрацює, навіть незважаючи на відсутність зворотного зв’язку, але його потрібно вводити лише з нового рядка. Тому спочатку натисніть клавішу ENTER один або два рази.

[ENTER]
~.

Після цього з’єднання має негайно закритися, і вас поверне в локальний сеанс терміналу.

Як запустити одну команду на віддаленому сервері

Ви можете не відкривати сеанс оболонки, а просто виконати одну команду на віддаленому сервері. Для цього додайте команду після інформації про підключення:

ssh username@123.45.67.89 command

В результаті ви підключитеся до віддаленого хоста, на ньому виконається вказана команда, після чого з’єднання негайно закриється.

Як зайти на сервер з іншим портом

За замовчуванням демон SSH працює на 22 портах. З метою безпеки його можна змінити на нестандартний. Так часто роблять провайдери, особливо на віртуальному хостингу. У такому разі потрібно вказати правильний порт при підключенні:

ssh -p номер-порта username@123.45.67.89

Щоб не вказувати порт щоразу, створіть або відредагуйте файл конфігурації в директорії ~/.ssh:

nano ~/.ssh/config

Тут можна встановити специфічні параметри для хоста. Наприклад, така конфігурація дозволить входити до системи без вказівки номера порту в командному рядку:

Host alias
    HostName хостнейм-сервера-або-IP
    Port номер-порта

Як використовувати агент SSH, щоб не вводити парольну фразу

Якщо ви створили парольну фразу для приватного ключа SSH, її потрібно буде вводити щоразу, коли ви підключаєтеся до віддаленого хоста. Щоб не робити цього можна запустити агент SSH. Ця утиліта зберігає ваш закритий ключ після першого введення парольної фрази. Він буде доступним протягом сеансу терміналу, що дозволить підключатися повторно, не вводячи парольну фразу.

Щоб запустити агент SSH, введіть таку команду в локальному терміналі:

eval $(ssh-agent)
Agent pid 10891

Це запустить програму агента та переведе її у фоновий режим. Тепер вам потрібно додати свій закритий ключ до агента, щоб він міг ним керувати:

ssh-add

Потрібно буде ввести парольну фразу. Після цього ваш ідентифікаційний файл додасться до агента і можна буде керувати сервером без необхідності вводити фразу повторно.

Enter passphrase for /home/username/.ssh/id_rsa:
Identity added: /home/username/.ssh/id_rsa (/home/username/.ssh/id_rsa)

Як передати ваші облікові дані SSH для використання на сервері

Якщо ви хочете мати можливість підключатися без пароля до одного сервера з іншого сервера, необхідно буде надіслати інформацію про ваш ключ SSH. Це дозволить пройти аутентифікацію на іншому сервері через сервер, до якого ви підключені, використовуючи облікові дані на вашому локальному комп’ютері.

Для початку на вашому локальному комп’ютері повинен бути запущений SSH-агент і до нього має бути доданий ваш SSH-ключ, як описано в попередньому підрозділі. Після цього необхідно підключитися до першого сервера з опцією -A. Це перенаправить ваші облікові дані на сервер для цього сеансу:

ssh -A username@123.45.67.89

Звідси ви можете підключитися SSH до будь-якого іншого хоста, до якого дозволено доступ з вашим ключем SSH. Ви підключитеся так, ніби ваш приватний SSH-ключ перебував на цьому сервері.

Базові налаштування на стороні сервера

У цьому розділі розповімо, які налаштування на стороні сервера варто змінити, щоб посилити безпеку системи. Ви навчитеся визначати, хто має право підключатися до вашого сервера та з якими параметрами.

Як вимкнути аутентифікацію за паролем

Якщо ви налаштували та протестували підключення з SSH-ключами, буде непоганою ідеєю відключити автентифікацію за паролем. Для цього підключіться до віддаленого сервера та відкрийте файл /etc/ssh/sshd_config з правами root або sudo:

sudo nano /etc/ssh/sshd_config

Знайдіть у файлі директиву PasswordAuthentication. Якщо її закоментовано, розкоментуйте її. Встановіть значення «no», щоб вимкнути пароль.

PasswordAuthentication no

Після цього збережіть зміни та закрийте файл. Щоб зміни набули чинності, слід перезапустити службу SSH.

У Ubuntu/Debian:

sudo service ssh restart

У CentOS/Fedora:

sudo service sshd restart

Тепер усі облікові записи в системі не зможуть увійти до системи з використанням паролів.

Як змінити порт SSH

Деякі адміністратори вважають, що порт за замовчуванням потрібно змінювати, щоб знизити кількість спроб підключення до сервера SSH з боку ботів.

Щоб змінити порт, який прослуховує демон SSH, зайдіть на віддалений сервер з правами root або sudo та відкрийте файл sshd_config:

sudo nano /etc/ssh/sshd_config

У цьому файлі можна змінити порт, на якому працює SSH, знайшовши директиву Port. Змініть її або закоментуйте та додайте нову з потрібним портом. Наприклад, щоб змінити порт на 4444, помістіть у файл наступне:

#Port 22
Port 4444

Збережіть та закрийте файл, коли закінчите. Щоб зміни набули чинності, перезапустіть демон SSH.

У Ubuntu/Debian:

sudo service ssh restart

У CentOS/Fedora:

sudo service sshd restart

Після перезапуску демона вам необхідно буде пройти автентифікацію, вказавши номер порту, як зазначено у попередньому підрозділі.

Як визначити користувачів, які можуть підключатися через SSH

Щоб обмежити облікові записи, які можуть входити до системи SSH, ви можете використати кілька способів. Кожен з них передбачає редагування конфігураційного файлу демона SSH.

На віддаленому сервері відкрийте цей файл із правами root або sudo:

sudo nano /etc/ssh/sshd_config

Перший спосіб — використати директиву AllowUsers. У ній необхідно прямо перелічити імена користувачів, які мають право підключатися до сервера по SSH. Якщо такої директиви немає, створіть її будь-де у файлі.

AllowUsers username-1 username-2

Збережіть та закрийте файл. Перезапустіть демон SSH, щоб зміни набули чинності.

В Ubuntu/Debian:

sudo service ssh restart

У CentOS/Fedora:

sudo service sshd restart

Якщо вам зручніше керувати групами, ви можете використовувати директиву AllowGroups. У цьому випадку просто додайте назву групи, якій має бути дозволений доступ по SSH (потім ми покажемо, як створити цю групу та додати до неї учасників):

AllowGroups sshmembers

Збережіть та закрийте файл.

Тепер ви можете створити системну групу (без домашнього каталогу):

sudo groupadd -r sshmembers

Обов’язково додайте всі необхідні облікові записи користувачів до цієї групи:

sudo usermod -a -G sshmembers username-1
sudo usermod -a -G sshmembers username-2

Тепер перезапустіть демон SSH, щоб зміни набули чинності.

В Ubuntu/Debian:

sudo service ssh restart

У CentOS/Fedora:

sudo service sshd restart

Як вимкнути вхід від імені root

Часто рекомендується відключити підключення по SSH від імені root після того, як ви створили обліковий запис користувача SSH з привілеями sudo. Для цього відкрийте файл конфігурації демона SSH за допомогою root або sudo на віддаленому сервері.

sudo nano /etc/ssh/sshd_config

Всередині знайдіть директиву PermitRootLogin. Якщо вона раптом закоментована, розкоментуйте її. Змініть значення на «no»:

PermitRootLogin no

Збережіть та закрийте файл. Щоб застосувати зміни, перезапустіть демон SSH.

В Ubuntu/Debian:

sudo service ssh restart

У CentOS/Fedora:

sudo service sshd restart

Як дозволити root-доступ для певних команд

У деяких випадках може знадобитися вимкнути root-доступ загалом, але залишити для правильної роботи певних додатків. Наприклад, для процедури резервного копіювання.

Це можна зробити за допомогою файлу authorized_keys у користувача root, де лежать ключі SSH, яким дозволено використовувати обліковий запис.

Додайте ключ, який ви хочете використовувати для процесу (рекомендуємо створювати новий ключ для кожного процесу) у файл authorized_keys у користувача root на сервері. Ми зробимо це за допомогою команди ssh-copy-id , але ви можете використовувати інший метод копіювання ключів, про які ми писали в попередніх розділах:

ssh-copy-id root@123.45.67.89

Тепер увійдіть на віддалений сервер та відкрийте файл authorized_keys з правами root або sudo:

sudo nano /root/.ssh/authorized_keys

На початку рядка з ключем додайте текст command= разом із командою, для якої буде дійсним цей ключ. Текст повинен містити повний шлях до файлу, що виконується, а також всі необхідні аргументи:

command="/path/to/command arg1 arg2" ssh-rsa ...

Збережіть та закрийте файл, коли закінчите.

Тепер відкрийте файл sshd_config з правами root або sudo:

sudo nano /etc/ssh/sshd_config

Знайдіть директиву PermitRootLogin і вкажіть «лише для примусових команд». Це дозволить використовувати root для входу в систему з ключем SSH тільки в тому випадку, якщо разом із ключем вказана команда:

PermitRootLogin forced-commands-only

Збережіть та закрийте файл. Перезапустіть демон SSH, щоб зміни набули чинності.

В Ubuntu/Debian:

sudo service ssh restart

У CentOS/Fedora:

sudo service sshd restart

Як налаштувати виконання X11 у SSH-клієнті

Демон SSH можна налаштувати так, щоб він передавав вікна X-програм з сервера на локальний комп’ютер. Для коректної роботи такого прокидання в клієнті має бути увімкнена та налаштована система X Windows.

Щоб увімкнути цю функцію, увійдіть на віддалений сервер і відредагуйте файл sshd_config від імені користувача root або з привілеями sudo:

sudo nano /etc/ssh/sshd_config

Знайдіть директиву X11Forwarding. Якщо її закоментовано, розкоментуйте її. Якщо директиви немає, створіть та встановіть значення «так»:

X11Forwarding yes

Збережіть та закрийте файл. Перезапустіть демон SSH, щоб зміни набули чинності.

В Ubuntu/Debian:

sudo service ssh restart

У CentOS/Fedora:

sudo service sshd restart

Щоб підключитись до сервера та прокинути вікно програми, вам необхідно передати опцію -X від клієнта при з’єднанні:

ssh -X username@123.45.67.89

Після цього графічні програми, запущені на сервері через цей сеанс, мають відображатися на локальному комп’ютері. Продуктивність може бути низькою, але за крайньої необхідності це все одно корисна штука.

Базові налаштування на стороні клієнта

У цьому розділі зосередимося на деяких змінах, які можна внести на клієнтській стороні з’єднання.

Як створити аліаси

У себе на локальному комп’ютері можна створити індивідуальні конфігурації для деяких або всіх серверів, до яких ви підключаєтеся. Вони можуть зберігатися у файлі ~/.ssh/config, який ваш SSH-клієнт читає під час кожного запуску.

Створіть або відкрийте файл у текстовому редакторі на локальному комп’ютері:

nano ~/.ssh/config

Усередині ви можете створити конфігурації, починаючи кожну з них з ключового слова Host, за яким слідує аліас. Під цим ключовим словом, додавши відступ, ви можете вказати будь-яку директиву з керівництва ssh_config:

man ssh_config

Приклад конфігурації:

Host vashdomen
    HostName vashdomen.com
    Port 4444
    User username

За допомогою конфігурації з прикладу ви зможете підключитися до vashdomen.com через 4444 порт від імені користувача username за допомогою команди:

ssh username

Ви також можете використовувати вайлдкард, щоб створити конфігурацію для декількох хостів одразу. Але майте на увазі, що у пізніших записів пріоритет буде вищим, ніж у ранніх. Тому слід розміщувати найбільш загальні хости вгорі. Наприклад, ви можете заборонити прокидання X11 за замовчуванням, а саме для хоста vashdomen дозволити окремо у його власному аліасі:

Host *
    ForwardX11 no

Host vashdomen
    HostName vashdomen.com
    ForwardX11 yes
    Port 4444
    User username

Не забудьте зберегти зміни у файлі, коли закінчите.

Як підтримувати з’єднання для уникнення тайм-ауту

Якщо ви виявите, що сеанс SSH дуже швидко переривається, можете налаштувати свій клієнт так, щоб він час від часу відправляв на сервер пакет і тим самим підтримував з’єднання. Це можна зробити у файлі ~/.ssh/config для кожного з’єднання.

Спочатку відкрийте файл у редакторі:

nano ~/.ssh/config

Створіть аліас зі зірочкою у верхній частині файлу, якщо ще не створили. Додайте директиву ServerAliveInterval зі значенням «120», щоб клієнт відправляв на сервер пакет раз на дві хвилини. Це повинно бути достатньо, щоб сервер не встигав закрити з’єднання:

Host *
    ServerAliveInterval 120

Збережіть та закрийте файл, коли закінчите.

Як вимкнути перевірку автентичності хоста

За промовчанням щоразу, коли ви підключаєтеся до нового сервера, термінал покаже відбиток ключа, який належить демону SSH на цьому хості.

The authenticity of host '123.45.67.89 (123.45.67.89)' can't be established.
ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe.
Чи ви хочете, щоб виконати connecting (yes/no)? yes

Так зроблено, щоб ви могли перевірити справжність хоста, до якого ви підключаєтеся, і виявити випадки, коли зловмисник намагається замаскуватися під віддалений хост. Цей функціонал можна вимкнути, але пам’ятайте, що це загроза для безпеки.

Щоб вимкнути перевірку, відкрийте файл ~/.ssh/config на локальному комп’ютері:

nano ~/.ssh/config

Створіть аліас зі зірочкою у верхній частині файлу, якщо ще не створили. Додайте директиву StrictHostKeyChecking зі значенням «no», щоб автоматично додавати нові хости до файлу known_hosts. Встановіть для UserKnownHostsFile значення /dev/null, щоб не попереджати про нові або змінені хости:

Host *
    StrictHostKeyChecking no
    UserKnownHostsFile /dev/null

Ви можете увімкнути перевірку для конкретних аліасів. Стандартне значення директиви StrictHostKeyChecking — ask:

 Host *
StrictHostKeyChecking no
UserKnownHostsFile /dev/null

Host vashdomen
HostName vashdomen.com
StrictHostKeyChecking ask
UserKnownHostsFile /home/username/.ssh/known_hosts

Налаштування SSH-тунелів

SSH-тунелі потрібні, щоб перенаправити трафік із конкретного порту однієї машини на конкретний порт іншої машини. Це ще називається «прокинути порт».

За допомогою SSH-тунелю можна обійти обмеження фаєрволу та отримати доступ до приватної мережі віддаленого сервера з локального комп’ютера, як і навпаки — забезпечити доступ до ресурсів локального комп’ютера на віддаленому сервері. А ще це чудовий спосіб зашифрувати трафік, який спочатку був незашифрованим.

У цьому розділі розглянемо кілька основних сценаріїв, в яких вам може стати в нагоді SSH-тунель, з прикладами їх налаштування.

Як налаштувати прямий SSH-тунель

Прямий тунель дозволяє підключитися з локального комп’ютера до іншої мережі через віддалений хост. Ви підключаєтеся до віддаленого хоста SSH і вказуєте цільову адресу з внутрішньої або зовнішньої мережі. Віддалений хост підключається до вказаної мережної адреси та тунелює весь трафік з локального порту на цю адресу.

Це часто використовується, щоб уникнути обмеження фаєрволу або отримати доступ до веб-інтерфейсу «тільки для локального хоста» з віддаленого місця. Наприклад, провайдери віртуального хостингу зазвичай забороняють підключатися до бази MySQL ззовні. Але якщо створити SSH-тунель, можна безпечно обійти це обмеження та працювати з базою на сервері з локального комп’ютера.

Щоб встановити прямий тунель до віддаленого сервера, використовуйте параметр -L при підключенні і надайте три частини додаткової інформації:

  • Порт на локальному комп’ютері, через який він матиме доступ до тунелю.
  • Хост, на який буде спрямовуватись трафік (зазвичай це localhost, якщо ви підключаєтеся до сервісу на віддаленому сервері).
  • Порт на віддаленому комп’ютері, до якого прокладається тунель.

Ці деталі потрібно надати у вказаному вище порядку (через двокрапки) як аргументи прапора -L. Ви також можете використовувати прапорець -f, щоб перевести SSH у фоновий режим перед виконанням, та прапорець -N, щоб просто відкрити тунель, без можливості виконувати команди на віддаленому сервері.

Наприклад, щоб підключитися до сервера MySQL на віддаленому сервері через стандартний для MySQL порт 3306 і зробити з’єднання доступним на вашому локальному комп’ютері через порт 8888, потрібно ввести таку команду:

ssh -f -N -L 8888:127.0.0.1:3306 username@123.45.67.89

Більш загальний синтаксис команди виглядатиме так:

ssh -L локальний-порт:віддалений-хостнейм-або-IP:віддалений-порт користувач@сервер

Оскільки з’єднання знаходиться у фоновому режимі, вам потрібно буде знайти його PID, щоб закрити його. Це можна зробити, виконавши пошук перенаправленого порту:

ps aux | grep 8888
1001 5965 0.0 0.0 48168 1136 ?    Ss 12:28 0:00 ssh -f -N -L 8888:127.0.0.1:3306 username@123.45.67.89
1001 6113 0.0 0.0 13648 952 pt/2 S+ 12:37 0:00 grep --colour=auto 8888

Потім ви можете завершити процес, вказавши PID процесу, який відповідає вашій команді SSH (це число у другій колонці рядка):

kill 5965

Інший варіант — запустити з’єднання без прапора -f . У цьому випадку з’єднання буде на передньому плані, не дозволяючи використовувати вікно терміналу під час роботи тунелю. Але тоді можна легко закрити тунель, натиснувши CTRL-C.

Як настроїти зворотний SSH-тунель

Зворотний тунель дозволяє надати доступ до локального комп’ютера з віддаленої мережі (ефект протилежний прямому тунелю). Ви підключаєтеся по SSH до віддаленого сервера і вказуєте порт, на якому відкриється тунель до локального хоста та порту. Після цього весь трафік, відправлений на віддалений порт, перенаправлятиметься на локальний комп’ютер.

Це може бути корисно, коли потрібно показати комусь не з вашої мережі те, що є тільки на вашому локальному комп’ютері. Наприклад, якщо на локальній машині запущено програму, ви можете створити зворотний тунель, щоб зробити його доступним з інтернету та показати замовнику.

Щоб встановити зворотний тунель до віддаленого сервера, використовуйте параметр -R при підключенні і надайте три частини додаткової інформації:

  • Порт на віддаленому комп’ютері, через який він отримає доступ до тунелю.
  • Хост, на який буде спрямовуватись трафік (зазвичай це localhost).
  • Порт на локальному комп’ютері, до якого прокладається тунель.

Ці деталі потрібно надати у вказаному вище порядку (через двокрапки) як аргументи прапора -R. Ви також можете використовувати прапорець -f, щоб перевести SSH у фоновий режим перед виконанням, та прапорець -N, щоб просто відкрити тунель, без можливості виконувати команди на віддаленому сервері.

Наприклад, щоб підключитися до vashdomen.com через порт 80 на вашому локальному комп’ютері та зробити з’єднання доступним на вашому віддаленому хості через порт 8888, потрібно ввести таку команду:

ssh -f -N -R 8888:vashdomen.com:80 username@123.45.67.89

Більш загальний синтаксис команди виглядатиме так:

ssh -R віддалений-порт:локальний-хостнейм-або-IP:локальний-порт користувач@сервер

Оскільки з’єднання знаходиться у фоновому режимі, потрібно буде знайти його PID, щоб закрити його. Це можна зробити, виконавши пошук перенаправленого порту:

ps aux | grep 8888
1001 5965 0.0 0.0 48168 1136 ?    Ss 12:28 0:00 ssh-f-N-R 8888:vashdomen.com:80 username@123.45.67.89
1001 6113 0.0 0.0 13648 952 pt/2 S+ 12:37 0:00 grep --colour=auto 8888

Потім ви можете завершити процес, вказавши PID процесу, який відповідає вашій команді SSH (це число у другій колонці рядка):

kill 5965

Інший варіант — запустити з’єднання без прапора -f . У цьому випадку з’єднання буде на передньому плані, не дозволяючи використовувати вікно терміналу під час роботи тунелю. Але тоді можна легко закрити тунель, натиснувши CTRL-C.

Як настроїти динамічний тунель (SOCKS-proxy)

Динамічний тунель використовується для підключення з локального комп’ютера до інших ресурсів через віддалений сервер. У цьому плані він схожий на прямий тунель, але для його роботи не потрібно вказувати кінцевий хост, лише локальний порт. Трафік, відправлений на цей порт, передаватиметься на віддалений сервер, а звідти переадресовуватиметься на адресу, вказану в запиті.

Програми, які використовуватимуть такий тунель (зазвичай це інтернет-браузер), повинні підтримувати протокол SOCKS, тому що саме за його допомогою пакети перенаправлятимуться правильно на інший бік. У результаті віддалений сервер виступатиме в ролі проксі, а також додатково зашифровуватиме трафік по SSH.

Це може стати у пригоді, щоб захистити свій трафік у публічних мережах (наприклад, у кафе чи торговому центрі), а також обійти блокування, які можуть бути налаштовані в таких мережах.

Щоб встановити динамічний тунель, скористайтеся прапором -D разом із локальним портом, через який хочете отримати доступ до тунелю. Ви також можете використовувати прапорець -f, щоб перевести SSH у фоновий режим перед виконанням, та прапорець -N, щоб просто відкрити тунель, без можливості виконувати команди на віддаленому сервері.

Наприклад, щоб встановити тунель на порту 8888, можна ввести:

ssh -f -N -D 8888 username@123.45.67.89

З цього моменту ви можете налаштувати програму, що підтримує протокол SOCKS (наприклад, браузер), для підключення до вибраного порту. Програма відправить свої дані до сокету, пов’язаного з цим портом.

Спосіб перенаправлення трафіку на порт SOCKS буде відрізнятися залежно від програми. Наприклад, у Firefox це можна зробити через Налаштування > Основні > Налаштування мережі > Налаштування проксі вручну. У Chrome можна запустити програму з прапором –proxy-server=, використовуючи інтерфейс localhost та обраний порт.

Оскільки з’єднання знаходиться у фоновому режимі, потрібно буде знайти його PID, щоб закрити його. Це можна зробити, виконавши пошук перенаправленого порту:

ps aux | grep 8888
1001 5965 0.0 0.0 48168 1136 ?    Ss 12:28 0:00 ssh -f -N -D 8888 username@123.45.67.89
1001 6113 0.0 0.0 13648 952 pt/2 S+ 12:37 0:00 grep --colour=auto 8888

Потім ви можете завершити процес, вказавши PID процесу, який відповідає вашій команді SSH (це число у другій колонці рядка):

kill 5965

Інший варіант — запустити з’єднання без прапора -f. У цьому випадку з’єднання буде на передньому плані, не дозволяючи використовувати вікно терміналу під час роботи тунелю. Але тоді можна легко закрити тунель, натиснувши CTRL-C.

Що далі

У цьому посібнику ми постаралися охопити інформацію про SSH, яка буде корисною у повсякденному житті для більшості користувачів. Якщо у вас є інші поради або ви хочете поділитися своїми улюбленими конфігураціями, залиште коментар трохи нижче.

Чи була ця стаття корисною?

Дякуємо за відгук!