Вступ
Привіт. Іноді ми підключаємося до віддаленого комп’ютера за допомогою технології ssh (secure shell). Спочатку ми генеруємо пару ключів: приватний та публічний. Публічний кладемо на віддалений комп’ютер. Далі вбиваємо в терміналі щось на зразок ssh [email protected] З’єднання встановлено і ми можемо працювати на віддаленому комп’ютері як на власному. Чудово, але що робити, якщо ви хочете підключатися до кількох віддалених комп’ютерів? Можна вчинити безглуздо і покласти на всі віддалені сервери той самий публічний ключ. Це працюватиме, але значно знизить безпеку таких з’єднань. Краще щоб, кожне з’єднання здійснювалося зі своєю парою приватного та публічного ключа. Наприклад, якщо вам знадобиться дати своєму колезі доступ до сервера, ви можете передати йому лише один ключ (в ідеалі потрібно згенерувати новий) і колега отримає доступ тільки до одного комп’ютера, а не до всіх відразу. До того ж різні сервери мають різні ip адреси, на них встановлені різні користувачі, можуть бути нестандартні порти та інші дрібниці. Все це потрібно пам’ятати або десь записувати. Все це забирає наш дорогоцінний час.
Один із варіантів – створити псевдонім (bash alias) для кожного підключення до віддаленого сервера. Однак є інше, набагато краще і просте вирішення цієї проблеми. SSH дозволяє налаштувати файл конфігурації для кожного користувача, в якому ви можете зберігати різні параметри SSH для кожної віддаленої машини, до якої ви підключаєтеся
Попередження
Передбачається, що ви використовуєте систему Linux або macOS із встановленим клієнтом SSH (В операційних системах Windows процедура може відрізнятися).
Розташування файлу конфігурації SSH
Файл конфігурації на стороні клієнта називається config
та зберігається у каталозі .ssh
в домашньому каталозі користувача.
Каталог ~/.ssh
створюється автоматично, коли користувач запускає команду ssh уперше. Якщо каталог не існує у вашій системі, створіть його за допомогою наступної команди:
$ mkdir -p ~/.ssh && chmod 700 ~/.ssh
За замовчуванням файл конфігурації SSH може не існувати, тому вам може знадобитися створити його за допомогою команди touch:
$ touch ~/.ssh/config
Цей файл має бути доступним для читання та запису тільки користувачеві і не повинен бути доступним для інших, тому встановіть наступні права командою chmod:
$ chmod 600 ~/.ssh/config
Структура та шаблони конфігураційного файлу SSH
Файл конфігурації SSH має таку структуру:
Host hostname1 SSH_OPTION value SSH_OPTION value Host hostname2 SSH_OPTION value Host * SSH_OPTION value
Вміст конфігураційного файлу клієнта SSH організований за допомогою розділів. Кожен розділ починається з директиви Host містить певні параметри SSH, які використовуються при встановленні з’єднання з віддаленим SSH-сервером.
Директива Host може містити один патерн або список патернів, розділених пробілами (у прикладі вище патернами є (hostname1, hostname2, *).) Кожний патерн (я їх ще називаю шаблони) може містити нуль або більше не пробільних символів або один з наступних специфікаторів шаблону:
- * — відповідає нулю або будь-якій кількості символів. Наприклад, Host* відповідає всім хостам, а 192.168.0.* Відповідає хостам у підмережі 192.168.0.0/24.
- ? — Відповідає рівно одному символу. Шаблон, Host 10.10.0? відповідає всім хостам у діапазоні 10.10.0.[0–9].
- ! — При використанні на початку шаблону скасовується збіг. Наприклад, Host 10.10.0.* !10.10.0.5 відповідає будь-якому хосту в підмережі 10.10.0.0/24, крім 10.10.0.5.
Трохи схоже на регулярні вирази, правда?
Клієнт (програма) SSH читає файл конфігурації розділ за розділом, і якщо збігаються кілька розділів їхні правила сумуються. Так само, якщо збігаються кілька правил, то правила з першого розділу, що збігається, мають найвищий пріоритет. Тому більш специфічні для хоста правила мають бути дані на початку файлу, а загальні перевизначення – наприкінці файлу.
Ви можете знайти повний список доступних опцій ssh, набравши man ssh_config у своєму терміналі або відвідавши сторінку керівництва ssh_config.
Файл конфігурації SSH також читається іншими програмами, такими як scp, sftp та rsync.
Приклад файлу конфігурації SSH
Тепер, коли ми розглянули основи конфігураційного файлу SSH, давайте розглянемо наступний приклад. Зазвичай під час підключення до віддаленого сервера через SSH ви вказуєте ім’я віддаленого користувача, ім’я хоста та порт. Наприклад, щоб увійти в систему як користувач з ім’ям john на хост з ім’ям dev.example.com на порту 2322 з командного рядка, ви повинні ввести:
$ ssh [email protected] -p 2322
Все це треба пам’ятати. Фууу. Давайте зробимо життя легшим.
Додайте наступні рядки до файлу конфігурації та збережіть файл:
Host dev HostName dev.example.com User john Port 2322
Тепер, коли ви вводите ssh dev
, клієнт ssh читатиме файл конфігурації і використовувати дані підключення, вказані для хоста dev
:
$ ssh dev
Приклад загального конфігураційного файлу SSH
Цей приклад дає більш детальну інформацію про шаблони хоста та пріоритети опцій:
Host targaryen HostName 192.168.1.10 User daenerys Port 7654 IdentityFile ~/.ssh/targaryen.key Host tyrell HostName 192.168.10.20 Host martell HostName 192.168.10.50 Host *ell user oberyn Host * !martell LogLevel INFO Host * User root Compression yes
Коли ви вводите ssh targaryen, клієнт ssh читає конфігураційний файл і застосовує параметри з першого збігу, тобто Host targaryen. Потім він перевіряє наступні розділи один за одним на відповідність шаблону. Наступним підходящим варіантом є Host *! Martell (тобто всі хости, крім martell), і він застосує параметри підключення з цього розділу теж. Останнє визначення Host * також збігається, але клієнт ssh використовуватиме лише параметр Compression, оскільки параметр User
вже визначений у розділі Host targaryen.
Ось список параметрів, які використовуються під час введення ssh targaryen
:
HostName 192.168.1.10 User daenerys Port 7654 IdentityFile ~/.ssh/targaryen.key LogLevel INFO Compression yes
При введенні ssh tyrell відповідними шаблонами хоста є: Host tyrell, Host *ell, Host * !martell та Host *. У цьому випадку використовуються такі параметри:
HostName 192.168.10.20 User oberyn LogLevel INFO Compression yes
Якщо ви запустите ssh martell, шаблони хостів будуть наступними: Host martell, Host *ell та Host*. У цьому випадку використовуються такі параметри:
HostName 192.168.10.50 User oberyn Compression yes
Для всіх інших підключень клієнт ssh буде використовувати параметри, вказані в розділах Host *! martell та Host*.
Перевизначення параметрів конфігурації SSH
Клієнт ssh зчитує свою конфігурацію у наступному порядку пріоритету:
- Параметри, вказані в командному рядку.
- Опції визначені в
~/.ssh/config
- Опції визначені в
/etc/ssh/ssh_config
Якщо ви бажаєте перевизначити один параметр, можна вказати його в командній рядку. Наприклад, якщо ви маєте наступну конфігурацію:
Host dev HostName dev.example.com User john Port 2322
і ви хочете використовувати ті самі параметри, але для підключення від імені користувача root
замість john
просто вкажіть користувача в командній рядку:
$ ssh -o "User=root" dev
Прапор -F
( configfile
) дозволяє вказати альтернативний конфігураційний файл для кожного користувача.
Щоб вказати ssh-клієнту ігнорувати всі параметри, вказані у файлі конфігурації ssh, використовуйте:
$ ssh -F /dev/null [email protected]
Висновок
Сподіваюся що ця стаття трохи полегшить ваше життя. Нижче я написав кілька корисних нотаток.
За замовчуванням SSH прослуховує порт 22. Зміна порту SSH за замовчуванням додає додатковий рівень безпеки вашому серверу, знижуючи ризик автоматичних атак.
Якщо вам потрібно додати нові ключі, можете створити їх наступною командою (прапор -С дозволяє задати шлях для нових ключів, а також дозволяє вказати ім’я майбутньої пари ключів), але будьте обережні, якщо ви створите ключі в директорії де вже є ключі з тими ж іменами нові перезапишуть старі. Детальніше дізнатися про роботу з ключами аутентифікації можна в статі “Налаштування аутентифікації на базі ключів SSH на сервері Linux“
$ ssh-keygen -t rsa -b 4096 -C "[email protected]" -f $HOME/.ssh/new_folder/id_rsa
Якщо помітили помилки чи неточності, будь ласка, залишіть коментар чи напишіть листа на поштову адресу [email protected]