Modern Honey Network(MHN)というデプロイツールを使って、Cowrieをインストールするための手順です。(総関西サイバーセキュリティLT大会(第4回)LTで紹介したツールです。 )
    手順通りにインストールしたけどサービスが起動しないとか、デプロイ用のスクリプトがメンテナンスされていないとか問題は多々あるのでオススメはしないですが、備忘録として残しておきます。

    Modern Honey Networkとは

    ハニーポットの構築やデータ収集を簡単に行うためのツールです。SplunkやELK(Elasticsearch,Logstash,Kibana)と連携が可能で、インストール用のスクリプトも用意されています(自分は試していませんが)。詳細はスライドやGitHub Pagesなどを参照。

    インストール用のスクリプトが準備されているハニーポットは下記の通りです。対応しているOSは殆どがUbuntuですが、一部でRaspberry Piも対応しています。詳細は、mhn/scripts at master · threatstream/mhn · GitHubを参照。

    • Wordpot : A WordPress Honeypot
    • p0f : a passive TCP/IP stack fingerprinting tool
    • Shockpot : WebApp Honeypot for detecting Shell Shock exploit attempts
    • Cowrie : Cowrie SSH Honeypot (based on kippo)
    • Suricata : Open Source IDS / IPS / NSM engine
    • Dionaea : A Malware Capturing Honeypot
    • Kippo : Medium interaction SSH honeypot
    • Conpot : ICS/SCADA honeypot
    • Glastopf : Web Application Honeypot
    • ElasticHoney : A Simple Elasticsearch Honeypot
    • Amun : vulnerability emulation honeypot
    • Snort : Network Intrusion Detection & Prevention System

    Modern Honey Networkの構成

    Sensorsサーバ(ハニーポット)で収集した情報がMHNサーバーに集められ、ユーザーはWEBブラウザなどから収集したデータを確認することが出来ます。

    architecture via https://threatstream.github.io/mhn/images/architecture.png

    MHNはいくつかのOSSから構成されています。
    - threatstream/hpfeeds: Honeynet Project generic authenticated datafeed protocol
    - threatstream/mnemosyne: Normalizer for honeypot data.
    - threatstream/honeymap: Real-time websocket stream of GPS events on a fancy SVG world map

    Modern Honey Networkのシステム要件(ハードウェア)

    MHN Server
    - 4GB RAM
    - dual core processor
    - 40 GB drive.

    Honeypots
    - 512MB-1GB RAM - dual core CPU - 20GB drive. <-- could get away with less if you rolled logs aggressively.

    via Hardware Recommendations · threatstream/mhn Wiki · GitHub

    MHNサーバーにSplunkやELK(Elasticsearch,Logstash,Kibana)をインストールする場合は要件通り4GBのRAMを用意した方が良さそうですが、自分は512MBで動かしました(Splunk,ELKはインストールしていません)。

    Modern Honey Networkのシステム要件(OS)

    INSTALLING SERVER (tested Ubuntu 12.0.4.3 x86_64 and Centos 6.7) The MHN server is supported on Ubuntu 12, Ubuntu 14, and Centos 6.7. Ubuntu 16 is not supported at this time. Other flavors/versions of Linux may work, but are generally not tested or supported.

    via threatstream/mhn: Modern Honey Network

    Ubuntu 16はサポートしないと書いていますが、気にせずUbuntu 16を使います。

    全体のシステム構成

    2017082604-1

    DigitalOceanに2台のサーバー(MHNサーバー、Sensorsサーバー)を作成します。

    Modern Honey Networkのインストール

    下記のREADMEやPDFを見れば簡単にインストール出来るのですが、冒頭に書いた通りトラブルシューティングが幾つか必要になります。
    - mhn/README.md at master · threatstream/mhn · GitHub
    - Exercise 1: Deploy and Configure Modern Honey Network

    MHNサーバーとして、下記の要件でDropletを1台作成します。

    Choose an image Choose a size Choose a datacenter region
    Ubuntu 16.04.3 x64 $5/mo (512MB/1CPU, 20GB SSD disk, 1000GB transfer) New York 3

    サーバーが作成出来たら、ログインして最新のパッケージに更新します。

    # apt-get update && apt-get upgrade -y
    

    タイムゾーンを日本に変更します。

    # date
    Sat Aug 26 04:22:40 UTC 2017
    
    # cp -p /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
    
    # date
    Sat Aug 26 13:22:59 JST 2017
    

    MHNのパッケージをダウンロードします。

    # cd /opt/
    
    # git --version
    git version 2.7.4
    
    # git clone https://github.com/threatstream/mhn.git
    Cloning into 'mhn'...
    remote: Counting objects: 6357, done.
    remote: Compressing objects: 100% (7/7), done.
    remote: Total 6357 (delta 5), reused 11 (delta 5), pack-reused 6345
    Receiving objects: 100% (6357/6357), 3.47 MiB | 0 bytes/s, done.
    Resolving deltas: 100% (3277/3277), done.
    Checking connectivity... done.
    
    # cd /opt/mhn/
    
    # ls
    flags-LICENSE.txt  LICENSE    scripts  Vagrantfile
    install.sh         README.md  server   Vagrantfile.multiple-platforms
    

    インストール用のスクリプトを実行します。適宜、情報を入力します。

    # ./install.sh
    +++ readlink -f ./install.sh
    ++ dirname /opt/mhn/install.sh
    + MHN_HOME=/opt/mhn
    + WWW_OWNER=www-data
    + SCRIPTS=/opt/mhn/scripts/
    
    (略)
    
    + python generateconfig.py
    Do you wish to run in Debug mode?: y/n n
    Superuser email: xxx@xxx.com
    Superuser password:xxxxx
    Superuser password: (again):xxxxx
    Server base url ["http://104.236.55.125"]:<Enter>
    Honeymap url [":3000"]:<Enter>
    Mail server address ["localhost"]:<Enter>
    Mail server port [25]:<Enter>
    Use TLS for email?: y/n n
    Use SSL for email?: y/n n
    Mail server username [""]:<Enter>
    Mail server password [""]:<Enter>
    Mail default sender [""]:<Enter>
    Path for log file ["/var/log/mhn/mhn.log"]:<Enter>
    
    (略)
    
    + echo -n 'Would you like to install ELK? (y/n) '
    Would you like to install ELK? (y/n) + read ELK
    n
    + '[' n == y -o n == Y ']'
    + '[' n == n -o n == N ']'
    + echo 'Skipping ELK installation'
    Skipping ELK installation
    + echo 'The ELK installationg can be completed at a later time by running this:'
    The ELK installationg can be completed at a later time by running this:
    + echo '    cd /opt/mhn/scripts/'
        cd /opt/mhn/scripts/
    + echo '    sudo ./install_elk.sh'
        sudo ./install_elk.sh
    + break
    + chown www-data /var/log/mhn/mhn.log
    + supervisorctl restart mhn-celery-worker
    mhn-celery-worker: ERROR (not running)
    mhn-celery-worker: started
    ++ date
    + echo '[Sat Aug 26 13:52:43 JST 2017] Completed Installation of all MHN packages'
    [Sat Aug 26 13:52:43 JST 2017] Completed Installation of all MHN packages
    

    各サービスの起動状態を確認します。

    # systemctl status nginx
     nginx.service - A high performance web server and a reverse proxy server
       Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
       Active: active (running) since Sat 2017-08-26 13:48:25 JST; 5min ago
      Process: 1335 ExecStop=/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid (c
      Process: 1346 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
      Process: 1343 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0 Main PID: 1351 (nginx)
        Tasks: 2
       Memory: 3.7M
          CPU: 38ms
       CGroup: /system.slice/nginx.service
               ├─1351 nginx: master process /usr/sbin/nginx -g daemon on; master_process on
               └─1359 nginx: worker process
    
    Aug 26 13:48:25 ubuntu-512mb-nyc3-01 systemd[1]: Starting A high performance web server and a reverse prox
    Aug 26 13:48:25 ubuntu-512mb-nyc3-01 systemd[1]: nginx.service: Failed to read PID from file /run/nginx.p
    iAug 26 13:48:25 ubuntu-512mb-nyc3-01 systemd[1]: Started A high performance web server and a reverse proxy
    

    hpfeeds-brokerが起動に失敗していることがわかります。

    # supervisorctl status
    geoloc                           RUNNING   pid 31768, uptime 0:17:10
    honeymap                         RUNNING   pid 31769, uptime 0:17:10
    hpfeeds-broker                   FATAL     Exited too quickly (process log may have details)
    mhn-celery-beat                  RUNNING   pid 1315, uptime 0:06:13
    mhn-celery-worker                RUNNING   pid 1416, uptime 0:02:04
    mhn-collector                    RUNNING   pid 1318, uptime 0:06:13
    mhn-uwsgi                        RUNNING   pid 1325, uptime 0:06:12
    mnemosyne                        RUNNING   pid 30592, uptime 0:17:43
    

    hpfeeds-brokerを起動してみます(失敗します)。

    # supervisorctl start hpfeeds-broker
    hpfeeds-broker: ERROR (spawn error)
    

    hpfeeds-brokerのエラーログを確認します。

    # tail /var/log/mhn/hpfeeds-broker.err
    Traceback (most recent call last):
      File "/opt/hpfeeds/broker/feedbroker.py", line 13, in <module>
        from evnet import loop, unloop, listenplain, EventGen
      File "/opt/hpfeeds/env/src/evnet/evnet/__init__.py", line 11, in <module>
        from OpenSSL import SSL
      File "/opt/hpfeeds/env/local/lib/python2.7/site-packages/OpenSSL/__init__.py", line 8, in <module>
        from OpenSSL import rand, crypto, SSL
      File "/opt/hpfeeds/env/local/lib/python2.7/site-packages/OpenSSL/SSL.py", line 105, in <module>
        SSL_ST_INIT = _lib.SSL_ST_INIT
    AttributeError: 'module' object has no attribute 'SSL_ST_INIT'
    

    対応手順はinstall MHN server eeror #433に記載されていました。

    # /opt/hpfeeds/env/bin/python -m pip install --upgrade pyopenssl
    Collecting pyopenssl
      Downloading pyOpenSSL-17.2.0-py2.py3-none-any.whl (52kB)
        100% |████████████████████████████████| 61kB 2.8MB/s
    Requirement already up-to-date: six>=1.5.2 in /opt/hpfeeds/env/lib/python2.7/site-packages (from pyopenssl)
    Requirement already up-to-date: cryptography>=1.9 in /opt/hpfeeds/env/lib/python2.7/site-packages (from pyopenssl)
    Requirement already up-to-date: ipaddress in /opt/hpfeeds/env/lib/python2.7/site-packages (from cryptography>=1.9->pyopenssl)
    Requirement already up-to-date: idna>=2.1 in /opt/hpfeeds/env/lib/python2.7/site-packages (from cryptography>=1.9->pyopenssl)
    Requirement already up-to-date: asn1crypto>=0.21.0 in /opt/hpfeeds/env/lib/python2.7/site-packages (from cryptography>=1.9->pyopenssl)
    Requirement already up-to-date: enum34 in /opt/hpfeeds/env/lib/python2.7/site-packages (from cryptography>=1.9->pyopenssl)
    Requirement already up-to-date: cffi>=1.7 in /opt/hpfeeds/env/lib/python2.7/site-packages (from cryptography>=1.9->pyopenssl)
    Requirement already up-to-date: pycparser in /opt/hpfeeds/env/lib/python2.7/site-packages (from cffi>=1.7->cryptography>=1.9->pyopenssl)
    Installing collected packages: pyopenssl
      Found existing installation: pyOpenSSL 0.14
        Uninstalling pyOpenSSL-0.14:
          Successfully uninstalled pyOpenSSL-0.14
    Successfully installed pyopenssl-17.2.0
    

    サービスを再起動します。

    # supervisorctl restart all
    honeymap: stopped
    geoloc: stopped
    mhn-collector: stopped
    mnemosyne: stopped
    mhn-celery-beat: stopped
    mhn-uwsgi: stopped
    mhn-celery-worker: stopped
    mhn-celery-beat: started
    honeymap: started
    mnemosyne: started
    geoloc: started
    mhn-uwsgi: started
    mhn-celery-worker: started
    mhn-collector: started
    hpfeeds-broker: started
    

    hpfeeds-brokerが正常に起動していることが確認できました。

    # supervisorctl status
    geoloc                           RUNNING   pid 1477, uptime 0:00:39
    honeymap                         RUNNING   pid 1475, uptime 0:00:39
    hpfeeds-broker                   RUNNING   pid 1483, uptime 0:00:39
    mhn-celery-beat                  RUNNING   pid 1474, uptime 0:00:39
    mhn-celery-worker                RUNNING   pid 1481, uptime 0:00:39
    mhn-collector                    RUNNING   pid 1482, uptime 0:00:39
    mhn-uwsgi                        RUNNING   pid 1480, uptime 0:00:39
    mnemosyne                        RUNNING   pid 1476, uptime 0:00:39
    

    今回はエラーが出ていませんでしたが、mhn-celery-workerのサービスが停止している場合は下記の対応で解消されるかもしれません。ログローテーションしてmhn.logが新規作成されてしまうと意味がないので、根本的な対応策ではありませんが。。。。

    cd /var/log/mhn/ sudo chown www-data mhn.log sudo supervisorctl start mhn-celery-worker

    via MHN Troubleshooting Guide · threatstream/mhn Wiki · GitHub

    Cowrieのインストール

    下記の要件でDropletを1台作成します。

    Choose an image Choose a size Choose a datacenter region
    Ubuntu 16.04.3 x64 $5/mo (512MB/1CPU, 20GB SSD disk, 1000GB transfer) Singapore 1

    MHNサーバーと同様に、パッケージの最新化とタイムゾーンの設定を行います。

    http://<MHNサーバーのIPアドレス>/ui/login/にWEBブラウザで接続するとログイン画面が表示されます。Email,Passwordを入力してLOGINをクリックします。

    2017082601

    Attack Stats画面が表示されます。Deployをクリックします。

    2017082602

    Deploy画面が表示されます。Select Scriptで、Ubuntu - cowrieを選択します。

    2017082603

    Deploy Commandが発行されるので、ハニーポットをインストールしたいサーバー上で下記のコマンドを実行します。すると、Cowrieのインストールが始まるはずですが失敗します(なので、実行しないでください)。

    wget "http://104.236.55.125/api/script/?text=true&script_id=14" -O deploy.sh && sudo bash deploy.sh http://104.236.55.125 dGjIQLRc
    

    Scriptを修正します。
    Cowrieのインストールに失敗してしまうのは、Cowrieの起動停止手順の変更スクリプトに反映されていないことが原因です。
    Deploy画面にてSelect ScriptからUbuntu - cowrieを選択した後、Scriptに記載されているコマンドを全て削除します。そのあと、mhn/deploy_cowrie.sh at master · SmUrF3R5/mhnに記載されている内容をScriptにコピペしてUPDATEをクリックします。

    ハニーポットをインストールしたいサーバー上で下記のコマンドを実行します。(最初に発行されたDeploy Commandと同じコマンドになります。)

    wget "http://104.236.55.125/api/script/?text=true&script_id=14" -O deploy.sh && sudo bash deploy.sh http://104.236.55.125 dGjIQLRc
    

    MHNサーバーで取得できる情報

    Cowrieのインストールが完了して、MHNサーバーとSensorsサーバーが正常に通信出来ていれば、下記の情報が確認できます。

    • http://<MHNサーバーのIPアドレス>/ui/sensors/に接続すると、登録されているSensorsサーバーの一覧が表示されます。

    2017082605

    • http://<MHNサーバーのIPアドレス>/ui/attacks/に接続すると、攻撃者の情報(国、IPアドレス)、攻撃されたポートなどの情報が一覧で表示されます。

    2017082606

    • http://<MHNサーバーのIPアドレス>/ui/dashboard/に接続すると、過去24時間の間に攻撃された数の総数や攻撃元IPアドレスのTop5などが一覧で表示されます。

    2017082607

    • http://<MHNサーバーのIPアドレス>/ui/chartに接続すると、SSHログインで試行されたユーザー名やパスワードが表示されます(SensorsサーバーにKippo,Cowrieを使用している場合のみ)。

    2017082608

    今回の設定の場合、CowrieにSSHログインした攻撃者のコマンドログを見たい時は従来通り、Cowrieにログインする必要があります。scriptを見れば分かりますが、OSにログインしたい場合は22ではなく2222でSensorsサーバーへログインします。