You cannot see this page without javascript.

postfix dovecot

Linux 조회 수 478 추천 수 0 2014.11.24 19:36:59

필요한 모듈은 아래와 같다. 각자 다운로드후 설치환경에 전송한다.



 

1. Postfix 설치하기

 

먼저 유져를 생성한다.

# useradd -u 89 -d /var/spool/postfix -s /sbin/nologin postfix
# usermod -G mail postfix
# groupadd postdrop

다음으로 아래와 같이 빌드한다.

make makefiles
CCARGS=’-fPIC -DUSE_TLS -DUSE_SSL -DUSE_SASL_AUTH
-DUSE_CYRUS_SASL -DPREFIX=”/usr”
-DHAS_LDAP -DLDAP_DEPRECATED=1
-DHAS_PCRE -I/usr/include/openssl
-DHAS_MYSQL -I/usr/include/mysql
-I/usr/include/sasl -I/usr/include’
AUXLIBS=’-L/usr/lib64 -L/usr/lib64/openssl -lssl -lcrypto
-L/usr/lib64/mysql -lmysqlclient
-lsasl2 -lpcre -lz -lm -lldap -llber
-Wl,-rpath,/usr/lib64/openssl -pie -Wl,-z,relro’
OPT=’-O’
DEBUG=’-g’

(1) main.cf 설정하기

alias_database = hash:/etc/aliases
alias_maps = hash:/etc/aliases, hash:/etc/mailman/aliases Mailman을 사용하는 경우만 설정
broken_sasl_auth_clients = yes
command_directory = /usr/sbin
config_directory = /etc/postfix
daemon_directory = /usr/libexec/postfix
debug_peer_level = 2
default_privs = nobody
이부분을 꼭 설정하자. master.cf 에 정의된 외부프로그램은 nobody 유져로 실행된다.
home_mailbox = Maildir/
html_directory = no
inet_interfaces = all
local_transport = virtual
mail_owner = postfix
mailq_path = /usr/bin/mailq.postfix
manpage_directory = /usr/share/man
message_size_limit = 10485760
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
mydomain = centis1504.net
myhostname = smtp.centis1504.net
mynetworks = xxx.xxx.xxx.0/24
myorigin = $mydomain
newaliases_path = /usr/bin/newaliases.postfix
queue_directory = /var/spool/postfix
relay_domains = $mydestination
sendmail_path = /usr/sbin/sendmail.postfix
setgid_group = postdrop
smtpd_banner = $myhostname ESMTP unknown
smtpd_client_restrictions = permit_mynetworks
smtpd_recipient_restrictions = permit_mynetworks,
permit_inet_interfaces,
permit_sasl_authenticated,
reject_unauth_destination
순서에 주의해라.
smtpd_sasl_auth_enable = yes SMTP-AUTH를 반드시 사용하자.
smtpd_sasl_authenticated_header = yes
smtpd_sasl_local_domain = $mydomain 혹시라도 메일이 안보내진다면 이 부분을 $myhostname 으로 해본다.
smtpd_sasl_security_options = noanonymous
smtpd_sasl_type = cyrus
smtpd_tls_cert_file = /etc/httpd/conf.d/ssl/server.crt SSL을 사용한다면 설정한다.
smtpd_tls_key_file = /etc/httpd/conf.d/ssl/server.key SSL을 사용한다면 설정한다.
smtpd_tls_session_cache_database = btree:/etc/postfix/smtpd_scache
smtpd_use_tls = yes SSL을 사용한다면 설정한다.
unknown_local_recipient_reject_code = 550

virtual_alias_domains = $virtual_alias_maps
virtual_alias_maps = mysql:/etc/postfix/mysql_virtual_alias_maps.cf
virtual_gid_maps = static:12 (/etc/group의 mail그룹 ID)
virtual_mailbox_base = /var/spool/mail
virtual_mailbox_domains = mysql:/etc/postfix/mysql_virtual_domains_maps.cf
virtual_mailbox_limit = 51200000
virtual_mailbox_maps = mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf
virtual_minimum_uid = 89 (/etc/passwd의 postfix유져 ID)
virtual_transport = virtual
virtual_uid_maps = static:89

 


혹시 default_privs 설정이 코멘트아웃되어 있다면 아래와 같은 에러가 발생한다. (SPF이용시)

 

Apr 22 10:42:13 freakin78 spawn[6894]: fatal: spawn_comand: execvp /usr/libexec/postfix/postfix-policyd-spf.pl: Permission denied

 

 

 


main.cf 설정중에 sasl의 디렉토리를 설정하는 항목은 절대 지정하지 않는다. 지정하게 되면 SASL 인증에 실패함.

 

