memcachedを安全に運用するポイント
2010年8月10日のスラッシュドット・ジャパンにて「Memcached に潜むセキュリティホール」としてmemcachedの脆弱性に関する記事が上げられました。記事の内容をまとめると以下の2点となります。
- bit.ly や Globworld,Gowalla といったサイトではインターネットから memcached へのアクセスが可能であった
- アクセスしたmemcached上にユーザーのログイン ID / パスワードが格納されており参照可能だった
http://slashdot.jp/security/article.pl?sid=10/08/10/0052240
ここには2つの問題があったと考えます。1つ目はmemcachedをインターネットから接続可能な状態で設置してしまったこと,もう1つはキャッシュ上に置かれている必要はなさそうなパスワードやメールアドレスがmemcachedに保存されていたということです。
あまり知られていることではありませんが,memcachedの統計機能を使うことでキャッシュされているキーの一覧が取得でき,そこからすべてのキャッシュオブジェクトをダンプすることができます。攻撃者からすれば,memcachedにつながりさえすればそこに保存されているあらゆるデータは入手可能になります。
memcachedを安全に運用するためには,設置するネットワークと保存するキャッシュオブジェクトの内容に注意を払う必要があります。
memcachedを限られたネットワークに設置する
memcachedは,Webアプリケーションの高速化のためにシステムのバックエンドで動作するキャッシュサーバとして設計されています。データセンターのプライベートネットワークなど,限られたネットワークだけでアプリケーションサーバと通信を行う前提で作られており,認証の機能,アクセスの制御の機能はつい最近のバージョンまで搭載されていませんでした。そのためグローバルIPアドレスを持つサーバ上でmemcachedを起動し,意図せずインターネットに対してキャッシュデータを公開をしてしまうことは多くあります。
特定のインターフェースのみListenする
グローバルIPアドレスからの接続を防ぐには,グローバルIPアドレス側のポートをListenしないのがもっとも簡単です。memcachedでは -l オプションを使うことで任意のIPアドレスだけをListenすることができます。
$ memcached -l IPアドレス
IPアドレスに「127.0.0.1」指定するとローカルホストからのみ参照可能となり,外部のサーバからアクセスができなくなります。プライベートネットワークを指定するには
$ memcached -l 192.168.x.x
などとします。ListenしているIPアドレスを確認するには,netstatコマンドを使うとよいでしょう
$ sudo netstat -nlp | grep memcached tcp 0 0 192.168.67.254:11211 0.0.0.0:* LISTEN 16166/memcached udp 0 0 192.168.67.254:11211 0.0.0.0:* 16166/memcached
tcp,udpともにプライベートネットワークのIPアドレスのみListenしていることが確認できました。
ただし, -l オプションにはIPアドレスを1つしか指定できないので,プライベートIPアドレスとローカルホストといった2つ以上のIPアドレスをListenすることはできません。そのようなユースケースではLinuxのiptablesなどOSのIPパケットフィルタ機能を使うと良いでしょう。
SASL
クラウド環境など,多数のサーバが同じネットワークを共有する場合にはListenするIPアドレスを制限したり,iptablesでのフィルタリングだけでは対応が困難になってきます。そのようなネットワーク上でmemcachedを運用する場合には memcached 1.4.3でサポートされた SASL(Simple Authentication and Security Layer)による認証を利用できます。
SASLを使用するには,memcachedをsaslオプションを有効にしてビルドし直す必要があります。
$ ./configure --enable-sasl
また,アスキープロトコルではSASLが利用できずバイナリプロトコルが必須となります。加えてSASLをサポートするmemcachedクライアントがまだ一部に限られるので,普及にはもう少し時間が掛かりそうです。
不必要なデータをキャッシュしない
限られたネットワークにmemcachedを設置し,SASLで認証を行ったとしても,ひとたびmemcachedへの侵入を許せば,サーバ上のすべてのキャッシュオブジェクトが閲覧可能な状態になります。不正なアクセスによる被害を大きくしないための最も簡単な対策として,不必要なデータをmemcached上に置かないことが挙げられます。
とくに筆者が注意すべきだと考えるのはO/Rマッパーとmemcachedの組み合わせです。O/Rマッパーの中にはデータベースへの問い合わせを透過的にmemcachedにキャッシュする機能を持つものがあります。そのような透過型のキャッシュを利用した際に,パスワードやEメールアドレスを含んだユーザテーブルのレコードをそのままmemcachedにも保存してしまうことが考えられます。意図しないデータをmemcachedに保存することでデータ漏洩のリスクも高くなり,加えてキャッシュの空間効率も悪化します。安全にmemcachedを運用するためには何をキャッシュするのかという視点も重要となります。

