Захищаємо SSH сервер. Налаштування SSH для захисту від масового bruteforce

Головна / Захист

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

Основні прийоми

Усі дії виконуються в конфігураційному файлі sshd демона - /etc/ssh/sshd_config. Нижче наведу частину конфігураційного файлу з коментарями.

### Network ### # Використовуємо нестандартний порт (>1024) port 5679 # Використовуємо тільки IPv4 з'єднання # inet = IPv4, inet6 = IPv6, any = both AddressFamily inet # Можна приймати з'єднання тільки з певних IP-адрес #ListenAddress 0.0. 0.0 # Використовуємо другу версію протоколу, т.к. перша схильна до #відомих вразливостей Protocol 2 # Відключаємо перенаправлення графіки (X-сервер) до тих пір, поки вона явно не знадобиться вам X11Forwarding no # Відключаємо Disable TCPKeepAlive і використовуємо ClientAliveInterval замість цього, # щоб запобігти атакам типу TCP Spoofing TCPKeep через 10min (600 sec) неактивності ClientAliveInterval 600 ClientAliveCountMax 3 ### Key configuration files ### # HostKeys для протоколу версії 2 HostKey /etc/ssh/ssh_host_rsa_key HostKey /etc/ssh/ssh_host_dsa_key # Використовуємо трафіку # sandbox - openSSH >= 5.9 ("yes" - для молодших версій) UsePrivilegeSeparation sandbox # При зміні цих значень вимагає видалити старий ключ # /etc/ssh/ssh_host_rsa_key(,.pub), і створити новий # шляхом перезапуску sshd. # # Час життя ключа, тобто. через який час буде згенерований новий ключ # у випадку, якщо попередній був використаний. KeyRegenerationInterval 1h # сила ключа ServerKeyBits 2048 # Дозволяємо авторизацію по публічному ключу PubkeyAuthentication yes # Місце зберігання довірених ключів у каталозі користувача AuthorizedKeysFile .ssh/authorized_keys ### Logging ### ### Authentication ### # список дозволених користувачів AllowUsers ivan # обмежуємо час для введення пароля для ssh-ключа LoginGraceTime 30s # забороняємо віддалено входити під обліковим записом root PermitRootLogin no # Включаємо явну перевірку прав файлів та директорій Скільки разів перепитувати пароль при неправильному введенні MaxAuthTries 3 # Забороняємо вхід за порожнім паролем PermitEmptyPasswords no # Забороняємо вхід за паролем в принципі # (Використовуємо публічний/приватний ключ замість цього) PasswordAuthentication no # Відключаємо використання "challenge-respon." . вона марна при використанні ключів ChallengeResponseAuthentication no # Оскільки ми не використовуємо пароль, то і (PAM, login(1)) нам не потрібні UsePAM no UseLogin no # Дозволяємо клієнту передавати лише певний набір змінних оточення # RH BZ#CVE-2014-252 # ShellShock exploit AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT AcceptEnv LC_IDENTIFICATION LC_

Це параметри, що налаштовуються в конфігураційному файлі sshd. Після зміни налаштувань потрібно перезапустити сервіс sshd.

Коментарі

  • При використанні авторизації за ключом, ключ потрібен попередньозгенерувати на клієнтській машині та скопіювати публічний ключ на сервер. Приклад:
client $ ssh-keygen client $ cat ~/.ssh/id_rsa.pub | ssh-p 5679 [email protected]"cat >> ~/.ssh/authorized_keys"
  • У файлі /var/log/auth.log будуть знаходитись повідомлення від sshd. Якщо цей файл відсутній, вам потрібно налаштувати систему логування. приклад для syslog та syslon-ng . Я використовую syslog-ng, і мені потрібно було додати наступні рядки у файл /etc/syslog-ng/syslog-ng.conf:
destination authlog ( file("/var/log/auth.log"); ); log (source(src); destination(authlog););

та перезапустити сервіс syslog-ng.

  • При використанні нестандартного порту може знадобитися налаштувати ваш firewall (iptables, firewalld, etc).
    Прикладналаштування для iptables:
root# iptables -A INPUT -p tcp -m state --state NEW,ESTABLISHED --dport 5679 -j ACCEPT root# -- 0.0.0.0/0 0.0.0.0/0 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp :80 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW,ESTABLISHED tcp dpt:5679 ...

Якщо цього мало

