ユーザー認証

SMTP AUTH

jailの場合を書いていて、ふと思いついた。
この構成だと、SMTP AUTHを使ったメールの送信ができない。

昔なら、この構成でも問題はなかった。というのは、外からくるメールは 受け取るメールばかりだし、差し出すメールはネットワークの内側からに 限られていたから、そとから見えるメールサーバーは受け取り人のアドレス だけを見ていればよかった。

今、考えているのは、送信するメールも、メールサーバーの外側(インターネット側) からやってくる。入り口のメールサーバーで認証する以外に認証すべき場所はない。

一つの解決法は、CYRUS SASL2で行っているように、ユーザー名+レルム(ドメイン名) の形で認証すること。
これなら、比較的枯れた方法だし、トラブルもそんなにはないだろう。
ただし、ユーザー認証のためのデータベースを一ヶ所に集める必要があるが、 「仕組みは集中的に、認証は階層的に」のポリシーと衝突するという難点がある。

これはjail固有の問題ではなくて、外部からの受け口が一つしかないという部分から 発生しているので、メールサーバーを一ヶ所に集中するという策を選ぶ場合は どういう構成をとるにしても付きまとってくる。

商用プロバイダで、独自ドメインのレンタルサーバーを扱っているところでも、 メールサーバーは別というケースもあるので、そういう方法に逃げるという手も あるけれど、aliasファイルくらいは、個々のドメインの管理者の管轄下に おきたい。 でないと、メールの受信をトリガーに何かを実行するということができなくなる。

レイアウト候補(1)

メール関係のサービスを集中で行う場合

候補1の図

インターネットに直接つながっているのは、[GW]のみ。 [GW]でサービスの種類に従って 適宜内部のマシンにアクセスを振り分ける。
メールボックスも集中させる。

aliasも集中させるので、メールをプログラムの入力とするようなアプリケーション (例えばメーリングリスト)などは、個々のhostの管理者にはできなくなる。
アカウント管理をどう分散させるかが課題となる

メーリングリストだけなら、別の枠組みを用意するなどの方法で 運用できないわけではない。 最悪でも sieveは使えるので、適当に WEBインターフェースを用意すればすむ話ではある。

メールだけなら、kerberosサーバーでなくて、単純にsasldbでもよさそう だけれど、他の login やらなんやらを考えると、将来的に必要になりそうなので とりあえず図の中にいれておきます。SASLもそうなんだけれど、wrapperを通して kerberosを利用するというのは、kerberosの良い部分を台無しにしている気がするので。

レイアウト候補(2)

候補2の図

インターネットに直接つながっているのは、[GW]のみ。 [GW]でサービスの種類に従って 適宜内部のマシンにアクセスを振り分ける。
メールはそれぞれのhostに転送して、それぞれのhost上のsendmail(など)の処理に任せる。
POP/IMAPは、delegateやperditionなどのproxyで各hostに中継する。

補足

忘れてた。メジャーなメールソフトウェアって、SMTP AUTH対応を謳っていても、 大抵は PLAIN認証か、LOGIN認証なのだった。
要再考。

pam_pop3+perdition

(2005/07/09追加) SMTP AUTHを SASLのpamで受けて、pam_pop3を localhostに向けて、 それを perditionでproxyする... ってのでどうかな?

(2005/10/21追加) pam_pop3+perditionでよさそう。

/etc/pam.d/smtpの内容
auth required /usr/local/lib/pam_pop3.so hostname=gw.example.jp info pwprompt=Password: timeout=20 no_warn try_first_pass
hostnameはperditionが動いているホスト名。
( 127.0.0.1 で受けていないときは、perditionがlistenしているIPアドレスに 対応した名前でないと動かない )

テクニカルノート

perditionでproxyをする場合の設定メモ

jail側で認証する場合

make時のオプション
portsからインストールする場合は、GDBMを有効にする。

make WITH_GDBM=1
/usr/local/etc/perdition/perdition.conf の修正部分
inetd_mode
map_library_opt /usr/local/etc/perdition/popmap.gdbm.db
strip_domain remote_login
query_key 	\\u\\D\\d,\\D\\d
ドメイン名指定無しの場合にデフォールトサーバーと接続させるなら、
outgoing_server  default.example.jp
のような行も追加する。 popmap
@jail1.example.jp:jail1.example.jp
@jail2.example.jp:jail2.example.jp
popmapを修正した後は、 Makefile.popmap-dist を Makefile.popmapにコピーして、make を実行する。
inetd.conf
pop3    stream  tcp     nowait  root    /usr/local/sbin/perdition -i -P POP3
など..

ホスト側で認証する場合

(まだ)