序章

Bro は、オープンソースのネットワーク分析フレームワークおよびセキュリティ監視アプリケーションです。 OSSECosqueryの最高の機能のいくつかを1つの素晴らしいパッケージにまとめています。

Broは、シグニチャベースと動作ベースの両方の分析と検出を実行できますが、実行する内容の大部分は動作ベースの分析と検出です。 Broの機能の長いリストには、次の機能が含まれています。

  • SSHやFTPなどのネットワークサービスに対するブルートフォース攻撃を検出する
  • HTTPトラフィックの監視と分析を実行します
  • インストールされているソフトウェアの変更を検出する
  • SSL/TLS証明書の検証を実行します
  • SQLインジェクション攻撃を検出する
  • すべてのファイルのファイル整合性監視を実行します
  • アクティビティ、概要、クラッシュレポート、アラートをメールで送信する
  • 都市レベルへのIPアドレスのジオロケーションを実行します
  • スタンドアロンモードまたは分散モードで動作する

Broは、ソースから、またはパッケージマネージャーを介してインストールできます。 ソースからのインストールはより複雑ですが、ジオロケーションライブラリがコンパイルされる前にインストールされている場合、IPジオロケーションをサポートする唯一の方法です。

Broをインストールすると、brobroctlなどの追加コマンドをシステムで使用できるようになります。 broは、トレースファイルの分析とライブトラフィック分析に使用できます。 broctlは、スタンドアロンまたは分散型のBroインストールを管理するために使用されるインタラクティブなシェルおよびコマンドラインユーティリティです。

この記事では、スタンドアロンモードでUbuntu16.04にソースからBroをインストールします。

前提条件

この記事を完了するには、次のものが必要です。

  • このUbuntu16.04の初期セットアップガイドを使用して構成された、ファイアウォールとsudo権限を持つ非rootユーザーアカウントを持つUbuntu16.04サーバー。 追加のRAMを必要とするいくつかのタスクを実行するため、少なくとも1GBのメモリを備えたサーバーを起動する必要があります。
  • このPostfixonUbuntu 16.04ガイドを使用して、サーバーに送信専用メール転送エージェント(MTA)としてインストールされたPostfix。 Broがメールアラートを送信するには、PostfixのようなMTAをインストールする必要があります。 1つなしで実行されますが、電子メールは送信されません。

ステップ1—依存関係のインストール

Broをソースからインストールする前に、その依存関係をインストールする必要があります。

まず、パッケージデータベースを更新します。 パッケージをインストールする前にこれを行わないと、パッケージマネージャーエラーが発生する可能性があります。

  1. sudo apt-get update

Broの依存関係には、 Libpcap OpenSSL BIND8などの多数のライブラリとツールが含まれます。 BroControlには、Python2.6以降が追加で必要です。 ソースからBroを構築しているため、 CMake SWIG Bison 、C /C++コンパイラなどの追加の依存関係が必要になります。

必要なすべての依存関係を一度にインストールできます。

  1. sudo apt-get install bison cmake flex g++ gdb make libmagic-dev libpcap-dev libgeoip-dev libssl-dev python-dev swig2.0 zlib1g-dev

そのインストールが完了したら、次のステップは、BroがIPジオロケーションに使用するデータベースをダウンロードすることです。

ステップ2—GeoIPデータベースをダウンロードする

ここでは、BroがIPアドレスのジオロケーションに依存するGeoIPデータベースをダウンロードします。 IPv4とIPv6データベースを含む2つの圧縮ファイルをダウンロードし、解凍してから、/usr/share/GeoIPディレクトリに移動します。

MaxMindから無料のレガシーGeoIPデータベースをダウンロードしています。 その後、新しいIPデータベース形式がリリースされましたが、Broはまだサポートしていません。

IPv4データベースとIPv6データベースの両方をダウンロードします。

  1. wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz
  2. wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCityv6-beta/GeoLiteCityv6.dat.gz

両方のファイルを解凍します。これにより、GeoLiteCity.datおよびGeoLiteCityv6.datという名前の2つのファイルが作業ディレクトリに配置されます。

  1. gzip -d GeoLiteCity.dat.gz
  2. gzip -d GeoLiteCityv6.dat.gz

次に、適切なディレクトリに移動し、プロセスで名前を変更します。

  1. sudo mv GeoLiteCity.dat /usr/share/GeoIP/GeoIPCity.dat
  2. sudo mv GeoLiteCityv6.dat /usr/share/GeoIP/GeoIPCityv6.dat

GeoIPデータベースが整ったら、次のステップでBro自体をインストールできます。

