В прошлом году я планово осуществлял аудит безопасности автономных компьютеров, функционирующих под управлением операционной системы 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

В качестве экрана блокировки используется следующая картинка:

Astra Linux lock screen
Экран блокировки. Думаю более явного намёка обновить компьютер не придумать.

У читателя может возникнуть вопрос — а как пользователь обновит компьютер, если не сможет зайти в систему?

Для автоматического обновления я разработал отдельный скрипт, суть которого в том, что пользователю достаточно вставить выделенные зарегистрированный флеш-носитель с обновлением в ПЭВМ, чтобы компьютер сам обновился и разблокировался — но об этом в будущей статье.

Добавить комментарий

Ваш e-mail не будет опубликован.