UNIXOracle SolarisMailサーバー Sendmail

メールサーバー(Sendmail) 構築

更新日:2017年12月29日

sendmail とは

Sendmailはインターネットを通じて電子メールを送受信するためのサーバーアプリケーションプログラムです。
Message Transfer Agent (MTA)の一種で、おなじようなプログラムに Postfix, QMail があり、最古参のアプリケーションです。
一昔前までは設定の難しかったり、メールの暗号化が出来なかったりして下火になりましたが、現在は改善されて普及率も高くなっています。

暗号化通信するための準備

Sendmail に暗号化通信させるために、cyrus-sasl をインストールします。
また、gnuライブラリがすでにインストールされている環境を前提としていますので、まだインストールしていなければ、サイト内のページ「OS インストール後の環境整備のサーバー環境設定」を参考にインストールしておいてください。
例では、Solaris 10、GNUライブラリ使用、Cシェルを前提としています。

cyrus-sasl ダウンロード

cyrus-sasl のダウンロードページ「ftp://ftp.cyrusimap.org/cyrus-sasl/」にアクセスして、cyrus-sasl-2.*****.tar.gzをクリックしてダウンロードしましょう。
ファイルのURLがわかっている場合は、サーバーから wget コマンドを用いて直接ダウンロードすることも出来ます。

cyrus-sasl インストール

cyrus-saslファイルを解凍し、付属の ./Configure スクリプトを用いて設定ファイルを作成しましょう。
./Configure -h または ./Configure --help とコマンドすると、その他のオプションが表示できます。

% tar xzf cyrus-sasl-2.1.26.tar.gz
% cd cyrus-sasl-2.1.26
% ./configure --enable-cram --enable-digest --enable-plain --enable-login --disable-krb4 --disable-anon --disable-gssapi --with-saslauthd=/var/run/saslauthd --prefix=/usr/local --with-openssl=/usr/local/ssl
configure: loading cache .././config.cache
checking build system type... (cached) i386-pc-solaris2.10
checking host system type... (cached) i386-pc-solaris2.10
checking for a BSD-compatible install... config/install-sh -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... config/install-sh -c -d
checking for gawk... (cached) nawk
checking whether make sets $(MAKE)... (cached) yes
checking for gcc... (cached) gcc

...Configured for solaris64-x86_64-gcc.

メイク・インストール

設定ファイルからメイクして、テストを行い、OKであればインストールしましょう。
インストールは管理者(root)権限が必要です。
また、sasl2 ディレクトリやライブラリを実行パス内に通しておき、root のみ実行出来るようにしましょう。

% make
make all-recursive
...
% su
# make install
# ln -s /usr/local/lib/sasl2 /usr/lib/sasl2
# ln -s /usr/local/lib/libsasl2.so.3.0.0 /usr/lib/libsasl2.so.3
# chmod 700 /usr/lib/sasl

Sendmail.conf ファイルで sasldb を使用するようにします。

# vi /usr/lib/sasl/Sendmail.conf
pwcheck_method: sasldb

認証IDとパスワード設定

認証IDとパスワード設定しましょう。
下記の例ではIDは ken@kentokyo.com になります。

# /usr/local/sbin/saslpasswd2 -c -u kentokyo.com ken
Password:*****
Again (for verification):*****

認証ID確認

認証IDを確認しましょう。

# /usr/local/sbin/sasldblistusers2
ken@kentokyo.com: cmusaslsecretOTP
ken@kentokyo.com: userPassword

認証ID削除

認証ID削除するときは saslpasswd2 に -d -u オプションを追加します。

# /usr/local/sbin/saslpasswd2 -d -u kentokyo.com ken
Password:*****
Again (for verification):*****

認証テスト

認証出来るかどうかテストしましょう。
認証は、サーバーとクライアントを別々の端末(ターミナル)で起動します。まず、サーバーを起動します。

# cd cyrus-sasl-2.1.26/servertrying 26, 2, 0trying 2, 2, 0

