суббота, 12 января 2019 г.

Solaris: SSHGuard

Мы много лет не используем парольную аутентификацию для SSH. Тем не менее, так как гнуторасы с завидным упорством ходят с паролями, с таким же завидным упорством боты долбятся на порты SSH. Даже на нестандартные (хотя на такие долбятся существенно реже).

Это достает. Они мешают нам самим управлять системами удаленно.

Да, я слышал про fail2ban.


Однако, это гнуторастическая чушня, которая, хотя и написана на скриптятине, не кроссплатформенная - и никто не чешется ее делать таковой. А во-вторых, я считаю, что грузить полгигабайта интерпретатора (даже с учетом стоимости RAM - хотя попробуйте-ка заявить, что ECC-память стоит как лопата дерьма) ради простенькой задачки - это раздолбайство и расточительство.

Короче говоря, есть (хотя и тоже наполовину скриптовая) недурная альтернатива fail2ban с меньшим memory footprint - SSHGuard.

Однако, хотя и заявляется поддержка Solaris, без целого ряда телодвижений оно на Солярис легко не ставится - это раз, два - там есть ряд ошибок, которые рядовой админ не только не исправит, но даже не врубится, и три - как обычно, документация в СПО - говнище полное абсолютный отстой и нет вообще никаких намеков на то, как надо танцевать с бубном на Солярисе. Гугл-фу тут не поможет, так как нет нигде в интернете никакой информации об установке сабжа на Солярис.


Исправим врожденный генетический дефект гнуторастического софта (да, я уже потанцевал с бубном). Напишем трахнутый ман для Соляриса.

Проблема начинается сразу же. Не билдится:
 Making all in src  
 gmake[1]: Entering directory '/patch/tmp2/sshguard-2.3.1/src'  
 Making all in blocker  
 gmake[2]: Entering directory '/patch/tmp2/sshguard-2.3.1/src/blocker'  
  CC    simclist.o  
  CC    attack.o  
  CC    blocker.o  
 blocker.c: In function 'init_log':  
 blocker.c:95:18: error: 'LOG_PERROR' undeclared (first use in this function)  
      flags |= LOG_PERROR;  
          ^  
 blocker.c:95:18: note: each undeclared identifier is reported only once for each function it appears in  
 gmake[2]: *** [Makefile:389: blocker.o] Error 1  
 gmake[2]: Leaving directory '/patch/tmp2/sshguard-2.3.1/src/blocker'  
 gmake[1]: *** [Makefile:431: all-recursive] Error 1  
 gmake[1]: Leaving directory '/patch/tmp2/sshguard-2.3.1/src'  
 gmake: *** [Makefile:481: all-recursive] Error 1  

Ни одна гнида не удосужилась проверить исходник Никто не проверял сорц на предмет собираемости на всех заявленных ОС.

Что ж, не будем заморачиваться, просто закомментируем эту строчку в blocker.c:

Что ж, проблема решена. Конфигурируем, собираем:

 # ./configure 'CFLAGS=-m64 -O2' && make && make install-strip  

"Смерть - это только начало".

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

Первое - это запускной скрипт /usr/local/sbin/sshguard.

По скудоумию, авторы считают, что /bin/sh - это баш повсюду. Авотхой. Черта с два. В Солярисе это - Борн, который к башизмам относится скверно. Калабашку за стремную интероперабельность. Благо, в Солярисе с версии 8 есть баш - но его надо вызывать и специфицировать отдельно. Исправим в первой строчке #!/bin/sh на #!/bin/bash. Иначе будут проблемы с запуском.

Следующая засада. Авторы в глаза не видели Соляриса, это очевидно.

Открываем /usr/local/libexec/sshg-fw-ipfilter и правим вот эти две строчки:


 IPFILTER_CMD=/usr/sbin/ipf  
 IPFILTER_CONF=/etc/ipf/ipf.conf  

Там отфонарные пути по дефолту указаны. Для какой угодно системы, но только не для Солярис.

Следующий шаг. Открываем /usr/local/etc/sshguard.conf.

BACKEND и FILES должны быть отпределены вот так

 #!/bin/sh  
 # sshguard.conf -- SSHGuard configuration  
   
 # Options that are uncommented in this example are set to their default  
 # values. Options without defaults are commented out.  
   
 #### REQUIRED CONFIGURATION ####  
 # Full path to backend executable (required, no default)  
 #BACKEND="/usr/local/libexec/sshg-fw-iptables"  
 BACKEND="/usr/local/libexec/sshg-fw-ipfilter"  
   
 # Space-separated list of log files to monitor. (optional, no default)  
 #FILES="/var/log/auth.log /var/log/authlog /var/log/maillog"  
 FILES="/var/adm/loginlog /var/adm/authlog /var/adm/messages"  
   

(Вы же выполняли рекомендованные пререквизиты для Solaris и у вас созданы и loginlog и authlog с правами 600, верно?)

Далее, найдите ваш sshd_config и включите LogLevel повыше:

и перезапустите SSH.

Почти готово.

Осталась сущая мелочь. Надо написать SMF для сервиса.

Я знаю, что у админов сложности с пониманием и, тем более, написанием скриптов - поэтому вот вам готовый написанный SMF.

Если все предыдущие шаги выполнены, можно запустить сервис:

That's all, folks!