Настройка защищенной системы FreeBSD

11 Dec 2009 | Автор: anchous |

При использовании того или иного сервиса очень большую роль играет система на которой будет работать наш сервер. И наибольшее значение предварительная настройка этой системы, чтобы минимизировать риски от её использования. Для этого существуют процедуры повышения безопасности системы

В этом разборе полетов я буду осуществлять предварительную настройку системы FreeBSD 7.2. Сама система FreeBSD является одной из наиболее защищенных операционных систем, причем её код, не смотря на открытую идеологию open sourse многократно проверяется и тестируется. Не смотря на то, что с комплекте поставки FreeBSD уже идет с сильной безопасностью, существуют меры по её повышению почти до параноидального режима работы.

Для начала мы ставил чистую систему FreeBSD 7.2 и поднимаем на ней стандартный сервер sshd2, чтобы не сидеть в консоли. После этого приступаем к настройкам:

В системе достаточно иметь только одну директорию для хранения временных файлов, хотя в стандартной упаковке их две /tmp и /var/tmp , поскольку разные пакеты используют разные директории. Поскольку нам достаточно одной, то ограничим их в этом свободном выборе, удалив /var/tmp

# mv /var/tmp/* /tmp/
# rm -rf /var/tmp
# ln -s /tmp /var/tmp

Следом отрубаем возможность входа в консоль под пользователем root, ибо заход под ним дает пользователю сразу же неограниченные права на систему. Поэтому пользователь должен подключаться под собой и только после это забирать права с помощью использования команды su. Для это открываем файл  /etc/ttys и меняем каждую запись “secure” на “insecure”, что запретит пользователю root подключаться к консоли. Это же изменение будет будет требовать пароль пользователя root при рагрузке в однопользовательском режиме системы (single-user mode), что в свою очередь значительно усложнит изменение пароля суперпользователя.

# vi /etc/ttys
#########################################################
console none                            unknown off insecure
#
ttyv0   “/usr/libexec/getty Pc”         cons25  on  insecure
# Virtual terminals
ttyv1   “/usr/libexec/getty Pc”         cons25  on  insecure
ttyv2   “/usr/libexec/getty Pc”         cons25  on  insecure
ttyv3   “/usr/libexec/getty Pc”         cons25  on  insecure
ttyv4   “/usr/libexec/getty Pc”         cons25  on  insecure
ttyv5   “/usr/libexec/getty Pc”         cons25  on  insecure
ttyv6   “/usr/libexec/getty Pc”         cons25  on  insecure
ttyv7   “/usr/libexec/getty Pc”         cons25  on  insecure
ttyv8   “/usr/X11R6/bin/xdm -nodaemon”  xterm   off insecure
# Serial terminals
# The ‘dialup’ keyword identifies dialin lines to login, fingerd etc.
ttyd0   “/usr/libexec/getty std.9600″   dialup  off insecure
ttyd1   “/usr/libexec/getty std.9600″   dialup  off insecure
ttyd2   “/usr/libexec/getty std.9600″   dialup  off insecure
ttyd3   “/usr/libexec/getty std.9600″   dialup  off insecure
# Dumb console
dcons   “/usr/libexec/getty std.9600″   vt100   off insecure
#########################################################

Закручиваем безопасность для ssh сервера. Как его вывести на совсем параноидальный режим, буду разбирать позднее. Пока же ограничиваем пользователей имеющих право на вход в консоль, запрещаем вход с пустым паролем и вход пользователю root. Также ограничиваем время отводимое на подключение к серверу и количество попыток.  Включаем вторую версию SSHv2 вместо идущей по умолчанию первой, т.к. она обеспечивает более высокую безопасность соединения. Поскольку использовать X11 на рабочем сервере мы не планируем то отключим опцию форвардинга.

# vi /etc/ssh/sshd_config
#########################################################
Protocol 2
SyslogFacility AUTH
LogLevel INFO
LoginGraceTime 15s
PermitRootLogin no
AllowUsers anchous
StrictModes yes
MaxAuthTries 3
PermitEmptyPasswords no
PrintLastLog yes
UsePrivilegeSeparation yes
UseDNS yes
X11Forwarding no
#########################################################

Теперь переходим к политикам хранения паролей. По умолчанию FreeBSD использует алгоритм md5 для хэширования паролей. Это стойкий и надежный 128-битный алгоритм, но некоторое время назад были найдены слабости в его реализации, поэтому рекомендуется использовать алгоритм blowfish для хранения паролей. Для перевода системы хранения паролей в этот алгоритм, нам следует изменить несколько файлов. парои кстати не будут автоматически сконвертированы в blowfish, и будут храниться в md5 до следующего изменения.

# echo “crypt_default=blf” >> /etc/auth.conf

После этого необходимо задать в файле /etc/login.conf параметр хранения паролей по умолчанию в класс blf.  Также меняем политику применяемых паролей: минимальная длинна, использование верхнего и нижнего регистра, время действия пароля в три месяца и отключения пользователя после 10 минут бездействия.  Также меняем маску прав доступа по умолчанию umask для того чтобы предотвратить доступ пользователей для всех. Маска пробразуется в формат chmod, и все новые созданные файлы и папки будут иметь права доступа 0750, т.е. у “остальных” пользователей не будет никаких прав на данные файлы.

