Сотні невдалих реєстраційних даних ssh


81

Щовечора на моєму сервері RedHat 4 я отримую сотні, а іноді й тисячі невдалих логін ssh. З міркувань брандмауера з віддалених сайтів мені потрібно запустити стандартний порт. Чи є щось, що я повинен зробити, щоб заблокувати це. Я помічаю, що багато хто походить з однієї і тієї ж IP-адреси. Чи не повинен це зупиняти їх через деякий час?

Відповіді:


67

Ви можете використовувати iptables для обмеження швидкості нових вхідних з'єднань до порту SSH. Мені доведеться бачити всю конфігурацію iptables, щоб отримати рішення під ключ, але ви, в основному, говорите про додавання таких правил, як:

iptables -A INPUT -p tcp --dport 22 -m recent --update --seconds 60 --hitcount 5 --name SSH --rsource -j DROP 
iptables -A INPUT -p tcp --dport 22 -m recent --set --name SSH --rsource -j ACCEPT 

Ці правила передбачають, що ви приймаєте ESTABLISHED з'єднання раніше в таблиці (так що лише нові з'єднання будуть впливати на ці правила). Нові підключення SSH вплинуть на ці правила та будуть позначені. Через 60 секунд 5 спроб з однієї IP-адреси призведе до відмови нових вхідних з'єднань з цього IP-адреси.

Це добре спрацювало для мене.

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


1
Мені подобається це рішення, і я планую його прийняти на місце сьогодні ввечері, як тільки я вийму сьогоднішні пожежі.
MattMcKnight

2
Це уповільнює атаки, і я рекомендую це, але, оскільки там є розподілені скануючі ботнети, це не панацея. Досі залишатимуться недійсні логотипи з ботнетів, які розповсюджують скановані проти вас. Ви насправді з цим не можете зробити дуже багато, за винятком якоїсь схеми "вибивання порту", щоб віддалено піднести порт SSH, коли ви хочете зайти.
Еван Андерсон

1
+1 для пропозиції @ Evan щодо "портування портом". Деяка інформація: linux.die.net/man/1/knockd . Але не робіть це man man page (тобто додаючи / видаляючи правила iptables), а замість цього використовуйте -m conditioniptables match.
pepoluan

2
вам не потрібно - доповідь 22 у цих правилах, щоб вони застосовувалися лише для ssh-трафіку?
clime

2
@clime - Так. Важко повірити, що це вже 2 1/2 року, і ніхто цього не помітив! Хороший улов.
Еван Андерсон

39

fail2ban може допомогти у цьому, блокуючи IP-адреси із занадто великою кількістю невдалих спроб входу.


11
Мені не подобаються інструменти / скрипти, що читають журнали та видають команди від імені користувача sysadmin
asdmin

2
@asdmin, так, особливо, коли у них такий хороший трек ...
maxschlepzig

25

Я рекомендую використовувати нестандартний порт для SSH, якщо можете (наприклад, порт 10222), але оскільки ви згадали, ви не можете цього зробити, я б рекомендував використовувати щось таке, як DenyHosts.

http://denyhosts.sourceforge.net/

Чудовий пакет, простий в установці та налаштування.


6
Я не знаю, чому люди підтримують це; SSH знаходиться на стандартному порту 22. Це означає, що, перебуваючи в іноземній мережі, ви не покладаєтесь на те, що вони відкриють нестандартний порт через вихідний брандмауер. Справжнє рішення цієї проблеми задокументовано вище: або обмежте кількість повторних з'єднань через вхідний брандмауер, або ввімкніть вхід паролів.
Ендрю Тейлор

1
OpenSSH 6,7 краплі підтримує tcpwrappers , саме для цього використовуються denyhosts.
Zoredache

15

Хоча це може бути приємно мати доступ до вашої системи з довільних локацій в Інтернеті, є автоматизовані системи атаки паролем, які зафіксуються на відкритому порту ssh і застосовують різні атаки акаунта і словникові атаки проти вашої системи. Це може бути сукупним для читання у вашому резюме нічного журналу і є марною трафіком вашої пропускної здатності.

Якщо у вас є веб-сервер у тій же системі, ви можете використовувати обгортки php та tcp, щоб обмежити вхідний трафік ssh до відомих систем, а також надати ключ задньої двері, щоб дозволити собі доступ з довільних систем в Інтернеті.

Ось як це зробити:

заборонити всі ssh-з'єднання в /etc/hosts.deny:

# /etc/hosts.deny fragment
sshd:  all

Дозволити відомі системи через IP в /etc/hosts.allow, а також додати файл для тимчасового доступу:

# /etc/hosts.allow fragment
sshd:  10.0.10.2     # some system
sshd:  172.99.99.99  # some other system
sshd:  /etc/hosts.allow.temporary-sshd-access

Створіть php-файл на своєму веб-сервері та дайте йому таке очевидне ім’я, як my-sshd-access.php:

<?php
function get_ip()
{
    return getenv("REMOTE_ADDR"); 
}

?>

<?php
$out='/etc/hosts.allow.temporary-sshd-access';
$log='/var/log/sshd-access-addition-log';

print "Was:";
readfile($out);
print "<br>";
$ip=get_ip();
$fp=fopen($out,"w");
fputs($fp,$ip);
fclose($fp);

