自分の作業記録として。
qmailを使って自分とこのメール配信サービスを構築した手順です。さすがにqmail自体が現在のシステムに合わない部分があるので、パッチ当ててみたりその他のシステム(特にsystemd)と連携させたりとか思ったよりも大変だった…
今回の目的は
- MTAとしてはqmailを(あえて)使う。postfixとかは使わない!
- supervise(daemontools)は使わない
- SMTP-AUTHおよびSTARTTLSに対応させる。その際にはLet’s Encrypt証明書を利用する。
- あわせてSPF、DMARCの設定も行う(DKIMもやりたいけど、もう少し調べてから)
を達成すること。
環境準備、ビルドに必要なパッケージのインストール
ソースからビルドするので、必要なツールやライブラリを事前にインストールしておく。
mkdir ~/src
yum -y install make patch gcc gcc-cpp openssl-devel pam-devel
インストール
libdomainkeys
cd ~/src
wget http://notes.sagredo.eu/files/qmail/tar/libdomainkeys-0.69.tar.gz
tar xzf libdomainkeys-0.69.tar.gz
wget http://notes.sagredo.eu/files/qmail/patches/libdomainkeys-0.69.diff
ln -s libdomainkeys-0.69 libdomainkeys
cd libdomainkeys
chown -R root.root .
patch < ../libdomainkeys-0.69.diff
make
sudo cp libdomainkeys.a /usr/lib
libsrs2
cd ~/src
wget http://www.libsrs2.org/srs/libsrs2-1.0.18.tar.gz
tar xzf libsrs2-1.0.18.tar.gz
cd libsrs2-1.0.18
./configure
make
sudo make install
sudo ldconfig -v | grep srs
入ってない。
$ sudo ldconfig -v | grep srs
ldconfig: /libx32 の情報取得 (stat) ができません: そのようなファイルやディレクトリはありません
ldconfig: パス `/usr/lib' が二回以上与えられました
ldconfig: パス `/usr/lib64' が二回以上与えられました
ldconfig: /usr/libx32 の情報取得 (stat) ができません: そのようなファイルやディレクトリはありません
$ ls /usr/local/lib
libsrs2.a libsrs2.la libsrs2.so libsrs2.so.0 libsrs2.so.0.0.0
/usr/local/libになってるのでld.so.confに/usr/local/libを追加してやり直し。
$ echo /usr/local/lib | sudo tee /etc/ld.so.conf.d/local-libs.conf
/usr/local/lib
$ cat /etc/ld.so.conf.d/local-libs.conf
/usr/local/lib
$ sudo ldconfig -v | grep srs
ldconfig: /libx32 の情報取得 (stat) ができません: そのようなファイルやディレクトリはありません
ldconfig: パス `/usr/lib' が二回以上与えられました
ldconfig: パス `/usr/lib64' が二回以上与えられました
ldconfig: /usr/libx32 の情報取得 (stat) ができません: そのようなファイルやディレクトリはありません
libsrs2.so.0 -> libsrs2.so.0.0.0
vpopmail
netqmailに適用するパッチに含まれるchkuserがvpopmailのユーザチェック機能を使用するので、vpopmail自体は使わないけどインストール
ソースはsourceforgeにあるのでそこからとってくる。
vpopmail – virtual domains for qmail – Browse Files at SourceForge.net
sudo groupadd vchkpw
sudo useradd -g vchkpw -d /home/vpopmail vpopmail
sudo mkdir -p /var/qmail/bin
sudo touch /var/qmail/bin/qmail-inject
sudo touch /var/qmail/bin/qmail-newu
sudo touch /var/qmail/bin/qmail-newmhr
cd ~/src
tar xzf vpopmail-5.4.33.tar.gz
cd vpopmail-5.4.33
sudo ./configure
sudo make install-strip
netqmailインストール環境準備
必要な設定ファイルを /etc
配下にまとめる目的で、qmailの制御ファイル格納ディレクトリ /var/qmail/control
を /etc/qmail
のシンボリックリンクとしておく。
sudo mkdir /etc/qmail
sudo ln -s /etc/qmail /var/qmail/control
netqmail + patch
qmailにいろいろパッチ当ててあるnetqmailへ、更にいろいろな追加機能のパッチを適用。
cd ~/src
wget http://www.qmail.org/netqmail-1.06.tar.gz
tar xzf netqmail-1.06.tar.gz
wget http://notes.sagredo.eu/files/qmail/patches/roberto-netqmail-1.06.patch-latest.gz
cd netqmail-1.06
gunzip -c ../roberto-netqmail-1.06.patch-latest.gz | patch
INSTALL.ids
より、ユーザ作成。シェルにしてroot権限で実行するのが楽(というか手順ではそれを推奨している)
groupadd nofiles
useradd -g nofiles -d /var/qmail/alias alias
useradd -g nofiles -d /var/qmail qmaild
useradd -g nofiles -d /var/qmail qmaill
useradd -g nofiles -d /var/qmail qmailp
groupadd qmail
useradd -g qmail -d /var/qmail qmailq
useradd -g qmail -d /var/qmail qmailr
useradd -g qmail -d /var/qmail qmails
んで、ビルド。
sudo make setup check
sudo ./config-fast {FQDN}
設定された内容の確認は /var/qmail/bin/qmail-showctl
を使う。その他のパラメータいじりたい場合は /var/qmail/control 配下に設定ファイルを作成する。
これぐらいはやっとけ
/var/qmail/control/locals
にローカル配送の対象となる宛先ドメイン名を書いておく。自分の場合は以下の通り。
localhost
infrastudy.com
mail.infrastudy.com
エイリアス
よくある宛先(rootとかpostmasterとか)へのメールを特定のユーザ宛に転送するようにエイリアス設定する
echo "ユーザ名" | sudo tee -a /var/qmail/alias/.qmail-root
sudo ln -s /var/qmail/alias/.qmail-root /var/qmail/alias/.qmail-postmaster
sudo ln -s /var/qmail/alias/.qmail-root /var/qmail/alias/.qmail-mailer-daemon
STARTTLS用の作業
証明書を作成する。
$ sudo make cert
Generating a 2048 bit RSA private key
........+++
................................................+++
writing new private key to '/var/qmail/control/servercert.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:JP
State or Province Name (full name) []:Japan
Locality Name (eg, city) [Default City]:Somewhere
Organization Name (eg, company) [Default Company Ltd]:infrastudy.com
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:mail.infrastudy.com
Email Address []:postmaster@infrastudy.com
$ sudo make tmprsadh
echo "Creating new temporary RSA and DH parameters"
Creating new temporary RSA and DH parameters
./update_tmprsadh
Generating RSA private key, 2048 bit long modulus
...............................................+++
................................................+++
e is 65537 (0x10001)
Generating DH parameters, 2048 bit long safe prime, generator 2
This is going to take a long time
....................................+.....................................................
(略)
.......................+...+.........+....................................................................................................................................................................................+......................................................+..............+................................+........++*++*
$ sudo chown vpopmail.vchkpw /var/qmail/control/*.pem
日次でRSADHの更新を行うようにcrontabにエントリ追加。
# crontab -e
03 05 * * * /var/qmail/bin/update_tmprsadh > /dev/null 2>&1
Let’s Encryptの証明書を /var/qmail/control/servercert.pem
にまとめる。
DOMAIN=infrastudy.com cat /etc/letsencrypt/live/${DOMAIN}/privkey.pem /etc/letsencrypt/live/${DOMAIN}/fullchain.pem > /var/qmail/control/servercert.pem
おまけ:dovecotでのSSL定義( /etc/dovecot/conf.d/10-ssl.conf
)
ssl_cert = </etc/letsencrypt/live/yourdomain.tld/fullchain.pem
ssl_key = </etc/letsencrypt/live/yourdomain.tld/privkey.pem
SMTP-AUTH用にcheckpasswordのインストール
どっちかを選ぶ
– checkpasswordの本体を入手して、sourceforgeからのパッチを適用
– PAM対応済みパッケージをsourceforge から入手
sourceforgeからとってくるのは checkpassword-pam download | SourceForge.net から。
cd ~/src
tar xzf checkpassword-pam-0.99.tar.gz
./configure
make
sudo make install
systemdとの連携
以下の内容で /etc/systemd/system/qmail.service
を作成し、ローカル配送などのために必要なqmailのサービスを動作させる。
[Unit]
Description=Qmail mail delivery daemons
After=network.target
[Service]
ExecStart=/var/qmail/bin/qmail-start ./Maildir/ splogger qmail
Environment=PATH=/var/qmail/bin:${PATH}
Restart=always
[Install]
WantedBy=multi-user.target
ポート25で待受するサービス。待ち受けるための.socketとそこから呼び出すテンプレートサービスが必要。
ハマりどころだったのが、.serviceの StandardError=journal
。これがないと標準エラー出力までも qmail-smtpd
からの応答として相手に出力してしまうため、SMTPとしてのシーケンスが崩れてしまいメールの配信に失敗してしまう。
/etc/systemd/system/qmail-smtpd.socket
[Unit]
Description=SMTP Socket
[Socket]
ListenStream=0.0.0.0:25
Accept=yes
[Install]
WantedBy=sockets.target
/etc/systemd/system/qmail-smtpd@.service
[Unit]
Description=qmail SMTPd Service
[Service]
EnvironmentFile=/etc/qmail/env-smtpauth
ExecStart=/var/qmail/bin/qmail-smtpd /usr/local/bin/checkpassword-pam /usr/bin/true
Restart=no
Type=simple
User=qmaild
StandardInput=socket
StandardError=journal
[Install]
WantedBy=multi-user.target
クライアントから接続するサブミッションポート(587/tcp)用のソケットも追加する。
/etc/systemd/system/qmail-smtpd-auth.socket
[Unit]
Description=SMTP Submission Socket
[Socket]
ListenStream=0.0.0.0:587
Accept=yes
[Install]
WantedBy=sockets.target
/etc/systemd/system/qmail-smtpd-auth@.service
[Unit]
Description=qmail SMTPd Submission-port Service
[Service]
EnvironmentFile=/etc/qmail/env-smtpauth
ExecStart=/var/qmail/bin/qmail-smtpd /usr/local/bin/checkpassword-pam /usr/bin/true
Restart=no
Type=simple
User=qmaild
StandardInput=socket
StandardError=journal
[Install]
WantedBy=multi-user.target
これらを有効化+起動。
sudo systemctl enable qmail
sudo systemctl enable qmail-smtpd.socket
sudo systemctl enable qmail-smtpd-auth.socket
sudo systemctl start qmail
sudo systemctl start qmail-smtpd.socket
sudo systemctl start qmail-smtpd-auth.socket
firewall-cmd
での穴あけも忘れずに
sudo firewall-cmd --add-service=smtp --permanent --zone=public
sudo firewall-cmd --add-service=smtp-submission --permanent --zone=public
sudo firewall-cmd --reload
sudo firewall-cmd --list-all
最後に、.serviceから参照してる EnvironmentFile ( /etc/qmail/env-smtpauth
)を作成する。ここでSMTP-Authの挙動だとか、 qmail-smtpd
にわたす環境変数を定義する。今回はSTARTTLS後にSMTP-AUTHするので、AUTH PLAINが使えるようにだけしておく。
SMTPAUTH=''
SPF、DKIM、DMARC
自ドメインのTXTレコードに登録。以下は私の環境でのtinydns-dataファイルから関連するものだけを抜粋。
@infrastudy.com::mail.infrastudy.com:10
=mail.infrastudy.com:150.95.213.161
### for DMARC
'_dmarc.infrastudy.com:v=DMARC1;\040p=quarantine;\040rua=mailto\072postmaster@infrastudy.com;\040ruf=mailto\072postmaster@infrastudy.com
### for SPF
'infrastudy.com:v=spf1 ip4\072150.95.213.161 -all
SPAM避け(2018/10/30追記)
SPFチェック有効化
SPFパッチの提供元を確認する。
上記サイトではパラメータについて以下のように記述されている。
spfbehavior
Use this to turn on SPF checking. The default value is 0 (off).
You can specify a value between 0 and 6:
0: Never do SPF lookups, don’t create Received-SPF headers
1: Only create Received-SPF headers, never block
2: Use temporary errors when you have DNS lookup problems
3: Reject mails when SPF resolves to fail (deny)
4: Reject mails when SPF resolves to softfail
5: Reject mails when SPF resolves to neutral
6: Reject mails when SPF does not resolve to pass
Values bigger than 3 are strongly discouraged, you probably want to go with 2 or 3.
Important: This setting can be overridden using the environment variable SPFBEHAVIOR, e.g. from tcpserver rules.
Note: If RELAYCLIENT is set, SPF checks won’t run at all.
(This also includes SMTP-AUTH and similar patches)
ブロックすることが目的なので、とりあえず echo 2 > /var/qmail/control/spfbehavior
とする。
コメント