Общая информация о графе показывает перечень узлов с метками и связей с типами, а также общее количество узлов и связей. При нажатии на метку или тип связи появляется контекстное меню, в котором можно изменить цвет, размер и подпись к узлу или связи.
Рис. 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. Стрелка справа налево
Два шаблона абсолютно идентичны, разница только в интерпретации вопроса и удобстве чтения.