ステップ3—ソースからBroをインストールする

ソースからBroをインストールするには、最初にGitHubからリポジトリのクローンを作成する必要があります。

GitはデフォルトでUbuntuにすでにインストールされているため、次のコマンドでリポジトリのクローンを作成できます。 ファイルはbroという名前のディレクトリに配置されます。

  1. git clone --recursive git://git.bro.org/bro

プロジェクトのディレクトリに移動します。

  1. cd bro

Broの構成を実行します。これには1分もかかりません。

  1. ./configure

次に、makeを使用してプログラムをビルドします。 サーバーによっては、これには最大20分かかる場合があります。

  1. make

実行中、ほとんどの出力行の先頭に完了率が表示されます。

完了したら、Broをインストールします。これには1分もかかりません。

  1. sudo make install

Broは/usr/local/broディレクトリにインストールされます。

次に、/usr/local/bro/binディレクトリを$PATHに追加する必要があります。 グローバルに利用できるようにするための最善の方法は、/etc/profile.dディレクトリの下のファイルでパスを指定することです。 そのファイルを3rd-party.shと呼びます。

お気に入りのテキストエディタで3rd-party.shを作成して開きます。

  1. sudo nano /etc/profile.d/3rd-party.sh

次の行をコピーして貼り付けます。 1行目は説明コメントで、2行目は/usr/local/bro/binがシステム上のすべてのユーザーのパスに追加されていることを確認します。

/etc/profile.d/3rd-party.sh
# Expand PATH to include the path to Bro's binaries

export PATH=$PATH:/usr/local/bro/bin

ファイルを保存して閉じ、sourceで変更を有効にします。

  1. source /etc/profile.d/3rd-party.sh

ただし、古い設定のアーティファクトは存続する傾向があるため、さらにログアウトして再度ログインし、パスが正しく読み込まれることを確認できます。

Broがインストールされたので、Broを正しく実行するためにいくつかの構成変更を行う必要があります。

ステップ4—Broの構成

このステップでは、Broが正しく機能するように、いくつかのファイルをカスタマイズします。 すべてのファイルは/usr/local/bro/etcディレクトリにあり、次のとおりです。

  • node.cfg。これは、監視するノードを構成するために使用されます。
  • networks.cfg。これには、ノードにローカルなCIDR表記のネットワークのリストが含まれています。
  • broctl.cfg。これは、メール、ロギング、およびその他の設定用のグローバルBroControl構成ファイルです。

各ファイルで何を変更する必要があるかを見てみましょう。

監視するノードの構成

Broが監視するノードを構成するには、node.cfgファイルを変更する必要があります。

箱から出して、Broはスタンドアロンモードで動作するように構成されています。 これはスタンドアロンインストールであるため、このファイルを変更する必要はありませんが、値が正しいことを確認することをお勧めします。

編集のためにファイルを開きます。

  1. sudo nano /usr/local/bro/etc/node.cfg

broセクションで、interfaceパラメーターを探します。 デフォルトではetho0であり、これはUbuntu16.04サーバーのパブリックインターフェイスと一致する必要があります。 そうでない場合は、必ず更新してください。

/usr/local/bro/etc/node.cfg
[bro]
type=standalone
host=localhost
interface=eth0

終了したら、ファイルを保存して閉じます。 次に、ノードが属するプライベートネットワークを構成します。

ノードのプライベートネットワークの構成

networks.cfgファイルは、ノードが属するIPネットワークを構成する場所です(つまり、 監視するサーバーのインターフェースのIPネットワーク)。

開始するには、ファイルを開きます。

  1. sudo nano /usr/local/bro/etc/networks.cfg

デフォルトでは、ファイルには、指定方法の例としてすでに構成されている3つのプライベートIPブロックが含まれています。

/usr/local/bro/etc/networks.cfg
# List of local networks in CIDR notation, optionally followed by a
# descriptive tag.
# For example, "10.0.0.0/8" or "fe80::/64" are valid prefixes.

10.0.0.0/8          Private IP space
172.16.0.0/12       Private IP space
192.168.0.0/16      Private IP space

既存の3つのエントリを削除してから、独自のエントリを追加します。 ip addr showを使用して、サーバーインターフェイスのネットワークアドレスを確認できます。 networks.cfgの最終バージョンは次のようになり、ネットワークアドレスが次のように置き換えられます。

例/usr/local/bro/etc/networks.cfg
203.0.113.0/24		  Public IP space
198.51.100.0/24         Private IP space

編集が終了したら、ファイルを保存して閉じます。 次に、メールとログの設定を構成します。

メールとログの設定を構成する

