Приручаем Ctrl-Alt-Del

Приручаем Ctrl-Alt-Del

Одной из основных предпосылок в компьютерной безопасности является практически полная невозможность обеспечить защиту системы, к которой у атакующего есть физический доступ. Невозможно охватить все возможные варианты событий, но можно внести небольшие изменения в систему для контроля за наиболее очевидными путями нарушения безопасности. Сегодня мы рассмотрим методы защиты от несанкционированных перезагрузок систем. Мало ли для чего пригодится;)…

Каждый, кто подойдет к клавиатуре Linux-машины, может нажать клавиши Ctrl-Alt-Del и перезагрузить систему без входа в нее, в то время как машины под управлением Windows, если они заблокированы, требуют корректной регистрации (либо текущего пользователя, либо пользователя с административными привилегиями) перед тем, как вы сможете перезагрузить систему. И это даже не обязательно должно использоваться со злым умыслом: часто люди, привыкшие к Windows NT/2000/XP и иже с ними, нажимают Ctrl-Alt-Del в сессии X-Windows для блокировки экрана или для доступа к менеджеру задач, а вместо этого видят ужасное сообщение "The system is going down for reboot NOW!" и последующее уничтожение их работы, которую они не успели сохранить.
Во многих дистрибутивах Linux клавиатурная комбинация Ctrl-Alt-Del настроена на перезагрузку системы. И если это приемлемо для однопользовательской домашней системы, то для рабочего места в офисе или даже серверов представляет ненужный риск, поскольку не требует корректной регистрации пользователя.
Для предотвращения такого поведения мы будем перехватывать нажатия Ctrl-Alt-Del и вместо перезагрузки выполнять свой собственный скрипт. Он будет контролировать несанкционированные попытки перезагрузки и протоколировать их. Для этого нужно написать небольшой скрипт и внести изменения в конфигурационный файл '/etc/inittab', после этого остается добавить ротацию файла журнала (если вы пользуетесь 'logrotate'), чтобы все было в порядке.

Скрипт для интерпретатора bash, который выполняет всю необходимую работу, назовем 'audit_cad.sh':

#!/bin/sh
# генератор сообщений о попытке перезагрузки через "Ctrl-Alt-Del"
# v0.7 (23/06/2003)
# Автор: Dean Wilson
#set -x # раскомментируйте эту строку для отладки
==============================
# используемые внешние программы
LOGGER=/usr/bin/logger
TR=/usr/bin/tr
DATE=/bin/date
BASENAME=/usr/bin/basename
==============================
# проверка внешних зависимостей

function usage {
for BINLOC in $LOGGER $TR $DATE $BASENAME
do
if [ ! -f "$BINLOC" ];then
printf "Failed to find '$BINLOC' This script requires this to run\n"
ERROR=1
continue
fi
if [ ! -x "$BINLOC" ];then
printf "'$BINLOC' does not seem to be executable, please fix\n"
ERROR=1
continue
fi
done
}
==============================
# измените это, если хотите поменять приоритет для сообщения, которое передается syslog

FAC=user
LEVEL=crit

# получить имя приложения без пути
APP=$($BASENAME "$0")

# сообщение для журнала
MSG="Ctrl-alt-delete was triggered and caught by $APP"

# расположение внешнего non-syslog-журнала
LOGFILE=/var/log/shutattempt
==============================
# если скрипт вызван с ключом "-c", проверить наличие необходимых программ
if [ "$1" == "-c" ];then
usage

if [ -n "$ERROR" ];then
RETCODE=1
else
RETCODE=0
fi
# никогда не запускать после проверки
exit $RETCODE
fi
# записать дату/время во внешний журнал
$($DATE +'%b %d %T ' | $TR -d '\n' > > $LOGFILE)

# работаем
$LOGGER -p ${FAC}.${LEVEL} -t $APP -s $MSG 2> > $LOGFILE
exit 0

Он может вызываться в двух вариантах. С параметром '-c' он проверит наличие всех необходимых ему программ. Это наилучший метод убедиться, что ваша система удовлетворяет всем требованиям.
Если какая-то из проверок не сработает, скрипт выведет на экран сообщение об ошибке и имя отсутствующей программы. После этого скрипт продолжит проверку. Если какая-либо необходимая программа не найдена, после завершения выполнения скрипта будет возвращен код 1. Вот список необходимых для работы программ:
— /usr/bin/logger
— /usr/bin/tr
—· /bin/date
— /usr/bin/basename

