・ 構築の前に
- メールサーバの構築が 11. メールサーバ構築(5) – nginx/php-fpm [さくらのVPS/CentOS7]
まで完了していること - メーリングリスト用にサブドメインを一つ用意すること
- メーリングリストから送信されるシステムメールは SPF, DKIM, DMARC, ARC に対応
- メーリングリストから送信される投稿メールは SPF,ARC に対応し、DKIM, DMARCは自メールドメインからの投稿メールのみ対応する
・sympa のインストール
#-- 変数に必要な値を代入
DOMAIN=masdon.life
MLDOMAIN=ml.${DOMAIN}
LISTMASTER=admin@${DOMAIN}
URL=https://${DOMAIN}/sympa
#-- sympa のリポジトリ設定とsympaのインストール(副作用でnginxもインストールされてしまう)
curl -o /etc/yum.repos.d/sympa-ja.org.rhel.repo http://sympa-ja.org/download/rhel/sympa-ja.org.rhel.repo
yum install -y sympa sympa-nginx
#-- nginx の起動スクリプトの修正
sed -i -e 's#/usr/sbin/nginx#/usr/local/nginx/sbin/nginx#' \
-e '/^PIDFile/a ExecStartPre=/usr/local/bin/ipv6upchk.sh nginx' /usr/lib/systemd/system/nginx.service
systemctl daemon-reload
systemctl enable nginx
#-- nginx と sympa-nginx を update しないように変更
echo "exclude=nginx*,sympa-nginx" >> /etc/yum.conf
#-- sympa の database を作成
mysql -e "CREATE DATABASE sympa CHARACTER SET utf8;"
#-- database の password は お好みで
mysql -e "GRANT ALL PRIVILEGES ON sympa.* TO 'sympa'@'localhost' IDENTIFIED BY 'sympass';"
mysql -e "FLUSH PRIVILEGES;"
#-- sympa の設定
cp -p /etc/sympa/sympa.conf{,.org}
sed -i -e "/^#domain/a domain ${MLDOMAIN}" \
-e "/^#listmaster/a listmaster ${LISTMASTER}" \
-e "/^#lang/a lang ja" \
-e "/^#db_type/a db_type MySQL" \
-e "/^#db_name/a db_name sympa" \
-e "/^#db_host/a db_host 127.0.0.1" \
-e "/^#db_user/a db_user sympa" \
-e "/^#db_passwd/a db_passwd sympass" \
-e "/^#wwsympa_url/a wwsympa_url ${URL}" /etc/sympa/sympa.conf
#- sympa の設定の確認(何も表示されなければOK)
sympa.pl --health_check
#- 定期的に postfix の設定を更新するスクリプトを作成
cat <<'_EOL_'> /usr/local/bin/create_sympa_regex.sh
#!/bin/bash
if [ $# -ne 1 ]
then
echo "usage: $0 <sympa-domain>"
exit 1
fi
DOMAIN=$1
SYMPA1=/etc/sympa/aliases.sympa.postfix
SYMPA2=/var/lib/sympa/sympa_aliases
REGEX=/etc/postfix-inbound/symparcptcheck.regexp
TMP=/tmp/symparcptcheck.regexp
# 2分以内にメーリングリストの更新があったらpostfixに反映する
LIMIT=120
if [ $(($(stat --format=%Y ${SYMPA1}) + ${LIMIT})) -ge $(date +%s) ] || [ $(($(stat --format=%Y ${SYMPA2}) + ${LIMIT})) -ge $(date +%s) ]
then
/usr/bin/cp /dev/null ${TMP}
for x in $(awk -F: '!/^#/{print $1}' ${SYMPA1} ${SYMPA2})
do
echo "/^${x}@${DOMAIN}/ OK" >> ${TMP}
done
/usr/bin/mv -f ${TMP} ${REGEX}
systemctl reload postfix
fi
exit 0
_EOL_
chmod 755 /usr/local/bin/create_sympa_regex.sh
#- alias 関連ファイルのパーミション設定やデータ更新
chown sympa /etc/sympa/aliases.sympa.postfix.db
chown sympa /var/lib/sympa
postalias /var/lib/sympa/sympa_aliases
sed -i -e "s/\S*@my.domain.org/admin@${DOMAIN}/" -e "s/postmaster/admin@${DOMAIN}/" /etc/sympa/aliases.sympa.postfix
postalias /etc/sympa/aliases.sympa.postfix
#- postfix 用の宛先存在確認ルールを作成(上記コマンド実行後、2分以内に実行すること)
/usr/local/bin/create_sympa_regex.sh ${MLDOMAIN}
#- sympaでメーリングリストが追加された場合にpostfixに設定を反映するためのcron
echo "* * * * * root /usr/local/bin/create_sympa_regex.sh ${MLDOMAIN} >/dev/null 2>&1" >> /etc/cron.d/${DOMAIN}-cron
#-- nginx に設定追加
rm -f /etc/nginx/conf.d/sympa.conf
cat <<'_EOL_'> /etc/nginx/conf.d/https.d/sympa.conf
location /sympa {
include /etc/nginx/fastcgi_params;
fastcgi_pass unix:/var/run/sympa/wwsympa.socket;
# If you changed wwsympa_url in sympa.conf, change this regex too!
fastcgi_split_path_info ^(/sympa)(.*)$;
fastcgi_param SCRIPT_FILENAME /usr/libexec/sympa/wwsympa.fcgi;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
location /static-sympa/css {
alias /var/lib/sympa/css;
}
location /static-sympa/pictures {
alias /var/lib/sympa/pictures;
}
location /static-sympa {
alias /usr/share/sympa/static_content;
}
_EOL_
systemctl restart nginx
#-- sympa 起動
systemctl enable sympa wwsympa
systemctl start sympa wwsympa
#-- postfix の設定
#- メールを受け付ける対象にml用ドメインを追加
cat <<_EOF_>> /etc/postfix-inbound/relay_domains
${MLDOMAIN}
_EOF_
#- ml用ドメインはローカルに配送する(alias を適用する)設定を追加
cat <<_EOF_>> /etc/postfix-inbound/transport
${MLDOMAIN} local:
_EOF_
postmap /etc/postfix-inbound/transport
#- alias を sympa のファイルを参照するように変更、宛先チェックなどの設定も変更
postconf -c /etc/postfix-inbound -e alias_maps=hash:/etc/sympa/aliases.sympa.postfix,hash:/var/lib/sympa/sympa_aliases
postconf -c /etc/postfix-inbound -e alias_database=/etc/sympa/aliases.sympa.postfix,hash:/var/lib/sympa/sympa_aliases
postconf -c /etc/postfix-inbound -e smtpd_recipient_restrictions="check_recipient_access ldap:/etc/postfix-inbound/ldaprcptcheck.cf check_recipient_access regexp:/etc/postfix-inbound/symparcptcheck.regexp reject"
postconf -c /etc/postfix-inbound -e transport_maps="ldap:/etc/postfix-inbound/ldaptransport.cf hash:/etc/postfix-inbound/transport"
systemctl restart postfix
#-- rspamd の設定
#- envelope from が ml用ドメインの場合、SPAM判定のScoreを10下げる(これを実施しないと送信時にX-Spam: Yes が追加される)
cat <<_EOF_> /etc/rspamd/local.d/multimap.conf
WHITELIST_SENDER_DOMAIN {
type = "from";
filter = "email:domain";
map = "/etc/rspamd/local.d/whitelist_sender_domain.map";
score = -10.0
}
_EOF_
cat <<_EOF_>/etc/rspamd/local.d/whitelist_sender_domain.map
${MLDOMAIN}
_EOF_
#- DKIM と ARC の署名設定を追加する(詳しくはrspamdの構築設定手順を参照)
rspamadm dkim_keygen -d ${MLDOMAIN} -s default -b 2048
#-- 秘密鍵を記述
vi /etc/rspamd/local.d/keys/default.${MLDOMAIN}.key
chmod 600 /etc/rspamd/local.d/keys/default.${MLDOMAIN}.key
chown _rspamd. /etc/rspamd/local.d/keys/default.${MLDOMAIN}.key
#- ml用ドメインの設定を追加する
vi /etc/rspamd/local.d/dkim_signing.conf
vi /etc/rspamd/local.d/arc.conf
#- dkim署名するヘッダーを下記に変更する
vi /etc/rspamd/local.d/dkim_signing.conf
sign_headers = '(o)from:(o)date:(o)message-id:(o)to:(o)cc:(o)mime-version:(o)content-type:(o)content-transfer-encoding:resent-to:resent-cc:resent-from:resent-sender:resent-message-id:(o)in-reply-to:(o)references:list-id:list-owner:list-unsubscribe:list-subscribe:list-post';
#- arc署名するヘッダーを下記に変更する
vi /etc/rspamd/local.d/arc.conf
sign_headers = "(o)from:(o)sender:(o)reply-to:(o)date:(o)message-id:(o)to:(o)cc:(o)mime-version:(o)content-type:(o)content-transfer-encoding:resent-to:resent-cc:resent-from:resent-sender:resent-message-id:(o)in-reply-to:(o)references:list-id:list-owner:list-unsubscribe:list-subscribe:list-post:dkim-signature";
#- rspamd 再起動
systemctl restart rspamd
#-- nsd の設定
IPV4=$(ip addr show eth0 | awk '/inet /{print $2}' | awk -F\/ '{print $1}')
IPV6=$(ip addr show eth0 | awk '/inet6 /&&/global/{print $2}' | awk -F\/ '{print $1}')
cat <<_EOL_>>/etc/nsd/zone/${DOMAIN}.zone
ml IN MX 100 ${DOMAIN}.
ml IN TXT "v=spf1 +ip4:${IPV4} +ip6:${IPV6} -all"
_dmarc.ml IN TXT "v=DMARC1; p=none; rua=mailto:root@${DOMAIN}"
_adsp._domainkey.ml IN TXT "dkim=discardable"
default._domainkey.ml IN TXT ( "v=DKIM1; k=rsa; "
"p=共通鍵を記述"
) ;
_EOL_
systemctl restart nsd
・初期パスワードの作成
- https://masdon.life/sympa/firstpasswd で 管理者ユーザのパスワードを作成する