Идём по киберследу: Анализ защищенности Active Directory c помощью утилиты BloodHound — страница 6 из 46

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


Рис. 2.46. Изменение внешнего вида узла


Масштабирование

При выводе информации в виде графа в правом нижнем углу появляется управление масштабированием графа со следующими функциями:

● увеличение;

● уменьшение;

● выравнивание и отцентровка всего графа.


Рис. 2.47. Управление масштабом графа

Установка плагинов

Neo4j имеет большое количество различных плагинов, которые позволяют улучшить работу с запросами. В книге используется только базовый APOC, поэтому рассмотрим установку плагинов на его примере.

Зайдем на официальный GitHub neo4j с плагинами[10] и скачаем двоичный

jar-файл apoc-4.4.0.1-all.jar.
Поместим его в папку
$NEO4J_HOME/plugins.
В моем случае это
C: \Tools\Neo4j\plugins.

Информация

Поскольку APOC использует внутренние API neo4j, необходимо использовать правильную версию APOC для вашей установки neo4j. APOC использует согласованную схему управления версиями:

.
версия. Завершающая часть номера версии
будет увеличиваться с каждым новым выпуском APOC.

Если сейчас мы перезагрузим neo4j и попытаемся воспользоваться процедурами из плагина, то получим ошибку.


Рис. 2.48. Ошибка некорректной настройки процедур


Чтобы исправить ее, нужно открыть файл конфигурации

$NEO4J_HOME/conf/neo4j.conf
на редактирование. Убрать комментарий со строки
dbms.directories.plugins=plugins
, затем найти строку
dbms.security.procedures.unrestricted=…
, после нее добавить строку
dbms.security.procedures.unrestricted=algo.*, apoc.*
и перезапустить службу:

C: \Tools\Neo4j\bin\neo4j.bat restart

В дальнейшем мы столкнемся с процедурами из этого плагина, а пока перейдем к другой теме.

Создание резервных копий и восстановление

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

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

$NEO4J_HOME/bin
и выполним команду:

.\neo4j.bat stop

Если neo4j запущен в режиме консоли, то можно нажать Сtrl+С или просто закрыть окно.

Теперь создадим резервную копию текущей базы данных, указав имя базы данных

neo4j
и путь до файла резервной копии:

.\neo4j-admin.bat dump -database="neo4j" -to="c: \tools\neo4j.dump"

После успешного завершения создания резервной копии запустим neo4j:

.\neo4j.bat start


Рис. 2.49. Создание резервной копии


Процедура восстановления похожа на создание копий, изменяется только команда с

dump
на
load
. Останавливаем neo4j:

.\neo4j.bat stop

Выполняем команду восстановления данных из дампа, указав полный путь до файла дампа, созданного ранее:

.\neo4j-admin.bat load -database="neo4j" -from="c: \tools\neo4j.dump" -force

Стоит обратить внимание на использование ключа

-force
: в случае его отсутствия neo4j сообщит, что база данных
neo4j
уже существует.


Рис. 2.50. Сообщение об ошибке


После успешного восстановления из резервной копии запустим neo4j:

.\neo4j.bat start


Рис. 2.51. Успешное восстановление данных


03. Дрессируем собаку. Язык запросов Cypher

SharpHound, BloodHound и neo4j – это инструменты для сбора, хранения и визуализации информации. Основная магия – это язык запросов Cypher. В интернете можно найти уже готовые запросы и использовать их, но в дополнение к этому хорошо бы разбираться, как они работают, и уметь разрабатывать их самому. В этом разделе мы рассмотрим основные принципы построения запросов и синтаксис языка запросов Cypher.

Внимание

Данный раздел содержит только необходимую для работы с BloodHound информацию. Для более глубокого изучения языка запросов Cypher стоит обратиться к официальной документации[11].

Обычно результаты запросов представляются в виде графов, что удобно для обнаружения связей между объектами. В некоторых случаях данные могут представляться в виде таблиц, что удобно для анализа данных. В BloodHound объекты домена являются вершинами (узлами) графа, а отношения (связи) между этими объектами – ребрами. Также в neo4j узлы графа маркируются меткой (

label
) по общему принципу. Это позволяет делать выборку только из необходимой группы объектов. Названия связей определяются по типу (
type
).

Совет

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

Основные принципы

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


Рис. 3.1. Простой граф


Каждый узел в neo4j обладает определенными параметрами:

● 

Идентификатор (ID
) – это обязательный параметр порядкового номера узла.

● 

Метка (Label)
 – необязательный, но важный параметр, позволяет объединять узлы по определенному признаку. Например,
User
или
Computer
.

● 

Свойства (Properties)
 – необязательный параметр, например
objectid
или
distingueshedname
. Данный параметр придает каждому узлу индивидуальность. На основании свойств можно сужать выборку данных или получать узлы, имеющие общие свойства.

Связь также имеет свои параметры:

● 

Идентификатор (ID)
 – обязательный параметр порядкового номера связи.

● 

Название (Type)
 – не обязательный, но важный параметр, позволяет объединять узлы по определенному признаку. Например,
MemberOf
или
GenericAll.

● 

Свойства (Properties)
 – необязательный параметр. Данный параметр придает каждой связи индивидуальность. В BloodHound связи обладают разными свойствами, например
isacl
и
isinherited
. В дальнейшем мы тоже будем добавлять различные свойства связям.

Общий вид запроса выглядит следующим образом:


Рис. 3.2. Общий вид запроса


В качестве операторов могут выступать:

● 

CREATE
и
MERGE
 – создание нового элемента;

● 

MATCH
 – выполнение выборки;

● 

RETURN
 – возврат результата (может быть как в начале, так и в конце запроса);

● 

DELETE
 – удаление узла или связи (может быть как в начале, так и в конце запроса).

Другие операторы:

● 

SET
и
REMOVE
 – добавление или удаление свойств;

● 

WHERE
 – добавление условия к шаблону.

Внимание

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

Возвращаясь к рисунку 3.2, получаем следующий формат: на первом месте идет оператор

MATCH
,
MERGE
и др., следующим – начальный узел, затем название связи (опционально), конечный узел, условия (опционально), и завершается запрос оператором
RETURN
. В некоторых случаях оператор
RETURN
может опускаться, например при добавлении свойства узлу, или заменяться оператором
WITH
, если необходимо изменить область видимости.

Стрелки определяют направление и могут быть направлены как слева направо, так и в обратную сторону. Изменение направления стрелок может быть полезно при составлении запроса. Например, мы хотим узнать, на каких компьютерах у пользователя есть сессия. По правилам BloodHound связь

HasSession
устанавливается от компьютера к пользователю.


Рис. 3.3. Стрелка слева направо


Этот запрос можно прочитать как «есть ли на компьютерах сессия пользователя

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


Рис. 3.4. Стрелка справа налево


Два шаблона абсолютно идентичны, разница только в интерпретации вопроса и удобстве чтения.