クライアントを別の端末で起動します、起動直後に cyrus-sasl でログイン可能な暗号化が表示されます。
先ほど設定した、IDとパスワードを入力して最後に successful authentication が表示されればOKです。

# cd cyrus-sasl-2.1.26/client localhost
receiving capability list... recv: {47}
SCRAM-SHA-1 DIGEST-MD5 OTP CRAM-MD5 PLAIN LOGIN
SCRAM-SHA-1 DIGEST-MD5 OTP CRAM-MD5 PLAIN LOGIN
please enter an authentication id: ken@kentokyo.com
please enter an authorization id: ken@kentokyo.com
Password:*****
send: {11}
SCRAM-SHA-1
send: {1}
Y
send: {74}
n,a=ken@kentokyo.com,n=ken@kentokyo.com,r=xnQo7yvAlx0R+j8x+THoSNmuT1cRVcL7
recv: {104}
r=xnQo7yvAlx0R+j8x+THoSNmuT1cRVcL7/R36l/gwD/bMiPpJMnYLKPDgBgwTjvL8,s=4roCaiQateVyDLvN/Wd/gAQVLvk=,i=4096
send: {128}
c=bixhPWtlbkBrZW50b2t5by5jb20s,r=xnQo7yvAlx0R+j8x+THoSNmuT1cRVcL7/R36l/gwD/bMiPpJMnYLKPDgBgwTjvL8,p=bM1bVJIWhKkSOmgr7FJEjMFuAPs=
recv: {30}
v=7dS4Q7RCyZ7DD4oueMF60loUaE0=
send: {0}

successful authentication
closing connection

Sendmail インストール

Sendmail ダウンロード

Sendmail のダウンロードページ「ftp://ftp.sendmail.org/pub/sendmail/」から最新版をダウンロードしましょう。

コンパイル設定ファイル作成

ファイルを解凍し、テンプレートを使ってコンパイル設置ファイル作成しましょう。
例では、BerkeleyDB 6.2 と cyrus-sasl-2 を使用する設定です。

