ラック・セキュリティごった煮ブログ

セキュリティエンジニアがエンジニアの方に向けて、 セキュリティやIT技術に関する情報を発信していくアカウントです。

【お知らせ】2021年5月10日~リニューアルオープン!今後はこちらで新しい記事を公開します。

株式会社ラックのセキュリティエンジニアが、 エンジニアの方向けにセキュリティやIT技術に関する情報を発信するブログです。
(編集:株式会社ラック・デジタルペンテスト部)

Neo4jでお手軽に検索環境を構築する


注意事項

Neo4jは、Apache Log4jを使用しているため、評価時のバージョン(Neo4j version 4.2以降)により、脆弱性(CVE-2021-44228)の影響を受ける可能性があります。評価時のバージョンをご確認の上、以下のサイトから詳細情報をご確認ください。

Apache Log4j Security Vulnerability (CVE-2021-44228) and Neo4j
https://neo4j.com/security/log4j/

・・・

デジタルペンテストサービス部の安田 良明です。
今回は、組織が保有する様々なデータを高速かつリアルタイムに分析する際に人気のあるグラフデータベースの1つである、「Neo4j Desktop」の構築方法と、基本的なグラフデータの検索方法について解説します。 本記事では「Neo4j Desktop」の導入方法とインストール後に作成されるサンプルグラフデータベースに対する基本的なデータ検索方法だけ解説し、「Neo4j Desktop」の具体的な操作方法については触れません。

なぜグラフデータベースが注目されているのか

データベースと言っても用途別に様々なモデルが存在します。代表的なデータベースモデルとして、階層型データベース、ネットワークデータベース、リレーショナルデータベース、オブジェクト指向データベース、そしてグラフデータベースがあります。その中で、大多数の組織ではリレーショナルデータベースを採用することが多いと思います。理由の1つとして、列と行で構成される一連のテーブルでデータを構造化できますので、データの活用がしやすいことや、各部門が保有するテーブルを連携することで情報を結合することができるため、組織全体のデータ集計や分析環境を実現できます。ただ、リレーショナルデータベースを使い続けていくと、データが増えていくことでテーブル同士の関連性が複雑となりデータベース設計やアクセス制御の実装が困難になることや、目的の処理を行う際、テーブルの結合数が増えることで応答性能が低下することが課題となることがあります。

そのような課題を解決する手段の1つとして、グラフデータベースが注目を浴びています。グラフデータベースは、ネットワークデータベースの構造を利用して、ノードおよびノード間の関係性(リレーション)を扱うことができるため、データ同士の関係性を高速に処理することができます。また、リレーショナルデータベースのような複雑なテーブル定義を行う必要がないことや、テーブル同士を繰り返し結合することで処理に時間がかかる問題を解決することが期待できます。このようなデータモデルの特徴のために、例えば映画のタイトルから、どの俳優たちがどの映画に出演したかのような膨大なデータでかつ複雑な繋がりをもつ関係性も、簡単にデータベース実装が可能です。ただし、グラフデータベースが、リレーショナルデータベースに置き換わるものではありません。グラフデータベースはリレーショナルデータベースが得意とするデータ全体に対するデータ集計処理や統計分析処理などには向いていないため、あくまでもグラフデータ構造を扱うには、グラフデータベースを使用するのが適切ということに留意してください。

f:id:lac_devblog:20211216101302p:plain
例:俳優と映画の関係を表す際の設計(ノード、リレーション、プロパティ)
f:id:lac_devblog:20211216101329p:plain
例:Neo4j による俳優と映画の関係を表したグラフデータベース

グラフデータベースのユースケース

最近ではOSINTツールで有名な「Maltego」がインターネット上のコンピュータ環境をネットワークとしてモデル化する際にグラフデータベースを使用しています。グラフデータベースを使用すると、どんな構造や概念でも、どんなに単純であろうと複雑であろうと、互いに何らかの関係を持つ一連の構成要素に分解することができます。他にも、Neo4jのサイトでは、グラフデータベースのユースケースとして、不正検知や不正分析、データプライバシー・リスクやコンプライアンス対応、サプライチェーンマネジメント、ソーシャルメディア分析が紹介されています。組織名が公開されている(NASA、DHS、U.S. Army、MITRE、Lockheed Martin等)ユースケースも見ることができます。

ユースケース
https://neo4j.com/use-cases/

