Linux

CentOS7でPostfix+dovecotをAD連携して構築(LDAP認証)

Linux

テスト環境でメール送受信が必要になったため、メールサーバをpostfix+dovecotでAD連携するように構築しました。

ユーザーをADを参照して処理するのですが、古いCentOS5 or 6の情報が多くてCentOS7の環境を構築するのにかなりハマってしまったのでCentOS7+AD2016での手順を整理しましたので掲載します。

構成としては1台のCentOS7の上でメール送信と受信を行う構成としています。また、メールアドレスはActiveDirecotryのユーザに設定されているmailの属性をLDAP参照するようにします。

今回の設定内容

  • CentOS7でメールサーバ(postfix+dovecot)を構築して、メール送受信ができることを確認する。
  • 指定したドメインのメール(@syachiku.com)が受信できる。他のメールサーバへは転送はしない。
  • PostfixへAD連携の設定を行い、ADユーザのメール属性に設定されているメールアドレスを参照してメール配送をする。
  • DovecotにAD連携の設定を行い、ADユーザ認証が成功したユーザのメール受信を行えるようにする。
  • LDAP認証を行うためCentOS7のメールサーバはドメイン参加は不要(NTLM認証するときはドメイン参加必要なのですが)
  • メール送信時の認証は行わない、SSLも利用しない。通常のポート25を利用する。

環境

  • メールサーバ(192.168.10.23)
    • CentOS Linux release 7.5.1804 (Core)
    • postfix-2.10.1-6.el7.x86_64
    • dovecot-2.2.36-3.el7_7.1.x86_64
    • 受信するメールドメイン:syachiku.com (例:xxxxx@syachiku.com)
  • ドメインコントローラ(192.168.10.21)
    • Window Server 2016
    • Domain名:syachiku.local
    • BaseOU : OU=SyachikuUser,DC=syachiku,DC=local
      • ↑ユーザオブジェクトが保管されているOU
    • BindUser:CN=super,CN=Users,DC=syachiku,DC=local
    • BindPasswd:P@ssw0rd
      • ↑LDAP情報を参照するためのユーザ
    • 登録されているユーザー / メールアドレス / パスワード
      • user001 / user001@syachiku.com / P@ssw0rd
      • user002 / user002@syachiku.com / P@ssw0rd
      • user003 / user003@syachiku.com / P@ssw0rd
  • その他
    • 両方のサーバともFirewall/SELinuuxは無効にしていること

構成図

PlantUMLで構成図を書いてみました。送信の流れが青受信の流れが赤になります。postfixでメールボックスへ配送して、dovecotで受信する流れです。

必要パッケージインストール

Telnetは動作確認用としてインストールしときます。
openldap-clientsはldapsearchコマンドでデバック用途として使います。

[root@mail ~]# yum install postfix dovecot telnet openldap-clients

Postfixの設定

ここでは細かい説明は省いて、実際に動作している設定ファイルの全内容を貼り付けていきます。ドメイン名やBaseOUなどの情報は適宜修正してください。

/etc/postfix/main.cf

主な変更点

  • mydomainを自身の受信ドメイン名に変更
  • mynetworksを自身のネットワークに変更
  • home_mailbox をMailDir/に変更
  • virtual_transport = virtual以下をコピペします。LDAPを参照するための設定ファイルを指定してます。
queue_directory = /var/spool/postfix
command_directory = /usr/sbin
daemon_directory = /usr/libexec/postfix
data_directory = /var/lib/postfix
mail_owner = postfix
myhostname = mail.syachiku.local
mydomain = syachiku.com
myorigin = $mydomain
inet_interfaces = all
inet_protocols = all
mydestination = 
unknown_local_recipient_reject_code = 550
mynetworks = 192.168.10.0/24, 127.0.0.0/8
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
home_mailbox = Maildir/
debug_peer_level = 2
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/sendmail.postfix
newaliases_path = /usr/bin/newaliases.postfix
mailq_path = /usr/bin/mailq.postfix
setgid_group = postdrop
html_directory = no
manpage_directory = /usr/share/man
sample_directory = /usr/share/doc/postfix-2.10.1/samples
readme_directory = /usr/share/doc/postfix-2.10.1/README_FILES

