Часть II Безопасность и оптимизация
В этой части
Общая системная безопасность
Общая системная оптимизация
Конфигурирование и создание оптимизированных, безопасных ядер
Глава 3 Общая системная безопасность (Часть 1)
Обзор Безопасность BIOS, установка пароля на
загрузку Политика безопасности Выбор правильного пароля Длина пароля Бюджет пользователя root Установка таймаута подключения для root Файл “/etc/exports” Отключение доступа к консольным
программам Отключение всего консольного
доступа Файл “/etc/inetd.conf” TCP_WRAPPERS Не позволяйте системе выводить файл
issue Файл “/etc/host.conf” Файл “/etc/securetty” Специальные пользователи Блокирование выполнения команды su root от других
пользователей Ограничение
ресурсов Больший контроль над
монтируемыми файловыми системами Перемещение программы RPM и изменение прав доступа
к ней Настройка shell Файл “/etc/lilo.conf”. Запрещение перезагрузки системы по комбинации
клавиш Control-Alt-Delete Физические
твердые копии всех важных файлов регистрации Файл “/etc/rc.d/rc.local” Биты программ подчиненных пользователю
root Параметры настраиваемые в
ядре Предохранение вашей системы от
ответов на ping запросы Предохранение
вашей системы от ответов на широковещательные запросы Протоколы маршрутизации Включение защиты от TCP SYN Cookie Запрещение приема ICMP redirect пакетов Включение always-defragging защиты Включение защиты от неправильных сообщениях об
ошибках Включение защиты от IP
spoofing Фиксирование пакетов с
поддельными адресами (spoof), пакетов с маршрутизацией от источника, Redirect
пакетов Странные или скрытые
файлы Поиск всех файлов с включенными
битами SUID/SGID Поиск программ и
каталогов, в которые разрешена запись для группы и всех остальных
пользователей Файлы не имеющие
владельцев Поиск “.rhosts”
файлов Система была взломана
UNIX системы настолько безопасны, насколько безопасными их сделает
администратор. Чем больше сервисов у вас установлено, тем больше шансов,
что в них будет найдена “дыра”. Когда вы инсталлируете Linux, вы должны
устанавливать минимум пакетов, а затем добавлять только необходимые
элементы, уменьшая шансы установить приложение с ошибкой, нарушающей
его безопасность. В этой главе мы обсудим общие принципы обеспечения
безопасности сервера. Также здесь мы опишем ряд возможностей, которые
можно использовать для предотвращения вторжения как снаружи, так и из
внутри.
Отмените возможность загрузки компьютера с дискеты, установите пароль на
доступа к настройкам BIOS. Запрет загрузки с дискет не позволит
злоумышленникам загрузить компьютер с дискеты и получить доступ к
системе, а установка пароля на доступ к BIOS не позволит включить загрузку с
дискеты.
Вы не сможете правильно реализовать безопасность системы пока не выясните,
что вы хотите защищать и от кого. Для того, чтобы принимать решения
относящиеся к защите вам нужно выработать политику безопасности, список
того, что вы хотите разрешить и что хотите запретить. Политика также должна
определять ваши ответные действия на нарушения безопасности. Приведенные
ниже вопросы должны помочь вам в выработке стратегии:
- Как вы определяете конфиденциальную и важную информацию?
- Нужен ли удаленным пользователям доступ к вашей системе?
- Находится ли на сервере конфиденциальная или важная информация?
- Обеспечивают ли пароли или шифрование достаточную защиту?
- Нужен ли вам доступ в Интернет?
- Как много доступа вы хотите разрешить из Интернета?
- Какие действия нужно предпринять в случае нарушения защиты?
Этот список короткий и вы при выработке стратегии можете охватить более
широкий круг вопросов. Любая политика безопасности базируется на
некотором уровне паранойи; решите насколько вы доверяете людям, как внутри
организации, так и с наружи. Стратегия должна балансировать между
разрешением пользователям доступа к необходимой им информации и
запрещением доступа к определенным видам данных. Точка, где эти линии
пересекаются и определит вашу стратегию.
Исходной точкой вашего тура в безопасность Linux является пароль. Многие
люди используют единственный пароль всю жизнь доверяя ему защиту всех
своих данных. Вопреки популярной вере, не взламываемых паролей не
существует. Любой из них поддается либо социальной разработке, либо грубой
силе.
Социальная разработка паролей сервера – наиболее простой и популярный
способ получения доступа к бюджетам пользователей и серверам. Часто, какое-
либо простое действие наподобие выдачи себя за руководителя или крика о
правах человека, приносит очень хорошие результаты, часто давая даже полный
доступ к системе.
Неплохой идеей будет еженедельно проверять файл с паролями с помощью
программы-взломщика. Это поможет найти пароли, которые легко подбираются
и которые необходимо срочно заменить. Также механизм проверки должен
работать и в момент определения паролей, чтобы отклонить заведомо слабый
пароль при его начальной задании или переопределении. Строки символов,
которые представляют собой простые слова, или находятся в одном регистре,
или не содержат цифр и специальных знаков, должны быть отклонены.
Я рекомендую использовать следующие правила для создания эффективных
паролей:
- пароль должен иметь не менее шести символов в длину и содержать не
менее 1 цифры или специального знака;
- он не должен быть банальным; банальный пароль обычно базируется на
имени пользователя, фамилии, месте жительства и ряде других
персональных данных;
- он должен иметь ограниченный период действия, требуйте замены пароля
через определенный промежуток времени;
- он должен отменяться и сбрасываться после заданного числа в подряд
неправильных попыток ввода;
Минимально допустимая длина пароля задаваемая по умолчанию в 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” является самым привилегированным на UNIX системах. На него
нельзя наложить никакие ограничения по безопасности. Это значит, что система
считает, что вы знаете что делаете и никаких вопросов задавать не будет.
Поэтому очень легко, ошибшись в команде, уничтожить важную системную
информацию. При использовании этой учетной записи надо быть максимально
осторожным. Из соображений безопасности никогда не подключайтесь к
системе как пользователь root, если только вы абсолютно не уверены в том, что
делаете.
Часто бывает, что администратор войдя в систему под пользователем root
забывает выйти и его сессия остается открытой. Решением этой проблемы
может быть переменная “TMOUT” в BASH, которая определяет время, через
которое пользователь автоматически отключается от системы, если он не
активен. Она содержит время в секундах до отключения.
Редактируйте файл “/etc/profile” и добавьте следующую строку сразу после
строки с “HISTFILESIZE=”:
TMOUT=7200
Мы определяем значение для TMOUT равное 2 часам (60*60*2). Следует
отметить, что если вы добавили эту строку в файл /etc/profile, то переменная
определяется для любого подключаемого пользователя, а не только root. Чтобы
установить ее для конкретного пользователя измените файл “.bashrc” в его
домашнем каталоге.
Если вы экспортируете свои файловые системы с использованием 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. После того, как скрипт выполнит свою работу,
удалите его из системы.
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
По умолчанию, Red Hat отвечает на все запросы к имеющимся сервисам.
Используя TCP_Wrappers, вы легко сможете оградить ваш сервер от внешних
вторжений когда это нужно. Запретите все хосты, добавив “ALL: ALL@ALL,
PARANOID” в “/etc/hosts.deny”, и определите список тех кому доступ разрешен
в файле “/etc/host.allow” – это самая безопасная конфигурация. TCP_Wrappers
контролируется двумя файлами. Поиск завершается при первом совпадении.
/etc/hosts.allow
/etc/hosts.deny
- Доступ будет разрешен если пара (клиент, демон) найдена в файле /etc/host.allow
- Доступ будет запрещен если пара (клиент, демон) найдена в файле /etc/host.deny
- Если пары (клиент, демон) не найдена ни в одном из файлов (/etc/host.allow, /etc/host.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 выводился на экран, когда удаленный
пользователь подключается к серверу, измените опцию telnetd в файле
/etc/inetd.conf:
telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd –h
Флаг “-h” говорит демону не выводить любую системную информацию,
ограничиться только запросом “login:”. Эту возможность необходимо
использовать только, когда на сервере запускается демон telnet (вместо него я
рекомендую использовать ssh).
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” позволяет вам определить с каких TTY устройств может
входить в систему пользователь root. Этот файл читается программой login
(“/bin/login”). Он имеет очень простой формат. В каждой строке перечислены
имена tty устройств с которых root может входить в систему, а с остальных
доступ ему будет запрещен.
Отключите любые tty, которые вам не нужны, закомментировав их (знак # в
начале строки).
tty1
#tty2
#tty3
#tty4
#tty5
#tty6
#tty7
#tty8
В результате root сможет входить в систему только с терминала tty1. С
остальных терминалов вы сможете переключаться на root используя команду su.
|