Це лише базові налаштування. Додатково можна настроїти

  • firewall (iptables)

У цій статті розглянемо базовий метод захисту SSH від масовий bruteforce-атаки. Під масової bruteforce-атакою в даному випадку мається на увазі не цілеспрямований підбір пароля, саме до вашого SSH, а широке захоплення діапазону серверів, для подальшого виявлення з нього нестійких до вибору пари login-password.

Основними особливостями масової bruteforce-атаки SSH є широке сканування діапазонів IP на відкритий порт 22 і використання в якості імені користувача і пароля, що часто вживаються (наприклад, root:passwd123, admin:server123 і т.д.).

Щоб переглянути статистику з log-файлів невдалих спроб авторизації по SSH у Вас на сервері, введіть команду:

Cat /var/log/secure* | grep "Failed password" | grep sshd awk "(print $1, $2)" | sort-k 1,1M-k 2n | uniq -c

На даному скріншоті надано статистику кількості невдалих авторизацій по днях. Якщо ви введете у себе схожі дані, то вам слід вжити заходів для захисту свого SSH від масового bruteforce.

1. Якщо Ви не використовуєтедля авторизації імена користувача, що часто використовуються, такі як root, admin, administrator, user і т.п. і використовуєте для авторизації складний пароль, відразу можете переходити до другого пункту. Щоб змінити пароль більш складний, введіть команду:

Passwd #your_login#

де #your_login#- Ваше ім'я користувача.
При введенні нового пароля пароль не відображається, курсор буде на одному місці.

Зайдемо на сервер через SSH, створимо нового користувача та задамо йому пароль, для цього введемо команди:

Adduser #newuser# passwd #newuser#

де #newuser#- Ваше нове ім'я користувача, не використовуйте як ім'я користувача часто вживані, непоганий варіант ваш_нікadmin(наприклад, foxadmin, useralex, rootidler).

2. Після цього заходимо через SSH з новим логіном та паролем. І відкриваємо конфігурацію деймона SSH (sshd_config) командою:

Vi /etc/ssh/sshd_config

Після чого Ви повинні побачити приблизно такий вміст:

Рядки, що починаються з # є закоментованими.

Щоб захистити SSH від масового bruteforce, розкоментуйте та змініть або додайте наступні параметри файлу:
a) port- порт, на якому SSHDприймає та обслуговує з'єднання. Розкоментуйте (видалити перед початком рядка # ) та змініть стандартне значення 22 на будь-яке інше від 1024 до 65536, крім зарезервованих — список зарезервованих портів , наприклад:

Port 2022

Щоб видалити # та змінити значення port 22, натисніть спочатку на клавіатурі i, після редагування потрібного рядка натисніть клавішу ESC

b) LoginGraceTime— час очікування на реєстрацію користувача в системі. Якщо користувач не встиг увійти в систему протягом відведеного даною директивою часу, сеанс обривається. Зменшимо це значення:

LoginGraceTime 1m

c) PermitRootLogin- дозволити користувачеві rootвхід через протокол SSH. Змінимо на no.

PermitRootLogin no

d) AllowUsers- дозволені для входу через протокол SSH імена користувачів розділені пропуском. Тут замість #your_login# вказуємо нове створене ім'я користувача.

AllowUsers #your_login#

e) MaxAuthTries— кількість спроб входу до системи за один сеанс. При досягненні максимально дозволеної кількості спроб сеанс обривається.

MaxAuthTries 2

У результаті ми отримаємо:

Port 2022 LoginGraceTime 1m PermitRootLogin no AllowUsers #your_login# MaxAuthTries 2

У цій статті ми закінчимо налаштування SSHдля захисту від масового bruteforce. Після редагування , натискаємо на клавіатурі : , знизу з'являється рядок і далі вводимо в ньому wqта натискаємо клавішу Enter. При цьому усі зроблені зміни збережуться.

Якщо Ви щось зробили не так (наприклад, ненароком щось видалили), для виходу без збереженнявикористовуйте замість комбінації клавіш wq, клавіші q!

Після завершення налаштування SSH, перезапустимо деймон командою:

Service sshd restart

Тепер при підключенні через протокол SSH використовуйте новий порт 2022 (або той який Ви вказали в налаштуваннях) замість стандартного порту 22.

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

Вконтакте

Для захисту нашого сервера від перебору паролів можна скористатися утилітами sshguard або sshit.

Принципи роботи.

