授業資料/第08回 の変更点

Top / 授業資料 / 第08回

** RFC について [#a4c09070]

メールサーバの話を書く前に,RFC(Request For Comment) について記しておく.
RFC とは,[[IETF:www.ietf.org]] (Internet Engineering Task Force)というネットワークのための「標準化団体」によって標準化された規格書のことである.
普通に今使われているネットワークプロトコルは基本的にこの RFC に従っているものばかりなので,詳しいことを知りたければ該当する RFC を読めばよい,ということになる((ただし,規格そのものがバージョンアップされると新しい RFC を用意することになるので,その規格に対応した最新の RFC がどれかわかりにくい.)).
以下,メールの規格について記すときに RFC について時おり触れているので,気になる者は自分で読んでみるとよい((ネットワーク上では親切にも日本語に翻訳して置いてくれている人もいるので,そちらから読んでみた方が楽だろう.)).

* メールサーバ とは [#q45b6f7a]

メールサーバと一口に言ってもその仕事は様々だ.
その説明を行う前に,電子メールがどのように配達されていくのか,おおよそのところとその役割分担を知っておこう.

** MTA と MDA, MUA [#kf82dc88]

メールの配信過程はおよそ送信,転送,受信という段階に分かれる.
このうち,送信(これも一種の転送と見なせる)と転送は SMTP (= Simple Mail TransferProtocol. [[RFC821:http://www.ietf.org/rfc/rfc821.txt]] を見よ) というプロトコルにしたがって行われ,基本的に MTA(後述)のお仕事である.
ユーザビリティに直結することもあって受信の仕方はいくつもの方法があり,今日広く使われているのは POP (= Post Office Protocol, ver.3 = [[RFC1939:http://www.ietf.org/rfc/rfc1939.txt]])と IMAP (= Internet Message Access Protocol, ver.4rev1 = [[RFC3501:http://www.ietf.org/rfc/rfc3501.txt]]) である.
これらの関係をまとめると,

: MTA = Message Transfer Agent | メールの転送を行うソフトウェア. 郵便局のような役割を果たす.有名なのは,sendmail, postfix, qmail というところか. メール配信の主役.
: MDA = Message Derivery Agent | 届いたメールをローカルユーザに配信する過程で働くソフトウェア. MTA の最後の段階の仕事の下請け的存在.  通常業務は単なる配達だが,メールのフィルタや転送し直し等の「水際処理」も受け持つのでそれなりに重要. 有名どころは mail, procmail などである. 今回はあまり意識しなくてもよいだろう.
: MUA = Mail/Message User Agent | メールの読み書き,サーバへの送信,サーバに届いているメールを取ってくる,などのユーザ向け作業を行うソフトウェア. メーラなどとも言われる.

というソフトウェア同士が, 典型的な場合は以下のように繋がっている.
&ref(./mail-transfer-simple_s2.png,,75%);
&ref(./mail-transfer-simple_s2.png);
CENTER:(電子メールのおおよその配信図)

よって,メールサーバの管理とはおおまかに
- MTA の管理
- POP, IMAP 等サーバソフトウェアの管理

の二つに分類できることになる.

* メール送受信のセキュリティ(安全性) [#w960d518]

メールの送信,転送,配信は基本的に「平文」でネットワークの上を流れる.
そのため,各種パスワードもメール本文も同じネットワークにいるマシンには筒抜けであるので,これを経路の暗号化により防ぐということが考えられる.
そのもっともよく使われる技術が次の ** over TLS/SSL である(TLS = Transport Layer Security,  SSL = Secure Sockets Layer). 
これは,ネットワークの通信経路を暗号化する目的にかなり汎用的に使える技術 TLS/SSL を用いてメールのやり取りも安全にしよう,というものである.

より詳細を述べると(web サーバのところでも簡単に説明したが),通信経路において「認証+暗号化」機能を提供するのが TSL/SSL 技術である.
SSL は Netscape Communications の開発したものであったが,IETF による標準化作業を経て TLS として [[RFC2246:http://www.ietf.org/rfc/rfc2246.txt]] に標準規定された経緯がある.
実質的には SSL ver3.0 と TLS ver 1.0 がほぼ同等であると言われているので,どちらでも適宜読み替えれば問題ないだろう((なお,TLS ver 1.1 が既に [[RFC4346:http://www.ietf.org/rfc/rfc4346.txt]] に規定されているので,少しずつずれていくとは思うが.)).

ちなみに,TLS/SSL は他のプロトコルを包むこともできるので,様々なものがある. あまり見掛けないところでは FTP over TLS/SSL ([[RFC4217:http://www.ietf.org/rfc/rfc4217.txt]])なんてのもある…

** SMTP/POP/IMAP over TLS/SSL [#yb0826b6]

上の図の緑色の経路は基本的にネットワーク上をデータが流れる経路であるが,これらの経路全てに対し,over TLS/SSL によって暗号化が可能である.

具体的には,MTA として関係する SMTP over TLS ([[RFC3207:http://www.ietf.org/rfc/rfc3207.txt]])((最初のバージョンは [[RFC2487:http://www.ietf.org/rfc/rfc2487.txt]] だが,これは obsolete 扱いになった.))と MUA がデータを読み込む際の IMAP/POP over TLS ([[RFC2595:http://www.ietf.org/rfc/rfc2595.txt]]) とにわけられる.

ちなみに,TLS/SSL の原理だけ考えれば,*** over TLS/SSL をクライアントの「認証」に使う,つまり後述の smtp auth などの代りに使えるのではと思うところだが,正式な TLS/SSL 証明書を取得することが大変なことと有料なことから,クライアント認証に用いるのは非現実的であると考えられているようだ.

* spam 対策 : 加害者になるのを防ぐ : 送信ポートのブロック [#e5c62c32]

現在,ネットワークのメールにおいて spam (=受取り手の意図に関係なく送られてくる広告,商業用等のメール. UCE = Unsolicited Commercial E-mail ともよばれる.)((ちなみに spam の語源は面白い. 調べてみるとよいだろう.)) が非常に大きな問題となっている.
これを防ぐ,減少させるための仕組みは様々なものがあるが,「最寄りのメールサーバMTA において」 spam の「送信段階をブロックする」という目的の技術が以下に紹介されるものである((他にも "Outbound Port25 Blocking" なども同じ目的の技術である. ただ,Outbound ... はメールサーバで行うものではなくて,ネットワークの出入り口で行うものであるのでここでは外してある.)). これは,自分の管理するメールサーバ(MTA)が spam 送信に使われるのを防ぐためのもので,いわば「加害者にならないための」技術である.

** SMTP Auth [#i62130a8]

[[RFC2554:http://www.ietf.org/rfc/rfc2554.txt]] に規定されている SMTP の拡張規格で,大ざっぱに言えばSMTP クライアントがサーバに認証してもらう時に用いられる. つまり,「SMTP 通信したいんですけど」「あんた誰?」「◯◯です」「ほんと?」「これが証拠です」「OK→通信開始, NG→通信拒否」 という仕組みを実現するものである.
認証は実質的に SASL(Simple Authentication and Security Layer …[[RFC2222:http://www.ietf.org/rfc/rfc2222.txt]] に規定されている規格)を用いるということが RFC 冒頭に書かれている.

この技術は主に,メール送信(実質的にメール転送に相当する)時に認証できるクライアントだけを受け付けることで,見知らぬ第三者によってそのサーバからメールを送信されることを防ぐために使える.

** Message Submission [#zbe86850]

[[RFC2476:http://www.ietf.org/rfc/rfc2476.txt]] に規定されている規格.
通常はメールの送信と転送の両方が port 25 で受けられるのであるが,これををやめて port 25 は転送のみを受付け,送信は port 587(Submission port とよばれる)で受け付けるようにするというものである.
分けただけではセキュリティ上の意味はそんなにないので(^-^), 各々の port にしかるべき認証ないしは他の方法での制限を導入することが前提となっている((例えば,送信受付口 submission port では smtp auth をかける.  MTA 相手の認証方法は Sender ID, SPF, DomainKeys など,メールサーバに適したものが提案されている.)).
ならば分ける意味は? と思うだろうが,MTA からみたときに基本的に
- 送信してくる相手は MUA
- 転送してくる相手は MTA

であり,相手が異なる. つまり,MTA はそれなりのサーバであるのできちんとした対応を期待しても良さそうとか,MUA は様々なメーラからなるのであまり厳しいことを要求できないなど,各々に性格が異なるので,受付口を分けた上で各々の相手にあわせた認証方法を導入した方が合理的な対応ができるのである.

* spam 対策 : 被害者になるのを防ぐ : 受信時のブロック [#e5c62c32]

spam の「被害者にならないためには」,基本的に転送/送信されてきたメールを受けるところでの水際での措置ということになる. 考え方は大きく二つあって,
: 接続してきた相手をチェックして,ダメなら接続そのものを拒否する | そもそもメールを受け取らずに済むので,virus だのなんだのという問題が全くないのが利点. メールの内容に依存しないので「内容に依存する検閲ではないか」という心配がないのが利点. 相手が実は問題ないときでも誤って排除してしまうと問題が大きいというのが欠点. 具体的には,
- 正しいSMTP 接続以外は拒絶する
- 相手が MTA の◯◯の機能を持っている場合に限り接続を許可する(上の特殊なもの)
- (全世界で集められている)ブラックリストに載っている相手は拒絶する
という手法になる.
: とりあえずメールを受け取り,内容をチェックしてダメなら… | (例えばユーザ毎になど)柔軟な設定が可能なのが利点. 内容をチェックするので,サーバで行った場合は「一種の検閲」という指摘/批判はうけうる. 負荷が高い. 具体的には,近年は届いたメールをベイジアンフィルタにかけて分類する手法が広く使われているようだ.

というものに分けられる. いずれもそれなりの欠点を抱えるため,サーバとユーザの性質によって検討が必要である.

今回はこれらについて詳しく述べないが,一度勉強しておくとよいだろう((例えば,教官の経験ではサーバ側で「正しい SMTP接続以外は拒絶する」だけで spam の 95%以上を無くすことができる.  ただし,世の中には「正規のメールサーバのくせに動作がルール違反である」サーバもあり,こうしたサーバを「ホワイトリスト」に入れていくなどの日々の調整/設定はなかなか大変である. )).

*** 実習 [#k1ba219a]
「spam 被害を減らすために」実際にどのような防御方法があるのか,調べてみよ.

* MTA : Postfix [#g45167e1]

さて,体感してみないとなんともいえないだろうからまず MTA をインストール,設定してみよう. 上に書いたように MTA の有名どころは sendmail, postfix, qmail というところだが,sendmail は「手で設定するのは至難」と言われるし(^-^),qmail は sendmail との互換性が低い. 無難なところで Postifx をインストールし,設定を行ってみよう.

*** 実習 [#g6b9e62e]
sendmail, postfix, qmail の各々の特徴を調べよ.

* Postfix のインストール,設定 [#d229c4a5]

** 上に述べた技術との関係 [#c46642be]

まず,Postfix と上のセキュリティ,spam 対策との関係を述べておこう((そもそも Postfix は上に述べたような技術と相性が良いソフトウェアとして知られており,こうした新しい対策技術を導入するのに適している.)).

*** SMTP over TLS/SSL について [#h255a0ec]

現時点での FreeBSD で Postfix 2.4.6,1 を ports からインストールしようとすると "Enable SSL and TLS support" というオプションを選択可能なのでこれを選択しておけばよいだけである. 以前から比較的楽だったとはいえ,ここまで楽になっているとは…と思うぐらい簡単になっている.

*** SMTP Auth について [#o9e6d109]

原則として Postfix インストール「前」に SASL 機能を提供するソフトウェアをインストールする必要がある.
しかし,現時点では ports からインストールしようとした時に "Cyrus SASLv2" というオプションを選択可能なのでこれを選択しておけばCyrus-SASL を自動的に事前にインストールしてくれるので,何もしなくてよい.

** インストール [#yc7ca21b]

まず,sendmail が動いていないかチェックする. 具体的には
  ps -axuww | less
として mail とか post とか drop とかいう文字列を含む daemon が動いていないか調べよう. また,/etc/rc.conf を見て,
  sendmail_enable = "NO" ないしは "NONE"
という文字列が"無かったら" sendmail が動いている可能性がそれなりにある((/etc/defaults/rc.conf を見て確認する必要があるが,デフォルトで sendmail_enable = "YES" になっていることがあるのだ.)).
また,
  telnet localhost 25
として接続できるようだったら (たぶん)sendmail が動いているので,これで判断してもよい((sendmail 以外の MTA をインストールしていたら動いてるのはその MTA かもしれない…)).

もし sendmail が動いていたら
  /etc/rc.d/sendmail stop
として停めよう.

さて,ここでまず,いろいろな作業前に ports コレクションを portsnap で更新しておこう.
  portsnap fetch; portsnap update

次に,これからの作業のログが取れるように portupgrade を設定し直しておこう(これから使う portinstall も portupgrade の一部であるので).
というのも,途中で何回か大事なメッセージが出てくるのである. 読み取れれば問題ないが,そうもいかないだろうからこうした前準備が必要だ.
まず,ログファイルの置き場を用意する.
  cd /var/log; mkdir ports
次に,portupgrade の設定を書き換えておく. 具体的には,/usr/local/etc/pkgtools.conf ファイルのほぼ最後にある行を
  PORTUPGRADE_ARGS = ENV['PORTUPGRADE'] ||  \
   '-v -L /var/log/ports/%s::%s.log'
などと修正しておこう(portupgrade のマニュアル(man portupgrade でみられる)にいろいろ書いてあるので,それをみて最後の行は好みに応じて変えてもよい).
こうしておけば,これからは portupgrade, portinstall などのログが /var/log/ports 以下に置かれるようになるので少し安心だ.

では,ports から postfix をインストールする. インストールするバージョンは最新の ver.2.4.6,1 でよいだろう. ただし,ports コレクションをざっとみただけでも ver.1.1.13, ver. 2.1.6, ver. 2.2.12, ver. 2.3.13, ver.2.4.6 の5種類がコレクションされているので,インストールの際には間違ったバージョンをインストールしないよう注意しよう((また,ports 以外のインストール方法は大変ではあるが,何をしているかを知るにはとてもよい. 勉強したい,という人にはお勧めだ.)).
さて,
  cd /usr/ports
  portinstall mail/postfix
でインストールが始まるだろう((ちなみに,この時点でインストールされる cyrus-sasl は ver. 2.1.22 であるようだ)). もしもバージョン選択を迫られるようならば注意深く選択しよう.

ports からインストールする際,途中で選択/決定 を迫られる場面が3回ほど出てくる. それらについて解説しよう.

たぶん最初に
&ref(postfix-install.png);
のような画面が出て,postfix のインストールオプションを聞かれるだろう.
これに対しては,上に述べたように "Cyrus SASLv2", "Enable SSL and TLS support" の二つは "ON" にしておきたい. また,デフォルトで選択されているだろう "Perl Compatible Regular Expressions" も "ON" でよいだろう.

次に
  Added group "postfix".
  Added group "maildrop".
  Added user "postfix".
  You need user "postfix" added to group "mail".
  Would you like me to add it [y]?
と聞かれるだろう.
これはソフトウェア postfix を動かす特別なユーザ postfix を mail グループに入れてよいか? という質問だが,こうしておかないと SMTP Auth が使えない(後述)ので,"y" と答えておくとよい.

また,
  Would you like to activate Postfix in /etc/mail/mailer.conf [n]?
とも聞かれるだろう.
これは mail 関連のソフトウェア対応表とでもいうべき /etc/mail/mailer.conf を書き換えてもよいか? という質問なのだが,これまたそうしておかないと何かと不便なのでこれも "y" と答えるべきである.
デフォルトが "n" となっているので,そのまま enter キーを押さないよう気をつけよう.
ちなみに,書き換え前の mailer.conf は
  sendmail        /usr/libexec/sendmail/sendmail
  send-mail       /usr/libexec/sendmail/sendmail
  mailq           /usr/libexec/sendmail/sendmail
  newaliases      /usr/libexec/sendmail/sendmail
  hoststat        /usr/libexec/sendmail/sendmail
  purgestat       /usr/libexec/sendmail/sendmail
となっているが,書き換え後は
  sendmail        /usr/local/sbin/sendmail
  send-mail       /usr/local/sbin/sendmail
  mailq   /usr/local/sbin/sendmail
  newaliases      /usr/local/sbin/sendmail
となる.

さて,あとは放っておけばインストール作業そのものは終了する.

** 設定 [#p648d98a]

*** 最低限の設定 [#o8647239]

さて,インストール途中に出てくるメッセージを注意深く見ていると「以下の作業を行え」とか,「こういうときはこうしろ」などのと指示が出ているのが分かる. これを読まないと痛い目にあうことがあるので,まずはこのメッセージに従おう.
途中の文字列をスクロールアップして読める端末ソフトを用いているならそれも良し,もしくはインストール作業で出来ているはずのログファイルを /var/log/ports 以下で探して読んでみよう. すると具体的には,次のようなメッセージが見つかるはずである.
まず見つかるのは

  You can use sasldb2 for authentication, to add users use:
       saslpasswd2 -c username
  
  If you want to enable SMTP AUTH with the system Sendmail, read Sendmail.README
  
  NOTE: This port has been compiled with a default pwcheck_method of  auxprop.
     If you want to authenticate your user by /etc/passwd, PAM or LDAP, install
     ports/security/cyrus-sasl2-saslauthd and set sasl_pwcheck_method to
     saslauthd after installing the Cyrus-IMAPd 2.X port.  You should also check
     the /usr/local/lib/sasl2/*.conf files for the correct pwcheck_method.
という部分だろう. 
これは SMTP Auth がどのようにインストールされているかとその使い方についての指示であるので, 分かる人は読んでおこう((やや驚いたことに,この段階では saslauthd そのものはインストールされていないらしいことがわかる. pwcheck_method だけならば saslauthd なし,ライブラリあたりだけで使えるようだ.)).
ちなみに,ここで書いてある Sendmail.README というファイルは cyrus-sasl2 のインストール/コンパイル途中で出来ているもののはずなのでそのつもりで探してみるべし.  /usr/ports/security/cyrus-sasl2/files などに見つかるはず.

   Warning: you still need to edit myorigin/mydestination/mynetworks
   parameter settings in /usr/local/etc/postfix/main.cf.
  
   See also http://www.postfix.org/STANDARD_CONFIGURATION_README.html
   for information about dialup sites or about sites inside a
   firewalled network.
  
   BTW: Check your /etc/aliases file and be sure to set up aliases
   that send mail for root and postmaster to a real person, then
   run /usr/local/bin/newaliases.
これは,postfix インストール後にどのような設定が必要か,ごく大ざっぱに指示している.
/usr/local/etc/postfix/main.cf を書き換えろよ, /etc/aliases を直して newaliases を実行しろよ,ということが言われている.

また,最後に次のようなメッセージが含まれている.
  To enable postfix startup script please add postfix_enable="YES" in your rc.conf
  
  If you not need sendmail anymore, please add in your rc.conf:
  
  sendmail_enable="NO"
  sendmail_submit_enable="NO"
  sendmail_outbound_enable="NO"
  sendmail_msp_queue_enable="NO"
  
  And you can disable some sendmail specific daily maintenance routines in your /etc/periodic.conf file:
  
  daily_clean_hoststat_enable="NO"
  daily_status_mail_rejects_enable="NO"
  daily_status_include_submit_mailq="NO"
  daily_submit_queuerun="NO"
  
このメッセージは重要である.
これを読むと,/etc/rc.conf に記述を 5行加えないといけないことが分かる. 
また,/etc/periodic.conf にも 4行加えるべきだということも書いてある.
早速この二つの作業を行おう.

  If you are using SASL, you need to make sure that postfix has access to read
  the sasldb file.  This is accomplished by adding postfix to group mail and
  making the /usr/local/etc/sasldb* file(s) readable by group mail (this should
  be the default for new installs).

このメッセージからは先のインストール時の質問
  You need user "postfix" added to group "mail".
  Would you like me to add it [y]?
に "y" と答えないといけなかった理由が分かる. 先に言え,という気がするけどね.

さて,次に,メールサーバとして最低限の設定(SMTP Auth も SMTP over TLS/SSL もなし)を行おう.
これは /usr/local/etc/postfix/main.cf を編集するだけでよい.
  cd /usr/local/etc/postfix/
  cp main.cf main.cf.ORG
  emacs main.cf
などとして編集しよう.
以下に修正した箇所のみ抜き出した例を書くので,これを参照してとりあえず編集しよう(なお,デフォルト値が気になる設定は /usr/local/etc/postfix/main.cf.default を見れば書いてあるのでそれを見よう).

  myhostname = q17.cl.math.sci.osaka-u.ac.jp  ← 自分の hostname を書くこと!
  mydomain = cl.math.sci.osaka-u.ac.jp
  alias_maps = hash:/etc/mail/aliases
  alias_database = hash:/etc/mail/aliases
  home_mailbox = Maildir/

ただし,変数の依存関係があることがあるので main.cf の最後にまとめてコレを書くのはよくない.  main.cf の中に該当する部分があるので,そこで各々きちんと書き込もう.

あと,新しくユーザ "cyrus", "postfix" が増えているので,これらに対して来たメールを管理者に転送するようにしておこう.
具体的には,/etc/aliases を編集して,まず
  root : (自分のメールアドレス)
を修正し,その後,同じファイルの適当な場所に(uucp: root の下あたりが無難か)
  cyrus:  root
  postfix: root
を付け加えればよい. ただし,これだけでは変更は反映されないので,反映させるために次のコマンドを実行しておく.
  rehash  ← csh 系を使っている場合. 次のコマンドが新しいものに変更されているため.
  newaliases

さて,ここで念の為リブートしよう. これで postfix が動き出すはずだ.

*** postfix の起動確認 [#f9d6d47f]

まず,先に sendmail が動いているかどうかをチェックしたのと同じ方法で postfix が起動しているかチェックしよう. 動いていないようならこれまでの作業を再チェックだ.

動いているようならば,まず port 25 にアクセスしてみてどんな返事が返ってくるか見てみよう. それには
  telnet localhost 25
としてみればよい. すると
  Trying 127.0.0.1...
  Connected to localhost.
  Escape character is '^]'.
  220 (ホスト名) ESMTP Postfix
と出るので,  
  EHLO localhost
と入力してみよう. するとさらに
  250-(ホスト名)
  250-PIPELINING
  250-SIZE 10240000
  250-VRFY
  250-ETRN
  250-ENHANCEEDSTATUSCODES
  250-8BITMIME  
  250 DSN
などと返事が出て,postfix がどのような接続で待ち受けているのかが分かる(このやりとりは "quit" とすれば抜けられる).
これでとりあえず postfix が port 25 で待ち受けているのが分かった.

では次に,自分宛にメールを出してみてチェックしよう.
やり方は簡単で,通常のユーザになってから
  mail -s "test" 自分のユーザ名
として,それから何でもいいので入力する(これがメールの本文になる).
メールの本文をうち終わったら,「ピリオド一つのみからなる行」を入力すると入力全て終わったことになり,メールが送信できる.

こうしてから自分のディレクトリの Maildir/new というディレクトリに行ってみる. 何か新しいファイルがあれば,それを less などで読んでみよう. それが今送ったメールならば OK. 
これがうまく行っていなければ何かおかしいので,スーパーユーザ権限で /var/log/maillog を読んでみよう. エラー等があれば出力されていて,トラブルの原因が掴めるだろう.

さて次に,「存在しないユーザ宛に」メールを出してみて,エラーが返ってくるかチェックしよう.
これは上とほぼ同様の作業で,(念の為に通常ユーザになって)
  mail -s "test2" 存在しないユーザ名
として,あとは適当に本文入力後に「ピリオド一つのみからなる行」を入力するだけである.
さてこれもまた自分のディレクトリの Maildir/new というディレクトリに新しいファイルがあり,それが「そんなユーザいないからメール出せないよ」という内容のエラーメールだったら OK だ.

今回の説明は少し長くなったので,このあたりで一旦停めておこう.

* レポート [#m384c282]
メール送受信の際に,「安全性(暗号化)」「SPAM対策」についてサーバやネットワークでできることについて調べよ.
また,本日行った作業について報告せよ.