Apr 20 02:14:08 freakin78 postfix/smtpd[7021]: warning: unknown[61.190.149.81]: SASL LOGIN authentication failed: authentication failure

 

 

(2) mysql_virtual_alias_maps.cf

user = postfix
password = password
hosts = localhost
dbname = postfix
table = alias
query= SELECT goto FROM alias WHERE address=’%s’

(3) mysql_virtual_domains_maps.cf

user = postfix
password = password
hosts = localhost
dbname = postfix
query = SELECT domain FROM domain WHERE domain=’%s’

table = domain
select_field = description
where_field = domain

(4) mysql_virtual_mailbox_maps.cf

user = postfix
password = password
hosts = localhost
dbname = postfix
query = SELECT maildir FROM mailbox WHERE username=’%s’

table = mailbox
select_field = maildir
where_field = username

(5) /etc/sysconfig/saslauthd
문제는 여기다.
Postfix는 SMTP-AUTH에 SASL을 이용한다. 그런데 MySQL에 인증정보를 통합관리하려면 MySQL에 접근을 해야 하는데 SASL인증 메소드중에 sql 또는 rimap 만 해당된다.
그러나 sql 은 현재 잘 안되는것 같고… rimap 밖에는 방법이 없다. rimap 이라는것은 수신서버(Dovecot)에 사용되는 IMAP 프로토콜을 이용하는 방법이다. (어차피 Dovecot도 MySQL의 인증정보를 참조하므로)

SOCKETDIR=/var/run/saslauthd
MECH=rimap
FLAGS=“-r -O 127.0.0.1″ 이 옵션을 설정안하게 되면 유져ID 를 @이후 잘라버린다. -r 옵션을 받드시 사용하자.

(6) /usr/lib64/sasl2/smtpd.conf (해당환경에 따라 다름)

pwcheck_method: saslauthd
saslauthd_path: /var/run/saslauthd/mux
mech_list: PLAIN LOGIN
log_level: 3

pwcheck_method: auxprop
auxprop_plugin: sql
sql_engine: mysql
sql_hostnames: 127.0.0.1
sql_user: postfix
sql_passwd: 패스워드
sql_database: postfix
sql_select: SELECT password FROM mailbox WHERE username = ‘%u@%r’ AND active = ‘1’
mech_list: plain login
allowanonymouslogin: no
allowplaintext: yes
log_level: 3

 


혹시 /var/log/messages 에 아래와 같은 로그가 나온다면…

 

Mar 2 22:29:32 centis1504.net postfix/smtpd[9479]: sql_select option missing
Mar 2 22:29:32 centis1504.net postfix/smtpd[9479]: auxpropfunc error no mechanism available
Mar 2 22:29:32 centis1504.net postfix/smtpd[9479]: auxpropfunc error invalid parameter supplied

그렇다면 rpm -ev cyrus-sasl-sql 로 해당 패키지를 삭제한다.
참고URL : http://www.cyberciti.biz/faq/postfix-sql_select-option-missing-auxpropfunc-error/

 

 


혹시 /var/log/maillog 에 아래와 같은 로그가 나온다면…

 

Mar 2 22:37:08 centis1504.net postfix/trivial-rewrite[9574]: warning: do not list domain centis1504.net in BOTH mydestination and virtual_mailbox_domains

그렇다면 main.cf 의 myhostname와 mydomain 를 중복하지 않는다. 즉, 다르게 설정한다.

 



 

2. Dovecot 설치하기

 

먼저 유져를 생성한다.

# useradd -u 97 -d /dev/null -s /sbin/nologin dovecot
# useradd -d /dev/null -s /sbin/nologin dovenull
# mkdir -p /var/run/dovecot/{login,empty}
# chown root:dovecot /var/run/dovecot
# chown root:dovenull /var/run/dovecot/login
# chmod 750 -R /var/run/dovecot/login

빌드 옵션은 아래와 같다.

# ./configure
–prefix=/usr/local
–sysconfdir=/etc
–localstatedir=/var
–with-sql
–with-mysql
–with-ssl=openssl
–with-ssldir=/etc/pki/tls
–with-notify=inotify
–with-libcap
–with-libwrap

 


또는 같은 버전의 RPM을 설치해도 된다.
단, RPM의 경우 어떤식으로 빌드했는지 아래와 같이 확인한다.

 

[root@hostname conf.d]# dovecot –build-options
Build options: ioloop=epoll notify=inotify ipv6 openssl io_block_size=8192
Mail storages: cydir maildir mbox mdbox raw sdbox shared
SQL drivers: mysql (이부분이 중요)
Passdb: checkpassword passwd passwd-file sql
Userdb: checkpassword nss passwd prefetch passwd-file sql

