フリーで使えるセキュリティツールあれこれ

このブログは、大國魂(ITブログ) Advent Calendar 2019 の16日目です。

ここいらでセキュリティ系のネタを入れますか

年末なので、ここいらで一本入れておきます。<強引
以前からサーバー・ネットワーク側でフリーで導入可能なセキュリティツールについて勉強したいなぁ、と思っていたのでこの機会に書いてみます。

ここに記載するのは、前述の通りサーバー・ネットワークを対象としてフリーで利用可能なものに限っています。オープンソースのもの、そして今後個人的に検証したいもの中心です。

脆弱性スキャナ系

日々次々と脆弱性の情報が公開されている中で、様々なソフトウェアが数多く動作している環境を運用していると、該当するかしないかを把握するだけでも大変ですよね。
脆弱性スキャナは、公開されている脆弱性情報を基に攻撃されたら痛いところがないかを検査・診断してくれるツールであり、人で例えるなら定期的な健康診断で病気や病気の予備群がないか検査するような感じですね。
メジャーなところだと以下のようです。

  • OpenVAS
  • Vuls
  • OpenSCAP

私がざっと調べてみた感じで簡単に特徴と印象を書いてみます。

OpenVAS

脆弱性スキャナの老舗。元々はNessusという名称だったがそれが商用化されクローズドになったため、フォークしてコミュニティレベルで開発が続けられているもの。
Linux系だけではなくWindowsに対してもスキャン可能。
検査手法は実際に攻撃を仕掛けてみる的なやり方であるに加えて、サービスとして露出しているものは手当たり次第に検査されるので、このツールに関して正に手加減という言葉を知りません。
GUIのダッシュボードやスキャン結果のレポートが見易い。
OpenVAS 公式ページ

Vuls

最近流行った。Linux/FreeBSD系のみ対応。
基本的にはパッケージでインストールしたものが検査対象。
ネットワーク脆弱性の検査機能はないが、レポートに関しては割といい感じでグラフ表示やSlackへの通知連携等多機能。
セットアップもシンプルで手軽というのもあり流行ったのかしら?
Vuls 公式ページ

OpenSCAP

SCAP(Security Content Automation Protocol)という情報セキュリティ対策の自動化・標準化の規格があるらしく、それのオープンソースでの実装。
上二つとスキャンのアプローチが若干異なっているため、スキャン結果レポートが少々見づらい。 ただOpenSCAPはいくつかある「規格」1に対してどの程度適合しているのかを確認するためのテンプレートが用意されていて、それについて判定したい場合は使うべきツール。
OpenSCAP 公式ページ

上記3つの比較を分かり易くまとめているThink ITのこちらのページがとても勉強になりました。

攻撃/侵入検知系

いろいろな記事を見ていると、今は多層防御が当たり前の時代のようですね。
ファイアウォールをすり抜けられて実際に攻撃/侵入されてしまった際の防御手段がこれから挙げるものですが、決して新しいものではなく割と以前から存在している定番のツールたちです。

  • Fail2ban
  • Tripwire
  • Snort

Fail2ban

ログを監視するというところが特徴的なツール。DoS/DDoSのような攻撃向きで、単位時間あたりのアクセス数を条件にして、一致した通信を検知すると以降はブロック(BAN)するといった使い方をする。
例えば、WEBサーバーのアクセスについて3秒間に12リクエストがあった場合にその送信元IPからのリクエストは86400秒間ブロックするといった感じ。導入は手軽に出来そうだが運用していく上で条件のチューニングとかにコツがいりそう。

Fail2ban 公式ページ

Tripwire

結構な歴史があるツール。ファイル/ディレクトリの変更を監視し、改ざんを検知する。
有償版と無償のOSS版があり有償版はWindowsの監視にも対応。
仕組みは、まずある時点のファイルシステムの状態を記録してベースラインと呼ばれるデータベースを作成し、そこから差異があるかないかで改ざんをチェックするというもの。これもどう運用していくか運用設計を考える必要ありかなと思う。

Tripwire(OSS) GitHubページ

Snort

ネットワークを流れるトラフィックをキャプチャして解析を行い、シグネチャと呼ばれるルールをもとに不正なアクセスと判断した通信を遮断をする。
Sourcefire社(後にCiscoに買収)が開発したもので、様々な製品に利用されている。
実は以前からこのツールを検証してみたかったので、今回このSnortについてちょっとだけ触ってみたいと思います。
Snort 公式ページ

Snortのインストール

  • 環境
    • CentOS 7.5
    • Snort 2.9.15

上記の公式ページよりソースをダウンロードしてビルドしました。
詳細は割愛。手順は公式ページにあったスタートアップガイドを参考にしています。

Snortのテスト

ルールセットのファイルは有料ライセンスを取得していればVRTと呼ばれるセキュリティ専門家が検証を実施した常に最新のものを定期的に自動でダウンロードして更新することができます。また5日遅れのもので良ければ無料でダウンロードしてくることもできるようです。
今回は簡単なテストなのでその辺の設定は後日に試したいと思います。

