WoWHoneypotを植えてみよう

# 概要
[WoWHoneypot](https://github.com/morihisa/WOWHoneypot)というhoneypotを構成して、アクセスを受け取るように設定する手順を記載します。

## 環境
以下の環境で構築しています。

- IDCFクラウド
    - light.S1 (1CPU*0.8GHz / 1GB RAM)
    - IDCFクラウドの一番安い、500縁で使えるサーバです。
    - この環境を使ったのは単なる趣味なので、物理でも 他のクラウドでも、Docker上でも問題ないです。
- Ubuntu 16.04 LTS 64bit

今回はIDCFクラウドの一番安い仮想マシンで作りましたが、Python3さえ動けばかなりロースペックでも動くはずです。

# 構成について
実行時は、特定ユーザで WoWHoneypotのPythonプルグラムを動かすだけ です。デフォルトでは 8080 ポートで稼働します。

念のため、Pwnされた時の予防で権限等分離しておいたほうが良いかもしれません。

- WoWHoneypot起動用ユーザ wow を用意する
- ホームディレクトリは、/home ではなく、/optに分離しておく
- ファイアウォール/ポートフォワードを使って、必要なポート以外を開けない
    - リバースプロキシなり、クラウド側の設定でフォワードする

# 構築する

以下の流れで構築します。

- OSを作る
- 必要なパッケージを導入する
- WoWHoneypot用アカウントを作る
- WoWHoneypotを準備する
- Honeypotを起動する
- ファイアウォール/ポートフォワード設定をする
- サービス化
- 動作確認/完了

## OSを作る

適当にUbuntu16で作ってください。

- 最小構成でも構いません

## 必要なパッケージを導入する

Python3を導入します。

- `# apt install python3` などで導入します。

## WoWHoneypot用アカウントを作る

WoWHoneypotを起動するユーザを作ります。
ホームディレクトリを /opt/wow として作ります。

- `# adduser wow --home /opt/wow` とか



## WoWHoneypotを準備する

gitからcloneするだけ

- `# su - wow`
- `$ cd ~`
- `$ git clone https://github.com/morihisa/WOWHoneypot.git wowhoneypot`

## Honeypotを起動する

Honeypotを起動します。

- `$ cd ~/wowhoneypot`
- `$ python3 ./wowhoneypot.py`

ブラウザ等で動作を確認します。

- **http**で**8080**ポートにアクセスします
    - `$ telnet localhost 8080`など
- アクセスがあると、標準入力の画面にログが流れているはずです。
    - ブラウザなら hello 等、何らかの表示がされているはずです

## ファイアウォール/ポートフォワード設定をする

インターネット側からのアクセスを、8080ポートに転送するように機器を設定します。

- リバースプロキシ等は今回の説明範囲外なので省略します。
- IDCFクラウドであれば、ファイアウォールで80番ポートを許可、ポートフォワードで80を8080へ転送、で設定が終わります。
- 必要であれば、前段でSSLを解くようにして、443を80に流す、ことができますね。
- おすすめはしませんが、WoWHoneypotの待ち受けを80とすることで、直接受けることができます。

```bash:/opt/wow/wowhoneypot/config.txt
# default port: 8080
port=8080  <-- ここを 80 に変更する
```

## サービス化

このままでは起動が面倒なので、systemdで起動できるようにします。

- 起動プログラムを作る
- /etc/systemd/systemに配置する
- 自動起動設定と確認

### 起動プログラムを作る

直接起動してもよさそうだけど、アップデートの簡便さを考えるとスクリプトを用意しましょうか。

- wowユーザで、起動スクリプトを git cloneで作られるディレクトリ外に作る
- chmod +x しておく

```bash:/opt/wow/wowhoneypot.sh
#!/bin/bash
cd /opt/wow/wowhoneypot
/usr/bin/python3 /opt/wow/wowhoneypot/wowhoneypot.py
```
```
wow@:~$ vi /opt/wow/wowhoneypot.sh
wow@:~$ chmod +x wowhonerypot.sh
wow@:~$  ls -lh
total 8.0K
drwxrwxr-x 6 wow wow 4.0K MMM DD hh:mm wowhoneypot
-rwxrwxr-x 1 wow wow   89 MMM DD hh:mm wowhoneypot.sh
wow@:~$
```
### /etc/systemd/systemに設定を配置する

systemctl で扱えるように、いかにファイルを配置します。

```bash:/etc/systemd/system/wowhoneypot.service
[Unit]
Description=WoWHoneypot daemon
Documentation=https://github.com/morihisa/WOWHoneypot

[Service]
ExecStart = /opt/wow/wowhoneypot.sh
ExecRestart = /bin/kill -WINCH ${MAINPID} ; /opt/wow/wowhoneypot.sh
ExecStop = /bin/kill -WINCH ${MAINPID}
Restart = no
Type = simple
User = wow
Group = wow

[Install]
WantedBy = multi-user.target
```
```bash
root@:~# vi /etc/systemd/system/wowhoneypot.service
root@:~# chmod 755 /etc/systemd/system/wowhoneypot.service
```

### 自動起動設定と確認

先ほど配置したwowhoneypot.serviceを登録し、動作確認します。

- wowユーザで、wowhoneypotが起動していること
- そもそも wowhoneypotが起動していること

```
root@:~# systemctl enable wowhoneypot.service
root@:~# systemctl start wowhonerypot.service
root@:~# ps -ef | grep wowhoneypot
wow      34891     1  0 hh:mm ?        00:00:00 /bin/bash /opt/wow/wowhoneypot.sh
wow      34893 34891  0 hh:mm ?        00:00:00 /usr/bin/python3 /opt/wow/wowhoneypot/wowhoneypot.py
root     34933 27661  0 hh:mm pts/0    00:00:00 grep --color=auto wowhoneypot
root@:~#  
```

## 動作確認/完了

インターネット側から正しくアクセスができることを確認。

# 調整
## ログ出力先と、ローテーション

ログを /var/log/wowhonerypot へ出し、ログローテートさせます

まずは、出力先の変更を。

```
root@:~# systemctl stop wowhoneypot
root@:~# mkdir /var/log/wowhoneypot
root@:~# chown wow:root /var/log/wowhoneypot
root@:~# su - wow
wow@:~$ vi wowhoneypot/config.txt
wow@:~$ exit
root@:~# systemctl start wowhoneypot
root@:~# telnet localhost 8080
Trying ::1...
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.

Connection closed by foreign host.
root@:~# ls -lh /var/log/wowhoneypot/
total 4.0K
-rw-r--r-- 1 wow wow 352 Jan 27 12:39 wowhoneypot.log
root@:~# 
```
```
# art directory path
artpath=./art/ <--- artディレクトリは、ログではないので変えない

# WOWHoneypot logfile path
#logpath=./log/  <--- ここを /var/log/wowhoneypot に変更
logpath=/var/log/wowhoneypot/

# Access logfile path
accesslog=access_log

# WOWHoneypot logfile name
wowhoneypotlog=wowhoneypot.log
```

次に、logrotateに登録

- /etc/logrotate.d/wowhoneypot 設定ファイルを配置する
- 試しに実行
- 問題なさそうなので、強制実行

```
root@:~# vi /etc/logrotate.d/wowhoneypot
root@:~# logrotate -dv /etc/logrotate.d/wowhoneypot 
reading config file /etc/logrotate.d/wowhoneypot

Handling 1 logs

rotating pattern: /var/log/wowhoneypot/access_log  /var/log/wowhoneypot/wowhoneypot.log  weekly (30 rotations)
empty log files are rotated, old logs are removed
considering log /var/log/wowhoneypot/access_log
  log does not need rotating
considering log /var/log/wowhoneypot/wowhoneypot.log
  log does not need rotating
root@:~# ls -lh /var/log/wowhoneypot/
total 8.0K
-rw-r--r-- 1 wow wow 1.3K Jan 27 12:54 access_log
-rw-r--r-- 1 wow wow   84 Jan 27 12:54 wowhoneypot.log
root@:~# /usr/sbin/logrotate -f /etc/logrotate.d/wowhoneypot 
root@:~# ls -lh /var/log/wowhoneypot/
total 8.0K
-rw-r--r-- 1 wow wow 1.3K Jan 27 12:54 access_log.1
-rw-r--r-- 1 wow wow   84 Jan 27 12:54 wowhoneypot.log.1
root@:~# 
```
```bash:/etc/logrotate.d/wowhoneypot
/var/log/wowhoneypot/access_log  /var/log/wowhoneypot/wowhoneypot.log {
  ifempty
  dateformat .%Y%m%d
  missingok
  compress
  nocreate
  delaycompress
  weekly
  rotate 30
}
```

# 順次調整したほうが良いこと

複数のWOWHoneyPotを植えて、ログを一か所にまとめるような場合は、Syslog転送設定をした方が良いでしょう。

また、ログをある程度自動で分析するスクリプト等を用意しておいた方が良いでしょう。

- logrotateを1日単位として、ローテートごとにログをある程度集計、自分のSlackへ通知する、という使い方が良いかもしれません。
    - ログインしないと見れない/分析できない よりは、ある程度の分析結果をpushしてくれるシステム、の方が長続きします。経験上。

以上です。