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

Що ж являє собою цей спосіб зв’язку з сервером і як зробити підключення максимально безпечним?

Що являє собою SSH з’єднання

SSH (Secure shell) — мережевий протокол, призначений для отримання безпечного віддаленого доступу до операційної системи та керування нею.

У Linux системах підключення за захищеним протоколом здійснюється за допомогою наступної команди:

ssh user_name@remote_host

Під віддаленим хостом у разі мається на увазі IP-адреса чи домен, до якого ви хочете подключиться. Для входу на сервер, система запросить ввести пароль авторизації. Після успішного підключення ви отримаєте доступ до керування пристроєм через командний рядок.

Щоб перервати з’єднання і повернутися до локальної сесії, достатньо ввести в консолі exit.

У разі використання операційної системи Windows можна скористатися SSH-клієнтом PuTTy, робота з яким описана в нашій статті.

Налаштування параметрів підключення по SSH

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

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

Про всяк випадок створюємо резервну копію конфігураційного файлу з налаштуваннями:

cp /etc/ssh/sshd_config{,.bak}

Приставка {,.bak} дозволяє скопіювати файл із зазначеним ім’ям та розширенням bak, яке присвоюється резервним копіям.

Тепер через текстовий редактор, наприклад, vim, emacs, nano, відкриваємо файл /etc/ssh/sshd_config і вносимо в нього основні правки. З метою підвищення безпеки SSH з’єднання нас цікавлять такі параметри:

  1. PermitRootLogin
  2. AllowUsers, AllowGroups
  3. DenyUsers, DenyGroups
  4. Port
  5. ListenAddress
  6. Login GraceTime
  7. ClientAliveInterval
  8. HostbasedAuthentication.

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

PermitRootLogin
Цей параметр встановлює дозвіл на вхід у систему як користувач. Для підвищення безпеки з’єднання рекомендується вимкнути таку можливість. змінити встановлене у файлі значення «Yes» на «No»:

PermitRootLogin no

За таких умов виконувати команди з правами користувача після входу на сервер можна буде за допомогою функцій su або sudo.

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

AllowUsers user1 user2 user3
AllowGroups group1 group2 group3

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

DenyUsers, DenyGroups
Коли користувачів у системі багато і потрібно надати віддалений доступ більшості з них, при цьому заборонивши його окремим особам та групам, файл sshd_config вносить правки до параметрів DenyUsers, DenyGroups. Навпроти цих параметрів, аналогічно до прикладу з AllowUsers, AllowGroups, перераховуємо імена користувачів та груп, яким буде відмовлено у доступі на сервер SSH.

DenyUsers user1 user2
DenyGroups group1 group2

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

Port
Щоб ускладнити завдання хакерам, варто подбати про гарне маскування свого ssh-порту.

За замовчуванням ssh-з’єднання здійснюватиметься через 22-й порт. Щоб порт для підключення не був такий очевидний, змініть порт SSH на будь-який інший, бажано найменш стандартний, наприклад:

Port 22540

ListenAddress
Крім того, що ssh-з’єднання налаштовано на певному порті, підключення здійснюється на різних мережевих інтерфейсах. Іншими словами, сервер слухає безліч IP-адрес. Існує можливість вказати в конфігураційному файлі конкретні адреси інтерфейсів для входу на сервер за допомогою ListenAddress. Наприклад:

ListenAddress 192.168.1.2

Login GraceTime
За замовчуванням, при підключенні до сервера по ssh користувач має 2 хвилини для введення логіну і пароля. Такого проміжку більш ніж достатньо, причому не лише для авторизованого користувача, а й для хакера. Тому час очікування на введення цих даних варто обмежити до 30-60 секунд, залежно від ваших уподобань.

Login GraceTime 30

ClientAliveInterval
Цей параметр призначений для визначення часу бездіяльності користувача, після якого з’єднання автоматично розривається. Період очікування необхідно вказати в секундах, наприклад:

ClientAliveInterval 300

HostbasedAuthentication
Також варто вимкнути авторизацію користувача на основі хоста за допомогою директиви:

HostbasedAuthentication не

Найкраще скористатися автентифікацією на основі ключів.

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

Закриття порту SSH

Ще однією перешкодою для злому вашого сервера є закриття SSH-порту або port knocking. Особливо актуально використовувати цю технологію для серверів, які не призначені для загального доступу (наприклад, сервери зберігання конфіденційних даних компанії тощо).

