sendmailインストール(2002.04)
sendmailっていまから構築するサイトで入れることがあるんでしょうか・・・?
むかしはsendmailさえ覚えておけばMTAはOK!
という世の中でしたが最近はqmail・postfixがあついですからねえ。
でも、sendmailも捨てたものではなく実に多機能で覚えきれないくらい!
最近はsendmailのセキュリティホールもかなり少なくなったし。復活するのかな?
むかしのWIDE CFの時代は結構インストールも設定も簡単だったのになあ・・・
今のsendmailのインストール昔に比べると結構めんどくさい・・・

【準備】ダウンロードはこちら
http://www.sendmail.org
から最新版を落としておきましょう!
今の時点では特に8.12.x以上であればOKではないでしょうか?
これをインストールした時点では8.12.3が最新でした。

※バージョンがあがってますがインストール方法は
  以下の方法でいいでしょう。

【インストール】
前提条件としてSolaris8で構築する場合はここのフリーソフトのインストールは
行っているものとします。Linuxではsendmailを一度rpmで抜いておいたほうがややこしくなくていいかもしれません。
※フリーソフトのところでgroffをパッケージで入れてますが、このパッケージではコンパイル時に
●groffのインストール

.8.sun4/libsm/libsm.a -lresolv -lsocket -lnsl
groff -Tascii -man vacation.1 > vacation.0 || cp vacation.0.dist vacation.0
ld.so.1: groff: 重大なエラー: libstdc++.so.3: open に失敗しました: ファイルもディ
レクトリもありません。
強制終了
となってしまったので、おいおいと思って・・・
ライブラリのリンクを調べてみると・・・↓
[root@home6 5.8]# ldd /usr/local/bin/groff
libstdc++.so.3 => (ファイルが見つかりません)
libm.so.1 => /usr/lib/libm.so.1
libgcc_s.so.1 => (ファイルが見つかりません)
libc.so.1 => /usr/lib/libc.so.1
libdl.so.1 => /usr/lib/libdl.so.1
/usr/platform/SUNW,Ultra-30/lib/libc_psr.so.
1
このパッケージはgcc3.xでコンパイルされてます。

てな感じでgroffを入れなおします。
#libgccを入れてもいいんだけども勉強ということでgroff入れなおします。
その前にインストールしてるパッケージを抜いておきます。
[root@home6 5.8]# pkgrm SMCgroff

ftp://groff.ffii.org/pub/groff/からソースを取ってきます。
[root@home6 groff-1.17.2]# ./configure 2>&1|tee configure.log
[root@home6 groff-1.17.2]# make 2>&1|tee make.log
[root@home6 groff-1.17.2]# make install 2>&1|tee make_install.log
[root@home6 groff-1.17.2]# ldd /usr/local/bin/groff
libstdc++.so.2.10.0 => /usr/local/lib/libstdc++.so.2.10.0
libm.so.1 => /usr/lib/libm.so.1
libc.so.1 => /usr/lib/libc.so.1
libdl.so.1 => /usr/lib/libdl.so.1
/usr/platform/SUNW,Ultra-30/lib/libc_psr.so.1
●BerkeleyDB.4.xのインストール

ライブラリのリンクが無い時。↓こんな時
db_archive:
libdb-3.2.so => /usr/local/BerkeleyDB.3.2/lib/libdb-3.2.so
libc.so.1 => /usr/lib/libc.so.1
libgcc_s.so.1 => (ファイルが見つかりません)
libgcc_s.so.1 => (ファイルが見つかりません)
libdl.so.1 => /usr/lib/libdl.so.1
/usr/platform/SUNW,Ultra-30/lib/libc_psr.so.1
db_checkpoint:
libdb-3.2.so => /usr/local/BerkeleyDB.3.2/lib/libdb-3.2.so
libc.so.1 => /usr/lib/libc.so.1
libgcc_s.so.1 => (ファイルが見つかりません)
libgcc_s.so.1 => (ファイルが見つかりません)
libdl.so.1 => /usr/lib/libdl.so.1
/usr/platform/SUNW,Ultra-30/lib/libc_psr.so.1

