скрипт советника правила iptables

9

Существует сервер без защиты iptables :ACCEPT all..

На этом сервере могут быть пользовательские приложения.

Если нам нужно укрепить этот сервер (запретить все, и только позволить тому, что требуется приложениям) с помощью строгих правил iptables, мы должны вручную выяснить, какое приложение использует, dst/src port/protocolа затем мы должны написать правила iptables для их..

Вопрос : существуют ли сценарии, которые могут помочь в сборе этой информации с работающей машины? (из журналов?) - И автоматически генерировать правила iptables?

Как будто есть audit2allowна SELinux. Просто для iptables!

Машина не может быть отключена!

Пример: сценарий «MAGIC» должен запускаться на машине неделю / месяц, собирая информацию, а затем через неделю / месяц сценарий сможет создать файл правил iptables, который мы можем использовать.

Многие люди могут попасть в эту ситуацию (как укрепить сервер в отношении iptables). И было бы замечательно, если бы был сценарий / решение, которое может сделать это: \

evachristine
источник
Как вариант, заблокируйте все и пропустите только то, что нужно. Вы можете узнать, что нужно с tcpdump, запущенным в течение недели или около того.
Лоуренс
На этой машине не может быть никакого сбоя :)
evachristine
1
Как насчет Fail2ban
Тотти
1
Вы можете отслеживать трафик или проверять открытые порты, но вы, вероятно, будете пропускать редко, но важный исходящий трафик (специальные обновления безопасности, сообщения, отправленные в редких случаях, ...). Пока вы хотите фильтровать только входящий трафик, мониторинг может быть опцией.
Джофель
Это вполне возможно, вы можете написать скрипт для создания набора правил из запущенных приложений и открытых портов. Но вы действительно не хотите этого делать, потому что 1) в большинстве случаев не все службы должны быть подключены к сети и 2) могут быть службы, которые вы совершенно не хотите открывать для сети. Вместо этого сделайте это вручную, один раз, установите хороший набор правил и переходите оттуда. Один из способов сделать это безопасно - создать набор правил с правилами ESTABLISHED / RELATED и ACCEPT, а затем проверить, соответствуют ли соответствующие правила трафику. Когда вы будете довольны, измените политику INPUT на drop.
Педро

Ответы:

2

Сделать это вручную

sudo ss -tuanp

или

sudo netstat -tuanp

Объяснение:

-t - show tcp sockets
-u - show udp sockets
-a - show all sockets
-n - show numeric, don't resolve 
-p - show process name
ручей
источник
1

Запустите tcpdumpна машине неделю или около того, чтобы захватить средний трафик. Затем вы можете просмотреть трафик с помощью wireshark, чтобы увидеть, какие порты используются.

Команда для этого будет tcpdump -i <interface> -s 65535 -w <some-file>

Затем вы можете отобразить это обратно, используя, netstat -tuanpчтобы увидеть, какие PID / приложения используют какие порты.

Теоретически это может быть написано по сценарию.

Лоренс
источник
1

Вы можете начать с очень простого шаблона, такого как https://gist.github.com/jirutka/3742890 , который разрешает только ssh и ping, и добавлять что-либо еще вручную.

быстрый взлом скрипта для генерации правил iptables для вашего приложения, слушающего через публичный интерфейс (0.0.0.0) / tcp

netstat -lnpt | egrep '0.0.0.0:[0-9]+' | awk '{print $4,$7}' | \
sed -E -e 's/0.0.0.0://g' -e 's|[0-9]+/||' | \
awk '{printf ("iptables -A INPUT -p tcp --dport %5d --syn -m conntrack --ctstate NEW -m comment %s \n", $1,$2) }'

Вы также можете использовать iptables -I INPUT <number>для ввода правил в определенном месте, которое вы можете перечислить сiptables -nvL --line-numbers INPUT

Рабин
источник
1

К сожалению, нет такого сценария, который я когда-либо видел, который мог бы работать в режиме обучения или пассивном режиме, регистрируя всю вашу сетевую нагрузку, получая его результаты и генерируя фактический брандмауэр, используя iptablesиз его журналов.

Лучше всего начать с простого и постоянно добавлять различные части, когда вы начинаете полностью понимать, какие услуги предоставляет ваша система. Вам нужно будет использовать инструменты, например, netstatчтобы увидеть, какие порты используются для различных служб, которые вы размещаете, а также какие IP-адреса обращаются к ним.