broctl.cfgファイルは、BroControlが電子メールとロギングの責任を処理する方法を構成する場所です。 ほとんどのデフォルトは変更する必要はありません。 ターゲットのメールアドレスを指定するだけです。

編集のためにファイルを開きます。

  1. sudo nano /usr/local/bro/etc/broctl.cfg

ファイル上部のMailOptions セクションで、 MailTo パラメーターを探し、管理している有効な電子メールアドレスに変更します。 すべてのBro電子メールアラートはそのアドレスに送信されます。

/usr/local/bro/etc/broctl.cfg
. . .
# Mail Options

# Recipient address for all emails sent out by Bro and BroControl.
MailTo = [email protected]
. . .

編集が終了したら、ファイルを保存して閉じます。

これがBroに必要なすべての構成であるため、BroControlを使用してBroを起動および管理できます。

ステップ5—BroControlを使用したBroの管理

BroControlは、Broのインストールの管理(サービスの開始と停止、Broの展開、およびその他の管理タスクの実行)に使用されます。 これは、コマンドラインツールであると同時にインタラクティブシェルでもあります。

broctlsudo /usr/local/bro/bin/broctlで呼び出されると、インタラクティブシェルが起動します。

Output
Welcome to BroControl 1.5-21 Type "help" for help. [BroControl] >

exitコマンドを使用して、対話型シェルを終了できます。

シェルから、任意の有効なBroコマンドを実行できます。 同じコマンドを、シェルを呼び出さずにコマンドラインから直接実行することもできます。 コマンドラインでコマンドを実行すると、broctlコマンドの出力を標準のLinuxコマンドにパイプできるため、多くの場合、より便利なアプローチになります。 このステップの残りの部分では、コマンドラインでbroctlコマンドを呼び出します。

まず、broctl deployを使用してBroを起動し、BroControlとBroに必要なファイルがステップ4の構成に基づいて最新の状態になっていることを確認します。

  1. sudo /usr/local/bro/bin/broctl deploy

また、構成ファイルまたはスクリプトに変更が加えられるたびに、このコマンドを実行する必要があります。

:Broが起動しない場合、コマンドの出力は原因を示唆します。 たとえば、MTAがインストールされている場合でも、次のエラーメッセージが表示される場合があります。

Output
bro not running (was crashed) Error: error occurred while trying to send mail: send-mail: SENDMAIL-NOTFOUND not found starting ... starting bro ...

解決策は、BroControl構成ファイル/usr/local/bro/etc/broctl.cfgを編集し、メールオプションセクションの最後にSendmailのエントリを追加することです。

/usr/local/bro/etc/broctl.cfg
. . .
# Added for Sendmail
SendMail = /usr/sbin/sendmail

###############################################
# Logging Options
. . .

次に、sudo /usr/local/bro/bin/broctl deployを使用してBroを再デプロイします。

statusコマンドを使用して、Broのステータスを確認できます。

  1. sudo /usr/local/bro/bin/broctl status

出力は次のようになります。 runningの他に、ステータスはcrashedまたはstoppedにすることもできます。

Output
Name Type Host Status Pid Started bro standalone localhost running 6807 12 Apr 05:42:50

Broを再起動する必要がある場合は、sudo /usr/local/bro/bin/broctl restartを使用できます。

broctl restartbroctl deployは同じではありません。 構成設定を変更したり、スクリプトを変更したりした後、後者を呼び出します。 サービス全体を停止して再起動する場合は、前者を呼び出します。

次に、Broサービスをより堅牢にcronジョブを設定してみましょう。

手順6—Broのcronを構成する

BroにはSystemdサービス記述子ファイルはありませんが、cronスクリプトが付属しており、有効にすると、クラッシュした場合にBroを再起動し、十分なディスク容量の確認や期限切れのログファイルの削除などの他のタスクを実行します。

Broのcronコマンドはそのまま使用できますが、実際にスクリプトをトリガーするcronジョブをインストールする必要があります。 まず、/etc/cron.dにBroのcronパッケージファイルを追加する必要があります。 慣例に従い、そのファイルをbroと呼ぶので、作成して開きます。

  1. sudo nano /etc/cron.d/bro

次に、ファイルにコピーして貼り付けるエントリを示します。 Broのcronを5分ごとに実行します。 Broがクラッシュしたことを検出すると、Broを再起動します。

/etc/cron.d/bro
*/5 * * * * root /usr/local/bro/bin/broctl cron

より頻繁に実行したい場合は、上記のコマンドで5を変更できます。

終了したら、ファイルを保存して閉じます。

