Привет, Хабр!

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

Меня зовут Владимир Рябовол, в качестве .NET разработчика Страхового Дома ВСК я занимаюсь разработкой desktop-приложения «Агент АРМКоординатор», которое уже показало первые результаты нового качества опыта для специалистов и пользователей.

Главное окно приложения "Агент АРМКоординатор"
Главное окно приложения "Агент АРМКоординатор"

О блоках:

  • Информация о ПК — просмотр и копирование информации о пользователе, его ПК.

  • Состояние ПК — результаты мониторинга системы, на основании выполнения PowerShell скриптов.

  • Утилиты — состоит из кнопок запуска для «Распознать текст из области»«Распознавать текст из файла», «Сканирование QR-кода», «Конвертер Изображений». Благодаря этим функциям можно выделить любую часть экрана и получить текст из конкретного участка, загрузить изображение для получения текста из него, отсканировать QR-код подключенной к ПК веб-камерой или загрузить изображение с QR-кодом, запустить конвертацию в/из PDF.

  • Ссылки — добавление пользователем кнопки на любой ресурс. Как гиперссылкой на сайт, так и на открытие приложения.

  • Инструменты — пользователь может самостоятельно запускать скрипты для решения типичных проблем самостоятельно.

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

Больше всего здесь интересен скрипт, который смотрит атрибуты SMART SSD и выводит оставшееся здоровье диска. В Страховом Доме ВСК доменная структура сети и выполнение скриптов регулируется настройками политики безопасности. Значит, выполнение скриптов обычному пользователю разрешено только в рамках текущего пользователя — для просмотра атрибутов SMART необходимы права администратора. Здесь мы и столкнулись с задачей легального обхода запрета запуска скриптов.

Наш агент установлен на всех ПК компании, развернута и вспомогательная Windows-служба, которая определяет основной ПК пользователя. Служба работает в контексте локального администратора — мы решили воспользоваться её услугами. Для безопасного взаимодействия мы применили именованный канал NamedPipe.

Именованные каналы — это механизм взаимодействия между процессами в операционных системах Windows. Механизм позволяет процессам обмениваться данными друг с другом через специальные «каналы», создаваемые с определенным именем в файловой системе. На стороне службы был развернут сервер NamedPipeServerStream, который ждет подключения клиента, знающего секретное имя.

//Создаём объект безопасности для именованного канала

PipeSecurity ps = new ();

//Получаем идентификатор безопасности для всех пользователей

var sid = new SecurityIdentifier(WellKnownSidType.WorldSid, null);

NTAccount account = (NTAccount)sid.Translate(typeof(NTAccount));

//Устанавливаем правила доступа для учетной записи NT, позволяя чтение и запись

ps.SetAccessRule(new PipeAccessRule(account, PipeAccessRights.ReadWrite, System.Security.AccessControl.AccessControlType.Allow));

//Создаем сервер именованного канала с заданными параметрами, включая объект безопасности

string pipeName = "секретное_имя";

var pipeServer = NamedPipeServerStreamConstructors.New(pipeName, PipeDirection.InOut, 1, PipeTransmissionMode.Byte, PipeOptions.None, 512, 512, ps);

try

{

//Ожидаем подключение клиента к серверу

    await pipeServer.WaitForConnectionAsync();

//Создаем поток StreamReader для чтения данных от клиента

    var reader = new StreamReader(pipeServer);

    var message = await reader.ReadLineAsync();

//Выполняем команду PowerShell полученную от клиента

    var result = await RunPowerShell.Run(message);

//Отправляем результат выполнения клиенту

    var writer = new StreamWriter(pipeServer);

    await writer.WriteAsync(result);

    await writer.FlushAsync();

}

catch (Exception ex){ }

//На стороне агента подключение осуществляется через NamedPipeClientStream

//На стороне клиента создаем именованный канал с заданным именем

string pipeName = " секретное_имя";

var pipeClient = new NamedPipeClientStream(".", pipeName, PipeDirection.InOut);

try

{

//Подключаемся к серверу именованного канала

    await pipeClient.ConnectAsync();

//Создаем поток StreamWriter для записи данных в канал

    var writer = new StreamWriter(pipeClient);

//Отправляем сообщение

    await writer.WriteLineAsync(message);

    await writer.FlushAsync();

//Создаем поток для чтения ответа

    var reader = new StreamReader(pipeClient);

    result = reader.ReadToEnd();

}

catch (Exception ex) { }

Скрипты находятся в папке C:\Program Files\VSK\Scripts, что позволяет не беспокоиться о том, что обычный пользователь сможет изменить скрипт или добавить другой. Вместе с тем, в рамках безопасности наши скрипты подписаны сертификатом компании, ведь компании политика запуска скриптов RemoteSigned, не позволяющая запуск сценариев PowerShell, которые не имеют цифровой подписи.

Скрипт, предполагаемый к запуску от учетной записи администратора, должен начинаться с комментария #admin. Агент, при открытии скрипта, смотрит на наличие этого комментария. Если есть, то через NamedPipe он передается на выполнение службе, которая в ответ вернет результат. Если комментарий в начале отсутствует, скрипт будет выполнен от имени пользователя.

В нашем агенте есть и функционал опроса пользователя о его настроении, работоспособности, работе определенных систем. Полученную информацию мы также передаем службе через NamedPipe, которая в дальнейшем шифруется AES-алгоритмом и передается через TCP-протокол на сервер.

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

Буду держать тебя в курсе, Хабр!

Комментарии (0)