28. さくらのレンタルサーバをマウントする – curlftpfs [さくらのVPS/CentOS7]

  • さくらのレンタルサーバ スタンダードプラン の 100GB ディスクをさくらのVPS でマウントして使用する
#-- 変数に値を代入
DOMAIN=example.sakura.ne.jp #-- レンタルサーバのドメイン
USER=foo #-- レンタルサーバのログインID
PASS=bar #-- レンタルサーバのパスワード

#-- curlftpfs のインストール
yum install -y curlftpfs

#-- mount ポイントの作成
mkdir -p /mnt/ftpfs

#-- ログイン情報ファイルを作成
cat  <<_EOL_> ~/.netrc
machine ${DOMAIN} login ${USER} password ${PASS}
_EOL_

#-- mount コマンドでマウントできるように fstab に記述
cat <<_EOL_>> /etc/fstab
curlftpfs#${DOMAIN} /mnt/ftpfs fuse noauto,user,rw,uid=0,allow_other 0 0
_EOL_
#- auto マウントを設定すると 再起動時にブートに失敗する

#-- マウント
mount /mnt/ftpfs

#-- 確認
df -h /mnt/ftpfs
Filesystem                           Size  Used Avail Use% Mounted on
curlftpfs#ftp://example.sakura.ne.jp/  954G     0  954G   0% /mnt/ftpfs

dovecot で public mailbox を使用する

#-- 変数に必要な値を代入
DOMAIN=masdon.life

#-- /etc/dovecot/local.conf に設定を追加する
vi /etc/dovecot/local.conf

#- mail_plugins に acl を追加
mail_plugins = $mail_plugins zlib acl

#- plugin に acl = vfile を追加
plugin {
  ...
  ...
  acl = vfile
}

#- protocol imap の mail_plugins に imap_acl を追加
protocol imap {
  mail_plugins = $mail_plugins imap_acl
  ...
}

#- namespace の設定を追加
namespace inbox {
  type = private
  separator = /
  prefix =
  inbox = yes
}

#- _Public/Test01 と _Public/Test02 を作成する
namespace {
  type = public
  separator = /
  prefix = _Public/
  location = maildir:/var/dovecot/public/%Ld
  subscriptions = yes
  list = yes
  mailbox Test01 {
    auto = subscribe
  }
  mailbox Test02 {
    auto = subscribe
  }
}

#-- dovecot を reload
systemctl reload dovecot

#-- _Public を該当ドメイン全てのユーザで使用できるよう acl を設定
echo "anyone eilprwts" > /var/dovecot/public/${DOMAIN}/dovecot-acl
chown dovecot. /var/dovecot/public/${DOMAIN}/dovecot-acl
chmod 600 /var/dovecot/public/${DOMAIN}/dovecot-acl

#-- 該当ドメインのメールアカウントを設定したメーラーで _Public/Test01と_Public/Test02 フォルダを購読しアクセスすると MBOXが作成される
#-- 作成されたMBOXは、上位フォルダの ACL が設定される
ls -ld /var/dovecot/public/${DOMAIN}/.Test0{1,2}
drwx------ 5 dovecot dovecot 146  2月 17 21:45 /var/dovecot/public/masdon.life/.Test01
drwx------ 5 dovecot dovecot 146  2月 17 21:09 /var/dovecot/public/masdon.life/.Test02

#-- _Public/Test01 を該当ドメイン全てのユーザで使用できるよう acl を設定
echo "anyone eilprwts" > /var/dovecot/public/${DOMAIN}/.Test01/dovecot-acl
chown dovecot. /var/dovecot/public/${DOMAIN}/.Test01/dovecot-acl
chmod 600 /var/dovecot/public/${DOMAIN}/.Test01/dovecot-acl

#-- _Public/Test02 をadminユーザのみで使用できるよう acl を設定
echo "user=admin@${DOMAIN} eilprwts" > /var/dovecot/public/${DOMAIN}/.Test02/dovecot-acl
chown dovecot. /var/dovecot/public/${DOMAIN}/.Test02/dovecot-acl
chmod 600 /var/dovecot/public/${DOMAIN}/.Test02/dovecot-acl

#-- _Public/Test02 にコマンドで acl に特定のユーザの権限を追加
doveadm acl add -u admin@${DOMAIN} _Public/Test02 user=ma3ki@${DOMAIN} expunge insert lookup post read write write-deleted write-seen

#-- _Public/Test02 にコマンドで acl に gr1 というグループの権限を追加
doveadm acl add -u admin@${DOMAIN} _Public/Test02 group=gr1 expunge insert lookup post read write write-deleted write-seen

#-- 権限の確認
doveadm acl get -u admin@${DOMAIN} _Public/Test01
ID     Global Rights
anyone        expunge insert lookup post read write write-deleted write-seen

doveadm acl get -u admin@${DOMAIN} _Public/Test02
ID                        Global Rights
user=admin@masdon.life        expunge insert lookup post read write write-deleted write-seen
user=ma3ki@masdon.life        expunge insert lookup post read write write-deleted write-seen

#-- ACL のフラグの意味 https://doc.dovecot.org/settings/plugin/acl/

27. メーリングリストサーバ構築 – sympa [さくらのVPS/CentOS7]

・ 構築の前に

  1. メールサーバの構築が 11. メールサーバ構築(5) – nginx/php-fpm [さくらのVPS/CentOS7]
    まで完了していること
  2. メーリングリスト用にサブドメインを一つ用意すること
  3. メーリングリストから送信されるシステムメールは SPF, DKIM, DMARC, ARC に対応
  4. メーリングリストから送信される投稿メールは 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 で 管理者ユーザのパスワードを作成する