メールサーバ Postfix & Dovecot をソースコードからインストール

動作確認済みシステム Debian 12

IMAPサーバのdovecot、SMTPサーバのpostfix、SASL認証のsasl2-binをインストールします。

Postfix用のユーザーとグループを追加します。

useradd -d /dev/null -s /bin/false postfix
groupadd postdrop

必要なパッケージをインストールします。

apt install build-essential m4 libdb-dev libsasl2-dev libnsl-dev libicu-dev libpcre2-dev

Cyrus SASLのソースコードをダウンロードし、展開します。

cd /usr/local/src/
wget https://github.com/cyrusimap/cyrus-sasl/releases/download/cyrus-sasl-2.1.28/cyrus-sasl-2.1.28.tar.gz
tar zxvf cyrus-sasl-2.1.28.tar.gz

インストールします。

cd cyrus-sasl-2.1.28
./configure --sysconfdir=/usr/local/etc/sasl --with-openssl=/usr/local/ssl --enable-login=yes
make
make install

インストールされた共有ライブラリの読み込みのため、ldconfigを実行します。

ldconfig

Postfixのソースコードをダウンロードし、展開します。

cd /usr/local/src/
wget https://mirror.reverse.net/pub/postfix-release/official/postfix-3.9.1.tar.gz
tar zxvf postfix-3.9.1.tar.gz
cd postfix-3.9.1

インストールします。

make tidy
make makefiles CCARGS="-DDEF_COMMAND_DIR=\\"/usr/local/sbin\\" -DDEF_CONFIG_DIR=\\"/usr/local/etc/postfix\\" -DDEF_DAEMON_DIR=\\"/usr/local/libexec/postfix\\" -DDEF_DATA_DIR=\\"/usr/local/var/lib/postfix\\" -DDEF_MAILQ_PATH=\\"/usr/local/bin/mailq\\" -DDEF_NEWALIAS_PATH=\\"/usr/local/bin/newaliases\\" -DDEF_SENDMAIL_PATH=\\"/usr/local/sbin/sendmail\\" -DUSE_SASL_AUTH -DUSE_CYRUS_SASL -DUSE_TLS -I/usr/local/include -I/usr/local/include/openssl -I/usr/local/include/sasl -DHAS_PCRE=2 pcre2-config --cflags" AUXLIBS="-L/usr/local/lib -lsasl2 -L/usr/local/lib64 -lssl -lcrypto" AUXLIBS_PCRE="pcre2-config --libs8"
make
make install

全て何も入力せずEnterキーで進めます。

Please specify the prefix for installed file names. Specify this ONLY
if you are building ready-to-install packages for distribution to OTHER
machines. See PACKAGE_README for instructions.
install_root: [/]
Please specify a directory for scratch files while installing Postfix. You
must have write permission in this directory.
tempdir: [/usr/local/src/postfix-3.9.1]
Please specify the final destination directory for installed Postfix
configuration files.
config_directory: [/usr/local/etc/postfix]
Please specify the final destination directory for installed Postfix
administrative commands. This directory should be in the command search
path of administrative users.
command_directory: [/usr/local/sbin]
Please specify the final destination directory for installed Postfix
daemon programs. This directory should not be in the command search path
of any users.
daemon_directory: [/usr/local/libexec/postfix]
Please specify the final destination directory for Postfix-writable
data files such as caches or random numbers. This directory should not
be shared with non-Postfix software.
data_directory: [/usr/local/var/lib/postfix]
Please specify the final destination directory for the Postfix HTML
files. Specify "no" if you do not want to install these files.
html_directory: [no]
Please specify the owner of the Postfix queue. Specify an account with
numerical user ID and group ID values that are not used by any other
accounts on the system.
mail_owner: [postfix]
Please specify the final destination pathname for the installed Postfix
mailq command. This is the Sendmail-compatible mail queue listing command.
mailq_path: [/usr/local/bin/mailq]
Please specify the final destination directory for the Postfix on-line
manual pages. You can no longer specify "no" here.
manpage_directory: [/usr/local/man]
Please specify the final destination pathname for the installed Postfix
newaliases command. This is the Sendmail-compatible command to build
alias databases for the Postfix local delivery agent.
newaliases_path: [/usr/local/bin/newaliases]
Please specify the final destination directory for Postfix queues.
queue_directory: [/var/spool/postfix]
Please specify the final destination directory for the Postfix README
files. Specify "no" if you do not want to install these files.
readme_directory: [no]
Please specify the final destination pathname for the installed Postfix
sendmail command. This is the Sendmail-compatible mail posting interface.
sendmail_path: [/usr/local/sbin/sendmail]
Please specify the group for mail submission and for queue management
commands. Specify a group name with a numerical group ID that is
not shared with other accounts, not even with the Postfix mail_owner
account. You can no longer specify "no" here.
setgid_group: [postdrop]
Please specify the final destination directory for Postfix shared-library
files.
shlib_directory: [no]
Please specify the final destination directory for non-executable files
that are shared among multiple Postfix instances, such as postfix-files,
dynamicmaps.cf, as well as the multi-instance template files main.cf.proto
and master.cf.proto.
meta_directory: [/usr/local/etc/postfix]