virtual_transport = virtual
virtual_mailbox_domains = $mydomain
virtual_mailbox_base = /var/spool/virtual
virtual_alias_maps = ldap:/etc/postfix/ldap-alias.cf
virtual_mailbox_maps = ldap:/etc/postfix/ldap-mailbox.cf
virtual_uid_maps = static:10000
virtual_gid_maps = static:10000
local_recipient_maps = proxy:unix:passwd.byname $alias_maps $virtual_mailbox_maps

/etc/postfix/ldap-alias.cf

これがLDAPの参照に使われる配送用の設定ファイルです。ドメインコントローラの環境に合わせて設定してください。他のサイトではquery_filterがよく(mail=%s)になってますが、これはLinuxのopenldapを利用している場合の例になります。基本的にADの場合にはmailがsamAccountNameになるはずです。

server_host = 192.168.10.21
search_base = OU=SyachikuUser,DC=syachiku,DC=local
bind = yes
bind_dn = CN=super,CN=Users,DC=syachiku,DC=local
bind_pw = P@ssw0rd
scope = one
query_filter = (samAccountName=%s)
result_attribute = mail

/etc/postfix/ldap-mailbox.cf 

server_host = 192.168.10.21
search_base = OU=SyachikuUser,DC=syachiku,DC=local
bind = yes
bind_dn = CN=super,CN=Users,DC=syachiku,DC=local
bind_pw = P@ssw0rd
scope = one
query_filter = (samAccountName=%s)
result_attribute = mail
result_format = %u/Maildir/

/var/spool/virtualディレクトリ作成、postfixサービス再起動

メール配送されるディレクトリ(/var/spool/virtual)をあらかじめ作成します。合わせてパーミッションを10000に設定します。

[root@mail postfix]# mkdir -p /var/spool/virtual
[root@mail postfix]# chown 10000.10000 /var/spool/virtual/

[root@mail postfix]# systemctl restart postfix.service

Postfix Ldap接続の確認

正しく設定されているかをpostaliasコマンドから確認します。メールアドレスとディレクトリ名が取得できればOKです。

[root@mail postfix]# postalias -q user001 ldap:/etc/postfix/ldap-alias.cf
user001@syachiku.com
[root@mail postfix]# postalias -q user001 ldap:/etc/postfix/ldap-mailbox.cf 
user001/Maildir/

メール送信を確認

LDAP接続が確認できましたので、メールボックスに配送されるかを実際にメール送信して確認します。

[root@mail postfix]# mailx user001@syachiku.com
Subject: Test01
Hello, User001
.
EOT

または、telnetでの確認でもOKです。

[root@mail postfix]# telnet localhost 25
Trying ::1...
Connected to localhost.
Escape character is '^]'.
220 mail.syachiku.local ESMTP Postfix
HELO test
250 mail.syachiku.local
MAIL FROM:test@local
250 2.1.0 Ok
RCPT TO: user001@syachiku.com
250 2.1.5 Ok
DATA
354 End data with <CR><LF>.<CR><LF>
test
.
250 2.0.0 Ok: queued as A360C412FB52

/var/spool/virtual/<ユーザ名>/に正しくメールが送信されていることを確認します。

[root@mail ~]# ll /var/spool/virtual/user001/Maildir/new/
合計 4
-rw------- 1 10000 10000 539  2月  5 21:28 1580905696.Vfd00I412fb64M983617.mail.syachiku.local

ここまででPostfixでメールが配送されていることまでが確認できました。この後は引き続きDovecotでメールがPOP or IMAPで受信できるように設定します。

Dovecot設定

dovecot側の設定ですが、新しいバージョンから細かくファイルで分割されてしまったので修正箇所が多いです。以下が設定ファイルです。

/etc/dovecot/dovecot.conf

# Debug用
auth_verbose = yes
auth_debug = yes