위에서 보는바와 같이 mysql 을 사용할 수 있도록 빌드되었기 때문에 이 RPM은 사용할 수 있다.

 

 


dovecot에서 mysql와 연동하는 경우에는 아래와 같이 추가로 필요한 모듈을 인스톨한다.

 

yum -y install dovecot-mysql

그렇지 않으면 아래와 같은 에러가 발생할것이다.

Aug 9 16:20:34 mail dovecot: auth: Fatal: Unknown database driver ‘mysql’
Aug 9 16:20:34 mail dovecot: master: Error: service(auth): command startup failed, throttling

 

 

(1) 설정 준비하기

# mkdir /etc/dovecot
# cd /usr/local/share/doc/dovecot/example-config
# cp -a conf.d /etc/dovecot/
# cp -a dovecot.conf /etc/dovecot/
# cp -a dovecot-*.ext /etc/dovecot/

(2) /etc/pam.d/dovecot 작성

auth required pam_nologin.so
auth include system-auth
account include system-auth
session include system-auth

(3) /etc/dovecot/dovecot.conf

protocols = imap pop3
disable_plaintext_auth = no MySQL에는 비밀번호가 PLAIN이므로.
ssl = no

(4) 10-auth.conf
아래 내용만 코멘트를 해제한다.

auth_mechanisms = plain

!include auth-system.conf.ext
!include auth-sql.conf.ext

(5) 10-logging.conf
이 부분은 필요하다면 설정하면 된다.

debug_log_path = /var/log/dovecot.log
syslog_facility = mail
auth_verbose = yes
auth_debug = yes
auth_debug_passwords = yes
mail_debug = yes
verbose_ssl = yes

(6) 10-ssl.conf
이 부분은 SSL을 사용할 경우만 설정한다.

ssl = yes
ssl_cert = </etc/httpd/conf.d/ssl/server.crt
ssl_key = </etc/httpd/conf.d/ssl/server.key

(7) 10-mail.conf

mail_location = maildir:/var/spool/mail/%u/
first_valid_uid = 89

사실 /var/spool/mail 은 /var/mail 에 심볼릭 링크가 걸려있으므로 실질적으로는 같은 장소이다.

(8) auth-sql.conf.ext

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

(9) dovecot-sql.conf.ext

driver = mysql
connect = host=localhost dbname=postfix user=root password=password
default_pass_scheme = PLAIN
password_query = SELECT password FROM mailbox WHERE username = ‘%n@%d’ AND active = ‘1’
user_query = SELECT concat(‘/var/spool/mail/’, maildir) as home, 89 as uid, 12 as gid FROM mailbox WHERE username = ‘%n@%d’ AND active = ‘1’

(10) /etc/syslog.conf

*.info;mail.none;authpriv.none;cron.none;local1.none /var/log/messages
local1.* /var/log/dovecot.log

(11) /etc/rc.d/init.d/dovecot (기동스크립트)

#!/bin/bash
#
# /etc/rc.d/init.d/dovecot
#
# Starts the dovecot daemon
#
# chkconfig: 235 65 35
# description: Dovecot Imap Server
# processname: dovecot
# config: /etc/dovecot.conf
# config: /etc/sysconfig/dovecot
# pidfile: /var/run/dovecot/master.pid

# Source function library.
. /etc/init.d/functions

if [ -f /etc/sysconfig/dovecot ]; then
. /etc/sysconfig/dovecot
fi

RETVAL=0
PATH=$PATH:/usr/local/sbin
prog=”Dovecot Imap”
exec=“/usr/local/sbin/dovecot”
config=“/etc/dovecot/dovecot.conf”
pidfile=“/usr/local/var/run/dovecot/master.pid”
lockfile=“/usr/local/var/lock/subsys/dovecot”

start() {
[ -x $exec ] || exit 5
[ -f $config ] || exit 6

echo -n $”Starting $prog: ”
daemon –pidfile $pidfile $exec $OPTIONS
RETVAL=$?
[ $RETVAL -eq 0 ] && touch $lockfile
echo
}

stop() {
echo -n $”Stopping $prog: ”
killproc -p $pidfile $exec
RETVAL=$?
[ $RETVAL -eq 0 ] && rm -f $lockfile
echo
}

reload() {
echo -n $”Reloading $prog: ”
killproc -p $pidfile $exec -HUP
RETVAL=$?
echo
}