設定ファイルを編集します。

vi /usr/local/etc/postfix/main.cf
mail_owner = postfix

# ホスト名指定
myhostname = mail.example.com

# ドメイン名指定
mydomain = digitalmania.info

myorigin = $mydomain

inet_interfaces = all

mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain

local_recipient_maps = unix:passwd.byname $alias_maps

alias_maps = hash:/etc/aliases

alias_database = hash:/etc/aliases

home_mailbox = Maildir/

# Telnet等でアクセスした際にpostfixのバージョン情報が表示されるのはセキュリティ上好ましくないため
smtpd_banner = $myhostname ESMTP unknown

sendmail_path = /usr/local/sbin/postfix

newaliases_path = /usr/local/bin/newaliases

mailq_path = /usr/local/bin/mailq

setgid_group = postdrop

html_directory = no

manpage_directory = /usr/local/man

sample_directory = /usr/local/etc/postfix

readme_directory = no

# IPv6もlistenする場合はallに変更
inet_protocols = ipv4

# SMTP-Auth用の設定
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
smtpd_sasl_authenticated_header = yes
smtpd_sasl_security_options = noanonymous
smtpd_sasl_local_domain = $myhostname
smtpd_recipient_restrictions =
permit_mynetworks
permit_sasl_authenticated
reject_unauth_destination

# 送受信メールのサイズ制限。例は10MB。
message_size_limit = 10485760

master.cfでSubmissionポートの設定を行います。

vi /usr/local/etc/postfix/master.cf
submission inet n       -       y       -       -       smtpd
-o syslog_name=postfix/submission
-o smtpd_sasl_auth_enable=yes
-o smtpd_recipient_restrictions=permit_sasl_authenticated,reject

SMTH-Authの設定を行います。

vi /usr/local/lib/sasl2/smtpd.conf
pwcheck_method: saslauthd
mech_list: PLAIN LOGIN

Dovecotをインストールする前に、DovenullユーザとDovecotユーザを作成しておきます。

useradd -c 'Dovecot mail server' -d /dev/null -s /sbin/nologin dovecot
useradd -c 'Dovecot login user' -d /dev/null -s /sbin/nologin dovenull

Dovecotのソースコードをダウンロードし、展開します。

cd /usr/local/src/
wget https://dovecot.org/releases/2.3/dovecot-2.3.21.1.tar.gz
tar zxvf dovecot-2.3.21.1.tar.gz
cd dovecot-2.3.21.1

インストールします。

./configure --sysconfdir=/usr/local/etc --with-pam --with-ssl=openssl --with-ssldir=/usr/local/ssl --with-systemdsystemunitdir=auto
make
make install

設定ファイルをコピーします。