# vi /etc/login.conf
#########################################################
default:\
:passwd_format=blf:\
:copyright=/etc/COPYRIGHT:\
:welcome=/etc/motd:\
:setenv=MAIL=/var/mail/$,BLOCKSIZE=K,FTP_PASSIVE_MODE=YES:\
:path=/sbin /bin /usr/sbin /usr/bin /usr/games /usr/local/sbin /usr/local/bin /usr/X11R6/bin ~/bin:\
:nologin=/var/run/nologin:\
:cputime=unlimited:\
:datasize=unlimited:\
:stacksize=unlimited:\
:memorylocked=unlimited:\
:memoryuse=unlimited:\
:filesize=unlimited:\
:coredumpsize=unlimited:\
:openfiles=unlimited:\
:maxproc=unlimited:\
:sbsize=unlimited:\
:vmemoryuse=unlimited:\
:priority=0:\
:ignoretime@:\
:minpasswordlen=8:\
:mixpasswordcase=true:\
:passwordtime=90d:\
:accounted=true:\
:autodelete=90d:\
:warnpassword=14d:\
:idletime=10:\
:umask=027:

#########################################################

Обновляем базу логинов:

# /usr/bin/cap_mkdb /etc/login.conf

После смены пароля пользователя в файле их хранения in /etc/master.passwd  записи паролей будут начинаться с $2a. Это будет свидетельствовать о том, что для данного пользователя включилось хеширование blowfish.

Теперь переназначаем правда доступа для пользователей к планировщику задач. Планировщик задач является удобным и в тоже время чрезвычайно мощным средством администрирования *nix платформ. Его неправомочное и неправильное использование может привести сервер в неработоспособное состояние. Это может быть неправильно составленые задания, так и злонамеренное зацикливание выполнения задания, способное привести машину к отказу в обслуживании.

Назначаем права на планирование задач только для пользователя root

# echo “root” > /var/cron/allow
# echo “root” > /var/at/at.allow
# chmod o= /etc/crontab
# chmod o= /usr/bin/crontab
# chmod o= /usr/bin/at
# chmod o= /usr/bin/atq
# chmod o= /usr/bin/atrm
# chmod o= /usr/bin/batch

Также ограничим доступ на чтение и запуск некоторых файлов, к которым у обычных пользователей нет необходимости в доступе:

# chmod o= /etc/fstab
# chmod o= /etc/ftpusers
# chmod o= /etc/group
# chmod o= /etc/hosts
# chmod o= /etc/hosts.allow
# chmod o= /etc/hosts.equiv
# chmod o= /etc/hosts.lpd
# chmod o= /etc/inetd.conf
# chmod o= /etc/login.access
# chmod o= /etc/login.conf
# chmod o= /etc/newsyslog.conf
# chmod o= /etc/rc.conf
# chmod o= /etc/ssh/sshd_config
# chmod o= /etc/sysctl.conf
# chmod o= /etc/syslog.conf
# chmod o= /etc/ttys

Также ограничиваем доступ к директориям содержащим лог файлы, поскольку потенциальный взломщик после своего пребывания всегда устраняет все следы оставленные в системе, путем чистки логов. Поэтому отключаем доступ к логам, для обычных пользователей.
*** Эта процедура повлияет на ротацию логов, которая станет недоступна.

# chmod o= /var/log
# chflags sappnd /var/log
# chflags sappnd /var/log/*

Отключаем пользователям возможность использования части программ, в которых нет необходимости, по их юзверьским делам.

# chmod o= /usr/bin/users
# chmod o= /usr/bin/w
# chmod o= /usr/bin/who
# chmod o= /usr/bin/lastcomm
# сhmod o= /usr/sbin/jls
# chmod o= /usr/bin/last
# chmod o= /usr/sbin/lastlogin

Также надо заблокировать несколько сервисов:

# chmod ugo= /usr/bin/rlogin
# chmod ugo= /usr/bin/rsh

а также ограничить доступ к продуманным и полезным, для системного администратора конечно, утилитам, которые скорее всего будут установлены на машину:

# chmod o= /usr/local/bin/nmap
# chmod o= /usr/local/bin/nessus

В правами вроде бы закончили, теперь перейдем к горячо любимому файлу /etc/rc.conf в котором мы прикроем некоторые сервисы запущенные в системе по умолчанию, но нам ненужные.
Отключаем MTA, которым по умолчанию является sendmail. Если этот сервис необходим, то имеет смысл использоваться exim или qmail

# echo ‘sendmail_enable=”NONE”‘ >> /etc/rc.conf

###############################
***Примечание от 13.012010
По данному синтаксису может возникнуть спор, аналогичный тому что возник у меня с Алексеем ака tess, т.к. по разным версиям фришного мануала sendmail отрубается разным синтаксисом:  по самому man sendmail v.8 рекомендуется использовать приведенный выше, по руководству к самой операционке FreeBSD рекомендуется использовать следующий синтаксис, добавленный в /etc/rc.conf (его же следует использовать если вы хотите чтобы отключить демона работающего на прием почты, а например логи вам высылались ежедневно на почту):

