15 SSH-конфігурацій для безпеки
SSH (Secure Shell) — один із найважливіших інструментів для сисадмінів. Він дає змогу безпечно підключатися до віддалених серверів, запускати команди, налаштовувати порти й навіть запускати графічні застосунки.
Але є одне «але» — стандартні налаштування SSH не завжди безпечні. Хакери постійно сканують інтернет у пошуках відкритих портів та слабких логінів.
Тому тримай свій путівник з налаштування SSH: 15 ключових порад, що зроблять підключення безпечнішим
1. Зміна стандартного порту SSH
Стандартно SSH слухає порт 22. Це перший порт, який перевіряють автоматичні сканери, щоб знайти сервер із відкритим SSH-доступом і спробувати зламати пароль.
Зміна порту на нетиповий зменшує кількість таких автоматичних атак і робить сервер трохи складнішим для випадкових сканів.
Щоб змінити порт, відкрий конфігураційний файл SSH:
sudo nano /etc/ssh/sshd_config
#Port 22
Port 2200
- Рядок
#Port 22потрібно розкоментувати та вказати новий порт. - У цьому прикладі використаний порт
2200, але ти можеш вибрати будь-який інший.
Після зміни порту перезапусти SSH-сервіс:
sudo systemctl restart ssh # Debian/Ubuntu
sudo systemctl restart sshd # RHEL/CentOS
Важливо: на Debian та Ubuntu сервіс називається ssh, на RHEL і CentOS — sshd.
Також потрібно дозволити новий порт у фаєрволі:
FirewallD:
sudo firewall-cmd --permanent --zone=public --add-port=2200/tcp
sudo firewall-cmd --reload
UFW:
sudo ufw allow 2200/tcp
У нових версіях OpenSSH, які керуються systemd sockets, зміни через sshd_config можуть не спрацювати. Для цього створюють systemd override:
sudo mkdir -p /etc/systemd/system/ssh.socket.d
sudo bash -c 'cat > /etc/systemd/system/ssh.socket.d/listen.conf <<EOF
[Socket]
ListenStream=
ListenStream=2200
EOF'
sudo systemctl daemon-reload
sudo systemctl restart ssh # Debian/Ubuntu
sudo systemctl restart sshd # RHEL/CentOS
2. Вимкнення входу під root
Дозвіл прямого входу під root через SSH — це ризик. Root має повні права на сервер, і будь-яка атака на цей обліковий запис може дати зловмиснику повний контроль. Безпечніше заходити під звичайним користувачем і виконувати адміністративні дії через sudo.
Щоб вимкнути root-login, відкрий SSH конфігураційний файл і знайди рядок:
PermitRootLogin yes
Зміни його на:
PermitRootLogin no
Після цього збережи файл і перезапусти SSH-сервіс, щоб застосувати зміни:
sudo systemctl restart sshd
3. Вхід на сервер без пароля
Вхід у SSH за паролем може здаватися зручним, але така схема менш безпечна і швидко набридає, якщо часто підключатись до сервера.
Надійніший варіант — автентифікація через SSH-ключі. У цьому випадку ти створюєш пару «приватний + публічний ключ», після чого підключення відбувається без введення пароля.
Спочатку створи ключову пару на своєму локальному комп’ютері:
ssh-keygen -t rsa -b 4096
Потім передай свій публічний ключ на сервер:
ssh-copy-id user@remote-server
Після цього вхід на сервер відбувається без пароля:
ssh user@remote-server
4. Дозвіл SSH тільки для конкретних користувачів
Щоб підвищити безпеку сервера, можна обмежити SSH-доступ лише для певних користувачів або груп. Це допомагає блокувати спроби входу з неавторизованих облікових записів.
Щоб дозволити доступ окремим користувачам, додай у конфігураційний файл SSH рядок:
AllowUsers alice bob
Якщо ти хочеш дозволити доступ цілим групам, використовуй:
AllowGroups admins devops
Після внесення змін перезапусти SSH-сервіс:
sudo systemctl restart sshd
Тепер тільки зазначені користувачі (alice і bob) або групи (admins і devops) зможуть підключатися через SSH. Це ефективно звужує коло потенційних загроз і робить сервер безпечнішим.
5. Показ повідомлення під час SSH-підключення
Корисно давати користувачам коротку інформацію або попередження, коли вони заходять на сервер через SSH. Це може бути просте привітання або офіційне повідомлення про правила безпеки, яке нагадує про відповідальне користування сервером.Для простого тексту можна відредагувати файл Message of the Day:
sudo nano /etc/motd
Якщо потрібне більш формальне повідомлення або юридичне попередження, створюють банер у файлі /etc/issue.net:
sudo nano /etc/issue.net
Щоб SSH показував цей банер під час кожного входу, додай або відредагуй рядок у конфігурації SSH:
Banner /etc/issue.net
Після змін перезапусти SSH-сервіс:
sudo systemctl restart sshd
Тепер кожен користувач побачить твоє повідомлення відразу при підключенні, що допомагає підвищити обізнаність про правила безпеки та створює професійний вигляд сервера.
6. Відстеження невдалих спроб входу
Щоб убезпечити сервер, важливо знати, коли відбуваються невдалі спроби входу. Це дозволяє помітити підозрілі дії та вчасно реагувати на потенційні атаки.
На Debian-подібних системах шукають такі спроби у файлі логу:
sudo grep "Failed password" /var/log/auth.log
На RHEL-подібних дистрибутивах інформація зберігається у:
sudo grep "Failed password" /var/log/secure
Якщо потрібно стежити за подіями у реальному часі, зручно використовувати journalctl:
sudo journalctl -u sshd -f
Так ти завжди бачиш, хто намагається під’єднатися до сервера, і можеш швидко реагувати на будь-які підозрілі спроби входу, підвищуючи безпеку системи.
7. Обмеження доступу по IP-адресах
Щоб додатково захистити сервер, можна дозволяти SSH-підключення лише з певних IP-адрес. Це означає, що під’єднатися з будь-якої іншої машини буде неможливо, навіть якщо зловмисник знає логін і пароль.
Найпростіший спосіб — обмежити доступ прямо в конфігураційному файлі SSH, вказавши конкретного користувача та його IP:
AllowUsers user@192.168.1.100
Якщо хочеш додатково контролювати доступ на рівні брандмауера, можна застосувати правила UFW або FirewallD:
FirewallD:
sudo firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.100" port protocol="tcp" port="22" accept'
sudo firewall-cmd --reload
UFW:
sudo ufw allow from 192.168.1.100 to any port 22
8. Автоматичне завершення неактивних SSH-сесій
Якщо користувач залишає відкриту SSH-сесію і йде, це створює вразливість — інші можуть скористатися відкритим доступом. Щоб уникнути цього, можна встановити тайм-аут для неактивних сесій.
У конфігураційному файлі SSH додай такі налаштування:
ClientAliveInterval 300
ClientAliveCountMax 0
- Перший — сервер надсилає «keep-alive» повідомлення кожні 5 хвилин.
- Другий — якщо немає відповіді, сесію розривають одразу.
9. Двоетапна перевірка для SSH
Щоб зробити підключення безпечнішими, можна додати двофакторну автентифікацію.
Це означає, що для входу на сервер крім пароля знадобиться ще одноразовий код — навіть якщо хтось дізнається твій пароль, він не зможе потрапити на сервер без цього коду.На Debian та Ubuntu це реалізується через Google Authenticator:
sudo apt install libpam-google-authenticator
Після установки налаштуй 2FA для свого користувача командою:
google-authenticator
Щоб SSH використовував цю перевірку, треба включити модуль PAM. Для цього відкрий файл:
sudo nano /etc/pam.d/sshd
і додай рядок:
auth required pam_google_authenticator.so
У конфігурації SSH дозволь challenge-response автентифікацію:
ChallengeResponseAuthentication yes
Після всіх змін перезапусти SSH-сервіс:
sudo systemctl restart sshd
10. Обмеження спроб входу через Fail2ban
Fail2ban — це охоронець для твого сервера. Він слідкує за тим, хто намагається під’єднатися через SSH, і якщо IP кілька разів вводить неправильний пароль, інструмент тимчасово блокує цей IP. Це дуже допомагає зупинити автоматизовані брутфорс-атаки.Щоб налаштувати Fail2ban на Debian чи Ubuntu, спершу встанови його:
sudo apt install fail2ban
Далі потрібно активувати захист для SSH. Для цього відкрий або створи локальний конфігураційний файл:
sudo nano /etc/fail2ban/jail.local
Додай такі налаштування:
[sshd]
enabled = true
port = ssh
maxretry = 3
Це означає, що після трьох невдалих спроб IP буде заблокований на певний час.
Перезапусти Fail2ban, щоб застосувати зміни:
sudo systemctl restart fail2ban
11. Вхід через SSH за допомогою ключів
Щоб підключення до сервера було максимально безпечним, краще відмовитися від паролів і використовувати ключі SSH.
Це працює так: ти маєш пару ключів — приватний зберігається у тебе на комп’ютері, публічний — на сервері. Сервер перевіряє, чи збігається приватний ключ із публічним, і лише тоді дозволяє вхід. Навіть якщо хтось дізнається твій пароль, без приватного ключа під’єднатися неможливо.Спершу на локальному комп’ютері згенеруй пару ключів. Рекомендуємо сучасний і безпечний алгоритм Ed25519:
ssh-keygen -t ed25519
Потім скопіюй публічний ключ на сервер:
ssh-copy-id user@server
Після цього ти вже зможеш підключатися без введення пароля. Щоб підвищити безпеку ще більше, можна відключити логіни через паролі. Для цього в конфігурації SSH вкажи:
PasswordAuthentication no
І перезапусти сервіс:
sudo systemctl restart sshd
Тепер на сервер можна зайти тільки тим, у кого є правильний приватний ключ. Це надійний спосіб убезпечити сервер від сторонніх і автоматичних атак.
12. Контроль доступу через hosts.allow і hosts.deny
Іноді важливо не лише мати пароль або ключ, а й обмежити, хто взагалі може підключатися до сервера. Linux пропонує для цього TCP wrappers — простий механізм через файли /etc/hosts.allow та /etc/hosts.deny.
Ідея така: спочатку вказуєш IP-адреси, яким довіряєш, і тільки вони отримують доступ. Решта підключень автоматично блокується. Наприклад, дозволяємо один конкретний IP:
sshd: 192.168.1.10
А всі інші адреси блокуються тут:
sshd: ALL
Таким чином ти створюєш список запрошених: тільки перевірені машини можуть входити, решта — ні. Це ще один шар захисту без складних налаштувань.
13. Моніторинг активних SSH-сесій
Важливо не лише обмежувати доступ, а й слідкувати, хто вже підключений. Це допомагає швидко помітити підозрілі входи та зберегти контроль над сервером.
Щоб подивитися, хто зараз у системі, можна скористатися командами: who або w
Якщо треба завершити конкретну сесію, застосовуй:
sudo pkill -u username
14. Налаштування SSH Port Forwarding
SSH-тунель, або переадресація портів, дозволяє безпечно направляти трафік з твого комп’ютера на віддалений сервер. Це корисно, коли потрібно під’єднатися до сервісів за фаєрволом або зробити з’єднання більш захищеним.Наприклад, можна налаштувати локальну переадресацію портів: ти обираєш порт на своєму комп’ютері, а всі дані, які йдуть на нього, пересилаються на певний порт на сервері.
ssh -L 8080:localhost:80 user@remote-server
Тут:
8080— порт на твоєму комп’ютері, через який будеш звертатися до сервера.localhost:80— порт на віддаленому сервері, куди йде трафік.user@remote-server— твої облікові дані для SSH.
Після запуску цього тунелю, все, що ти відправиш на localhost:8080 у браузері чи застосунку, буде шифруватися і безпечно передаватися на сервер, наче ти працюєш безпосередньо на ньому.
15. Увімкнення детального логування для SSH
Якщо з’являються проблеми з підключенням до сервера через SSH, наприклад, не проходить аутентифікація або з’єднання зависає, корисно бачити повний процес підключення крок за кроком.
Для цього SSH має режим детального логування, який показує, що відбувається «за кулісами». Щоб увімкнути цей режим, використовуй:
ssh -vvv user@server
Прапорець -vvv підвищує рівень деталізації до максимуму, відображаючи всю інформацію про кожен етап підключення. Можна обмежитися меншим рівнем (-v або -vv), якщо потрібні лише основні дані.
Висновок
SSH здається простим інструментом — доки не налагодиш його правильно. Кожне з цих налаштувань додає маленький шар захисту, і разом вони формують надійну оборону для будь-якого Linux-сервера.
А якими конфігураціями користуєшся ти? Почни обговорення зі спільнотою в коментарях.