セキュリティ猫の備忘録

セキュリティに関する事柄を備忘録として記していく

NICTの脅威情報自動収集ツールEXISTをdockerで起動してみた

国立研究開発法人情報通信研究機構NICT)が、脅威情報を自動収集するWebアプリEXIST(EXternal Information aggregation System against cyber Threat)を公開しました。
そこで今回は、そのEXISTをdockerで動かせたので、備忘録として残しておきます。

※注意※
私自身、dockerの初心者も初心者なので、完全に把握していない部分も多くあります。
ひとまず、私の環境で「起動する」ことは確認できましたので、docker上で構築するのが得意な方がいらっしゃいましたら、是非ともアドバイスを頂けますと幸いです。

【目次】

環境
構築
実行
確認

EXISTと参考資料

EXISTの機能と通常のインストール方法は、以下の公開されたGitHubを参照してください。
github.com


インストール方法、コード等は以下のサイトを参考にしました。
qiita.com
dev.classmethod.jp

環境

以下の環境上で、EXISTをdockerを使って起動させることができました。

仮想化ソフト

  VirtualBox

ゲストOS

  CentOS 7
  メモリ  :2GB
  プロセッサ:1CPU
  ストレージ:20GB
  IPアドレス :192.168.56.200(Host only)
         XXX.XXX.XXX.XXX(NAT)

構築

・フォルダ作成

Dockerfileやその他のスクリプトファイルを置くフォルダを作成する
私の環境では、以下のフォルダを作成&移動しました。

mkdir /opt/<folder name>/
cd /opt/<folder name>/

スクリプトファイルの用意

上記で作成したフォルダの中に以下のファイルを作成、スクリプトを記述していきます。

settings.py

こちらは、GitHub上のファイルを落としてくるか、ソースをコピペします。
https://github.com/nict-csl/exist/blob/master/intelligence/settings.py.template

その後、以下の内容を修正します。

#ALLOWED_HOSTSはブラウザからアクセスする際のFQDNを設定
ALLOWED_HOSTS = [
    'localhost',
    '192.168.56.200',
]

#DATABASESはMariaDB(後述)の設定(NAME,USER,PASSWORD,HOST)を記入
DATABASES = {
    'default': {
        #'ENGINE': 'django.db.backends.sqlite3',
        #'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'intelligence_db',
        'USER': 'exist',
        'PASSWORD': 'password',
        'HOST': 'localhost',
        'PORT': '',
        'OPTIONS': {
            'charset': 'utf8mb4',
            'init_command': 'SET character_set_connection=utf8mb4;'
                            'SET collation_connection=utf8mb4_unicode_ci;'
                            "SET NAMES 'utf8mb4';"
                            "SET CHARACTER SET utf8mb4;"
        },
    }
}
celery

非同期でタスクを実行するceleryの設定ファイルを作成。

CELERYD_NODES="localhost"
CELERY_BIN="/bin/celery"
CELERY_APP="intelligence"
CELERYD_MULTI="multi"
CELERYD_OPTS="--time-limit=300 --concurrency=8"
CELERYD_PID_FILE="/var/run/celery/%n.pid"
CELERYD_LOG_FILE="/var/log/celery/%n%I.log"
CELERYD_LOG_LEVEL="INFO"
celeryd

celeryの起動スクリプトを作成する。

Type=forking
User=root
Group=root
EnvironmentFile=/etc/sysconfig/celery
WorkingDirectory=/exist
ExecStart=/bin/sh -c '${CELERY_BIN} multi start ${CELERYD_NODES} \
-A ${CELERY_APP} --pidfile=${CELERYD_PID_FILE} \
--logfile=${CELERYD_LOG_FILE} --loglevel=${CELERYD_LOG_LEVEL} ${CELERYD_OPTS}'
ExecStop=/bin/sh -c '${CELERY_BIN} multi stopwait ${CELERYD_NODES} \
--pidfile=${CELERYD_PID_FILE}'
ExecReload=/bin/sh -c '${CELERY_BIN} multi restart ${CELERYD_NODES} \
-A ${CELERY_APP} --pidfile=${CELERYD_PID_FILE} \
--logfile=${CELERYD_LOG_FILE} --loglevel=${CELERYD_LOG_LEVEL} ${CELERYD_OPTS}'
   :
