VyOSを用いたハニーポットの観測環境

今回は、私が卒業研究で構築したハニーポットの観測環境についてまとめようと思います。
私の研究を簡潔に言うと、HTTPとHTTPSへの攻撃(特にHTTPSに着目)を観測し、分析するというものです。

環境説明

この研究では、学内のVMハニーポットを建てるということで、セキュリティファーストで環境づくりを行いました。
私が意識したセキュリティ対策は以下のようになっています。

  1. ハニーポットを重要なシステム群と別のネットワークに設置
  2. ハニーポットからインターネット方向(アウトバウンド )のパケットフィルタ
  3. 万一の時にハニーポットを物理的に切断できる体制
  4. root無効化
  5. 不要なサービス、アカウントの停止
  6. ログの定期的な確認

ソフトウェアルータであるVyOSを用い、プライベートネットワークの構築やハニーポットへのポートフォワーディング、ファイアウォールの設定等を行うことで、上の1, 2, 3番の対策をしました。
4, 5番のセキュリティ対策については各サーバ上で行っています。
実際の実験環境図はこんな感じです。

f:id:terib0l:20210330001332j:plain
ネットワーク構成図

環境構築

ここではハニーポットサーバVyOSの構築の際のメモをずらーっと書いていきます。

ハニーポットサーバ

まずハニーポットサーバの前提として、OSは「Ubuntu 16.04」で、既にグローバルIPアドレスが与えられている状態でした。イメージは以下のような感じです。
なお以降の説明は、1つのサーバに行った設定を取り上げており、実際には3つのサーバに適宜行っています。

f:id:terib0l:20210331232624j:plain
初期ネットワーク構成図

0. サーバ準備

・新ユーザー作成
hoge = ログイン用、webadmin = ハニーポット実行用)
$ sudo adduser hoge
$ sudo adduser webadmin

・公開鍵認証でのssh接続設定
Server側
$ mkdir ~/.ssh
$ chmod 700 ~/.ssh
$ touch ~/.ssh/authorized_keys
$ chmod 600 ~/.ssh/authorized_keys
Local側
$ ssh-keygen -f key-wow -t rsa -b 2048
$ ssh-copy-id -i ~/.ssh/key-wow.pub hoge@***.***.***.8
$ ssh -i ~/.ssh/key-wow hoge@***.***.***.8

・パスワード入力による接続とrootでの接続の禁止
※ 該当部分のyesをnoに変更
$ vi /etc/ssh/sshd_config

PasswordAuthentication no
PermitRootLogin no

$ systemctl restart sshd.service

1. ハニーポットの構築

※ ここからは上記で作成したwebadminのディレクトリ上で展開しています。
ハニーポットはWebハニーポットWOWHoneypotを利用させてもらいました。
インストール方法は割愛します。

HTTPSのログを観測するために、ハニーポットSSL対応させました。
こちらの記事の「1. WOWHoneypotのSSL対応」と「3.3. 証明書ファイル生成」を参考にさせてもらいました。
プラスして以下のnat設定を追記しました。
$ vi /etc/ufw/before.rules

-A PREROUTING -p tcp --dport 443 -j REDIRECT --to-port 44333

$ sudo ufw reload
また、自己署名のSSLサーバ証明書とは別にLet's Encryptによる認証局の署名付き証明書も作りました。これに関してはこの記事を参考に行いました。

加えてこれは個人的なものにはなるのですが、私が作ったログ解析のスクリプトに合わせて、ハニーポットのログの出力方法を少々変更しました。
$ vi /home/webadmin/wowhoneypotssl/config.txt

# Access log separator
separator="\t"

2. ハニーポットのサービス化

さらにここでは、ログ収集の自動化を簡素化するためにWOWHoneypotをサービス化しました。参考はこちらの記事です。

・HTTPを観測するハニーポット
$ vi /home/webadmin/wowhoneypot.sh

#!/bin/bash
cd /home/webadmin/wowhoneypot
/usr/bin/python3 /home/webadmin/wowhoneypot/wowhoneypot.py

$ chmod 775 wowhoneypot.sh
$ vi /etc/systemd/system/wowhoneypot.service

[Unit]
Description=WoWHoneypot daemon
Documentation=https://github.com/morihisa/WOWHoneypot

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

[Install]
WantedBy = multi-user.target

$ chmod 755 /etc/systemd/system/wowhoneypot.service
$ systemctl enable wowhoneypot.service
$ systemctl start wowhoneypot.service
$ ps -ef | grep wowhoneypot
$ chown -R webadmin:root /home/webadmin/wowhoneypot/

HTTPSを観測するハニーポット
$ vi /home/webadmin/wowhoneypotssl.sh

#!/bin/bash
cd /home/webadmin/wowhoneypotssl
/usr/bin/python3 /home/webadmin/wowhoneypotssl/wowhoneypot.py

$ chmod 775 wowhoneypotssl.sh
$ vi /etc/systemd/system/wowhoneypotssl.service

