EXIST @ubuntu 18.4.2

##はじめに・・・
NICTが公開しているEXISTを構築しようと思ったのですが、ubuntu系で構築した際のメモ
ほぼほぼ公式BlogやGithubのReadmeのとおりなので、ほんとに単なる個人メモ・・・
[NICTER Blog](https://blog.nicter.jp/2019/03/exist/,"NICTER Blog")
[EXIST github](https://github.com/nict-csl/exist,"EXISTGITHUB")

##環境
VirtualBox:6.0.6
OS:Ubuntu 18.4.2
CPU：Corei7-7500から2コア割り当て
メモリ:16GBから4GB割り当て
python3.6
BGM:Arc North の Sirius

使用しているユーザは、ユーザIDがexist、パスワードがpassword!と仮定して記載しています。


##ubuntuインストール後にインストールしたもの

```
user$ sudo apt-get install curl
user$ apt-get install git
user$ apt-get install python3-pip
user$ apt-get install python3-devel
user$ apt-get -y update
user$ apt-get -y upgrade
```

##EXISTインストール

###Codeの入手

```
#/opt/existに構築していきます
user$ cd /opt
user$ sudo git clone https://github.com/nict-csl/exist
user$ sudo chown exist:exist -R /opt/exist
```

###EXISTが要求しているライブラリ等をインストール

```
user$ cd exist
user$ sudo pip3 install -r requirements.txt
```

###MARIA DBのインストール&設定

```
#インストール
user$ sudo apt list|grep -i mariadb-server
mariadb-server/unknown 1:10.3.14+maria~bionic all
mariadb-server-10.1/bionic-updates,bionic-security 1:10.1.38-0ubuntu0.18.04.1 amd64
mariadb-server-10.3/unknown,now 1:10.3.14+maria~bionic amd64 [installed]
mariadb-server-core-10.1/bionic-updates,bionic-security 1:10.1.38-0ubuntu0.18.04.1 amd64
mariadb-server-core-10.3/unknown,now 1:10.3.14+maria~bionic amd64 [installed,automatic]
user$ apt install mariadb-server-10.3 -y

#設定（パスワードはsodo userのパスワードで良いはず）
user$ sudo mysql -p
MariaDB [(none)]> create database intelligence_db;

#ユーザ名 exist パスワード / password!の場合
#db名は公式と同じintelligence_dbを指定
MariaDB [(none)]> GRANT ALL PRIVILEGES ON `intelligence_db`.* TO 'exist'@'localhost'  IDENTIFIED BY 'password!';
MariaDB [(none)]> exit

$ sudo systemctl start mariadb
$ sudo systemctl enable mariadb
```

###EXISTの設定

```
user$ vi /opt/exist/intelligence/settings.py.template 
#2か所を更新

#今回は単体で動作させるためlocalhostを指定
ALLOWED_HOSTS = [
     'localhost'
#    '192.168.56.101',
]

#USERとPASSWORDをMARIA DBにセットしたものを指定
#db名はintelligence_dbが元々入っています
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': '',
        'PORT': '',
        'OPTIONS': {
            'charset': 'utf8mb4',
            'init_command': 'SET character_set_connection=utf8mb4;'
                            'SET collation_connection=utf8mb4_unicode_ci;'
                            "SET NAMES 'utf8mb4';"
                            "SET CHARACTER SET utf8mb4;"
        },
    }
}

#settings.pyとして保存
:wq /opt/exist/intelligence/settings.py
```

###Migrateを実施

```
user$ cd /opt/exist
user$ python manage.py makemigrations exploit reputation threat threat_hunter twitter twitter_hunter
user$ python manage.py migrate
```

##redisのインストール
```
apt-get install redis
systemctl start redis
systemctl enable redis
```

###celeryの設定を作成
公式をほぼコピー
差異は、whichで調べて表示されたパスをCELERY_BINに指定する箇所のみ

```
user$ which celery
/usr/local/bin/celery
user$ sudo mkdir /etc/exist_celery
user$ sudo vi /etc/exist_celery/celery.conf

# Name of nodes to start
# here we have a single node
CELERYD_NODES="w1"
# or we could have three nodes:
#CELERYD_NODES="w1 w2 w3"

# Absolute or relative path to the 'celery' command:
CELERY_BIN="/usr/local/bin/celery"

# App instance to use
# comment out this line if you don't use an app
CELERY_APP="intelligence"
# or fully qualified:
#CELERY_APP="proj.tasks:app"

# How to call manage.py
CELERYD_MULTI="multi"

# Extra command-line arguments to the worker
CELERYD_OPTS="--time-limit=300 --concurrency=8"

# - %n will be replaced with the first part of the nodename.
# - %I will be replaced with the current child process index
# and is important when using the prefork pool to avoid race conditions.
CELERYD_PID_FILE="/var/run/celery/%n.pid"
CELERYD_LOG_FILE="/var/log/celery/%n%I.log"
CELERYD_LOG_LEVEL="INFO"

:wq
```

###celeryをサービスに追加
User,Group,EnvironmentFile,WorkingDirectory

```
vi  /etc/systemd/system/celery.service

[Unit]
Description=Celery Service
After=network.target
 
[Service]
Type=forking
User=exist
Group=exist
EnvironmentFile=/etc/exist_celery/celery.conf
WorkingDirectory=/opt/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

:wq

user$ sudo systemctl start celery.service
user$ sudo systemctl enable celery.service
```

###celeryのログファイル領域を作成

```
$ sudo mkdir /var/log/celery; sudo chown exist:exist /var/log/celery
$ sudo mkdir /var/run/celery; sudo chown exist:exist /var/run/celery
```

###コンフィグの作成
自分の環境やAPI_KEYの設定が必要です。
とりあえずsyspathさえ設定されていれば、reputationは取ってくれる・・・

```
user$ cd scripts/insert2db/conf/
user$ vi insert2db.conf.template

[exist]
syspath = /opt/exist

[misp]
MISP_URL = http://YOUR_MISP_URL
API_KEY = YOUR_MISP_API_KEY

[malshare]
api_key = YOUR_API_KEY

[twitter]
timeline = https://api.twitter.com/1.1/statuses/home_timeline.json
CK = YOUR_CK
CS = YOUR_CS
AT = YOUR_AT
AS = YOUR_AS

#名前を付けて保存
:wq insert2db.conf
```


###データの取り込み
基本設定は各フォルダ内に、

```
$ python3 scripts/insert2db/reputation/insert2db.py
$ python3 scripts/insert2db/twitter/insert2db.py
$ python3 scripts/insert2db/exploit/insert2db.py
$ python3 scripts/insert2db/threat/insert2db.py
```

###EXISTの起動
起動後は、http://127.0.0.1:8000/ へアクセスすることで動作を確認できます。

```
user$ python3 manage.py runserver 127.0.0.1:8000
```

###今後の予定
Raputationはデフォルトでこれらに対応してるらしいのですが、追加するには自分で「/opt/exist/scripts/insert2db/reputation/plugins/」にあるような形式で書く必要があるらしく、追加してみようと思ってます。

・MalwareDomainList
・Ransomware Tracker
・ZeuS Tracker
・SANS DShield
・ThreatExpert
・PhishTank
・Bambenek
・CINS
・CyberCrime Tracker
・Malshare
・Minotr.net