sshguard та sshit працюють за одним принципом. Аналізують системні повідомлення про неправильну аутентифікацію і в разі досягнення певного значення заносять атакуючий ip в блокуюче правило фаєрвола. Через певний час IP з правила видаляється.
Відповідно для роботи необхідний налаштований фаєрвол.

SSHGuard

sshguard вміє працювати з

  • AIX native firewall- for IBM AIX operating systems
  • netfilter/iptables- for Linux-based operating systems
  • Packet Filter (PF)- для BSD operating systems (Open, Free, Net, DragonFly -BSD)
  • IPFirewall (IPFW)- for FreeBSD та Mac OS X
  • IP Filter (IPFILTER)- for FreeBSD, NetBSD та Solaris
  • tcpd"s hosts_access (/etc/hosts.allow)- portable across UNIX
  • null- portable do-nothing backend for applying detection but not prevention

Я використовую PF тому у замітці приклади на PF.

Установка sshguard.

FreeBSD:

Встановлюємо із портів

Cd /usr/ports/security/sshguard-pf/&& make install clean

Якщо з якихось причин Ви не використовуєте порти, завантажте останню версію із сайту sshguard і зберіть у ручну

./configure --with-firewall=pf && make && make install

Debian:

apt-get install sshguard

Налаштування ОС для роботи sshguard.

Створюємо файл для зберігання логів

# touch /var/log/sshguard

Debian (wheezy):

Редагуємо в //etc/default/sshguard наступний рядок

#mcedit /etc/default/sshguard #ARGS="-a 40 -p 420 -s 1200" ARGS="-a 5 -p 420 -s 2400 -b 5:/etc/sshguard/blacklist"

та перезапускаємо sshguard
service sshguard restart

FreeBSD:

Нам необхідно додати два рядки у конфігурацію PF

Table persist

оголошуємо таблицю, куди sshguard вносить ip роботів.

Block in quick on $if0 proto tcp from

Власне саме блокуюче правило, його варто розмітити на вершині блоку правил конфігураційного файлу PF. $if0 інтерфейс на якому блокуватимуться підключення, для блокування на всіх інтерфейсах замініть на any.
Перечитайте файл конфігурації

Auth.info;authpriv.info |exec/usr/local/sbin/sshguard

та перезапустіть syslog

#/etc/rc.d/syslogd restart

Власне, після цих маніпуляцій sshguard блокуватиме атаки з параметрами за замовчуванням.
При атаці в /var/log/auth.logми побачимо приблизно такі

Jun1611:01:40 www sshd:Invalid user test from61.172.251.183Jun1612:29:48 www sshd:Invalid user test from85.114.130.168Jun1612:29:49 www sshd:In5 user1 www sshd:Invalid user test from85.114.130.168Jun1612:29:50 www sshd:Invalid user test from85.114.130.168Jun1612:29:50 www sshguard:Blocking85.114.130.16

Налаштування параметрів sshguard

sshguard має ряд параметрів, які ми можемо перевизначити
-aкількість невдалих спроб аутентифікації після якого IP буде заблоковано. Типово 4.
-pчерез скільки секунд IP буде розблоковано. Типово 420.
-sскільки секунд sshguard пам'ятає IP. За замовчуванням 1200. Щоб було зрозуміліше якщо з ip йде одна атака в 30 хвилин то він ніколи не потрапить в бан при дефолтовому налаштуванні.
-wбілі IP, мережі, або шлях до файлу білих адрес. Формат файлу один рядок – один запис, # визначає коментарі.
-bвизначає через скільки блокувань ip буде додано до чорного списку і шлях до нього. Чорний список завантажується під час старту sshguard і автоматично не очищається.

sshguard немає файлу конфігурації параметри задаються при старті sshguard. У нашому випадку sshguard пускається syslog тому відредагуємо syslog.conf так, що sshguard блокуватиме ip після 3 невдалих спроб аутонтифікації на 30 хвилин, а після 5 блокувань заносити його в чорний список.

Auth.info;authpriv.info |exec/usr/local/sbin/sshguard -a 3-p 1500-b 5:/usr/local/etc/sshguard.blacklist

вперше блокується на 420 секунд і видаляється через 7 хвилин
вдруге на 2*420 у віддаляється через 14 хвилин
третій раз на 2 * 2 * 420 і видаляється через 28 хвилин і т.д.
2^(N-1)*420 N-й раз.

Sshit

