Главная Файлы Форум Галерея Гостевая книга Обратная связь Карта сайта Поиск
 

 

Моё место работы

СитиСервис
  • Заправка и ремонт лазерных картриджей
  • Ремонт любых принтеров и копиров
  • Оригинальные и совместимые картриджи
  • Доставка бесплатно (от 2-х картриджей)
  • Накопительная система расчётов для корпоративных клиентов
Телефон
+7 (4722) 373-983
8-980-326-01-23
Адрес E-mail
mybelpost@gmail.com

Привет, Гость

Войти
Идентификация
Я забыл свой пароль
Регистрация

Разделы -> Статьи -> Debian GNU/Linux -> Безопасность школьно...

Безопасность школьного шлюза


Стоит сказать, что универсального средства спасения от взлома не существует. Защита от атак это процесс уникальный и индивидуальный. Отбивать атаки нужно на всех уровнях. Для эффективной защиты нужно использовать весе возможности ядра Linux и различного ПО. Нужно быстро реагировать. Если кто-то реально взялся сломать Ваш сервер, то атака не будет однообразной, она будет менять характер и направление. Ну и нужно понимать, что от некоторых типов атак защититься без специального оборудования просто не возможно. Однако, бросать свою машину на произвол судьбы не гоже. Кое-что всё же можно сделать - хотя бы осложнить начальное тестирование вашего агрегата перед настоящей атакой. И этот процесс можно автоматизировать, в какой-то степени. А средства чаще всего уже имеются в наличии сразу после установки Debian GNU/Linux или же доступны в официальном репозитории. Отсюда и вытекла статья.

Защита ssh от перебора пароля (brute force)

Логика такова:
  1. Авторизация непривилегированного пользователя только по ключу (без ввода пароля),
  2. прямой доступ по сети для пользователя root запрещён,
  3. смена стандартного порта ssh на любой не стандартный,
  4. отключение лишних протоколов,
  5. включение блокировки подбирающих пароль.
1. Организация ssh с авторизацией по ключу.

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

И так, запускаем терминал на компьютере, с которого будем администрировать сервер.
У непривилегированного пользователя создаём каталог .ssh скомандовав:

mkdir ~/.ssh

заходим терминалом в созданный каталог

cd ~/.ssh

генерируем пару ключей скомандовав:

ssh-keygen -t rsa

На все вопросы генератора просто жмём ENTER.
Почему тип ключа rsa а не dsa? - Потому, что здесь только пример, но он работает.

Отправляем открытый ключ на сервер не привилегированному пользователю. К примеру alex:

ssh-copy-id -i id_rsa.pub alex@ip-адрес.сер.ве.ра

попросит пароль к учётной записи - вводим его.

Если всё сделано правильно, то можно подключиться к серверу по ключу введя в консоли:

ssh alex@ip-адрес.сер.ве.ра


2. Запрещаем прямой доступ по ssh пользователю root

Мы уже на сервере в учётной записи непривилегированного пользователя, к примеру alex.
Получаем права root скомандовав в консоли:

su

Попросит пароль root-а - вводим его (при вводе ничего не отображается).

Если всё сделано правильно, то получим приглашение в виде занака #

Теперь редактируем файл /etc/ssh/sshd_config скомандовав:

sed -i 's/PermitRootLogin yes/PermitRootLogin no/' /etc/ssh/sshd_config

Всё! Вход root-у по ssh в конфигурационном файле запрещён.

3. Меняем стандартный порт ssh

Находясь на сервере в консоли с правами root командуем:

sed -i 's/Port 22/Port 31795/' /etc/ssh/sshd_config

Где 31795 - это новый порт для ssh. Новым портом можно установить любой свободный из диапазона от 0 до 65535.
Свободные порты можно увидеть проанализировав вывод команды:

netstat -tnap

Порт в столбце "Local Address" после двоеточия, а самый правый столбец укажет на приложение работающее с ним.

После запрета входа root и смены стандартного порта необходимо перезагрузить демона ssh. Можно скомандовав вот так:

service ssh restart

Скорее всего текущее соединение "отвалится".

Логинимся заново но уже с указанием нового порта:

ssh -p 31795 alex@ip-адрес.сер.ве.ра

Должно получиться.

Получаем права root.

4. Удаляем не используемые протоколы и приложения.

Если дать команду:

netstat -tunap

то увидим в левом столбце: протокол. В столбце "Local Address": локальный адрес и порт. В смом правом столбце: приложение работающее с портом.
 
На моём сервере был включен протокол ipv6 в приложениях sshd, exim4 и avahi-daemon. Данный тип адресации у меня не используется - будем отключать. И был открыт порт 111 - NFS. Тоже не используется - отключаем.

Отключаем NFS скомандовав в консоли:

apt-get purge rpcbind

Запрещаем avahi-daemon использовать ipv6 скомандовав:

sed -i 's/use-ipv6=yes/use-ipv6=no/' /etc/avahi/avahi-daemon.conf

перезапускаем avahi

service avahi-daemon restart

Запрещаем exim4 работать по протоколу ipv6