ソースからコンパイルしましょう。
BerkekeyDBはほかのオープンソースなソフトと
ソースの展開したディレクトリ構造が少し違います。
#解凍した配下にMakefileやconfigureがなかったり・・・
#srcディレクトリがあったりすることが多いんですが・・・
#docディレクトリはあるのでこの中を熟読してください、すぐにコンパイルのやり方がわかります。
インストールはこんな感じです。
とりあえずソースは
http://www.sleepycat.com/
から最新版を持ってきます。
[root@home6 src]# tar zxf db-4.2.52.tar.gz
[root@home6 src]# cd db-4.2.52
[root@home6 db-4.2.52]# cd build_unix/
[root@home6 build_unix]# ../dist/configure CC=gcc   (LinuxだとCC=gccはなくてもいいかもしれません・・・未検証)
[root@home6 build_unix]# make 2>&1|tee make.log
[root@home6 build_unix]# make install 2>&1|tee make_install.log
※なぜわざわざBerkekeyDBを入れるかというとRELAYの設定をhashサポートで使うからです。

またBerkekeyDBの最新版をインストールしても/usr/local/BerkekeyDB.バージョンというかたちで
インストールされるので古いものを削除しなくても特に問題はないでしょう。
必要なときにLD_LIBRALY_PATHなどに入れてあげればいいだけですから。
●sendmailのインストール

ソースは/usr/local/src/sendmailにおいているものとしてインストールしていきます。

・バックアップ
[root@home6 sendmail]# cp -p /usr/lib/sendmail /usr/lib/sendmail.org
[root@home6 sendmail]# cp -p /etc/mail/sendmail.cf /etc/mail/sendmail.cf.bak
[root@home6 sendmail]# cp -p /usr/sbin/makemap /usr/sbin/makemap.org

・アクセス権の確認
もし「/ /etc /etc/mail /usr /var /var/spool /var/spool/mqueue」にgroupに書き込み権が
あればはずして、持ち主をrootにします。
#chmod go-w / /etc /etc/mail /usr /var /var/spool /var/spool/mqueue
#chown root / /etc /etc/mail /usr /var /var/spool /var/spool/mqueue

・グループとユーザ作成
[root@home6 sendmail]# groupadd -g 25 smmsp
[root@home6 sendmail]# useradd -u 25 -g 25 -d / smmsp
※予約gid・uidのwarningはでますがただ単なる警告なので
理解してオペレーションしてる分には問題ないです。

・manディレクトリ作成
[root@home6 sendmail]# mkdir /usr/share/man/cat1
[root@home6 sendmail]# mkdir /usr/share/man/cat5
[root@home6 sendmail]# mkdir /usr/share/man/cat8

・ソースの展開
[root@home6 /]# cd /usr/local/src/sendmail
[root@home6 sendmail]# tar zxvf sendmail.8.12.3.tar.gz
[root@home6 sendmail]# cd sendmail-8.12.3/

●site.config.m4の編集

/usr/local/src/sendmail/sendmail-8.12.3/devtools/Site/site.config.m4
BerkeleyDB.4.xをインストールしているのでhashサポートで入れるので以下の
site.config.m4を用いることにする。

※下記のBerkeleyDB.4.0をサポートしていれるやり方ですが
site.config.m4を以下のように書けばいけるかも。(未検証:近々検証します)