Суть port knocking полягає в тому, що всі порти сервера спочатку закриті для зовнішніх підключень. Відкриття порту та можливість доступу до нього здійснюється за рахунок застосування певної послідовності стуків. Ця технологія використовується як додаток до наведених вище налаштувань, застосування паролів та ключів.

Механізм роботи port knocking досить простий. Ви встановлюєте на сервер демон knockd, налаштовуєте необхідну послідовність стуків у файлі /etc/knockd.conf і отримуєте нехитрий у використанні, але надійний на практиці інструмент протидії хакерам. Справа в тому, що в інтернет-просторі налічується близько 60 000 вільних портів, через які можна здійснити SSH-підключення. Для доступу до порту використовують, як правило, послідовність з трьох стуків. Це означає, що підібрати правильний набір портів випадковим чином або їх прорахувати стає дуже складно, а це саме те, чого ми домагаємося.

Отже, встановлюємо knockd демон:

sudo apt-get install knockd – для Ubuntu
sudo aptitude install knockd – для Debian

Тепер у конфігураційному файлі /etc/knockd.conf налаштовуємо послідовність стуків, яка відкриватиме наш порт. Для цього в секції sequence перераховуємо через кому без пропуску номери портів, наприклад:

sequence = 6240,7000,8490

Коли ви намагаєтеся «достукатися» до порту, передача даних здійснюється за протоколом TCP. Проте, для підвищення рівня безпеки з’єднання можна додати інші протоколи, наприклад UDP:

sequence = 6240,7000: udp, 8490

Пакети TCP, які надходять на сервер, потребують різних дій з боку системи. Щоб уникнути зайвого навантаження та відфільтрувати зайве, використовують параметр TCPFlags, який також прописують у файлі /etc/knockd.conf:

tcpflags = syn

Прапор SYN означає запит на з’єднання. Тобто демон knockd скануватиме лише ті пакети, які містять запит на з’єднання з сервером.

Вище ми говорили, що SSH-підключення здійснюється на різних мережевих інтерфейсах. За замовчуванням knockd розрахований на роботу з eth0. Щоб дати можливість демону контролювати інші інтерфейси, наприклад, eth1, до файлу /etc/knockd.conf додамо рядок:

Interface=eth1

Щоб «постукати» в порт, потрібен певний час. Якщо ви знаєте, яку послідовність потрібно ввести, достатньо 15-30 секунд. Саме цією межею варто обмежити максимальний час, необхідний для завершення послідовності стуків:

seq_timeout = 20

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

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

cmd_timeout = 30

Відповідно, через 30 секунд порт закриється, якщо дані для авторизації не будуть успішно введені.

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

Для цього існують команди start_command та stop_command, відповідно.

Якщо послідовність стуків вірна, демон повинен відкрити порт SSH, через який необхідно здійснити підключення. Для цього у конфігураційному файлі /etc/knockd.conf прописуємо команду для start_command:

start_command= /usr/sbin/iptables -A INPUT -s %IP% -p tcp --dport 22716 -j ACCEPT

У разі, коли стуки були неправильними або користувач не встиг її ввести повністю до закінчення відведеного часу, knockd робить порт недоступним (невидимим).

stop_command= /usr/sbin/iptables -D INPUT -s %IP% -p tcp --dport 22716 -j ACCEPT

Фактично ми налаштовуємо правила iptables (брандмауера), де:

  • INPUT означає вхідний пакет
  • -A та -D — додавання та видалення правила, відповідно
  • -s — IP джерело пакету
  • %IP% — адреса, з якої йде запит на відкриття порту
  • -p — протокол (у разі tcp)
  • –dport — SSH-порт, який ми хочемо відкрити
  • -j — ключ, що вказує на дію над пакетом (accept — прийняти)

Коли все налаштовано та готове до роботи, запускаємо демон у фоновому режимі за допомогою команди knockd -d.

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

knock адреса_сервера 6240 7000:udp 8490
ssh адреса_сайту -p 22716 -o ConnectTimeout=30
Password:

Як бачите, на введення даних дається 30 секунд.

Адреса сервера, до якого ви підключаєтеся, може бути виражена двома способами:

  • IP-адресою;
  • хостнеймом.

У першому випадку запит на підключення буде виглядати так:

ssh -p 22716 username@1.1.1.1

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

ssh -p 22716 username@server.vps.ua

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