$ sudo netstat -tlpn
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name   
tcp        0      0 0.0.0.0:25                  0.0.0.0:*                   LISTEN      26292/sendmail      
tcp        0      0 0.0.0.0:890                 0.0.0.0:*                   LISTEN      26149/ypbind        
tcp        0      0 0.0.0.0:445                 0.0.0.0:*                   LISTEN      26321/smbd          
tcp        0      0 127.0.0.1:2207              0.0.0.0:*                   LISTEN      26226/python        
tcp        0      0 127.0.0.1:2208              0.0.0.0:*                   LISTEN      26221/./hpiod       
tcp        0      0 127.0.0.1:199               0.0.0.0:*                   LISTEN      26237/snmpd         
tcp        0      0 0.0.0.0:809                 0.0.0.0:*                   LISTEN      26067/rpc.statd     
tcp        0      0 0.0.0.0:139                 0.0.0.0:*                   LISTEN      26321/smbd          
tcp        0      0 0.0.0.0:587                 0.0.0.0:*                   LISTEN      26292/sendmail      
tcp        0      0 0.0.0.0:111                 0.0.0.0:*                   LISTEN      26038/portmap       
tcp        0      0 0.0.0.0:35604               0.0.0.0:*                   LISTEN      -                   
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      26249/sshd          
tcp        0      0 0.0.0.0:631                 0.0.0.0:*                   LISTEN      26257/cupsd         
tcp        0      0 :::22                       :::*                        LISTEN      26249/sshd          
tcp        0      0 :::631                      :::*                        LISTEN      26257/cupsd         

ПРИМЕЧАНИЕ. В приведенном выше примере вы можете увидеть, какие службы у меня работают на сервере, который принимает соединения TCP, т.е. они «прослушивают» соединения через различные порты.

Разумно начинать с таких вещей, как SSH (порт 22) и HTTP (порт 80), если они типичны для вашей системы, поэтому я бы массово выполнял все эти типы служб одновременно. Для других сервисов, таких как LDAP или NIS, вы можете захотеть сделать это более контролируемым образом, следя за тем, чтобы вещи не ломались при их представлении.

Такие инструменты, как FireHOL , Firewall Builder (fwbuilder) и eztables могут быть полезны при атаке на этот проект, поскольку они обеспечивают хороший уровень абстракции от необходимости создавать собственные iptableправила вручную, что может быть сложно.

FireHOL

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

пример

transparent_squid 8080 "squid root" inface eth0

interface eth0 mylan
    policy accept

interface ppp+ internet
    server smtp accept
    server http accept
    server ftp  accept
    server ssh  accept src example.firehol.org

    client all  accept

router mylan2internet inface eth0 outface ppp+
    masquerade
    route all accept
fwbuilder

Fwbuilder - это уникальный графический инструмент брандмауэра, который позволяет пользователю создавать объекты, а затем перетаскивать эти объекты в брандмауэры, чтобы создать мощную систему безопасности для одного ПК или сети ПК. Fwbuilder поддерживает широкий спектр брандмауэров (Cisco ASA / PIX, Linux iptables, ipfilter FreeBSD, pf OpenBSD и т. Д.), Поэтому его правила могут быть развернуты на нескольких платформах. Давайте рассмотрим использование Fwbuilder в Linux, которое может стать пожизненным делом с мощной системой безопасности.

пример

   ss fwbuilder

eztables

Eztables позволяет быстро настроить брандмауэр, даже не касаясь iptables. Синтаксис правил брандмауэра разработан так, чтобы его было легко читать и применять.

Вот как вы разрешаете всему интернету доступ к вашему веб-серверу через TCP-порт 80:

  allow_in any $eth0 any 80/tcp

Eztables разработан, чтобы быть простым, но мощным. Неважно, хотите ли вы защитить свой ноутбук, настраиваете ли вы домашний маршрутизатор или создаете брандмауэр компании.

Использование Fail2Ban

При наличии элементарного iptablesбрандмауэра вы, вероятно, захотите дополнить его с помощью такого инструмента, как Fail2Ban .

выдержка

