Мы — долго запрягаем, быстро ездим, и сильно тормозим.
www.lissyara.su —> статьи —> FreeBSD —> Security —> немного о безопасности

Вопросы безопасности при работе во внешних сетях (INTERNET)

Автор: lissyara.


    Собственно вопрос встал ребром по одной причине - у меня на мониторе вечно бегут логи серваков, на всякий случай, мало ли чё упадёт, или случится. Полдня наблюдал как какой-то придурок пытался найти пользователей и пароль к серваку. От нечего делать просканил его машину nmap`ом, посмотрел, что за ось, какие порты открыты, какие приложения их слушают....
/usr/home/lissyara/>nmap -A 203.124.250.113

Starting nmap 3.93 ( http://www.insecure.org/nmap/ ) at 2005-11-22 16:00 MSK
sendto in send_ip_packet: sendto(3, packet, 328, 0, 203.124.250.113, 16) =>
 Permission denied
send_ip_packet in send_closedupd_probe: Permission denied
sendto in send_ip_packet: sendto(3, packet, 328, 0, 203.124.250.113, 16) =>
 Permission denied
send_ip_packet in send_closedupd_probe: Permission denied
Interesting ports on 203.124.250.113:
(The 1665 ports scanned but not shown below are in state: closed)
PORT     STATE SERVICE VERSION
22/tcp   open  ssh     OpenSSH 3.4p1 (protocol 1.99)
111/tcp  open  rpcbind  2 (rpc #100000)
6000/tcp open  X11      (access denied)
Device type: general purpose|broadband router
Running: Linux 2.4.X|2.5.X|2.6.X, D-Link embedded
OS details: Linux 2.4.0 - 2.5.20, Linux 2.4.18 - 2.4.20, 
Linux 2.4.26, Linux 2.4.27 or D-Link DSL-500T (running linux 2.4), 
Linux 2.4.7 - 2.6.11, Linux 2.6.0 - 2.6.11
Service Info: OS: Unix

Nmap finished: 1 IP address (1 host up) scanned in 34.421 seconds
/usr/home/lissyara/>

Это был шлюз, на линухе, а сам чувак сидел за шлюзом. Причём шлюз не на обычном PC а d-link`овский роутер - железяка с операционкой. Вначале это меня веселило, как и обычно, но этот, оказался толи упрямым, толи тупым - к вечеру его сканер уже нарезал третий круг по одним и тем же пользователям. Мне это надоело, и я добавил в файрволл правило:
/usr/>ipfw add 1 deny ip from 203.124.250.113 to me
00001 deny ip from 203.124.250.113 to me
/usr/>

Всё. Мудазвон был свободен как ветер до первой перезагрузки, или до того как я вспомню про это правило, и уберу его. Вероятность второго была исчезающе мала, по причине моей короткой памяти, а первое произойдёт нескоро, самое частое я его перезагружаю раз в три месяца. Когда случайно провод питания ногой зацеплю :)))
   В общем-то на этом моменте про происшествие можно было забыть, но, не давало покоя то, что методы вроде примитивные, но могут и сработать - мало ли, я пользователя заведу без пароля, или со слишком простым, да забуду у него поставить /sbin/nologin... Чего тока не бывает спьяну-то :) Короче, было принято решение о прмитивном, но усилении безопастности. Файрволл стоял давно, а вот ssh прикрыть снаружи я не мог - пару раз сталкивался, что что-то забыл из конфига, и чтобы посмотреть на рабочем серваке приходилось заходить на него с самых неожиданных IP. Если б не это то задача бы свелась к закрыванию ssh снаружи, или к разрешению ходить по нему определённому набору хостов.
   Для начала решил поковырять конфиг sshd - может там что есть? Конфиг sshd живёт в /etc/ssh/sshd_config Удалось нарыть следующую опцию:
AllowUsers lissyara

- что означает, что по ssh можно ходить тока мне. Внёс эту строку, сделал
killall -1 sshd

и проверил - и вправду, других пользователей не пускал. Это было уже неплохо. Но - душа хотела большего. Тогда вспомнилось, что существуют скрипты, которые добавляют в файрволл запрещающие правила, в случае, если с какого-то IP сканят порты, или ещё как развлекаются. Скрипты эти я даже искать не стал, порты меня не волновали, это забота файрволла и приложений, что их слушают, зато это воспоминание подтолкнуло мысль в верном направлении - надо написать свой скрипт, который будет лопатить логи авторизации в /var/log/auth.log
   Сказано - сделано. Написал.
