Недавно на форуме спрашивали есть ли интерактивный firewall в Linux и многие отвечали, что нет. Ниже простая заготовка скрипта, следящего за событиями в логе, в случае подозрительной активности выводящего пользователю окно с предложением блокирования трафика или игнорирования предупреждения.1. Первоначальные настройки iptables:
#iptables-save
# Generated by iptables-save v1.4.7 on Fri Mar 11 15:15:29 2011
*filter
:INPUT DROP [137:16764]
:FORWARD DROP [0:0]
:OUTPUT DROP [10:708]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -j LOG --log-prefix "firewall-INPUT "
-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -j LOG --log-prefix "firewall-FORWARD "
-A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -j LOG --log-prefix "firewall-OUTPUT "
COMMIT
# Completed on Fri Mar 11 15:15:29 2011
# Generated by iptables-save v1.4.7 on Fri Mar 11 15:15:29 2011
*nat
:PREROUTING ACCEPT [48:6290]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [6:396]
COMMIT
# Completed on Fri Mar 11 15:15:29 2011Правила по умолчанию в цепочках можно изменить на ваш вкус.
Основной сценарий будем запускать от рядового пользователя, поэтому
ему требуется право на чтение /var/log/syslog (или куда у Вас попадает журнал netfilter).Также пользователю требуется право заполнять правила netfilter командой iptables. У меня это сделано через /etc/sudoers
2. Основной сценарий обработки журнала netfilter:
interactive-firewall.sh
while read line
do
echo $line | grep firewall > /dev/null 2>&1
[ $? != 0 ] && continue
for item in $line
do
case $item in
firewall-*) CHAIN=$item;;
PROTO=*) PROTO=$item;;
SRC=*) SRC=$item;;
SPT=*) SPT=$item;;
DST=*) DST=$item;;
DPT=*) DPT=$item;;
esac
done
CHAIN=${CHAIN#firewall-}
PROTO=${PROTO#PROTO=}
PROTO=${PROTO,,}
SRC=${SRC#SRC=}
SPT=${SPT#SPT=}
DST=${DST#DST=}
DPT=${DPT#DPT=}
ACTION=`LANG=C xmessage -buttons ACCEPT,DROP,SKIP -default SKIP -timeout 15 -print "$SRC => $DST:$DPT"`
ACTION=${ACTION:-"SKIP"}
case $ACTION in
SKIP) continue;;
ACCEPT) sudo iptables -I $CHAIN 2 -s $SRC -d $DST -p $PROTO --dport $DPT -j ACCEPT;;
DROP) sudo iptables -I $CHAIN 2 -s $SRC -d $DST -p $PROTO --dport $DPT -j DROP;;
esac
sleep 13. Запускаем firewall
tail -f /var/log/syslog | ./interactive-firewall.sh
4. Что можно улучшить.
В этом варианте правила имеют вид SRC => DST:PORT -j ACTION. Исходный порт соединения понятно пропускается. Хорошо бы предоставлять выбор пользователю из нескольких вариантов, но xmessage для этого маловато. Может у кого есть предложения чем рисовать вопрос пользователю и обрабатывать его выбор?
По желанию сценарий можно доработать и отображать в xmessage не голые цифры, а расшифровать их в имена компьютеров командой host, а протоколы по /etc/services. Кроме модификации сценария потребуется так же разрешить первоначально DNS трафик resolver'а в первоначальной конфигурации netfilter.
5. Эта заметка ни на что не претендует, просто идея и простой набросок.
URL:
Обсуждается: http://www.opennet.me/tips/info/2550.shtml
PROTO=${PROTO,,} <-- эта конструкция сработает только в bash4. Просто для информации =)
В Debian stable идёт Bash 4.1, поэтому - не существенно
А где-то в статье указан Дебиан? :)
Use rsyslog, и tail -f не понадобится.
Правда, придется еще для xmessage ставить DISPLAY и, возможно, разрешить доступ к иксам через xhost.
Ога, только действительно интерактивный фаервол держит пакет пока пользователь не скажет пропускать его или нет. А этот сначала дропнет, а потом спросит "а может нужно было пропустить?"
Грамотный сишный прогер за полчаса напишет юзерспейсный демон, который получает получает от айпистолов пакеты с ctstate NEW через NFQUEUE и запрашивает про них пользователя через какой-нибудь *notify.Куда более интересный пример использования NFQUEUE - nufw, который управляет разрешениями на фаерволе в зависимости от авторизации пользователей на клиентских десктопах (залогился юзер Вася на энном десктопе - доступ в инет для его айпишника открыли, разлогинился - закрыли). Вот это продакшен, а не кнопочки для блондинок.
> Грамотный сишный прогер за полчаса напишетЧёй-то до сих пор не вижу аналога Cisco ASDM
>Чёй-то до сих пор не вижу аналога Cisco ASDMНаверное, потому что оно в линаксе нафиг никому не сдалось?
>>Чёй-то до сих пор не вижу аналога Cisco ASDM
> Наверное, потому что оно в линаксе нафиг никому не сдалось?Нет, потому что производительность труда "грамотного сишного прогера" часто преувеличивают :)
А пофигизм его в отношении "кто же будет ломать мой линух?" - недооценивают ;)
>5. Эта заметка ни на что не претендует, просто идея и простой набросок.плюс за инициативу и ещё одно доказательство что в линухе при желании можно всё, но наверное лучше уж вот сюда усилия приложить -
https://fedoraproject.org/wiki/FirewallD/
Интересная хренюшка. Правда, раздел "why" написан безграмотно (перечисленные там "фундаментальные проблемы" легко устраняются изменением настроек в /etc/sysconfig/ip(6)tables-config).Но идея все равно хороша. Как systemd разгребает бардак в ините, так и эта штуковина может разгрести бардак в управлении netfilter'ом.
меня больше интересует использование dbus, который становится по настоящему системной шиной.
zenity - GTK-диалоги
kdialog - QT-диалоги
dialog - ncurseshttp://www.ashep.org/2011/10-poleznyx-utilit-dlya-ispolzovan.../
[Статьи за неделю не попавшие в ленту новостей (выпуск 144)]
xdialog -X11 диалоги. Во многом по синтаксису совместима с dialog
Ну и естественно нужна логика определения, что из этого есть в текущем окружении
http://code.google.com/p/yad/ - Мощный диалог
Хм. Спасибо, попробую, отпишусь о результатах :)
Можно использовать libnotify
не знаю как в других, а в дебианах примерно так -
sudo aptitude install libnotify-bin
notify-send "Ахтунг, тебя похакали!"
ну или в случае если есть только иксы - есть приблуда wishecho 'button .b -text "Включи скайп" ; pack .b ' | wish
Вроде давно уже есть...
http://wiki.mandriva.com/en/Projects/Interactive_Firewall
даже под мандриву работает только после патча ядра
а по ссылке даже картинки похерились )здесь же под любой линух, зачетная статья вобщем
есть Vuurmuur, он нагляднее