Изучаем sysctl и повышаем безопасность, производительность

В этой заметке расскажу, как с помощью некоторых переменных sysct увеличить безопасность вашего сервера. Всё описанное ниже, относиться только к FreeBSD. Переменные можно менять прямо с консоли так:

#sysctl ПЕРЕМЕННАЯ=ЗНАЧЕНИЕ

Что бы посмотреть текущее значение переменной:

#sysclt ПЕРЕМЕННАЯ

Кстати, посмотреть переменные можно и не обладая правами root’a.

Для того, что после ребута вам не пришлось их заново прописывать, существует файл, куда это дело можно прописать. Теперь при каждой загрузке переменные будут считываться из этого файла и применяться автоматически. Имя этого файла /etc/sysctl.conf. И так, приступим. Здесь буду описывать только сами переменные и их значения.

security.bsd.see_other_uids=0 : запрещаем пользователям просматривать чужие процессы (будут видны только свои)
security.bsd.see_other_gids=0 : тоже самое, только группам
net.inet.tcp.blackhole=2 : пускаем запросы на закрытые порты в “чёрные дыры”, то есть просто напросто убиваем, без всяких оповещений. Очень помогает при сканнировании портов. Это для протокола tcp.
net.inet.udp.blackhole=1 : тоже самое, но только для udp
security.bsd.hardlink_check_uid=1 : пользователи могут делать hardlink только на свои файлы
security.bsd.hardlink_check_gid=1 : тоже самое, но только для групп.
net.link.ether.ipfw=1 : ipfw2 позволяет фильтровать по MAC адресам
net.inet.icmp.drop_redirect=1 : ICMP REDIRECT пакеты игнорируются
net.inet.icmp.bmcastecho=0 : для защиты от SMURF атак (ICMP echo request на broadcast адрес)
net.inet.icmp.maskrepl=0 : запрет широковещательного запроса временного штампа
kern.ipc.somaxconn=32768 : защита от synflood атак (увеличиваем количество полуоткрытых сокетов)
net.inet.tcp.sendspace=64395 : размера TCP окна (Увеличенный размер окна позволит более эффективно передавать данные)
net.inet.tcp.recvspace=64395 : размера TCP окна (Увеличенный размер окна позволит более эффективно передавать данные)
net.link.ether.inet.max_age=1200 : для защиты от подмены Arp-записей
net.inet.ip.sourceroute=0: защита для локальных IP
net.inet.ip.accept_sourceroute=0 : защита для локальных IP
net.inet.tcp.drop_synfin=1 : небольшая защита
net.inet.tcp.syncookies=1 : от доса
net.inet.icmp.log_redirect=1
net.inet.tcp.maxtcptw=32768
net.inet.ip.redirect=0
net.inet6.ip6.redirect=0
net.inet.ip.ttl=128 : Определяем TTL в заголовке IP-пакета
net.inet.tcp.rfc1323=1 : Указываем ОС изменять параметры window и timestamps в соответствии с RFC 1323.
net.inet.tcp.msl=15000
net.inet.icmp.icmplim=50
net.inet.tcp.log_in_vain=1
net.inet.udp.log_in_vain=1
net.link.ether.inet.log_arp_movements=1
net.inet.tcp.icmp_may_rst=0
security.bsd.conservative_signals=1
security.bsd.unprivileged_proc_debug=0
security.bsd.unprivileged_read_msgbuf=0
security.bsd.unprivileged_get_quota=0
vfs.usermount=0
kern.ps_showallprocs=0
net.inet.tcp.sack.enable=0
kern.ps_showallprocs=0: Разрешаем смотреть список всех процессов только root
kern.maxfiles=204800
kern.maxfilesperproc=200000
kern.ipc.maxsockets=204800
kern.randompid=1: Новому процессу случайный pid
net.inet.ip.random_id: Генерируем случайный ID в пакете заголовка
kern.elf32.aslr.enable=1: включаем ASLR для 32-битной архитектуры
kern.elf64.aslr.enable=1: включаем ASLR для 64-битной архитектуры

Для router’a

kern.ipc.maxsockbuf=2097152
kern.ipc.somaxconn=16192
kern.ipc.nmbjumbo9=100000
kern.ipc.nmbjumbo16=32000
kern.maxfiles=65536
kern.maxfilesperproc=32768
kern.random.sys.harvest.ethernet=0
kern.random.sys.harvest.interrupt=0
kern.random.sys.harvest.point_to_point=0
net.inet.ip.redirect=0
net.inet.tcp.delayed_ack=0
net.inet.tcp.sendspace=65536
net.inet.tcp.recvspace=65536
net.inet.udp.recvspace=65536
net.inet.udp.maxdgram=57344
net.local.stream.sendspace=65536
net.local.stream.recvspace=65536
hw.intr_storm_threshold=9000
net.inet.ip.intr_queue_maxlen=4096

2 коментарі до “Изучаем sysctl и повышаем безопасность, производительность

  1. rsp

    Добрый день! Как избавиться от CLOSE_WAIT сокетов?
    Краткая предыстория: есть сервера для видеоконтента, который отдается с помощью inetd. Установлено два сервера для резервирования, используются сразу оба, для распределения нагрузки.
    При выходе из строя одного, роутингом переводится нагрузка на другой. И здесь начинает нагрузка на CPU и создаваться большое количество TCP-сессий со статусом CLOSE_WAIT. Пока склоняюсь к тому, что у клиентского оборудования, после пропадания связи отправляется FIN-пакет, который на сервере генерит CLOSE_WAIT сессию. Как ограничить в sysctl создание этих CLOSE_WAIT сессий? Склоняюсь к net.inet.tcp.drop_synfin=1

    1. skeletor Автор запису

      Никак. Это нормальное состояние при закрытии соединения. Не совсем так, но нужно смотреть в сторону того, кто генерит много CLOSE_WAIT

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *