オンプレ型メールサーバの構築 ・・・ ③sendmail構築

シェアする

前回LDAPサーバを構築しましたので、続いてsendmailを構築します。sendmailでは、以下の実現を目的として構築します。

  • LDAPによるUserUnknown判定
  • 後段のdovecotに、LMTPにて転送
  • MSA(587/TCP)によるメール送信とLDAP認証

必要パッケージ

以下パッケージを利用します。

  • sendmail-8.14.7-5.el7.x86_64
  • sendmail-cf-8.14.7-5.el7.noarch
  • cyrus-sasl-lib-2.1.26-21.el7.x86_64
  • cyrus-sasl-2.1.26-21.el7.x86_64
  • cyrus-sasl-plain-2.1.26-21.el7.x86_64
  • cyrus-sasl-devel-2.1.26-21.el7.x86_64

sendmailは、MTA機能として、cyrus-saslはMSAポートの認証に利用します。

sendmailの設定

sendmailの設定は、知ってられるかと思いますが、/etc/mail/sendmail.mc ファイルを変更し、sendmail.cfを作成します。作成後は、makeでsendmail.cf 化を忘れずに実施ください。

divert(-1)

include(`/usr/share/sendmail-cf/m4/cf.m4')dnl
VERSIONID(`setup for linux')dnl
OSTYPE(`linux')dnl

divert(0)dnl
DAEMON_OPTIONS(`Name=MTA, Port=25, M=A')dnl
DAEMON_OPTIONS(`Name=MSA, Port=587, M=Ea')dnl
LDAPROUTE_DOMAIN_FILE(`/etc/mail/ldaprelay')dnl
TRUST_AUTH_MECH(`PLAIN LOGIN')dnl
define(`ALIAS_FILE', `/etc/mail/aliases')dnl
define(`confAUTH_MECHANISMS', `PLAIN LOGIN')dnl
define(confLDAP_DEFAULT_SPEC, `-h 127.0.0.1 -b dc=hogehoge,dc=zone')dnl
FEATURE(`ldap_routing', `', `ldap -T<TMPF> -1 -v mailRoutingAddress -k (mailLocalAddress=%0)', `bounce')dnl
define(`confPRIVACY_FLAGS', `authwarnings,needexpnhelo,needmailhelo,needvrfyhelo,noexpn,novrfy,goaway,nobodyreturn')dnl
define(`confTO_IDENT', `0s')dnl
define(`confTO_QUEUERETURN', `1d')dnl
define(`confTO_QUEUEWARN', `2d')dnl
define(`confDOMAIN_NAME', `mailsv.hogehoge.com')dnl
define(`confMAX_MESSAGE_SIZE', `10485760')dnl
define(`confQUEUE_LA', `500')dnl
define(`confREFUSE_LA', `30')dnl
FEATURE(`accept_unqualified_senders')dnl
FEATURE(`accept_unresolvable_domains')dnl
FEATURE(`access_db', `hash -T<TMPF> /etc/mail/access')dnl
FEATURE(`greet_pause', `1000')dnl
FEATURE(`mailertable', `hash /etc/mail/mailertable')dnl
dnl FEATURE(`use_cw_file')dnl
FEATURE(`no_default_msa')dnl
FEATURE(`nouucp',`reject')
FEATURE(`nocanonify')dnl
MAILER(local)dnl
MAILER(smtp)dnl

MAILER_DEFINITIONS
Mlmtp, P=[IPC], F=lsDFMnqA@/:|SmXz, E=\r\n, S=EnvFromL, R=EnvToSMTP, T=DNS/RFC822/X-Unix,A=TCP [127.0.0.1] 2050

設定パラメータの説明

include(`/usr/share/sendmail-cf/m4/cf.m4′)dnl  これがないと、sendmail.cf はできません。必要最低限な設定です。
VERSIONID(`setup for linux’)dnl  sendmail.cf に記載されるバージョン情報です。適当に記載。
OSTYPE(`linux’)dnl  OSを指定します。OSによる環境依存のためだと思います。/usr/share/sendmail-cf/ostype/ に、あるファイルが記載されていれば問題ありません。
DAEMON_OPTIONS(`Name=MTA, Port=25, M=A’)dnl
DAEMON_OPTIONS(`Name=MSA, Port=587, M=Ea’)dnl
 解放するポート番号の定義や、動作のフラグ定義です。
Name=: この定義した名前がログに出ます。その区分で利用
Port=: こちらは、その通りポート番号
M=:フラグです。
 A: a がSMTP認証を必要とするフラグであり、Aは明示的にSMTP認証を利用しない場合に記載します。
 a: 先の説明通り、SMTP認証が必要
 E: ETRNを許可しない
詳細は、sendmail.org にて
LDAPROUTE_DOMAIN_FILE(`/etc/mail/ldaprelay’)dnl LDAPルーティング処理を行う対象ドメインを羅列します。以下のような感じ。ここに記載されるドメイン宛のメールを受信すると、LDAP検索を行い、ネクストホップの配送やUserUnknownチェックを行います。(local-host-namesに近い感じがあります)

# cat /etc/mail/ldaprelay
hagehage.org
hogehoge.com
ext.jp

 TRUST_AUTH_MECH(`PLAIN LOGIN’)dnl
define(`confAUTH_MECHANISMS’, `PLAIN LOGIN’)dnl
 SMTP認証におけるメカニズムの定義
CRAM-MD5とかありますが、対応しているメールソフトが少ないため、一般的なPLAINやLOGINを利用します。
 define(`ALIAS_FILE’, `/etc/mail/aliases’)dnl  エイリアスの定義。LDAP連携しエイリアス情報をLDAPに登録し利用することができますが、今回はLDAP連携は行っていません。
 define(confLDAP_DEFAULT_SPEC, `-h 127.0.0.1 -b dc=hoge,dc=zone’)dnl  LDAPサーバへのアクセス方法及び、検索ベースとなるBaseDNを定義。「dc=hoge,dc=zone」をベースにLDAPツリーを構成している前提です。
 FEATURE(`ldap_routing’, `’, `ldap -T<TMPF> -1 -v mailRoutingAddress -k (mailLocalAddress=%0)’, `bounce’)dnl   LDAPルーティングの定義。引数の %0 は、rcpt to でインプットされるメールアドレスです。この構文の意味は、rcpt to でインプットされたメールアドレスをLDAPのmailLocalAddressから検索し存在すれば、同じエントリのmailRoutingAddressにアドレスを置換しネクストホップへ配送します。存在しない場合は、bounce(エラー)とします。
mailLocalAddress には、公開するメールアドレス
mailRoutingAddress には、内部で管理するアドレスや、LMTPで配送するアドレスを利用。本システムでは、LMTPでdovecotに転送するため、dovecotで管理するメールアドレスへ置換し配送します。
本システムは、マルチドメイン環境を想定するため
maillocaladdress: hogehoge@ext.jp
mailRoutingAddress: hogehoge_ext_jp@internal.local
って、感じにしてます。
 define(`confPRIVACY_FLAGS’, `authwarnings,needexpnhelo,needmailhelo,
needvrfyhelo,noexpn,novrfy,goaway,
nobodyreturn’)dnl
 sendmail にて、いろいろと情報取得ができるコマンドの無効化とか。@ITを参考にしてください。
(参考:@IT
ただ、VRFY は、メールボックスの有無を応答するコマンドですが、それを無効にしています。「LDAPに存在しない場合はBounceする」設定をLDAPRouting設定で入れています。矛盾していることは気にせずに。
define(`confTO_IDENT’, `0s’)dnl
TCP コネクションが張られたときに、発信元のホストにAuth/IDENT(TCP/113 RFC1413 ) というプロトコルをつかって、そのセッションを張ったのは誰か特定(identify)しようとします。0s は、その機能を無効にする設定です。最近は使われてませんので。
define(`confTO_QUEUERETURN’, `1d’)dnl
define(`confTO_QUEUEWARN’, `2d’)dnl
Queueの動作の定義です。
confTO_QUEUERETURN: メールキューに滞留し一定時間以上経過すると送信失敗としてエラーメールを戻します。
confTO_QUEUEWARN: メールキューに滞留し一定時間以上経過するとキューに滞留し配送できていません。と警告メールを送信します。
実際、警告メールが来ても何も出来ず、あまり意味がないので無効にする場合が多いです。無効は 0 と定義すればいいと聞いていますが、試せなかったのでERRORより多い日時を定義し警告が戻らないように設定しています。
define(`confDOMAIN_NAME’, `mailsv.hogehoge.com’)dnl SMTP接続時に応答するメールホスト情報。実際の管理するホスト名とインターネットへ公開するホスト名が異なる場合に、定義。MXレコードに登録するアドレスと一致させる。もしくは、/etc/hosts ファイルに記載し、名前解決できる状態にする必要があります。そうしないと、名前解決のタイムアウト待ちとなり配送処理等に時間がかかります。
define(`confMAX_MESSAGE_SIZE’, `10485760′)dnl メールサイズ。byteにて記載。
左記だと10MB。最近はメールボックスも大きいし回線も太くなったので、もっと大きくてもいいと思います。
define(`confQUEUE_LA’, `500′)dnl define(`confREFUSE_LA’, `30′)dnl サーバのロードアベレージによって、sendmailの挙動を変える設定
confQUEUE_LA: 指定値を超える場合、受け付けたメールを配送処理せず、キューに保存します。
confREFUSE_LA: 指定値を超える場合、新着メールを拒否します。
経験上、受けたメールをキューに入れてしまうと、ロードアベレージが下がった際に配送処理のため、またロードアベレージがあがり・・の繰り返しとなるので、キューに入れず拒否する動作を先に発生させるほうがサーバとして安定します。また、送信者目線でもキューに入って送信が数時間遅延するより、エラーで送信できなかった方が気付けるため、電話とかで連絡と対策が打てるので、お勧めです。
FEATURE(`accept_unqualified_senders’)dnl
FEATURE(`accept_unresolvable_domains’)dnl
sender(MAIL FROMでの入力情報)が、何であろうと受け取る設定です。
accept_unqualified_senders: ドメイン部がなくても受け付ける。
accept_unresolvable_domains: ドメイン部が名前解決できなくても受け付ける。
外部からの受信では必要と思えますが、sender がどのよな状態でも受け付けるが、送信ドメイン認証やスパムフィルタで弾く機能が実装されていますので、私はどのような状態であっても受け付ける設定でいいと考えています。
FEATURE(`access_db’, `hash -T<TMPF> /etc/mail/access’)dnl access テーブル。Connect(IPアドレスやネットワーク)と To の配送制御が可能。ただし、From との同時制御ができず、Fromの制御したいのであれば、FEATURE(`relay_mail_from’) を利用すると、Connectと、Fromの制御のテーブルとなる。
FEATURE(`greet_pause’, `1000′)dnl SMTP接続時にGreetingが表示されるまでの待ち時間。SPAM送信するところは、即座に応答しないSMTPサーバには配送しない場合もあるため、ある程度値を入れるのが推奨。
1000 = 1000ms
FEATURE(`mailertable’, `hash /etc/mail/mailertable’)dnl ドメイン配送の定義。特定ドメインを特定のネクストホップに配送を固定する場合に必要。今回、lmtp で 後段の dovecot に配送するため、利用する。
dnl FEATURE(`use_cw_file’)dnl 敢えて記載。dnl で無効化しているが、local-host-names に記載するドメインを local配にてサーバのメールボックスに配送する。今回はLMTP配送でdovecotに転送するため、敢えて無効化している。
FEATURE(`no_default_msa’)dnl MSAを基本無効化。DAEMON_OPTIONS で明示的に定義するため、入れることを推奨する。
MAILER(local)dnl
MAILER(smtp)dnl
メール配送のメーラーで、localと、smtpを利用する。
デフォルトにて入っており、そのまま特に変更しない。
FEATURE(`nouucp’,`reject’)  UUCP の配送に関するルールセットなどを省略するものであり、一つの引数をとる。 引数には、reject と nospecial の2種類のみ存在しており、reject と設定した場合にはローカルパート部分に ! が含まれる アドレスに対しリレーチェックが行われ、nospecial と設定した場合には ! が現れても特別な扱いはしなくなる。
FEATURE(`nocanonify’)dnl  メールアドレスのドメイン部分を正規化しない。
正規化とは、test@hoge というアドレスがあったとした場合に、自ドメインを付与して test@hoge.jp といったように 完全なメールアドレスの形にするものであり、他ホストにメールが到着したときにメールアドレスのドメイン部が欠けてていたりしないようにするもの。宛先間違いなんて対応する必要ない。
MAILER_DEFINITIONS
Mlmtp, P=[IPC], F=lsDFMnqA@/:|SmXz, E=\r\n, S=EnvFromL, R=EnvToSMTP, T=DNS/RFC822/X-Unix,A=TCP [127.0.0.1] 2050
新たに MAILER_DEFINITIONS でメーラーを定義する。
lmtpメーラーを定義する。
(別投稿で詳細はまとめたいが。。)
P=:
F=: フラグ。記載する文字にすべて意味があるが別途詳細で
E=:
S=: メーラに引き渡し時の sender 情報
R=: メーラに引き渡し時の rcpt 情報
T=:
A=: ネクストホップへのアクセス方法

sendmail.cfの作成が完了しましたら、sendmailの起動と自動起動を有効にしてください。

/etc/mail/mailertable の設定

sendmail.cf の設定が完了したら、mailertableにてdovcotへの配送定義を設定します。
dovecotのドメイン(mailRoutingAddressに定義するドメイン)に合わせて、mailertableを定義します。

maillocaladdress: hogehoge@ext.jp
mailRoutingAddress: hogehoge_ext_jp@internal.local

として、記載しているため、mailertableには以下を記載します。

# vi /etc/mail/mailertable
internal.local        lmtp:[127.0.0.1]:2050

internal.local と lmtpの間はタブです。

作成後は、mailertableを忘れずにmakemapしhash化します。

/etc/mail/access の設定

accessも忘れず、定義してください。今回のシステムでは送信元は127.0.0.1のみなので、127.0.0.1のみ許可で問題ありません。

作成後は、accessも忘れずにmakemapしhash化します。

sendmailの動作確認

sendmailにて、正常に配送処理が想定通りとなっているか確認します。

確認方法は後日記載

cyrus-sasl設定

sendmail にて、SMTP Auth(MSA)の認証を実現するために、SASL認証を利用します。Postfixも同じですね。

SASL:Simple Authentication and Security Layer

SASLがそもそも利用可能なのかは、以下コマンドにて確認できます。rpmを利用してるので利用可能なのは当たり前ですが。

# sendmail -d0.4
Version 8.14.7
 Compiled with: DNSMAP HESIOD HES_GETMAILHOST LDAPMAP LOG MAP_REGEX
                MATCHGECOS MILTER MIME7TO8 MIME8TO7 NAMED_BIND NETINET NETINET6
                NETUNIX NEWDB NIS PIPELINING SASLv2 SCANF SOCKETMAP STARTTLS
                TCPWRAPPERS USERDB USE_LDAP_INIT
Canonical name: mailsv.hogehoge.com
 UUCP nodename: hogehoge-com
        a.k.a.: hogehoge-com
        a.k.a.: [123.45.67.89]

============ SYSTEM IDENTITY (after readcf) ============
      (short domain name) $w = mailsv
  (canonical domain name) $j = mailsv.hogehoge.com
         (subdomain name) $m = hogehoge.com
              (node name) $k = hogehoge.com
========================================================

Recipient names must be specified

SASLv2が利用可能なようにコンパイルされています。では早速sendmailにて利用が可能なように定義します。

# vi /etc/sasl2/Sendmail.conf
pwcheck_method: saslauthd
mech_list: plain login

mech_listは、sendmail.mc にも「plain login」と定義しているため同じとしています。きっとsendmail.mc のほうが優先されるので、あまり意味のない設定値です。(不要でもいいかも)

設定パラメータの説明

pwcheck_method:  saslauthdを利用し認証します。
mech_list:  認証方式をPlainとLoginとします。

続きまして、/etc/saslauthd.conf の設定をします。

# vi /etc/saslauthd.conf
ldap_servers: ldap://127.0.0.1
ldap_search_base: dc=hogehoge,dc=zone
ldap_filter: (mail=%U@%d)

設定パラメータの説明(詳細はこちら

ldap_servers:  LDAPサーバの指定
ldap_search_base:  LDAPを検索するベースDN
ldap_filter:  LDAPを検索するための検索フィルタ条件(※1)
認証IDです。
(※1)注意いただきたい点として
%u: ユーザ情報として渡される文字列
%U : メールアドレスのローカルパート
%d : メールアドレスのドメイン部分
とあり、一見%uだけでいいやんと思えますが、メールアドレスを認証IDとする場合、sendmailから渡される情報は、%u を利用しているとローカルパートのみ受け渡されます。そもそもsendmailがそういった連携をしているんでしょう。なので、認証IDをメールアドレスにしたいのであれば、%U@%d として指定してあげる必要があります。

saslauthdには、設定した情報で認証が通るか、testsaslauthd コマンドが準備されています。%uで指定していると、testsaslauthd はメールアドレスで通ります。ただし、sendmailからは、ローカルパートしか渡されません。

ちなみに、testsaslauthd は、以下のように利用します。

# testsaslauthd -u sabao@hogehoge.com -p password
0: NO "authentication failed"
# testsaslauthd -u sabao@hogehoge.com -p pass1234
0: OK "Success."

続いて、saslauthdがLDAP認証にて処理を行うように、以下ファイルのMECH部分にldapと追記します。

# cat /etc/sysconfig/saslauthd
# Mechanism to use when checking passwords.  Run "saslauthd -v" to get a list
# of which mechanism your installation was compiled with the ablity to use.
MECH=ldap

これで、cyrus-saslの設定は完了です。systemctlコマンドにてサービス起動と自動起動を有効にします。

sendmailでの動作確認

sendmailにて、正常にSMTP認証が動作するか確認します。

確認方法は後日記載

まとめ

以外と、sendmailのところが長くなりました。sendmailの設定情報って意外と知られていない設定が多く触っていると楽しいです。別の機会にsendmailの設定情報やフラグ情報をまとめたいかと思っています。

次は、dovecot周りの説明をまとめます。

ではでは

トップへ戻る