このサイトを動かしているサーバにIDS(Intrusion Detection System: 侵入検知システム)であるOSSECを導入した。ので手順やちょっと使った感じを記録しておく。

環境


動かしてる環境とか。

  • Ubuntu 20.04
  • OSSEC 3.6.0

OSSECについて


OSSEC

現時点で把握しているのは下記のあたり。

  • 各種ログ(auth.log, syslogやWebサーバのログ)を解析して不正アクセスをブロックしてくれるやつ
  • OSSのIDS
  • トレンドマイクロが開発している
    • 元は個人開発だったっぽい??
  • インストールはGitHubのソース落としてきてスクリプト流すだけ
  • マネージャとエージェントというよくあるスタイルだけども、スタンドアロンでも動かせる
  • メール通知できる

一部、開発が終わったかのように受け取れる記事が引っかかるけど、開発終了になったのはWebUIの部分のみでWebUI以外のところは開発継続されてる。

また、OSSECをForkしたものを組み込んで(??)Kibanaとかでグラフィカルに表示できるwazuhというのがあって、よさそうだったけど、これは個人で使うにはハードウェア要件がきつすぎるので諦めた。

動機など


nginxのログを基にしてBANしたい。

自前でサーバを運用したことのある人はわかると思うけれども、不届き者がこんな感じで悪いことできないか探してアクセスしてくる。余談だけどPHP関連が多い。インストールすらしてないのに…

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// IPはマスクしたけど全部同一もとからのアクセス
xxx.xxx.xxx.xxx - - [09/Jul/2020:13:51:34 +0900] "GET /wp-includes/js/jquery/jquery.js HTTP/1.1" 404 3717 "-" "Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:28.0) Gecko/20100101 Firefox/28.0"
xxx.xxx.xxx.xxx - - [09/Jul/2020:13:51:35 +0900] "GET /administrator/help/en-GB/toc.json HTTP/1.1" 404 3717 "-" "Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:28.0) Gecko/20100101 Firefox/28.0"
xxx.xxx.xxx.xxx - - [09/Jul/2020:13:51:37 +0900] "GET /administrator/language/en-GB/install.xml HTTP/1.1" 404 3717 "-" "Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:28.0) Gecko/20100101 Firefox/28.0"
xxx.xxx.xxx.xxx - - [09/Jul/2020:13:51:38 +0900] "GET /plugins/system/debug/debug.xml HTTP/1.1" 404 3717 "-" "Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:28.0) Gecko/20100101 Firefox/28.0"
xxx.xxx.xxx.xxx - - [09/Jul/2020:13:51:40 +0900] "GET /administrator/ HTTP/1.1" 404 3717 "-" "Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:28.0) Gecko/20100101 Firefox/28.0"
xxx.xxx.xxx.xxx - - [09/Jul/2020:13:51:41 +0900] "GET /misc/ajax.js HTTP/1.1" 404 3717 "-" "Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:28.0) Gecko/20100101 Firefox/28.0"
xxx.xxx.xxx.xxx - - [09/Jul/2020:13:51:44 +0900] "GET /admin/view/javascript/common.js HTTP/1.1" 404 3717 "-" "Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:28.0) Gecko/20100101 Firefox/28.0"
xxx.xxx.xxx.xxx - - [09/Jul/2020:13:51:45 +0900] "GET /admin/includes/general.js HTTP/1.1" 404 3717 "-" "Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:28.0) Gecko/20100101 Firefox/28.0"
xxx.xxx.xxx.xxx - - [09/Jul/2020:13:51:46 +0900] "GET /images/editor/separator.gif HTTP/1.1" 404 3717 "-" "Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:28.0) Gecko/20100101 Firefox/28.0"
xxx.xxx.xxx.xxx - - [09/Jul/2020:13:51:48 +0900] "GET /js/header-rollup-554.js HTTP/1.1" 404 3717 "-" "Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:28.0) Gecko/20100101 Firefox/28.0"
xxx.xxx.xxx.xxx - - [09/Jul/2020:13:51:49 +0900] "GET /vendor/phpunit/phpunit/build.xml HTTP/1.1" 404 3717 "-" "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50"
xxx.xxx.xxx.xxx - - [09/Jul/2020:13:51:51 +0900] "GET /fckeditor/editor/filemanager/connectors/php/upload.php?Type=Media HTTP/1.1" 404 3717 "-" "Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:28.0) Gecko/20100101 Firefox/28.0"
xxx.xxx.xxx.xxx - - [09/Jul/2020:13:51:52 +0900] "GET /.env HTTP/1.1" 404 3717 "-" "Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:28.0) Gecko/20100101 Firefox/28.0

