Сценарій радника правила iptables


9

Є сервер без захисту iptables :ACCEPT all..

На цьому сервері можуть бути власні програми.

Якщо нам знадобиться загартувати цей сервер (так заперечувати все, і нехай тільки те, що потрібно додаткам) із суворими правилами iptables, ми повинні вручну з’ясувати, який додаток використовує, dst/src port/protocolа потім нам потрібно написати правила iptables для їх ..

Питання : чи існують сценарії, які можуть допомогти зібрати цю інформацію з працюючої машини? (з журналів?) - І автоматично генерує правила iptables?

Наче там audit2allowна SELinux. Тільки для iptables!

На машині не може бути відключень!

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

Багато людей можуть потрапити в цю ситуацію (як загартувати сервер щодо iptables). І було б чудово, якби був сценарій / рішення, яке може це зробити: \


Крім того, заблокуйте все і нехай лише потрібно. Ви можете дізнатися, що потрібно для запуску tcpdump протягом тижня або близько того.
Лоуренс

Не може бути відключення на цій машині :)
evachristine

1
Що про fail2ban
totti

1
Ви можете стежити за трафіком або перевіряти відкриті порти, але ви, мабуть, пропустите рідко, але важливий вихідний трафік (спеціальні оновлення безпеки, листи, що надсилаються в рідкісних випадках, ...). Поки ви хочете лише фільтрувати вхідний трафік, моніторинг може бути варіантом.
jofel

Це цілком можливо зробити, ви можете прописати спосіб побудови набору правил із запущених програм та відкритих портів. Але ви дійсно не хочете цього робити, тому що 1) в більшості випадків не всі сервіси потрібно піддавати впливу мережі та 2) можуть бути сервіси, які ви абсолютно не хочете піддавати мережі. Замість цього зробіть це вручну, раз, встановіть гарний набір правил і перейдіть звідти. Один із способів зробити це безпечно - це побудувати правило, встановлене за правилами ESTABLISHED / RELATED та ACCEPT, а потім перевірити, чи відповідні правила відповідають трафіку. Коли ви щасливі, змініть політику INPUT, щоб відмовитися.
Педро

Відповіді:


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на машині протягом тижня або близько того, щоб отримати середній трафік. Потім ви можете переглядати трафік за допомогою дроту, щоб побачити, які порти використовуються.

Команда для цього була б 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, iptables Linux, 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 як частину заходів безпеки.

Список літератури


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-джерело, ip dest, протокол, порт, додаток), яка допоможе вам побудувати правила.


0

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

У мене всі порти прослуховування:

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

Можливо, це може наблизити вас до написання власного сценарію. :)


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", щоб забезпечити кожне з цих вхідних з'єднань. Маленька заміна sedge 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-адреси, щоб перейти з портами призначення. Я не знаю інструменту для цього, тому цей скрипт лише заважатиме людям робити нові сервіси на вашому сервері, які слухають інші порти ... це щось .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.