#!/bin/sh

# если два часа ночи - удаляем предыдущие правила
if [ `date +%H` -eq 02 ]
then
/sbin/ipfw delete 1 >/dev/null 2>&1
fi

#
day=`date +%d`
month=`date +%m`
year=`date +%Y`
log_dir="/var/old_log/${year}/${month}"
# создаём папку для логов
mkdir -p ${log_dir}
log_file="${log_dir}/${day}_auth.log"

# переносим логи
cat /var/log/auth.log > /tmp/auth.log
cat /dev/null > /var/log/auth.log
cat /tmp/auth.log >> ${log_file}

# Вначале отлавливаем IP с которых пытаются залогинится
# под несуществующими пользователями
cat /tmp/auth.log | \
grep Illegal | awk '{print $10}' | sort | uniq -c  | sort |
{
while read count_IP
do
count_deny=`echo ${count_IP} | awk '{print $1}'`
IP=`echo ${count_IP} | awk '{print $2}'`
if [ ${count_deny} -ge 10 ]
then
#echo "IP address  = ${IP}      deny count =    ${count_deny}"
/sbin/ipfw add 1 deny ip from ${IP} to me >/dev/null 2>&1
fi
done
}

# отлавливаем IP c которых лезут под системными
# пользователями (с учётом того, что сделали раньше,
# ходить разрешили только описанным в sshd_conf)
cat /tmp/auth.log | \
grep "Failed password" | awk '{print $11}' | sort | uniq -c  | sort |
{
while read count_IP
do
count_deny=`echo ${count_IP} | awk '{print $1}'`
IP=`echo ${count_IP} | awk '{print $2}'`
if [ ${count_deny} -ge 5 ]
then
#echo "IP address  = ${IP}      deny count =    ${count_deny}"
/sbin/ipfw add 1 deny ip from ${IP} to me >/dev/null 2>&1
fi
done
}

Такой вот несложный скриптик, который заодно переносит логи в другое место. Можно сделать и лучше, но, лучшее - враг хорошего. Заносим его запуск в рутовый crontab, на запуск раз в 10 минут.
   Заодно решил обновить sshd - больно уж у меня старая и версия стояла.
/usr/home/lissyara/>/usr/ports/security/openssh-portable/>sshd -v
sshd: illegal option -- v
sshd version OpenSSH_3.5p1 FreeBSD-20030924
Usage: sshd [options]
Options:
  -f file    Configuration file (default /etc/ssh/sshd_config)
  -d         Debugging mode (multiple -d means more debugging)
  -i         Started from inetd
  -D         Do not fork into daemon mode
  -t         Only test configuration file and keys
  -q         Quiet (no logging)
....................................
/usr/home/lissyara/>cd /usr/ports/security/openssh-portable/
/usr/ports/security/openssh-portable/>make && make install && make clean
....................................
....................................
===>   Compressing manual pages for openssh-portable-4.2.0.0,1
===>   Registering installation for openssh-portable-4.2.0.0,1
===> SECURITY REPORT:
      This port has installed the following binaries which execute with
      increased privileges.
/usr/local/libexec/ssh-keysign

      This port has installed the following files which may act as network
      servers and may therefore pose a remote security risk to the system.
/usr/local/bin/ssh-keyscan
/usr/local/bin/ssh
/usr/local/sbin/sshd
/usr/local/libexec/ssh-keysign
/usr/local/bin/ssh-agent

      This port has installed the following startup scripts which may cause
      these network services to be started at boot time.
/usr/local/etc/rc.d/sshd.sh.sample
.........................................

Из опций, что предлагались при установке я не выбрал ничего. Итак, всё инсталлировано, но согласно секьюрити репорту, установился он не вместо системного, а сам по себе. Ладно. Не страшно. Для начала копируем скрипт запуска:
/usr/ports/security/openssh-portable/>cd /usr/local/etc/rc.d/
/usr/local/etc/rc.d/>cp sshd.sh.sample sshd.sh
/usr/local/etc/rc.d/>

