OpenLDAP + Postfix でメール転送サーバーを建てたかった話

qiita.com

この記事はkstmアドベントカレンダーの21日目です。

僕が所属している kstm はいろんな情報系のコンテストに参加しているのですが、ほとんどの場合は代表者のメールアドレスを運営に伝えて連絡をとります。 これ、致命的なミスに繋がったことがあって、

このときは遅刻した人からメールアカウントのログイン情報教えてもらってロスは少なく済んだのですが、信用している相手とはいえ他人のログイン情報とか触りたくないわけですよ。

Google Groups とか使ってメーリス作ればいいんでしょうけど、-ml がつくのカッコ悪いし、勉強のためにも自分で作ってみようってことでメール転送サーバー的なものが欲しいなーって話をしています。 受信ボックスを用意してもいいんですが、以前メールサーバー運用をしていたときにみんなGmailに転送設定していて誰もIMAPとかPOPとか使ってくれなかったので今回はSMTPサーバーだけあればいいです。 メールアドレスくらいみんな持ってるし困らないよね。

あとは、メンバー管理とかも兼ねて LDAP 使いたいなと。 ネットワーク機器がそこそこの量あるので RADIUS と連携させれば認証情報を集約できて幸せになれる気がする。

ってことで作ってみた。

github.com

OpenLDAP + Postfix (+ saslauthd) の構成。 どうせならDockerで動かしたいなと思って探してみたけどよさげなのがなかったのでDockerfileから書いた。 git clone して docker-compose up -d すればサンプルっぽいのが動くはず。

LDAPのデータ構造はこんな感じです。

f:id:bgpat:20171221164009p:plain

Groupの子要素ひとつひとつがメーリスになっていて、Peopleの中に登録したユーザーをメーリスの下にエイリアスを張って所属を表現しています。 メーリスとユーザーにはそれぞれメールアドレスを登録しておいて、メーリスのメールアドレス宛にメールが届いたときはメンバーのメールアドレスに転送するという仕組みです。

LDAPとか運用したことがないので 所属関係 をどうすればいいのかわからずエイリアス使った感じです。 この辺りどうすればいいのか分かってないので詳しい人いたら教えてほしいです。

LDAPのデータをPostfixで扱うときは ldap_table を使えばよさそうです。 エイリアスを使ってるため dereference=1 にしておかないとグループのメンバーにはたどり着けないので注意。

あと、メーリスのアドレスを使ってメール送信もしたかったので、saslauthdを使って認証できるようにしました。 こここのへん の設定で認証したユーザーがメーリスのメンバでなかったときに弾いています。

saslauthdはデーモンとして動くのにUNIXソケットしか待ち受けできないので扱いを迷ったのですが、 Dockerの1コンテナ1プロセスの原則に従ってイメージを分けました。 entrypoint.sh にごちゃごちゃ書くより volume mount 使えばいいやって結論になりました。

という感じで、動かすまであと一歩のところまでは作ったのですが、 今話題のKubernetesで運用したいなーとかやってるといろいろハマって結局Docker化したところで止まってます。 (どうやらオンプレでやろうとしているのが原因らしい、GCPとかAWSみたいなクラウド使えばすぐ動かせそう)

@kstmの部員 だれか動かしてくれませんか