Sshit - це perl скрипт відповідно необхідно щоб у системі був perl, а також 2 модулі

  • IPC::Shareable
  • Proc::PID::File

Sshit вміє працювати лише з pf та ipfw.

Установка sshit

cd /usr/ports/security/sshit/&& make install clean

Налаштування sshit.

Sshit має конфігураційний файл /usr/local/etc/sshit.conf, в якому можна перевизначити значення за замовчуванням.

FIREWALL_TYPE = "pf"; # Який firewall використовуємо MAX_COUNT = 3; # Кількість невдалих спроб аутентифікації, після якого ip блокується WITHIN_TIME =60; # Протягом скільки секунд має відбутися задана кількість невдалих аутентифікацій RESET_IP =300; # Через скільки секунд ip буде розблоковано. PFCTL_CMD = "/sbin/pfctl"; PF_TABLE ="badhosts"#ім'я таблиці куди заносяться погані ip

Налаштування ОС для роботи shit.

За аналогією з налаштуванням під sshguard редагуємо файл конфігурації PF

Table persist block in quick on $if0 proto tcp from до $if0 port ssh label "ssh brute"

перечитуємо конфігураційний файл

#pfctl -f /etc/pf.conf

Редагуємо syslog.conf

Auth.info;authpriv.info |exec/usr/local/sbin/sshit

та перезапустіть syslog

Secure Shell можна знайти усюди. З моменту випуску в 1995 році SSH набув широкого поширення як потужний протокол віддаленого доступу для Linux.

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

1. Відключаємо root логін.

Найпростіший крок. Очевидно, що існує мало причин дозволу заходу root через SSH. Відключити такий доступ досить просто і це дозволить посилити безпеку.

Знайдемо /etc/ssh/sshd_config (можливо він перебувати в іншому каталозі, це залежить від дистрибутива). У ньому визначимо місце PermitRootLogin та замінимо значення на "no":

PermitRootLogin no

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

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

PasswordAuthentication no
ChallengeResponseAuthentication no

Використовуючи цей Python-скрипт адміністратор може автоматично вносити хости при невдалому логіні в чорний список, банячи їх надовго. Найпростіший спосіб встановлення:

Europa ~ # emerge -pv denyhosts
These are the packages that would be merged, in order:
Calculating dependencies... done!
app-admin/denyhosts-2.5 0 kB
Total size of downloads: 0 kB
europa ~ # emerge denyhosts

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

Europa $nano -w /etc/denyhosts.conf

Не думаю, що конфігурування DenyHosts викличе особливі проблеми – досить уважно прочитати конфіг.

Після конфігурування можна запустити програму демоном чи через шедулер. У Gentoo демоном:

Rc-update add denyhosts default

Через cron, скажімо кожні 10 хвилин:

Python /usr/bin/denyhosts -c /etc/denyhosts.conf

Вся радість DenyHost не тільки в блокуванні хостів, які намагаються пробитися до вашого SSH сервера, але й у тому, що можна синхронізувати свій "чорний список" із серверами DenyHost. Таким чином, створюється колективний список хостів, що містить усіх нападників. Він запобігатиме нападу в самому корені.

4. Змінюємо номер порту.

Більшість спроб злому йде від автоматичних скриптів, що сканують мережу на наявність SSH демонів. У переважній кількості випадків вони намагаються вломитися на 22 порти, що тільки грає нам на руку. Змінивши порт, ми автоматично відсічемо більшість спроб несанкціонованого доступу.

У конфізі варто змінити.

SSH- це протокол, який використовується для забезпечення безпеки та шифрування передачі даних у мережі. Він широко використовується у колі Linuxадміністраторів для керування віддаленим сервером. Сервер підключення до Інтернету дуже часто піддаються атакам на службу SSH з метою отримати доступ до сервера. Найпоширеніша це підбір пароля користувача з правами адміристратора. У цій інструкції ми розглянемо базові рекомендації для забезпечення безпеки SSHпідключення.

Встановіть складний пароль

Ваш сервер може піддатися атаки з боку зловмисників, які намагаються підібрати пароль до сервера SSH, щоб знизити ризик злому - рекомендуємо встановлювати паролі до облікових записів сервера, що відповідають наступним параметрам:

  • Як мінімум 8 символів
  • Використовуйте верхній та нижній регістр символів (AaBb)
  • Використовуйте літери - цифри та знаки ( [email protected])

