Настройки безопасности FreeBSD. Часть 2

В этой части будут описаны:

  • 1. Атаки извне
    • 1.1. Apache — http.conf + mod_security
    • 1.2. PHP — php.ini + отключение опасных функций
  • 2. Атаки изнутри
    • 2.1. Ограничения ресурсов — /etc/login.conf + /etc/sysctl.conf
    • 2.2. Логи (logcheck)


Теперь пройдем по пунктам.

1. Прикрытие внешних дыр.

1.1. Apache + виртуальные хосты + mod_security
Прикроем дырки этого сервиса, для начала нам необходимо задать ограничения в конфиге для каждого вхоста. Добавляем следующие параметры:

# Включаем Safe mode
php_admin_flag safe_mode on
php_admin_flag safe_mode_gid on
php_admin_value open_basedir /home/domain.ru
# Папка, выше которой скрипт не может видеть
php_admin_value safe_mode_exec_dir /home/domain.ru
# Temp диры юзера
php_admin_value upload_tmp_dir /home/domain.ru/tmp
# Не начинать PHP сессию автоматически
php_admin_flag session.auto_start off
# Где сохранять файлы сессий
php_admin_value session.save_path /home/domain.ru/tmp

Как известно, немалая часть взломов (SQL Injection, XSS атаки, инклюдинг) происходит по сути посредством хитрого HTTP запроса. Логично предположить, что эти самые запросы неплохо было бы фильтровать. Решение проблемы существует в виде модуля к Апачу, и называется оно mod_security. Но целесообразно ставить этот мод на сервера с достаточным объёмом оперативки (у меня например потребление памяти апачем возросло на 20-25%, что для слабых VDS слишком много).
Ставим:

$ cd /usr/ports/www/mod_security/
$ make install clean

После установки – идем конфигурировать. Открываем конфиг апача httpd.conf и добавляем:

Include /usr/local/etc/apache22/Includes/mod_security2.conf

Путь конечно надо заменить на свой.
В сам файл mod_security2.conf лучше посе Include добавить строку, чтобы в лог писались только ошибки сервера, а не все подряд (особенно 404, тогда лог будет быстро расти):

SecAuditLogRelevantStatus "^5"

По умолчнию логи данного модуля будут в /var/log/httpd-modsec2_audit.log

1.2. PHP
В дополнение смотри пункт – 2.1
Рассмотрим самое уязвимое место хостинговой системы – выполняемые файлы, в частности, PHP скрипты. Открываем конфиг PHP /usr/local/etc/php.ini
Меняем следующие параметры:

magic_quotes_gpc = on			    # Экранирование спецсимволов
disable_functions = system, exec, passthru
# Выключаем опасные функции:
# Выключить эти функции очень важно. Хоть они и недоступны при включенном safe mode,
# пользователь может без труда провести успешную атаку, указав в файле .htaccess:
# php_flag safe_mode off

2. Внутренние защитные меры

2.1. Ограничения ресурсов
Бывает, что кроме основного действия PHP скрипта функция N зацикливается, попутно вычисляя некое сложное действие. Как результат – высокая загрузка процессора.
Это очень типичная ситуация для хостинга. Чтобы предотвратить подобные ненамеренные (и намеренные) атаки, необходимо ограничивать юзера в плане ресурсов. У *BSD для таких целей существует система профилей пользователей. Это значит, что мы можем легко ограничить ресурсы каждого пользователя в отдельности.
Открываем /etc/login.conf и добавляем в категорию для нужного юзера:

# Мах время использования процессора
:cputime=1h30m: \
# Мах кол-во памяти, выделяемой программе под данные
# Сам код программы и стэк не учитываются
:datasize=10M: \
# Сколько выделяем для стека программы
:stacksize=3M: \
# Мах размер физической памяти, выделяемой процессу
:memoryuse=16M: \
# Мах размер файла
:filesize=50M: \
# Мах размер core файлов
:coredumpsize=1M: \
# Сколько файлов может открывать каждый процесс
:openfiles=128: \
# Сколько процессов может запускать пользователь
:maxproc=64: \
# Пускать юзера в систему только если его домашняя дира существует и доступна юзеру
:requirehome:true \
# Остальное берем из профиля default
:tc=default:

Здесь указаны лишь основные параметры.
Теперь перейдем к настройке операционки (на VDS с jail скорее всего доступ к sysctl запрещён, поэтому эта инфа больше для дедиков и KVM VDS). Открываем /etc/sysctl.conf и пишем туда следующее:

# Запрещает юзерам видеть процессы соседа и root
security.bsd.see_other_uids=0
# Запрещает видеть групповые процессы
security.bsd.see_other_gids=0
# Пускаем запросы на закрытые порты в черные дыры
net.inet.tcp.blackhole=2
net.inet.udp.blackhole=1
# Указываем размер очереди сокета
kern.ipc.somaxconn=1024
# Отрубаем ip-редиректы
net.inet.icmp.drop_redirect=1
net.inet.icmp.log_redirect=1
net.inet.ip.redirect=0

# Назначаем размеры буфера для TCP-подключений. Если на сервер ожидается большая
# нагрузка, и у него много памяти – лучше поставить 65535. Значение выше 65535
# не рекомендуется.
net.inet.tcp.sendspace=32768
net.inet.tcp.recvspace=32768
# Обновляем ARP-таблицу каждые 20 минут
net.link.ether.inet.max_age=1200
# Запрещаем отвечать на все лишние запросы.
net.inet.icmp.maskrepl=0
net.inet.ip.sourceroute=0
net.inet.ip.accept_sourceroute=0
net.inet.icmp.bmcastecho=0

Здесь указаны не все параметры sysctl остальные смотрим MAN SYSCTL(8).
Многие параметры для sysctl можно изменять и динамически:

sysctl <параметр>=<значение>

Например:

sysctl kern.maxprocperuid=1000

Должно быть похоже на

$ sysctl kern.maxprocperuid=1000
kern.maxprocperuid: 3546 -> 1000

Теперь необходимо продублировать часть настроек в /etc/rc.conf:

icmp_drop_redirect="YES"
icmp_log_redirect="YES"
icmp_bmcastecho="NO"
tcp_drop_synfin="YES"

2.2. Логи
Очень важным аспектом системного администрирования является слежение за логами сервера. Но ковырять логии самому заморочено, для ленивых существует отличная утилита logcheck. Её и поставим.

$ cd /usr/ports/security/logcheck
$ make install clean

Утилита написана на sh скриптах, и занимает всего 29 Кб в архиве. После установки в /usr/local/etc/logcheck/ редактируем logcheck.conf:

SENDMAILTO="VASHA@POCHTA.ru"

При выполнении скриптов подозрительная активность будет отрапортована на указанный ящик. Запускаем скрипт по крону, хотя бы раз в сутки. Проверить, добавился ли скрипт автоматом можно командой:

crontab -u logcheck -l

Если там пусто, то добавляем вручную:

crontab -u logcheck /usr/local/share/examples/logcheck/crontab.in

Путь к файлу crontab.in может быть другим, обычно он отображается при инсталяции.
При появлении ошибки «Could not run logtail or save output» нужно установить на файлы, указанные в /usr/local/etc/logcheck/logcheck.logfiles, права 0644.

При большой активности хостящихся сайтов, логи веб-сервера начнут занимать немало места. И в то же время их надо сохранять. Можно использовать утилиту logrotate

$ /usr/ports/sysutils/logrotate
$ make install clean

Оставить комментарий

Оповещать о новых комментариях по RSS