SSH (ч.2): Налаштування сервера OpenSSH

4 квітня 2023 2 хвилин Автор: Endpool

Як налаштувати SSH сервер (sshd) ?

SSH — це протокол для безпечного обміну даними між двома комп’ютерами через ненадійну мережу. SSH захищає конфіденційність і цілісність переданих ідентифікаційних даних, даних і файлів. Він працює на більшості комп’ютерів і практично на кожному сервері. Він стандартно поставляється на машинах UNIX, Linux і macOS і використовується в понад 90% усіх центрів обробки даних у світі. Це універсальне рішення, яке дає можливість передачі будь-якого протоколу Мережі. Ключова особливість полягає в тому, що SSH шифрує трафік, роблячи з’єднання безпечними. Протокол SSH і ключі SSH забезпечують щоденну безпеку сотень мільйонів сеансів обслуговування, передачі файлів і автоматизованих процесів.

Це, в свою чергу, дозволяє передавати по захищеному каналу відео та аудіо формат файлів, стискає дані для їх подальшого надійного шифрування та передачі. Сервер OpenSSH (sshd) читає файл конфігурації під час запуску служби. Будь-які зміни у файлі конфігурації вимагають перезапуску служби. Служба sshd зчитує налаштування конфігураційного файлу /etc/ssh/sshd_config. Цей файл містить пари “ключове слово – аргумент”, одна пара на одному рядку. Для кожного ключового слова буде використано перше отримане значення (виняток становлять кілька директив, які можна використовувати кілька разів, і кожного значення буде враховано, наприклад, Port і ListenAddress). Опціонально аргументи можна укласти в подвійні лапки (“), щоб передати аргументи, що містять прогалини. Ключові слова не чутливі до регістру, а аргументи чутливі до регістру. Багато директив закоментовані, але вони вказують на значення за умовчанням, яке все одно використовується. Якщо вас влаштовує значення за замовчуванням, то нічого не потрібно змінювати. Якщо ж ви хочете інше значення, потрібно розкоментувати рядок з відповідною директивою (прибрати символ #) і внести зміни. Додатково можна вказати опції командного рядка – вони мають пріоритет над налаштуваннями у конфігураційному файлі.

Перезапуск служби SSH

Якщо між sshd.service та sshd.socket ви вибрали запуск sshd.service, то щоб внесені в конфігураційний файл зміни набули чинності.

необхідно перезапустити службу:

Для sshd.socket перезапуск служби потрібний тільки при зміні номера порту (як показано нижче) і робиться це так:

Як змінити порт, на якому працює сервер OpenSSH ?

Усі налаштування виконуються у файлі /etc/ssh/sshd_config або у рядку команди запуску sshd. Для sshd.socket зміна порту, що прослуховується службою, відбувається інакше. Якщо ви використовуєте sshd.service (пояснення в першій частині), зміна порту також відбувається у файлі /etc/ssh/sshd_config.

Для цього розкоментуйте директиву Port та вкажіть нове значення:

Опцію Port можна використовувати кілька разів. Також можна встановити порт за допомогою ListenAddress. Якщо ви використовуєте сокет sshd.socket і хочете поміняти для SSH порт, що прослуховується, то вам потрібно редагувати спеціальний файл наступним чином:

Там можна вказати лише порт: [Socket] ListenStream= ListenStream=23456

А також IP та порт: [Socket] ListenStream= ListenStream=172.0.0.1:12345

Зверніть увагу, що використання ListenStream двічі в одному конфігураційному файлі не є помилкою. Якщо ви використовуєте ListenStream тільки один раз із зазначенням порту, тоді прослуховуватимуться і 22 порт і порт, який ви вказали. Перше використання ListenStream= відключає прослуховування 22 портів. Для sshd.socket інші настройки, як завжди, у файлі /etc/ssh/sshd_config. Але директиви Port та ListenAddress будуть ігноруватися (якщо вибрано прослуховування сокету).

Як вибрати інтерфейс (IP) для прослуховування ?

У системі може бути кілька мережевих інтерфейсів з кількома IP адресами, за промовчанням sshd прослуховує їх усі, в тому числі IPv6 :

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

Директиву ListenAddress можна використовувати кілька разів у одному конфігураційному файлі. Дозволено такі формати:

Якщо порт не вказано, sshd буде прослуховувати на вказаному порту відповідно до всіх встановлених опцій Port у цьому файлі. Кваліфікатор rdomain є необов’язковим, він має відношення до маршрутизації. Також зверніть увагу, що з ListenAddress обов’язково має бути вказано ім’я хоста (адреса) АБО порт. Можна вказати окремо ім’я хоста (адреса), можна вказати окремо порт, а також можна вказати їх разом. У всіх випадках rdomain може бути відсутнім. Опції командного рядка (про їх використання далі) мають пріоритет над директивами файлу конфігурації. У тому числі опція для встановлення порту, що використовується, призводять до того, що Port в конфігураційному файлі ігнорується. Але порти, вказані з ListenAddress, перезаписують порти в рядку команди. Ви можете вказати конкретний IP, який прослуховуватиметься в очікуванні підключень. А опцією AddressFamily ви можете вибрати для прослуховування всі адреси, тільки IPv4 або лише IPv6:

Варіанти:

  • any (по умолчанию — любые адреса),

  • inet (использовать только IPv4),

  • inet6 (использовать только IPv6),

Чому користувач root не може підключитися через SSH з вірним паролем. Як заборонити або дозволити підключення root SSH ?

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

Перевірте значення директиви :

За замовчуванням вона закоментована, але вказане значення все одно використовується за умовчанням. Директива PermitRootLogin визначає, чи може root виконати вхід, використовуючи ssh. Аргументами можуть бути: yes, prohibit-password, forced-commands-only або no. Значенням за промовчанням є prohibit-password. Якщо ця опція встановлена ​​на prohibit-password (або застарілий псевдонім without-password), то вхід паролем та інтерактивна автентифікація з клавіатури відключені для користувача root. Якщо цю опцію встановлено на forced-commands-only, вхід root з автентифікацією за публічним ключем буде дозволений, але тільки якщо була вказана опція ForceCommand з командою (це може бути корисним для отримання віддалених бекапів, навіть якщо нормальний вхід root не дозволено). Усі інші методи автентифікації відключені для root. Якщо цю опцію встановлено на no, то root’у не дозволено вхід зовсім. Якщо опцію встановлено на yes, то дозволено вхід для рута без обмежень. Отже, якщо ви зіткнулися з проблемою, що не можете виконати вхід з вірним паролем під користувачем root, то або налаштуйте вхід без пароля – за публічним ключем, або встановіть значення цієї директиви на yes.

Заборона та дозвіл входу в SSH за паролем звичайним користувачам

Трохи вище ми розглянули варіант, коли користувачеві root заборонити вхід паролем. Таке ж налаштування можна зробити для решти користувачів, для цього використовується директива PasswordAuthentication. Значенням за промовчанням є yes, тобто вхід за паролем дозволено. Для заборони входу пароля всім користувачам, встановіть значення цієї директиви на no.

Дозвіл входу без пароля

За дозвіл входу без пароля відповідає директива PermitEmptyPasswords. Вона потрібна для специфічних випадків, щоб дозволити вхід до акаунтів з порожнім парольним рядком. За промовчанням встановлено на no.

Як дозволити або заборонити користувачам входити через SSH ?

Усього є 4 директиви, які дозволяють або забороняють користувачам та групам підключатися до SSH. Ці директиви в порядку обробки: DenyUsers, AllowUsers, DenyGroups і нарешті AllowGroups. За ключовим словом AllowUsers може йти список шаблонів імен користувачів, розділених пробілами.

Наприклад:

Якщо директива використовується, вхід дозволено лише користувачам, імена яких відповідають шаблонам. Приймаються лише імена користувачів, а цифрові ідентифікатори користувачів не розпізнаються. За промовчанням вхід дозволено всім користувачам. Якщо шаблон має вигляд КОРИСТУВАЧ@ХОСТ, тоді окремо перевіряються КОРИСТУВАЧ та ХОСТ і вхід дозволяється лише певним користувачам із певних хостів. Як ХОСТ можуть бути адреси у форматі CIDR, тобто у вигляді адрес/маска. Далі про шаблони, які можуть приймати директиви DenyUsers, AllowUsers, DenyGroups та AllowGroups.

Шаблони у файлі налаштувань SSH

Шаблон складається з нуля або більше символів, які не є білими пробілами, ‘*’ (підстановочного символу, що відповідає нулю або більше символів), а також ‘?’ (підстановковий символ, який відповідає рівно одному символу).

Наприклад, щоб охарактеризувати будь-який хост у наборі доменів “.co.uk” можна використовувати наступний шаблон:

Наступний шаблон буде відповідати будь-якому хосту в діапазоні 192.168.0.[0-9]:

Список шаблонів — це кілька шаблонів, розділених комою. Шаблони всередині списку можуть мати протилежне значення якщо перед ними стоїть знак оклику («!»).

Наприклад, для дозволу ключа використовувати будь-де всередині організації, крім пулу “dialup”, можна використовувати наступне (в authorized_keys):

Негативний збіг ніколи сам собою не дасть позитивних результатів. Спроба зіставити хост “host3” – не знайде збігів:

Рішенням для такої ситуації є включення терміна, який призведе до позитивного збігу, ним може бути символ підстановки:

Як дозволити з’єднання лише з певного IP або групи IP та заблокувати певні IP ?

За допомогою директив (перераховані в порядку обробки) DenyUsers, AllowUsers, DenyGroups та AllowGroups та шаблонів можна налаштувати дозволи для доступу до SSH через IP. Розглянемо кілька прикладів. Якщо файл sshd_config додати фільтрацію з AllowUsers:

Доступ для johndoe та admin2 тільки з адрес 192.168.1.*, а для otherid1, otherid2 доступ буде відкритий з будь-якої адреси:

Щоб дозволити доступ до SSH будь-яким користувачам, але тільки з певних IP, у файлі /etc/ssh/sshd_config використовуйте директиву AllowUsers з символом підстановки:

Можливо обмежити ключ ssh або ключ на основі ca набором адрес у файлі .ssh/authorized_keys домашнього каталогу даного користувача.

У цьому прикладі відкритий ключ для користувачів буде діяти тільки з заданих адрес:

Налаштування журналів SSH сервера

Служба SSH не веде свій власний лог та записує події в системний журнал. Можна налаштувати подробиці ведення журналу — рівень вербальності, тобто які саме повідомлення записуватимуться до цього журналу. Для цього використовується директива LogLevel. Її значенням за умовчанням є INFO.

Також доступні такі варіанти:

  • QUIET

  • FATAL

  • ERROR

  • INFO

  • VERBOSE

  • DEBUG

  • DEBUG1

  • DEBUG2

  • DEBUG3

DEBUG та DEBUG1 є еквівалентами. DEBUG2 та DEBUG3 — кожен вказує на вищі рівні виведення налагоджувальної інформації. Ведення журналу на рівні DEBUG порушує політику приватності користувачів та не рекомендується.

Запуск SSH без від’єднання від терміналу

Запуск служби sshd описано у 1-ій частині. Також, sshd можна запустити на ім’я файлу,  вказати повний шлях до файлу sshd, щоб дізнатися його:

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

Додатково можна вказати опцію -d для увімкнення режиму налагодження:

Як перевірити конфігураційний файл сервера SSH без запуску служби ?

-e – Записувати журнали налагодження у стандартне виведення помилок замість системного журналу.
-t – Тестовий режим. Тільки перевіряє правильність файлу конфігурації та працездатність ключів. Це корисно для надійного оновлення sshd, оскільки параметри конфігурації можуть бути змінені.
-T – Розширений тестовий режим. З цією опцією sshd перевірить правильність конфігураційного файлу, виведе діючу конфігурацію в стандартний висновок і потім завершить роботу.
-f – За допомогою цієї опції можна вказати шлях до іншого конфігураційного файлу (за замовчуванням /etc/ssh/sshd_config). sshd відмовиться запускатись без конфігураційного файлу.
-C – Якщо встановлено, будь-які директиви Match у файлі конфігурації, які будуть застосовуватися, застосовуються до запису конфігурації стандартний висновок.

-q – Тихий режим. Нічого не надсилає до системного журналу. Без цієї опції зазвичай запуск, автентифікація та завершення кожного з’єднання реєструються.
-E – Файл_журналу – Додати журнали налагодження у файл_журналу замість системного журналу.
-c – host_certificate_file – Вказує шлях до файлу сертифіката для ідентифікації sshd під час обміну ключами. Файл сертифіката повинен відповідати файлу ключа хоста, вказаному за допомогою -h або директиви конфігурації HostKey.
-h – host_key_file – Вказує файл, з якого читається ключ хоста. Ця опція повинна бути вказана, якщо sshd не запускається від імені користувача root (оскільки звичайні файли ключів хоста зазвичай не читаються ніким, крім root). За замовчуванням це /etc/ssh/ssh_host_ecdsa_key, /etc/ssh/ssh_host_ed25519_key та /etc/ssh/ssh_host_rsa_key.
-p – порт – Вказує порт, на якому сервер прослуховує з’єднання (за промовчанням 22). Дозволяється використання кількох портів. Порти, вказані у конфігураційному файлі з параметром «Port», ігноруються, якщо вказано порт командного рядка. Порти, вказані за допомогою ListenAddress, перевизначають порти командного рядка.
-o – опція – Може використовуватися для встановлення параметрів у форматі, який використовується у файлі конфігурації (sshd_config). Це корисно для визначення параметрів, для яких немає окремого прапора командного рядка. Найважливіші директиви файлу конфігурації розглянуті вище.

Інші опції sshd

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

З іншими опціями конфігураційного файлу sshd (англійською мовою) ви зможете ознайомитись за допомогою команди:

Інформацію про опції командного рядка можна побачити за допомогою:

Інші статті по темі
Знайшли помилку?
Якщо ви знайшли помилку, зробіть скріншот і надішліть його боту.