Привет, Хабр!
Часто задаюсь вопросом, как значительно облегчить жизнь пользователя и специалистов технической поддержки? Вопрос бесконечного пути, на котором никогда нельзя останавливаться, каждый раз пробуя новое, не боясь смелых экспериментов.
Меня зовут Владимир Рябовол, в качестве .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-протокол на сервер.
Накапливая опыт и пробуя новое, мы продолжаем развивать и совершенствовать наш агент для обеспечения безопасного и эффективного взаимодействия с различными системами и сервисами. В обозримой перспективе ожидается расширение функциональности агента для выполнения других задач, связанных с мониторингом и управлением системами, с учетом требований безопасности и производительности.
Буду держать тебя в курсе, Хабр!