実践Linux
CentOS7        CentOS7 目次へ  TOP(HOME)へ

Mailサーバー(dovecot & postfix)         2016年6月



333.333.333.210(ns1.my-dom.xxx)にはDNSで別名mail.my-dom.xxxが設定されているものとする。
さらに、新しいドメインnew-dom.xxxも追加され、別名mail.new-dom.xxxが設定されているものとする。(こちらを参照)

設定については、外部からの送信要求を想定し、バーチャルメールボックスとSMTP/Submission Over SSL/TLSを使用した設定にする。CentOS5/6.5参照。

SMTP認証(SMTP-AUTH)には、SASLライブラリを用いて実現する。Cyrus-SASLとDovecot SASLというライブラリが主に利用されるが、PostfixとDovecotは親和性が高いので、Dovecot SASLを利用する=Dovecotとアカウントを共用できる。
PostfixがDovecot SASLライブラリに対応しているか確認
# postconf -a  dovecotが表示されればOK


dovecotの設定
/etc/dovecot/dovecot.conf
protocols = pop3
listen = *
   デフォルトの「listen = *, ::」を変更。IPv6の設定をとる。
!include conf.d/*.conf


/etc/dovecot/conf.d/10-ssl.conf
ssl = yes   強制する場合は、ssl = required
ssl_cert = </etc/pki/dovecot/certs/dovecot.crt
ssl_key = </etc/pki/dovecot/private/dovecot.key

/etc/dovecot/conf.d/10-mail.conf
mail_location = maildir:/var/spool/mail/vhosts/%u/Maildir

/etc/dovecot/conf.d/15-lda.conf  (dovecotがエラーメールを送信するとき使用するアドレスの設定)
postmaster_address = postmaster@mail.my-dom.xxx

/etc/dovecot/conf.d/10-auth.conf
disable_plaintext_auth = no   Plaintextでの認証の有効化 10行目
auth_mechanisms = plain login cram-md5
   平文パスワードと暗号化パスワード 100行目
#!include auth-system.conf.ext
   コメントアウト(これは使わない=pam認証を無効にする)
!include auth-passwdfile.conf.ext
   コメントアウトをはずす(こちらを使う)

/etc/dovecot/conf.d/auth-system.conf.ext(これは使わない)
passdb {
driver = pam
}
userdb {
driver = passwd
}


/etc/dovecot/conf.d/auth-passwdfile.conf.ext(こちらを使用)
passdb {
driver = passwd-file
#args = scheme=CRYPT username_format=%u /etc/dovecot/users
  コメントアウト
args = /etc/dovecot/passwd
  追加
}

userdb {
driver = passwd-file
#args = username_format=%u /etc/dovecot/users
  コメントアウト
args = /etc/dovecot/passwd
  追加
}


CRYPTは、/etc/passwd、shadowなど、従来の DES で暗号化されるパスワード形式です。

●Dovecot用証明書の作成
既存の/etc/pki/dovecot/certs/dovecot.pem、/etc/pki/dovecot/private/dovecot.pemを使ってもよいかもしれないが、ここでは作り直す。
# cd /etc/pki/tls/certs
Makefileの編集  有効期限が365日に設定されているので、-days 365を3650(10年)等に変更しておく。3カ所ある。

# make dovecot.crt  名称はなんでもよい
 パスフレーズの入力(2回)。秘密鍵を暗号化するために利用される。
 再度、パスフレーズの入力(3回目)。
 証明書の情報を入力。(適当に入力)
  国名
  都道府県名
  市区名
  組織名
  部署名
  サーバーFQDN名
  監理者のメールアドレス

以上で、サーバーの秘密キー(/etc/pki/tls/certs/dovecot.key)と証明書(/etc/pki/tls/certs/dovecot.crt)が作成される。
これらを/etc/pki/dovecot/certs/、/etc/pki/dovecot/private/に移動しておく。
# mv /etc/pki/tls/certs/dovecot.key /etc/pki/dovecot/private/
# mv /etc/pki/tls/certs/dovecot.crt /etc/pki/dovecot/certs/
秘密鍵からのパスフレーズの削除
# cd /etc/pki/dovecot/private
# mv dovecot.key dovecot.key.org
# openssl rsa -in dovecot.key.org -out dovecot.key
# chmod 700 dovecot.key

●virtualグループとユーザーの作成
# groupadd -g 5000 virtual
# useradd -g 5000 -u 5000 -s /sbin/nologin -d /var/spool/mail/vhosts virtual

●パスワードファイル /etc/dovecot/passwdの作成
ここでは暗号化したパスワードを使う。
まず、パスワードを決めて(tarou@my-dom.xxxとhanako@my-dom.xxxのパスワード)、doveadmコマンドで暗号化。
(# doveadm pw -s 認証スキーム。スキームを省くとCRAM-MD5になる。スキームの種類は、# doveadm pw -l)
# doveadm pw
 {CRAM-MD5}abcdefg・・・・・・・・・・・・・・・・・・・・・   これをコピーして/etc/dovecot/passwdに貼り付ける

/etc/dovecot/passwdの作成 (dovecot.confを-aオプション付きでコピーして作成するとよい。権限、Selinuxを引き継げる。)

tarou@my-dom.xxx:{CRAM-MD5}abcdefg・・・・・・・・・・・・・・・・・・・・:5000:5000::/var/spool/mail/vhosts/tarou@my-dom.xxx/Maildir
hanako@new-dom.xxx:{CRAM-MD5}hijklmn・・・・・・・・・・・・・・・・・・・・:5000:5000::/var/spool/mail/vhosts/hanako@new-dom.xxx/Maildir

(ユーザー名):{CRAM-MD5}abcdefg123456....:(uid):(gid):::::(メールボックスへのパス)
ディレクトリパスはメールディレクトリ名の"Maildir"まで必要です。
これで、tarou@my-dom.xxx等のアカウント名を使って、指定ディレクトリのメールを取りに行けるようになる。

firewalldの設定
ポート995(POPS)を開ける。
trustedゾーンに対しては、必要ない。
externalゾーンの設定
# firewall-cmd --get-services  定義されているサービス一覧
/usr/lib/firewalld/services/pop3s.xmlをみると、これが995ポートであることがわかる。
# firewall-cmd --list-service --zone=external
# firewall-cmd --add-service=pop3s --zone=external
# firewall-cmd --add-service=pop3s --zone=external --permanent

dovecotサービスの起動
# systemctl --type=service list-unit-files  インストールされたサービス一覧
# systemctl --type=service list-units | grep dovecot  実行中のサービスにdovecotがあるか
# systemctl start dovecot
# systemctl enable dovecot


dovecotの設定つづき(PostfixでDovecot SASL認証を利用できるようにする)
/etc/dovecot/conf.d/10-master.conf
service auth {
  # auth_socket_path points to this userdb socket by default. It's typically
  # used by dovecot-lda, doveadm, possibly imap process, etc. Its default
  # permissions make it readable only by root, but you may need to relax these
  # permissions. Users that have access to this socket are able to get a list
  # of all usernames and get results of everyone's userdb lookups.
  unix_listener auth-userdb {
    #mode = 0600
    #user =
    #group =
  }

  # Postfix smtp-auth  以下を編集
  unix_listener /var/spool/postfix/private/auth {
    mode = 0666
    user = postfix
    group = postfix
  }

  # Auth process is run as this user.
  #user = $default_internal_user
}

Dovecotを再起動すると、/var/spool/postfix/private/authが作成される。


Postfixの設定

/etc/postfix/main.cfを編集・追加

myhostname = mail.my-dom.xxx
mydomain = my-dom.xxx
myorigin = $myhostname
inet_interfaces = all  localhostになっていたらallに変更する。
inet_protocols = all  または、ipv4
mydestination = $myhostname, localhost.$mydomain, localhost
mynetworks = 192.168.7.0/24, 127.0.0.0/8
home_mailbox = Maildir/
バーチャルメールボックス形式ではmydestinationには取得したドメイン関係は基本的には指定しない。(virtual_mailbox_domainsに指定。)
「mydestination = $myhostname, localhost」は、エラーメッセージなど内部メールの受け取り用。


############################ Dovecot SASLを利用した認証 ####################################
smtpd_sasl_auth_enable = yes  SASL認証を有効にする
smtpd_sasl_authenticated_header = yes  認証されたユーザー名を表示する(必須ではない)
broken_sasl_auth_clients = yes  OutlookExpress4等のSASL認証「AUTH=PLAIN」でも利用できるようにする
smtpd_sasl_type = dovecot  SASLプラグインタイプ
smtpd_sasl_path = private/auth  認証ソケットファイル(Postfixのキューディレクトリ/var/spool/postfixからの相対パス[/etc/postfix/main.cf queue_directory=/var/spool/postfix]。先のようにdovecot.confを変更してdovecotを再起動するとこのファイルが作成される。このソケットをDovecotとPostfixで共有することで、ユーザアカウントを共用できるようになる。)

############################ TLS暗号化 ####################################
smtpd_use_tls = yes  TLSを使用する
#smtpd_enforce_tls = yes  TLSを使用できないクライアントを拒否する場合。ここではコメントアウト。master.cfのsubmissionの方でTLS強制にし(587使用に対してのみ強制)、ポート25使用に対しては強制しないようにする。
smtpd_tls_loglevel = 1  ログレベルの設定
smtpd_tls_cert_file = /etc/pki/tls/certs/postfix.crt  証明書を指定
smtpd_tls_key_file = /etc/pki/tls/private/postfix.key  秘密鍵を指定
#smtpd_tls_CAfile = /etc/pki/CA/cacert.pem  認証局によるCAファイルの場合
smtpd_tls_session_cache_database = btree:/etc/postfix/smtpd_scache  接続キャッシュファイル
smtpd_tls_session_cache_timeout = 3600s  キャッシュの保存時間

############################ リレー許可 ####################################
smtpd_recipient_restrictions = permit_mynetworks,permit_sasl_authenticated,reject_unauth_destination

smtpd_recipient_restrictions = のデフォルトは、smtpd_recipient_restrictions = permit_mynetworks, reject_unauth_destination
つまり、デフォルトでは$mynetworksにマッチするものしかリレーは許可されていない。
ここに"permit_sasl_authenticated"を追加することによって、SMTP認証を通過したものはリレーが許可されるようになる。


############################ バーチャルメールボックス ####################################
virtual_mailbox_domains = $mydomain, new-dom.xxx  バーチャルメールボックスを利用するドメインを指定
virtual_mailbox_base = /var/spool/mail/vhosts  バーチャルメールボックスの場所を指定 。バーチャルメールボックスはこのフォルダ配下になる。
virtual_mailbox_maps = hash:/etc/postfix/vmailbox  メールアドレスとそれに対する配送先を記したテーブル
virtual_minimum_uid = 5000  virtual_uid_mapsから受け取るuidの最小値
virtual_uid_maps = static:5000  配送エージェントがメールボックスの書き込みに使用するユーザーID
virtual_gid_maps = static:5000  配送エージェントがメールボックスの書き込みに使用するグループID

#virtual_alias_domains =  これは指定しない
virtual_alias_maps = hash:/etc/postfix/virtual  転送リスト

virtual_mailbox_domainsに指定したドメインはmydestinationやvirtual_alias_domainsには指定しないように注意。

SMTP/Submission Over SSL/TLS  ポート587番を使用(ここではポート25も利用できるようにしておいた)
/etc/postfix/master.cf   16行〜
smtp inet n - n - - smtpd  ←ポート25用
#smtp inet n - n - 1 postscreen
#smtpd pass - - n - - smtpd
#dnsblog unix - - n - 0 dnsblog
#tlsproxy unix - - n - 0 tlsproxy
submission inet n - n - - smtpd  ←ポート587用
  # -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt  TLSを強制使用する
  -o smtpd_sasl_auth_enable=yes  SASL認証を有効にする
  # -o smtpd_reject_unlisted_recipient=no
  # -o smtpd_client_restrictions=$mua_client_restrictions
  # -o smtpd_helo_restrictions=$mua_helo_restrictions
  # -o smtpd_sender_restrictions=$mua_sender_restrictions
  -o smtpd_recipient_restrictions=permit_sasl_authenticated,reject  SASL認証できないクライアントは拒否
  # -o milter_macro_daemon_name=ORIGINATING

?o に後ろは、Submission ポートでメールを受け付けたときに Postfix に渡すパラメーターになる。

●postfix用の自己署名証明書の作成
# cd /etc/pki/tls/certs
# make postfix.crt
 パスフレーズの入力(2回)。秘密鍵を暗号化するために利用される。
 再度、パスフレーズの入力(3回目)。
 証明書の情報を入力。(適当に入力)
  国名
  都道府県名
  市区名
  組織名
  部署名
  サーバーFQDN名
  監理者のメールアドレス
以上で、サーバーの秘密キー(/etc/pki/tls/certs/postfix.key)と証明書(/etc/pki/tls/certs/postfix.crt)が作成される。
秘密キーは/etc/pki/tls/private/に移動しておく。
# mv /etc/pki/tls/certs/postfix.key /etc/pki/tls/private/
秘密鍵からのパスフレーズの削除
# cd /etc/pki/tls/private
# mv postfix.key postfix.key.org
# openssl rsa -in postfix.key.org -out postfix.key
# chmod 700 postfix.key

●/etc/postfix/vmailboxを作成(同じディレクトリ内のファイルを-aオプション付きでコピーして作成するとよい。権限、Selinuxを引き継ぐ。)
受信するメールアドレスとそれに対する配送先ディレクトリを記述。配送先の指定が / で終わっているとMaildir形式となる。
tarou@my-dom.xxx    tarou@my-dom.xxx/Maildir/
hanako@new-dom.xxx    hanako@new-dom.xxx/Maildir/

vmailboxファイルをデータベース化
# postmap /etc/postfix/vmailbox

●/etc/postfix/virtualを編集(最後に追加)
エイリアスの設定 受信するメールアドレスとその転送先。

postmaster@my-dom.xxx    postmaster  (これはさらに/etc/aliasesによって、root→tarou@my-dom.xxxと転送されるようにする。)
postmaster@new-dom.xxx    hanako@new-dom.xxx
tarou@mail.my-dom.xxx    tarou@my-dom.xxx
hanako@mail.new-dom.xxx    hanako@new-dom.xxx
foo@my-dom.xxx    ***@*****.ne.jp
   fooは仮想でかまわない

データベース化
# postmap /etc/postfix/virtual

●/etc/aliasesを編集(最後に追加)
root    tarou@my-dom.xxx

データベース化
# postalias /etc/aliases

firewalldの設定
ポート25(TCP/INPUT,OUTPUT)と同時に、ポート587(TCP/INPUT)を開ける。
trustedゾーンに対しては、必要ない。
externalゾーンの設定
# firewall-cmd --get-services  定義されているサービス一覧
/usr/lib/firewalld/services/smtp.xmlをみると、これが25ポートであることがわかる。
これをコピーして、/etc/firewalld/services/に貼り付け編集する。
<port protocol="tcp" port="25"/>の下に、
<port protocol="tcp" port="587"/>を追加。
# firewall-cmd --list-service --zone=external
# firewall-cmd --add-service=smtp --zone=external
# firewall-cmd --add-service=smtp --zone=external --permanent
# firewall-cmd --reload   firewalldのリロード

postfixサービスの起動
# systemctl --type=service list-unit-files  インストールされたサービス一覧
# systemctl --type=service list-units | grep postfix  実行中のサービスにpostfixがあるか
# systemctl start postfix
# systemctl enable postfix


●クライアント(アカウント設定)
以上の設定で、25ポートは内部=mynetworksからのものは認証、TLSなしでも送信を受け付けるが、外部からのものはプロバイダが25ブロックしている場合がほとんどなのでアクセスに失敗する。アクセスできたとしても、送信には認証が必要となる(前のmain.cfの「リレーの許可」の項参照。TLSは必ずしも必要としない)。
587ポートは、認証とTLS両方が強制されるが、こちらは内部、外部からの送信に使える。
ここでは暗号化パスワードを使ったが、クライアントが暗号化パスワードに対応していない場合でも、dovecot.confの「mechanisms = 」に「plain login」を加えておけば問題なく使えるようだ。
Thunderbird
受信(サーバー設定)
 ユーザー名 tarou@my-dom.xxx
 ポート番号を995番にする。
 セキュリティ設定では、「SSL/TLS」、「暗号化されたパスワード認証」を選択。
 「ダウンロード後もサーバーにメッセージを残す」のチェックをはずす。(適宜)
送信(送信サーバー)
 外部からの送信接続では、POPと同じアカウントとパスワードを使うことになる。ポート=587、セキュリティ=「STARTTLS」、「暗号化されたパスワード認証」、ユーザー名=tarou@my-dom.xxx。
 内部からの送信には、25ポートを使用し、接続の保護は「なし」、認証は「認証なし」で使うとよい。

Outlook
暗号化パスワードには対応していないがdovecot.confの「mechanisms = 」に「plain login」が加えてあれば使えるようだ。
名前 hanako@new-dom.xxx
電子メールアドレス hanako@new-dom.xxx
受信メールサーバー mail.new-dom.xxx
送信メールサーバー mail.new-dom.xxx
アカウント名 hanako@new-dom.xxx
パスワード  ************
詳細設定/送信サーバー
 認証が必要をチェック
 次のアカウントとパスワードでログオンする
  アカウント名 hanako@new-dom.xxx
  パスワードは、同じ。
詳細設定/詳細設定
 受信サーバー ポート=995 SSLが必要をチェック
 送信サーバー
 【外部から接続する場合】 ポート=587 暗号化接続の種類=TLS(古いOutlookではSSLしかないが、それでもかまわないようだ。)
 【内部から接続する場合】  ポート=25 暗号化接続の種類=なし



TOP(HOME)へ

目 次

特別企画
Raspberry Piで遊ぶ

HOME(全体のシステム構成&目次)

CentOS7
CentOS7のインストール〜ネットワークの設定ほか
CentOS7の新機能(systemdとfirewalld)
ダイレクトルールを使ったfirewallの強化
DNS(BIND)サーバー
Webサーバー
  Webでファイルの受け渡し
  アクセス解析ツールAwstats
  Wordpressでブログ構築
FTPサーバー
FTPS(FTP over SSL/TLS)
Mail(Dovecot&Postfix)サーバー
Sambaサーバー
MariaDB(MySQL)サーバー
DHCPサーバー
SSHサーバー
VNCサーバー
ドメインの追加

CentOS5〜6
ネットワーク&ファイアウォール(iptables)
DNS(BIND)サーバー
DHCPサーバー
メールサーバー(基本)
メールサーバー/実際の運用
Webサーバー
  WebDAVによるファイル共有
  Webでファイルのやり取り
  アクセス解析ツールawstats
  namazuで全文検索
  WordPressブログサイト構築
  EC-CUBEショッピングサイト構築
FTPサーバー
ファイルサーバー・Samba
データベースpostgreSQL
  ExcelからpostgreSQLを操作
データベースMySQL
SSHサーバー
VNC
SSL/TLSを利用した暗号化通信
openVPN
ストリーミングサーバー
    C++ RTMP Server
    Helix server Basic
ドメインの追加
Xen・仮想化
特定ディレクトリに容量制限

SELinux
SELinux基本設定
新しいタイプとポリシー・モジュールを作成してみる
マクロを利用したteファイルの記述
新しいドメインを導入してみる

coLinux
Fedora11で試す

Cプログラミング目次
X11プログラム
サイエンス・プログラム

計測・プログラム
秋月電子のデーターロガーpico ADC-16
「今すぐ使えるパソコン計測USBマイコン基板」に付属のTRZ1102
センサーの使用例

Glade2/GTK+を使ってみる
テキスト・ビューで簡易エディター
ドローイングエリアで自動描画
放物線運動(pango、cairoも試してみる)
これらを、GTK+のみで書き出す

フォントについて
ネットワーク・プログラミング
postgreSQL接続
CGI
ファイル操作

●その他
印刷機関連開発 刷版絵柄面積率測定
数独をExcelで解く