#
# See how we were called.
#
case “$1″ in
start)
start
;;
stop)
stop
;;
reload)
reload
;;
restart)
stop
sleep 1
start
RETVAL=$?
;;
condrestart)
if [ -f $lockfile ]; then
stop
sleep 3
start
fi
;;
status)
status -p $pidfile $exec
RETVAL=$?
;;
*)
echo $”Usage: $0 {condrestart|start|stop|restart|reload|status}”
exit 2
esac

exit $RETVAL

 


혹시 /var/log/maillog 에서 아래와 같이 나온다면?

 

Mar 2 15:31:00 jobon postfix/virtual[822]: warning: maildir access problem for UID/GID=10000/10000: create maildir file /var/spool/mail/centis1504.net/info@centis1504.net/tmp/1299047460.P822.centis1504.net: Permission denied

postfix가 postfix:mail 로 실행되는데 각각의 UID와 GID가 일치하지 않을 경우 발생한다.
또한 virtual_minimum_uid 항목도 postfix 의 uid 로 똑같이 설정한다.

 

 


처음에 메일클라이언트의 설정에서 유져ID를 도메인을 빼고 설정했더니 dovecot.log 에는 아래와 같이 나왔다.

 

Mar 03 10:09:06 auth: Debug: sql(test1@centis1504.net,192.168.0.10): query: SELECT password FROM mailbox WHERE username = ‘test1′ AND active = ’1′
Mar 03 10:09:08 auth: Debug: client out: FAIL 1 user=test1@centis1504.net

잘보면 쿼리의 조건문이 유져이름만 나온다…

 

 


유져이름을 메일주소형식으로 잘맞게 했으나 이번에는 패스워드를 dovecot이 MD5처리하므로 인증실패!!

 

Mar 03 10:10:32 auth: Debug: sql(test1@centis1504.net,192.168.0.10): query: SELECT password FROM mailbox WHERE username = ‘test1@centis1504.net’ AND active = ’1′
Mar 03 10:10:32 auth: Debug: sql(test1@centis1504.net,192.168.0.10): MD5(testtest) != ‘testtest’, try PLAIN scheme instead
Mar 03 10:10:34 auth: Debug: client out: FAIL 1 user=test1@centis1504.net

이건 위에 기술한 설정에 PLAIN 을 사용하도록 설정했다.

 

 


아래와 같이 출력되면 OK!!

 

Mar 03 11:20:06 auth: Debug: sql(test1@centis1504.net,192.168.0.10): query: SELECT password FROM mailbox WHERE username = ‘test1@centis1504.net’ AND active = ’1′
Mar 03 11:20:06 auth: Debug: client out: OK 1 user=test1@centis1504.net
Mar 03 11:20:06 auth: Debug: master in: REQUEST 3607101441 17504 1 422bde46f4ceafa2c2691b9df65153ba
Mar 03 11:20:06 auth: Debug: passwd(test1@centis1504.net,192.168.0.10): lookup
Mar 03 11:20:06 auth: Debug: sql(test1@centis1504.net,192.168.0.10): SELECT concat(‘/var/spool/mail/’, maildir) as home, 89 as uid, 12 as gid FROM mailbox WHERE username = ‘test1
@centis1504.net’ AND active = ’1′
Mar 03 11:20:06 auth: Debug: master out: USER 3607101441 test1@centis1504.net home=/var/spool/mail/centis1504.net/test1@centis1504.net/ uid=89 gid=12
Mar 03 11:20:06 pop3(test1@centis1504.net): Debug: Effective uid=89, gid=12, home=/var/spool/mail/centis1504.net/test1@centis1504.net/
Mar 03 11:20:06 pop3(test1@centis1504.net): Debug: maildir++: root=/var/spool/mail/centis1504.net/test1@centis1504.net, index=, control=, inbox=/var/spool/mail/centis1504.net/test1@centis1504.net

 

 



 

3. Postfixadmin 설치하기

 

먼저, 필요한 데이터베이스를 작성한다.

mysql> create database postfix default charset utf8;
mysql> grant all privileges on postfix.* to postfixadmin@localhost identified by ‘비밀번호';

해당 모듈을 적당한 httpdocs 에 전개한다.

(1) config.inc.php

$CONF[‘configured’] = true;
$CONF[‘default_language’] = ‘ja';
$CONF[‘database_type’] = ‘mysql';
$CONF[‘database_host’] = ‘localhost';
$CONF[‘database_user’] = ‘postfix';
$CONF[‘database_password’] = ‘비밀번호';
$CONF[‘database_name’] = ‘postfix';
$CONF[‘domain_path’] = ‘NO';
$CONF[‘domain_in_mailbox’] = ‘YES';
$CONF[‘fetchmail’] = ‘YES';

그리고 “change-this-to-your.domain.tld” 로 표시된 부분은 각자의 도메인으로 변경한다.

