memcachedの活用と運用 実践編

第2回 memcachedのセキュリティと脆弱性

この記事を読むのに必要な時間:およそ 3 分

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を運用するためには何をキャッシュするのかという視点も重要となります。

著者プロフィール

長野雅広(ながの まさひろ)

株式会社ライブドア 開発部 システム管理グループ所属。最近はリソース監視ツール「CloudForecast」を開発しながら,ライドドアのさまざまなサービスに導入を行い,スケーラビリティの向上を目指している。

URLhttp://blog.nomadscafe.jp/

コメント

コメントの記入