06.04.2022

Бронированный линукс

Как то очень много настраиваю линуксов с нуля и все больше и больше приходится ковырятся в настройках. Напишу чтобы не забыть:
0) первоначальные настройки ufw и ipset
1) скрипт добавления ключа ssh
2) 2fa google auth для определенных подьзователей (in progress)
3) syslog(in progress)
4) системы анализа (lynis) (in progress)
5) ids (portsentry)
6) postfix (in progress)
7) смотрим дебажим (fatrace) (in progress)

0) первоначальные настройки ufw и ipset

Первоначально у меня настроен ipset c несколькими списками так как перевалило за 65к хостов пришлось увеличить размерность
/etc/iptables/ipset.up.rules.all
create dropipsall hash:ip family inet hashsize 16384 maxelem 208516

/etc/iptables/ipset.up.rules.mail
create dropipsmail hash:ip family inet hashsize 16384 maxelem 208516

/etc/iptables/ipset.up.rules.ssh
create dropipsssh hash:ip family inet hashsize 16384 maxelem 208516

/etc/iptables/ipset.up.rules.web
create dropipsweb hash:ip family inet hashsize 16384 maxelem 208516

/etc/iptables/ipset.rules
create dropips hash:ip family inet hashsize 16384 maxelem 208516

скрипт создания списков: (ipsetfistcreate.sh)
#!/bin/sh
ipset restore  -! < /etc/iptables/ipset.up.rules.all
ipset restore  -! < /etc/iptables/ipset.up.rules.mail
ipset restore  -! < /etc/iptables/ipset.up.rules.web
ipset restore  -! < /etc/iptables/ipset.up.rules.ssh
скрипт сохранения списков: (ipset.save.sh)
#!/bin/sh
ipset save dropipsall> /etc/iptables/ipset.up.rules.all
ipset save dropipsmail> /etc/iptables/ipset.up.rules.mail
ipset save dropipsssh> /etc/iptables/ipset.up.rules.ssh
ipset save dropipsweb> /etc/iptables/ipset.up.rules.web
ipset save dropips> /etc/iptables/ipset.rules
Правила в iptables:
-A INPUT -m set --match-set dropipsall src -j DROP
-A INPUT -m set --match-set dropipsssh src -p tcp -m multiport --dports 1052 -j DROP
-A INPUT -m set --match-set dropipsmail src -p tcp -m multiport --dports 25,110,222,465,587,143,993,995,80,443 -j DROP
-A INPUT -m set --match-set dropipsweb src -j DROP
Если используется ipset в /etc/ufw/before.rules
....
# allow all on loopback
-A ufw-before-input -i lo -j ACCEPT
-A ufw-before-output -o lo -j ACCEPT

-A ufw-before-input -m set --match-set dropipsall src -j DROP
-A ufw-before-input -m set --match-set dropipsssh src -p tcp -m multiport --dports 222 -j DROP
-A ufw-before-input -m set --match-set dropipsmail src -p tcp -m multiport --dports 25,110,222,465,587,143,993,995,80,443 -j DROP
-A ufw-before-input -m set --match-set dropipsweb src -j DROP
в UFW есть прикол что не поднимаются автоматически списки для этого создаем: /etc/systemd/system/ipset-persistent.service:
[Unit]
Description=ipset persistent configuration
Before=network.target

# ipset sets should be loaded before iptables
# Because creating iptables rules with names of non-existent sets is not possible
Before=netfilter-persistent.service
Before=ufw.service

ConditionFileNotEmpty=/etc/iptables/ipset

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/sbin/ipset restore -exist -file /etc/iptables/ipset
# Uncomment to save changed sets on reboot
# ExecStop=/sbin/ipset save -file /etc/iptables/ipset
ExecStop=/sbin/ipset flush
ExecStopPost=/sbin/ipset destroy

[Install]
WantedBy=multi-user.target

RequiredBy=netfilter-persistent.service
RequiredBy=ufw.service
и в systemd service unit: systemctl daemon-reload systemctl enable ipset-persistent.service списки будут сохраняться в /etc/iptables/ipset

1) скрипт добавления ключа ssh


#/bin/sh

cd /root
mkdir .ssh
chmod 700 .ssh
cd .ssh
touch authorized_keys
chmod 600 authorized_keys
echo 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABM= yabloko@mac-book' >>authorized_keys

3) syslog(in progress)


Первоначльно уберем сообщения от cron в auth. Не знаю как кого а меня они бесят:
*.*;auth,authpriv.none,cron.none -/var/log/sys/syslog
kern.* -/var/log/sys/syskern.log
mail.* -/var/log/sys/sysmail.log
mail.err /var/log/sys/mail.err