% tar xzf sendmail.8.15.2.tar.gz
% cd sendmail-8.15.2
% cp devtools/OS/SunOS.5.10 devtools/Site/SunOS.5.10.m4
% chmod o+w devtools/Site/SunOS.5.10.m4
% vi devtools/Site/SunOS.5.10.m4
...
define(`confCC', `gcc -m64')
define(`confLDOPTS_SO', `-G')
define(`confBEFORE', `sysexits.h')
define(`confMAPDEF', `-DNEWDB -DNIS -DNISPLUS -DMAP_REGEX')
define(`confENVDEF', `-DSOLARIS=21000 -DNETINET6')
define(`confSM_OS_HEADER', `sm_os_sunos')
define(`confLIBS', `-lsocket -lnsl')
define(`confMTCCOPTS', `-D_REENTRANT')
define(`confMTLDOPTS', `-lpthread')
define(`confMBINDIR', `/usr/lib')
define(`confEBINDIR', `/usr/lib')
define(`confSBINGRP', `sys')
define(`confINSTALL', `${BUILDBIN}/install.sh')
define(`confDEPEND_TYPE', `CC-M')
define(`confLIBDIRS', `-L/usr/local/BerkeleyDB.6.2/lib/')
APPENDDEF(`confINCDIRS', `-I/usr/local/BerkeleyDB.6.2/include/')
APPENDDEF(`confENVDEF',`-DSTARTTLS')
APPENDDEF(`confLIBS', `-lssl -lcrypto -L/usr/local/ssl/lib')
APPENDDEF(`confLIBDIRS', `-L/usr/local/lib -L/usr/lib -R/usr/lib')
APPENDDEF(`confINCDIRS', `-I/usr/local/ssl/include/openssl')
APPENDDEF(`confENVDEF', `-DSASL=2')
APPENDDEF(`conf_sendmail_LIBS', `-lsasl2 -L/usr/lib/sasl2')
...

セキュリティ保護

セキュリティ保護のため、メール送受信の際に表示される Sendmail のバージョンを書き換えましょう。

% vi sendmail/version.c
...
SM_RCSID("@(#)$Id: version.c,v 8.250 2014-01-27 12:55:16 ca Exp $")

char Version[] = "2100";

Sendmail コンパイル

Sendmail を先ほど作成したコンパイル設定ファイルでコンパイルしましょう。
コンパイル設定ファイルは絶対パスで指定しないとエラーになります。

# ./Build -c -f /export/home/ken/src/sendmail-8.15.2/devtools/Site/SunOS.5.10.m4
Making all in:
/export/home/ken/src/sendmail-8.15.2/libsm
Configuration: pfx=, os=SunOS, rel=5.10, rbase=5, rroot=5.10, arch=i86pc, sfx=, variant=optimized
Using M4=/opt/csw/bin/gm4
...

暗号化通信ポートの設定

暗号化通信を行うためにSmtp over SSLの465番ポートを開きましょう。

% vi /etc/services
...
smtps 465/tcp # Smtp over SSL
...

Sendmail 停止

Sendmail を一旦停止させましょう。

# mv /usr/lib/sendmail /usr/lib/sendmail.back
# mv /etc/mail/sendmail.cf /etc/mail/sendmail.cf,back
# mv /etc/mail/sendmail.hf /etc/mail/sendmail.hf.bak

インストール

マニュアル用のディレクトリを作成し、Sendmail をインストールしょう。

# mkdir /usr/share/man/cat1 /usr/share/man/cat5 /usr/share/man/cat8
# ./Build install
Making all in:
/export/home/ken/src/sendmail-8.15.2/libsm
Configuration: pfx=, os=SunOS, rel=5.10, rbase=5, rroot=5.10, arch=i86pc, sfx=, variant=optimized
...

Sendmail 設定

Sendmail 設定ファイル作成

Sendmail の設定ファイルをテンプレートファイルを使って作成しましょう。
設定ファイル例(config.mc)は次の条件で設定しています。

ドメイン名kentokyo.com
sslの場所/usr/local/ssl
認証局ファイル/usr/local/ssl/CA/demoCA/cacert.pem
暗号化キーファイル/usr/local/ssl/cert/mailkey.pem
証明書ファイル/usr/local/ssl/cert/mailcert.pem
ログイン方式ダイジェストMD5+CRAM MD5+暗号化無し
% cd cf/cf/
% cp generic-solaris.mc config.mc
% vi config.mc
...
divert(0)dnl
VERSIONID(`$Id: generic-solaris.mc,v 8.14 2013-11-22 20:51:08 ca Exp $')
define(`VENDOR_NAME', `Berkeley')
OSTYPE(`solaris8')dnl
define(`MAIL_SETTINGS_DIR', `/etc/mail/')dnl
Dwmail
Dmkentokyo.com
define(`confDOMAIN_NAME', `$w.$m')dnl
define(`confMIN_QUEUE_AGE', `15m')dnl
define(`confTO_QUEUEWARN', `1h')dnl
define(`confTO_QUEUERETURN', `1d')dnl
define(`confTO_IDENT', `0s')dnl
MASQUERADE_AS(`$m')dnl
MASQUERADE_DOMAIN(`$w.$m')dnl
FEATURE(`limited_masquerade')dnl
FEATURE(`masquerade_envelope')dnl
dnl FEATURE(`access_db', `hash -T -o /etc/mail/access.db')dnl
FEATURE(`greet_pause',`5000')dnl
define(`confPRIVACY_FLAGS', `goaway,restrictmailq')dnl
define(`confSMTP_LOGIN_MSG', `$j Domain YOU/Original; $b')dnl
define(`confOPERATORS', `.:@!^/[]+')dnl
define(`confCACERT_PATH', `/usr/local/ssl')dnl
define(`confCACERT',`confCACERT_PATH/CA/demoCA/cacert.pem')dnl
define(`confSERVER_CERT',`confCACERT_PATH/cert/mailcert.pem')dnl
define(`confSERVER_KEY',`confCACERT_PATH/private/mailkey.pem')
dnldefine(`confAUTH_OPTIONS', `A p y')dnl
TRUST_AUTH_MECH(`EXTERNAL DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
define(`confAUTH_MECHANISMS', `DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
dnl define(`confFALLBACK_SMARTHOST', `mailhost$?m.$m$.')dnl
dnl define(`confLOG_LEVEL', `30')dnl
DAEMON_OPTIONS(`Port=smtps, Name=TLSMTA, M=s')dnl
DAEMON_OPTIONS(`Port=smtp, Name=MTA')dnl
define(`confBAD_RCPT_THROTTLE', `5')dnl
DOMAIN(generic)dnl
MAILER(local)dnl
MAILER(smtp)dnl

転送ホストの設定

受け付けたメールアドレスが、内部処理(送信と受信のドメインが同じ)かどうかを判定させるためにリレーホストを設定しましょう。

% vi /etc/mail/local-host-names
kentokyo.com

転送ドメインの設定

受け付けたメールを転送するドメインを設定しましょう。たとえば、内部のローカルアドレスは無条件で転送するならそのIPを記載します、例では、192.168.0.***のIPを転送します。すべてSMTP-AUTHで判断するのであれば空にします。

% vi /etc/mail/relay-domains
192.168.0

設定ファイルコンパイル

作成した設定ファイルをコンパイルしましょう。

% sh Build config.cf

内部処理・外部処理 テスト

設定ファイルを使って 内部処理・外部処理がきちんと設定できているか確認してみましょう。
mailer local は内部処理、mailer esmtp は外部処理です。

% /usr/lib/sendmail -bt -C ./config.cf
> /parse ken@kentokyo.com
Cracked address = $g
Parsing envelope recipient address
canonify input: ken @ kentokyo . com
...
mailer local, user ken

> /parse aaaa@bbbb.co.jp
Cracked address = $g
Parsing envelope recipient address
canonify input: aaaa @ bbb . co . jp
...
mailer esmtp, host bbbb.co.jp., user aaaa@bbb.co.jp

設定ファイル設置とバージョン情報削除

作成した設定ファイルを Sendmail に読み込ませるために /etc/mail 配下にコピーします。
また、インストールした Sendmail のバージョンが確認できると攻撃の対象になりやすいためバージョンの記載を変更しておきましょう。

% cp config.cf /etc/mail/sendmail.cf
% cd /etc/mail/
% chmod u+w sendmail.cf
% vi sendmail.cf
...
DZ2100
...

Sendmail 起動

# svcadm enable sendmail

Smtp over SSLのテスト

SASL,STARTTLSが組み込まれているかどうかを調べましょう。
また、最初のアクセス時に平文で流れる587サブミッションポートの場合は telnet + 587番ポートにアクセスし、250-AUTHが存在すれば設定完了です。もし、存在しなければ設定した /usr/lib/sasl のパーミッションが 700 かどうか確認して下さい。

% sendmail -d0.1
Version 8.15.2
Compiled with: DNSMAP IPV6_FULL LOG MAP_REGEX MATCHGECOS MILTER
MIME7TO8 MIME8TO7 NAMED_BIND NETINET NETINET6 NETUNIX NEWDB NIS
NISPLUS PIPELINING SASLv2 SCANF STARTTLS USERDB XDEBUG

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

Recipient names must be specified
% telnet localhost 587
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 basil.toei-anim.co.jp ESMTP Domain YOU/Original; Wed, 13 Apr 2005 03:22:33 +0900 (JST)
ehlo localhost
250-server.kentokyo.com Hello localhost [127.0.0.1], pleased to meet you
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-8BITMIME
250-SIZE
250-DSN
250-ETRN
250-AUTH DIGEST-MD5 CRAM-MD5 LOGIN PLAIN
250-DELIVERBY
250 HELP