MineMeldをUbuntu 20.04にインストールするバッドノウハウ

# 概要

MineMeldをUbuntu 20.04にインストールすることができたのでメモしておきます。

この記事に記載の内容はバッドノウハウの類ですが、古いソフトウェアを敢えて使わなければならないシチュエーションというのも人生の中ではあると思うので、何かの役に立てば幸いです。


# MineMeldとは？

MineMeldとは、OSINTのデータを自動的に収集するツールです。Palo Alto社が開発し、オープンソースで公開されています。
Palo Alto社が公開している資料がわかりやすいと思います。

https://live.paloaltonetworks.com/twzvq79624/attachments/twzvq79624/JPPublicInfo/17/1/MineMeld%E8%87%AA%E5%8B%95%E5%8C%96.pdf


ただし、現時点（2021/8/14）では以下のような問題点を抱えています。

- 公式サポートは2021/8/1で終了している

参考： 

https://live.paloaltonetworks.com/t5/blogs/minemeld-end-of-life-announcement/ba-p/419392

- Python 2.7で開発されている

Python 2.7系は、2020/1/1 でサポートが終了しています。

参考： 

https://atmarkit.itmedia.co.jp/ait/articles/1906/27/news016.html

- 他にも依存関係が多い
  - Nginx
  - Redis
  - Collectd
  - Node.js
 

このような状況から、新しい環境（OS）に対応していくのはなかなかしんどい状況になりつつあります。
MineMeldは、OSINTのデータを収集するという目的に対しては少々オーバーエンジニアリングなんじゃないかという気がしますが、ひとまずそこには触れないことにします。


# シナリオ

Palo Alto社がAnsibleのPlaybookを公開しているので、基本的にはこれを使ってインストールすることにします。2年くらい更新されてませんが、Ubuntu 18.04までは対応しているので、それほど大きな修正は必要ないだろうと想定しました。

https://github.com/PaloAltoNetworks/minemeld-ansible


対応が必要だった内容は主に以下の3つです。再現性のある手順になってはいると思いますが、1と2はともかくとして、3はあまりきれいに解決できてません。

1. Ubuntu 20.04 に対応していない
2. 同梱のTLS証明書の鍵長が短い（Nginxが起動しない）
3. PythonのJSONライブラリ（ujson.so）が壊れる


# 対応内容

## Ubuntu 20.04 に対応していない

まずはUbuntu 20.04に対応する必要があります。AnsibleでOSのディストリビューションとバージョンを見て処理を分けていることがわかったので、Ubuntu 18.04用の処理を参考にできると思いました。結果的には、以下のようにUbuntu 18.04用のファイルをコピーしたらインストールできました。

```
$ cd roles/infrastructure/vars/
$ cp Ubuntu-18.04.yml Ubuntu-20.04.yml
```

```
$ cd roles/minemeld/vars/
$ cp Ubuntu-18.04.yml Ubuntu-20.04.yml
```

## 同梱のTLS証明書の鍵長が短い（Nginxが起動しない）

インストールはできたものの、Nginxが起動しない問題に遭遇しました。error.logを見ると以下のようなメッセージが出力されていました。

```
$ sudo more /var/log/nginx/error.log
...
2021/08/14 04:06:41 [emerg] 30192#30192: SSL_CTX_use_certificate("/etc/nginx/minemeld.cer") failed (SSL:error:140AB18F:SSL routines:SSL_CTX_use_certificate:ee key too small)
```

Playbookにサーバ証明書と秘密鍵が同梱されているのですが、鍵長が1024bitで作成されており短すぎるということでした。OpenSSL 1.1.1以降では2048bit未満の鍵長をデフォルトでは受け付けてくれなくなったようです。

https://github.com/openssl/openssl/commit/70b0b977f73cd70e17538af3095d18e0cf59132e

このままではNginxが起動できないので、2048bitで以下のように作り直すことにしました。


```
$ openssl genrsa 2048 > minemeld.pem
```

```
$ openssl req -new -x509 -days 3650 -key mimemeld.pem -sha512 -out mimemeld.cer
```

roles/minemeld/files/ のファイルを入れ替えておけばAnsibleでインストールできます。あとから/etc/nginx配下のファイルを入れ替えてもいいです。


