Нещодавно мені до рук потрапила цікава стаття, пов’язана з комбінацією клавіш ctrl+alt+del в Linux.
Як відомо, у багатьох дистрибутивах Linux, комбінація цих клавіш безпосередньо веде до перезавантаження системи. Гаразд, звичайному користувачеві воно не особливо заважає, але якщо це буде відбуватися на робочих місцях, в офісах, або серверів?
Зараз я збираюся написати, як приручити 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 Filed to find $BINLOC
This script requires this to run
ERROR=1
continue
fi
if [! x $BINLOC ];then
printf $BINLOC does not seem to be executable, please fix
ERROR=1
continue
fi
done
}
=====================================================================
# змінити це, якщо хочете змінити пріоритет для повідомлення, яке передає syslog
FAC=user
LEVEL=crit

# отримати ім’я додатка без шляху
APP=$($BASENAME $0)

# повідомлення для журналу
MSG=Ctrl+alt+delete was trigged 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
>>$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/cbin/audit_cadsh
Після зміни потрібно повідомити процесу init про зміни його конфігурації. Щоб не парити мізки перезавантаженням, або ще чого, можна це зробити виконавши команду telinit q яка змусить процес init перечитати свою конфігурацію.
А тепер перевіряємо ефективність наших дій. Закриваємо всі работающине програми, зберігаємо роботи, щоб у разі чого не було втрати інформації. Тепер тисніть Ctrl-Alt-Del Якщо ви все правильно зробили, то нічого не повинно статися.
Якщо система продовжує працювати, перевірте журнал (зазвичай, це файл /var/log/messages або /var/log/syslog) і окремий журнальний файл скрипту audit_cad.sh щоб переконатися в правильно протоколюванні події. Якщо все ж ви перезавантажити перевірте всі зміни, і повторіть спробу.
Якщо все спрацювало, то тепер треба автоматизувати обробку журнального файлу. Все це може різнитися: від налаштування програм SWATH або logwatch для посилки автоматичних відповідей до налаштування ротації журнального файлу. Нижче я наведу простий приклад налаштування системи logrotate (це підходить як для Radhat, так і для Debian):

daily
rotate 7
compress
delaycompress

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

Додайте цей файл, попередньо назвавши його audit_cad в ваш каталог logrotate
Зазвичай це /etc/logrotate.d Після цього можна не турбуватися про те, що журнальний файл занадто сильно разрастаеться.
Ну ось, тепер ваша система захищена від натискання Ctrl-Alt-Del Однак у цьому є свої мінуси. Ви наприклад не можете дізнатися хто намагався натиснути цю комбінацію (хіба що на місці злочину підловити негідника). Процес init виконується від користувача root тому ніяких даних про користувача ви отримати не зможете.
Внісши незначні зміни в audit_cad.sh можна отримати висновок команд w або who на момент натискання Ctrl-Alt-Del, але він не такий корисний, як здається, адже ви отримуєте список правомірних користувачів, а щоб натиснути Ctrl-Alt-Del, зовсім не обов’язково реєструватися на машині.
Іншим моментом є те, наскільки ви хочете показати існування даного скрипта. Можливо, не варто афішувати його присутність в системі? Тоді назвіть його shutdown або ще як-то, і збережіть в нестандартному місці.
За повною інформацією про формат файла inittab зверніться до маннам (компнда man 5 inittab), а щоб дізнатися повний список підтримуваних параметрів команди telinit прочитайте man 8 telinit Якщо ви не знайомі з програмою logrotate почніть з її сторінки керівництва (команда man 8 logrotate).
Удачі у використанні.