Советы по безопасности в Linux
 
Автор: (C) Kapil Sharma
Перевод: (C) Александр Куприн


В этой статье я, на примере RedHat Linux, объясню, как усилить безопасность вашей Linux-машины, проведя базовую настройку безопасности системы. Прочитав статью, любой сможет "уплотнить оборону" Linux.

Безопасность BIOS
Всегда устанавливайте на BIOS пароль для запрета изменения установок и запрещайте загрузку с дискеты. Это заблокирует попытку загрузить систему со специального загрузочного диска и защитит вас от людей, пытающихся изменить настройки BIOS: возможность загрузки с дискеты или загрузка сервера без запроса пароля.

Безопасность LILO
Добавьте в файл "/etc/lilo.conf" три параметра: time-out, restricted и  password. Эти опции будут указывают на необходимость ввода пароля, если в процессе загрузки LILO  будут указаны такие опции загрузки, как "linux single".

Шаг 1
Отредактируйте файл lilo.conf (vi /etc/lilo.conf) и добавьте или измените три опции:

boot=/dev/hda
map=/boot/map
install=/boot/boot.b
time-out=00  # измените эту строку на 00
prompt
Default=linux
restricted   # добавьте эту строку
password=<password>   # добавьте эту строку и укажите ваш пароль
image=/boot/vmlinuz-2.2.14-12
label=linux
initrd=/boot/initrd-2.2.14-12.img
root=/dev/hda6
read-only

Шаг 2
Файл "/etc/lilo.conf" должен быть доступен только пользователю root, так как он содержит незашифрованный пароль (В любом случае lilo откажется сохранять изменения, если вы не укажете правильные права. Прим. перев.):

[root@kapil /]# chmod 600 /etc/lilo.conf

Шаг 3
Чтобы изменения вступили в силу, выполните команду:

[root@kapil /]# /sbin/lilo -v

Шаг 4
Ещё одной мерой по усилению безопасности может стать установка атрибута "неизменяемости" (immutable -- "i") файла "/etc/lilo.conf" при помощи команды chattr. Для этого воспользуйтесь командой:

[root@kapil /]# chattr +i /etc/lilo.conf

Это предотвращает любые изменения (случайные и не только) в файле "lilo.conf".

Для дополнительной информации о безопасности и lilo читайте мою статью.
 

Отключите все специальные учётные записи
Удалите из системы всех пользователей и все группы, которые не используются: например lp, sync, shutdown, halt, news, uucp, operator, games, gopher и т.д.

Для удаления пользователя используйте команду:
[root@kapil /]# userdel lp

Для удаления группы:
[root@kapil /]# groupdel lp

Выбирайте правильный пароль
Прежде чем выбирать пароль, выполните следующие рекомендации.

Длина пароля: после установки Linux минимально возможная длина пароля по умолчанию -- 5 символов. Этого недостаточно, должно быть 8. Отредактируйте файл "login.defs" (vi /etc/login.defs) и измените следующую строку:

Файл "login.defs" -- конфигурационный файл для программы login.

Включите поддержку теневых паролей
Включите возможность использования теневых [shadow] паролей. Для включения поддержки теневых паролей в вашей системе можно использовать утилиту "/usr/sbin/authconfig". Если хотите конвертировать существующие пароли и группы в теневые, то используйте команды pwconv, grpconv соответственно (Сейчас во многих дистрибутивах, например в дистрибутивах от ALT Linux используется еще более "жесткая" схема защиты паролей, чем shadow -- tbc. прим. ред.).

Учётная запись root'а
Учётная запись "root" -- наиболее привелигерованная в Unix. Когда администратор забывает выйти из системы, то система может автоматически закрыть консоль после заданного периода неактивности. Для того, чтобы этого добиться, нужно выставить значение в секундах в специальной переменной "TMOUT". Отредактируйте файл "vi /etc/profile", добавив в него следующую строку:

TMOUT=3600

Значение, указанное в переменной "TMOUT" в секундах -- это один час (60*60=3600). Если указать эту строку в "/etc/profile", то консоль любого пользователя системы автоматически закроется после часа отсутствия активности. В файле "~/.bashrc" вы можете установить эту переменную для каждого пользователя индивидуально. Для того, чтобы изменения вступили в силу, необходимо выйти из системы и войти в нее снова.

Отключите консольный (console-equivalent) доступ для обычных пользователей
На вашем сервере отключите консольный доступ обычных пользователей к таким программам, как shutdown, reboot и halt . Чтобы сделать это, выполните команду:

[root@kapil /]# rm -f /etc/security/console.apps/<servicename>

