C, PHP, VB, .NET

Дневникът на Филип Петров


* Настройки на sysctl.conf под FreeBSD

Публикувано на 10 април 2009 в раздел ОСУП.

Много хора не знаят, че във файла /etc/sysctl.conf за настройки на ядрото на Unix-базираните операционни системи се съдържат изключително много възможности за подобряване на стабилността на системата, а оттам и нейната сигурност.

В настоящата статия ще разгледаме някои важни настройки за мрежовия адаптер и още други свързани със сигурността на системата. Повечето от тях ще подобрят сигурността на системата и ще я направят много по-малко уязвима от слаби DDoS атаки. Разгледаните настройки са само за системи работещи под FreeBSD. Други операционни системи имат свои алтернативни опции.

1. security.bsd.see_other_uids=0

Ако тази опция е разрешена, то процеси без привилегии ще могат да виждат други обекти с различен реален групов идентификатор (gid). Нормално не бихме искали това да става.

2. net.inet.tcp.msl=15000

MSL е съкращение от "Maximum Segment Life" за TCP/IP. Това е максималното време в милисекунди, което ще се изчаква за един ACK в отговор на SYN-ACK или FIN-ACK. Ако след изтичане на това време не се получи отговор, то сегмента се счита за загубен и мрежовата връзка се освобождава. RFC стандарта дефинира MSL да бъде 120000ms, което в днешно време с бързи интернет връзки е напълно неоправдано. Стандартната стойност за FreeBSD е 30000, но статистиката показва, че дори намалявайки я наполовина няма никакви проблеми. Ако обаче често изпитвате силни DoS атаки, то можете да го намалите и под 8000.

3. net.inet.tcp.blackhole=2

Знаете ли какво се случва, когато се изпрати TCP пакет към затворен порт на системата? Истината е, че при стандартната стойност 0 се връща отговор до запитващия, с който му съобщаваме, че порта е затворен. Ако сложите стойност 1, то всички SYN заявки ще бъдат просто пропуснати и отговор няма да се върне. Това е подгодящо при известният SYN FLOOD. Стойност 2 означава, че всякакви заявки ще бъдат пропускани напълно. Поради тази причина променливата се нарича и черна дупка (blackhole).

4. net.inet.udp.blackhole=1

С абсолютно аналогично действие като миналата променлива, но тук става въпрос за UDP връзки.

5. net.inet.icmp.icmplim=50

Отново важна опция за защита срещу DoS атаки и също така скенери на портове. Чрез нея задавате лимит на максималния брой ICMP заявки, на които системата ще отговори за една секунда.

6. kern.ipc.somaxconn=16384

Чрез тази променлива се контролира броят на "слушащите" сокети в системата, които очакват нови TCP заявки. Стандартната настройка е едва 128, което е изключително лесна за запълване дори чрез слаба SYN FLOOD атака. Повечето администратори предпочитат да не слагат повече от 1024. Истината е, че съвременната техника и хардуер нямат проблем да се справят и с много по-големи стойности.

7. kern.ipc.maxsockets = 32768

Чрез тази настройка се контролира максималния брой sockets, които могат да се поддържат отворени едновременно.

8. net.inet.tcp.maxtcptw=8192

Когато TCP връзка премине в TIME_WAIT статус нейният сокет се освобождава и се отваря нова структура, която пази възможно най-минимална информация. Тази структура се нарича "компресиран TCP TIME_WAIT статус". Понеже големината е значително по-малка от нормалния сокет, то можем да спечелим значително количество памет. Провенливата net.inet.tcp.maxtcptw контролира максималният брой от такива структури, които могат да се инициализират. В общи линии гледаме да е между 4 и 5 пъти по-малка стойност от maxsockets.

9. net.inet.tcp.nolocaltimewait=1

Трябва ли да очакваме връзки от localhost да изпадат в TIMEWAIT статус? По-скоро не.

10. net.inet.ip.portrange.first=1024
net.inet.ip.portrange.last=65535

Тук просто разширяваме полето на възможни изходящи портове от стандартното 49152 – 65535 на доста по-широкия интервал 1024 – 65535.

11. net.inet.ip.portrange.randomized=1

Дали да използваме портовете в стандартната си наредба (0) вместо в произволна (1). Чрез произволни портове правим втора връзка към същия порт невъзможна преди попадане в режим TIME_WAIT. Така се затрудняват някои spoofing атаки.

12. net.inet.tcp.finwait2_timeout=30000

Контролира максималното време за прекъсване на връзка напълно.

13. net.inet.tcp.fast_finwait2_recycle=1

По подразбиране тази опция също е спряна. Това решава рядък, но много неприятен flood на системата, които може да остави хиляди затворени peers, които не са затворени във FIN_WAIT_2 статус за много дълго време.