テストはHOME_NETで定義したネットワーク宛にICMPを送信してアラートとして検知されるルールを書いて確認します。

  • 設定ファイル(/etc/snort/snort.conf)
ipvar HOME_NET 172.25.2.0/24
ipvar EXTERNAL_NET !$HOME_NET
var RULE_PATH /etc/snort/rules
var SO_RULE_PATH /etc/snort/so_rules
var PREPROC_RULE_PATH /etc/snort/preproc_rules
var WHITE_LIST_PATH /etc/snort/rules
var BLACK_LIST_PATH /etc/snort/rules
#output unified2: filename alert.log, limit 1024
output alert_unified2: filename snort.alert, limit 1024
include $RULE_PATH/local.rules
  • ルールファイル(/etc/snort/rules/local.rules)
alert icmp any any -> $HOME_NET any (msg:"ICMP test"; sid:10000001; rev:001;)
  • テスト起動
sudo snort -T -c /etc/snort/snort.conf -i eth0
Running in Test mode

        --== Initializing Snort ==--
Initializing Output Plugins!
Initializing Preprocessors!
Initializing Plug-ins!
Parsing Rules file "/etc/snort/snort.conf"
Tagged Packet Limit: 256
Log directory = /var/log/snort
spo_unified2 /etc/snort/snort.conf(9)=> Lowering limit of 1024MB to 512MB

+++++++++++++++++++++++++++++++++++++++++++++++++++
Initializing rule chains...
1 Snort rules read
    1 detection rules
    0 decoder rules
    0 preprocessor rules
1 Option Chains linked into 1 Chain Headers
+++++++++++++++++++++++++++++++++++++++++++++++++++

+-------------------[Rule Port Counts]---------------------------------------
|             tcp     udp    icmp      ip
|     src       0       0       0       0
|     dst       0       0       0       0
|     any       0       0       1       0
|      nc       0       0       1       0
|     s+d       0       0       0       0
+----------------------------------------------------------------------------

~~~~~~~~~~~~~~~~~~~~~~~~~~~( 中略 )~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Rule application order: pass->drop->sdrop->reject->alert->log
Verifying Preprocessor Configurations!

[ Port Based Pattern Matching Memory ]
pcap DAQ configured to passive.
Acquiring network traffic from "eth0".

        --== Initialization Complete ==--

   ,,_     -*> Snort! <*-
  o"  )~   Version 2.9.15 GRE (Build 7)
   ''''    By Martin Roesch & The Snort Team: http://www.snort.org/contact#team
           Copyright (C) 2014-2019 Cisco and/or its affiliates. All rights reserved.
           Copyright (C) 1998-2013 Sourcefire, Inc., et al.
           Using libpcap version 1.5.3
           Using PCRE version: 8.32 2012-11-30
           Using ZLIB version: 1.2.7


Snort successfully validated the configuration!
Snort exiting

アラートのログは/var/log/snortに出力されるので、別のシェルからtail -fコマンドでログを監視し他からpingを飛ばした際に出力がされるかを確認します。

sudo tail -f /var/log/snort/snort.alert.1576518160

ではいよいよSnortをデーモンとしてプロセスを起動します。

sudo /usr/sbin/snort -D -i eth0 -u snort -g snort -c /etc/snort/snort.conf -l /var/log/snort
Spawning daemon child...
My daemon child 26216 lives...
Daemon parent exiting (0)

このタイミングでpingを飛ばします。

ping 172.25.2.16
PING 172.25.2.16 (172.25.2.16) 56(84) bytes of data.
64 bytes from 172.25.2.16: icmp_seq=1 ttl=64 time=0.026 ms
64 bytes from 172.25.2.16: icmp_seq=2 ttl=64 time=0.033 ms
64 bytes from 172.25.2.16: icmp_seq=3 ttl=64 time=0.033 ms
64 bytes from 172.25.2.16: icmp_seq=4 ttl=64 time=0.044 ms

再びtail側を確認すると…

 sudo tail -f /var/log/snort/snort.alert.1576518160
      4        ] )          
  n               4        ]!(          
  n               4        ]"4         
  n               4        ]G   8         

はい、ちゃんと出力されました。ただ何やら読めないものが出力されていますね。
もともとSnortのデフォルトの出力フォーマットはバイナリのためそのままでは読めないようで、別途Barnyard2といったものをインストールしてそちらから出力させる必要があります。そちらも後日実施してみたいと思います。

終わりに

今回はフリーで利用できるセキュリティツールをいくつか見てきました。
Snortに関してはほんの触り程度ですが実機で動作をさせてみて、使いこなそうと思うとそれなりに設定に苦労しそうと思いましたが、それでもセキュリティ観点からこういったものを積極的に活用していくべきと感じました。


  1. PCI-DSS(クレジットカード情報およびその取引情報を保護するためのグローバルな業界団体基準)やDISA STIG(米国国防総省におけるITインフラセキュリティに関する技術的方法論)などがある。 ↩︎

コメント