Postfix + Dovecot + Mailmanで構築したメールサーバー環境を勝手にPODOMAと呼んでいるだけなのだが(笑)
このページ(いや、このページだけではないけど)は編集中です 中途半端な情報の場合がありますので注意願います < だったらUPするなって言わないでね
さて、いつものように環境はCentOSと言いたい所ではあるが…実際のところCentOS内部がゴタゴタしててCentOS6.1など出てこない(2011年8月30日)
そこで、今回はScientific Linux 6.1(さいえんてぃふぃっく りなっくす でいいのかな?)に構築してみる事にする。
環境は以下のような感じ
OS : Scientific Linux 6.1 Postfix : 2.6.6-2.2.el6.i686(自前でReBUILDしたの。理由は本文で) Dovecot : 2.0.9-2.el6.i686 Mailman : 2.1.12-14.el6_0.2.i686
構築条件
データベースは使いたくない!(テキストファイルでの管理) バーチャルドメインで運用がしたい 各バーチャルドメインでメーリングリストを運用したい 容量制限がしたい
Scientific Linux(SL)やCentOSなどのリポジトリにあがっているPostfixではquotaを制御できない。もうね、いい加減Postfixが取り込んでくれないかと思うが、なぜか取り込まれない。む~ん、そういう需要がないのかなぁ??
なので、SRPMを落としてきてPATCHをあててRPMを自作する。※自作方法は後で別ページに書く予定(2011年8月30日)
SL 6.1やCentOS6ではデフォルトMTAがPostfixに変更されているはずなので、まずは既存のPostfixをアンインストールする
一応、確認 rpm -qa | grep postfix yum remove postfix*
インストールはrpmコマンドを実行
rpm -ivh postfix*
てな感じかな。yumでupdateされないようにPostfixをupdateから外すように設定をしておく必要あり。
バーチャルドメインで運用するので、バーチャル用のグループとユーザを作成する
groupadd -g 5000 vuser useradd -g vuser -u 5000 vuser
UIDとGIDは5000以外でも構わないが他で使われていない事を確認が必要
作成したvuserのホームディレクトリのオーナー権限とパーミッションを設定
chown -R vuser:vuser /home/vuser chmod -R 771 /home/vuser/
useraddコマンドでディレクトリを作ってるのでオーナー権限は大丈夫かもしれないが、パーミッションは700なので必須
main.cfを編集(オリジナルはもしもの場合の為、コピーして保存しておく)
cd /etc/postfix cp -p main.cf main.cf.org vi main.cf
編集は以下の所
myhostname = サーバーホスト名
#inet_interfaces = localhost inet_interfaces = all #inet_protocols = all inet_protocols = ipv4
#mydestination = $myhostname, localhost.$mydomain, localhost mydestination = $myhostname #alias_maps = hash:/etc/aliases alias_maps = hash:/etc/aliases, hash:/etc/mailman/aliases home_mailbox = Maildir/ smtpd_banner = $myhostname ESMTP unknown
最低限これくらい修正をしておけば問題ないと思う
さらにSMTP-AUTHやバーチャルドメインの設定をmain.cfに追加(最後に追加すればOK)
# SMTP-AUTHの設定 # smtpd_sasl_security_options = noanonymous smtpd_sasl_auth_enable = yes smtpd_sasl_local_domain = hash:/etc/postfix/virtual_domains smtpd_sasl_authenticated_header = yes broken_sasl_auth_clients = yes smtpd_sasl_type = dovecot smtpd_sasl_path = private/auth smtpd_recipient_restrictions = permit_mynetworks permit_sasl_authenticated reject_unauth_destination
# バーチャルドメインの設定 virtual_mailbox_domains = hash:/etc/postfix/virtual_domains virtual_mailbox_base = /home/vuser/vhosts virtual_mailbox_maps = hash:/etc/postfix/vmailbox virtual_minimum_uid = 100 virtual_uid_maps = static:5000 virtual_gid_maps = static:5000 virtual_alias_maps = hash:/etc/postfix/virtual, hash:/etc/mailman/virtual-mailman
# QUOTA
virtual_create_maildirsize = yes virtual_maildir_extended = yes virtual_mailbox_limit_maps = hash:/etc/postfix/vquota virtual_mailbox_limit_override = yes virtual_overquota_bounce = no
# SMTPSの設定 デフォルトはNO
# smtpd_use_tls = no smtpd_tls_cert_file = /etc/pki/tls/certs/mail.pem smtpd_tls_key_file = /etc/pki/tls/certs/mail.pem smtpd_tls_session_cache_database = btree:/etc/postfix/smtpd_scache
SMTPSの設定はとりあえず入れてるけど、有効化してない
master.cfを修正してSUBMISSIONを有効にする
vi master.cf submission inet n - n - - smtpd submissionの#を外して有効化します
起動する前に、ドメインやメールアドレスを設定したテキストファイルを作成する
1.バーチャルドメインの設定ファイル /etc/postfix/virtual_domains フォーマットは以下の通り ドメイン名 required to prevent relay access denied errors 2.メールアドレスの設定ファイル /etc/postfix/vmailbox フォーマットは以下の通り メールアドレス ドメイン名/アカウント名/Maildir/ 3.転送アドレスの設定ファイル /etc/postfix/virtual フォーマットは以下の通り メールアドレス 転送先1,転送先2 この時、 メールアドレス 転送先1,&メールアドレス(左辺の転送元と同じアドレス) と書く事で転送元にもメールを残すように設定が可能(実メールアカウントがある場合) 4.容量制限の設定ファイル /etc/postfix/vquota フォーマットは以下の通り メールアドレス 制限値(単位はバイト10GB=10240000000とするとだいたいあってる) この時 @ドメイン名 制限値 と書く事でドメイン単位での容量制限値となる
mailmanのaliasファイルも指定してるので必要ではあるが、それはmailmanの項目を参照
作成したテキストファイルのままではPostfixは読込めないのでhashデータベースに変換をする
postmap 変換したい設定ファイル
全ての設定ファイルをhashデータベース化したらPostfixの設定は完了なはず・・・
ちなみに… 設定するファイルが多くいちいちviで編集するのが面倒なのでオリジナルのコマンドを作成 するのが管理には楽かもしれない。 以下は実際に作成したオリジナルコマンドの為の設定なので、テキストファイルを直接書換えて 管理する場合は不要です cd /etc/postfix mkdir vhosts mkdir aliases mkdir quota cd /home/vuser mkdir bin cd bin オリジナルコマンドをダウンロード chmod 775*
デフォルトmtaにSendmailがインストールされている場合は以下の手順でデフォルトmtaをpostfizに変更する
service sendmail stop chkconfig sendmail off alternatives --config mta 2をインプットしてください
chkconfig postfix on service postfix start
インストールはyumでOK
yum install dovecot chkconfig dovecot on
エンタープライズ系LINUXではdovecotのバージョンが2にあがっている。 1系では/etc/dovecot.confだけで設定されていたのが、細かく分割されている。 おそらく今後のバージョンアップで設定ファイルの修正をわかりやすくする為と思われる。
もともと1系で検証してたので2系になって面倒と思ったが、基本的な書き方は同じで1ファイルか複数ファイルで管理しているかの違いと思う。
今回はSL6.1ベースなので2系の設定方法を記載しているが、1系の場合は/etc/dovecot.confで該当する部分を見つけて修正してやれば問題ないかと思う・・・。たぶんね。
1.IPv6を利用しない 編集するファイル /etc/dovecot/dovecot.conf
サーバーをIPv6を利用しない設定にしてあるので、postfixやdovecotもIPv6を利用しないように 設定してやらないとerrorやwarningとなる
#listen = *, :: ↓ listen = *
2.認証方法とセキュリティの設定 編集するファイル /etc/dovecot/conf.d/10-auth.conf
md5とloginを追加。認証はテキストファイルで行うのでauth-passwdfile.conf.extを有効にする。 デフォルトをはっきり覚えてないのだが、確かauth-system.conf.extが有効になってたので無効かする。 auth_mechanisms = plain ↓ auth_mechanisms = digest-md5 cram-md5 plain login
#!include auth-passwdfile.conf.ext
↓ !include auth-passwdfile.conf.ext
!include auth-system.conf.ext
↓ #!include auth-system.conf.ext
3.メールディレクトリの指定 編集するファイル /etc/dovecot/conf.d/10-mail.conf posutofixで指定したディレクトリを指定する。 %dはドメイン名 %nはユーザ名 にそれぞれ置き換わる。 #mail_location = ↓ mail_location = maildir:/home/vuser/vhosts/%d/%n/Maildir
4.Postfixとの連携を設定する(SMTP-AUTHの認証をdovecotのユーザーで行う為) 編集するファイル /etc/dovecot/conf.d/10-master.conf 81行目あたりからを以下の修正(元の状態を忘れた^^;) #unix_listener auth-userdb { #mode = 0600 #user = #group = #}
# Postfix smtp-auth unix_listener /var/spool/postfix/private/auth { mode = 0660 user = postfix group = postfix }
# Auth process is run as this user. #user = $default_internal_user
5.認証用ファイルを設定する 編集するファイル /etc/dovecot/conf.d/auth-passwdfile.conf.ext 以下のように修正する。
passdb { driver = passwd-file # args = scheme=CRYPT username_format=%u /etc/dovecot/users args = /home/vuser/dovecot-passwd }
userdb { driver = passwd-file #args = username_format=%u /etc/dovecot/users args = /home/vuser/dovecot-passwd }
ユーザーの作成
こちらもデータベースなど使わずテキストファイルで管理する。 先ほど認証用ファイルで設定した以下のファイルに1ユーザ1行で追加していく この時、Postfix側のユーザー登録がされていないとユーザーディレクトリが見つからなくてエラーとなる (んじゃないかな・・・試してないけど) 編集するファイル /home/vuser/dovecot-passwd フォーマットは以下の通り メールアドレス:{セキュリティ}暗号化されたパスワード:5000:5000::/home/vuser/vhosts/%d/%u/Maildir/ 5000:5000は最初に作成したvuserのUIDとGIDを指定する
パスワードの作成
説明が後になったが、ユーザーを作成する際に指定したセキュリティで暗号化されたパスワードを 生成する必要がある。 2系の場合は以下のようにして生成する事ができる doveadm pw -s CRAM-MD5 -p パスワード CRAM-MD5で暗号化されたパスワードが表示されるので、それをそのままユーザー設定ファイルに設定してやればOK
dovecotの1系を利用の場合はdoveadmコマンドが存在しません 1系の場合はdovecotpwというコマンドを利用して同じようにパスワードを生成する事が可能 dovecotpw -s CRAM0MD5 -p パスワード
dovecotを起動する
デフォルトの設定のままなのでPOP3とIMAPとLMTPがオープンsれます……ん?LMTPってなんぞや? dovecot1系じゃなかったと思うぞ どうやら、ESMTPの代替プロトコルでLocal Mail Transfer Protocolの頭文字を取ってLMTPのようだ ローカルにメールを配送する為のプロトコルって事だろうね(読んだままやん) ESMTPはSMTP拡張して転送を効率化するプロトコル群の総称。 よし、とりあえずあげておこう(ぇ 設定ファイル /etc/dovecot/dovecot.conf 変更箇所 protocols = imap pop3 lmtp
Postfix+dovecotの環境でmailmanも独自ドメインで運用するには少し面倒だったりする
mailmanにPostfixからメールを渡す際にaliasesを利用する必要があるのだがPostfixとしてのaliasesではプログラムにパイプ(|)でメールを渡す事ができない。
その為、ローカルのaliasesを利用するのだが、/etc/aliasesに書くとごちゃごちゃになるので/etc/mailman/aliasesを利用する。
Postfixのmain.cfをその様に設定変更する必要があるのだが、上記のPostfixの設定通りに構築がされていればすでにその設定になっているw
さて、そうすると困った事がおこる。
バーチャルドメインで運用しているのに、ml-info@ドメイン1とml-info@ドメイン2が1台のサーバー上では共存が出来ないのである。
このサーバーで運用するドメイン全てを同じ人が管理するのであれば上記注意点を理解してメーリングリストを作成すれば良いのだけど、ドメイン毎に管理者が違う場合、メーリングリスト名が早い者勝ちとなってしまう。
それを回避する一つの方法として、メーリングリストの実態はユニークなリスト名にして、各ドメインでそのリストに転送をする。
インストールはyumでOK
yum install mailman
コンフィグファイルを修正
編集ファイル /usr/lib/mailman/Mailman/mm_cfg.py 変更箇所 #DEFAULT_URL_HOST = fqdn #DEFAULT_EMAIL_HOST = fqdn ↓ DEFAULT_URL_HOST = fqdn DEFAULT_EMAIL_HOST = fqdn #add_virtualhost(DEFAULT_URL_HOST, DEFAULT_EMAIL_HOST) ↓ add_virtualhost(DEFAULT_URL_HOST, DEFAULT_EMAIL_HOST)
以下を追加(一部、個人的なデフォルト設定の変更ありw) MTA = 'Postfix' DEFAULT_SERVER_LANGUAGE = 'ja' DEFAULT_REQUIRE_EXPLICIT_DESTINATION = 0 DEFAULT_SUBJECT_PREFIX = "[%(real_name)s:%%d]" DEFAULT_LIST_ADVERTISED = No OWNERS_CAN_DELETE_THEIR_OWN_LISTS = Yes DEFAULT_REPLY_GOES_TO_LIST = 1 ## DEFAULT_GENERIC_NONMEMBER_ACTION = 2 ドメインを追加 POSTFIX_STYLE_VIRTUAL_DOMAINS = [ 'ドメイン1' 'ドメイン2' ] add_virtualhost('ドメイン1','ドメイン1') add_virtualhost('ドメイン2','ドメイン2') ドメインを追加する度に設定を追加してmailmanをリロードする必要があります
service mailman start
chkconfig mainman on
メーリングリストの追加コマンド
newlist -q リスト名 管理者メールアドレス 管理パスワード
メーリングリストの削除コマンド
rmlist -a リスト名
まぁ、aliasesファイルの編集やhashデータベース化も必要なのだが、それはわかるでしょ?