セキュリティスキャンサービス「Walti」使ってみた

Twitterで流れてきた、「サーバサイドのセキュリティスキャンサービスWalti」がムラムラ気になっていたのだが、初回スキャン無料のキャンペーンをしているようなのでさっそく試してみた。

Waltiとは何か

最近、地味に流行の兆しを見せつつある(?)、Webサービス向けのクラウド型セキュリティスキャンサービス。提供は、インフラやってる人には有名な(株)ハートビーツの子会社(株式会社ウォルティ設立のお知らせ)。対抗馬としては、BitforestのVAddyになるのかな。

と言ってもこういうのは意外に結構昔からあるので、今風を名乗るならやはりAPIを用意して、cronやJenkinsと連携して自動的にセキュリティスキャンする……というCI的使い方をしたくなる(すなわちDevOpsならぬ、DevOps+Sec)。Waltiでもそういう使い方を意識しているようだが、APIはまだ準備中なのでWeb操作しかできない。

気になるスキャン価格は以下。

Web料金 API料金
portscan 10円 8円
sslyze 5円 4円
nikto 10円 8円
skipfish 100円 80円

portscanは、nmapをかけてくれる。sslyzeとはSSLのCipherSuite列挙や、HeartbleedなどSSL関連のチェックをしてくれるもの。

niktoは結構昔からあるWebセキュリティスキャナで、Perlで書かれている。手元のMacBookで実行すると、こんな感じ↓。

macbook:nikto-2.1.5 ozuma$ perl nikto.pl -host localhost
- Nikto v2.1.5
---------------------------------------------------------------------------
+ Target IP:          127.0.0.1
+ Target Hostname:    localhost
+ Target Port:        80
+ Start Time:         2014-11-23 21:58:38 (GMT9)
---------------------------------------------------------------------------
+ Server: Apache/2.2.26 (Unix) DAV/2 mod_ssl/2.2.26 OpenSSL/0.9.8za
+ Server leaks inodes via ETags, header found with file /, inode: 260474, size: 44, mtime: 0x3e9564c23b600
+ The anti-clickjacking X-Frame-Options header is not present.
+ Uncommon header 'tcn' found, with contents: choice
+ OSVDB-637: Enumeration of users is possible by requesting ~username (responds with 'Forbidden' for users, 'not found' for non-existent users).
+ mod_ssl/2.2.26 appears to be outdated (current is at least 2.8.31) (may depend on server version)
+ OpenSSL/0.9.8za appears to be outdated (current is at least 1.0.1c). OpenSSL 0.9.8r is also current.
+ Allowed HTTP Methods: GET, HEAD, POST, OPTIONS
+ mod_ssl/2.2.26 OpenSSL/0.9.8za - mod_ssl 2.8.7 and lower are vulnerable to a remote buffer overflow which may allow a remote shell (difficult to exploit). CVE-2002-0082, OSVDB-756.
+ OSVDB-3092: /manual/: Web server manual found.
+ OSVDB-3233: /index.html.en: Apache default foreign language file found. All default files should be removed from the web server as they may give an attacker additional system information.
+ OSVDB-3268: /icons/: Directory indexing found.
+ OSVDB-3268: /manual/images/: Directory indexing found.
+ OSVDB-3233: /icons/README: Apache default file found.
+ 6544 items checked: 0 error(s) and 13 item(s) reported on remote host
+ End Time:           2014-11-23 21:58:49 (GMT9) (11 seconds)
---------------------------------------------------------------------------
+ 1 host(s) tested

skipfishは私知らなかったのだけど、アグレッシブにWebアプリをチェックしてくれるツールらしい。これだけお高いのであんまり気軽にかけられないね。

というわけで手持ちのサーバにスキャンしてみた。

スキャン手順

アカウントを作ると、まずログイン直後に「組織」を入力するように言われる。これはスキャン結果のグルーピングのものなので会社名というよりはチームとかシステム名的な扱いらしい。が、とりあえず個人利用としてみた。FAQにも、個人利用で構わないとはっきり書いてあるし(個人でも利用できますか?)。

スキャン自体は、基本的にIPアドレスを指定して「開始」を押すだけなのでそんなに難しいことは無い。ただし他人のサーバに勝手にかけられないように、Waltiはスキャン前に認証ファイルを確認するようになっている。ちょうどGoogle Webmasterとかで置くのと同様のもの。

このチェック用の認証ファイルはhttpで取りに来るので、httpを上げていないサーバ(メールサーバなど)や、80/tcp以外でhttpをサービスしているちょっと特殊なサーバはスキャンできない。まぁあんまり無いと思うけど注意。

