Для решения этой задачи я использую скрипт denyhosts . Он периодически проверят указанный лог-файл на предмет записей о неудавшихся подключениях, и заносит IP-адреса в файл hosts.deny. Дальше ssh-демон при очередном подключении ищет IP-адрес в «черном» списке и разрывает связь, если он там есть.
Установка denyhosts
Начальная установка denyhosts очень проста. Распаковываем исходники и запускаем скрипт установки под root.
sudo python setup.py install
По умолчанию установка будет осуществлена в папку /usr/share/denyhosts
. Там же будут пример конфигурационного файла. Копируем его.
cp denyhosts.cfg-dist denyhosts.cfg
Отредактируем denyhosts.cfg
SECURE_LOG = /private/var/log/secure.log
HOSTS_DENY = /etc/hosts.deny
LOCK_FILE = /var/run/denyhosts.pid
DAEMON_LOG = /var/log/denyhosts
Остальные параметры можете задать по своему усмотрению.
Теперь нужно скопировать и отредактировать управляющий скрипт
cp daemon-control-dist daemon-control
Переменные должны быть установлены следующие значения
DENYHOSTS_BIN = "/usr/local/bin/denyhosts.py"
DENYHOSTS_LOCK = "/var/run/denyhosts.pid"
DENYHOSTS_CFG = "/usr/share/denyhosts/denyhosts.cfg"
Удостоверимся, что этот управляющий скрипт запускается.
chown root daemon-control
chmod 700 daemon-control
До запуска denyhosts нужно создать /etc/hosts.deny
touch /etc/hosts.deny
В целом все готово для запуска denyhosts.
daemon-control start
Если до этого вас уже недавно атаковали, то адреса злоумышленников будут тут же собраны и добавлены в hosts.deny
.
Остановить denyhosts можно командой
daemon-control stop
В статье denyhosts on Mac OS X я нашел еще несколько полезных трюков.
Запуск при старте системы
В Mac OS X запуском различных программ и скриптов при старте системы занимается launchd . Проблема в том, что он не очень хорошо работает со скриптами, запускающими демонов. Launchd отслеживает момент, когда скрипт завершает свою работу и запускает его снова.
Модифицируем метод start управляющего скрипта
daemon-control
def start(*args):
cmd = "%s --daemon " % DENYHOSTS_BIN
if args: cmd += ' '.join(args)
print "starting DenyHosts: ", cmd
while True:
os.system(cmd)
time.sleep(5)
while True:
pid = getpid()
if pid >= 0:
time.sleep(300)
else:
break
Теперь его можно использовать в launchd. Создадим файл /Library/LaunchDaemons/net.hosts.deny.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>net.denyhosts</string>
<key>ProgramArguments</key>
<array>
<string>/usr/share/denyhosts/daemon-control2</string>
<string>start</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>
<key>ServiceDescription</key>
<string>Lauch denyhosts</string>
</dict>
</plist>
Выполним следующую команду, чтобы запустить его
launchctl load /Library/LaunchDaemons/net.hosts.deny.plist
Ротация лог-файлов
Все, что нужно для ротации лог-файлов – это создать файл со следующим содержимым
# logfilename [owner:group] mode count size when flags [/pid_file] [sig_num]
/var/log/denyhosts 640 5 * $D0 BJ /var/run/denyhosts.pid 15
#
Коментарии к заметке
какой однако изврат ведь есть же sshit для автоматизации защиты от перебора ?
А этот sshit на MacOS X вообще ставится? Беглый гуглинг ответа не дал. В MacPorts его тоже нет.
Вообще, ставить что-то из «портов» — это самое последнее, что я буду делать. Почти всегда существует родное (или кросс-платформенное) решение.
Помогите с проблемой: Mac OS X Yse
на шаге запуска daemon-control start пишет: -bash: daemon-control: command not found
Что делать?
UPD. Путь указал полностью — запустился, но теперь новые ошибки:
Can’t read: /private/var/log/secure.log [Errno 2] No such file or directory: ‘/private/var/log/secure.log’
Error deleting DenyHosts lock file: /var/run/denyhosts.pid [Errno 2] No such file or directory: ‘/var/run/denyhosts.pid’
Данные из
/private/var/log/secure.log
сейчас выводятся в/private/var/log/system.log
Возможно, если поменять эту строку, то будет работать. Сообщите, пожалуйста, о результате своего эксперимента.Я сам давно уже не пользуюсь этим блокировщиком — пожалуй, с тех пор, как поставил WiFi-раутер.
Сработало, спасибо большое. А что с pid файлом? оставить как есть?
Оставте его как есть.
pid — это просто файл. Он как флажок, который показывает, что процесс работает. Внутри этого файла содержится id процесса. Когда процесс завершается, то файл удаляется.