Назад Оглавление Вперед

Часть II Безопасность и оптимизация

В этой части
Общая системная безопасность
Общая системная оптимизация
Конфигурирование и создание оптимизированных, безопасных ядер

Глава 3 Общая системная безопасность (Часть 1)

В этой главе
Общие вопросы безопасности Linux

Обзор

UNIX системы настолько безопасны, насколько безопасными их сделает администратор. Чем больше сервисов у вас установлено, тем больше шансов, что в них будет найдена "дыра". Когда вы инсталлируете Linux, вы должны устанавливать минимум пакетов, а затем добавлять только необходимые элементы, уменьшая шансы установить приложение с ошибкой, нарушающей его безопасность. В этой главе мы обсудим общие принципы обеспечения безопасности сервера. Также здесь мы опишем ряд возможностей, которые можно использовать для предотвращения вторжения как снаружи, так и из внутри.

Безопасность BIOS, установка пароля на загрузку.

Отмените возможность загрузки компьютера с дискеты, установите пароль на доступа к настройкам BIOS. Запрет загрузки с дискет не позволит злоумышленникам загрузить компьютер с дискеты и получить доступ к системе, а установка пароля на доступ к BIOS не позволит включить загрузку с дискеты.

Политика безопасности.

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

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

Выбор правильного пароля.

Исходной точкой вашего тура в безопасность Linux является пароль. Многие люди используют единственный пароль всю жизнь доверяя ему защиту всех своих данных. Вопреки популярной вере, не взламываемых паролей не существует. Любой из них поддается либо социальной разработке, либо грубой силе.

Социальная разработка паролей сервера - наиболее простой и популярный способ получения доступа к бюджетам пользователей и серверам. Часто, какое- либо простое действие наподобие выдачи себя за руководителя или крика о правах человека, приносит очень хорошие результаты, часто давая даже полный доступ к системе.

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

Длина пароля.

Минимально допустимая длина пароля задаваемая по умолчанию в Linux - 5 символов. Это значит, что когда новому пользователю разрешается доступ на сервер, то длина строки представляющей собой пароль должна быть минимум 5 букв, цифр или специальных знаков. Кроме того она должна быть не больше 8 символов. Чтобы нерадивые пользователи не использовали пароли длиной 5 символов можно увеличить его минимальный размер до 8, отредактировав файл "/etc/login.defs".

Редактируйте файл login.defs (vi /etc/login.defs) изменив строку

PASS_MIN_LEN 5
в
PASS_MIN_LEN 8

Этот файл является конфигурационным для программы login. Здесь вы можете изменить и другие параметры, чтобы они соответствовали вашей стратегии защиты (время действия пароля, длина пароля и др.).

Бюджет пользователя root.

Бюджет "root" является самым привилегированным на UNIX системах. На него нельзя наложить никакие ограничения по безопасности. Это значит, что система считает, что вы знаете что делаете и никаких вопросов задавать не будет. Поэтому очень легко, ошибшись в команде, уничтожить важную системную информацию. При использовании этой учетной записи надо быть максимально осторожным. Из соображений безопасности никогда не подключайтесь к системе как пользователь root, если только вы абсолютно не уверены в том, что делаете.

Установка таймаута подключения для root

Часто бывает, что администратор войдя в систему под пользователем root забывает выйти и его сессия остается открытой. Решением этой проблемы может быть переменная "TMOUT" в BASH, которая определяет время, через которое пользователь автоматически отключается от системы, если он не активен. Она содержит время в секундах до отключения.

Редактируйте файл "/etc/profile" и добавьте следующую строку сразу после строки с "HISTFILESIZE=":

TMOUT=7200

Мы определяем значение для TMOUT равное 2 часам (60*60*2). Следует отметить, что если вы добавили эту строку в файл /etc/profile, то переменная определяется для любого подключаемого пользователя, а не только root. Чтобы установить ее для конкретного пользователя измените файл ".bashrc" в его домашнем каталоге.

Файл "/etc/exports".

Если вы экспортируете свои файловые системы с использованием NFS, то необходимо сконфигурировать файл "/etc/exports" с максимально возможными ограничениями. В нем не следует использовать групповые символы (?, *), нельзя позволять доступ для записи пользователю root и следует монтировать "только для чтения" все, что только возможно.

Отредактируйте файл /etc/exports, добавив в него:

/dir/to/export host1.mydomain.com (ro,root_squash)
/dir/to/export host2.mydomain.com (ro,root_squash)

Где dir/to/export - каталог для экспортирования, host1.mydomain.com - имя машины с которой разрешается доступ, <ro> - монтирование "только для чтения", <root_squash> - не позволять пользователю root доступа с правом на запись.

Чтобы изменения вступили в дейтсвие вам необходимо выполнить команду

/usr/sbin/exportfs -a

Замечание. Использование NFS сервера увеличивает риск нарушения безопасности вашей системы. Лучше его не использовать.

Отключение доступа к консольным программам.

Одной из самых простых и необходимых настроек является блокирование консольно-эквивалентного доступа к программам halt и shutdown. Чтобы это сделать выполните:

[root@deep]# rm -f /etc/security/console.apps/servicename

где servicename имя программы к которой вы хотите запретить консольно- эквивалентный доступ. Если вы не используете xdm, будьте внимательны, не удалите файл xserver, иначе никто кроме пользователя root, не сможет запустить X сервер (если вы всегда используете xdm для запуска X сервера, и только пользователь root должен запускать X сервер, то тогда можно подумать об удалении файла xserver).

Пример:

[root@deep]# rm -f /etc/security/console.apps/halt
[root@deep]# rm -f /etc/security/console.apps/poweroff
[root@deep]# rm -f /etc/security/console.apps/reboot
[root@deep]# rm -f /etc/security/console.apps/shutdown
[root@deep]# rm -f /etc/security/console.apps/xserver (если удалите, то только root сможет запустить X).

В результате будет запрещен консольно-эквивалентный доступ к программам halt, shutdown, reboot и poweroff. Программа xserver используется если у вас установлен X Window.

Замечание. Если вы инсталлировали систему как описано в этой книге, то X Window у вас не установлен и файлы описанные выше в каталоге /etc/security не появятся, поэтому вы этот шаг можете пропустить.

Отключение всего консольного доступа.

Чтобы блокировать весь консольный доступ, включая программу и файл доступа, в каталоге /etc/pam.d/, закомментируйте все строки, в которых вызывается pam_console.so. Этот шаг является продолжением предыдущего. Нижеприведенный скрипт сделает это автоматически за вас. Создайте файл disabling.sh (touch disabling.sh) и внесите в него следующие строки:

# !/bin/sh
cd /etc/pam.d
for i in * ; do
sed '/[^#].*pam_console.so/s/^/#/' < $i > foo && mv foo $i
done

И сделайте его испольняемым:

[root@deep]# chmod 700 disabling.sh
[root@deep]# ./disabling.sh

Он будет комментировать все строки ссылающиеся на pam_console.so во всех файлах в каталоге /etc/pam.d. После того, как скрипт выполнит свою работу, удалите его из системы.

Файл "/etc/inetd.conf".

Inetd называется "супер сервером", который запускает другие демоны по запросам из сети. Inetd.conf говорит inetd какие порты слушать и какие сервисы запускать для каждого порта. Как только вы подключаете вашу систему к сети, подумайте какие сервисы вам нужны.

