メールシステムの設定


メールの流れの概要を図示すると次のようになります。



番号 動 作 smtpの役割


@ 外部からのメールをsmtpが受信 サーバ
A 受信したメールを記憶装置に保管
B PCのメーラからPOP3等で読み出す


C PCのメーラからメールを送信
D smtpでメールを受信し、送信機能へ渡す サーバ
E smtpの送信機能で外部のsmtpサーバへ渡す クライアント

プロトコル 機 能
smtp サーバ間でのメールの送受信を行う
メールの送信時は相手先smtpサーバのクライアントと機能
受信時はサーバとして機能する
POP3、IMAP4等 サーバに蓄えられたメールを取り出すためのプロトコル

smtp:Simple Mail Transfer Protocol
pop3:Post Office Protocol-3
IMAP4:Internet Message Access Protocol-4

このように、メールシステムを構築するためには、サーバ間でメールの送受信をおこなう仕組みと、サーバからメールを取り出す仕組みの両方が必要です。

apop


POP3は、ユーザの認証にパスワードを使います。
しかしこのパスワード、ネットワーク上を平文で流れます。
自宅内のネットワークからメールを読み出すのであれば、盗聴の心配はありませんが、外部からメールを取り出そうとした場合、パスワードを盗まれる危険性が大きくなります。

そこで、パスワードを暗号化して認証を行うプロトコルapop(Authentified Post Office Protocol)が考え出されました。
暗号化の仕組みは下記の通りです。
  1. クライアントからapop接続の要求があると、サーバは、その接続に対するユニーク(時間やプロセスIDなど)な情報をクライアントに渡す。
  2. クライアントは、サーバーから渡された情報と、自身のパスワードを含めたメッセージダイジェストを作成する。
  3. 作成したメッセージダイジェストをパスワードとしてサーバーに送信する。
  4. サーバは、受信したメッセージダイジェストから、登録されているユーザかどうかの判定を行う
  5. サーバは登録ユーザの確認できれば、メールの取り出しを許可する。


    <メッセージダイジェスト>

    文を関数を通して、別の文に変換する。
    変換された文から、元文を得ることは非常に困難。

筆者のシステムでもapopを使うことにします。

apop before smtp


smtpは、認証の仕組みを持っていません。
設定次第では、第3者がメール送信をできてしまいます。
これが、今問題となっているSPAMに悪用されたりします。

smtpの設定ファイルを編集することで、メール送信は制限できます。
例えば、192.168.0.*からのメール送信要求は受理するが、その他IPアドレスからの送信要求は拒否するなどです。
しかし、送信制限をIPアドレスで決めてしまうと、外部からメールの送信が出来ません。
例えば、外出先で携帯電話とノートPCをつないで、自宅サーバのメールシステムを使ったメール送信を行うような状況を考えて見ましょう。
送信要求を行う機器のIPアドレスは、携帯電話に割り当てられたIPアドレスとなります。smtpの設定を前述のように、192.168.0.*以外からの送信要求を拒否する設定にしていると、メールの送信はできません。
第3者が勝手にメールサーバを使えないように設定したのですから、当然の結果です。
第3者ではなく、あなたが携帯電話を使って接続しているのが、サーバには判断できないのです。

apopは、暗号によるパスワード認証がなされることを説明しました。
この認証システムをsmtpに流用し擬似的にsmtpの認証システムを作ります。
この仕組みが、apop before smtpと呼ばれる方法です。
apop before smtp は、apopで認証が成功したIPアドレスからのメール送信要求は許可します。


<apop before smtpのメール送信までの流れ>



メールシステムのインストール


Debian-GNU/Linuxのデフォルトのsmtpサーバは、eximです。
smtpサーバの有名どころとしては下記の3つが挙げられます。
・sendmail
・qmail
・postfix
eximの日本での普及率は、かなり低いといえるでしょう。
筆者もeximは使ったことがありませんし、情報の収集が、困難そうだったので別のsmtpサーバを使います。

sendmailは、筆者には使いこなせそうにありません。
そうなると、qmailかpostfixのどちらかと言うことになりますが、postfixを使うことにしました。
「選んだ理由は、XXXだ!」と言いたいのですが、理由は特にありません。


postfixのインストール

# apt-get update
# apt-get install postfix
筆者の場合次のようにインストールしましたが、後での設定でどうにでもなります。
適当に選択入力しインストールを終わらせてください。






/etc/postfix/main.cfの編集
編集前
smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
biff = no

append_dot_mydomain = no

readme_directory = no

smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
smtpd_use_tls=yes
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache

myhostname = sys1.alk.dip.jp
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = /etc/mailname
mydestination = sys1.alk.dip.jp, localhost.alk.dip.jp, localhost
relayhost =
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = loopback-only
default_transport = error
relay_transport = error

編集後
command_directory = /usr/sbin
daemon_directory = /usr/lib/postfix
program_directory = /usr/lib/postfix
smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
biff = no
append_dot_mydomain = no
myhostname = alk.dip.jp ←ホスト名
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
mydestination = alk.dip.jp, localhost.alk.dip.jp, localhost ←このシステムの最終到着地のドメイン名
relayhost =
mynetworks = 127.0.0.0/8,192.168.0.0/24 ←自身のネットワークアドレス
smtpd_recipient_restrictions = ←中継の条件を指定
    permit_mynetworks ←自身のネットワークアドレスからの中継を許可
    check_client_access btree:/var/lib/drac/dracd ←apopでログインされたIPアドレスを許可
    reject_unauth_destination ←宛先が自身以外は拒否

message_size_limit = 10240000 ←1メールの最大容量(Byte)

SPAM対策等は後日考えます(メーラ側である程度対策可能ですし・・・)。

設定ファイルの修正が終わればPostfixの再起動
# /etc/init.d/postfix restart

apop before smtp 用ソフトのインストール


# apt-get update
# apt-get install drac qpopper-drac
ここでは、何もなくインストールが終了します。

apopログイン用アカウントの作成
# touch /etc/pop.auth ←ファイルpop.authの作成
# popauth -init ←ユーザ管理用DBの初期化
Really initialize POP authentication DB? y ←yを入力
# popauth -user alk ←ユーザ(alk)の作成
Adding only APOP password for alk.
New password: ←alkのパスワードを入力
Retype new password: ←再度同じパスワードを入力

これで、apop before smtpでのメール送信が可能になっています


更新日:2009/11/3