国立研究開発法人情報通信研究機構(NICT)が、脅威情報を自動収集するWebアプリEXIST(EXternal Information aggregation System against cyber Threat)を公開しました。
そこで今回は、そのEXISTをdockerで動かせたので、備忘録として残しておきます。
※注意※
私自身、dockerの初心者も初心者なので、完全に把握していない部分も多くあります。
ひとまず、私の環境で「起動する」ことは確認できましたので、docker上で構築するのが得意な方がいらっしゃいましたら、是非ともアドバイスを頂けますと幸いです。
【EXISTと参考資料】
EXISTの機能と通常のインストール方法は、以下の公開されたGitHubを参照してください。
github.com
インストール方法、コード等は以下のサイトを参考にしました。
qiita.com
dev.classmethod.jp
【構築】
・フォルダ作成
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
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
--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が起動していることが確認できました。