Некоторые опции 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 - тюнинг сетевой подсистемы - при большой нагрузке на запрсы отвечатеся селективно.

    ======================
       Статья недописана, но по просьбам трудящихся опубликована. Убедительная просьба, до применения чего-либо описанного прочитать примечание к переменной, подумать над дефолтовым значением, и уже после этого что-то менять. Примерно так:

sysctl -a kern.maxprocperuid
kern.maxprocperuid: 3680
sysctl -d kern.maxprocperuid
kern.maxprocperuid: Maximum processes allowed per userid
sysctl kern.maxprocperuid=10000
kern.maxprocperuid: 3680 -> 10000

стастья взята отсюда

Leave a Reply