Neo4j Desktopをインストールする

グラフデータベースを使うためには環境が必要となりますので、Windows10でグラフDB Neo4jのインストール方法を解説します。今回インストールするエディションは、開発に必要なものが全て含まれている「Neo4j Desktop 1.4.11」です。Neo4jにはいくつかのエディションがありますが、インストールウィザード付きでサンプルのグラフデータベースも使えるため、うまくインストールできない、データベースが構築できないということを回避できます。また、すぐに試してみたい!という方はクラウド環境の「Neo4j SandBox」がおススメです。

Neo4jのダウンロード
Neo4j ダウンロードセンター

Neo4jクラウド
Neo4J SandBox

最初に、Windows版のインストーラ(Neo4j Desktop Setup 1.4.11.exe)のダウンロードを行います。ダウンロードサイトにアクセスし、「Neo4j Desktop(exe)」をクリックします。
f:id:lac_devblog:20211216101840p:plain
必要事項を入力し、「Download Desktop」をクリックします。
f:id:lac_devblog:20211216101907p:plain
ダウンロードを開始すると、Activation keyが表示されますので、テキスト等にコピーします。
f:id:lac_devblog:20211216101930p:plain
ダウンロードが終了したら、「Neo4j Desktop Setup 1.4.11.exe」をダブルクリックし、「Neo4j Desktop」のインストールを開始します。以下の手順でインストールを進めます。

インストールオプションの選択:どのユーザーにインストールするか指定する項目です。今回は「現在のユーザーのみにインストールする」を選択し、「次へ」をクリックします。

インストール先を選んでください:インストール先を指定する項目です。特にこだわりがなければ、そのまま「インストール」をクリックしてインストールを開始しましょう。

Neo4j Desktop セットアップウィザードは完了しました。という画面が表示されればインストールは成功です。インストールに成功したら、「Neo4j Desktop」 を起動してみましょう。「Neo4j Desktopを実行」にチェックが入っていることを確認して、「完了」をクリックします。

「Neo4j Desktop」初回起動時に、Windows Defender等セキュリティサービスによる警告が発生する可能性がありますので、組織のルールに従い設定を行い、「アクセスを許可する」をクリックしてください。

f:id:lac_devblog:20211216102022p:plain
License Agreement:「Neo4j Desktop」初回起動時にライセンスへの同意を確認する画面が表示されます。内容を確認し、「I Agree」をクリックして次に進みましょう。

Please Choose path where you want to store application data:アプリケーションの保存場所を指定します。特にこだわりがなければ、そのまま「Confirm」をクリックして次に進みましょう。今回は特定のユーザーを指定してインストールしたため、「C:\Users\%username%\.Neo4jDesktop\.Neo4jDesktop」が保存場所となります。

Software Registration:事前にコピーした Activation Key を「Software Key」に入力し、「Activate」をクリックして次に進みましょう。

Anonymous Reporting:プロダクト使用状況等データ収集の許可を求める項目です。項目を確認したい場合、「Review Settings」をクリックします。後から、「settings」から変更することも可能なので、特にこだわりがなければ、「OK」をクリックすると、「Neo4j Desktop」が起動します。

Neo4j Desktopを使用する(データ検索)

