旧サーバ、Ubuntu Server 14.04上に構築しているメールサーバから、Ubuntu18.04上で新たにメールサーバを構築し、可能な限りアカウント情報やメールデータを移行します。
今回はUbuntu Server 18.04にPostfixとDovecotをインストール、セットアップしていきます。
ゴール
- Ubuntu Server 18.04 LTS
- メール転送サーバ(MTA)にPostfix
- メール配送サーバ(MDA)にDovecot
- メール送信の認証にはSMTP-AUTH
- SSL/TLSを使用
- 仮想ユーザーアカウントを使用(ユーザー名は、
someuser@example.com
の形式) - メールボックスはMaildir形式を採用する
なお、既存の移行元の環境は、上記条件に準じているのですが、唯一アカウント設定のみローカルユーザアカウントで運用しています。
そんなわけで、メールサーバを構築後、元のMairdirをそのまま、新しい仮想ユーザーアカウント(ユーザ名は同じにしていますが・・)のMaildirにそのままぶち込む形にする予定です。
仮想メールボックス用ユーザ作成
仮想メールボックス専用のユーザを作成します。この場合、uid
は20000としていますが、ネット上の情報では5000とか色々あるので、OS上で予約されていない uid
であれば問題ないでしょう。
またここでは、uid名、gid名共に vmail
とします。次のコマンドで、仮想メールボックス用ユーザを作成します。
$ sudo adduser --uid 20000 --disabled-password --disabled-login vmail
Postfixのインストールと設定
Postfix
を、パッケージからインストールします。
$ sudo apt install postfix sasl2-bin
途中、設定のダイアログ、General type of mail configuration: が開きますが、ここは No configuration を選択します。
/etc/postfix/main.cf の設定
設定の雛形をコピーし、編集します。
$ sudo cp /etc/postfix/main.cf.proto /etc/postfix/main.cf
$ sudo vi /etc/postfix/main.cf
設定項目は以下のようにします。
compatibility_level = 2
command_directory = /usr/sbin
daemon_directory = /usr/lib/postfix/sbin
data_directory = /var/lib/postfix
mail_owner = postfix
# メールサーバのホスト名を指定
myhostname = mail.example.com
# $hostnameからホスト名を引いた部分
mydomain = example.com
myorigin = $mydomain
inet_interfaces = all
# 最終配送先
local_transport = dovecot
# ローカルの受信者のマッピングファイル→ /etc/postfix/virtual_mailbox
local_recipient_maps = $virtual_mailbox_maps
unknown_local_recipient_reject_code = 550
mynetworks = 127.0.0.0/8
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
# メールボックスのディレクトリ名
home_mailbox = Maildir/
# バナーでPostfixが出力されないように抑制
smtpd_banner = $myhostname ESMTP
debugger_command =
PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin
ddd $daemon_directory/$process_name $process_id & sleep 5
sendmail_path = /usr/sbin/postfix
newaliases_path = /usr/bin/newaliases
mailq_path = /usr/bin/mailq
setgid_group = postdrop
inet_protocols = ipv4
# メッセージの最大サイズ(10M)
message_size_limit = 10485760
# メールボックスの最大サイズ(10G)
mailbox_size_limit = 10737418240
# SMTP-AUTH
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
smtpd_sasl_local_domain = $myhostname
# smtpクライアントの制限設定
smtpd_client_restrictions =
permit_mynetworks,
check_client_access hash:/etc/postfix/access,
reject_unknown_client,
permit
# smtpdの送信リレーの制限
smtpd_relay_restrictions =
permit_mynetworks,
permit_sasl_authenticated,
permit_auth_destination,
reject
# virtual user
virtual_mailbox_domains = example.com
virtual_mailbox_base = /home/vmail
virtual_mailbox_maps = hash:/etc/postfix/virtual_mailbox
virtual_uid_maps = static:20000 # 作成したuidに合わせる
virtual_gid_maps = static:20000 # 作成したgidに合わせる
virtual_alias_maps = hash:/etc/postfix/virtual
virtual_transport = dovecot
dovecot_destination_recipient_limit = 1
# SSL/TLS
smtpd_use_tls = yes
smtp_tls_mandatory_protocols = !SSLv2, !SSLv3
smtpd_tls_mandatory_protocols = !SSLv2, !SSLv3
smtpd_tls_cert_file = /etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file = /etc/ssl/private/ssl-cert-snakeoil.key
smtpd_tls_session_cache_database = btree:/var/lib/postfix/smtpd_scache
なお、ここではSSLの証明証やキーについては、インストール時にデフォルトで入っているものを使用しています。実運用では、個人的なメールサーバであれば問題ないと思いますが、利用する範囲によっては、自己認証局発行の証明書や、Let's Encrypt、もしくは有料認証局の証明書等を発行してもらうなどするとよいでしょう。
/etc/postfix/master.cfの設定
# submissionとsmtpsについて、一部コメントアウトする。
submission inet n - y - - smtpd
-o syslog_name=postfix/submission
# -o smtpd_tls_security_level=encrypt
-o smtpd_sasl_auth_enable=yes
-o smtpd_tls_auth_only=yes
#
smtps inet n - y - - smtpd
-o syslog_name=postfix/smtps
-o smtpd_tls_wrappermode=yes
Dovecot LDAに関しての設定は追加します。
# Dovecot lda
dovecot unix - n n - - pipe
flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/dovecot-lda -f ${sender} -a ${recipient} -d ${user}@${nexthop}
Dovecotのインストールと設定
パッケージからインストール。
$ sudo apt install dovecot-core dovecot-pop3d dovecot-imapd
sieve関連をインストール
$ sudo apt-get install dovecot-sieve dovecot-managesieved
/etc/dovecot/dovecot.conf
Dovecotの基本設定
!include_try /usr/share/dovecot/protocols.d/*.protocol
listen = *, ::
dict {
}
!include conf.d/*.conf
!include_try local.conf
/etc/dovecot/conf.d/10-auth.conf
認証関連の設定。auth_mechanisms
にcram-md5、plain、loginを使用。
disable_plaintext_auth = no
auth_mechanisms = cram-md5 plain login
!include auth-passwdfile.conf.ext
!include auth-static.conf.ext
/etc/dovecot/conf.d/10-mail.conf
mail_location
を以下のように設定します。%d
はメールアドレスの@から右側、%n
は左側を指します。
mail_location = maildir:/home/vmail/%d/%n/Maildir
namespace inbox {
inbox = yes
}
mail_privileged_group = mail
protocol !indexer-worker {
}
/etc/dovecot/conf.d/10-master.conf
IMAPやPOP、SMTPサービスに関する設定。
service imap-login {
inet_listener imap {
#port = 143
}
inet_listener imaps {
#port = 993
#ssl = yes
}
}
service pop3-login {
inet_listener pop3 {
#port = 110
}
inet_listener pop3s {
#port = 995
#ssl = yes
}
}
service lmtp {
unix_listener lmtp {
}
}
service imap {
}
service pop3 {
}
service auth {
unix_listener auth-userdb {
}
# Postfix smtp-auth
unix_listener /var/spool/postfix/private/auth {
mode = 0666
user = postfix
group = postfix
}
}
service auth-worker {
}
service dict {
unix_listener dict {
}
}
/etc/dovecot/conf.d/10-ssl.conf
SSLに関する設定。
ssl = yes
ssl_cert = </etc/ssl/certs/ssl-cert-snakeoil.pem
ssl_key = </etc/ssl/private/ssl-cert-snakeoil.key
ssl_client_ca_dir = /etc/ssl/certs
/etc/dovecot/conf.d/auth-passwdfile.conf.ext
パスワードDBに関する設定。ドライバに passwd-file
、ドライバの引数に、デフォルトのパスワードメカニズム、ユーザ名のフォーマット、パスワードファイル名となっています。
passdb {
driver = passwd-file
args = scheme=CRAM-MD5 username_format=%u /etc/dovecot/users
}
/etc/dovecot/conf.d/auth-static.conf.ext
ユーザーDBに関する設定。ドライバは static
を使用。すべてのユーザに単一の uid
と gid
を使用。ホームディレクトリに、/home/vmail/example.com/someuser
を割り当てる設定。
userdb {
driver = static
args = uid=vmail gid=vmail home=/home/vmail/%d/%n
}
/etc/dovecot/conf.d/15-lda.conf
ローカル配送にLDAを使用するので、関連の設定をしています。log_path
、info_log_path
に値が設定されていない場合は、syslog
等にログを残します。
postmaster_address = kanri@example.com
hostname = mail.example.com
lda_mailbox_autocreate = yes
lda_mailbox_autosubscribe = yes
protocol lda {
# Space separated list of plugins to load (default is global mail_plugins).
mail_plugins = $mail_plugins sieve
# log path
log_path =
info_log_path =
}
/etc/dovecot/conf.d/90-sieve.conf
sieveの設定です。/home/vmail/%d/%n/sieve
には、ユーザが作成したsieveスクリプトが保存されています。そのsieveスクリプトへのシンボリックリンクが /home/vmail/%d/%n/.dovecot.sieve
に張られます。
plugin {
sieve = file:/home/vmail/%d/%n/sieve;active=/home/vmail/%d/%n/.dovecot.sieve
sieve_default = /var/lib/dovecot/sieve/default.sieve
sieve_global = /var/lib/dovecot/sieve/global/
}
/etc/dovecot/conf.d/20-managesieve.conf
managesieveの設定です。4190番のポートを使用します。
service managesieve-login {
inet_listener sieve {
port = 4190
}
service_count = 0
}
service managesieve {
}
protocol sieve {
}
仮想ユーザーアカウント
手順としては、
/etc/postfix/virtual_mailbox
で、仮想ユーザーアカウントと、仮想メールボックスの紐づけをし、/etc/postfix/virtual
を作成し、必要に応じてメールアドレスの別名(エイリアス)を登録します。/etc/dovecot/users
に、仮想ユーザーアカウントと、パスワードを登録します。
/etc/postfix/virtual_mailbox
virtual_mailbox
ファイルを作成し、仮想ユーザと、その仮想メールボックスを記載します。
$ sudo vi /etc/postfix/virtual_mailbox
# virtual user virtual mailbox
someuser@example.com example.com/someuser/Maildir/
hoge.huga@example.com example.com/hoge.huga/Maildir/
: :
編集が終わり保存したら、データベースを更新します。
$ sudo postmap /etc/postfix/virtual_mailbox
/etc/postfix/virtual
virtual
にはメールアドレスの別名を登録します。別名を登録しない場合でも空のファイルを作成しておきます。
$ sudo vi /etc/postfix/virtual
# 別名 実在のメールアドレス
root@example.com someuser@example.com
webmaster@example.com someuser@example.com
: :
保存したら(仮に空のファイルでも)、データベースを更新します。
$ sudo postmap /etc/postfix/virtual
/etc/dovecot/users
まず最初に、ユーザーのパスワードを作成します。doveadm pw
を実行すると、パスワードの入力を促されるので入力すると、CRAM-MD5形式で暗号化されたパスワードが出力されます。
$ doveadm pw↲
Enter new password:<パスワード入力>
Retype new password:<パスワード確認入力>
{CRAM-MD5}21915ade7230bd417e85e20e2b5f4ee6bff8c521e518a90add85339c38f414cc ← この部分をコピー
users
ファイルを作成し、仮想ユーザとそのパスワードを記載します。
$ sudo vi /etc/dovecot/users
# user:password
someuser@example.com:{CRAM-MD5}21915ade7230bd417e85e20e2b5f4ee6bff8c521e518a90add85339c38f414cc
アクセス許可リスト
postfixの /etc/postfix/main.cf
に、smtpd_client_restrictions
という項目があります。次のような内容です。
smtpd_client_restrictions =
permit_mynetworks,
check_client_access hash:/etc/postfix/access,
reject_unknown_client,
permit
これは、Postfixが、クライアントからの接続要求を受けた時に、どのように接続を許可するのかについて記載されています。
その意味は:
- permit_mynetworks
$mynetworks
からの接続要求は許可 - check_client_access hash:/etc/postfix/access
/etc/postfix/access
にリストされたアクセス許可リストに記載のあるものに関しては、その記載に従って処理します。 - reject_unknown_client
逆引きで解決できないホストからの接続要求を拒否します。 - permit
以上の制限フィルタによってフィルタされなかった場合は、接続要求を許可。
となり、この順番でフィルタが処理されます。
この中の reject_unknown_client
は、DNSで逆引きできない送信元の接続を拒否する設定です。
これは、本来スパム対策なのにもかかわらず、結構たくさんの非スパムな送信元も頻繁にこのフィルタによって拒否されてしまう事を意味します(過去の投稿: cannot find your hostname,)。
そこで、/etc/postfix/access
に smtpd_client_restrictions
で弾かれる、本来スパムではないホスト等に対して許可(あるいは拒否)を与える場合に使用します。
ファイルの書式は:
# [メールアドレス・ホスト名・IPアドレス] [アクション]
# メールアドレスにマッチ
user@domain OK
# ドメイン名にマッチ
domain.tld OK
# サブドメイン・ドメイン名にマッチ
.domain.tld OK
# IPアドレスにマッチ
www.xxx.yyy.zzz OK
www.xxx.yyy OK
アクションには、OK
の他に、REJECT
、DISCARD
があります。
REJECT
は、送信元にエラーメッセージを返しますが、
DISCARD
は、何も返さずにメールを破棄します。
なお、編集後は、
$ sudo postmap /etc/postfix/access
することを忘れないでください。
このようなことから、このオプションを設定するときは、時々ログをチェックすることをおすすめします。もし、必要な送信元でこのチェックが元で拒否された場合、先の /etc/postfix/access
を編集して、OK
で許可します。
また、check_client_access..
と、reject_unknown_client
の順番を逆にすると、check_client_access
でチェックする前に拒否されるので気をつけて下さい。
サービスの再起動
sudo systemctl restart postfix dovecot
で、サービスを再起動します。
ファイアウォールでポートを開放する
次のようにして、ポートを開放してください。
$ sudo ufw allow smtp
$ sudo ufw allow smtps
$ sudo ufw allow imaps
この時、smtp(25/tcp)
を開き忘れると、メール送信できるのに一切受信できないという不可解な事象に悩まされるので気をつけて下さい(私は小一時間悩みました。灯台もと暗しです)。
0件のコメント