今までこれを基本的に放置していた。放置していたといっても、あくまでWebサーバだけの話。SSHのポートはデフォルトから変えたり鍵使ったり、ファイアウォールで特定のポート以外はdenyしたりはしている。

でもWebサーバに関するやつは基本的にログから対処するくらいしかない。サーバを稼働させた当初からFail2Banをインストールしようかと何度も思ったけど、設定とかがめんどくさそうなので長らく放置してきた。

しかし、近々別のインスタンスに新しくAPIサーバを一つ立てる予定で、そのためにも導入した方が良いかと思って改めて調べたところOSSECというIDSがあるのがわかった。その上で下記のブログを見ると導入・設定も簡単そうだった。

ossecの導入

なによりnginxのログを解析してのブロックを設定なしでできそうというのが大きかった。実際にインストール後は特に設定なしでブロックできた。

セットアップ


必要なライブラリ

インストール要件でOS毎に必要な条件とかを確認する。他の記事だとgccがあればOKという記述があるけど、Ubuntuの場合はgcc以外にも下記が必要だった。

1
2
// 最小構成の場合
$ apt-get install build-essential make zlib1g-dev libpcre2-dev libevent-dev libssl-dev

ログをDBに貯めることもできるようだけど、そういうことをする場合はそれに合わせていろいろインストールする必要がある。まあ詳細は上のリンクで確認してください。

ダウンロード

ダウンロードページからダウンロードする。見たらわかるけどGitHubのリリースのリンクが貼ってあるだけ。

1
2
$ wget https://github.com/ossec/ossec-hids/archive/3.6.0.tar.gz
$ tar -zxvf 3.6.0.tar.gz

インストール

ここに書いてある通り。展開したディレクトリ内にsh install.shが存在するのでそれを実行するだけ。

下記のように対話形式で進めていく。非常にありがたいことに日本語が存在する。この手のものは普段は「英語でええやんけ」と思っているけど、母国語があるとやっぱりかなり楽でありがたい。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
** Para instalação em português, escolha [br].
** 要使用中文进行安装, 请选择 [cn].
** Fur eine deutsche Installation wohlen Sie [de].
** Για εγκατάσταση στα Ελληνικά, επιλέξτε [el].
** For installation in English, choose [en].
** Para instalar en Español , eliga [es].
** Pour une installation en français, choisissez [fr]
** A Magyar nyelvű telepítéshez válassza [hu].
** Per l'installazione in Italiano, scegli [it].
** 日本語でインストールします.選択して下さい.[jp].
** Voor installatie in het Nederlands, kies [nl].
** Aby instalować w języku Polskim, wybierz [pl].
** Для инструкций по установке на русском ,введите [ru].
** Za instalaciju na srpskom, izaberi [sr].
** Türkçe kurulum için seçin [tr].
(en/br/cn/de/el/es/fr/hu/it/jp/nl/pl/ru/sr/tr) [en]:

日本語選択すると下記のような感じでインストールが始まる。先に書いた通りマネージャ/エージェントで動かすよくあるやつだけどlocalを選択するとスタンドアロンで動かせる。マネージャ/エージェントとなると通信の設定とか鍵でごにょごにょとかめんどくさいし、インスタンス間で依存関係をもたせたくないのでlocalで行くことにした。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
 OSSEC HIDS v3.6.0 インストールスクリプト - http://www.ossec.net