まずは、「Neo4j Desktop」の基本的なデータ検索を学ぶために「Example Project」に登録されているサンプルデータベース「Movie DBMS」にアクセスしましょう。初期状態で、既にこのデータベースは起動されていますが、何らかの理由で起動していない場合、データベース名の右側にカーソルを合わせて「スタート」をクリックするとデータベースを起動できます。
f:id:lac_devblog:20211216102123p:plain
サンプルデータベースにアクセスするために、「about-movies.neo4j-browser-guide」の右側にカーソルを合わせて「Open」をクリックします。クリック後、Neo4jデータベースにアクセスするための、「Neo4j Browser」が開きます。
f:id:lac_devblog:20211216102144p:plain
「Neo4j Browser」を最初に開いたときの画面です。このガイド(1~14ページ)を使用しながら基本的な操作を学んでいきましょう。まずは、1ページ目に、「Movie Graph」の説明があります。俳優や映画のデータがグラフデータベースとして既に登録されていることや、このガイドを見ることで、「MATCH」、「CREATE」等グラフデータを扱うための「Cypher Query Language」を学べることがわかります。Neo4jでは、グラフデータを処理する際、Cypher を使う必要がありますので、サンプルデータに対して、データ検索を行ってみます。Movie Graph の説明がある画面の右側をクリックすることで、2ページ目に移ります。
f:id:lac_devblog:20211216102201p:plain
2ページ目のガイドを見ましょう。ここではCypherクエリ言語「MATCH」の使い方が紹介されています。「MATCH」を使う事でグラフデータから特定のデータを検索することができます。このガイドでは、画面中央に「Find a person named」の表示の下に「Tom Hanks」が既に入力されています。そして、すぐ下の箇所に、MATCHを使用したコードブロックが準備されていますので、「MATCH (a:Person {name:'Tom Hanks'}) RETURN a) RETURN a」の部分をクリックしましょう。
f:id:lac_devblog:20211216102223p:plain
クリックすると、上部のエディターにクエリが入力されます。クエリを実行するため、右側の再生ボタンをクリックします。
f:id:lac_devblog:20211216102237p:plain
クエリの結果、「Tom Hanks」のノードが検索されました。「Tom Hanks」の検索結果をクリックすると右側にノードのプロパティが表示されます。さらに、検索結果の「Tom Hanks」のノードをダブルクリックしてみましょう。
f:id:lac_devblog:20211216102447p:plain
画面には、「Tom Hanks」が出演した映画のノードが関係性(ACTED_IN)を示す矢印に紐ついて検索されました。この結果を見ることで、簡単に「Tom Hanks」が出演したすべての映画のタイトルが判明します。
f:id:lac_devblog:20211216102510p:plain
さらに、「Tom Hanks」が出演した映画のタイトル「Cloud Atlas」のノードをダブルクリックしてみましょう。映画「Cloud Atlas」の出演者や監督等が検索結果として表示されます。このように検索結果の最初のノードを起点として、繰り返しクリックしていくことで、膨大なデータの中から、可視化されたデータと直感を頼りに、探したいものを短時間で探すことが期待できます。最近のビデオオンデマンドサービスでは、俳優が出演した映画のタイトルが瞬時に表示されますが、その裏側の仕組みとしてグラフデータベースが使用されているかもしれませんね。データ検索の練習として、他の俳優名として、「Keanu Reeves」や「Charlize Theron」でも検索してみましょう。
f:id:lac_devblog:20211216102530p:plain

もう1つ、基本的な検索方法を紹介します。先ほどは、グラフデータから特定の名前(name)を検索しましたが、グラフデータからすべての俳優名のリストを出力したいということもあるかもしれません。その際、どのように俳優名を検索すればよいのでしょうか。実は、グラフモデルでは、ラベルをノードに付与することで、ノードをグループ化することができます。実際にノードを確認してみましょう。まず、「Tom Hanks」のノードに「Person」という青い表示ラベルがついていることがわかります。これが、俳優をグループ化するために付与されたラベル「Person」です。同様に、「Cloud Atlas」のノードには、「Movie」というオレンジ色のラベルがついています。これが、映画をグループ化するために付与されたラベル「Movie」です。

それでは、このラベル「Person」を使用し、グラフデータベースから俳優名一覧を検索します。エディターに入力されているMATCHクエリ文から、{name:'Tom Hanks'} を削除して検索します。

MATCH (a:Person {name:'Tom Hanks'}) RETURN a
↓
MATCH (a:Person) RETURN a

画面には、ラベル「Person」でグループ化されたすべてのノードが検索結果として表示されます。これで、俳優名一覧を確認することができます。

f:id:lac_devblog:20211216102811p:plain
最後に、俳優名一覧の結果をCSVファイルとしてエクスポートします。エクスポート機能は、画面右上のダウンロードアイコンから使用できます。グラフの検索結果は、CSVJSONPNGSVG で出力可能です。今回は、「Export CSV」を選択し、任意のフォルダにダウンロードしてください。
f:id:lac_devblog:20211216102831p:plain
CSVファイルとしてグラフデータをエクスポートできますので、リストの作成や報告書の作成にデータを活用できます。また、JSON形式にも対応しています。
f:id:lac_devblog:20211216102855p:plain
f:id:lac_devblog:20211216102918p:plain


まとめ

本記事ではNeo4jを使用したグラフデータベースの特徴や使用方法について解説しました。組織のデータ活用の充実化に役立てますと幸いです。