まず、各ブログで多い意見は、
・7月9日に発覚したのに8月まで通知が遅れた→遅すぎる
・対応としてナチュラムで買い物すれば5%OFFって→売上を伸ばそうとしているの?というのが多いですね。
これについては、
ナチュラムの該当ページに、経緯と説明が書かれています。
が、まぁこの内容、ツッコミどころ満載なんですけど...
他には、
・パスワードを暗号化してなかったのかよ!
・このタイミングでEコマース部門を独立させるなんて怪しい
というような内容も。
で、ナチュラムに対する批判はいくらでも書けるのですが、では
どうすればよかったのかということに対して書いてみます。
1.防止策
まず、こういう情報漏えいについての防止策が万全で無かったというのが根本的な原因。(万全というのは難しいですが)
特に今回は、
メンテナンスサーバー経由でアクセスされたそうですが、本番のサーバーとは違って、メンテナンス機やテスト機というのは十分なチェックができないというのもわかりますが、やっぱり専用線なら別として、
インターネット上に公開しているサーバーは、すべて本番サーバーと見なしてセキュリティを掛けないとね。
で、先の記事及びFAQを読むと、SQLインジェクションの類ではなく、
バックドアの方法にて情報が取られたとか。
このバックドアというのは、スパイウェアと同じように、コンピュータにあらかじめプログラムを置いておき、スパイウェアはそのプログラムが情報を外部に送信するのに対し、バックドアは、あるユーザー/パスワード、IPアドレス他、特定のアクセスに対して、閲覧、書き込み、削除等すべてを許可してしまう(つまりドアを開ける)ような手法です。
つまりは、私のIDでナチュラムさんにログインすると(ブログではなく、TELNETやリモートディスクという類)、スーパーユーザーの権限で何でも見れるということです。
この仕掛けられたプログラムが動き出す(これを使ってアクセスしようとする)までに、すぐ発見できれば被害は無かったのですが、発見されたのは動いた後。
毎日ウイルスチェック、スパイウェアのチェック等をしていれば、もしかしたら発見できたかもしれません。(防止策1)
また、チェックを十分に行っていても、盗まれる場合もあります。
その為に、
盗まれても使用できない(しにくい)ようにしておくというのも大事な要素です。
まず一番初歩的なところではパスワード等は
暗号化しておくということ。
(これすらやっていなかったようですが...)
次に通信の暗号化や
秘密分散。
通信の暗号化については、
SSLというような方式で現在でも行われていますが、これは
通信上での盗聴に対してガードするので、ディスク等に保存しているデータには無力です。
秘密分散。
これをやっていなかったのが致命的かもしれません。
秘密分散の説明は長くなるので省略しますが、要約すると「
n個の要素が決まるとm個が特定できるような関係を作る」ということです。
例えば、顧客マスタのパスワードが「1234」となっていたとします。
ここで、関係式を
Y=2X+S (Sが復元する値です。)
とすると、1byte単位で考えて、1byte目の「1」は、
Y=2X+1
を満足するX,Yの値、例えばX=2、Y=5としておきます。
2Byte目は「2」ですから、
Y=2X+2
を満足するX,Yの値、X=1、Y=4
同様に、3byte目「3」、4byte目「4」も、
X=2、Y=7
X=1、Y=6
となります。
これを2分割のデータに保有すると、
顧客マスタA
2121
顧客マスタB
5476
という風に格納されます。
元に戻すときには、Y=2X+Sにそれぞれを代入するとSが特定されるので、1234が復元できます。
これで片方を盗まれても、復元はできません。(実際には5、6分割ぐらいにしておくのが一般的でしょう。)
問題は、Y=2X+2を満足するX,Yと言っても一杯あるので、どの組み合わせを選ぶかということになりますが、これはある条件や法則で決められます。
これが
一般的な秘密分散法ですが、まぁ暗号化とそう変わりは無い感じもするでしょうね。
でも、この方法はいろいろ応用が利いて、アプリケーション(プログラム)の中に入れることでも、盗まれても解読しにくいデータは実現できます。
応用例として、
顧客マスタに、ユーザーID、氏名、パスワード、カード番号を持っているとします。
これを1ファイル(テーブル)で持っていると、暗号化していないかぎりこのデータが盗まれると、すべてが結びついてバレてしまいます。
が、これをいくつかのファイル(テーブル)に分けて持ち、秘密分散法の応用で関連付ければどうでしょう。
構造は、
顧客マスタ
ユーザーID、氏名、key1、key2
パスワードマスタ
key1、パスワード
カード情報マスタ
Key2、カード番号
のようにします。
ここで、
顧客マスタのKey1、Key2と、各マスタのKey1、Key2に同じ値を持っていれば何にもならないのですが、この関係を先ほどのように式による関係付けで表します。
パスワードは、Y=5X+100
カード情報は、Y=2X-30
という式を定義します。
すると、
顧客マスタ
USER00001 : ナチュラム太郎 :300:900
USER00002 : ナチュラム花子 :200:50
パスワードマスタ
1600:PASSWORD01
1100:PASSWORD02
カード情報マスタ
1770:123-456-7890
0070:987-654-3210
というようになります。
上の2つの式がわかっているので、
ナチュラム太郎さんのパスワードは、
5×300+100=1600
で
PASSWORD01だと特定できます。
このような作りにしておくと、万が一すべてのデータが盗まれても、
この式さえわからなければマッチングにはすごい手間隙がかかります。(パスワードやカード番号がわかっても誰のものかもわからない...という状態)
ここでは2つの値の関係式でしたが、もっと分散して5つぐらいの変数の式にしておけば、「
4つがわからない限り最後のひとつは特定できない」状態になり、その4つの関係も式がわからないとなかなか判明できない状態となるので、安全性が高いとされています。
こういう手法を使っていれば、被害はもっと少なかったかもしれません。(防止策2)
ただし、システム内ではこういう式を使って関連付けるプログラムや復元する処理は用意していないと、通常の処理が動かせませんから、当然「個人情報設定」のページ等で動かす部分は、こういう内部的なところは自動的に復元してくれます。
もし、不正アクセスで
そのプログラムを利用されると、暗号化や秘密分散ということをやっていても何の役にも立たないということになってしまいます。
2.発生後の対応
ユーザーへの連絡が遅くなったことに対しても、一応説明はされています。
これは、流出の可能性のあるお客様全員にご連絡をさせていただくために必要な作業でした。
流出の可能性のあるデータの件数が65万件強と膨大であったため、名寄せ作業等時間がかかり、最終的には7月28日、流出の可能性のある最大値として数字を確定させました。
(上記ナチュラム該当ページより引用)
これによると、被害の
調査と名寄せ作業に時間が掛かった...ってどこかで聞いたような内容ですなぁ?(社会保険庁?)
しかし、5%割引の説明のところでは、
流出の可能性があるお客様 653,424件の中には
・ご住所が不明な方 (メルマガ登録のみ、ブログ登録のみのお客様)
・会員登録をされずお買い物された方 (ナチュラムは会員でなくとも買い物ができます)
が多数いらっしゃいました。
(上記ナチュラム該当ページより引用)
となっています。
この多数に対しては、連絡の取りようが無いわけで、名寄せも何も無いと思うんですけどね?
他はメールアドレスや住所があるので、名寄せは必要ないし...
ではどうするべきだったか?
顧客マスタなんて65万件あろうと、
A.メールアドレスが登録されている人、
B.メールアドレスは未登録で住所が登録されている人、
C.どちらも登録されていない人。
のようなリストはすぐに作成できます。
この65万件というのが判明した時点で、A.の人にはまず一報のメールを入れるべきです。内容は、
・情報漏洩があったかもしれない
・現在調査中で判明しだいメール及びHPに経緯説明を行う
・当面クレジットカードの明細はチェックしておくよう要請
・スパムメール他が増大するかもしれないので、当面ウイルスチェック等を頻繁に行うように
というぐらいの内容でいいと思います。
B.の人にはタックシールに住所を印刷して、同じような文面のはがきぐらいを送ればいいでしょう。
C.の人にはカード番号さえ登録されていなければ(カードで買い物していなければ)実質の被害はあまり無いわけですから、HP上のお詫びぐらいで良いでしょうね。
ということをまずやっておけば、もうちょっと皆さんの怒りも少なかったかもしれません。
長くなりましたが、最後に、こういう経験は少なかったのかもしれませんが、
リスク(危機)管理(特に情報漏洩に対して)のガイドラインやマニュアルが整備されていなかったのでしょうね。
そこが一番の問題かな?
情報漏えいで500円の金券を送られる(某○○○○BANK)のと5%割引と、どっちが得かなぁ...あ、いやいや損得ではありませんよ、こういう問題は...
※追記
秘密分散の応用例に挙げたものはあくまでも説明しやすいようにした物です。
実際には、もっと複雑な式でないと、何件か当たっていると関係式が判明してしまう危険性がありますので。
追記2)
こういう持ち方もあります。(こっちの方がバレ難い?)
式 : Y=2X+S
顧客マスタ(S)
USER001 : ナチュラム太郎 : 020
USER002 : ナチュラム花子 : 050
パスワードマスタ(X)
010:PASSWORD01
040:PASSWORD02
カード情報マスタ(Y)
040:123-456-789
130:987-654-321
ま、要するに重複無く、関係付けがわかにくくするというのがポイントです。
あなたにおススメの記事