Fail2ban сканирует файлы журналов (например, / var / log / apache / error_log) и блокирует IP-адреса, которые показывают вредоносные признаки - слишком много сбоев паролей, поиск эксплойтов и т. Д. Обычно Fail2Ban затем используется для обновления правил брандмауэра для отклонения IP-адресов в течение определенного периода времени, хотя любое другое произвольное действие (например, отправка электронного письма) также может быть настроено. Из коробки Fail2Ban поставляется с фильтрами для различных сервисов (apache, courier, ssh и т. Д.).

Использование таких инструментов поможет ограничить воздействие, которое ваша система должна выдержать, пока вы продолжаете укреплять ее. Даже после того, как вы по-настоящему убеждены в том, что ваша система защищена, вы все равно можете продолжать использовать Fail2Ban как часть ваших мер безопасности.

Ссылки

SLM
источник
0

Используйте правила iptable для регистрации новых подключений, которые также будут регистрировать udp.

iptables -I INPUT -m state --state NEW -j LOG --log-prefix "New inbound connection: "
iptables -I OUTPUT -m state --state NEW -j LOG --log-prefix "New outbound connection: "

Вы можете указать другое, --log-level чтобы журналы находились в другом файле, чем / var / log / messages (вам придется настроить демон syslog).

Я думаю, что вы должны прочитать основные журналы приложений, поскольку некоторые серверы имеют очень периодическую активность, такую ​​как полдень, конец недели, конец месяца (квартал, год), чтобы вы не пропустили важную сетевую активность сервера.

Поскольку сервер является критически важным, создает матрицу сетевого потока сервера в удобной электронной таблице (ip source, ip dest, protocol, port, application), которая поможет вам построить правила.

Эммануэль
источник
0

Я знаю, что это не сценарий и это не ответ на вопрос OP, но это моя идея, которой я хочу поделиться с OP.

Я получил все порты прослушивания с:

netstat -an | egrep 'tcp .*LISTEN' | awk -F" " '{print $4}' | awk -F":" '{print $NF}'

Возможно, это поможет вам написать собственный сценарий. :)

Mr.TK
источник
0

Вы можете начать с чего-то вроде этого:

netstat -n -l -p | egrep "^(tcp|tcp6|udp)" | grep LISTEN | sed -r 's!^(tcp|tcp6|udp)\s.*:([0-9]+).*LISTEN\s+.*/(.*)!iptables -A INPUT -p \1 --dport \2 -j ACCEPT # \3!'

а затем проследить

iptables -P INPUT DROP

или

iptables -A INPUT -j REJECT --reject-with icmp-host-prohibited

В первой строке используется netstat для вывода списка прослушивающих процессов и их портов. Затем он сгенерирует строки «iptables», чтобы разрешить каждое из этих входящих соединений. Небольшая подстановка sed regex была настроена для вывода netstat на моем сервере, поэтому для вас может потребоваться некоторая настройка. Когда это работает, у вас должно получиться что-то похожее на:

iptables -A INPUT -p tcp --dport 111 -j ACCEPT # rpcbind       
iptables -A INPUT -p tcp --dport 22 -j ACCEPT # sshd          
iptables -A INPUT -p tcp --dport 25 -j ACCEPT # master        
iptables -A INPUT -p tcp --dport 3306 -j ACCEPT # mysqld        
iptables -A INPUT -p tcp --dport 49476 -j ACCEPT # rpc.statd     
iptables -A INPUT -p tcp --dport 5432 -j ACCEPT # postgres.bin  
iptables -A INPUT -p tcp --dport 55371 -j ACCEPT # rpc.statd

Следует отметить две важные вещи:

1) Эти правила ничего не делают для вас, пока вы не поставите строку DROP или REJECT в конце или не сделаете это политикой по умолчанию для несопоставленных пакетов. Эти правила разрешают пакеты, что является спорным, если политика по умолчанию разрешает что-либо несоответствующее.

2) Эти правила противоречивы относительно исходного IP. Исходя из вашего исходного поста, вы хотите разрешить всем своим клиентам использовать сервер, а затем изучите журналы, чтобы получить исходные IP-адреса для подключения к портам назначения. Я не знаю инструмента для этого, поэтому этот сценарий будет только препятствовать тому, чтобы люди создавали на вашем сервере новые сервисы, которые прослушивают другие порты ... и это нечто .

Jemenake
источник