## PythonのJSONライブラリ（ujson.so）が壊れる

ここまででMinemeldが起動し、ログイン画面まではたどり着けましたが、まだ正常に動作していませんでした。
ログを見ると以下のようなPythonのエラーが出力されていました。

```
$ more /opt/minemeld/log/minemeld-engine.log
...
ImportError: /opt/minemeld/engine/current/lib/python2.7/site-packages/ujson.so: undefined symbol: Buffer_AppendShortHexUnchecked
```

詳細がよくわからないのでエラーメッセージでGoogle検索してみると以下のページがヒットしました。PythonのujsonライブラリとGCCのバージョンの組み合わせで発生するようで、これをAnsibleだけでなんとかするのはあまり簡単ではなさそうだと思いました。

https://github.com/ultrajson/ultrajson/issues/346

MineMeldで同じ事象に遭遇している例もあり、ujson.soを外から持ってきて入れ替えるというワークアラウンドで動作したようでした。

https://live.paloaltonetworks.com/t5/minemeld-discussions/ubuntu-18-04-install-errors/m-p/309543/highlight/true#M3547

いろいろと方法は考えられますが、Ansibleで解決するのは諦めて手動対応することにしました。


# インストール手順


## 事前準備

Ubuntu 18.04と同様に必要なパッケージをインストールします。

```
$ sudo apt install -y gcc make git ansible python2.7-dev libffi-dev libssl-dev 
```

## Ansibleの実行

リポジトリをクローンして、上述のワークアラウンドを行います。

```
$ git clone https://github.com/PaloAltoNetworks/minemeld-ansible.git
...
ワークアラウンド実施
```

または、Ubuntu 20.04対応済みのForkを使っていただいてもいいです。

```
$ git clone https://github.com/shakemid/minemeld-ansible.git
```

ansible-playbookを実行します。

```
$ cd minemeld-ansible
$ ansible-playbook -K local.yml
...
```

正常にインストールできたら自動的にサービス起動します。


## JSONライブラリの修正

ujson.soをパッケージから抜き出して入れ替えます。Ubuntu 20.04にはPython2.7のライブラリがないようなので、18.04のものを使います。

適当なミラーサイトからdebファイルをダウンロードします。

```
$ wget  http://ftp.yz.yamagata-u.ac.jp/pub/linux/ubuntu/archives/pool/universe/u/ujson/python-ujson_1.35-2_amd64.deb
```

debファイルをdpkg-debコマンドで展開します。

```
$ dpkg-deb -xv python-ujson_1.35-2_amd64.deb .
./
./usr/
./usr/lib/
./usr/lib/python2.7/
./usr/lib/python2.7/dist-packages/
./usr/lib/python2.7/dist-packages/ujson-1.35.egg-info
./usr/lib/python2.7/dist-packages/ujson.x86_64-linux-gnu.so
./usr/share/
./usr/share/doc/
./usr/share/doc/python-ujson/
./usr/share/doc/python-ujson/README.rst.gz
./usr/share/doc/python-ujson/changelog.Debian.gz
./usr/share/doc/python-ujson/copyright
```

ujson.soファイルを入れ替えます。

```
$ sudo cp usr/lib/python2.7/dist-packages/ujson.x86_64-linux-gnu.so /opt/minemeld/engine/current/lib/python2.7/site-packages/ujson.so
```

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

```
$ sudo systemctl restart minemeld.service
```

## ログイン

ウェブブラウザでインストールしたサーバにHTTPS接続するとログイン画面が表示されます。アカウントと初期パスワードは admin/minemeld です。
![minemeld_login.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317213/218f1f64-c4c1-cd30-b301-9037bfc19342.png)

ログイン後、正常に動作していればダッシュボードが表示されます。
![minemeld_dashboard.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317213/c32ea5da-25c8-f240-e6f9-860d88fd07e1.png)


というわけで、Ubuntu 20.04にMineMeldをインストールできました。
古いソフトウェアを非対応の環境で無理矢理動かすのはあまりお勧めはできませんが、一種のトラブルシューティングのようで、調査の過程でいろんなことがわかって楽しいこともあります。