Здравствуйте, уважаемые читатели!

Сегодня я хочу рассказать о своём проекте по настройке автономных компьютеров без участия администратора.

Суть проблемы в том, что мой филиал большой бюджетной организации имеет достаточное количество автономных компьютеров, территориально удалённых друг от друга. Вы скажете, в 21 веке это не проблема — интернет, VPN, и дело сделано.

Но, к сожалению, в целях абсолютной безопасности информации подключение компьютеров к сетям общего пользования запрещается.

WI-FI мост? Опять мимо. Использование беспроводных сетей передачи данных во взаимодействии с компьютерами также запрещено.

Вот и получается, что любая, даже самая маленькая настройка занимает до двух суток служебного времени — непорядок.

Я давно думал, как сделать так, чтобы настройки производили пользователи.

Но делиться учётной записью с правами администратора — не мой метод. Делегировать часть прав с помощью утилиты sudo я также не хотел.

Идеально — если пользователь вообще не будет знать, что он что-то настраивает (ну если только — сколько времени нельзя выключать компьютер).

Ранее я автоматизировал обновление баз вирусных сигнатур на автономных компьютерах — пользователи получают специальный флеш-носитель, который подключают к своему автономному компьютер. Флеш-носитель монтируется systemd-mount, а специальный скрипт запускает процесс обновления (к слову, если обновления устарели более чем на месяц, компьютер блокируется — опять же, требования регламента организации).

Тут мне в голову пришла мысль — «Если пользователи подключают выделенный флеш-носитель раз в месяц, почему бы им в этот момент не производить соответствующие настройки?». Но как обеспечить конфиденциальность сведений, содержащихся в настройках? Как сохранить их целостность и не дать изменить содержимое? Ответ — криптография.

Я спроектировал следующую схему.

1) Для обеспечения конфиденциальности файлов настроек используется симметричное шифрование.

У администратора находятся все ключи от всех автономных компьютеров. Данные ключи используются для шифрования файлов настроек (скриптов).

Ключи для каждого компьютера индивидуальны (что минимизирует последствия компрометации) и размещены в каталоге недоступном для пользователя.

Ключи на автономных компьютерах используются для расшифрования файлов настроек.

2) Для обеспечения целостности файлов настроек используется электронная подпись.

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

Закрытый ключ электронной подписи хранится у администратора в зашифрованном виде — с помощью данного ключа будут «подписываться» зашифрованные файлы настроек.

Рассмотрим ряд возможных угроз для действующей системы и их последствия:

1) Утрата флеш-носителя.

В данном случае злоумышленник получит доступ к зашифрованным конфигурационным файлам, на расшифрование которых потребуется довольно длительное время (а учитывая, что в файлах настройки используются только хеши паролей, а не пароли в открытом виде, то времени потребуется ещё больше).

Так как наличие данного носителя проверяется ежедневно, времени на замену критических файлов конфигурации у меня будет предостаточно.

2) Хищение жёсткого диска автономного компьютера.

Хищение жёсткого диска автономного компьютера приведёт к компрометации его ключей шифрования и файлов настроек операционной системы. Для системы последствия минимизируются созданием отличных друг от друга ключей шифрования и файлов настроек для каждого автономного компьютера.

3) Получение доступа к учётной записи администратора автономного компьютера без факта хищения (угроза, исходящая от внутреннего нарушителя).

В контексте отношения к разработанной системе не отличается от факта хищения жёсткого диска — так как ключи шифрования разные для каждого автономного компьютера, у нарушителя не будет возможности получить доступ к файлам настроек других автономных компьютеров.

4) Подключение флеш-носителя к личному техническому средству пользователя (угроза, исходящая от внутренней нарушителя).

Не отличается от факта утраты флеш-носителя, с той разницей, что о факте подключения я не узнаю. Минимизируется данная угроза организационными мерами пропускного режима и периодической сменой файлов настроек.

Модификация файлов настроек автономных компьютеров невозможна ввиду использования электронной подписи.

Деструктивное воздействие на данные файлы не приведёт к выходу из строя автономных компьютеров по этой же причине.

Рассмотрев вероятные угрозы, я пришёл к выводу, что меня полностью устраивает уровень её надёжности и приступил к реализации.

Для реализации использовал bash и пакет openssl — никакие сторонние программные продукты не использовал, ограничился средствами операционной системы Astra Linux SE 1.6.

Скрипт генерации файлов настройки, размещённый на компьютере администратора:

#!/bin/bash 
 