14. net.inet.ip.fw.dyn_buckets=4096
net.inet.ip.fw.dyn_syn_lifetime=5
net.inet.ip.fw.dyn_max=16384

Тук се контролират стартовия брой на слотове в хеш таблизата за динамични правила на IPFW, както и максимално допустимият им брой.

15. net.inet.ip.forwarding=0

Искате ли IP Forwarding между интерфейси? Стандартно най-вероятно не.

16. net.inet.icmp.drop_redirect=1
net.inet.icmp.log_redirect=0

По този начин ще забраните всякакви ICMP пренасочвания.

17. net.inet.ip.intr_queue_maxlen=512

Контролира максималната дължина на входната опашка за IP.

18. net.inet.ip.random_id=1

Чрез тази опция правите така, че ID полето на IP пакетите ще бъде с произволна стойност, вместо да се увеличава винаги с 1. На практика това спестява минимално количество изтичане на статистическа информация, тъй като е възможно някой да следи големината на вашия трафик чрез брояча.

19. net.inet.tcp.drop_synfin=1

В реалния свят едва ли има нормални TCP клиенти, които ще изпратят SynFin. Поради тази причина не е зле да ги премахнем напълно.

20. net.inet.ip.redirect=0

В стандартна система едва ли ви трябват IP пренасочвания.

21. net.inet.tcp.syncookies=0

Дали да да използваме TCP SYN cookies ако "syncache" се запълни. Добро е срещу DDoS атаки, но отваря възможност за spoofing атаки.

22. net.inet.tcp.delayed_ack=0

Delayed ACK означава, че TCP не отговаря моментално с ACK на всеки единичен TCP сегмент. След като се получи самотен TCP сегмент то ще се изчака около 100-150ms с презумцията, че приложението ще даде някакъв отговор. Например в SSH връзка при натискането на клавиш обикновено очакваме да получим в отговор със изписан символ от конзолата. Не бихме искали да изпращаме празни ACK, последвани от TCP пакет с информация веднага след това. Затова забавяме изпращането на ACK с надеждата да ги изпратим заедно. В реални условия се оказва, че това може да е в по-голяма вреда, отколкото полза. Доказани са редица възможни проблеми, затова се препоръчва да се изключи.

23. net.inet.udp.maxdgram=57344
net.inet.udp.recvspace=57344

Максимална големина на изходящ и входящ UDP datagram.

24. kern.ipc.maxsockbuf=2097152,
net.inet.tcp.sendspace=2097152
net.inet.tcp.recvspace=2097152

Дефинират максималната големина в байтове, която може да се задели за изпращащ и приемащ буфер. Първата променлива (maxsockbuf) може да се приеме като глобална лимитираща променлива за другите две.

25. net.inet.ip.rtexpire=3

Стандартно време за "забравяне" на динамични маршрути.

26. net.inet.ip.rtminexpire=2

Минимално време за задържане на в динамични маршрути.

27. net.inet.ip.rtmaxcache=256

Максимален лимит за брой динамични маршрути.

28. net.inet.icmp.maskrepl=0

Забрана за отговаряне на ICMP Mask заявки.

29. net.inet.icmp.bmcastecho=0

Това ни защитава от т.нар. SMURF атаки. Тези атаки изпращат ICMP пакети до broadcast адрес от spoofed IP адрес.

30. net.inet.tcp.icmp_may_rst=0

Така ще игнорираме всички ICMP пакети, които са генерирани от филтриране на gateway/router между вас и крайната точка. Това е някаква минимална защита от атака с "човек в средата", където рутер на атакуващия може да блокира избирателно изходящи пакети от вашата машина. Също така това може потенциално да доведе и до DoS атака.

31. kern.ipc.nmbclusters=32768

NMBClusters указва в ядрото какво количество буфери са налични за системата. Такова увеличение се използва само за силно натоварени системи. Всеки клъстер е около 2KB памет, т.е. тази стойност отнема 64MB оперативна памет от системата. Такава стойност е подходяща за сървъри обслужващи около 1000 едновременни връзки.

32. kern.maxfiles=65536

Тази променлива контролира колко е максималният брой файлове, които могат да бъдат отворени едновременно в системата.
П.С. Никога не се пробвайте да го сложите "unlimited". Резултатът е, че всъщност ще станат 0 и системата ще блокира напълно.

33. net.inet.ip.sourceroute=0
net.inet.ip.accept_sourceroute=0

Забранява използването и приемането на "source routed IP packets".

34. vm.defer_swapspace_pageouts=1 

Избягва използването на swap максимално

Надявам се, че с тези настройки ще бъда полезен. Не гарантирам, че те са оптимални. Препоръчвам ги за наистина натоварени сървъри и такива, които често страдат от DoS атаки. Също така се предполага, че се използва модерен хардуер и поне 2GB RAM.

 



Добави коментар

Адресът на електронната поща няма да се публикува


*