こんにちは、さくらインターネット 技術本部の大喜多です。

さくらのナレッジをお読みの皆様には、サーバ運用に携わっているか、Webサイトをお持ちの方が多くおられると思います。今回は、サーバの安全を保つための診断と対策について解説します。

セキュリティ診断(脆弱性診断・検査)が必要とされる理由

近年、WebサイトなどのITサービスはますます需要が拡大しています。中でも、ECサイトや個人情報を扱うサイトなど、機微な情報を取り扱うサービスを事業の主軸としている企業も数多くあります。改ざんや情報漏洩が起これば、事業の継続が危ぶまれる事態になりかねません。

また、攻撃者が狙うのは有名サイトだけではありません。VPSやIaaSの普及に伴い、個人でもインターネットに公開されたサーバを簡単に所有できる時代になりました。このようなサーバは実験目的で用いられることが多く、セキュリティ対策が甘いケースも散見されます。セキュリティ対策が甘いまま運用してしまうと、そのサーバが乗っ取られ、ボットネットに組み込まれてしまい、他のサーバを攻撃してしまうこともあります。そうなると自身が加害者になってしまう可能性もあるのです。

インターネットは紛れもなく公共の場です。インターネットに公開されているサーバは1台の例外もなく、最低限の自衛手段として脆弱性診断を実施し、脆弱性が発見された際には速やかに対策を行うことが求められます。

※セキュリティインシデントの実態については、「ウォルティ×ゲヒルン×さくらインターネット セキュリティの夕べ」にてabuse対策チーム プロデューサーの山下 健一より詳しくご説明しております。本記事と併せてご覧ください。

でも脆弱性診断って、難しいんでしょう?

脆弱性診断は、これまでは高度な知識や高価なツールを必要とし、セキュリティの専門家ではない人には手が出せないものでした。

セキュリティ診断サービス Walti.io は、「日本のサーバのセキュリティ水準を上げていこう!」とサーバサイドのセキュリティスキャンを身近にするための活動の一環として、株式会社ウォルティが開発したサービスです。
Walti.ioトップページ

脆弱性診断を誰でも簡単に行えるよう、Walti.ioは「管理画面から簡単スキャン」できることや、「圧倒的な低コスト」を実現することで、脆弱性診断のハードルを下げることに成功しています。
管理画面から簡単スキャン
圧倒的な低コスト

さっそくWalti.ioを使ってみよう

1. アカウント~組織の作成

Webブラウザで Walti.io のサイトを開き、「今すぐアカウントを作成」をクリックします。
今すぐアカウントを作成

フォームに必要な情報を入力し、「Sign up」ボタンをクリックします。
また、FacebookアカウントやGitHubアカウントでサインアップすることも可能です。
サインアップ

Walti.ioでは、ターゲット(スキャン対象のサーバ)やWalti.ioのユーザーは必ず「組織」に属することになります。このことによって、スキャン結果をメンバー間で共有したり、ターゲットに変更を加えた際にリリースの担当者がスキャンできるなど、属人性を排除した運用ができるよう配慮されています。
組織の作成

2. クーポンの登録

本記事の例では「さくらのナレッジ」という組織を作成しました。

今回はキャンペーンでプレゼントしている「Walti.ioさくらクーポン」を利用します。クーポンを使うと、毎月500円分のスキャンを実行することができます。キャンペーンは先着100名様までとなっておりますので、ぜひお早めに申し込み下さい!
キャンペーンへのお申込みはこちらです。

クーポンを入手できなかった場合は、下記クーポンの登録手順はスキップして下さい。ただ、クーポンを使わなくてもWalti.ioは安価なサービスなのでぜひ気軽にご利用いただければと思います。

キャンペーンにお申込みいただきクーポンコードを入手したら、クーポンの登録を行います。
Walti.ioさくらクーポン登録00

右上に表示されている組織名をクリックし、「組織管理」をクリックします。
Walti.ioさくらクーポン登録01

以下の画面で組織名をクリックします(赤丸で囲われている部分)。
Walti.ioさくらクーポン登録02

組織設定画面に遷移するので、左側のメニューの「クーポン」をクリックします。ここでクーポンコードをテキストボックスに入力し、下の「追加」ボタンをクリックします。
Walti.ioさくらクーポン登録03

以下のような画面が表示されたら、正常にクーポンが登録されています。

3. ターゲットの登録

Walti.ioでは、スキャン対象のサーバ(IPアドレスまたはドメインで登録します)を、「ターゲット」と呼んでいます。スキャンを実行するにあたり、ターゲットの登録が必要になります。これよりターゲットの登録手順を解説します。

左上のWalti.ioのキャラクターをクリックしてトップ画面に戻ります。
Walti.ioのキャラクター

「ターゲットを追加」ボタンをクリックします。
ターゲットを追加

「ターゲットの追加」画面で、ターゲット名をテキストボックスにドメイン名(例:example.jp)もしくはIPアドレス(例:203.0.113.100)を入力し、「ターゲットを追加する」ボタンをクリックします。
ターゲット追加画面

ターゲットを登録した後は、ターゲットの所有者確認を行います。この仕組みがあるのは、この仕組みが無いと、どのサーバに対してもスキャンを実行できてしまう(スキャンは疑似攻撃なので、第三者所有のサーバへ実行することは違法行為となる)ためです。

ターゲットの所有者が自分であることをシステム的にチェックをして、トラブルを未然に防ぐ仕組みになっています。

今回私はcurlコマンドを使用して、Webサーバのドキュメントルートに認証ファイルを設置しました。設置が終わったら、左下の「所有者確認を開始」をクリックします。
所有者確認

Walti.ioが所有者確認を実行しますので、しばらく待ちます。
所有者確認中