decrypt_script="$1" # Файл настройки (он же скрипт) в незашифрованном виде
dir_path_to_result="/media/flash/task" # Директория в которой будет создан зашифрованный файл настройки
 
private_key_dgst=./digital_private.pem # Приватный ключ цифровой подписи
 
if [[ $# != "1" ]]; then 
  echo "Ошибка. Используйте в качестве первого аргумента путь к скрипту." 
  exit 1 
fi 
 
echo -e 'Введите имя автономного ПЭВМ (если требуются все автономные ПЭВМ - нажмите Enter)' 
read host 
if [[ $host == '' ]]; then 
  host_list=$(cat ./avtonom.list) 
elif grep -q $host ./avtonom.list; then 
  host_list=$host 
else 
  echo "Ошибка. Автономный ПЭВМ $host не найден в перечне автономных ПЭВМ." 
  exit 1 
fi 
 
while [[ $password == '' ]] # Получаю пароль для использования цифровой подписи 
  do 
    clear 
    echo -e 'Введите пароль для цифровой подписи:' 
    read -s password 
  done 
 
/bin/rm -Rf $dir_path_to_result && mkdir $dir_path_to_result # Удаляю старый каталог с шифрованными файлами настроек, создаю новый пустой каталог 
 
for hostname in $host_list 
  do 
    /usr/bin/openssl enc -aes-256-ctr -pbkdf2 -in $decrypt_script -out $dir_path_to_result/$hostname.sh -pass file:./private/$hostname.pem # Шифрую файл настроек 
    /usr/bin/openssl dgst -sha256 -sign $private_key_dgst -out $dir_path_to_result/$hostname.sh.sign -passin pass:"$password" $dir_path_to_result/$hostname.sh # С помощью цифровой подписи подписываю шифрованный файл настроек и сохраняю подпись в каталог 
    if [[ $? == "1" ]]; then # Если пароль введён не верно, скрипт не будет подписан цифровой подписью 
      clear 
      echo "Ошибка, скрипт не подписан." 
      /bin/rm -Rf $dir_path_to_result 
      exit 1
    fi
  done

Скрипт автоматической настройки, размещённый на каждом автономном компьютере:

#!/bin/bash
hostname=$(hostname) # Имя хоста на котором происходит настройка 
dir_of_script=/opt/decrypt # Директория скрипта 
tempory_private_dir=/root/.cache # Временная директория недоступная пользователю 
dir_path_to_decrypt=/media/flash/task # Путь к точке монтирования флешки 
 
encrypt_script=$dir_path_to_decrypt/$hostname.sh # Зашифрованный файл настроек 
decrypt_script=$tempory_private_dir/result.sh # Расшифрованный файл настроек
encrypt_script_dgst_sign=$dir_path_to_decrypt/$hostname.sh.sign # Цифровая подпись файла настройки
 
public_key_dgst=$dir_of_script/digital_public.pem # Публичный ключ цифровой подписи
private_key_aes=$dir_of_script/private/$hostname.pem # Закрытый ключ AES индивидуальный для каждого ПК 
 
/usr/bin/openssl dgst -sha256 -verify $public_key_dgst -signature $encrypt_script_dgst_sign $encrypt_script # Проверяю цифровую подпись зашифрованного файла настроки
 
if [[ $? == "0" ]] # Если проверка электронной подписи прошла успешно; then 
  : # Продолжаем работу 
else 
  echo 'Завершаю работу.' # Иначе вывожу сообщение и завершаю работу 
  exit 1
fi 
 
/usr/bin/openssl enc -d -aes-256-ctr -pbkdf2 -in $encrypt_script -out $decrypt_script -pass file:$private_key_aes # Расшифрую файл настройки
 
/bin/bash $decrypt_script # Запускаю расшифрованный файл настройки 
 
rm -f $decrypt_script # Удаляю расшифрованный файл настройки

Пример файла настроек:

#!/bin/bash
config_version=12-06-2024
if [[ $config_version == $(cat /etc/config_version) ]]; then
  exit 0
else
  # НАЧАЛО СЕКЦИИ ДЛЯ КОМАНД НАСТРОЙКИ АВТОНОМНОГО ПК
  echo "$(date) $(hostname) Компьютер был обновлён" >> /media/flash/$(hostname)
  # КОНЕЦ СЕКЦИИ ДЛЯ КОМАНД НАСТРОЙКИ АВТОНОМНОГО ПК
  echo $config_version > /etc/config_version
fi

Буду рад конструктивной критике.

Всем хорошего дня.

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

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