Використання файлу конфігурації SSH

Вступ

Привіт. Іноді ми підключаємося до віддаленого комп’ютера за допомогою технології 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 зчитує свою конфігурацію у наступному порядку пріоритету:

  1. Параметри, вказані в командному рядку.
  2. Опції визначені в ~/.ssh/config
  3. Опції визначені в /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]

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *