В прошлом году я планово осуществлял аудит безопасности автономных компьютеров, функционирующих под управлением операционной системы Astra Linux SE 1.6.
В нашей «крупной бюджетной организации» регламентом установлено, что обновление баз вирусных сигнатур ПЭВМ пользователи осуществляют самостоятельно (вернее самый подготовленный из пользователей — хорошо разбираешься? Держи дополнительные обязанности :)).
В прошлом году у меня было много командировок в удалённых филиалах, поэтому вернувшись, я обнаружил, что почти никто из должностных лиц не обновлял антивирусы.
Давно прошло время, когда я хотел кому-то что-то доказывать через конфликт, да и нервная система уже не та, поэтому я решил автоматизировать блокировку компьютера в случае, если назначенные пользователи уклоняются от исполнения обязанностей.
Забегая вперёд — произошло чудо, и теперь в моей организации обновление проходит так, как должно.
Хочу отметить, что система обновления одной блокировкой не ограничивается, для автоматизации обновлений создан специальный скрипт, но о нём я расскажу в отдельной статье, а сегодня мы разберём как происходит блокировка в Astra Linux SE 1.6. В качестве антивируса мы рассмотрим Kaspersky Endpoint Security 11 для Linux, но скрипт можно доработать для любой другой версии или дистрибутива (например, DrWeb).
Итак, вот содержание скрипта блокировки:
#!/bin/bash
days_of_old_base=-30 # Количество дней после обновления, через которое пользователи заблокируются
file_lock=/var/lib/savz_control/lock # Файл блокировки
file_lock_users=/var/lib/savz_control/lockusers # Файл списка ранее блокированных пользователей
dir_bases=/home/kav/ # Директория, где хранятся базы вирусных сигнатур
mkdir -p /var/lib/savz_control # Создаю директорию для временных файлов скрипта (список и файл блокировки)
function find_version_update() {
# Функция определения версии обновления. До 8 версии использовался background, после fly-default
version=$(awk '/Update/ {print $2}' /etc/astra_update_version)
if (( $version < 8 ))
then
echo background.png
else
echo fly-default
fi
}
function search_uids() {
# Функция поиска локальных пользователей кроме администратора (uid 1000)
cat /etc/passwd | awk -F: '/10[0-9][0-9]/ {print $3}' | grep -v 1000
}
function find_lock_users() {
# Функция ищет заблокированных пользователей. Это сделано для того, чтобы случайно
#не разблокировать пользователей заблокированных администратором по каким-либо причинам.
while read user
do
username=$(getent passwd $user | awk -F: '{ print $1}')
if [[ $(passwd -S $username | awk '{print $2}') == "L" ]]
then
echo $username >> $file_lock_users
fi
done <<<$(search_uids)
}
function user_lock() {
# Функция блокирует всех пользователей ПЭВМ
find_lock_users
while read user
do
username=$(getent passwd $user | awk -F: '{ print $1}')
passwd -l $username
done <<<$(search_uids)
}
function user_unlock() {
# Функция разблокирования пользователей после обновления
while read user
do
username=$(getent passwd $user | awk -F: '{ print $1}')
if grep -q $username /var/lib/savz_control/lockusers # Если пользователь был заблокирован до блокировки обновления, то его не разблокируем
then :
else
passwd -u $username
fi
done <<<$(search_uids)
}
if [[ $(find $dir_bases -ctime $days_of_old_base -name index) == "" ]] # Если в директории с обновлениями есть файлы старее, чем установлено
then
if [[ ! -e $file_lock ]] # И если файла блокировки нет (компьютер не заблокирован)
then # Тогда блокирую пользователей, заменяю фон fly-dm, создаю файл блокировки, перезагружаю fly-dm
sed -i /'normal file'/s/$(find_version_update)/'\/opt\/savz_control\/alarm.png'/ /usr/share/fly-dm/themes/fly-flat/fly.xml
user_lock
> $file_lock
systemctl restart fly-dm
fi
else # Иначе, если в директории с обновлением устаревших файлов не выявлено
if [[ -e $file_lock ]] # И если компьютер ранее был блокирован
then # Разблокирую пользователей, кроме ранее заблокированных, удаляю файлы блокировки и список блокированных пользователей, меняю фон fly-dm на стандартный, перезагружаю fly-dm
sed -i s/'\/opt\/savz_control\/alarm.png'/$(find_version_update)/ /usr/share/fly-dm/themes/fly-flat/fly.xml
user_unlock
rm {$file_lock,$file_lock_users}
systemctl restart fly-dm
fi
fi
В качестве экрана блокировки используется следующая картинка:
У читателя может возникнуть вопрос — а как пользователь обновит компьютер, если не сможет зайти в систему?
Для автоматического обновления я разработал отдельный скрипт, суть которого в том, что пользователю достаточно вставить выделенные зарегистрированный флеш-носитель с обновлением в ПЭВМ, чтобы компьютер сам обновился и разблокировался — но об этом в будущей статье.