Собственно вопрос встал ребром по одной причине - у меня на мониторе вечно бегут логи серваков, на всякий случай, мало ли чё упадёт, или случится. Полдня наблюдал как какой-то придурок пытался найти пользователей и пароль к серваку. От нечего делать просканил его машину 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
# Вначале отлавливаем 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 .........................................
Из опций, что предлагались при установке я не выбрал ничего. Итак, всё инсталлировано, но согласно секьюрити репорту, установился он не вместо системного, а сам по себе. Ладно. Не страшно. Для начала копируем скрипт запуска:
Удаляем строку 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