cronジョブがアクティブ化されると、統計ファイルのディレクトリが/usr/local/bro/logs/statsに作成されたことを示す電子メールが届きます。 Broは実際にクラッシュする必要があることに注意してください(つまり これが機能するためには、不用意に停止されます)。 BroControlのstopを使用してBroを正常に停止すると、機能しません。

それが機能することをテストするには、サーバーを再起動するか、Broプロセスの1つを強制終了する必要があります。 再起動ルートを使用すると、サーバーが再起動プロセスを完了してから5分後にBroが再起動されます。 他のアプローチを使用するには、最初にBroのプロセスIDの1つを取得します。

  1. ps aux | grep bro

次に、プロセスの1つを強制終了します。

  1. sudo kill -9 process_id

次に、以下を使用してステータスを確認します。

  1. sudo /usr/local/bro/bin/broctl status

出力には、クラッシュしたことが示されます。

Output
Name Type Host Status Pid Started bro standalone localhost crashed

数分後に同じコマンドを呼び出すと、出力に再び実行されていることが示されます。

Broが完全に機能していると、約1時間ごとにインターフェイスにキャプチャされた興味深いアクティビティの概要メールが届くはずです。 また、クラッシュして再起動した場合は、クラッシュ後に開始したことを示すメールが届きます。 次の最後のステップでは、他のいくつかの主要なBroユーティリティを見てみましょう。

ステップ7— brobro-cut、およびBroポリシースクリプトを使用する

brobro-cutは、Broに付属している他の2つのメインコマンドです。 broを使用すると、ライブトラフィックをキャプチャし、他のツールを使用してキャプチャしたトレースファイルを分析できます。 bro-cutは、Broログからデータを読み取ったり取得したりするためのカスタムツールです。

broを使用してライブトラフィックをキャプチャするために使用されるコマンドは、sudo /usr/local/bro/bin/bro -i eth0 file...の形式です。 少なくとも、トラフィックをキャプチャするインターフェイスを指定する必要があります。file...は、Broが処理するものを定義するポリシースクリプトを指します。 1つまたは複数のスクリプトを指定する必要がないため、コマンドはsudo /usr/local/bro/bin/bro -i eth0のようになります。

:Broが機能するために使用するスクリプトは、/usr/local/bro/share/broディレクトリにあります。 サイト固有のスクリプトは/usr/local/bro/share/bro/site/ディレクトリにあります。 Broをアップグレードまたは再インストールすると変更が上書きされるため、/usr/local/bro/share/bro/site/local.bro以外のこのディレクトリ内のファイルをカスタマイズしないでください。

broは、単一のキャプチャセッションから作業ディレクトリに多くのファイルを作成するため、そのキャプチャセッション専用に作成されたディレクトリでbroキャプチャコマンドを呼び出すことをお勧めします。 たとえば、次の例は、ライブトラフィックキャプチャセッション中に作成されたファイルの長いリスト(ls -l)を示しています。

Output
total 152 -rw-r--r-- 1 root root 277 Apr 14 09:20 capture_loss.log -rw-r--r-- 1 root root 4711 Apr 14 09:20 conn.log -rw-r--r-- 1 root root 2614 Apr 14 04:49 dns.log -rw-r--r-- 1 root root 25168 Apr 14 09:20 loaded_scripts.log -rw-r--r-- 1 root root 253 Apr 14 09:20 packet_filter.log -rw-r--r-- 1 root root 686 Apr 14 09:20 reporter.log -rw-r--r-- 1 root root 708 Apr 14 04:49 ssh.log -rw-r--r-- 1 root root 793 Apr 14 09:20 stats.log -rw-r--r-- 1 root root 373 Apr 14 09:20 weird.log

ここで、キャプチャコマンドの1つを実行してみることができます。 少し実行させた後、CTRL+Cを使用してbroキャプチャセッションを終了します。 cat ssh.log | /usr/local/bro/bin/bro-cut -C -dのようなコマンドを使用して、bro-cutでそれぞれを読み取ることができます。

結論

この記事では、Broと、ソースからスタンドアロンでインストールする方法を紹介しました。 また、BroがIPアドレスを都市レベルに地理的に特定するために使用するMaxMindからIPv4およびIPv6GeoIPデータベースをインストールする方法も学びました。 このスタンドアロンのインストールモードでは、構成ファイルの関連する側面を変更し、broctrlで管理し、broを使用してライブトラフィックをキャプチャし、bro-cutを使用して出力する方法も学習しました。結果のログファイルを読み取ります。

Broの使用方法の詳細については、プロジェクトのドキュメントサイトからアクセスできます。