Linuxサーバ

Ubuntu14.04+Postfix+Dovecot+SASLでSMTP認証

SMTP認証とは

元来、SMTPというプロトコルにはユーザ認証という概念がなかったんですって。つまり送信者が本物かどうか確認せず簡単にメール送信ができる仕組みだったようです。

 

が、これによって無差別広告メールの横行という困った事態が発生したため、メールの送信を行う前に送信者の身元を確認しようという考えで生まれたのがSMTP認証という仕組みです。

 

というか、SMTP認証の前に「POP Before SMTP」という仕組みが生まれたんだそうですわ。

 

この仕組み、メール受信を行う際にPOPサーバと認証を行ったIPに対して有効時間を設定し、その間だけメール送信を許可するという流れだったそうなんですね。

 

しかしこれで確認が取れるのはあくまでPOPサーバとのやり取りのみであり、SMTPに対する接続が正規のものかどうかは本質的な問題にならないんですよね。

 

ということで、メール送信を行う際にSMTPサーバとユーザ間できちんとした認証を行い、ユーザの確認をすることで不正なメール送信を防ごうというのがSMTP認証の趣旨となります。

 

それでは前置きが長くなりましたがSMTP認証の設定を行いましょう。

 

SMTP認証の設定

このまえ書いたPostfixの設定で、/etc/postfix/main.cfの最下部にSMTP認証に関する追記をしていました。

 

Postfixを設定してSMTPサーバを構築する

 

が、これはあくまで認証を行うための記述であり、実際に認証を行うために次のようにしてパッケージを導入してやります。

 

SASL関連のパッケージ導入と設定

$ sudo apt-get update
$ sudo apt-get install sasl2-bin libsasl2-modules libsasl2-2 libsasl2-dev

 

これでSASL関連のパッケージが入ります。以下のファイルを開いて編集しましょう。

 

$ sudo vi /etc/default/saslauthd

自動起動を有効にする
START=yes

以下の行の記述を確認しておきましょう。
OPTIONS="-c -m /var/spool/postfix/var/run/saslauthd"

 

確認したら「OPTIONS ~」以下のディレクトリが存在するか見てみましょう。自分の場合はありませんでしたが。

 

なければ作っておきます。でないとエラーで動きません。

 

$ sudo mkdir -p /var/spool/postfix/var/run/saslauthd

 

ここまででSASLの設定はOKなはず。サービスを再起動して動作確認をしてみます。

 

サービスの再起動
$ sudo /etc/init.d/saslauthd restart

動作確認
$ testsaslauthd -u "username" -p "password"

 

※なお、この動作確認のユーザ名とパスワードはUbuntuのユーザと該当するパスワードになります。

 

Postfixの設定を追加

一通りの設定は/etc/postfix/main.cfの最下部に記述済みなので、ここでは認証方法を記述した設定ファイルを追加で作成します。

 

$ sudo vi /etc/postfix/sasl/smtpd.conf

以下を記述
pwcheck_method: saslauthd
mech_list: plain login

「:wq」で保存

 

これでPostfixの設定も終了。あとはTelnetを使用して動作確認を行います。

 

telnetで動作確認

端末にて以下のとおり入力して応答を確認します。

$ telnet localhost 25

    Trying ::1...
    Trying 127.0.0.1...
    Connected to localhost.
    Escape character is '^]'.
    220 mail.chee-s.net ESMTP
↓「ehlo localhost」と入力
ehlo localhost
    250-mail.chee-s.net
    250-PIPELINING
    250-SIZE 10485670
    250-VRFY
    250-ETRN
    250-AUTH PLAIN LOGIN
    250-ENHANCEDSTATUSCODES
    250-8BITMIME
    250 DSN
↓「auth login」と入力
auth login
    334 VXNlcm5hbWU6
「BASE64でエンコードしたユーザ名」を入力
************(エンコード済みユーザ名)
    334 UGFzc3dvcmQ6
「BASE64でエンコードしたパスワード」を入力
************(エンコード済みパスワード)
    235 2.7.0 Authentication successful
「quit」と入力してtelnet接続を終了
quit
    221 2.0.0 Bye
    Connection closed by foreign host.

 

エンコードしたユーザ名とパスワードを入力して「Authentication successful」と表示されれば設定が正常に行われています。

 

ちなみにエンコードを行うには端末で

 

$ perl -MMIME::Base64 -e 'print encode_base64("文字列");'

 

と入力することで可能ですので、ユーザ名とパスワードをそれぞれエンコードした後、メモ帳か何かに貼り付けておいて使用するといいかもしれません。

 

これでメールの送信時におけるSMTP認証が無事設定できました。

 

まとめ

スパムメール対策として重要なSMTP認証ですが、じつは結構わかりづらいし面倒なんですよね。

 

今回の方法はOSのユーザ名とパスワードをそのまま使用する方法なんですが、実はユーザ名はそのままにしながらSMTP認証用のパスワードを付与してやることもできるんです。

 

以前はそちらの方法を使っていたんですが、今回どうしても上手くいかなかった(設定の仕方を忘れた?)のでこのような形となりました。

 

セキュリティ的には別のパスワードを使用したほうが好ましい気もしますので引き続きチャレンジしつつ、上手くできたらまたアップしたいと思いますがあまり期待しないで下さい。。。

 

あとはOP25B対策を施してLAN外のクライアントからメールの送信ができれば普段使いとしては十分なはず。ながくなってしまったので今日はここまでにします。

オススメの記事

-Linuxサーバ
-, ,