sed -i 's/begin acl/disable_ipv6 = true\nbegin acl/' /etc/exim4/exim4.conf.template

перезапускаем exim4

service exim4 restart

Отключаем все приложения использующие сеть, кторые вам не нужны. Это индивидуальный процесс - то-ли редактирование конф. файлов, то-ли полное удаление приложения из системы, смотрите сами.

И последним отключаем ipv6 в sshd скомандовав в консоли вот так:

echo "AddressFamily inet" >> /etc/ssh/sshd_config

перезапускаем sshd

service ssh restart

Если соединение было сброшено, то логинимся заново.

Получаем права root и проверяем порты:

netstat -tunap

По идее, не должно быть ничего лишнего.

5. Блокируем всех, кто пытается взломать систему методом подбора пароля.

Для этого установим приложение fail2ban скомандовав в консоли от root:

apt-get install fail2ban

После установки открываем на редактирование файл /etc/fail2ban/jail.conf можно вот так:

mcedit /etc/fail2ban/jail.conf

В секции [DEFAULT]
комментируем ignoreip = 127.0.0.1/8. Т.е. приводим к виду:

#ignoreip = 127.0.0.1/8

Это заставит локальных пользователей подчиняться общим правилам подключения по ssh.

В этом файле есть ещё секции для различных демонов.
Логика такова: параметры из секции [DEFAULT] применяются ко всем остальным секциям, если не будут переопределены.
Сейчас нам нужна секция для ssh
У меня она имеет вот такой вид:

[ssh]

enabled = true
port = 31795 # изменённый порт ssh
filter = sshd
logpath = /var/log/auth.log
findtime = 1800 # Если за тридцать минут
maxretry = 6 # было 3 неудачных попытки залогиниться,
bantime = 86400 # то блокируем ip-адрес взломщика на сутки.

Сохраняем изменения (для mc это F2) и выходим из редактора.
Перезапускаем fail2ban скомандовав в консоли от root вот так:

/etc/init.d/fail2ban restart

или так:

service fail2ban restart


Мониторинг fail2ban

Журнал ban и unban за текущую дату

grep "$(date +%F).*WARNING" /var/log/fail2ban.log

ну или весь лог за текущую дату

grep $(date +%F) /var/log/fail2ban.log

Журнал авторизации по ssh за текущую дату можно глянуть вот так:

LANG=en_US.UTF-8; grep "$(date '+%b %e').*sshd" /var/log/auth.log; LANG=ru_RU.UTF-8

Возможно вывод будет слишком большим и не вместится в один экран. В этом случае можно использовать less:

LANG=en_US.UTF-8; grep "$(date '+%b %e').*sshd" /var/log/auth.log | less; LANG=ru_RU.UTF-8

аналогично можно использовать конвейер с less и в других командах просмотра больших текстов.

Сработку правил iptables созданных fail2ban смотрим так:

iptables -nxvL fail2ban-ssh


 В выводе будет:
Столбец "pkts" - количество сработок
Столбец "source" - источник вызвавший сработку правила
Столбец "target" - применённое действие к раздражителю (в нашем случае - DROP).


Защита от сканирования портов


Выдержка из википедии.
Сканирование портов может являться первым шагом в процессе взлома или предупреждения взлома, помогая определить потенциальные цели атаки. С помощью соответствующего инструментария путем отправления пакетов данных и анализа ответов могут быть исследованы работающие на машине службы (Web-сервер, FTP-сервер, mail-сервер, и т. д.), установлены номера их версий и используемая операционная система.
Одним из способов защиты может быть установка приложения-ловушки. Оно открывает множество портов с ложными сервисами или без таковых и реагирует на подключение к ним в зависимости от настроек. Это может быть просто блокировка злоумышленника или отправка ему ложной информации о вашей системе и сервисах. Можно даже организовать полноценный чат - пусть общается с роботом. Или можно эмитировать выполнение консольных команд - пусть думает, что взломал. В общем всё будет ограничено только вашей фантазией.

Здесь опишу базовую настройку приложения-ловушки - PortSentry.

Установка

Находясь на сервере в консоли с правами root командуем:

apt-get install portsentry


Настройка (режим Classic по умолчанию в Debian).

Открываем на редактирование файл /etc/portsentry/portsentry.conf

mcedit /etc/portsentry/portsentry.conf

Приводим его к такому виду:
TCP_PORTS="1,11,15,22,79,111,119,143,540,635,1080,1524,2000,5742,6667,12345,12346,20034,27665,31337,32771,32772,32773,32774,40421,49724,54320"
UDP_PORTS="1,7,9,69,161,162,513,635,640,641,700,5060,37444,34555,31335,32770,32771,32772,32773,32774,31337,54321"
ADVANCED_EXCLUDE_TCP="80,3128,8081,31795"
ADVANCED_EXCLUDE_UDP="67"
IGNORE_FILE="/etc/portsentry/portsentry.ignore"
HISTORY_FILE="/var/lib/portsentry/portsentry.history"
BLOCKED_FILE="/var/lib/portsentry/portsentry.blocked"
RESOLVE_HOST = "0"
BLOCK_UDP="1"
BLOCK_TCP="1"
KILL_ROUTE="/sbin/route add -host $TARGET$ reject"
KILL_ROUTE="/sbin/iptables -I INPUT -s $TARGET$ -j DROP"
KILL_HOSTS_DENY="ALL: $TARGET$ : DENY"
SCAN_TRIGGER="0"
(Комментированные строки файла удалены для удобства)

