さくらVPS:NTPの脆弱性を利用したDDoS攻撃対策のまとめ
さくらVPSにおけるNTPの脆弱性を利用したDDoS攻撃対策についてまとめました。
1.はじめに
さくらインターネットから「NTPの脆弱性について」というメールが届きました。
インターネットでも掲載されているので一部を引用します。
以下のサービスにおきまして、NTP(Network Time Protocol)の脆弱性を悪用したNTPリフレクション攻撃の事象が多く確認されており、コンピュータセキュリティ関連の情報発信などを行うJPCERTコーディネーションセンターからも注意喚起が発表されています。
▼対象サービス
・さくらのVPS
・さくらのクラウド
・さくらの専用サーバ
・専用サーバ
・専用サーバPlatform
▼JPCERTコーディネーションセンター
「ntpd の monlist 機能を使った DDoS 攻撃に関する注意喚起」
http://www.jpcert.or.jp/at/2014/at140001.html
お客様におかれましては、ntpdへの適切なアクセス制限が設定されているかを今一度ご確認いただき、不正に利用されないよう対策をお願いいたします。 なお、対策の一例として詳細情報をご案内いたしますのでご参照ください。
ということで、さくらVPSでのDDoS攻撃対策について調べてみました。
2.NTPについて
NTPとは「Network Time Protocol」の略で、ネットワークに接続するサーバやPCなど、機器自身がもっている時計情報について、正確な時刻に同期させるための通信プロトコルを指します。
NTPを利用したざっくりした時刻合わせの仕組みですが、まず絶対的な時刻をもつ親サーバがあり、それ以外のサーバやPCは、NTPを利用して親サーバの時刻情報を取得し、その時刻情報を使って自マシンの時間のずれを補正しす。
3.NTPの脆弱性を利用したDDoS攻撃とは
NTPの脆弱性を利用したDDoS(Distributed Denial of Service)攻撃について、図で解説します。
攻撃者は脆弱性のあるNTPサーバ(①)に対し、monlist(状態を確認するコマンド)のパケットを送信します。
パケットの送信元IPアドレスは、攻撃対象サーバまたはPC(②)のIPアドレスに詐称しておきます。
monlistのパケットを受信したサーバ①は、monlistの応答をサーバ②に向けて(間違って)送信します。
この仕組みで②のサーバに大量のmonlist応答パケットが送られるようです。
この攻撃では、サイズの小さいパケットで問い合わせ、被害者に対してサイズの大きな応答パケットを送信できることです。
monlistのパケットサイズは200~300バイト程度ですが、応答パケットのサイズは最大200倍以上にもなることがあるようです。
大量のパケットが②へ到達することで、②が利用している回線が輻輳し、正常な通信ができない状態となります。
4.対策
さくらインターネットでは、対策として、
- 「restrict」を追加してアクセス制限を行う
- 「disable monitor」を追加して monlist 機能を無効にする
- NTPを使用していない場合は、NTPの停止または削除
の3点を挙げています。
デフォルトで「restrict」は設定されているので、「disable monitor」の追加方法とNTPの停止方法について紹介します。
なお、デフォルト状態であれば「disable monitor」は設定不要と思われます。これについては後述します。
5.ntpdのバージョンについて
ntpdのバージョンがntpd 4.2.7p26以前のものが影響を受けるようです。
ntpdのバージョンは以下のコマンドで確認できます。
$ ntpd --version
ntpd - NTP daemon program - Ver. 4.2.4p8
または
$ ntpq -c rv
assID=0 status=c011 sync_alarm, sync_unspec, 1 event, event_restart,
version="ntpd 4.2.4p8@1.1612-o Tue Nov 29 00:09:12 UTC 2011 (1)",
…後略…
ntpqコマンドはntpdが動作していることが前提となります。
私の使っているさくらVPSのバージョンは上記に示すとおり、4.2.4p8でした。
で、ntpdのバージョンアップ(ntpd 4.2.7p26(開発版))でも対処となります。
ここでは説明を割愛しますが、バージョンアップが可能な方は。
6.「disable monitor」の追加
/etc/ntp.confを編集します。一般ユーザーでは保存できないのでroot権限で編集します。
$ sudo vi /etc/ntp.conf
変更前
…前略…
# Enable writing of statistics records.
#statistics clockstats cryptostats loopstats peerstats
変更後
…前略…
# Enable writing of statistics records.
#statistics clockstats cryptostats loopstats peerstats
disable monitor
編集後、ntpdの再起動します。こちらもroot権限で実行が必要です。
$ sudo /etc/init.d/ntpd restart
[sudo] password for hoge:
Shutting down ntpd: [ OK ]
Starting ntpd: [ OK ]
7.NTPの停止
NTPを停止するには、ntpdコマンドを実行します。こちらもroot権限で実施します。
$ sudo /etc/init.d/ntpd stop
[sudo] password for hoge:
Shutting down ntpd: [ OK ]
8./etc/ntp.confの設定変更による動作の違い
ntp.confの設定を変更することでどのような挙動になるのか、実際に確認してみました。
確認するコマンドは「ntpdc」です。root権限で実行します。
$ sudo ntpdc -n -c monlist xxx.xxx.xxx.xxx
ntpdcはntpd専用のクエリツールで、ローカル及びリモートにある ntpd の状態の確認や設定変更ができます。
「xxx.xxx.xxx.xxx」の部分に利用しているさくらVPSサーバのIPアドレスを設定します。
「-n」はホスト名をDNS名前解決しないで表示します。
「-c command」で指定したコマンドを実行します。ここでは問題となっているmonlistを実行します。
デフォルト状態で実行するとタイムアウト(Request timed out)になります。
$ sudo ntpdc -n -c monlist xxx.xxx.xxx.xxx
xxx.xxx.xxx.xxx: timed out, nothing received
***Request timed out
次に、ntp.confにデフォルトで設定されている、すべてのアクセスを制限する意味を示す
restrict default ignore
restrict -6 default ignore
をコメントアウトしてntpd再起動後、ntpdcを実行すると通常の応答が返ってきました。
$ sudo ntpdc -n -c monlist xxx.xxx.xxx.xxx
remote address port local address count m ver code avgint lstint
===============================================================================
xxx.xxx.xxx.xxx 33732 xxx.xxx.xxx.xxx 1 7 2 0 0 0
yyy.yyy.yyy.yyy 123 xxx.xxx.xxx.xxx 1 4 4 5d0 0 5
上記の設定に加えてdisable monitorを設定した状態で実行すると、「Server reports data not found」という応答に変わりました。
$ sudo ntpdc -n -c monlist xxx.xxx.xxx.xxx
***Server reports data not found
最後にデフォルトの状態に戻し、disable monitorのみ追加した状態で実行すると、最初と同様の「Request timed out」になりました。
$ sudo ntpdc -n -c monlist xxx.xxx.xxx.xxx
xxx.xxx.xxx.xxx: timed out, nothing received
***Request timed out
つまりデフォルト状態でdisable monitorを設定しても、先にrestrictの設定にひっかかるようなので、特に設定は不要のように思われます。
9.参考サイト
参考サイトは以下です。ありがとうございました。
ntpd.confの設定項目やそれぞれの意味についても色々調べましたので、そちらについては別途まとめをエントリーしたいと思います。
- メール送信で「smtp-source: fatal: connect: Connection refused」となる場合の対処
- Apache+mod_proxy+PSGIでMovable TYpeを利用する方法
- さくらVPSにCPANをインストールする方法
- Movable TypeのPSGI環境で503エラーになる場合の対処
- さくらのVPSでrootパスワードを忘れたときの対処
- さくらVPS(その8:ImageMagickとPerlMagickのインストール)
- さくらVPS(その7:phpMyAdminのインストール)
- さくらVPS(その6:Remiを使ったPHPの最新バージョンのインストール)
- さくらVPS(その5:MySQLのインストールと起動)
- さくらVPS(その4:Apacheのインストールと起動)
- さくらVPS(その3:セキュリティ設定)
- さくらVPS(その2:TeraTerm Menuで自動ログイン)
- さくらVPS(その1:コントロールパネル・サーバ起動・ログイン)