CentOS 7.x Postfix + Dovecot + RoundCube 설치 방법
하나의 서버에 여러개의 도메인을 운영할 때 시스템 계정이 아닌 DB에 가상 메일계정을 이용하는 방법입니다.
검색해서 설정했더니 잘 안되어서 여러곳의 정보를 취합해서 정리하였습니다.
참조 사이트 :
https://www.linode.com/docs/email/postfix/email-with-postfix-dovecot-and-mariadb-on-centos-7/
https://www.digitalocean.com/community/tutorials/how-to-configure-a-mail-server-using-postfix-dovecot-mysql-and-spamassassin
mariadb 및 아파치, php 는 설치되어 있다고 가정하고 진행합니다.
# yum install postfix dovecot dovecot-mysql roundcubemail
# systemctl enable postfix
# systemctl start postfix
# systemctl enable dovecot
# systemctl start dovecot
필요한 패키지를 설치합니다.
# useradd -u 5000 -d /home/vmail -s /sbin/nologin -m vmail
가상메일에서 사용될 계정을 만듭니다.
CREATE DATABASE webmail;
GRANT ALL PRIVILEGES ON webmail.* TO webmail@localhost IDENTIFIED BY '비밀번호';
가상메일에서 사용될 DB 계정을 만듭니다.
CREATE TABLE `webmail`.`virtual_domains` (
`id` INT NOT NULL AUTO_INCREMENT,
`name` VARCHAR(50) NOT NULL,
PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8;
CREATE TABLE `webmail`.`virtual_users` (
`id` INT NOT NULL AUTO_INCREMENT,
`password` VARCHAR(106) NOT NULL,
`email` VARCHAR(80) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `email` (`email`)
) DEFAULT CHARSET=utf8;
CREATE TABLE `webmail`.`virtual_aliases` (
`id` INT NOT NULL AUTO_INCREMENT,
`source` varchar(100) NOT NULL,
`destination` varchar(100) NOT NULL,
PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8;
INSERT INTO `webmail`.`virtual_domains` (`id` ,`name`) VALUES
('1', 'aaa.com'),
('2', 'bbb.com'),
('3', 'example.com');
INSERT INTO `webmail`.`virtual_users` (`id`, `password`, `email`) VALUES
('1', ENCRYPT('비밀번호', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))), 'user1@aaa.com'),
('2', ENCRYPT('비밀번호', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))), 'user2@aaa.com'),
('3', ENCRYPT('비밀번호', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))), 'user1@bbb.com'),
('4', ENCRYPT('비밀번호', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))), 'user2@bbb.com'),
('5', ENCRYPT('비밀번호', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))), 'user1@example.com'),
('6', ENCRYPT('비밀번호', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))), 'user2@example.com');
INSERT INTO `webmail`.`virtual_aliases` (`id`, `source`, `destination`) VALUES
('1', 'alias@aaa.com', 'user1@aaa.com'),
('2', 'user2@example.com', 'user1@example.com');
가상메일에서 사용될 테이블과 샘플데이터를 만듭니다.
default_pass_scheme = CRYPT 일때는 ENCRYPT('비밀번호')
# vi /etc/postfix/mysql-virtual-alias-maps.cf
hosts = 127.0.0.1
dbname = webmail
user = webmail
password = 비밀번호
query = SELECT destination FROM virtual_aliases WHERE source='%s'
# vi /etc/postfix/mysql-virtual-users.cf
hosts = 127.0.0.1
dbname = webmail
user = webmail
password = 비밀번호
query = SELECT email FROM virtual_users WHERE email='%s'
# vi /etc/postfix/mysql-virtual-mailbox-domains.cf
hosts = 127.0.0.1
dbname = webmail
user = webmail
password = 비밀번호
query = SELECT name FROM virtual_domains WHERE name='%s'
# vi /etc/postfix/mysql-virtual-mailbox-maps.cf
hosts = 127.0.0.1
dbname = webmail
user = webmail
password = 비밀번호
query = SELECT CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/') FROM virtual_users WHERE email='%s'
# chgrp postfix /etc/postfix/mysql-virtual-*.cf
# chmod o= /etc/postfix/mysql-virtual-*.cf
Postfix 에서 가상메일 계정의 정보를 가져올 쿼리파일을 만듭니다.
# vi /etc/postfix/main.cf
myhostname = mail.example.com
mydestination = localhost
mynetworks = 127.0.0.0/8
inet_interfaces = all
message_size_limit = 30720000
virtual_alias_domains =
virtual_alias_maps = proxy:mysql:/etc/postfix/mysql-virtual-alias-maps.cf, mysql:/etc/postfix/mysql-virtual-users.cf
virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
virtual_mailbox_maps = proxy:mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
virtual_mailbox_base = /home/vmail
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
broken_sasl_auth_clients = yes
smtpd_sasl_authenticated_header = yes
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
smtpd_use_tls = yes
smtpd_tls_cert_file = /etc/pki/dovecot/certs/dovecot.pem
smtpd_tls_key_file = /etc/pki/dovecot/private/dovecot.pem
proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks
virtual_transport = dovecot
dovecot_destination_recipient_limit = 1
Postfix main.cf 파일을 설정합니다.
postconf -e 'mydestination = localhost' 형태의 명령어로도 수정이 가능합니다.
그리고 postconf -n 명령어로 환경설정을 볼 수도 있습니다.
회색 부분을 굳이 설정하지 않아도 됩니다. ( 보안 사용시 필요 )
proxy_read_maps 은 없어도 될 것 같습니다.
# vi /etc/postfix/master.cf
dovecot unix - n n - - pipe
flags=DRhu user=vmail:vmail argv=/usr/libexec/dovecot/deliver -f ${sender} -d ${recipient}
submission inet n - n - - smtpd
-o syslog_name=postfix/submission
-o smtpd_tls_security_level=encrypt
-o smtpd_sasl_auth_enable=yes
-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
-o milter_macro_daemon_name=ORIGINATING
smtps inet n - n - - smtpd
-o syslog_name=postfix/smtps
-o smtpd_tls_wrappermode=yes
-o smtpd_sasl_auth_enable=yes
-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
-o milter_macro_daemon_name=ORIGINATING
Postfix master.cf 파일을 설정합니다.
회색 부분을 설정하지 않아도 됩니다. ( 보안 사용시 필요 )
# systemctl restart postfix
# postmap -q alias@aaa.com mysql:/etc/postfix/mysql-virtual-alias-maps.cf
user1@aaa.com
# postmap -q user1@aaa.com mysql:/etc/postfix/mysql-virtual-users.cf
user1@aaa.com
# postmap -q aaa.com mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
aaa.com
# postmap -q user1@aaa.com mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
aaa.com/user1/
postfix 데몬을 재시작 하고 가상계정 정보를 잘 가져 오는지 확인합니다.
# mv /etc/dovecot/dovecot.conf /etc/dovecot/dovecot.conf.ori
# vi /etc/dovecot/dovecot.conf
protocols = imap pop3
listen = *
log_timestamp = "%Y-%m-%d %H:%M:%S "
mail_location = maildir:/home/vmail/%d/%n/Maildir
ssl_cert = </etc/pki/dovecot/certs/dovecot.pem
ssl_key = </etc/pki/dovecot/private/dovecot.pem
namespace {
type = private
separator = .
prefix = INBOX.
inbox = yes
}
service auth {
unix_listener auth-master {
mode = 0600
user = vmail
}
unix_listener /var/spool/postfix/private/auth {
mode = 0666
user = postfix
group = postfix
}
user = root
}
service auth-worker {
user = root
}
protocol lda {
log_path = /home/vmail/dovecot-deliver.log
auth_socket_path = /var/run/dovecot/auth-master
postmaster_address = postmaster@example.com
}
protocol pop3 {
pop3_uidl_format = %08Xu%08Xv
}
passdb {
driver = sql
args = /etc/dovecot/dovecot-sql.conf.ext
}
userdb {
driver = static
args = uid=vmail gid=vmail home=/home/vmail/%d/%n allow_all_users=yes
}
# vi /etc/dovecot/dovecot-sql.conf.ext
driver = mysql
connect = host=127.0.0.1 dbname=webmail user=webmail password=비밀번호
default_pass_scheme = SHA512-CRYPT
password_query = SELECT email as user, password FROM virtual_users WHERE email='%u';
# chown vmail:dovecot /etc/dovecot
# chown vmail:dovecot /etc/dovecot/dovecot.conf
# chown vmail:dovecot /etc/dovecot/dovecot-sql.conf.ext
# chmod o= /etc/dovecot/dovecot-sql.conf.ext
기존 /etc/dovecot/dovecot.conf 파일을 백업해 놓고 새로운 파일로 설정을 합니다.
그리고 계정계정 로그인 정보에 사용될 /etc/dovecot/dovecot-sql.conf.ext 쿼리파일을 만듭니다.
dovecot 데몬에서 접근이 가능하도록 소유권한을 변경합니다.
# systemctl restart postfix
# systemctl restart dovecot
# tail -n15 /var/log/maillog
이제 postfix, dovecot 데몬을 재시작하고 메일이 잘 보내지고 잘 받아지는지 테스트 하면 됩니다.
telnet localhost smtp, telnet localhost pop3 명령어를 이용해서 메일 테스트를 합니다.
# mysql -u webmail -p webmail < /usr/share/roundcubemail/SQL/mysql.initial.sql
# cp -p /etc/roundcubemail/config.inc.php.sample /etc/roundcubemail/config.inc.php
# vi /etc/roundcubemail/config.inc.php
$config['db_dsnw'] = 'mysql://webmail:비밀번호@localhost/webmail';
$config['product_name'] = 'Webmail'; // HTML Title 부분에 나오는 내용, 적당한 이름으로 변경
# vi /etc/httpd/conf.d/roundcubemail.conf
<Directory /usr/share/roundcubemail/>
<IfModule mod_authz_core.c>
# Apache 2.4
Require local
Require all granted
</IfModule>
</Directory>
<Directory /usr/share/roundcubemail/installer/>
<IfModule mod_authz_core.c>
# Apache 2.4
Require local
Require ip 허용아이피
</IfModule>
</Directory>
# systemctl restart httpd
RoundCube 메일 환경을 설정합니다.
http://webmail.example.com/roundcubemail 페이지를 호출하여 확인합니다.
로그인시 사용자명에는 이메일 주소를 입력하여야 합니다.
위의 내용은 아래 첨부파일을 다운 받으면 됩니다.
postfix-dovecot-roundcube.txt