case "$1" in
  start)
        $ExecStart
        ;;
  stop)
        $ExecStop
        ;;
  reload|)
        $ExecReload
        ;;
  *)
        echo $"Usage: $0 {start|stop|restart|reload|status}"
        exit 1
esac
existdb.sql

MariaDBセットアップ用スクリプトを作成。

--MySQLのインデックスサイズに767byteまでしかつかえない問題の回避策
--これを行っていないと、Djangoをマイグレーション時にエラーが発生
set global innodb_large_prefix = ON;
set global innodb_file_format = BARRACUDA;
set global innodb_file_per_table=ON;
set global innodb_default_row_format = DYNAMIC;

--mysql_secure_installation実行の代用(ほぼ同一の処理を行う)
UPDATE mysql.user SET Password=PASSWORD('password') WHERE User='root';
DELETE FROM mysql.user WHERE User='';
DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1');
DELETE FROM mysql.db WHERE Db='test' OR Db='test\\_%';
FLUSH PRIVILEGES;

--EXIST用のDB作成
create database intelligence_db;
-- GRANT ALL PRIVILEGES ON `intelligence_db`.* TO '<user name>'@'localhost' IDENTIFIED BY '<password>';
GRANT ALL PRIVILEGES ON `intelligence_db`.* TO 'exist'@'localhost' IDENTIFIED BY 'password';
Dockerfile

dockerの構成ファイルを作成する。

FROM ubuntu:latest

RUN apt-get update && apt-get -y upgrade

RUN apt-get -y install git python3 python3-pip locales
RUN locale-gen en_US.UTF-8
ENV LANG en_US.UTF-8
ENV LANGUAGE en_US:en
ENV LC_ALL en_US.UTF-8

RUN curl -sS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup | bash
RUN apt-get install -y mariadb-client-10.1
RUN apt-get install -y mariadb-server
RUN apt-get -y install redis-server

WORKDIR /root
RUN git clone https://github.com/nict-csl/exist.git nict-exist
WORKDIR /root/nict-exist

RUN pip3 install -U -r requirements.txt

ADD ./settings.py ./intelligence/settings.py
ADD ./celery /etc/sysconfig/celery
ADD ./celeryd /etc/init.d/celeryd
ADD ./existdb.sql ./existdb.sql

実行

上記ファイルを作成したら、dockerイメージを構築、コンテナを起動します。

docker build -t <image name>  /opt/<folder name>/
docker run -it -p 8000:8000 -d --name <container name> <image name>
#コンテナにアクセス
docker exec -i -t <container name> /bin/bash

コンテナを作成したら、コンテナにアクセスし、内部で以下を実行。

#MySQLがソケットがないといってくるので回避策
/etc/init.d/mysql stop
rm -f /var/run/mysqld/mysqld.sock
rm -f /tmp/mysql.sock
/etc/init.d/mysql start
#DBのセットアップ
mysql -u root < existdb.sql
python3 manage.py makemigrations exploit reputation threat threat_hunter twitter twitter_hunter
python3 manage.py migrate
/etc/init.d/redis-server start
chmod +x /etc/init.d/celeryd
/etc/init.d/celeryd start
#EXISTの起動
python3 manage.py runserver 0.0.0.0:8000

確認

ホストOS上のブラウザで、「http://192.168.56.200:8000/」にアクセスしてみると、EXISTが起動していることが確認できました。

f:id:nekochanSecurity555:20190401233028p:plain
図1.EXIST起動

まとめ

今回は、NICTが公開した情報収集ツールEXIST(EXternal Information aggregation System against cyber Threat)をdocker上で起動させてみました。
しかし、まだ機能全てが使えるかの検証は行っていないため、今後は検証を行いながら、EXISTを活用していきたいを思います。
一応は、Twitter Hunterに自身のアカウントを登録してみましたが、使い方が全く分からないためまだ有効活用できないです。。。。。

f:id:nekochanSecurity555:20190401233441p:plain
図2.Twitter Hunter