OSSEC HIDS のインストール作業を始めます.
事前に C コンパイラがシステムにインストールされてる必要があります.

- システム: Linux your-machine-name 5.4.0-28-generic
- ユーザ: root
- ホスト: your-machine-name


-- 続けるには ENTER を押してください.また,Ctrl-C で中止します. --


1- どの種類のインストールを選択しますか (server,agent,local または help)? local

- Local インストールを選択しました.

2- インストール環境を設定しています.

- OSSEC HIDS のインストール先を選択してください [/var/ossec]:

- インストール先を以下に作成します /var/ossec .

3- 設定 OSSEC HIDS.

3.1- メール通知を希望しますか? (y/n) [y]: y
- メールアドレスは何ですか? your-email-address@outlook.com

- あなたの SMTP サーバを発見しました: outlook-com.olc.protection.outlook.com.
- このサーバを使用しますか? (y/n) [y]: y

--- この SMTP サーバを使用します: outlook-com.olc.protection.outlook.com.

3.2- 整合性検査を行うデーモンを実行させますか? (y/n) [y]: y

- syscheck (整合性検査デーモン) を実行させます.

3.3- rootkit 検知エンジンを実行させますか? (y/n) [y]: y

- rootcheck (rootkit 検知) を実行させます.

3.4- アクティブレスポンスによりイベントが発生した際に特定の
コマンドを実行することができます.
例えば,ある IP アドレスを遮断することや特定のユーザ
に対してアクセスを無効にすることができます.
詳細な情報は以下にあります:
http://www.ossec.net/en/manual.html#active-response

- アクティブレスポンスを有効にしますか? (y/n) [y]: y

- アクティブレスポンスを有効にしました.

- デフォルトでは,host-deny と firewall-drop レスポンス
が有効化することができます.一つ目は /etc/hosts.deny
にホストを加えます.二つ目は iptable (linux) か
ipfilter (Solaris, FreeBSD または NetBSD) によりホストを
遮断します.

- SSHD への総当たりスキャン,ポートスキャンや他の何らかの
攻撃手法を停止することに使うことができます.
また,例えば,snort のイベントに基づいてそれらを遮断する
こともできます.

- firewall-drop レスポンスを有効にしますか? (y/n) [y]: y

- local での levels >= 6 に対する firewall-drop を有効にしました

- ホワイトリストへ IP を追加しますか? (y/n)? [n]: n

3.6- 以下のログを解析するための設定を準備しています:
-- /var/log/auth.log
-- /var/log/syslog
-- /var/log/dpkg.log
-- /var/log/nginx/access.log (apache log)
-- /var/log/nginx/error.log (apache log)

- 他のファイルを監視したい場合は,ossec.conf を変更し
新しいエントリーを追加してください.
設定に関するどんな質問にも我々の Web サイト http://www.ossec.net
を訪れることで答えることができます.


--- 続けるには ENTER を押してください ---

これでインストールは終わり。グローバルIPはたまに変わるのでホワイトリストは設定しないようにした。ちなみに、インストールに必要なライブラリがなかったりするとENTER押した後にエラーが出る。

インストールが終わると下記のように表示される。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
- システムは Debian (Ubuntu or derivative).
- 初期スクリプトはブート中に OSSEC HIDS を起動するよう修正しました.

- 設定が完全に終了しました.

- OSSEC HIDS を開始させます:
/var/ossec/bin/ossec-control start

- OSSEC HIDS を停止させます:
/var/ossec/bin/ossec-control stop

- 以下のファイルで設定についての確認と変更ができます /var/ossec/etc/ossec.conf