また、初回スキャンでは、この認証ファイル確認後に問答無用でスキャンが始まるため注意しないとけない。

この確認画面が出た後、メニュー画面に戻るともうスキャンが始まっていた。ちょっとビックリした(^^;)。

とりあえず認証ファイルだけ置いてセッティングして後でスキャンしよう、と思っている人は注意。

スキャン元IPアドレス

FAQに記載されている通り、Waltiではスキャン元のIPアドレスを指定することはできない(Walti.ioからのスキャン元のIPについて)。

実際にスキャンして試してみたところ、スキャン元のIPアドレスはいくつかあるのだが、それらをWhoisで引いてみるとすべてDigital Oceanとなっていた。

macmini:~ ozuma$ whois -h whois.arin.net 162.243.139.152
....(省略)....
NetRange:       162.243.0.0 - 162.243.255.255
CIDR:           162.243.0.0/16
NetName:        DIGITALOCEAN-7
NetHandle:      NET-162-243-0-0-1
Parent:         NET162 (NET-162-0-0-0-0)
NetType:        Direct Allocation
OriginAS:       AS14061, AS62567, AS46652
Organization:   Digital Ocean, Inc. (DO-13)
....(省略)....

というわけで、スキャン用サーバはDigital Oceanにあるようだ。おそらく動的に確保するから、スキャン元のIPアドレスを指定できないのだろう。

スキャン結果

ではスキャンしてみた感想……の前に、スキャン対象のサーバ構成をざっくり紹介。

対象サーバの構成

CentOS 6.5(64bit)で、以下サービスを用意した。

Apacheは、ちょっと意地悪をして大量にListenディレクティブを書いて20個ほどのポートで同時に待ち受けてみた。

ポートスキャン

ポートスキャンはnmapで行われるので、その結果も見慣れたポートスキャンの出力である。次のように、「結果」のところに今風のWebデザインでのポート列挙と、nmapの出力のテキストを見ることができる。

なおスキャンはTCP SYNスキャンを全ポートで行い、UDPスキャンは実施されないので注意が必要(portscanについて)。

ところで、普通にnmapを走らせると以下のように最初にバージョン情報が表示されるのだが、これは意図的に(?)削られているようだ。うーん、検査データとして残すなら、バージョン情報も出しておいて欲しいな。

macbook:~ ozuma$ nmap -A localhost

Starting Nmap 6.47 ( http://nmap.org ) at 2014-11-23 21:35 JST
Nmap scan report for localhost (127.0.0.1)
....(省略)....

また見ると分かるのだが、このスキャンは「11月24日 19時26分13秒」に実施しているが、nmapの出力は、

Nmap done at Mon Nov 24 05:26:10 2014; 1 IP address (1 host up) scanned in 403.30 seconds 

JSTになっていない。まぁご愛敬か。

こういうポートスキャンをJenkinsでかけるというのは、アプリ屋さんはあまりピンと来ないだろうけど、インフラ屋さんやネットワーク屋なら結構良いかもと思う人もいるのでは。インストールしただけで勝手にハイポートを開くミドルウェアとか、いつの間にか開けてないはずのポートが開いていたファイアウォールとか、そういうのはやはり自動化の一環で見つけたいものです。

sslyze

SSLのCipherSuiteやHearbleedのチェックをしてくれる。

こういうツールでは次のQualysのSSL Labsが有名なんだけど、

このページはちょっと間違えるとスキャンしたサイトをリストアップしてしまうので、あんまり自サービスのスキャンをしたくない。なのでこういうツールでサクサクとかけられると便利だろう。あとCipherSuite一覧、意外に出すのが面倒なんだよね。

Nikto

Niktoは、決め打ちで80/tcpにしか実行されなかった。非標準ポートでのHTTP(ここでは10080/tcpとか)はまぁ仕方ないのだが、443/tcp(https)くらいはデフォルトで行って欲しかったかな。

こんな感じで、HTTPに関する色々なテストをしてくれる。NiktoはPerlで書かれているから、モジュールや環境変数依存などできちんと動く環境を保全しておくことが意外に面倒なので、こうやって外部から簡単にかけられると地味に便利かな。

その他注意

Amazon AWSでこのようなセキュリティスキャンを行う場合は、事前にAmazonに申請する必要がある。

これ、意外と知られていないので注意。また、m1.small/t1.microインスタンスでは、スキャン許可されないらしい。ふへぇ〜。ということで唐突にこれで終わり。