Где:
TCP_PORTS - tcp-порты, которые будут открыты и будут обслуживаться portsentry
UDP_PORTS - udp-порты, которые будут открыты и будут обслуживаться portsentry
ADVANCED_EXCLUDE_TCP - tcp-порты, которые portsentry не обслуживает, т.е. те порты, которые нам нужны для работы сервера.
ADVANCED_EXCLUDE_UDP - аналогично ADVANCED_EXCLUDE_TCP, только udp-порты
IGNORE_FILE - путь к файлу с ip-адресами хостов, которые не должны быть заблокированы, к примеру ip хоста, с которого администрируем сервер.
HISTORY_FILE - путь к файлу с историей работы portsentry, там же информация об атаках и реакциях на них.
BLOCKED_FILE - строка формирования имени файла, в который будет записана информация о заблокированных хостах. Конечное имя файла будет выглядеть как $BLOCKED_FILE.протокол
RESOLVE_HOST - определять ли "имя" атакующего хоста используя DNS Name resolution (0 - нет, 1 - да)
BLOCK_UDP - включение типа реакции на сканирование udp-портов (0 - не блокировать хост, не запускать заданную пользователем команду, 1 - блокировать хост и запустить команду, 2 - только запустить заданную команду)
BLOCK_TCP - включение типа реакции на сканирование tcp-порто. Значения аналогичны  BLOCK_UDP
KILL_ROUTE - правило для iptables или команда route, которую нужно выполнить по отношению к атакующему. Таких строк может быть не одна.
KILL_HOSTS_DENY - строка которая вписывается в /etc/hosts.deny, для блокирования доступа к сервисам, запускаемым через inetd
SCAN_TRIGGER - количество подключений с одного хоста к обслуживаемым портам  прежде, чем portsentry отреагирует (0 - мгновенная реакция)
$TARGET$ - переменная хранящая ip-адрес атакующего

Первые 4 строки настройки нужно делать исходя из вывода netstat -tunap
Открываемые portsentry порты не должны повторять порты, которые открыты работающими сервисами и не должны присутствовать в TCP_PORTS и UDP_PORTS.
Все порты работающих сервисов должны быть включены в ADVANCED_EXCLUDE_TCP и ADVANCED_EXCLUDE_UDP.

Сохраняем изменения и закрываем редактор.

Дополнительную информацию об опциях файла /etc/portsentry/portsentry.conf можно получить здесь или здесь.


Открываем на редактирование файл /etc/portsentry/portsentry.ignore
Где вписываем все ip-адреса, которые не должны быть заблокированы.
Синтаксис таков: одна строка - один ip/маска. К примеру 192.168.0.133/24
После внесения ip-адресов разрешённых хостов сохраняем изменения и закрываем редактор.

Перезапускаем portsentry скомандовав в консоли вот так:

service portsentry restart


Мониторинг portsentry

Системный журнал за текущую дату (время, включенные порты, атаки, реакции и пр.)

LANG=en_US.UTF-8; grep "$(date '+%b %e').*portsentry" /var/log/syslog; LANG=ru_RU.UTF-8

системный журнал только по атакам и реакциям

LANG=en_US.UTF-8; grep "$(date '+%b %e').*portsentry.*attackalert" /var/log/syslog; LANG=ru_RU.UTF-8

История portsentry за текущую дату (дата, время, ip, порт, протокол и реакция)

grep "$(date '+%m/%d/%Y')" /var/lib/portsentry/portsentry.history

список хостов, которым запрещён доступ к сервисам, запускаемым через inetd

cat /etc/hosts.deny

то же, но без комментариев

sed '/^#.*/d; /^$/d' /etc/hosts.deny

сети, которые portsentry выкинуло из таблицы маршрутизации

route -n | grep "\!H"

Сработка правил iptables

iptables -nxvL


Защита от Dos/Ddos атак



Статья не закончена.



Опубликовано: Константин, Автор/источник: Сакрюкин К.В. 15 Февраль 2015 00:00:05

Комментировать

Вы не залогинены! Регистрация

Афоризмы, мысли

Философия Линукс: „Смейся в лицо опасности“. Ой, не то - „Сделай сам“! Да, правильно.

/Линус Бенедикт Торвальдс/

Счётчик

Сейчас на сайте - 1 (0 зарег.)
Всего хитов7870 
Сегодня хитов7870 
Сегодня хостов1032 

Откуда гости наши?

 
Powered by ReloadCMS 1.5.0.
© 2004-2012 ReloadCMS Team
RSS AggregationPHP powered
Генерация страницы: 1.32
  Яндекс.Метрика
    Сакрюкин К.В.   Яндекс цитирования    
 
Здесь всё можно копировать и цитировать, но рабочая ссылка на мой сайт обязательна!