$lfp=fopen($log,"a");
fputs($lfp,$ip);
fputs($lfp,"n");
fclose($lfp);

print "Wrote: ";
readfile($out);
?>

Пробачте, PHP-код - я перемістив його з іншого місця, так що він, ймовірно, міг очистити цілу купу. Все, що потрібно зробити - це додати IP-адресу системи, що отримує доступ до неї, до файла /etc/hosts.allow.temporary-sshd-access, який зчитується sshd (завдяки включенню /etc/hosts.allow) під час підключення .

Тепер, коли ви перебуваєте в якійсь довільній системі в Інтернеті і хочете перейти на цю систему, спочатку скористайтеся веб-браузером і натисніть цей файл (або скористайтеся wget або equivilent):

$ wget http://your.system.name/my-sshd-access.php

Тепер ви маєте змогу ввійти до своєї системи. Якщо це десь, напевно, ви будете часто зникати, буде тривіально читати вміст файлу /etc/hosts.allow.temporary-sshd-access і постійно додавати IP-адресу до / etc / hosts. дозволяють.


Щоб зробити це більш безпечним, запустіть цю сторінку на https.
Роберт Мунтяну

Якщо ви зміните скрипт, щоб він не виводив вміст файлу "дозволена тимчасова IP-адреса", не буде нічого, щоб понюхати потенційний sniffer. Тоді ви можете запустити його на http замість https.
Баррі Браун

"Дозволена тимчасова IP-адреса" - це завжди запитувач (тобто ваш). Я не думаю, що це має значення так чи інакше. Https означає, що запитувана URL-адреса зашифрована, що означає, що нюхати її не потрібно.
Девід Макінтош

Це не спрацює, якщо ви знаходитесь у мережі, яка підтримує з'єднання HTTP, але ваш прямий шлях до Інтернету відбувається через інший вихід.
Ендрю Тейлор

OpenSSH 6,7 краплі підтримує tcpwrappers , що саме використовується у вашій відповіді.
Zoredache


8

Зробіть собі послугу і відключіть логін із паролем. Використовуйте виключно ключі аутентифікації (наприклад, google ssh-keygen - Приклад: http://www.puddingonline.com/~dave/publications/SSH-with-Keys-HOWTO/document/html/SSH-with-Keys-HOWTO-4 .html ) Ваш сервер буде більш захищеним, ви підключитесь до нього зручніше (перевіряйте ssh-агент, ssh-add, брелок), і ви більше не будете жертвою ssh грубої атаки.


2

інше рішення - просто перемістити ssh на інший порт. ці глисти досить дурні.


3
Оригінальний плакат сказав, що йому потрібно бігти на стандартний порт.
kbyrd

1
вибачте, я мушу прочитати питання уважніше :)
дисерман

1
Я повинен погодитися ... У мене SSH працює на "альтернативних" портах, і це робить СВІТ різниці в журналах. Черви настільки ж розумні, як цегла, тому добре справляються з тупими сценаріями автоматизації; не так добре проти нападників на людину. І все-таки колоди мають в них благословенний звук тиші ...
Avery Payne

.. це не те, що боти "дурні", це те, що вони розроблені для пошуку низькорослих фруктів. Тож переміщення порту SSH виконується в стилі .. витримати ваші фрукти від землі.
elrobis

2

Інший варіант може полягати в тому, щоб вимагати, щоб усі ssh-з'єднання були підтверджені сертифікатом і зовсім не було паролів.

Я використовую Denyhosts, але виявив, що підключаюсь лише регулярно віддалено із кількох місць, тож я заблокував усі з'єднання порту 22, крім будь-якого місця, і використовую стукінг порту, щоб я міг з'єднатися з будь-якого місця зі своїм ноутбуком, якщо мені доведеться .


1

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

Якщо ви обмежите користувачів / груп лише тими, кому слід дозволити вперше ввімкнути скриньку та відключити вхід у систему як root, ви повинні бути більш ніж безпечними. І якщо цього недостатньо, завжди існує аутентифікація на основі ключів.


1

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

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

Немає способів зупинити людей від зондування вашого SSH-сервера. Приклад Denyhosts, fail2ban та iptables працюватимуть до певного моменту, але з додатковою небезпекою випадкового блокування законних користувачів. Найкращий спосіб - це висмоктати його і спробувати автоматизувати процес аналізу журналів, щоб зменшити кількість часу, про який потрібно задуматися.


0

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

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


0

Більшість веб-хостів використовують APF + BFD для ip-блокування невдалих входів SSH. На сьогоднішній день існує CSF (брандмауер Configserver), який включає інструмент під назвою LFD, який робить те саме, і багато іншого, включаючи блокові IP-адреси з певних країн, яким ви не хочете отримати доступ до свого сервера (наприклад, Корея, Китай тощо), де 99% моїх SSH-зондів здається, походять з).



0

Якщо вам потрібно буде вирішити цю проблему на кількох хостах, ви можете перевірити OSSEC: http://www.ossec.net/main/ossec-architecture

Це дозволить вам налаштувати декілька агентів з централізованого місця для автоматичного реагування на брутальні сили (разом з будь-яким іншим шаблоном, який ви можете витягти з журналів).

Дуже приємний фрагмент програмного забезпечення :)


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.