2015年6月10日水曜日

SMTP-AUTHとデータベースのパスワード暗号化の関係

今回はメールサーバを構築するときの認証に関わるお話。ネットでの情報を中心にしつつも個人的な言葉でメモとしてまとめてみました。ラベルはCentOSとしておりますが、Linuxにおける一般的な話となります。理解が間違ってる可能性もゼロではないので、その辺は話半分に読んで頂きたいと思います。

メールサーバを構築する際の仕様は次の条件を仮定します。

  • メール利用者の情報(ユーザ名、パスワード)をデータベースにおく
    • バーチャルドメイン(Linuxのサーバにログインするためのアカウントとは関係ないのでバーチャルと言われるらしい)のメールサーバにおいてはよくある状況と思われます
  • メールサーバの不正利用を防ぐため465番ポートでSMTP-AUTHを利用する
    • 注意:587は使わなくてもSMTP-AUTHはできます
  • 25番ポートはSSLでの通信をせず、465番ポートでSSLでの通信を行う

ここで問題になるのは、データベースに置くユーザパスワードをどのように保存するかという点です。安全にメールクライアント(ThunderbirdとかOutlookなど)からメールサーバまで通信するのに、暗号化しない25番ポートを使うのであれば、ユーザやパスワードの対を送信する際には、CRAM-MD5のようなアルゴリズムでハッシュ化アルゴリズムを使うしかありません。しかし、CRAM-MD5は非可逆で、かつ毎回認証のたびに異なる文字列を用いてハッシュ化されたものが送られてくるため、データベースの方でMD5などで復号化できない保存をしていると、送られてきたパスワードと一致しているか調べる方法がありません。そのためデータベース側は平文で保存するということになります。よって上の条件では、25番ポートを使う限り、通信経路でパスワードを安全にするのと引き換えに、データベースのパスワードの安全性が落ちます。

データベースの問題を解決するために、DBでパスワードのハッシュ化を行う場合は、非可逆なハッシュ化されたパスワードを送られても困るので、クライアントとサーバ間は平文でパスワードをやりとりする必要があります。平文で送れば、メールサーバでハッシュ化してデータベースの中身と比較することは容易です。例えばMD5でのハッシュ化は$1$のような始まりのパスワードになっているため、どのようなアルゴリズムでハッシュ化しているかということが分かるようになっているためです(/etc/shadowも同じようなパスワード保存をしている)。この場合、平文で通信すると経路上は当然危険なので、465番ポートでSMTPsを使うことが必須となります。

いずれにせよSMTPsを使えばとりあえずは安心なのですが、どうしても25番ポートしか使えない場合があるときは、DBは平文でパスワードを保存をすることになりそうです。

0 件のコメント:

コメントを投稿

フォロワー

ページビューの合計