(2) 설정
http://localhost/postfixadmin/setup.php 를 표시하면 초기 설정화면이 나오는데 지시에 따라 설정한다.

 

 


php에 관한 모듈이 부족한 경우가 빈번한데 php5-mbsting이나 php5-imap등이 없다면 아래와 같이 인스톨한다.
php를 rpm으로 인스톨했다면

 

yum -y install php-mbstring
yum -y install php-imap

php모듈을 인스톨후에는 반드시 Apache 를 재기동해야 반영된다.

 

 

이때 중요한것은 처음에 관리자를 등록하며 setup password 를 설정하게 되는데 화면에 표시되는 값을 config.inc.php 에 설정한다.
001.gif

 

 

 

$CONF[‘setup_password’] = ‘화면에 표시된 값';

 


비밀번호를 암호화해서 저장하는 방법.

 

/etc/dovecot/conf.d/10-auth.conf
/etc/dovecot/dovecot-sql.conf.ext
/var/www/html/admin/config.inc.php (postfixadmin)
/var/www/html/config/main.inc.php (roundcube)

위의 4개 설정파일에서 인증방법을 통일한다.
현재는 PLAIN을 기준으로 설정했는데 CRAM-MD5나 DIGEST-MD5등으로 변경한다..

아래 예제는 MD5를 이용하여 비밀번호를 저정하는 방법이다.

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

auth_mechanisms = plain

위의 설정이 plain 으로 되어 있는데 이것은 비밀번호를 plain 으로 저장한다는 의미가 아니다.
dovecot 과 mail client 와의 통신에서 비밀번호를 어떻게 전달할것인지의 의미이다.
즉, 통신상에서 비밀번호는 그냥 그대로 전달한다는 의미이므로 반드시 SSL을 이용해야 안전할것이다.

/etc/dovecot/dovecot-sql.conf.ext

default_pass_scheme = plain-md5

위의 설정은 중요하다.
MySQL에 저정되어 있는 비밀번호가 어떻게 저장되어 있는지를 설정한다.

/var/www/html/admin/config.inc.php (postfixadmin)

$CONF[‘encrypt’] = ‘md5′;

위 설정은 postfixadmin 에서 유져관리를 할때 비밀번호를 MySQL에 저장하게 되는데 그때 저장할 방법을 설정한다.
여기서는 md5로 통일한다.

/var/www/html/config/main.inc.php (roundcube)

$rcmail_config[‘imap_auth_type’] = null;

위 설정은 mail client 인 round cube 의 설정인데, 특별히 설정할건 없다.
null 로 설정하면 모든 방법으로 다 시도해 보는듯하다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

첨부
List of Articles
번호 제목 글쓴이 날짜sort 조회 수
209 LinuxMint mint linux 한영키 [10] LynX 2014-12-19 385
208 LinuxMint LinuxMint MariaDB source 설치 [12] LynX 2014-12-19 1135
207 Linux lazarus 설치 [10] LynX 2014-12-17 340
206 LinuxMint linuxmint LynX 2014-12-11 953
205 Linux EPEL repository [10] LynX 2014-12-11 945
204 Linux cinnamon [10] LynX 2014-12-11 287
203 Linux Codec [12] LynX 2014-12-08 355
202 Linux 커널 컴파일 [10] LynX 2014-12-08 742
201 Linux PlayOnLinux [3] LynX 2014-11-28 418
200 Linux Postfix 표준 설정 예제 [14] LynX 2014-11-25 3343
» Linux postfix dovecot file [14] LynX 2014-11-24 478
198 CentOS7 ▒ Doly의 CentOS7 강좌21 7. 사용자와 그룹관리 2-그룹관리 file [10] LynX 2014-11-21 363
197 CentOS7 ▒ Doly의 CentOS7 강좌20 7. 사용자와 그룹관리 1-사용자 관리 file [8] LynX 2014-11-21 461
196 Linux How to install libc-client-devel [2] LynX 2014-11-21 427
195 Server tomcat error LynX 2014-11-11 329
194 Linux WNCSS_qcom Mac Address 바꾸기 file [9] LynX 2014-11-10 218
193 Linux rpm 사용법 LynX 2014-10-30 354
192 Programing 개행문자 LynX 2014-10-29 513
191 CentOS7 ▒ Doly의 CentOS7 강좌19 6. CentOS 네트워크 5-관련 명령어 LynX 2014-10-23 4070
190 CentOS7 ▒ Doly의 CentOS7 강좌18 6. CentOS 네트워크 4-네트워크 본딩(bonding) file [10] LynX 2014-10-23 3658

XE Login