memcachedのセキュリティの話

【重要】memcachedのアクセス制御に関する注意喚起 | さくらインターネット

平素よりさくらインターネットに格別のご愛顧を賜り、誠にありがとうございます。  このたび、適切なアクセス制限を設定していないmemcachedがリフレクションDDoS攻撃 発信の踏み台として悪用されている事例がJPCERTコーディネーションセンターより報告 されました。  ▼「memcachedのアクセス制御に関する注意喚起」(JPCERTコーディネーションセンター)  https://www.jpcert.or.jp/at/2018/at180009.html  アクセス制限をせずにmemcachedを運用した場合、DDoS攻撃のほか、キャッシュデータ を第三者に参照され、情報漏洩が発生する可能性もございます。  お客さまにおかれましては、memcachedに適切なアクセス制限が設定されているかを今 一度ご確認いただき、不正に利用されないよう対策をお願いいたします。

そう言えばそんな話あったけど最近サーバの存在忘れてたなあと思って、久々に設定見直してみたらそもそもmemcached使ってなかったです。うちのサイトのキャッシュはKyotoTycoonでやってたんだった。そんで、今見てみたらKyotoTycoon、6年くらい開発止まってました。そうかー。6年もあるといろいろ変わるのですね。まあ今さら調べてテストして選定してコード書き換えてってするモチベーションが無いのでしないけど。 ていうかこの間、ちょっとした修正をする必要があったので仕方なくEclipse開いて(重い!)、コミットしたらそうだったSubversion使ってたんだったってなった。今仕事では全部Gitでやってるんだけど、そうだ昔はSubversionの方が多かったんだなあと遠い目になりました。Eclipseに比べるとAtomは軽くて良いなあ。Eclipseの方が多機能ではあるけど、Atomで十分やれてるし。Gitも慣れると使いやすくて気に入ってます。GitHub便利だし。コンフリクト怖くないし。 まあそういうわけなので、件名に戻ると、うちには関係なかったですということでした。 仕事で使ってるサーバの方は知らんけど、まあ多分なんかやってるでしょう。僕より全然優秀なエンジニアが管理してるので。

続きを読む

KyotoCabinet + KyotoTycoonをインストールしてPECL::Memcachedで接続

調べてみたらPEAR::Cache_Liteが思った以上に頼りないことが解ったのでキャッシュ機構の入れ替えを検討。 【メモ】PEAR::Cache_Liteの生存期間について誤解してたこと(追記あり) | mutter いろいろ考えたのだけど、個人プロジェクトなんだし好奇心優先って事でKyotoCabinetとそれを扱うKyotoTycoonを入れて、PECL::Memcachedを利用して接続してみることにしました。PHP側については、OpenPEARの方に「Net_KyotoTycoon」と言うライブラリもアップされているのですが、まぁ今は良いかなと言うことで。 Net_KyotoTycoon \ パッケージ \ Openpear KyotoTycoon の PHP 版を作った – Heavens hell と言うわけで、以下インストール。

続きを読む

memcached の返り値まとめ(Pecl::Memcached)

memcachedにnullやbooleanなどを入れたらどうなるか、曖昧になっていたので調べた。

テストコード

(PHP5、Pecl::Memcached使用)
$m = new Memcached();
$m->addServer('localhost', 11211);

//test data
$items = array(
'string'  => 'string',
'integer' => 1,
'array'   => array(
1,
'a' => 'A'
),
'true'    => true,
'false'   => false,
'empty'   => '',
'null'   => null
);
//sets
$m->setMulti($items);

//keys
$keys = array_keys($items);
//add key has no value
$keys[] = 'not_found';

//gets
$null = null;
$result = $m->getMulti($keys, $null, Memcached::GET_PRESERVE_ORDER);

//result
var_dump($result);

続きを読む

【メモ】memcacedのバックアップとしてTokyoTyrantを使う

現在あるシステムで、memcachedのバックアップとしてTokyoTyrantを利用しています。 以下は、主要な部分だけを抜粋したコードです。

$key = 'hello';
//Pecl::memcached
$value = MyMemcached::get($key);
if($value === false):
//memcacheから取得できないときはTokyoTyrantからの取得を試みる
MyTokyoTyrant::initialize();
if(MyTokyoTyrant::getEnabled() === true):
$value = MyTokyoTyrant::get($key);
$hasTTCache = (!$value) ? false : true;
else:
$hasTTCache = false;
endif;
//TokyoTyrantからも取得できないときはMySQL
if($hasTTCache === false):
$value = self::getByIdWithConnection($key);
MyTokyoTyrant::set($key, $value, 0);
endif;
MyMemcached::set($key, $value);
endif;
システムの前提として、
  1. 設備が非常に貧弱である
    • キャッシュサーバはなく、APサーバと同居したプロセスが用途別に1プロセスずつあるのみ
  2. memcachedを利用するプログラムの構成が適切ではない
    • PHPのクライアント「Pecl::Memcache」がmgetに対応していない影響で、1データごとにgetを繰り返す構成になっている。順次「Pecl::Memcached」のgetMultiに置き換え中
という問題点があります。 どちらも現在根本的な修正に向けて作業中ですが、今日始めて明日実装というわけにはいかない(特にサーバの増強)ので、なんとか「誤魔化」さないといけません。というわけで試行錯誤の末、TokyoTyrantを併用する形になっています。

続きを読む