![]() |
Делаем FreeBSD безопасной (Xakep № 69)
Делаем FreeBSD безопасной Сергей Можайский aka techniX Xakep, номер #069, стр. 069-116-1 (technix@frenzy.org.ua) FreeBSD: Top Security Итак, ты решил построить сервер на базе FreeBSD. Хороший выбор. Однако любой сервер является лакомым кусочком для хакера, и даже не стоит сомневаться в том, что рано или поздно он подвергнется атаке. Поэтому в первую очередь стоит заняться не настройкой различных сервисов, а защитой системы от взлома. Конечно, в системе, установленной с настройками по умолчанию, защита находится на достаточном уровне. Однако мы можем сделать наш сервер настоящим крепким орешком. Ну что, начнем строить защиту своей FreeBSD-системы? Консольные твики Как известно, загрузившись в однопользовательском режиме, можно изменить пароль суперпользователя. Нам следует устранить эту досадную недоработку. Отредактируем файл /etc/ttys таким образом, чтобы при загрузке с опцией boot -s система запрашивала пароль Код:
console none unknown off insecureКод:
ttyv0 "/usr/libexec/getty Pc" cons25 on insecureКод:
kern.ps_showallprocs=0Права доступа к файлам - одна из отличительных особенностей UNIX-систем. Давай назначим эти права как следует. На некоторые системные файлы стоит установить такие флаги доступа, чтобы они были доступны только суперпользователю. Вот примерный список: Код:
# chmod 700 /rootФайловую систему с пользовательскими каталогами лучше смонтировать с параметром -nosuid, который игнорирует suid-биты на файлах. Вот пример строчки из /etc/fstab, монтирующий /usr/home с флагом nosuid (nodev здесь также не помешает - прим.ред.): /dev/ad0s1h /usr/home ufs rw,nosuid 2 2 Утилита suidcontrol (www.watson.org/fbsd-hardening/suidcontrol.html) поможет установить правильную политику в отношении suid/sgid-файлов в системе. Чтобы при загрузке удалялось содержимое каталога /tmp, добавляем в /etc/rc.conf строку clear_tmp_enable="YES" Уровни защиты ядра Ядро FreeBSD может работать на нескольких уровнях защиты (securelevel). Значение этого уровня варьируется от -1 до 3. Для нас интересны последние три режима. В режиме 1 (безопасный режим) нельзя снимать модификационные флаги с файлов, а смонтированные дисковые устройства и файлы устройств /dev/mem, /dev/kmem не могут быть открыты для записи. В режиме 2 (режим повышенной безопасности), в дополнение к предыдущему, запрещена прямая запись на диски, независимо от того, смонтированы они или нет. В режиме 3 (режим безопасности сети), кроме ограничений второго режима, запрещено изменение правил файрволов и ограничений скорости канала. Для включения уровней защиты следует добавить в /etc/rc.conf строки Код:
kern_securelevel_enable="YES"$ sysctl kern.securelevel А повысить его без перезагрузки - Код:
# sysctl -w kern.securelevel=2Меняем алгоритм шифрования Заменим алгоритм шифрования паролей с md5 на еще более надежный Blowfish. Делаем исправления в файле /etc/login.conf в секции default: Код:
// заменяем алгоритм шифрования на Blowfishcrypt_default=blf Шифруем файловую систему Файлы, которые могут представлять интерес для взломщиков, надежнее всего зашифровать. Нет, не думай, что я опять буду рассказывать про PGP. Для создания зашифрованных дисков можно обойтись стандартными средствами FreeBSD - GEOM и BDE. Что такое GEOM? Это новая система работы с дисками, появившаяся в 5-й ветке FreeBSD. Благодаря своей модульной структуре, она позволяет делать с файловой системой все что угодно. Нас интересует один из ее модулей - BDE (block device encryption) - поддержка шифрования файловой системы. Для начала добавим в ядро опцию options GEOM_BDE Создадим новый каталог, в котором будут лежать конфиги GBDE: Код:
# mkdir /etc/gbdeКод:
# gbde attach /dev/ad4s1c -l /etc/gbde/ad4s1cКод:
# newfs -U -O2 /dev/ad4s1c.bdeПо окончании работы с зашифрованным разделом размонтируем устройство и отключим шифрованный диск: Код:
# umount /dev/ad4s1c.bdeТеперь займемся защитой от атак, связанных с недостатками протокола TCP/IP. Начнем с фильтрации SYNFIN-пакетов. Это TCP-пакеты с одновременно установленными флагами начала и завершения соединения, пользы от них практически никакой, зато они часто используются при хакерских атаках. Одновременно займемся ICMP-протоколом и включим в ядро еще парочку полезных опций: Код:
// ох уж эти SYNFIN-пакетыОгненная стена Естественно, без фильтрации сетевого трафика нам не обойтись. Встроенный файрвол ipfw позволит нам фильтровать пакеты по заданным критериям и вести учет. Для того чтобы включить файрвол, нужно добавить в ядро вот эти опции: Код:
options IPFIREWALLКод:
// защита только сервера<действие> <протокол> from <откуда> to <куда> <дополнительные условия> В качестве выполняемого действия файрвол может разрешить (allow, pass, accept, permit) прохождение пакета или запретить (deny, drop, reject) его, а также посчитать (count), перенаправить по нужному адресу (fwd, forward) или другой программе (divert). Протоколы могут быть ip или all (для всех протоколов стека TCP/IP), а также tcp, udp, icmp и т.п. Формат поля источника (from) и приемника (to) пакета может быть записан в различных формах: доменное имя, ip-адрес, подсеть в формате IP:MASK (192.168.1.0:255.255.255.0) или IP/LENGTH (192.168.1.0/24), а также в виде специального слова any (любой адрес) или me (все адреса локальной машины). Для tcp и udp протокола после адреса источника или приемника можно через пробел указать еще и порт. И, наконец, из дополнительных условий самыми полезными являются направление пакета (in или out - входящий и исходящий соответственно), интерфейс, через который будет проходить пакет (например, via fxp0), и даже идентификатор пользователя (uid) или группы (gid), для которых это правило будет работать. Теперь не составит труда разобраться, что правило deny tcp from any to 192.168.1.0/24 in via fxp0 запрещает прохождение любых входящих tcp-пакетов через интерфейс fxp0 к сети 192.168.1.0/24, а правило count ip from 192.168.1.0/24 to me uid 1001 будет вести учет трафика, который получит из сети 192.168.1.0/24 пользователь с UID, равным 1001. Каждое правило файрвола должно иметь свой уникальный номер. Правила проверяются в порядке возрастания своих номеров. Для управления файрволом существует команда ipfw. Чтобы добавить правило, воспользуйся командой Код:
# ipfw add <номер> <правило> log_in_vain="YES" Теперь все попытки подключения к закрытым портам твоего сервера будут занесены в логи. Демонов - под контроль Не ко всем службам, запущенным на твоем сервере, стоит давать доступ. Если заблокировать доступ к отдельным портам можно с помощью правильной настройки файрвола, то доступ к службам проще ограничить с помощью файла /etc/hosts.allow. Для примера ограничим доступ по ssh только несколькими сетями: Код:
# vi /etc/hosts.allowТеперь займемся демоном inetd, который играет весьма важную роль в обеспечении безопасности системы. Через него работают telnetd, ftpd, talk и прочие службы. Если никакие из демонов, запускаемых из inetd, тебе не нужны, отключи его. Для этого надо указать в /etc/rc.conf: inetd_enable="NO" Если тебе все же нужен inetd и службы, которые запускаются из него, то стоит включить протоколирование событий и при большой нагрузке увеличить количество одновременных обращений к inetd (по умолчанию это число равно 256). Для этого добавь в /etc/rc.conf строчку inetd_flags="-l -R 1024" Последние штрихи Вот мы и закончили, все изменения в конфигурационные файлы внесены, настройки сделаны. Осталось пересобрать ядро и перезагрузить систему. Посмотрим, чего мы добились. $ netstat -na | grep LISTEN Эта команда покажет нам, на каких портах висят сервисы. Чем их меньше, тем лучше. Также попробуй просканить свою машину nmap'ом. Итак, теперь твоя система намного более защищена, чем раньше. Не забывай регулярно обновлять ее и следить за логами. Удачи! Система безопасности TrustedBSD MAC В FreeBSD 5 появилась новая система безопасности ядра, TrustedBSD MAC Framework. MAC расшифровывается как Mandatory Access Control - принудительный контроль доступа. Система MAC с помощью установки так называемых меток на различные компоненты системы ограничивает доступ к ним на основе созданных администратором политик. Например, с помощью MAC вполне реально создать систему контроля доступа к файловой системе, аналогичной файрволу ipfw, разграничить видимость процессов и многое другое. Если тебя заинтересовала эта тема, обратись к соответствующему разделу FreeBSD HandBook, а также страницам руководства (man 4 mac). DANGER Используй SSH для удаленного управления сервером, иначе никакие рекомендации по безопасности тебе не помогут. Никогда не пользуйся telnet для удаленного доступа. WWW www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/security.html www.freebsd.org/security/security.html www.watson.org/fbsd-hardening/ www.antioffline.com/deviation/bsd.html defcon1.org/html/Security/Secure-Guide/secure-guide.html |
Несомненно полезная статья, советую всем прочитать, мона умных идей набратся Ж)
|
Цитата:
|
ещё делаешь разделы которые не используются для записи только читаемыми и вообще замечательно :))
|
Полезная статья.
Хотя к сожалению автор не проверял вживую то, о чем написал ибо советует использовать две в принципе не совместимые настройки: в разделе "Демонов - под контроль" - автор рекомендует использовать hosts.allow для ограничения доступа к отдельным службам... после чего автор благополучно отключает inetd (без оговорок того, что hosts.allow при выключенном inetd - РАБОТАТЬ НЕ БУДЕТ) В остальном все очень даже ничего. Хотя можно добавить в раздел сетевой защиты: net.inet.udp.blackhole=1 - отбрасывать пакеты для закрытых портов В rc.conf - log_in_vain="YES" - я бы включил только при условии что есть ограничение на размер логг файла - ибо в противном случае - эта строчка создает предпосылку Dos путем переполнения log. (Как возможный вариант решения ядро собираем с options IPFIREWALL_VERBOSE_LIMIT=100) |
Жалко у меня сцуки домен отобрали, я бы вам ссылку на статью по безопасности на фрихи скинул бы, там побольше будет :)
|
Цитата:
Если никакие из демонов, запускаемых из inetd, тебе не нужны, отключи его. |
Цитата:
|
Цитата:
Да есть такая фраза. все правильно. Но логика здесь в другом. Фраза скорее показывает возможности работы inetd "Если никакие из демонов, запускаемых из inetd, тебе не нужны, отключи его" НО никак НЕ связь с работой TCP Wrappers и это факт (если только косвенно - Но это извините понятно только тем, кто на практике делал чтото подобное, но не широкому кругу интересующихся людей. (а статья то в основном для тех кто учится - поправте если ошибаюсь и рассчитана а не только на таких как я - который сможет откритиковать и такого как Вы - который подобное описание сочтет нормальным - извиняйте но такие пошаговые руководства прсто требуют подобных уточнений! ). Еще раз спасибо автору за попытку собрать все воедино. |
Статья неплохая и весьма полезная. Только в ней автор не рассматривает вопросы, связанные с защитой вэб-сервера apache, php, mysql, ftp...
Предлагаю вашему вниманию статью, в которой рассмотрены именно эти вопросы, в числе прочих: Автор: Raven2000. Как и любую другую систему FreeBSD нужно так же защищать от посягательств на нее. Она не так уж защищена, как много людей о ней думают и ее можно так же сломать и крякнуть, как и тот же Windows просто FreeBSD мало распространена и мало есть спецов, которые с ней работают, а тем более которые знают ее в совершенстве, так что чем больше спецов ее ломают тем больше дыр и руткитов будет открыто и использовано. Да и на будущее я не претендую на аса в построение защиты и т.д. т.п. а лишь попробую (для себя, чтобы не забыть :) и друзей) описать некоторые моменты защиты, а остальное будет дополняться по мере просьб и необходимости. Т.к. невозможно охватить все, да и абсолютно защищенный сервер, которого невозможно сломать это как вечный двигатель в теории есть но на практике, увы :). Хотя я знаю такой - это тот, который на глубине 100 метров под землей в фольге и с вырубленным питанием :) Статья будет дополнятся и изменятся по ходу обсуждений. Ну ладно, попробуем немного защитится от спецов :) Защиту разделим по двум видам: I) Защита от внешних атак II) Защита от внутренних атак Атака изнутри – атакующий является легальным \ авторизированным пользователем с этим типом атак бывает сложнее т.к. у пользователя есть не только данные о системе, но и валидный юзер. Внешняя атака – Все, что на передовой. Теперь определим фронт защиты: I) Атака извне: 1.1) Apache - http.conf + mod_security 1.2) PHP - php.ini + mod_security + отключение опасных функций + Ограничения ресурсов 1.3) FTP – Разделение привилегий + chroot + квоты + отдельный HDD 1.4) Firewall – грамотно настроенный фаервол 1.5) Сhroot II) Атака внутри: 2.1) Ограничения ресурсов - /etc/login.conf + /etc/sysctl.conf 2.2) Разделение привилегий - /etc/sysctl.conf + chmod + структура папок 2.3) Логии (logcheck) 2.4) top/ps III) Общие меры 3.1) Разбор fstab 3.2) Доступ к серверу 3.3) DNS – chroot + noroot Теперь пройдем по пунктам (некоторые пункты будут вкратце описаны т.к. обший принцип защиты пересекается с другими пунктами) как и чем можно защитить и ограничить: I) Прикрытие внешних дыр. 1.1) Apache + виртуальные хосты + mod_security Прикроем дырки этого сервиса для начала нам необходимо задать ограничения в конфиге для каждого вхоста. Добавляем следующие параметры: Код:
<IfModule mod_php4.c>по сути посредством хитрого HTTP запроса. Логично предположить, что эти самые запросы неплохо было бы фильтровать. Решение проблемы существует в виде модуля к Апачу, и называется оно mod_security. Ставим: Код:
# cd /usr/ports/www/mod_security/ && make install cleanнапример 001.admin.hosting.ru, над которым мы уже экспериментировали. Все значения надо вводить между тегами <Virtualhost *:80> и </Virtualhost>. Код:
# Включаем mod_securityКод:
#SecFilterScanOutputдобавить, так как большинство настроек – специфичны. Общий принцип составления правил мы рассмотрели, а остальное можно добавить по своему усмотрению. 1.2) PHP В дополнение смотри пункт – 2.1 Рассмотрим самое уязвимое место хостинговой системы – выполняемые файлы, в частности, PHP скрипты. Открываем конфиг PHP: Код:
# ee /usr/local/etc/php.iniКод:
magic_quotes_gpc = Off # Экранирование спецсимволовпользователь может без труда провести успешную атаку, указав в файле .htaccess: Код:
php_flag safe_mode offНастройка Proftpd установите далее по разделение привилегий смотрим -2.1 в котором я указал то что вам нужно, а по Chroot см раздел 1.5 Желательно ftp ставить на отдельный HDD чтобы непроизошло переполнения раздела и все шайтан майфун :) а если у вас он на /etc или /var находился все хана логам и тд :) 1.4) IPFW - штатный файрволл FreeBSD 1.5) Chroot Chroot - песочница это конечно с одной стороны хорошо с другой – потеря производительности, для некоторых программ лишний дополнительный модуль + конфиг к нему. Я считаю грамотный chmod дает тот же результат , но без заморочек и потерь ресурсов. В основном к chroot прибегают, когда нужно обезопасить сервис, который не совсем безопасный как например BIND(о нем ниже). Jail - мы не будем это рассматривать ось внутри оси довольно заморочено и плохо документировано, а если все вхосты придется загонять в jail то мало непокажется. Я пока небуду jail рассматривать :) II) Настраиваем тыл внутренние защитные меры. 2.1) Ограничения ресурсов Бывает так кроме основного действия PHP скрипта функция N зацикливается, попутно вычисляя некое сложное действие. Как результат – высокая загрузка процессора. Это очень типичная ситуация для хостинга. Чтобы предотвратить подобные ненамеренные (и намеренные) атаки, необходимо ограничивать юзера в плане ресурсов. У *BSD для таких целей существует система профилей пользователей. Это значит, что мы можем легко ограничить ресурсы каждого пользователя в отдельности. Открываем /etc/login.conf и добавляем: Код:
# Имя профиляСписок всех параметров и их описание можно найти в Handbook. Теперь перейдем к настройке операционки. Открываем /etc/sysctl.conf и пишем туда следующее: Код:
# Запрещает юзерам видеть процессы соседа&rootЕсть статья Некоторые опции sysctl но она еще не совсем дописана (просьба просить lissyara чтобы доконца перевел ;)). Многие параметры для sysctl можно изменять и динамически: Код:
sysctl <параметр>=<значение>Код:
sysctl kern.maxprocperuid=1000# sysctl kern.maxprocperuid=1000 kern.maxprocperuid: 3546 -> 1000 Теперь необходимо продублировать часть настроек в /etc/rc.conf: Дублируем настройки sysctl Код:
icmp_drop_redirect="YES"2.3) Логи Очень важным аспектом системного администрирования является слежение за сервера. Но ковырять логии самому заморочено тогда для ленивых существует отличная утилита logcheck ее и поставим. Код:
# cd /usr/ports/security/logcheck && make install cleanв /usr/local/etc у вас появятся четыре конфига: переименуй их, убрав из названия файла «sample»: Код:
logcheck.hacking – о каких странностях сообщать;от четвертого :).Просто разработчики скрипта решили разнести сообщения о подозрительной активности и сообщения о явной атаке в разные конфиги. Запускаем скрипт по крону, хотя бы раз в сутки. Дописываем в cron: Код:
0 4 * * * /bin/sh /usr/local/etc/logcheck.shзанимать немало места. И в то же время их надо сохранять. Можно использовать утилиту logrotate Код:
# /usr/ports/sysutils/logrotate && make install cleanIII) Общие меры 3.1) HDD Сделаем в fstab некоторые изменения для предотвращения нехороших действий. Укажем где и что можно и нельзя делать системе. Код:
/dev/ad4s3b none swap sw 0 0либо даже правах на файл chmod 777 (Я знаю что некоторые защищенные сервера ломали именно через /tmp :) в последствии админы советовали прикрывать эту дыру. И незабываем, что в /tmp может писать почти любой сервис в системе) nosuid – при этом значении система игнорирует suid-биты. Юзер не сможет сделать #su и подняться до рута, даже если он знает его пароль рута и находится в группе wheel (но необходимо понять что нужным юзверям которым нужно #su домашняя директория будет /usr, а тем кого нужно ограничит директория будет /usr/home) nodev – запрещаем создание\существование в данном разделе специальных устройств. 3.2) Доступ Доступ к серверу следует ограничить. Т.е. серверы убрать в недоступное простым смертным людям и закрыть на ключ. В дополнение не забываем, снять с них все причиндалы мониторы клавы мышки и т.д. Для чего это должно быть понятно, например если я вижу общедоступный \ физически сервер FreeBSD я тут же по любопытности хочу в него залезть и поковыряться в нем. Но вы скажете, а как же пароль root и т.д. то слушаем дальше, если вы забыли чужой пароль :) а так бывает то делаем так: А) Загружаемся в однопользовательском режиме , для этого в приглашении загрузчика введите boot –s Б) Смонтируйте командой mount –u / корневой раздел в режим чтения-записи. Затем с помощью mount –a примонтируем все что есть (т.е. только что указанно в fstab без опции noauto) B) Теперь меняйте пароль рута. :) Чтобы люди не cмогли зайти без пароля рута в однопользовательском режиме делаем так: Код:
# ee /etc/ttysFreeBSD даже при загрузке в однопользовательском режиме будет запрашивать пароль root. Будьте осторожны при изменении этого значения на insecure. Если вы забудете пароль root, загрузка в однопользовательский режим сильно усложнится. Это все еще возможно, но несколько более сложно. Код:
# name getty type status commentsЗасунем DNS в песочницу Код:
# named –u 53 –t /var/named-t – указывает корневой каталог для демона Незабываем, что корневой каталог недолжен, быть пустым, он должен содержать все файлы необходимые для нормальной работы демона. Если named скомпилирован так чтобы библиотеки компоновались статически и не нужно было думать что ему надо еще в корневую положить чтобы он запустился :) Так же некоторые советуют в конфиге DNS убрать строчку об версии демона дескать оно сможет помочь атакующему и т.д. я не считаю это критически она может подсказкой и самому админу. Литература: 1) Unix руководство системного администратора (3 изд.) 2) Хакер спец 07/68/июль/2006 3) Жизнь :) Статья взята отсюда: _http://www.lissyara.su/?id=1450 |
| Время: 14:50 |