define(`confMAPDEF', `-DNEWDB -DNDBM -DNIS -DNISPLUS -DMAP_REGEX')
APPENDDEF(`confINCDIRS', `-I/usr/local/BerkeleyDB.4.2/include')
APPENDDEF(`confLIBDIRS', `-L/usr/local/BerkeleyDB.4.2/lib')
APPENDDEF(`confLIBSEARCH', `db')
APPENDDEF(`confLIBSEARCHPATH', `/usr/lib /usr/local/lib /usr/local/BerkeleyDB.4.2/lib')
うーん難しいです。初心者には無理かも・・・
けっこう意味不明だし。site.config.m4がすらすら書けるようになるには
それなりに勉強してください。m(_ _)m
APPENDDEF:定義に追加
define:定義そのものを決定

一応すべての設定の項目や書き方は
/usr/local/src/sendmail/sendmail-8.12.3/devtools/README
・コンパイル
[root@home6 sendmail-8.12.3]# cd /usr/local/src/sendmail/sendmail-8.12.3/sendmail
[root@home6 sendmail]# ./Build 2>&1|tee Build.log

・インストール
[root@home6 sendmail-8.12.3]# cd sendmail
[root@home6 sendmail]# ./Build install 2>&1|tee Build_install.log

●makemapのインストール

RELAYのデータベースを作成するためのmakemapコマンドをhashサポートでコンパイルします。
makemapのインストールも上のsiteconfig.m4を書いていれば一発でうまくいくと思います。

・コンパイル
[root@home6 makemap]# ./Build 2>&1|tee Build.log
[root@home6 makemap]# ./Build install 2>&1|tee Build_install.log
これでhashを使えるmakemapが完成します。

【設定】

[root@home6 cf]# cd /usr/local/src/sendmail/sendmail-8.12.3/cf/cf
[root@home6 cf]# cp generic-solaris.mc sendmail.mc
[root@home6 cf]# vi sendmail.mc
divert(0)dnl
VERSIONID(`$Id: generic-solaris.mc,v 8.13 2001/06/27 21:46:30 gshapiro Exp $')dnl
OSTYPE(`solaris2')dnl
FEATURE(`redirect')dnl
FEATURE(`always_add_domain')dnl
FEATURE(`accept_unresolvable_domains')dnl
FEATURE(`accept_unqualified_senders')dnl
FEATURE(`masquerade_envelope')dnl
FEATURE(`access_db', `hash -o /etc/mail/access')dnl
FEATURE(`use_cw_file')dnl

dnl FEATURE(`domaintable', `hash /etc/mail/domaintable')dnl
dnl FEATURE(`mailertable', `hash /etc/mail/mailertable')dnl
dnl FEATURE(`bitdomain', `hash /etc/mail/bitdomain')dnl
dnl FEATURE(`virtusertable', `dbm /etc/mail/virtusers')fnl

MASQUERADE_AS(`jinjin.com')dnl
define(`confDOMAIN_NAME', `jinjin.com')dnl
define(`confMAX_HEADERS_LENGTH', `32768')dnl
define(`confTO_IDENT', `0')dnl
define(`confPRIVACY_FLAGS', `goaway')dnl
dnl define(`DATABASE_MAP_TYPE', `dbm')dnl
dnl define(`SMART_HOST', `smart.foo.com')dnl

MAILER(`local')dnl
MAILER(`smtp')dnl
こsendmail.mcは私の適当に作成したサンプルと思ってください。
書き方はこんな風な書き方をするというだけです。
本当に自分に必要な定義は
/usr/local/src/sendmail/sendmail-8.12.3/cf/READMEを参照してください。
またLDAPに対応させたい場合もこのREADME見てください。
詳細に説明されてます。

[root@home6 makemap]# vi /etc/mail/access
192.168.128 RELAY
127.0.0.1 RELAY
[root@home6 makemap]# makemap hash /etc/mail/access < /etc/mail/access
ここでhashサポートでmakemapをインストールしていないと-DNEWDBをつけてコンパイル
しないさいという旨のメッセージがでてaccess.dbファイルを作れません。
hashでつくるならですが。solarisならdbmにしておくのが無難かも・・・

[root@home6 cf]# m4 ../m4/cf.m4 sendmail.mc > sendmail.cf
[root@home6 cf]# vi submit.mc
define(`confRUN_AS_USER', `smmsp:smmsp')
この一行だけにする。
[root@home6 cf]# m4 ../m4/cf.m4 submit.mc > submit.cf

[root@home6 cf]# cp sendmail.cf /etc/mail/
[root@home6 cf]# cp submit.cf /etc/mail/

・パーミッション
$SRCDIR/sendmail/SECURITYファイルにしたがってパーミッションを
変更する。
-r-xr-sr-x root smmsp ... /PATH/TO/sendmail
drwxrwx--- smmsp smmsp ... /var/spool/clientmqueue
drwx------ root wheel ... /var/spool/mqueue
-r--r--r-- root wheel ... /etc/mail/sendmail.cf
-r--r--r-- root wheel ... /etc/mail/submit.cf
このようにするらしい。READMEより
[root@home6 cf]# chown smmsp:smmsp /var/spool/clientmqueue
[root@home6 cf]# chmod 770 /var/spool/clientmqueue

・local-host-namedファイル作成
[root@home6 cf]# vi /etc/mail/local-host-names
jinjin.com
.jinjin.com
home6.jinjin.com
もし他に受け取るホストがいるならFQDNで付け足します。
jinjin.com向けのMXレコードにhome7やhome8なども書いている場合。
home7.jinjin.com
home8.jinjin.com
  ・
  ・
  ・

サブドメインのメールも受け取るならそれも
書いておきましょう。
subdomain.name
host.subdomain.name
host1.subdomain.name
のような感じで。

意味わからんというときは是非cfのなかの README 見てください。m(_ _)m
・起動
[root@home6 cf]# /etc/rc2.d/S88sendmail start
[root@home6 cf]# ps -ef |grep sendmail

・起動ファイル作成
もしsolarisでberkeleyDBを使ってコンパイルしたのであればデフォルトの
/etc/rc2.d/S88sendmailだけでは立ち上がらないので、このファイルに
#!/sbin/sh
の下に
LD_LIBRARY_PATH=/usr/lib:/lib:/usr/local/lib:/usr/local/BerkeleyDB.4.0/lib;
export LD_LIBRARY_PATH;

の2行を入れておきましょう。

もし入れてないと再起動したときにsendmailが立ち上がってこない
でも、手で「/etc/rc2.d/S88sendmail start」すると立ち上がってしまう・・・
なんて気持ちの悪いことになるかもしれません。

・確認

[root@home6 cf]# uuencode /var/log/syslog syslog | mailx yuzo@jinjin.org
ちょっと小技でmailxコマンドで添付ファイルをつけて送ってみましょう。
uuencode 実際に送るファイル 添付するファイル名 でエンコードしてメールに添付します。

[root@home6 cf]# tail -20 /var/log/syslog
Apr 28 21:23:34 home6 sendmail[454]: [ID 801593 mail.info] g3SCNYbD000454: from=yuzo, size=51944, class=0, nrcpts=1, msgid=<200204281223.g3SCNYbD000454@home6.jinjin.com>, relay=root@localhost

Apr 28 21:23:34 home6 sendmail[455]: [ID 801593 mail.info] g3SCNYiH000455: from=<yuzo@home6.jinjin.com>, size=52220, class=0, nrcpts=1, msgid=<200204281223.g3SCNYbD000454@home6.jinjin.com>, proto=ESMTP, daemon=MTA, relay=localhost [127.0.0.1]

Apr 28 21:23:34 home6 sendmail[454]: [ID 801593 mail.info] g3SCNYbD000454: to=yuzo@jinjin.org, ctladdr=yuzo (100/10), delay=00:00:00, xdelay=00:00:00, mailer=relay, pri=30043, relay=localhost.jinjin.com. [127.0.0.1], dsn=2.0.0, stat=Sent (g3SCNYiH000455 Message accepted for delivery)

Apr 28 21:23:37 home6 sendmail[457]: [ID 801593 mail.info] g3SCNYiH000455: to=<yuzo@jinjin.org>, ctladdr=<yuzo@home6.jinjin.com> (100/10), delay=00:00:03, xdelay=00:00:03, mailer=esmtp, pri=120319,
relay=vs.mailsystems.net. [211.125.95.177], dsn=2.0.0, stat=Sent (Mail accepted)
送信も無事できたようなのでOKでしょう。
今はsmtpのプロトコルで送信はできるようになっていますが、まだこのサーバに届いたメールは
メールボックスにたまるだけでクライアントのPCへ取り込むことができません。
そこでqpopperをインストールしてpop3プロトコルも扱えるようにし、クライアントPCへ取り込みできるようにします。
↓qpopperはおまけでインストールしてみました・・・

●qpopperインストール

【準備】
ftp://ftp.qualcomm.com/eudora/servers/unix/popper/
ここのqpopperの一時配布サイトから最新版をダウンロードしておきましょう。

【インストール】
[root@home6 sendmail]# cd /usr/local/src/sendmail/
[root@home6 sendmail]# tar zxf qpopper4.0.4.tar.gz
[root@home6 sendmail]# cd qpopper4.0.4
[root@home6 qpopper4.0.4]# ./configure --enable-shy --enable-poppassd 2>&1|tee configure.log
※--enable-shy        Hide qpopper version number
※--enable-poppassd    Generate poppassd password-change daemon

※--enable-standalone Makes a standalone POP3 daemon instead of using inetd

[root@home6 qpopper4.0.4]# make 2>&1|tee make.log
[root@home6 qpopper4.0.4]# make install 2>&1|tee make_install.log
/usr/local/man/man8/popper.8
/usr/local/man/man8/popauth.8
/usr/local/sbin/popper
/usr/local/bin/poppassd
がインストールされる。

【設定】
ソースに含まれているGUIDE.pdfを参照するればすべて記載されています。
今回はstandaloneモードでコンパイルしたので
[root@home6 qpopper4.0.4]# /usr/local/sbin/popper 192.168.128.16:110 -s -T600
で起動できます。
ps -ef |grep popなんかで起動できているかどうか確認してから
クライアントPCから
C:\Documents and Settings\Administrator>telnet 192.168.128.16 110
+OK ready
user ユーザ名
+OK Password required for yuzo.
pass *********
+OK yuzo has 5 visible messages (0 hidden) in 69713 octets.
list
+OK 5 visible messages (69713 octets)
1 2301
2 28848
3 653
4 2512
5 35399

.
という感じで実際にPOP3が動いているか確認しましょう。
--enable-shyでコンパイルしているのでqpopperのバージョンが昔みたいに表示されなくなってます。
後は起動ファイルを作って再起動しても立ち上がるようにしておきましょ。
・起動ファイルの作成[root@home6 qpopper4.0.4]# vi /etc/rc2.d/S88popper
#!/bin/sh

case "$1" in
start)
# Start daemons.
if [ ! -f /var/run/popper.pid ]; then
echo "Starting POP3 Service"
/usr/local/sbin/popper 192.168.128.16:110 -S -T600;
ps -ef |grep "/usr/local/sbin/popper [0-9]*" | grep -v grep | awk '{print $2}' > /var/run/popper.pid;
else
echo "process popper allready running!\n"
exit 1
fi
;;
stop)
# Stop daemons.
if [ -f /var/run/popper.pid ]; then
echo "Shutting down POP3 Service"
kill -15 `cat /var/run/popper.pid`
rm -f /var/run/popper.pid
else
echo "process popper not running"
exit 1
fi
;;
restart)
$0 stop
$0 start
;;
*)
echo "Usage: $0 {start|stop|restart}"
exit 1
;;
esac
exit 0
[root@home6 qpopper4.0.4]# chmod 744 /etc/rc2.d/S88popper
[root@home6 qpopper4.0.4]# chown root:sys /etc/rc2.d/S88popper

一応インストールおわりですが・・・
今回はちょっと変わったstandaloneモードでやってみたかったのでほとんど遊びです。
libwrapのサポートなんかコンパイル時に指定できればうれしいんですけどねえ。

上記のようなインストール状態では、どこのネットワークからでもpop3へのアクセスができます。
その制御をすることはstandaloneモードではできないみたいです。
もしアクセス制御をするのであればientdから起動するようにして、tcp_wrappersで制御するのが良いでしょう・・・
もしくはapop対応にしてどこからアクセスしてもいいがネットワークを流れるデータを暗号化して
ユーザ名とパスワードを保護するとか・・・
sslまでかぶせるとちょっとpop3で大げさすぎるような気もするし・・・

あとログについてですがこのstandaloneモードでログをちゃんと出力させるには
--enable-log-facility=pop3 ってなかんじでコンパイルして、syslogd.confで設定して吐かせないとだめです。

セキュリティについても今回は何もコンパイル時に指定してないのでデーモンをrootで起動してます。
これは非常に良くないです。ほんとなら--enable-popuid=ユーザ名
でシェルを持たないユーザで起動するべきでしょう・・・

pop3の部分はかなりだめだめインストールです。<(_ _)>
良い子の皆さんは真似しないように。