所有者確認が完了すると、以下のようにスキャンが実行できる画面に遷移します。Walti.ioはこのときサーバに対してどのスキャンが行えるかをチェックします。
所有者確認完了

チェックが終わり、実行可能なスキャン項目が全て表示された状態が以下の画面となります。
スキャン画面

これで下準備は完了です。ではさっそくスキャン(脆弱性診断)をしてみましょう。脆弱性が発見された場合の対策も合わせてご紹介致します。

スキャンを実行してみよう(Firewall編)

まず最初に、対象のサーバにてどのポートが開いているか、portscanを実行してみます。使用していないポートや、本来外部に開放してはいけないポートに対してインターネット上から接続出来る状態にあると、セキュリティ上の問題になることがあるためです。

「Firewall」の「FREEスキャン」ボタンをクリックします。
portscan-01

「実行」ボタンをクリックします。
portscan-02

portscanが実行されます(完了までには少し時間がかかります)
portscan-03

portscanが完了すると、以下のように結果が表示されます。6つのポートが外部から接続できるようになっていました。
portscan-result

サーバにログインしたところ、Firewalldが起動しておらず、フルオープンの状態でした。

# firewall-cmd --list-services
FirewallD is not running

20番ポートはFTPに使用されるポート、111番は「SUN Remote Procedure Call」、これらのポートは不要なので閉じます。3306番はMySQLに接続するためのポートですが、今回は「さくらのVPS」上に、WebサーバとDBサーバを1台のVPSで動かしていますので、外部から接続されることはなく、インターネット上からMySQLに接続できることで、情報漏洩の危険性がありますので閉じます。
ortscan-result-detail

22番ポートはSSHに使用するポートで、攻撃の対象になりやすいポートです。rootユーザによるSSHログインを許可していたり、rootユーザのパスワードが脆弱なものであったりすると、サーバが乗っ取られる可能性があります。そこでrootユーザによるSSHログインを禁止したり、パスワードを強固なものにしたり、SSHのポート番号を変更したり、SSHログインを公開鍵認証のみ許可するなどの対策をとることが一般的です。さらに「さくらのVPS」にはコンソール機能があるため、常時SSHポートを開いている必要はありません。必要に応じて開ける運用とし、今回は閉じることとします。以下に手順を示します。

以下のコマンドをコンソールにて実行します。

Firewalldを起動

# systemctl start firewalld

Firewalldを自動起動するよう設定

# systemctl enable firewalld

インターネットに接続されているNICであるeth0のゾーンを調べる

# firewall-cmd --get-zone-of-interface=eth0
public

外部から接続許可されているサービスの一覧を表示

# firewall-cmd --list-services
dhcpv6-client http ssh https

Firewalldを有効にした時点で、21番ポート・111番ポート・3306番ポートについては外部から接続できなくなりました。
publicゾーンからSSHを削除し、http(80)とhttps(443)のみ接続許可するようにします。

# firewall-cmd --remove-service=ssh --zone=public
success 
# firewall-cmd --list-services
dhcpv6-client http https

それでは再度portscanしてみたいと思います。
portscan再実行

想定通り、http(80)とhttps(443)のみ接続許可されていることが確認できました。
portscan再実行result

※Firewalldの操作については、ハマる前に理解する「Firewalld」の設定方法、「iptables」との違いという記事に詳説しておりますので、併せてご参照ください。

スキャンを実行してみよう(WordPress編)

今回用意したVPSにはWordPressがインストールしてあります。Walti.ioではWordPressの脆弱性検査もできるようになっています。
WordPressの脆弱性検査は、ターゲットにインストールされているWordPress本体やプラグイン・テーマのバージョンと脆弱性データベースとを照合して、脆弱性を含むバージョンかどうかの判定を行っています。その結果検出される脆弱性の例としては、先日話題になったWordPress本体のコンテンツ改ざんなどがあります。

「WordPress」の「FREEスキャン」ボタンをクリックします。
wpscan-01

「実行」ボタンをクリックします。
wpscan-02

wpscanが実行されます(完了までには少し時間がかかります)
wpscan-execute

wpscanが完了すると、以下のように結果が表示されます。Warningが2つ検出されました。
wpscan-warning01
wpscan-warning02

「チケット」タブに、検出されたWarningが表示されます。wpscanのログ全文を表示する機能もありますが、こちらの方が見やすいでしょう。
ticket

1件目は、Akismetというプラグインのバージョンが特定できなかったため、Warningとして出力しているようです。
akismet-version

WordPressにて確認したところ、最新バージョンがインストールされていることが確認できましたので、この件はクローズとします。
akismet-check

2件目は、readmeファイルが残っておりバージョンを特定される可能性があるということで、Warningとして出力しているようです。
コンソールからreadmeファイルをrmコマンドを使用して削除しておきます。
wordpress-readme

実際、クーポンでどれだけ使えるの?

WordPressのスキャンは無料、一番高いWeb Appでも100円/回という低価格です。
price

今回ご紹介したクーポンは登録後「毎月500円」利用できるクーポンになっています。500円使い切ったら終わり、でないところがポイントです。
Walti.ioには定期自動スキャン機能もありますので、継続して脆弱性診断を行うことができます。サーバを安全な状態に保つことがクーポンの範囲で十分可能になるのです。

また、出力されたログの内容説明やセキュリティ対策のアドバイスなどをWalti.ioの画面から相談することができるようになっています。
solutions

今回は脆弱性診断の手始めとして、Walti.ioを使ってportscanとwpscanを実行してみました。皆さんもぜひWalti.ioをフル活用して安全なインターネットライフをお過ごしください。

(2017.5.15 編集部追記:ご好評につきキャンペーンを再開しました。くわしくはこちらをご覧ください。)