Защита Linux от несанкционированного консольного доступа
Опубликовано 18.03.2009
Есть две вечные темы, о которых пишет почти каждый автор «блога про linux» — туннели в ssh (каюсь, сам грешен) и сброс пароля root путём загрузки в режиме single user. Как правило, второй рецепт провоцирует обширные обсуждения на тему незащищённости Linux от действий злоумышленников при наличии физического доступа к компьютеру.
Вот несколько простых шагов, которые создадут серьёзные препятствия для злоумышленника, просто подошедшего к консоли в отсутствие хозяина. В качестве примера можно представить шаловливого племянника, зашедшего в гости, или зловредных коллег, собирающихся подменить заставку на рабочем столе. Однако следует понимать, что при наличии времени всегда есть возможность просто вытащить винчестер и подсмотреть интересующую информацию на другом компьютере, или же подложить руткит. Поэтому если вы всерьёз озабочены проблемой безопасности своего сервера, необходимо подумать о более серьёзных мероприятиях по его защите, таких, как шифрование дисков, установка полноценных систем предотвращения и обнаружения вторжений (IDS) и т.д. Не забывайте и про стандартные средства обеспечения безопасности в офисе или дата-центре: видеонаблюдение, надежная пропускная система, проинструктированная охрана… Полноценное описание этих мер выходит далеко за рамки данной статьи.
Итак, как же можно минимально обезопасить свой компьютер?
- Отключите загрузку с CD-ROM и флэшек и установите пароль на BIOS. Это не позволит злоумышленнику изменить порядок загрузки устройств и загрузиться со своей флэшки или компакт-диска. Однако всегда можно сбросить память BIOS, выковыряв батарейку из материнской платы, поэтому не следует полагаться на пароль BIOS’а в долгосрочной перспективе.
- Установите пароль на редактирование параметров загрузки grub. Система будет загружаться в обычном порядке, но никто не сможет изменить параметры загрузки, выбрав вариант загрузки и нажав кнопку «e»:
- сгенерируйте пароль с помощью утилиты
grub-md5-crypt
:$ grub-md5-crypt Password: Retype password: $1$0/Zwx$i0LAHSrpXKfT.JBZHCXpf1
- Добавьте получившийся пароль в общий раздел
/boot/grub/menu.lst
в виде строки:password --md5 $1$0/Zwx$i0LAHSrpXKfT.JBZHCXpf1
- Если у вас есть небезопасные дополнительные режимы загрузки (например, альтернативные операционные системы типа windows, или загрузка с параметром single), можно в описание этих режимов добавить параметр
lock
, который запретит пользователям выбирать этот вариант загрузки без ввода пароля. Пароль можно задать в этом же разделе, или оставить общий. - Обратите внимание, что если файл
menu.lst
генерируется программойupdate-grub
, как это сделано в Debian или Ubuntu, то вместо указания директивыlock
в каждом варианте загрузки необходимо установить специальные параметры в разделе настройки upgrade-grub:lockalternative
,lockold
илиkopt
. Формат этих параметров и механизм работы update-grub подробно описаны в/boot/grub/menu.lst
иman update-grub
.
- сгенерируйте пароль с помощью утилиты
- Если у пользователя root на вашей машине есть пароль, пусть система запрашивает этот пароль при входе в single-user mode. Если в вашем дистрибутиве используется старый стиль инициализации через inittab (к таким системам относится большая часть дистрибутивов, кроме последних версий Ubuntu, Fedora и Debian, перешедших на Upstart), убедитесь, что в
/etc/inittab
присутствует строчка, подобная следующей:~~:S:wait:/sbin/sulogin
Эта инструкция говорит процессу init, что в однопользовательском режиме необходимо запускать программу
/sbin/sulogin
, которая запрашивает пароль суперпользователя. Но если пароль у root’а отсутствует, как, например, в Ubuntu, то sulogin пропускает в систему без запроса пароля. Поэтому обладателям современных дистрибутивов остаётся утешаться тем, что через пароль grub довольно сложно прорваться. - Отключите интерактивную загрузку. В системах, основанных на RedHat (RHEL, Centos, Fedora), пользователь может нажать I перед началом загрузки сервисов и rc.sysinit при старте каждого сервиса будет спрашивать, нужно ли стартовать этот сервис. Эта фича отключается в файле
/etc/sysconfig/init
исправлением/добавлением параметра PROMPT:PROMPT=no
- Отключите Ctrl+Alt+Del. Любой бездельник может перезагрузить ваш компьютер (и испортить uptime), просто перейдя на виртуальную консоль и нажав три заветные кнопки. Этого риска можно избежать, настроив свой
/etc/inittab
или, в случае использования upstart, соответствующий файл в/etc/event.d
(у меня этот файл так и называется —control-alt-delete
). Необходимо просто закомментировать строчку, содержащую описание действия для событияctrlaltdel
(илиcontrol-alt-delete
в Upstart.). Или заменить это действие на команду отправки сообщения в syslog:/usr/bin/logger -p auth.info "Ctrl+Alt+Del pressed
После внесения изменения в
/etc/inittab
нужно послать процессу init сигнал перечитать этот файл:init q
Для Upstart никаких уведомлений об изменении конфигурации не нужно.
- Установите таймаут для логина в консоли. В оболочке bash есть переменная окружения
TMOUT
, которая устанавливает период неактивности (в секундах) — если от пользователя не поступило никакого ввода в течение указанного времени, процесс bash самоубивается. В/etc/profile.d
можно поместить исполняемый файлlogintimeout.sh
примерно следующего содержания:if [ x"$SSH_REMOTE_USER" = x ] ; then TMOUT=300 export TMOUT fi
Таким образом, консольные пользователи будут «выкидываться» через 5 минут бездействия. Подобным образом можно установить период неактивности в других шеллах, а также в ssh (параметр ClientInactiveTimeout в sshd_config). Однако мне кажется, что подобные фокусы могут лишь раздражать вас и ваших пользователей, не принося реальной пользы, и стоит ограничиться установкой такого таймаута только для логинов с консоли.
- Установите vlock и приучите себя и коллег использовать его перед тем, как отлучиться от консоли более чем на 30 секунд. Команда
vlock
блокирует текущую виртуальную консоль; чтобы разблокировать ее, нужно ввести пароль пользователя или root’а (если он есть, конечно).vlock -a
вообще запрещает переключаться на другие консоли (например, с помощью комбинации Alt+F7). - Не забывайте о блокировке графического интерфейса.
- установите разумный период бездействия (5 — 10 минут), по истечении которого запускается хранитель экрана
- установите пароль на хранитель экрана
- выведите ярлык блокировки на видное место
- назначьте и запомните сочетание клавиш для блокировки экрана (в Gnome это Ctrl+Alt+L)
Выполнение хотя бы половины из этих действий добавит вам немного спокойствия, но, еще раз повторюсь, не гарантирует абсолютной безопасности. Будьте внимательны.
По мотивам Tips To Protect Linux Servers Physical Console Access.
Здравствуйте Владимир. Очень интересная статья. Поэтому взял на себя смелость выложить ее на сайте – http://www.linuxprime.ru/articles.php?article_id=28. А вообще, хотел бы видеть Вас в числе активных участников и авторов этого молодого проекта!
А что мешает применить dm-crypt к root’овому разделу (ну и ко всем разделам) на винтах, помимо /boot?