[Unit]
Description=WoWHoneypot daemon
Documentation=https://github.com/morihisa/WOWHoneypot

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

[Install]
WantedBy = multi-user.target

$ chmod 755 /etc/systemd/system/wowhoneypotssl.service
$ systemctl enable wowhoneypotssl.service
$ systemctl start wowhoneypotssl.service
$ ps -ef | grep wowhoneypotssl
$ chown -R webadmin:root /home/webadmin/wowhoneypotssl/

VyOS

次にVyOSですが、ダウンロード方法は割愛します。

0. 初期設定(参考

・ホストネーム
$ set system host-name hw

タイムゾーン
$ set system time-zone Asia/Tokyo
$ set system ntp server ntp.nict.jp

キーボード設定
$ vi /etc/default/keyboard

  XKBMODEL=”pc106
  XKBLAYOUT=”jp

ゲートウェイアドレス(環境による)
$ set system gateway-address ***.***.***.***

・ネームサーバ
$ set system name-server '8.8.8.8'

1. IPアドレスの付与とssh設定

・eth0: outside(Internet側)
$ delete interfaces ethernet 'eth0' address 'dhcp'
$ set interfaces ethernet eth0 address ***.***.***.100/24
$ set interfaces ethernet eth0 description 'outside'

・eth1: inside(Private Network側)
$ set interfaces ethernet eth1 address 192.168.0.1/24
$ set interfaces ethernet eth1 description 'inside'

ssh設定
$ set service ssh port 22

これでローカルから$ ssh vyos@***.***.***.100でVyOSへ入れるようになります。

2. DNSフォワーダ設定

※ プライベートネットワーク内(192.168.0.0/24)にあるマシンは、DNSとしてeth1(192.168.0.1)を指定することで名前解決が可能
$ set service dns forwarding cache-size '0'
$ set service dns forwarding listen-on 'eth1'
$ set service dns forwarding name-server '8.8.8.8'

3. SNAT設定

※ プライベートネットワーク内にあるマシンはゲートウェイにeth1を指定することで外部と通信できるようになる
$ set nat source rule 1 outbound-interface 'eth0'
$ set nat source rule 1 source address '192.168.0.0/24
$ set nat source rule 1 translation address masquerade

4. DNAT設定

・eth0にハニーポットの数分のグローバルIPの付与
$ set interfaces ethernet eth0 address ***.***.***.6/24
$ set interfaces ethernet eth0 address ***.***.***.7/24
$ set interfaces ethernet eth0 address ***.***.***.8/24

***.***.***.6へのアクセスを192.168.0.6にNATする
$ set nat destination rule 10 destination address ***.***.***.6
$ set nat destination rule 10 inbound-interface eth0
$ set nat destination rule 10 translation address 192.168.0.6
$ set nat destination rule 10 protocol tcp

***.***.***.7へのアクセスを192.168.0.7にNATする
$ set nat destination rule 11 destination address ***.***.***.7
$ set nat destination rule 11 inbound-interface eth0
$ set nat destination rule 11 translation address 192.168.0.7
$ set nat destination rule 11 protocol tcp

***.***.***.8へのアクセスを192.168.0.8にNATする
$ set nat destination rule 12 destination address ***.***.***.8
$ set nat destination rule 12 inbound-interface eth0
$ set nat destination rule 12 translation address 192.168.0.8
$ set nat destination rule 12 protocol tcp

5. FW設定

ハニーポットのアドレスグループを定義する
$ set firewall group address-group HP-ADD address 192.168.0.6-192.168.0.8

・インターネットからルーター(VyOS)への設定 (ping, 22, 53の通信を許可)
$ set firewall name FW-LOCAL default-action drop
$ set firewall name FW-LOCAL rule 20 action accept
$ set firewall name FW-LOCAL rule 20 protocol icmp
$ set firewall name FW-LOCAL rule 21 action accept
$ set firewall name FW-LOCAL rule 21 destination address '***.***.***.100'
$ set firewall name FW-LOCAL rule 21 destination port '22'
$ set firewall name FW-LOCAL rule 21 protocol 'tcp'
$ set firewall name FW-LOCAL rule 21 state new enable
$ set firewall name FW-LOCAL rule 21 state established enable
$ set firewall name FW-LOCAL rule 22 action accept
$ set firewall name FW-LOCAL rule 22 source port '53'
$ set firewall name FW-LOCAL rule 22 protocol 'tcp_udp'
$ set firewall name FW-LOCAL rule 22 state new enable
$ set firewall name FW-LOCAL rule 22 state established enable
$ set interfaces ethernet eth0 firewall local name FW-LOCAL

・インターネットからプライベートネットワークへの設定 (ハニーポットping, 22, 80, 443の通信を許可)
$ set firewall name FW-IN default-action drop
$ set firewall name FW-IN rule 30 action accept
$ set firewall name FW-IN rule 30 protocol icmp
$ set firewall name FW-IN rule 31 action accept
$ set firewall name FW-IN rule 31 destination group address-group HP-ADD
$ set firewall name FW-IN rule 31 destination port '22,80,443'
$ set firewall name FW-IN rule 31 protocol 'tcp'
$ set firewall name FW-IN rule 31 state new enable
$ set firewall name FW-IN rule 31 state established enable
$ set interfaces ethernet eth0 firewall in name FW-IN

・プライベートネットワークからインターネットへの設定 (pingとリクエストに対する応答のみ許可)
$ set firewall name FW-OUT default-action drop
$ set firewall name FW-OUT rule 40 action accept
$ set firewall name FW-OUT rule 40 state established enable
$ set firewall name FW-OUT rule 41 action accept
$ set firewall name FW-OUT rule 41 protocol icmp
$ set interfaces ethernet eth0 firewall out name FW-OUT

6. ハニーポットサーバをプライベートIPに変更

※VyOSの章ですがこれはハニーポットサーバの設定です。
NATの設定が終わったので各ハニーポットサーバのIPとゲートウェイアドレスを変更します。
`$ vi /etc/network/interfaces

auto ens160
iface ens160 inet static
address 192.168.0.8
netmask 255.255.255.0
gateway 192.168.0.1
dns-nameserver 192.168.0.1

$ systemctl restart networking

以上で環境構築・設定は終わりです。

ログ分析

ここからはログ収集の自動化と解析について書いていきます。

ログ収集

なるべく面倒を避けるためにログ収集の自動化を行いました。
この実験では、tcpdumpを利用することでネットワークパケットのログも収集していました。
またtcpdumpハニーポットが、勝手に止まる、または1日のログがきっかり0時〜24時のものにならない可能性を考慮して再起動を取り入れるようにしています。
$ vi /path/to/automate.sh

#!/bin/sh
# これは***.***.***.8のハニーポット用

# log収集
cp /home/webadmin/wowhoneypot/log/access_log /home/hoge/8_http_access
cp /home/webadmin/wowhoneypot/log/wowhoneypot.log /home/hoge/8_http_wowhoneypot
cp /home/webadmin/wowhoneypotssl/log/access_log /home/hoge/8_https_access
cp /home/webadmin/wowhoneypotssl/log/wowhoneypot.log /home/hoge/8_https_wowhoneypot

# tcpdumpを切る
kill `ps auxw | grep tcpdump | grep -v grep | grep -v 80 | awk '{print $2}'`
kill `ps auxw | grep tcpdump | grep -v grep | grep -v 443 | awk '{print $2}'`

# 一つのディレクトリにまとめる(命名規則は日付)
mkdir /home/hoge/temp
mv /home/hoge/8_http* /home/hoge/temp/
mv /home/hoge/temp /home/hoge/$(date "+%m%d")

# ハニーポットのlogを空にする
: > /home/webadmin/wowhoneypot/log/access_log
: > /home/webadmin/wowhoneypot/log/wowhoneypot.log
: > /home/webadmin/wowhoneypotssl/log/access_log
: > /home/webadmin/wowhoneypotssl/log/wowhoneypot.log

# ダンプログを採る
cd /home/hoge
tcpdump -i ens160 -G 86400 -Z root -w 8_https_dump.pcap host 192.168.0.8 and port 443 &
tcpdump -i ens160 -G 86400 -Z root -w 8_http_dump.pcap host 192.168.0.8 and port 80 &

$ vi /path/to/restart.sh

#!/bin/sh

# system再起動
systemctl restart wowhoneypot.service
systemctl restart wowhoneypotssl.service

$ service cron start
$ cp /etc/crontab /etc/cron.d/cron_test
$ vi /etc/cron.d/cron_test

# 毎日正子にシェルスクリプトを実行する
0 0              * * *   root  /bin/sh /path/to/automate.sh
# リスタート
0 0,6,12,18 * * *  root   /bin/sh /path/to/restart.sh

$ service cron restart

これらの設定により、ハニポサーバの所定の位置へその日ごとのログをまとめとおき、scpでローカルに持ってきて解析を行っていました。

ログ解析

ハニーポットのログとpcapファイルの解析をやりやすくするために、その場しのぎで2000行以上のコードを書きました。
このコードを書くきっかけになったのは、PythonのライブラリでScapyというPCAPファイルの解析に使えるライブラリがあるのですが、それが自分の理想とするような出力をしないことがわかり、解析スクリプトを自作する流れとなりました。
2000行といっても、分析のために色々な出力の仕方を作っただけなんですけども…。
とても汚いコードですが、記念としてGithubに残しています(笑)。
GitHub - terib0l/graduation-study

これを用いてログを分析し、論文を執筆したという具合です^ ^

おわりに

コロナ下ということもあり、この研究期間中、というか大学4年時は一回も研究室は愚か学校も行きませんでした。孤独と研究との格闘でとても精神的にキツくもありましたが、良い経験ができたと思います。
あわよくば、この記事(メモだけど…)が誰かの助けになればいいなと思います。