Из них всех ручного редактирования может потребовать только программа basename, которая часто находится либо в каталоге '/usr/bin', либо в каталоге '/bin'. Обычно скрипт в режиме проверки запускается при установке в систему для того, чтобы убедиться, все ли в порядке. Поскольку скрипт выполняется от пользователя root, стоит проверить права доступа. В идеале они должны быть равными -rwx------. Чтобы установить их, введите команду 'chmod 0700 audit_cad.sh'.

Если же скрипт вызывается без параметров, он делает запись в общесистемном журнале ('syslog') с указанными пользователем уровнем и типом и в отдельном файле '/var/log/ shutattempt'. Это вариант, вызывающийся при нажатии Ctrl-Alt-Del.
Будем считать, что наш скрипт находится в каталоге '/usr/local/sbin/', куда мы его и помещаем. Если вы хотите изменить эти или другие параметры, просто откройте скрипт в редакторе и вносите необходимые изменения. Все настройки описаны в комментариях.
Теперь, когда скрипт настроен и находится на своем месте, нужно изменить обработчик события Ctrl-Alt-Del в файле '/etc/inittab'. Нас интересует строка, говорящая процессу 'init', как обрабатывать нажатие Ctrl-Alt-Del. В большинстве дистрибутивов идентификатор этого события обозначается как 'ca', а вся строка выглядит примерно так: "ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now". Важной частью этой записи является последнее поле, начинающееся с '/sbin/shutdown'. Чтобы изменить поведение системы, замените значение этого поля на полное имя скрипта 'audit_cad.sh'. Должно получиться что-то вроде "ca:12345:ctrlaltdel:/usr/local/sbin/audit_cad.sh".

После внесения указанных изменений нужно сообщить процессу 'init' об изменениях в его конфигурации. Проще всего это сделать, выполнив команду 'telinit q', которая заставляет процесс 'init' перечитать свою конфигурацию.
Теперь можно проверить наши изменения. Перед этим вам следует закрыть все пользовательские приложения — например, редакторы. Если вы где-то допустили ошибку при редактировании, система перезагрузится, поэтому лучше быть уверенным, что ваша работа не исчезнет. Когда будете готовы, нажмите Ctrl-Alt-Del, и никакой видимой реакции быть не должно.
Если ваша система продолжает работать, проверьте системный журнал (обычно это файл '/var/log/messages' или '/var/log/syslog') и отдельный журнальный файл скрипта 'audit_cad.sh', чтобы убедиться в правильном протоколировании события. Если же ваша машина таки перезагрузилась — проверьте все изменения и повторите попытку.
Когда у вас все заработает, останется последнее: автоматизировать обработку журнального файла. Все это может различаться: от настройки программ 'SWATCH' или 'logwatch' для посылки автоматических отчетов до настройки ротации журнального файла. Ниже приведен простой пример настройки системы 'logrotate' (подходит как для Redhat, так и для Debian):

daily
rotate 7
compress
delaycompress

/var/log/shutattempt {
nomail
notifempty
missingok
create 0600 root root
}

Добавьте этот файл, предварительно назвав его audit_cad, в ваш каталог 'logrotate'. Обычно это '/etc/logrotate.d'. После этого можно не беспокоиться о том, что журнальный файл слишком сильно разрастется.
Хотя эта технология и позволяет обнаружить попытку перезагрузки системы, у нее есть свои минусы. Так, вы не знаете, кто именно пробует перезагрузить машину, и нет никакой возможности определить это. Процесс 'init' выполняется от имени пользователя 'root', потому никаких данных о пользователе вы получить не можете.

Внеся незначительные изменения в 'audit_cad.sh', можно получить вывод команд w или who на момент нажатия Ctrl-Alt-Del, но он не так полезен, как кажется: ведь вы получаете список правомерных пользователей, а чтобы нажать Ctrl-Alt-Del, совершенно не нужно регистрироваться на машине.
Другим моментом является то, насколько явно вы хотите показывать существование данного скрипта. Возможно, не стоит афишировать его присутствие в системе? Тогда назовите его 'shutdown' и сохраните где-нибудь в нестандартном месте.
За полной информацией о формате и назначении файла 'inittab' обратитесь к манам (команда 'man 5 inittab'), а чтобы узнать полный список поддерживаемых параметров команды 'telinit', прочтите 'man 8 telnint'. Если вы не знакомы с программой 'logrotate', начните с ее страницы руководства (команда 'man 8 logrotate').

По материалам Dean Wilson
Подготовил X-Stranger



Компьютерная газета. Статья была опубликована в номере 39 за 2003 год в рубрике soft :: ос

©1997-2024 Компьютерная газета