Ненужные сервисы надо отключить, а лучше деинсталлировать, чтобы у вас стало меньше головной боли, а у атакующего меньше шансов найти лазейку в вашу систему. Просмотрите файл /etc/inetd.conf и вы увидите, какие сервисы он предлагает. Закомментируйте строки (# в начале строки) с ненужными сервисами, а затем пошлите процессу inetd сигнал SIGHUP.

Шаг 1.

Измените права доступа к файлу на 600:

[root@deep]# chmod 600 /etc/inetd.conf

Шаг 2.

Удостоверьтесь, что владельцем файла является root

[root@deep]# stat /etc/inetd.conf
File: "/etc/inetd.conf"
Size: 2869 Filetype: Regular File
Mode: (0600/-rw-------) Uid: ( 0/ root) Gid: ( 0/ root)
Device: 8,6 Inode: 18219 Links: 1
Access: Wed Sep 22 16:24:16 1999(00000.00:10:44)
Modify: Mon Sep 20 10:22:44 1999(00002.06:12:16)
Change: Mon Sep 20 10:22:44 1999(00002.06:12:16)

Шаг 3.

Редактируйте файл inetd.conf (vi /etc/inetd.conf) и отключите следующие сервисы: ftp, telnet, shell, login, exec, talk, ntalk, imap, pop-2, pop-3, finger, auth и т.д. пока вы не планируете их использовать. Чем меньше сервисов включено, тем меньше риск для системы.

# Чтобы изменения вошли в силу дайте команду  'killall -HUP inetd'
#
#echo    stream       tcp        nowait      root          internal
#echo    dgram       udp       wait          root           internal
#discard stream      tcp        nowait      root           internal
#discard dgram      udp       wait          root           internal
#daytime stream     tcp       nowait      root           internal
#daytime dgram     udp       wait         root           internal
#chargen stream     tcp        nowait     root           internal
#chargen dgram     udp       wait         root            internal
#time      stream      tcp        nowait     root           internal
#time      dgram      udp       wait         root           internal
#
# Это стандартные сервисы
#
#ftp      stream        tcp        nowait        root        /usr/sbin/tcpd in.ftpd -l -a
#telnet stream        tcp        nowait        root        /usr/sbin/tcpd in.telnetd
#
# Shell, login, exec, comsat и talk являются протоколами BSD.
#
#shell      stream      tcp      nowait       root       /usr/sbin/tcpd in.rshd
#login     stream      tcp      nowait       root       /usr/sbin/tcpd in.rlogind
#exec      stream       tcp       nowait        root       /usr/sbin/tcpd in.rexecd
#comsat dgram        udp       wait           root        /usr/sbin/tcpd in.comsat
#talk      dgram       udp      wait          root        /usr/sbin/tcpd in.talkd
#ntalk    dgram       udp      wait          root        /usr/sbin/tcpd in.ntalkd
#dtalk     stream       tcp        wait           nobody    /usr/sbin/tcpd in.dtalkd
#
# Почтовые Pop и imap сервисы
#
#pop-2    stream      tcp        nowait      root       /usr/sbin/tcpd ipop2d
#pop-3    stream      tcp        nowait      root       /usr/sbin/tcpd ipop3d
#imap      stream     tcp        nowait       root       /usr/sbin/tcpd imapd
#
#  Internet UUCP сервис.
#
#uucp     stream     tcp     nowait       uucp        /usr/sbin/tcpd /usr/lib/uucp/uucico -l
#
# Сервис Tftp предоставляется в первую очередь для удаленной загрузки.
# В большинстве случаев, он используется только на "серверах загрузки"
# Не удаляйте символы комментариев, если вы не уверены, что это вам нужно.
#
#tftp      dgram      udp       wait       root          /usr/sbin/tcpd in.tftpd
#bootps dgram      udp       wait       root          /usr/sbin/tcpd bootpd
#
# Finger, systat и netstat дают информацию внешним пользователям, которая
# может быть использована для взлома системы. На многих серверах
# некоторые или все из них отключены с целью улучшения безопасности.
#
#finger   stream      tcp      nowait      root         /usr/sbin/tcpd in.fingerd
#cfinger  stream       tcp       nowait      root          /usr/sbin/tcpd in.cfingerd
#systat    stream       tcp       nowait      guest        /usr/sbin/tcpd /bin/ps -auwwx
#netstat   stream       tcp       nowait      guest        /usr/sbin/tcpd /bin/netstat -f inet
#
# Аутентификация
#
#auth    stream    tcp    nowait    nobody     /usr/sbin/in.identd in.identd -l -e -o
#
# Конец inetd.conf

Замечание. Не забудьте послать сигнал SIGHUP процессу inetd (killall -HUP inetd) после редактирования файла /etc/inetd.conf.

[root@deep /root]# killall -HUP inetd

Шаг 4.

Для большего улучшения безопасности, вы можете сделать файл "inetd.conf" неизменным, используя команду chattr:

[root@deep]# chattr +i /etc/inetd.conf

Файл с атрибутом "i" не может быть модифицирован, его нельзя удалить или переименовать, к нему нельзя создать ссылки и никакие данные не могут быть дописаны в файл. Только суперпользователь может установить или снять этот атрибут. Если вы захотите модифицировать файл "inetd.conf", то дайте следующую команду:

[root@deep]# chattr -i /etc/inetd.conf

TCP_WRAPPERS.

По умолчанию, Red Hat отвечает на все запросы к имеющимся сервисам. Используя TCP_Wrappers, вы легко сможете оградить ваш сервер от внешних вторжений когда это нужно. Запретите все хосты, добавив "ALL: ALL@ALL, PARANOID" в "/etc/hosts.deny", и определите список тех кому доступ разрешен в файле "/etc/host.allow" - это самая безопасная конфигурация. TCP_Wrappers контролируется двумя файлами. Поиск завершается при первом совпадении.

/etc/hosts.allow
/etc/hosts.deny

Шаг 1.

Редактируйте файл hosts.deny (vi /etc/hosts.deny) добавив следующие строки: По умолчанию доступ запрещен.

# Запрещаем доступ для всех.
ALL: ALL@ALL, PARANOID #Соответствует любому компьютеры, чье имя не соответствует адресу.

Это значит , что доступ ко всем службам со всех компьютеров запрещен, если нет явного разрешения в файле host.allow.

Замечание. Для параметра PARANOID. Если вы хотите запускать telnet и ftp сервисы на сервере, то не забудьте добавить адрес клиентской машины и IP адрес в файл "/etc/hosts" на сервере, иначе будьте готовы ждать несколько минут, пока DNS lookup не завершится по таймауту, до получения строки login.

Шаг 2.

Отредактируйте файл hosts.allow и добавьте в него, к примеру, следующие строки:

# Список серверов которым разрешен доступ.
sshd: 208.164.186.1 gate.openarch.com

Машина с IP адресом 208.164.186.1 и именем gate.openarch.com является одним из клиентов сервиса sshd.

Шаг 4.

Программа tcpdchk занимается проверкой правильности конфигурационного файла TCP_Wrapper. Она выдает сообщения о потенциальных и реальных проблемах.

После того, как конфигурирование завершено, запустите программу tcpdchk:

[root@deep]# tcpdchk

Замечание. Ошибка может выглядеть следующим образом:
warning: /etc/hosts.allow, line 6: can't verify hostname: gethostbyname(win.openna.com) failed
Если вы получили подобное сообщение, то проверьте ваш конфигурационный файл DNS сервера, на наличие в нем этого имени компьютера.

Не позволяйте системе выводить файл issue.

Если вы не хотите, чтобы файл issue выводился на экран, когда удаленный пользователь подключается к серверу, измените опцию telnetd в файле /etc/inetd.conf:

telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd -h

Флаг "-h" говорит демону не выводить любую системную информацию, ограничиться только запросом "login:". Эту возможность необходимо использовать только, когда на сервере запускается демон telnet (вместо него я рекомендую использовать ssh).

Файл "/etc/host.conf".

Linux использует библиотеку resolver для преобразования IP адресов в имена машин. Файл "/etc/host.conf" определяет порядок работы этой библиотеки. Он говорит какой сервис и в каком порядке использовать для преобразования адресов.

Редактируйте файл host.conf (vi /etc/host.conf) и добавьте следующие строки:

# Вначале использовать lookup черз DNS, а затем файл/etc/hosts.
order bind,hosts
# Мы имеем компьютеры с несколькими IP адресами.
multi on
# Осуществлять проверку подмены IP адресов.
nospoof on

Опция order определяет порядок использования сервисов. Для улучшения производительности и повышения безопасности рекомендуется настроить библиотеку определителей так, чтобы вначале использовался DNS, а затем файл "/etc/hosts". Конечно, DNS должен быть предварительно настроен.

Опция multi говорит, что компьютеры, описанные в файле /etc/hosts, могут иметь несколько IP адресов (несколько интерфейсов ethN). Например, шлюз всегда имеет несколько адресов и у них эта опция должна быть всегда определена в ON.

Опция nospoof не разрешать подмену адресов. IP-Spoofing - это способ атаки при котором удаленный компьютер представляется кем-то, кем он не является. При этом виде нападения удаленный компьютер представляется как законный сервер, а затем использует установленные соединения для взаимодействия с другими компонентами сети. Эта опция должна быть установлена в ON на всех типах серверов.

Файл "/etc/securetty".

Файл "/etc/securetty" позволяет вам определить с каких TTY устройств может входить в систему пользователь root. Этот файл читается программой login ("/bin/login"). Он имеет очень простой формат. В каждой строке перечислены имена tty устройств с которых root может входить в систему, а с остальных доступ ему будет запрещен.

Отключите любые tty, которые вам не нужны, закомментировав их (знак # в начале строки).

tty1
#tty2
#tty3
#tty4
#tty5
#tty6
#tty7
#tty8

В результате root сможет входить в систему только с терминала tty1. С остальных терминалов вы сможете переключаться на root используя команду su.


Назад Оглавление Вперед