Некоторые опции sysctl
Озадачился собрать и попробовать всякие sysctl опции ядра, повышающие безопасность машины, и облегчающие её работу при попытках всяких атак и сканировании портов. А может, даже, просто те пункты, которые показались интересными и нужными — причём даже только начав, заметил одну вещщь — почти всё касается работы стека TCP/IP, что и неудивительно, ибо основное применение FreeBSD — это серверы. Порывшись в инете понял — 90% данных это скопированный друг у друга перевод какой-то буржуйской статьи. Собстно поэтому и начал ковыряться — остальные 10% — это далеко немало… Причина крайне проста — это самая недокументированная часть FreeBSD…
Следующие два пункта касаются поведения ОС при попытке подключиться на порты, которые не слушаются приложениями. При штатных настройках, в таком случае, система посылает пакет с флагом RST, и закрывет подключение. Удалённый хост получает примерно следующее (если пробовать telnet`ом подключиться): Connection reset by peer.
net.inet.tcp.blackhole=2 — данный пункт указывает, что происходит при получении TCP-пакета на закрытый порт (не слушаемый никакими приложениями)Если стоит «1″, то SYN пакеты (пакет, устанавливающий соединение) на закрытый порт будут отклоняться без отсылки отправителю RST пакета (перезагрузка (соединения, не машины
)). При установке в «2″, вообще все (а не только SYN) пакеты на закрытый порт отбрасываются без каких-либо действий. Данный пункт позволяет разгрузить ЦП, т.к. обработка пакетов не производится, и интернет-канал сервера — т.к. не надо слать ответных пакетов.
net.inet.udp.blackhole=1 — очень похож на предыдущий пункт, по результату, но для протокола UDP. Ввиду того, что протокол UDP работает без установки соединения, есть только два, а не три варианта установки, когда эта переменная установлена в 1, то отбрасываются все UDP пакеты, адресованые закрытым портам.
kern.ipc.somaxconn=1024 — увеличивает размер очереди для сокетов, чем помогает предотвратить SYN-атаку, когда очередь сокета переполняется некорректными попытками соединений. Конечно от мощной атаки это не спасёт, но от слабой и средней — должно помочь. Значение по дефолту — 128.
Следующие 4 пункта необходимы для невозможности удалённого изменения таблицы маршрутизации на Вашем хосте. Надо заметить, что установив эти пункты как указано, я столкнулся с проблемами в собственной сети — как оказалось между некоторыми подсетями маршрутизация была криво настроена (причём сам же знал, что криво, сам же криво и делал — быстрей, быстрей! — а потом всё недосуг было заняться) — соответственно клиентские компы начали терять некоторые сети. Пришлось сделать всё по-уму
net.inet.icmp.drop_redirect=1 — уничтожать icmp-датаграммы переадресации
net.inet.icmp.log_redirect=1 — записывать в журнал событий icmp-датаграммы с указанием переадресации
net.inet.ip.redirect=0 — может ли эта машина посылать дейтаграммы переадресации другим (вот из-за изменения этого пункта у меня сеть и плющщило, но менять его надо, просто надо сразу сетку корректно настраивать)
net.inet6.ip6.redirect=0 — предыдущий пункт, но для IPv6
Пара пунктов отвечающих за работу TCP. Общий смысл такой: ОСь не отвечет на каждый пакет, что он получен или неполучен сразу, а ждёт, пока придёт (или подготовится к отправке) некоторое количество инфы, а потом разом всё это отправляет. Тем самым удаётся разгрузить сеть, т.к. уменьшается общее число пересланных байт (меньше накладных расходов). Очень полезно при интенсивной нагрузке на сеть в одну сторону (HTTP, FTP, & etc). Эти два параметра позволяют установить размер окна приёма и передачи соостветственно. Ограничение по RFC (RFC1323, RFC2018) составляет 64k, но реально можно поставить и больше — тока надо быть уверенным, что и с клиентской стороны подддерживается такое большое окно. Если поставить больше то могут возикнуть проблемы: клиент данные шлёт, а подтверждения не получает, по достижении 64k он думает, что, по неизветстным причинам пропали все пакеты и начинает слать их заново… А Ваш всё ждёт…
)) Дефолтовые значения современных FreeBSD — sendspace=32768 и recvspace=57344. (Насколько я понимаю, у старых было меньше 32k). Пробовал увеличить до 65536 — вроде косяков не заметил…
net.inet.tcp.sendspace=65536 — размер `окна` отправки
net.inet.tcp.recvspace=65536 — размер `окна` приёма
net.link.ether.inet.max_age=1200 — время устаревания записей ARP, в секундах. По истечении этого времени запись удаляется. Тоже помогает против соответствующего типа атаки — когда в таблице ARP создаётся много неверных записей. По дефолту оно 1200 и есть, но возможно, имеет смысл, уменьшить это значение.
net.inet.ip.sourceroute=0 и net.inet.ip.accept_sourceroute=0 — При помощи маршрутизации отправителя (это когда в пакете, ещё и маршрут нарисован, по которому его надо дальше передавать) возможно прощупать вашу внутреннюю сеть снаружи (даже если это частная сеть!). Значения по-умолчанию (0) запрещают такое делать. Так что менять не надо.
net.inet.icmp.bmcastecho=0 — Установка в этого пункта в `0` (а по-умолчанию он так и стоит) зарубает ICMP-сообщения типов 0 и 8 (эхо-запрос и эхо-ответ) на широковещательном адресе.
net.inet.icmp.maskrepl=0 — Также, с помощью icmp можно запросить маску Вашей сети, и узнать её размер (не то, чтобы прям такая ценная инфа, но облегчать работу противника не надо ни в чём.).
По умолчанию этот параметр в `0` — что запрещает такие запросы. Не надо его ставить в `1` ![]()
# net.inet.tcp.msl=15000 — Есть такая феня, как максимальное время жизни сегмента (Maximum Segment Life — MSL) — максимальное время ожидания ASK в ответ на SYN-ACK или FIN-ACK (миллисекунд). По RFC 753 оно 120 секунд. Но это писалось в 1979 году и многое поменялось. В современных FreeBSD оно равно 30 секунд. Имеет смысл поставить его меньше.
net.inet.icmp.icmplim=100 — Для уменьшения урона от атак, при который генерится много ответных пакетов, можно поставить ограничение на количество ICMP тип 3 (адресат недостижим) и TCP RST (перезагрузка соединения). По дефолту оно стоит 200. Можно поставить меньше.
security.bsd.see_other_uids=0 и security.bsd.see_other_gids=0 — Для увеличения безопасности машин, на которые есть шелл у других пользователей, можно сделать так, чтобы каждому пользователю показывались только его процессы, а чужие он невидел. На 4.11 такого пункта нет, в 6.0 есть. Пятую ветку надо проверять. По дефолту значение `1` — все всё видят. Если поставить `0` — то только свои процессы.
security.bsd.conservative_signals=0 — Запрет посылать сигналы, от непривелигированных процессов, процессам которые сменили свой uid/gid.
security.bsd.unprivileged_proc_debug=0 — Непривелигированные процесы могут использовать средства отладки процессов.
security.bsd.unprivileged_read_msgbuf=0 — непривелигированные процессы могут читать буфер сообщений ядра (dmesg).
security.bsd.hardlink_check_uid=0 — непривелигированные процессы не могут делать жёсткие ссылки на файлы других пользователей.
security.bsd.hardlink_check_gid=0 — непривелигированные процессы не могут делать жёсткие ссылки на файлы других групп.
vfs.usermount=0 — возможность непривелигированным пользователям монтировать и отмонтировать устройства (при условии соответсвующих прав на устройство и точку монтирования).
net.inet.tcp.log_in_vain=0 и net.inet.udp.log_in_vain=0 — Логгирование всех попыток подключения к портам которые никто не слушает (в M$-сетях, чревато большим потоком логов… Да и в инете тоже..)
net.inet.tcp.sack.enable=0 — тюнинг сетевой подсистемы — при большой нагрузке на запрсы отвечатеся селективно.