sendmail_enable=”NO”
sendmail_submit_enable=”NO”
sendmail_outbound_enable=”NO”
sendmail_msp_queue_enable=”NO”
###############################

По умолчанию уровень безопасности системы (kernel level) равен -1, т.е. мало защищенный. Если предполагается использовать защищенный уровень, то рекомендуется использовать 2, или даже 3 – как наиболее защищенный.

# echo ‘kern_securelevel_enable=”YES”‘ >> /etc/rc.conf
# echo ‘kern_securelevel=”2″‘ >> /etc/rc.conf

Если не планируется на сервере использовать систему NFS, то отключаем его и демона portmap:

# nfs_server_enable=”NO” >> /etc/rc.conf
# nfs_client_enable=”NO” >> /etc/rc.conf
# echo ‘portmap_enable=”NO”‘ >> /etc/rc.conf

Запрещаем inetd, демон отвечающий за сетевые сервисы (network daemon dispatcher), в виду того что его использование несет много уязвимостей

# echo ‘inetd_enable=”NO”‘ >> /etc/rc.conf

На уровне старта системы чистим директроию временных файлов /tmp , чтобы быть уверенным что весь мусор который может там находиться никаким образом не повлияет на работу нашей системы

# echo ‘clear_tmp_enable=”YES”‘ >> /etc/rc.conf

Если не пишем логи на удаленную машину, то задаем демону syslogd не занимать сетевые сокеты

# echo ‘syslogd_flags=”-ss”‘ >> /etc/rc.conf

Cообщения ICMP redirect могут быть использованы для атаки, поэтому игнорируем и логируем их

# echo ‘icmp_drop_redirect=”YES”‘ >> /etc/rc.conf
# echo ‘icmp_log_redirect=”YES”‘ >> /etc/rc.conf

Регистрируем все попытки подключения на закрытые порты, с тем чтобы понимать о том, кто и зачем пытается подключиться на неработающие порты.

# echo ‘log_in_vain=”YES”‘ >> /etc/rc.conf

Чтобы при входе в консоль не выводилась версия OS и координаты ядар, запрещаем обновление файла с сообщением дня (Message of Day)

# echo ‘update_motd=”NO”‘ >> /etc/rc.conf

Задаем несколько параметров ядра путем редактирования файла /etc/sysctl.conf . Для начала запрещаем обычным пользователям просмотр процессов запущенных с иным UID

# echo “security.bsd.see_other_uids=0″ >> /etc/sysctl.conf

Включаем систему поддержки так называемых “черных дыр”, что является предотвращением отправки отклика RST пакета, на запрос пришедший на закрытый порт.

# echo “net.inet.tcp.blackhole=2″ >> /etc/sysctl.conf
# echo “net.inet.udp.blackhole=1″ >> /etc/sysctl.conf

Генерируем произвольный ID для IP пакета для того чтобы исключить возможность fingerprint и затруднить возможность злоумышленника систематизировать пакеты.

# echo “net.inet.ip.random_id=1″ >> /etc/sysctl.conf
# echo “net.inet.icmp.maskrepl=0″ >> /etc/sysctl.conf

Следующая опция ядра подойдет для рутеров, фаерволов и шлюзов: конфигурируем систему отбрасывать SYN/FIN пакеты, при желании её можно включать и на обычных срверах, но это чревато падением производительности.

# echo ‘tcp_drop_synfin=”YES”‘ >> /etc/rc.conf

Вносим небольшие правки в ядро, которое придется пересобрать. Первой мы иключаем возможность перезагрузки от ctrl+alt+del, второй устанавливаем генерацию ID для сетевых пакетов (вариант с sysctl.conf работает только на системах от 5.3, на всех предыдущих необходимо перебирать ядро). Также включаем сброс SYN/FIN и режим stealth forwarding, который позволяет переправлять пакеты через хост без изменения из TTL, т.е. эта функция подойдет например для сокрытия фаервола от команды tracerote

# vi /usr/srs/sys/i386/conf/Custom_KERNEL

#########################################################
options SC_DISABLE_REBOOT # Disable Ctrl+Alt+Del
options RANDOM_IP_ID             # Enables random IP ID generation
options TCP_DROP_SYNFIN     # Enables the ability to drop SYN/FIN packets
options IPSTEALTH                     # Enable stealth forwarding
#########################################################

После чего перестраиваем ядро и перегружаем машину. Теперь у нас есть сервер, на котором максимально поднята безопасность и он готов к тому чтобы настраивать на нем необходимые нам сервисы.

VN:F [1.9.21_1169]
Rating: 10.0/10 (5 votes cast)
VN:F [1.9.21_1169]
Rating: +3 (from 3 votes)
Настройка защищенной системы FreeBSD, 10.0 out of 10 based on 5 ratings

Теги: , , ,

  1. 2 Trackback(s)

  2. 30 Dec 2009: Установка сервера БД MySQL | Одминский блог
  3. 02 Aug 2011: Настройка фаервола на базе FreeBSD | Одминский блог

Ваш отзыв