Удаляем строку sshd_enable="YES" из файла /etc/rc.conf. Если есть локальный доступ к машине - убиваем sshd и запускаем скрипт /usr/local/etc/rc.d/sshd.sh Должно работать. У меня локального доступа ко всем машинам нет (вернее он есть, но до некоторых добираться по часу - некогда), потому я перезагружаюсь.
   Всё работает. Конфиг у меня получился такой
PermitRootLogin no
MaxAuthTries 2
ChallengeResponseAuthentication no
MaxStartups 2
Subsystem       sftp    /usr/local/libexec/sftp-server
AllowUsers lissyara

Всё остальное соответственно - по умолчанию.



размещено: 2005-11-22,
последнее обновление: 2010-02-04,
автор: lissyara


trubb, 2005-12-09 в 13:13:36

усигда сщитал чё пишицца пральна - безопасность....

Spider, 2005-12-28 в 5:12:22

А не проще в демон системны лога вписать скрипт который будет при не правильно обращении в количестве 3-5 раз блокировать фаервол, при том можно вести (на мускуле) журнал тех кто заходил или незашел (по причине провала авторизации) а также журнал кого забанили.
При загрузке журнал бана можно подымать генерировать правила фаервола и следить дальше.
При таком подходе у можно сделать Веб морду и вести накопительный журнал бан адресов (который в свою очередь можно будет перекладывать на другие сервера)
и мониторить всё происходящее через веб - интерфейс

Spider, 2005-12-28 в 5:16:12

А по поводу скаирования, есть такая прога portsentry
которая слущает назначенные порты и в случае обращения (скажем 10 раз) к разным портам с одного ай пи меняет роутинг к хосту заводя его на локалхост

хуй, 2007-04-02 в 17:49:01

вместо того, чтобы городить какие-то кошмарные скрипты с правилами в фаерволе, достаточно поставить некоммерческую версию ssh: /usr/ports/security/ssh2-nox11 и добавить в конфиг 2 параметра:
LoginGraceTime                  60
AuthInteractiveFailureTimeout   10

этого достаточно, чтобы весьма неплохо обламывать роботов: перебор пароля вырождается в одиночную попытку, что делает другие способы борьбы неактуальными ;)