:msg, contains, "pam_unix(cron:session)" stop
auth,authpriv.* /var/log/auth.log

#:programname, isequal, "CRON" stop
#auth,authpriv.*                 /var/log/auth.log

*.emerg :omusrmsg:*
auth,authpriv.* /var/log/sys/auth.log

5) ids (portsentry)


portsentry показала достаточно хорошо от всякого рода кулхацкеров. Логика такая, открываются порты, которые слушает демон portsentry. При стучании на эти порты выполняется скрипт который прописан в конфиге. Перевешиваем стандартный ssh на нестандартный порт, и все что будет пробывать ломится на стандартный ssh блокируем фаерволом. Какие бы я порты блокировал из tcp 1,7 - echo txpmux
21,23 фтп и телнет
389 и 636- лдап
2049 - nfs
3128 - прокси (если нету)
3389 - rdd
4899 - radmin
5222 -jabber
5432 - postgres
10050,10051 - zabbix
из udp брал из конфига (все равно нифига не блокирует)UDP_PORTS="1,7,9,69,161,162,513,635,640,641,700,37444,34555,31335,32770,32771,32772,32773,32774,31337,54321"
apt-get install portsentry
добавляем в конфиг или меняем (а то что есть комментируем):

TCP_PORTS="1,7,21,23,389,636,2049,3128,3389,4899,5222,5432,10050,10051"
UDP_PORTS="1,7,9,69,161,162,513,640,700,32770,32771,32772,32773,32774,31337,54321"
RESOLVE_HOST = "1" BLOCK_UDP="1" BLOCK_TCP="1" KILL_ROUTE="/sbin/ipset -A dropipsall $TARGET$" KILL_RUN_CMD="/etc/portsentry/scan_port_mail.sh $TARGET$ $PORT$ $MODE$"
в файл portsentry.ignore.static добавляем внешний адрес (поверьте были случаи) и доверенные адреса.
если забудете отключить прибивание маршрута то удалить из маршрутов можно коммандой: route del -host ip-address reject
У меня все эти блокировки пишется в таблицу mysql (если вдруг списки потеряются чтобы восстановить можно было) и в файл /var/log/block.log
scan_port_mail.sh
#!/bin/sh

main_e_mail="mysqcretmail@arti.pp.ua"
attak_date="`date +%Y-%m-%d`"
attak_time="`date +%H:%M:%S`"
local_mashine="`uname -n`"
TODAY=`date +%Y%m%d`

hacker_IP=$1
scanned_port=$2

hacker_DNS=`host ${hacker_IP} | awk '{print $5}'`

#echo " обнаружена попытка сканирования .
#Имя машины:             ${local_mashine}
#Отсканенные порты:       ${scanned_port}
#
#Прикрепляем данные атакующего:
#IP:     ${hacker_IP}
#DNS:    ${hacker_DNS}
#=======
#Атака заблокирована().
#" | mail -s port_scanned_on_${local_mashine} ${main_e_mail}


RES=`mysql -u fail2ban -p2ban -D fail2ban -N -B -e "select ban_host_ip('${hacker_IP}','ADD','HAND_PORTSENTRY','SCAN:${scanned_port}');"`
    if [ $RES = "-1" ];
    then
        echo $RES
    else
		echo "DROP ${hacker_IP}"
		block=`/sbin/ipset -A dropipsall ${hacker_IP}`
		echo 'block'
        echo "$TODAY portsentry DROP ${hacker_IP} " >> /var/log/block.log
    fi
Для ufw делаем файл с конфигой и открываем порты
/etc/ufw/applications.d/portsentry
[portsentry]
title=IPS portsentry
description=port for blocking
ports=1/tcp|7/tcp|21/tcp|23/tcp|389/tcp|636/tcp|2049/tcp|3128/tcp|3389/tcp|4899/tcp|5222/tcp|5432/tcp|10050/tcp|10051/tcp|1/tcp|7/tcp|9/tcp|69/tcp|161/tcp|162/tcp|513/tcp|640/tcp|700/tcp|32770/tcp|32771/tcp|32772/tcp|32773/tcp|32774/tcp|31337/tcp|54321/udp
Добавляем правило
ufw allow portsentry

7) смотрим дебажим (fatrace) (in progress)

в консоль просто запускаем: fatrace в файл например на 60 сек sudo fatrace -o /tmp/trace -s 60

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

Отправить комментарий