cp -r /usr/local/share/doc/dovecot/example-config/* /usr/local/etc/dovecot

dovecotの設定を行います。

dovecot.confを編集します。

vi /usr/local/etc/dovecot/dovecot.conf

プロトコルを指定し、listenの行をコメント解除します。

protocols = imap

listen = *, ::

10-mail.confを編集します。

vi /usr/local/etc/dovecot/conf.d/10-mail.conf

メールボックスの形式と場所を指定します。

mail_location = maildir:~/Maildir

10-auth.confを編集します。

vi /usr/local/etc/dovecot/conf.d/10-auth.conf

プレーンテキスト認証を許可し、loginでの認証を許可します。
また、ユーザ名からドメイン部分を削除して認証できるようにします。

disable_plaintext_auth = no

auth_username_format = %n

auth_mechanisms = plain login

10-master.confを編集します。

vi /usr/local/etc/dovecot/conf.d/10-master.conf

IMAPを許可し、SMTP認証ができるようにします。

service imap-login {
inet_listener imap {
port = 143
}
}

service auth {
unix_listener /var/spool/postfix/private/auth {
mode = 0666
user = postfix
group = postfix
}
}

10-ssl.confを編集します。

vi /usr/local/etc/dovecot/conf.d/10-ssl.conf
ssl = no

#ssl_cert = </etc/ssl/certs/dovecot.pem
#ssl_key = </etc/ssl/private/dovecot.pem

15-mailboxes.confを編集します。

vi /usr/local/etc/dovecot/conf.d/15-mailboxes.conf

Draftsフォルダ、Junkフォルダ、Trashフォルダ、Sentフォルダを自動的に作成・購読させるようにします。

namespace inbox {
# These mailboxes are widely used and could perhaps be created automatically:
mailbox Drafts {
special_use = \Drafts
auto = subscribe
}
mailbox Junk {
special_use = \Junk
auto = subscribe
}
mailbox Trash {
special_use = \Trash
auto = subscribe
}
mailbox Sent {
special_use = \Sent
auto = subscribe
}
# mailbox "Sent Messages" {
# special_use = \Sent
# }
}

ユーザー作成時に一緒に作成される必要なフォルダを/etc/skel/以下に作成します。

mkdir /etc/skel/Maildir
mkdir /etc/skel/Maildir/cur
mkdir /etc/skel/Maildir/new
mkdir /etc/skel/Maildir/tmp
chmod 700 -R /etc/skel/Maildir

既存ユーザーのホームディレクトリにも、Maildirディレクトリを作成します。

cd /home/hogehoge/
mkdir Maildir
mkdir Maildir/cur
mkdir Maildir/new
mkdir Maildir/tmp
chmod 700 -R Maildir
chown hogehoge. -R Maildir

エイリアス定義ファイル/etc/aliasesファイルを作成します。

vi /etc/aliases
postmaster:    root
root: administrator

postmaster宛はrootが受け取るべきこと、root宛はadministratorが受け取るべきことが記述されています。

/etc/aliases.dbを作成するために、newaliasesコマンドを実行します。

newaliases

saslauthdサービスを作成します。

vi /etc/default/saslauthd
# Begin /etc/default/saslauthd

# Which authentication mechanisms should saslauthd use? (default: shadow)
#
# Available options in this package:
# getpwent -- use the getpwent() library function
# kerberos5 -- use Kerberos 5
# pam -- use PAM
# rimap -- use a remote IMAP server
# shadow -- use the local shadow password file
# sasldb -- use the local sasldb database file
# ldap -- use LDAP (configuration is in /etc/saslauthd.conf)
#
# Only one option may be used at a time. See the saslauthd man page
# for more information.
#
# Example: MECHANISMS="shadow"
MECHANISMS="pam"

# Additional options for this mechanism. (default: none)
# See the saslauthd man page for information about mech-specific options.
# Note: Specify "-O options" in the following variable or saslauthd will fail.
MECH_OPTIONS=""

# How many saslauthd processes should we run? (default: 5)
# A value of 0 will fork a new process for each connection.
THREADS=5

# Other options (default: -c -m /run/saslauthd)
# Note: You MUST specify the -m option or saslauthd won't run!
#
# See the saslauthd man page and the output of 'saslauthd -h' for general
# information about these options.
SASLAUTHD_OPTS="-c -m /run/saslauthd"

# End /etc/default/saslauthd
vi /etc/systemd/system/saslauthd.service
[Unit]
Description=Cyrus SASL authentication daemon

[Service] Type=forking
EnvironmentFile=/etc/default/saslauthd
ExecStart=/usr/local/sbin/saslauthd -a $MECHANISMS -n $THREADS $MECH_OPTIONS $SASLAUTHD_OPTS
PIDFile=/run/saslauthd/saslauthd.pid

[Install] WantedBy=multi-user.target

Postfixサービスを作成します。

vi /etc/systemd/system/postfix.service
[Unit]
Description=Postfix Mail Transport Agent
After=network.target
Conflicts=sendmail.service exim.service

[Service] Type=forking
PIDFile=/var/spool/postfix/pid/master.pid
ExecStart=/usr/local/sbin/postfix start
ExecStop=/usr/local/sbin/postfix stop
ExecReload=/usr/local/sbin/postfix reload
Restart=always

[Install] WantedBy=multi-user.target

Dovecotサービスは別途作成する必要はありませんが、編集する必要はあります。

vi /lib/systemd/system/dovecot.service
[Service]
ProtectSystem=false

systemdサービスを再読み込みします。

systemctl daemon-reload

各種サービスを自動起動設定、起動します。

systemctl enable saslauthd.service
systemctl start saslauthd.service
systemctl enable postfix.service
systemctl start postfix.service
systemctl enable dovecot.service
systemctl start dovecot.service

ファイアウォールの設定を行い、必要なポートを許可するようにします。

ufw allow 'IMAP'
ufw allow 'SMTP'
ufw reload

メーラーで送受信ができていることが確認できればOKです。