Непонятно, почему в openssh такого не могут заимплементить :-(

res, 2007-06-13 в 10:58:52

По поводу SSH - рулит авторизация по ключам с отключенной авторизацией по паролю. В этом случае и ssh2-nox11 не понадобится.
Кроме AllowUsers есть еще параметр AllowGroups.
В случае авторизации по ключам имеет смысл завести юзера для захода по SSH и для захода через консоль по логину/паролю, но без права заходить по SSH.

E_K, 2007-07-02 в 10:17:23

Добавляю AllowUsers, но почему делаю рестарт демона, но почему-то продолжает пускать всех. фря 6-2.

E_K, 2007-07-02 в 10:18:31

Сорри, пальцы заблудились!Добавляю AllowUsers, делаю рестарт демона, но почему-то продолжает пускать всех. фря 6-2.

dan, 2007-08-18 в 16:57:16

Давно использую PF
sshd_config:
MaxAuthTries 2
VersionAddendum
будучи извращенцем пересобрал ssh системы чтоб не показывал версию (где-то в сырцах libssh)

в pf

table <sshbrute> persist
...
block drop in log quick from <sshbrute>
...
pass in proto tcp from any to { ($ext_if) , ($int_if) } port ssh flags S/SA keep state  \
( max-src-conn 7, max-src-conn-rate 3/50, overload <sshbrute> flush global )

в кронтабе каждые 5 мин
/usr/local/sbin/expiretable -v -v -t 600 sshbrute > /dev/null 2>&1

expiretable лежит в портах удаляет записи в таблице старше заданного времени

ну у меня там скрипт другой немного он ещё мне отдельный лог "неверных" собирает

таким образом имеем что после двух неверных попыток ввода пароля чел теряет tcp сессию если этих сессий  3 или больше за 50 секунд он улетает в таблицу и курит в сторонке как повезёт от 10 до 15 минут, от брутфорса вполне спасает

Alex_, 2007-09-07 в 13:44:19

Кроме того можно SSH заставить слушать порт отличный от 22.
в sshda-config указать например такое
Port 333
Доступ потом получаем так:
ssh -l user my.server.ip.address -p 333

артур, 2007-11-19 в 20:30:32

сам недавно столкнулся, до этого 22 тока в локалке был. в основном похоже боты, один долбился с часу ночи чуть не до трех. (или кулхацкер терпеливый попался %). гугл как всегда посоветовал все варианты: allowusers, другой порт, конкретные хосты,
потом нашел denyhosts (http://denyhosts.sourceforge.net)

слушает логи (у меня /var/log/auth.log) и в соотв. с некоторыми правилами заносит подозрительные ip в /etc/hosts.deny, т.е. не трогает фаервол. только sshd должен поддерживать tcp wrappers.
собссно правила настраиваются в конфиге.

у меня поставлено, проверено и работает.
зы. странно, но еще никто не ломился в рута.

koffu, 2008-01-27 в 10:56:56

Есть хорошая утилитка в портах sshguard, слушает auth.log, и по заданным параметрам (кол-во неправильных логинов, время блокировки, время снятия подозрения) добавляет в файервол "deny ip from %IP% to me". Если запускать через tail -n0 -F /var/log/auth.log | /usr/local/sbin/sshguard & , то не нужно ничего изменять в конфигах.

Dmitry Stremkouski, 2008-02-18 в 21:17:40

res прав. Надо просто сгенерировать ключи. Включить аутентификацию по ключам.

jonia, 2009-05-06 в 20:53:43

Спасибо lissyara, а также артур-у!
У меня дом. сеть, а с PF/ipwf  все еще не разобрался...
Поставил denyhosts, инструкция на сайте не очень понятная, но помогла статя Preventing SSH Dictionary Attacks With DenyHosts, спасобо еще раз...

прохожий, 2009-05-25 в 10:07:20

Правильно пишется: безопасность, дибил. Так позориться, это пиздец, конечно.

lissyara, 2009-05-25 в 11:37:34

та мне покласть как правильно =))
так же как и тебе на смысл текста =)

LEAD, 2009-09-03 в 5:07:51

дЕбил тоже по другому пишется.
Только это сайт по правописанию.

За статью огромное спасибо. И за комменты тоже. Мне пригодилось)

LEAD, 2009-09-03 в 5:08:59

хы.. очепятка..

НЕ по правописанию

Michael /780, 2009-11-02 в 8:30:10

ChallengeResponseAuthentication no

1. После добавления вот этого - openssh вообще отказывается работать с PAM.
2. Failed password
Это в auth.log не появляется совсем, даже после применения запрещенных приемов.
Может кто разъяснит?

z, 2010-07-01 в 22:13:04

ну если челенжреспонауфикешин - но то генери ключи.
вход только по ним а не по паблик ключу в known_hosts

Йа, 2010-08-18 в 11:40:30

Ёпаный насос! Жора, где ты был?!!

Зануда, 2011-05-23 в 17:32:50

Что моглобы это значить? Syntax error: "do" unexpected (expecting "}")

Жорег, 2012-02-07 в 14:25:03

Лисяра, а кака ты сделал, чтобы у тебя на твоем компе отображались логи серваков? Тоже хочу так сделать :)

Буратино, 2014-10-04 в 13:02:37

У меня тоже были траблы - лезли все кому не лень, судя по диапазаону в основном Китай. Перенес на нестандартный порт - пол-года ничего. Даже скучно.



 

  Этот информационный блок появился по той простой причине, что многие считают нормальным, брать чужую информацию не уведомляя автора (что не так страшно), и не оставляя линк на оригинал и автора — что более существенно. Я не против распространения информации — только за. Только условие простое — извольте подписывать автора, и оставлять линк на оригинальную страницу в виде прямой, активной, нескриптовой, незакрытой от индексирования, и не запрещенной для следования роботов ссылки.
  Если соизволите поставить автора в известность — то вообще почёт вам и уважение.

© lissyara 2006-10-24 08:47 MSK

Время генерации страницы 0.0457 секунд
Из них PHP: 36%; SQL: 64%; Число SQL-запросов: 77 шт.
Исходный размер: 47989; Сжатая: 12348