sendmailで専任MSA
sendmailで専任MSA
[カテゴリ:mail][カテゴリ:FreeBSD]プロバイダでport25の制限とかはじめる動きがあって、そろそろMSAもあったほうがいいねとかそんな感じなので、とりあえずsendmailでMSAをageてみるテスト。
現行のMTAはそのまま使いつづけて、MSAが受けたメールはlocalだろうがremoteだろうが全てlocalhostのMTAに転送するようにする。
とりあえずはインストール。portsつかってやったので詳細略。cyrus-sasl2 と cyrus-sasl2-saslauthd と sendmail with sasl2.sasl2がBerkeleyDB要求するのがうざいが、まぁまとめてportsでいれておく。ついでなんでsendmailもBDB利用にしておく。
魔法の呪文 for /usr/local/etc/pkgtools.conf
MAKE_ARGS = { 'mail/sendmail' => [ "CFLAGS='-O -pipe -s'", 'SENDMAIL_WITH_SMTPS=yes', 'SENDMAIL_WITH_SASL2=yes', 'SENDMAIL_WITH_BERKELEYDB_VER=42', ], 'security/cyrus-sasl2' => [ 'WITH_BDB_VER=42', ], 'security/cyrus-sasl2-saslauthd' => [ 'WITH_BDB_VER=42', ], }
詳細略じゃなかったのか(ぉ
んで、cfの作成。いろいろ試した結果、こんな感じのmcでいける模様。
divert(-1) # # This is a generic configuration file for FreeBSD 4.X and later systems. # If you want to customize it, copy it to a name appropriate for your # environment and do the modifications there. # divert(0) include(`/usr/local/share/sendmail/cf/m4/cf.m4') VERSIONID(`$Id: sm-msa.cf for mail.chinmai.net 2005/02/03 Exp $') OSTYPE(freebsd4) DOMAIN(generic) dnl Dwmail Dmchinmai.net define(`confDOMAIN_NAME', `$w.$m')dnl dnl define(`confPID_FILE', `/var/run/sm-msa.pid') define(`STATUS_FILE', `/var/log/sm-msa.st') define(`QUEUE_DIR',`/var/spool/msaqueue') define(`confCF_VERSION', `MSA') define(`SMTP_MAILER_FLAGS', `k') define(`LOCAL_MAILER_FLAGS', `k') FEATURE(`no_default_msa') dnl dnl Enable for both IPv4 and IPv6 (optional) DAEMON_OPTIONS(`Name=MSAv4, Port=587, Family=inet, M=E') DAEMON_OPTIONS(`Name=MSAv6, Port=587, Family=inet6, M=E') dnl dnl The group needs to be mail in order to read the sasldb2 file define(`confRUN_AS_USER',`root:mail') TRUST_AUTH_MECH(`DIGEST-MD5 CRAM-MD5') define(`confAUTH_MECHANISMS',`DIGEST-MD5 CRAM-MD5') define(`confDONT_BLAME_SENDMAIL',`GroupReadableSASLDBFile') dnl undefine(`ALIAS_FILE') define(`MAIL_HUB', `localhost.') define(`SMART_HOST', `localhost.') define(`confFORWARD_PATH', `') ifdef(`confFROM_HEADER',, `define(`confFROM_HEADER', `<$g>')') define(`_DEF_LOCAL_MAILER_FLAGS', `lsDFM5q') MAILER(`local') MAILER(`smtp')
LISTEN Portはv4とv6の587番のみ。MSA専任で受信したメールは全てlocalhostのMTAに転送する設定。最初は FEATURE(`nullclient') を使ってたんだけど、漏れなくMASQUERADEがついてくるので、nullclient.m4の中身を一部拝借してみた。MAIL_HUBとSMART_HOSTは単に localhost とだけ書くとどうも動作しない模様。最後に . をつけると動作するんだけど、なぜかは知らん(ぉ あと、localhost宛の転送になるので、 MAILER_FLAGS に k を追加してやらないとmail loopを検出してきて転送エラーになるので注意。
認証については、普通にsasl2を使えばよろしい。saslauthd を -sasldb で起動して、
# saslpasswd2 -c -u chinmai.net testuser
でユーザ登録。SMTP認証はユーザ名 testuser@chinmai.net でないと認証とおらない。
魔法の呪文 for /etc/rc.conf
saslauthd_enable=YES saslauthd_flags="-a sasldb"
あと無保証の何か。コワイヨー(ぉ
#include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <pwd.h> main() { struct passwd *pwd; size_t len = 200; char cmd[len]; char *fqdn = "example.com"; pwd = getpwuid(getuid()); printf("SMTP AUTH password for user %s\n",pwd->pw_name); setuid(geteuid()); snprintf(cmd,len,"/usr/local/sbin/saslpasswd2 -u %s %s",fqdn,pwd->pw_name); system(cmd); }