Отключите и деинсталлируйте все неиспользуемые сервисы
Чтобы избавить себя от лишних волнений отключите и деинсталлируйте все сервисы, которые вы не используете. Просмотрите файл "/etc/inetd.conf" и отключите ненужные сетевые сервисы, закомментировав их (добавив # в начало строки) и пошлите демону inetd сигнал SIGHUP для того, чтобы изменения вступили в силу (В настоящее время вместо inetd предпочтительней использование демона xinetd, как более защищенного и/или менее ресурсоёмкого. Но действия, которые указаны здесь для inetd, подходят и для xinetd. Прим.перев.). Для этого выполните следующее:

Шаг 1
Смените права доступа к файлу "/etc/inetd.conf" на 600 для того, чтобы читать и писать в него мог только root.

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

Шаг 2
УБЕДИТЕСЬ, что владельцем файла "/etc/inetd.conf" является root.

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

Шаг 4
Пошлите HUP сигнал демону inetd

[root@kapil /]# killall -HUP inetd

Шаг 5
Сделайте "прививку" файлу "/etc/inetd.conf", используя команду chattr, чтобы никто не мог модифицировать этот файл. Выполните команду:

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

Это предотвратит любые изменения файла "inetd.conf". Только один человек может снять атрибут - это суперпользователь root. Для модификации файла нужно снять immutable-флаг. Это делается следующей командой:

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

TCP_WRAPPERS
Используя TCP_WRAPPERS можно сделать сервер более защищенным от вторжения. Лучшая политика -- запретить доступ к серверу всем хостам, поместив в файл "/etc/hosts.deny" строку "ALL: ALL@ALL, PARANOID" и поместить список хостов, которым вы разрешаете доступ к вашему серверу, в "/etc/hosts.allow". TCP_WRAPPERS контролируется из двух файлов и поиск в них прекращается при первом совпадении.

Шаг 1
Отредактируйте файл hosts.deny (vi /etc/hosts.deny) и добавьте такие строки:

# Отказать в доступе всем
ALL: ALL@ALL, PARANOID

Имеется в виду,  что все сервисы и хосты блокируются, если им не разрешён доступ в hosts.allow

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

ftp: 202.54.15.99 foo.com

Клиентской машине с ip-адресом 202.54.15.99 и именем foo.com разрешён доступ к серверу через службу ftp.

Шаг 3
tcpdchk -- программа  проверки конфигурации tcpd wrapper. Она просматривает конфигурацию tcp wrapper и сообщает обо всех потенциальных и реальных проблемах, которые сможет найти. По окончании настройки запустите программу tcpdchk:

[root@kapil /]# tcpdchk

Не давайте системе показывать issue-файл
Не показывайте issue-файл вашей системы при удаленном подключении. Для этого можно изменить опции запуска telnet в файле "/etc/inetd.conf". Строка в "/etc/inetd.conf"

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

будет выглядеть так:

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

Добавление флага "-h" в конце заставляет демон выводить приглашение для входа в систему, не показывая никакой системной информации. Кроме того, я рекомендую использовать вместо telnet sshd.

Изменения в файле "/etc/host.conf"
Файл "/etc/host.conf" содержит настройки для библиотеки разрешения имен (resolver). (Разрешением имен или резолвером называется механизм преобразования имён узлов сети в ip-адреса и обратно. Прим. перев.) Отредактируйте файл host.conf (vi /etc/host.conf) и добавьте следующие строки:

# Просматривать имена хостов сперва через DNS, потом в файле /etc/hosts.
order bind,hosts
# Мы имеем машины с несколькими ip-адресами.
multi on
# Проверка ip-адресов на спуфинг.
nospoof on

(Ещё желательно добавить опцию "spoofalert on", что позволит резольверу с помощью syslogd записывать сообщения об ошибках в системный журнал . Прим. перев.)

"Иммунизация" файла "/etc/services"
Вы должны установить атрибут "i" у файла "/etc/services" для предотвращения неавторизованного удаления или добавления сервисов. Используйте команду:

[root@kapil /]# chattr +i /etc/services

Запрещение для root входа с разных консолей
Файл "/etc/securetty" разрешает вам выбирать какие TTY-устройства пользователь "root" будет использовать для входа в систему. Отредактируйте файл "/etc/securetty" для отключения тех tty, которые вам не нужны (символ # в начале строки).
 

Блокирование получения прав "root" при помощи команды su
Команда su (Substitute User) предоставляет вам возможность становиться другими существующими пользователями системы. Если вы хотите, чтобы никто не мог получить права пользователя "root" или хотите ограничить использование команды "su" для определённых пользователей, то добавьте  две следующие строки в начале файла конфигурации "su" в каталоге "/etc/pam.d/".

Шаг 1
Отредактируйте файл su (vi /etc/pam.d/su) и добавьте следующие две строки в начале файла:

auth sufficient /lib/security/pam_rootok.so debug
auth required /lib/security/Pam_wheel.so group=wheel

Вторая строка подразумевает, что только пользователи группы "wheel" могут получить права "root" при помощи su. Вы можете добавить пользователей в группу wheel и только эти пользователи смогут получать через su права суперпользователя.
 

Ведение логов командной оболочки
Bash хранит до 500 введенных ранее  команд в файле ~/.bash_history, упрощая повторное использование команд. Каждый пользователь, который имеет в системе учётную запись, имеет и этот файл в домашнем каталоге. Bash может хранить меньшее число команд, чем указано выше и удалять их при выходе пользователя из системы.

Шаг 1
Строки HISTFILESIZE и HISTSIZE в файле "/etc/profile" определяют размер файла ".bash_history" для всех пользователей системы. Я настоятельно рекомендую установить значение HISTFILESIZE и HISTSIZE не более 30. (Дистрибутив ASPLinux 7.1 выставляет эти значения в 1000. Прим. перев.). Отредактируйте файл profile (vi /etc/profile) и измените строки на:

HISTFILESIZE=30
HISTSIZE=30

Это позволит файлу ".bash_history" хранить не более 30 команд.

Шаг 2
Администратор может добавить в файл "/etc/skel/.bash_logout" строку "rm -f $HOME/.bash_history", которая будет удалять файл ".bash_history" каждый раз, когда пользователь будет выходить из системы. Отредактируйте файл ".bash_logout" (vi /etc/skel/.bash_logout) и добавьте следующую строку:

rm -f $HOME/.bash_history

Отключите команду перезагрузки системы с клавиатуры(Control-Alt-Delete)
Чтобы сделать это закомментируйте следующую строку в файле "/etc/inittab":

ca::ctrlaltdel:/sbin/shutdown -t3 -r now

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

[root@kapil /]# /sbin/init q

Зафиксируйте права на скрипты в каталоге "/etc/rc.d/init.d"
Зафиксируйте права доступа для скриптов, которые ответственны за запуск и останов всех процессов, которые нужны для работы в процессе загрузки:

[root@kapil/]# chmod -R 700 /etc/rc.d/init.d/*

Эта команда предоставляет возможность читать, писать и исполнять скрипты только пользователю "root". (Проверьте, чтобы владельцем скриптов был root.  Прим.перв.)
 

Сокрытие вашей системной информации
По умолчанию, когда вы входите в систему, вам сообщается название дистрибутива Linux, версию, версию ядра и имя сервера. Кракерам достаточно и такой информации о сервере. Лучше оставить пользователю только приглашение "Login:" и всё.

Шаг 1
Отредактируйте файл "/etc/rc.d/rc.local" и поставьте "#" перед следующими строками (Содержание может меняться, но одно будет оставаться неизменным -- формирование файла /etc/issue. По этому признаку и можно будет найти то, что нужно закомментировать. Прим. перев.):

# This will overwrite /etc/issue at every boot.  So, make any changes you
# want to make to /etc/issue here or you will lose them when you reboot.
#echo "" > /etc/issue
#echo "$R" >> /etc/issue
#echo "Kernel $(uname -r) on $a $(uname -m)" >> /etc/issue
#
#cp -f /etc/issue /etc/issue.net
#echo >> /etc/issue

Шаг 2
Удалите также следующие файлы: "issue.net" и "issue" в каталоге "/etc":

[root@kapil /]# rm -f /etc/issue
[root@kapil /]# rm -f /etc/issue.net

Отключите неиспользуемые программы с битами SUID/SGID
Постоянные пользователи имеют возможность запускать программы с правами "root", если у них выставлен бит SUID. Системный администратор должен минимизировать использование таких программ (SUID/SGID) и отключить те программы, которые не нужны.

Шаг 1
Чтобы найти программы с владельцем root и установленным битом 's', воспользуйтесь командой:

[root@kapil /]# find / -type f \( -perm -04000 -o -perm -02000 \) \-exec ls -lg {} \;

Для отключения у выбранных программ бита suid выполните:

[root@kapil /]# chmod a-s [имя программы]

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


Kapil Sharma

Email: [email protected]
Website: http://www.linux4biz.net
Kapil Sharma - консультант по безопасности Linux и Internet. Более двух лет работал на различных Linux/Unix системах и Internet Security. Поддерживает web-сайт http://www.linux4biz.net, предоставляющий как свободную, так и коммерческую поддержку web, Linux и Unix решений.


Copyright (C) 2000, Kapil Sharma.
Copying license http://www.linuxgazette.com/copying.html
Published in Issue 58 of Linux Gazette

Команда переводчиков:
Владимир Меренков, Александр Михайлов, Иван Песин, Сергей Скороходов, Александр Саввин, Роман Шумихин, Александр Куприн

Со всеми предложениями, идеями и комментариями обращайтесь к Сергею Скороходову ([email protected])

Сайт рассылки: http://gazette.linux.ru.net
Эту статью можно взять здесь: http://gazette/linux.ru.net/etc/rus-sharma.html