Сильний пароль не тільки захистить від злому по SSHпротоколу, але й загалом покращить захист сервера.

Використовуйте SSH ключі

Додатковим захистом Вашого сервера буде використання ключа для підключення до сервера SSH, генерувати ключ потрібно на комп'ютері/сервері з якого підключатися:

Як створити SSHключ на Windows ОС:

Щоб створити ключ у Linuxнаберіть команду:

Ssh-keygen -t rsa

Щоб встановити цей ключ на сервер, до якого Ви будете підключатися, наберіть команду:

Ssh-copy-id-p 22 [email protected]

  • -p 22- порт сервера яким працює SSHпротокол (може бути змінено, детальніше інформація нижче)
  • admin- Логін від Вашого сервера
  • 192.168.1.1 - IP адреса Вашого сервера

Якщо все зробили правильно, то тепер Ви можете підключатися до сервера по ключу, при цьому Вам не доведеться щоразу вводити пароль.

Використовуйте нестандартний порт

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

Для цього відкриємо конфігураційний файл SSHна сервері:

Sudo nano /etc/ssh/sshd_config

Знайдемо у ньому закоментований рядок такого виду:

# Port 22

Видалимо символ # - щоб прибрати опцію коментаря та змінимо 22 на будь-які цифри починаючи з 11060 і за наростанням, для прикладу будемо використовувати 11 060 , тепер рядок має виглядати так:

Port 11060

Збережіть конфігурацію " Ctrl+Oі виходьте з редактора Ctrl+X".

Потрібно перезавантажити SSHслужбу - щоб прийнялися нові налаштування, виконаємо команду:

Sudo service sshd restart

Таким чином ми поміняли порт для підключення, з цього часу - щоб підключитися до сервера потрібно вказувати нестандартний порт опцією -p 11060 , наприклад:

Ssh-p 11060 [email protected]

Залишити доступ лише частини користувачів

SSHпідключення можна лімітувати для окремих облікових записів, наприклад, якщо на сервері є три облікові записи: admin , sergey , alex- Ви можете дозволити віддалене підключення тільки для деяких з них. Для цього відкрийте конфігураційний файл SSH:

У цьому файлі спустіться стрілками до останнього рядка і додайте новий з таким змістом:

AllowUsers admin alex

Збережіть конфігурацію " Ctrl+Oі виходьте з редактора Ctrl+X".

Перезавантажте службу SSH:

Sudo service sshd restart

Цим самим Ви дозволили віддалений доступ для користувачів adminі alex, у той час як користувач sergeyвіддалено підключитися не зможе.

Увімкніть SSH protocol 2

За стандартом SSHпрацює в режимі версії 1, ця версія застаріла і має безліч вразливостей, але для забезпечення кращої безпеки рекомендуємо переключити роботу в режим версії 2. Для цього відкрийте конфігураційний файл SSH:

Sudo nano /etc/ssh/ssh_config

Знайдіть рядок:

# Protocol 2

Видаліть символ # - щоб прибрати опцію коментаря та задіяти цей рядок, потрібно вийти так:

Protocol 2

Збережіть конфігурацію " Ctrl+Oі виходьте з редактора Ctrl+X".

Перезавантажте службу SSH:

Sudo service sshd restart

Вимкнути порожні паролі

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

Sudo nano /etc/ssh/ssh_config

Знайдіть рядок PermitEmptyPasswordsі переконайтеся, що варто значення "no".

PermitEmptyPasswords no

Увімкніть докладний журнал

Щоб служба SSHвела журнал невдалих підключень із зазначенням IP-адрес, відкрийте конфігураційний файл SSH:

Sudo nano /etc/ssh/ssh_config

Знайдіть рядок LogLevelі замість INFOвкажіть VERBOSE, рядок повинен вийде так:

LogLevel VERBOSE

Збережіть файл " Ctrl+O" і вийдіть із редактора " Ctrl+X".

Перезавантажте службу SSH:

Sudo service sshd restart

Можна перевірити, чи вводимо команду:

Cat /var/log/secure

Система виведе нам інформацію, приблизно таку:

Jun 21 13:06:28 centos sshd: Failed password for root from 118.212.143.47 port 48263 ssh2

Тобто за цим записом ми бачимо, що була невдала спроба проникнення на сервер із зазначеної адреси.

Дякуємо за увагу, на цьому все.

© 2022 androidas.ru - Все про Android