OSSEC HIDS の使用に感謝します.
あなたが何らかの質問,提案したいときや,バグを発見したときは,
contact@ossec.net まで連絡するか ossec-list@ossec.net にある
我々の公開メーリングリストを使ってください.
(http://www.ossec.net/main/support/).

詳細な情報は http://www.ossec.net にあります.

--- ENTER を押すと終了します (以下,詳細な情報が続きます).---

起動する


インストール後に自動で起動するわけではないので下記のコマンドで起動する。

1
$ /var/ossec/bin/ossec-control start

プロセスを確認するといろいろ動いているのがわかる。

1
2
3
4
5
6
7
8
9
$ ps -aux | grep ossec
ossecm 180064 0.0 0.2 4444 2024 ? S 11:43 0:00 /var/ossec/bin/ossec-maild
ossecm 180065 0.0 0.2 4444 2880 ? S 11:43 0:00 /var/ossec/bin/ossec-maild
root 180068 0.0 0.1 3160 1524 ? S 11:43 0:00 /var/ossec/bin/ossec-execd
ossec 180072 0.1 0.6 7768 6680 ? S 11:43 0:00 /var/ossec/bin/ossec-analysisd
root 180077 0.0 0.2 3564 2072 ? S 11:43 0:00 /var/ossec/bin/ossec-logcollector
root 180081 0.0 0.0 3740 432 ? S 11:43 0:00 /var/ossec/bin/ossec-syscheckd
ossec 180084 0.0 0.1 4020 1532 ? S 11:43 0:00 /var/ossec/bin/ossec-monitord
ossecm 180099 0.0 0.0 0 0 ? Z 11:43 0:00 [ossec-maild] <defunct>

設定やルール


デフォルトだと下記に設定が存在する。

1
$ /var/ossec/etc/ossec.conf

これをザっと見るとlevel 6以上のルールに引っかかった場合にiptablesなどを利用して10分間対象のIPアドレスを遮断する設定になっていた。

さらに/var/ossec/rules/の下にnginx_rules.xmlのような感じで細かく設定がわけられていた。

ログを確認してみる


/var/ossec/logs/alerts/alerts.logにログがある。こんな感じで各種ログに出力されているアレしてきたやつがまとめて表示される。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
** Alert 1594387020.201362: - syslog,sshd,invalid_login,authentication_failed,
2020 Jul 10 22:17:00 your-machine-name->/var/log/auth.log
Rule: 5710 (level 5) -> 'Attempt to login using a non-existent user'
Src IP: xxx.xxx.xxx.xxx
Jul 10 22:17:00 your-machine-name sshd[183813]: Invalid user leonard from xxx.xxx.xxx.xxx port 49828

** Alert 1594387022.201682: - syslog,sshd,invalid_login,authentication_failed,
2020 Jul 10 22:17:02 your-machine-name->/var/log/auth.log
Rule: 5710 (level 5) -> 'Attempt to login using a non-existent user'
Src IP: xxx.xxx.xxx.xxx
Jul 10 22:17:01 your-machine-name sshd[183813]: Disconnected from invalid user leonard xxx.xxx.xxx.xxx port 49828 [preauth]

** Alert 1594387212.202448: - web,accesslog,
2020 Jul 10 22:20:12 your-machine-name->/var/log/nginx/access.log
Rule: 31101 (level 5) -> 'Web server 400 error code.'
Src IP: xxx.xxx.xxx.xxx
xxx.xxx.xxx.xxx - - [10/Jul/2020:22:20:11 +0900] "GET /owa/auth/logon.aspx?url=https%3a%2f%2f1%2fecp%2f HTTP/1.1" 444 0 "-" "Mozilla/5.0 zgrab/0.x"

BANされるか試す


スマホで存在しないページに連続してアクセスしてブロックされることを確認してみた。ちゃんと動いた。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
** Alert 1577911506.80876: mail  - web,accesslog,web_scan,recon,
2020 Jul 10 20:45:06 your-machine-name->/var/log/nginx/access.log
Rule: 31151 (level 10) -> 'Multiple web server 400 error codes from same source ip.'
Src IP: xxx.xxx.xxx.xxx
xxx.xxx.xxx.xxx - - [10/Jul/2020:20:45:06 +0900] "GET /hhgf HTTP/2.0" 404 3705 "-" "Mozilla/5.0 (Linux; Android 10; Pixel 3a) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Mobile Safari/537.36"
xxx.xxx.xxx.xxx - - [10/Jul/2020:20:45:05 +0900] "GET /hhgf HTTP/2.0" 404 3705 "-" "Mozilla/5.0 (Linux; Android 10; Pixel 3a) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Mobile Safari/537.36"
xxx.xxx.xxx.xxx - - [10/Jul/2020:20:45:03 +0900] "GET /hhgf HTTP/2.0" 404 3705 "-" "Mozilla/5.0 (Linux; Android 10; Pixel 3a) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Mobile Safari/537.36"
xxx.xxx.xxx.xxx - - [10/Jul/2020:20:45:02 +0900] "GET /hhgf HTTP/2.0" 404 3705 "-" "Mozilla/5.0 (Linux; Android 10; Pixel 3a) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Mobile Safari/537.36"
xxx.xxx.xxx.xxx - - [10/Jul/2020:20:45:01 +0900] "GET /hhgf HTTP/2.0" 404 3705 "-" "Mozilla/5.0 (Linux; Android 10; Pixel 3a) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Mobile Safari/537.36"
xxx.xxx.xxx.xxx - - [10/Jul/2020:20:45:00 +0900] "GET /hhgf HTTP/2.0" 404 3705 "-" "Mozilla/5.0 (Linux; Android 10; Pixel 3a) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Mobile Safari/537.36"
xxx.xxx.xxx.xxx - - [10/Jul/2020:20:44:59 +0900] "GET /hhgf HTTP/2.0" 404 3705 "-" "Mozilla/5.0 (Linux; Android 10; Pixel 3a) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Mobile Safari/537.36"
xxx.xxx.xxx.xxx - - [10/Jul/2020:20:44:58 +0900] "GET /hhgf HTTP/2.0" 404 3705 "-" "Mozilla/5.0 (Linux; Android 10; Pixel 3a) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Mobile Safari/537.36"
xxx.xxx.xxx.xxx - - [10/Jul/2020:20:44:57 +0900] "GET /hhgf HTTP/2.0" 404 3705 "-" "Mozilla/5.0 (Linux; Android 10; Pixel 3a) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Mobile Safari/537.36"
xxx.xxx.xxx.xxx - - [10/Jul/2020:20:44:55 +0900] "GET /hhgf HTTP/2.0" 404 3705 "-" "Mozilla/5.0 (Linux; Android 10; Pixel 3a) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Mobile Safari/537.36"
xxx.xxx.xxx.xxx - - [10/Jul/2020:20:44:54 +0900] "GET /hhgf HTTP/2.0" 404 3705 "-" "Mozilla/5.0 (Linux; Android 10; Pixel 3a) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Mobile Safari/537.36"
xxx.xxx.xxx.xxx - - [10/Jul/2020:20:44:53 +0900] "GET /hhgf HTTP/2.0" 404 3705 "-" "Mozilla/5.0 (Linux; Android 10; Pixel 3a) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Mobile Safari/537.36"

この後、登録しているメールにも通知が来た。ブロックの時間はデフォルトで10分になっているので10分くらい経つと再度アクセスできた。

何回でブロックされるのかよくわかっていない(設定をザっと見ても見当たらなかった)が10回くらいっぽい。邪悪なやからのWebアクセスは10回未満で切り上げていくケースもあるのでもう少し短くしてほしいという気持ちはある。

メール通知


既に書いた通り、重要なイベント(ブロックなど)が発生した場合に飛んでくる。

また、サーバにログインしたときもメールが飛んできて「ありがたい」とおもったけど、これはIPアドレスごとに初回だけ??なのか1回しか飛んでこなかった。

所感


というわけで…

  • ノーコンフィグでいけたのでとても良い
  • 各種ログを一か所で確認できるのでよい
    • もともとあんまり見てないけど…
  • 404でブロックできるようになったのでよい
    • でももうちょっときつめにしたい
  • メール飛んでくるの良い

という感じ。良い感じなので、もうちょっと使ってみてもう一台のサーバにも入れようと思う。おわり。