ロックオン開発チームブログ -Lockon Knowledge Repositories-

Categoryセキュリティー

MD5でファイルの同期チェック

Webアプリケーションを使ってサービスを展開していると、負荷や障害に備えて、
Web サーバの冗長化(クラスタ化)を検討するようになると思います。

冗長化することによって、Web サーバへのアクセスが分散されて、
1 台当たりの負荷が軽減しますし、複数台あるサーバの内、
1 台が壊れてもサービスを継続することができます。

っと、冗長化するメリットは非常に多いのですが、デメリットもあります。

パっと思いつく範囲で、例えば下記のようなことがあります。
[1] すべてのサーバに目的のファイルが配備されているか
[2] サーバ上のデータが改竄されていないか
[3] ロードバランサ(既製品やLVSなど)の導入や運用

そこで、今回は [1] と [2] の部分について簡単なチェックをしてみることにしました。
対象とするのは、Web サーバで動的に生成され、全部のサーバに
配備されるようなファイルとします。

複数台のサーバで同じデータを取り扱う場合は、NFS などの仕組みを
利用するのがベターですが、NFS へのアクセス集中やフェイルオーバーなど
こちらも検討する事項は多いです。これについては、別の機会でお話できればと思います。

では、本題に入ります。

サーバ間のファイルの同期をする場合、rsync などのリモートコピーができるコマンドを
使用する機会が多いと思います。ファイルサイズの違いや変更されたファイルなど、
差分の確認が取れ便利です。

しかし、サーバの台数が増えるとファイルの同期はともかく、定期的に
簡易なファイルチェックをするには負荷コストが気になります。
(ssh の接続コストも含めて)

上記を考慮すると、まずは単体のサーバでファイルをリストアップし、
それのハッシュ値を取って、サーバ間で比較するのがやさしそうです。

ハッシュ値と言えば、md5 や sha1 が一般的です。
md5 のハッシュ値は 128bit、SHA1 は 160bit なので、sha1 の方が強固ですが、
今回は強度を考慮する必要がない場面なので md5 を利用することにします。

現在のディレクトリ配下のファイルの md5 を取得してみます。

$ find . -type f -print | xargs md5

MD5 (./hoge1_data.dat) = 53e27bbfe455385f1a4be648987a2473
MD5 (./hoge2_data.dat) = 52c4c8cb45262e3943bc9f1bec63117f
MD5 (./hoge3_data.dat) = dcca48101505dd86b703689a604fe3c4
MD5 (./hoge4_data.dat) = 0cda462ecafcfe65a6121c5446278cea
MD5 (./hoge5_data.dat) = 652fdb47405c0a6b5ed851ed94a178c9
 ・
 ・
 ・
MD5 (./hoge100_data.dat) = dcca48101505dd86b703689a604fe3c4

これで、各ファイルのハッシュ値が取得できます。

さらに、これらのリストのハッシュ値を取ってしまえば、
比較する文字列が 1 つで済むようになります。

$ find . -type f -print | xargs md5 | md5

f70ab1ae5a8311ef1cf11796d50d6229

あとは、サービスを提供している環境を考慮して
全サーバの同期を確認できる仕組みを作るだけです。

各サーバ間の接続コストが気になる場合は、ハッシュ値を
特定のアドレスにメールで送り、メールサーバ側のプログラムで
一元管理するのもいいと思います。

メール送信時にハッシュ値が改竄されると意味ないので、
メールの送信経路を SSL 化するなどの配慮も必要になってきますが・・・。

今回は、md5 による簡単なチェックを紹介しましたが、
もっと手軽で効率がいいようなチェック方法があれば、
ぜひご教授願えればと思います。

Copyright(c) LOCKON CO.,LTD. All Rights Reserved.