Автоматизация скучной жизни инженера по кибербезопасности
Основная задача консультанта по информационной безопасности — разработка однотипных документов по однотипным процессам. И два самых главных инструмента, которые он использует в работе, — Excel и Word. Сбор и обработка осуществляются при помощи первого, а предоставление отчетных материалов — при помощи второго. У того, и у другого огромный потенциал автоматизации. В предыдущей статье я рассказал о базовых идеях автоматизации в Word и Excel на примере классификации и модели угроз.
При помощи скриптов мы научились:
подставлять на выбранные места шаблона необходимого документа нужные значения;
подготавливать таблицу значений для массовой генерации документов и выгружать любое количество однотипных документов.
В этом посте я покажу, как автоматизировать выгрузку комплекта документов, а также разберемся с автоматизацией оценки рисков.
А мы ведь на полном серьезе пробовали и C#, и Python. А пользуемся почему-то скриптами на VBA в Excel
5 кликов + 1 скролл — выгружаем комплектом
Итак, наша первая цель для автоматизации: как выгрузить комплект разных документов по одному перечню переменных? И что, если мы не знаем, какие переменные будут в комплекте?
Например, аттестация систем большого количества филиалов с однотипным, но не совпадающим набором условий. Отличаться могут пропускной режим в здании, наличие посторонних организаций в этом здании, наличие Wi-Fi, виртуализации и т. п. Первое, что хочется сделать, — типизировать формат филиалов. Скажем, в этот раз получится четыре типа. А в другой — шесть. А вообще, ничто не мешает использовать один и тот же универсальный набор для каждого заказчика, просто выкидывая лишние документы из набора.
Правильный способ объявления переменной
Для начала надо изменить подход к созданию шаблона. Вставка поля требует пяти кликов мышкой, один скролл и один ввод названия. Скролл и клик требуют так называемого прицеливания. И нужно это все только для того, чтобы Word правильно объявил переменную. Какие альтернативы?
Создавать переменную через Ctrl+F9. В этом случае прицеливания мышкой и скролла не будет, но придется писать название и тип переменной вручную. Переменную придется объявлять.
Можно придумать свои собственные теги. Это самый неправильный путь, поскольку влечет множество ошибок. Переменную придется объявлять. А еще отлавливать ошибки.
Можно создать одну переменную и использовать Ctrl+C, Ctrl+V. Нужно будет менять название переменных. Переменную придется объявлять.
То есть все способы, упрощающие создание шаблонов, требуют объявления переменной. Сделать это можно следующим скриптом:
For Each fld In objWrdDoc.Fields
If Left(fld.Code, 12) = " DOCVARIABLE" Then
WorkString = Left(Right(fld.Code, Len(fld.Code) - 14), InStr(Right(fld.Code, Len(fld.Code) - 14), " \*") - 1)
TestVar = False
For Each var In objWrdDoc.Variables
If var.Name = WorkString Then TestVar = True
Next
If TestVar = False Then objWrdDoc.Variables.Add Name:=WorkString
End If
Next
Теперь, когда у нас есть комплект шаблонов с объявленными переменными, нам нужно собрать полный список всех переменных и в едином интерфейсе их заполнить.
For Each var In objWrdDoc.Variables
'Проверяем есть ли такая переменная уже в списке
TestVar = False
If UIdoc.ListSHvariables.ListCount > 0 Then
For j = 0 To UIdoc.ListSHvariables.ListCount - 1
UIdoc.ListSHvariables.ListIndex = j
If UIdoc.ListSHvariables.Value = var.Name Then TestVar = True
Next
End If
If TestVar = False Then 'Добавляем переменную, если в списке её нет
UIdoc.ListSHvariables.AddItem var.Name
'Проверяем есть ли в БД записи по этой переменной (имя, описание, значение, код)
TestBD = False
For j = 2 To LastRow + 1
If Лист15.Cells(j, 1).Value = var.Name Then
UIdoc.ListSHvariables.Column(1, UIdoc.ListSHvariables.ListIndex + 1) = Лист15.Cells(j, 2).Value
UIdoc.ListSHvariables.Column(2, UIdoc.ListSHvariables.ListIndex + 1) = Лист15.Cells(j, 3).Value
UIdoc.ListSHvariables.Column(3, UIdoc.ListSHvariables.ListIndex + 1) = j
TestBD = True
End If
Next
If TestBD = False Then
Лист15.Cells(LastRow + 1, 1).Value = var.Name
LastRow = LastRow + 1
End If
End If
Next
Теперь алгоритм выгрузки комплекта документов выглядит так:
Подготовить шаблон, если это не было сделано раньше.
Положить шаблоны документов комплекта в папку на вход.
Запустить скрипт объявления переменных.
Запустить скрипт создания списка используемых переменных.
Ввести значения для каждой использованной переменной в форму.
Выгрузить комплект.
Разумеется, стоит вспомнить, что значения можно вводить не вручную, и усовершенствовать скрипт. Список переменных надо выгрузить в таблицу, заполнить ее, а уже потом по этой таблице выгружать комплекты документов.
Представленные выше фрагменты кода могут внести сумятицу в понимание общей картины. Как минимум непонятна модель хранения данных и всегда бывают вопросы к именам переменных. Но тут главное — идея. А итоговый результат выглядит так:
Жаль, что в команде не было UI-дизайнера
Рассчитываем вероятности и не боимся формул
Следующая задача, которую душа просит автоматизировать, — вычисление вероятностей. Это очень важный этап при разработке моделей угроз или оценке рисков. Это важно, потому что правильно выстроенный процесс оценки рисков требует повторяемости результатов без привязки к личности эксперта и при этом в адекватный срок. Поэтому мы и разрабатываем методику, по которой разные группы аналитиков должны уметь за разумное время получать сопоставимые результаты.
Дальше пойдет речь о двух универсальных формулах. В зависимости от уровня представления формат выходных данных будет отличаться, но, по сути, математика одна и та же. И требуется она для перехода от одного уровня к другому. Для агрегирования данных аудита в операционный уровень, для агрегирования данных операционного уровня в функциональный, для агрегирования данных функционального уровня в стратегический. На каждом уровне своя динамика и уровень последствий. В следующей части обязательно расскажу подробнее.
А пока вернемся к основам. Нам потребуются две формулы расчета вероятностей: сумма и умножение событий. Даже на такие простые операции существует несколько формул, так что, изучая матчасть, придется изрядно попотеть, если не сделали этого в универе.
Формула 1
Умножение событий А и Б означает, что мы рассматриваем такое событие В, когда одновременно происходят и А, и Б. Может быть и два, и три, и больше событий. Для вычисления нам нужно перемножить вероятности всех одновременных событий.
Часто сталкиваюсь с тем, что коллеги боятся математических формул. Напрасно. Формула — это просто компактная запись длинного текста. Примерно как аббревиатуры, только еще короче. Компактность позволяет быстро представить цельный образ. Большая буква П в формуле означает «произведение». Р — это сокращение от probability, по-русски «вероятность». Формула означает что вероятность произведения событий (то есть их одновременного наступления) равна произведению вероятностей каждого события по отдельности.
На практике это может выглядеть как умножение всех значений вероятностей одновременно происходящих событий из списка, полученного экспертным путем. Например: зайти в казино — 90%, украсть деньги — 50%, убежать с деньгами — 1%. 0,9×0,5×0,01 = 0,0045 — это меньше чем полпроцента.
У парня из третьей истории о величайших ограблениях в фильме »11 друзей Оушена» изначально не было шансов
Формула 2
Вторая формула, которая нам нужна, — сложение событий А и Б. Это ситуация, когда случается хотя бы одно из двух событий. То есть или А, или Б, или оба сразу. Например, нам неважно, куда залез вор — в окно, в дверь или через все доступные ходы. Результат во всех случаях одинаков. Важно, что речь идет о совместных событиях, то есть одно событие не исключает появления другого. Для двух событий формула очень простая.
Николай съел все конфеты Бориса. Лариса и Марина это видели. Вероятность, что Марина расскажет Борису правду про конфеты, — 35%. Есть вероятность в 40%, что Борис узнает правду от Ларисы, и есть вероятность 25%, что Борис догадается сам. Какова вероятность, что Борис узнает правду? Нет, не 100%. Интуитивно мы понимаем, что просмотр 100 фильмов с оценкой 1 из 100 не заменит просмотр шедевра на 100 из 100. А вот с вероятностями не все так очевидно.
Ответ: Борис узнает правду с вероятностью 1 — (1 — 0,25) * (1 — 0,35) * (1 — 0,4) = 0,7075 + 100% = 70%
То есть ситуация, когда Борис ничего не узнает, вполне себе вероятна. Попробуем разобраться геометрически.
При вычислении совокупной площади закрашенной фигуры главное — не посчитать пересечение несколько раз
Вероятность равна совокупной площади двух кругов. Если сложить площади каждого круга, то пересечение кругов будет учтено дважды, поэтому из суммы его и вычитают. Однако в нашем случае таких кругов может быть очень много, больше сотни. И вычитать все повторения будет слишком долго и муторно. Поэтому мы пользуемся математической хитростью.
Площадь незакрашенной части фигуры найти гораздо проще
Полную вероятность наступления будущего мы знаем — она равна единице — на рисунке это площадь прямоугольника. Совокупная площадь всей фигуры — это все, что не белое, то есть если из нее вычесть ситуацию, когда ни одно из событий не наступит, то получим площадь нужной фигуры, что нам и нужно. Для этого воспользуемся предыдущей формулой умножения вероятностей. Умножать будем вероятности ненаступления каждого отдельно взятого события. Для каждого синего кружочка берем белую часть и их между собой перемножаем. Получаем часть прямоугольника, которая всегда остается белой. Вычитаем ее из 1, и вот он результат.
При расчетах в Excel это выглядит примерно так:
Образец построения графа событий на основе таблицы вероятностных оценок атомарных событий. Для наглядности добавлена таблица с иллюстрацией работы описанных формул. В рамках этапа: хотя бы одно событие из. Общая: все этапы одновременно
На иллюстрации можно увидеть цепочку вероятностных оценок по мере развития атаки. То же самое можно сделать с ущербом, но про это в другой раз.
После каждого шага указана вероятность его достижения. То есть если вероятность первого шага 94,99%, а второго — 88,03%, то вероятность, что оба шага будут пройдены, составит 83,62%. Вероятность прохождения первых трех шагов сценария составит 83,61%, а всех семи — 29,92%.
Глядя на схему, можно предположить, что принимать меры снижения вероятности на ранних этапах развития атаки гораздо важнее, ведь это сильнее снижает вероятность. Но не спешите с выводами, ведь ущерб на ранних стадиях, как правило, небольшой, зато в конце, где вероятность минимальна, он резко возрастает.
Вы спросите: почему этих двух формул достаточно? Все дело в том, что любая, даже самая сложная логика может быть сведена к этим двум операциям.
Вероятность атомарных событий может быть получена экспертным путем, из статистики или автоматизированным агрегированием входных данных. Но на практике гораздо удобнее для каждого показателя продумать систему предпосылок в формате аудита ИБ и агрегировать ее данные по аналогичной формуле.
Если вернуться к практике, то именно эти две формулы используются почти для всех вычислений. Например, чтобы получить оценку вероятности рисков нарушения цепочки создания ценности на основании оценки вероятности рисков нарушения бизнес-функций. Первый уровень нужен для общения с владельцами бизнеса, второй — для общения с руководителями. Аналогично можно получить оценку вероятности рисков нарушения бизнес-функций на основании оценки рисков нарушения свойств информации. Этот уровень уже хорошо понятен инженерам ИБ.
Можно пойти еще дальше и построить оценку вероятности рисков нарушения свойств информации на основе оценки влияния на вероятность фактов реализации мер защиты информации. А их в свою очередь разложить на модель достаточности свидетельств.
Идею описывать этапы многие специалисты в ИБ воспринимают как сомнительную. Может, потому, что это очень трудоемкий процесс? В любом случае даже модель в первом приближении дает больше точности, чем полное отсутствие моделей
Последний вариант самый точный, но может занять очень много времени. Оценка вероятности рисков нарушения цепочки создания ценности на основе свидетельств аудита может занять годы. На практике этот уровень используют только для выборочной калибровки результатов более высокого уровня: оценки вероятности на основе данных экспресс-аудита.
Помимо внутренней экспертной калибровки модели, мы используем статистику SOC в качестве внешней калибровки. Теоретически статистику можно копить и самостоятельно, но SOC дает большее покрытие за счет репрезентативности выборки.
Учитывая, что хорошая оценка рисков должна быть дифференцированной, валидной и надежной, калибровка вероятностных моделей — вещь обязательная. Причем на всех уровнях. В конечном итоге именно она позволяет выполнить экспресс-оценку рисков нарушения цепочки создания ценности с высоким коэффициентом надежности уже в первый месяц после старта проекта. По мере развития проекта и получения дополнительных данных надежность оценки возрастает.
Пара слов об оценке последствий
Вторая составляющая оценки рисков — оценка последствий. Для ее проведения нам нужен реестр активов, состоящий из реестра ИТ-активов, перечня процессов и реестра нематериальных активов. В отношении каждого типа активов формулы оценки стоимости в деньгах будут свои. А вот уже агрегация оценки влияния предпосылок и мер будет точно такая же, как система предпосылок для оценки вероятности. Про эти вещи поговорим уже в следующий раз: количественные показатели, весовые коэффициенты важности, объектный состав, динамика изменения стоимости и т. п.
Сейчас отмечу, что для дальнейшей оценки принципиальной разницы между качественной и количественной оценкой с точки зрения расчета нет. Если быть совсем точным, то подобный подход считается смешанным, что позволяет не попадать в ловушки количественной оценки.
Подобно оценке вероятности реализации, мы можем составить модель влияния на объект. Выглядеть это будет точно так же, но вершин в графе будет заметно больше, чем в оценке вероятностей.
Выгрузка расчетов
Возвращаемся на землю (к практике). Для автоматизации оценки требуется решить еще две задачи: как собрать входные данные для скрипта и в каком формате этот скрипт будет выгружать результат.
При сборе исходных данных для оценки рисков в качестве объекта оценки мы описываем системы, а они состоят из элементов, связей и целей, и все формализованные выгрузки можно свести к двум типам:
Переменные. При их помощи мы заполняем текстовые переменные, включая цели (о правильной иерархии целей тоже в следующий раз). Тут все просто: отдельный лист с таблицей значений переменных по проекту.
Таблицы:
Перечни элементной базы системы (перечень угроз, перечень объектов, перечень событий и т. п.). Иногда их называют «справочники». В Excel на это можно отвести по отдельному листу на каждый тип объектов.
Маски для справочников. В справочнике может содержаться сколько угодно записей, а в проект попадает лишь некоторое их число. Маска определяет, какие именно. В Excel все маски можно хранить на одном листе.
Описание связей между различными справочниками: как влияет мера на угрозу, как влияет нарушитель на угрозу, как влияет мера на ущерб и т. д. Обычно их называют «маппинги». В Excel на это лучше отводить отдельные листы на каждый тип связи.
Вычисления. Точнее, таблицы для проведения вычислений.
Представления. Поскольку выгрузку из Excel в Word проще всего сделать, выделив диапазон и скопировав его, таблицу для копирования лучше подготовить заранее. По сути, в задаче выгрузки данных представления могут заменить все остальные таблицы.
Выгрузку переменных мы разобрали в прошлый раз. Таким образом, остаются лишь таблицы. Для их выгрузки в статическом шаблоне нужно расставить закладки в конец таблицы (Вставка, Ссылки, Закладки). Именно в это место будут выгружены данные из Excel. Чтобы видеть закладки, как на скриншоте ниже, нужно установить параметр «Показывать закладки» в разделе «Показывать содержимое документа» раздела «Дополнительно» меню параметров Word.
Хитрость в том, чтобы не заморачиваться с оформлением. Поэтому шапка уже есть, и она готова распространить свой стиль на любое число добавленных строк
Для замены закладки на таблицу используем следующий код:
'Выбираем нужный документ
If objWrdApp Is Nothing Then
Set objWrdApp = CreateObject("Word.Application")
Set objWrdDoc = objWrdApp.Documents.Open(sNewFileName)
objWrdApp.Visible = True
End If
'копируем диапазон
Range(Sheets(ListData).Cells(TopY, TopX), Sheets(ListData).Cells(mLastRow + 1, mLastColumn)).Copy
'вставляем на место закладки
objWrdDoc.Bookmarks(ИМЯЗАКЛАДКИВДОКУМЕНТЕ).Range.PasteExcelTable LinkedToExcel:=False, WordFormatting:=False, RTF:=True
Оказалось, что привести пример используемого кода очень сложно. За время жизни инструмента накопилось очень много неприглядных костылей, с которыми вам тоже придется столкнуться. Уничтожение открытых документов, блокирование приложений Office, работа в фоновом режиме и т. п. Основная хитрость в том, что мы выгружаем таблицу в конец существующей. Word их соединяет вместе и распространяет стиль оформления, что позволяет нам не заморачиваться над красотой.
И напоследок
При подготовке статьи в первую очередь хотелось уделить внимание простым вещам, которые упростят жизнь инженера ИБ. И в то же время намекнуть на что-то интересное, что открывает автоматизация. Надеюсь, это удалось. Как минимум идей и обещаний дано достаточно: иерархия рисков, оценка последствий, иерархия целей.
В следующей части мы продолжим разбирать простые приемы автоматизации и все ближе подбираться к тематике «SGRC на коленке». Разумеется, наша iRiskA (intellectual Risk Assessment) не заменит SGRC, но интеграция уже напрашивается. А еще постараюсь учесть пожелания, если таковые будут в комментариях.
На этом пока все. До встречи в будущих постах.