protocols = imap pop3
listen = *
dict {
  #quota = mysql:/etc/dovecot/dovecot-dict-sql.conf.ext
  #expire = sqlite:/etc/dovecot/dovecot-dict-sql.conf.ext
}
!include conf.d/*.conf
!include_try local.conf

/etc/dovecot/conf.d/10-auth.conf

disable_plaintext_auth = no
auth_mechanisms = plain
!include auth-system.conf.ext
!include auth-ldap.conf.ext

/etc/dovecot/conf.d/10-ssl.conf

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

/etc/dovecot/conf.d/10-mail.conf

mail_location = maildir:~/Maildir
namespace inbox {
  inbox = yes
}
first_valid_uid = 1000
protocol !indexer-worker {
}
mbox_write_locks = fcntl

/etc/dovecot/conf.d/auth-ldap.conf.ext

passdb {
  driver = ldap
  args = /etc/dovecot/dovecot-ldap.conf.ext
}

userdb {
  driver = ldap
  args = /etc/dovecot/dovecot-ldap.conf.ext
  default_fields = home=/var/spool/virtual/%u
}

userdb {
  driver = static
  args = uid=10000 gid=10000 home=/var/spool/vitrual/%u
}

/etc/dovecot/dovecot-ldap.conf.ext

hosts = 192.168.10.21
base = OU=SyachikuUser,DC=syachiku,DC=local
ldap_version = 3
auth_bind = yes
auth_bind_userdn = syachiku\%u
user_filter = (samAccountName=%u)

IMAPの動作テスト

サービス再起動
[root@mail var]# systemctl restart dovecot

動作確認
[root@mail var]# telnet localhost imap
. login user001 P@ssw0rd
. OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE SORT SORT=DISPLAY THREAD=REFERENCES THREAD=REFS THREAD=ORDEREDSUBJECT MULTIAPPEND URL-PARTIAL CATENATE UNSELECT CHILDREN NAMESPACE UIDPLUS LIST-EXTENDED I18NLEVEL=1 CONDSTORE QRESYNC ESEARCH ESORT SEARCHRES WITHIN CONTEXT=SEARCH LIST-STATUS BINARY MOVE SNIPPET=FUZZY SPECIAL-USE] Logged in

IMAPで正しくログオンできれば成功です!PCのメーラーなどで受信できることを確認してください。

トラブル対応

Permission deniedと表示される、その1

Feb  5 08:13:25 localhost postfix/virtual[12648]: warning: maildir access problem for UID/GID=10000/10000: create maildir file /var/spool/virtual//user001/Maildir/tmp/1580858005.P12648.mail.syachiku.local: Permission denied
Feb  5 08:13:25 localhost postfix/virtual[12648]: warning: perhaps you need to create the maildirs in advance
Feb  5 08:13:25 localhost postfix/virtual[12648]: 4B2264191C2A: to=<user001@syachiku.com>, relay=virtual, delay=0.66, delays=0.44/0.17/0/0.05, dsn=4.2.0, status=deferred (maildir delivery failed: create maildir file /var/spool/virtual//user001/Maildir/tmp/1580858005.P12648.mail.syachiku.local: Permission denied)

考えられる原因

  • /var/spool/virtualが存在しない or パーミッションが正しくない -> 上にある手順を実施
  • SELinuxが有効になってる
    • getenforceコマンドで確認 -> Enforceになっていたら以下のファイルを修正して再起動
[root@mail postfix]# vi /etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of three two values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected.
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted

Permission deniedと表示される、その2

Feb  8 15:55:20 mail dovecot: auth-worker(12670): Debug: Loading modules from directory: /usr/lib64/dovecot/auth
Feb  8 15:55:20 mail dovecot: auth-worker(12670): Debug: Module loaded: /usr/lib64/dovecot/auth/lib20_auth_var_expand_crypt.so
Feb  8 15:55:20 mail dovecot: auth-worker(12670): Debug: Module loaded: /usr/lib64/dovecot/auth/libdriver_sqlite.so
Feb  8 15:55:20 mail dovecot: auth-worker(12670): Debug: Loading modules from directory: /usr/lib64/dovecot/auth
Feb  8 15:55:20 mail dovecot: auth-worker(12670): Debug: Module loaded: /usr/lib64/dovecot/auth/libauthdb_ldap.so
Feb  8 15:55:20 mail dovecot: auth-worker(12670): Debug: pam(user001,127.0.0.1,<oTNQ/QqeMtZ/AAAB>): lookup service=dovecot
Feb  8 15:55:20 mail dovecot: auth-worker(12670): Debug: pam(user001,127.0.0.1,<oTNQ/QqeMtZ/AAAB>): #1/1 style=1 msg=Password:
Feb  8 15:55:22 mail dovecot: auth-worker(12670): pam(user001,127.0.0.1,<oTNQ/QqeMtZ/AAAB>): unknown user
Feb  8 15:55:22 mail dovecot: auth: Debug: client passdb out: OK#0111#011user=user001
Feb  8 15:55:22 mail dovecot: auth: Debug: master in: REQUEST#0112141323265#01112596#0111#0112cd55527286ce2593fb1eb5a83511fe1#011session_pid=12677#011request_auth_token
Feb  8 15:55:22 mail dovecot: auth-worker(12670): Debug: passwd(user001,127.0.0.1,<oTNQ/QqeMtZ/AAAB>): lookup
Feb  8 15:55:22 mail dovecot: auth-worker(12670): passwd(user001,127.0.0.1,<oTNQ/QqeMtZ/AAAB>): unknown user
Feb  8 15:55:22 mail dovecot: auth: Debug: ldap(user001,127.0.0.1,<oTNQ/QqeMtZ/AAAB>): user search: base=OU=SyachikuUser,DC=syachiku,DC=local scope=subtree filter=(samAccountName=user001) fields=homeDirectory,uidNumber,gidNumber
Feb  8 15:55:22 mail dovecot: auth: Error: ldap(user001,127.0.0.1,<oTNQ/QqeMtZ/AAAB>): ldap_search(base=OU=SyachikuUser,DC=syachiku,DC=local filter=(samAccountName=user001)) failed: Operations error
Feb  8 15:55:22 mail dovecot: auth: Debug: master userdb out: USER#0112141323265#011user001#011uid=10000#011gid=10000#011home=/var/spool/vitrual/user001#011auth_token=971dfd78c950106b29f9854834752a89b6f00c43
Feb  8 15:55:22 mail dovecot: imap-login: Login: user=<user001>, method=PLAIN, rip=127.0.0.1, lip=127.0.0.1, mpid=12677, secured, session=<oTNQ/QqeMtZ/AAAB>
Feb  8 15:55:22 mail dovecot: imap(user001): Error: Namespace '': mkdir(/var/spool/vitrual/user001/Maildir) failed: Permission denied (euid=10000(<unknown>) egid=10000(<unknown>) missing +w perm: /var/spool, dir owned by 0:0 mode=0755)
Feb  8 15:55:22 mail dovecot: imap(user001): Namespace '': mkdir(/var/spool/vitrual/user001/Maildir) failed: Permission denied (euid=10000(<unknown>) egid=10000(<unknown>) missing +w perm: /var/spool, dir owned by 0:0 mode=0755) in=0 out=366

考えられる原因
→ /var/spoolのパーミッションが不足しているため。アクセス権を追加

[root@mail var]# chmod 777 /var/spool/

デバック用 LdapSearchコマンド

LDAPのパラメータが正しいかどうかはldapserachコマンドで確認できます。

全員が表示
# ldapsearch -LLL -H ldap://192.168.10.21:389 -D CN=super,CN=Users,DC=syachiku,DC=local -w P@ssw0rd -x -b "OU=SyachikuUser,DC=syachiku,DC=local"
user001だけ表示
# ldapsearch -LLL -H ldap://192.168.10.21:389 -D CN=super,CN=Users,DC=syachiku,DC=local -w P@ssw0rd -x -b "OU=SyachikuUser,DC=syachiku,DC=local" "(samAccountName=user001)"
dn:: Q04944Om44O844K2MDAxLE9VPVN5YWNoaWt1VXNlcixEQz1zeWFjaGlrdSxEQz1sb2NhbA==
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: user
cn:: 44Om44O844K2MDAx
distinguishedName:: Q04944Om44O844K2MDAxLE9VPVN5YWNoaWt1VXNlcixEQz1zeWFjaGlrdS
 xEQz1sb2NhbA==
instanceType: 4
whenCreated: 20200203232955.0Z
whenChanged: 20200203232955.0Z
displayName:: 44Om44O844K2MDAx
uSNCreated: 32925
uSNChanged: 32929
name:: 44Om44O844K2MDAx
objectGUID:: PMBNHeGcUU2PL2N3MgGCNw==
userAccountControl: 66048
badPwdCount: 0
codePage: 0
countryCode: 0
badPasswordTime: 0
lastLogoff: 0
lastLogon: 0
pwdLastSet: 132252461958078713
primaryGroupID: 513
objectSid:: AQUAAAAAAAUVAAAA6RhpJU6MIuDCikfkYAQAAA==
accountExpires: 9223372036854775807
logonCount: 0
sAMAccountName: user001
sAMAccountType: 805306368
userPrincipalName: user001@syachiku.local
objectCategory: CN=Person,CN=Schema,CN=Configuration,DC=syachiku,DC=local
dSCorePropagationData: 16010101000000.0Z
mail: user001@syachiku.com

以上となります。

コメント

タイトルとURLをコピーしました