2019年3月15日、国立研究開発法人情報通信研究機構(NICT)のサイバーセキュリティ研究室がサイバー脅威情報(CTI)を自動収集するWebアプリEXIST(EXternal Information aggregation System against cyber Threat)をGitHubに公開しました。そこで早速導入してみたいと思います。
EXISTの機能については、GitHubをご覧ください。
https://github.com/nict-csl/exist
前提条件
・CentOS7
・python3.7(開発は3.5で行われているようです。)
・Django 1.11.20
・MariaDB 1.3.13
目次
・EXISTソースのクローン
・Pythonモジュールの追加
・MariaDBのインストール・設定
・Djangoの設定
・Redisのインストール
・Celeryの設定
・EXIST起動
EXISTソースのクローン
GithubからEXISTのソースをクローンします。
# git clone https://github.com/nict-csl/exist.git
Pythonモジュールの追加
pipで必要なpythonモジュールを組み込みます。
# cd exist
# pip3 install -r requirements.txt
MariaDBのインストール
MariaDBをインストールするためのリポジトリを追加します。macOSでHomebrewを使う場合は不要です。
# curl -sS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup | bash
MariaDBのサーバとクライアントをインストールします。
# yum install MariaDB-server MariaDB-client
MabiaDBをサービスとして起動・登録します。
systemctl start mariadb
systemctl enable mariadb
MariaDBのセキュリティ設定を行います。インタラクティブモードで以下の設定変更を促されます。全てYesで設定します。
・rootパスワードの変更
・匿名ユーザを削除するか
・rootユーザのリモートログインを許可しないようにするか
・テストデータベースを削除するか
・特権テーブルをすぐに再読み込みするか
# mysql_secure_installation
~
Change the root password? [Y/n] Y
~
Remove anonymous users? [Y/n] Y
~
Disallow root login remotely? [Y/n] Y
~
Remove test database and access to it? [Y/n] Y
~
Reload privilege tables now? [Y/n] Y
~
Thanks for using MariaDB!
MariaDBのセキュリティ設定が完了したら、MariaDBを再起動しましょう。
# systemctl restart mariadb
続いて、MariaDBにEXIST用データベース(intelligence_db)とデータベースユーザを作成して、EXIST用データベースにフル権限を与えます。今回は、ローカルホストのexistユーザ(exist@localhost)としていますが、環境に合わせて変更してください。
# mysql -u root -p
> create database intelligence_db;
> create user 'exist'@'localhost' identified by 'password';
> grant ALL on intelligence_db.* to exist;
Djangoの設定
Djangoの設定ファイルを準備します。あらかじめテンプレートが用意してありますので、コピーして利用しましょう。
cp -p intelligence/settings.py.template intelligence/settings.py
vi intelligence/settings.py
DjangoのALLOWED_HOSTSとDATABASESの項目を変更します。
ALLOWED_HOSTSはブラウザからアクセスする際のFQDNを設定します。下記の場合は*http://localhost:8000*以外のIPアドレスなどでアクセスすると拒否されます。
DATABASESは先ほど作成したMariaDBの設定(NAME,USER,PASSWORD,HOST)を記入してください。
ALLOWED_HOSTS = [
'localhost',
]
DATABASES = {
'default': {
'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;"
},
}
}
ここまでできたら、Djangoをマイグレーションします。
python3 manage.py makemigrations exploit reputation threat threat_hunter twitter twitter_hunter
python3 manage.py migrate
Redisのインストール
Redisをインストールします。celeryのブローカーに使用している模様。
yum install redis
systemctl start redis
systemctl enable redis
Celeryの設定
非同期でタスクを実行するceleryの設定ファイルを準備します。
モジュールはpip install
した際にインストールされています。sysconfig配下に新たに設定ファイルを作成します。GitHubのREADMEに記載されているサンプルのCELERYD_NODESをlocalhost
にCELERY_BINを/bin/celery
に書き換えて使用します。celeryの実行ファイルの場所は環境によって違いがありますので、which celery
で確認してください。
vi /etc/sysconfig/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"
続いて、celeryの起動スクリプトを作成します。こちらもGitHubのREADMEにサンプルファイルをベースに書き換えて利用します。
・User - 実行ユーザ
・Group - 実行ユーザのグループ
・EnviromentFile - 先ほど作成したceleryの設定ファイル
・WorkingDirectory - git cloneしたexistのディレクトリ
vi /etc/systemd/system/celery.service
[Unit]
Description=Celery Service
After=network.target
[Service]
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}'
[Install]
WantedBy=multi-user.target
EXIST起動
起動スクリプトの設定に合わせて、ログディレクトリ等を作成し、起動します。設定ファイルの誤りでサービスの起動に失敗する場合は、編集後にsystemctl demon-reload
を行ってください。
mkdir /var/log/celery; chown root:root /var/log/celery
mkdir /var/run/celery; chown root:root /var/run/celery
systemctl start celery.service
systemctl enable celery.service
python manage.py runserver 0.0.0.0:8000
また、CentOSはデフォルトでfirewalldで有効です。外部からのアクセスする場合は忘れずにポート解放しましょう。
firewall-cmd --add-port=8000/tcp --zone=public --permanent
ここまでできたら画面が確認できます。ブラウザでhttp://localhost:8000
にアクセスして見ましょう。
データのセットアップや脅威情報取り込み、GioIP2連携、twitterのフォロー手順、dockerでの構築などを順次追加していく予定です。