* Настройки на 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.
Добави коментар