FrontPage 差分 一覧 ソース 検索 ヘルプ ログイン

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);
 }