Postfix와 Dovecot를 사용한 가상 도메인 및 가상 사용자 이메일 서버 구축

가상 도메인 및 가상 사용자 이메일 서버 구축

본 문서에서는 Linux 환경에서 Apache, PHP, MariaDB, Postfix, Dovecot를 활용하여 가상 도메인 및 가상 사용자 기반의 이메일 서비스를 구축하는 방법을 설명한다.

구축 환경:
Linux + httpd + php + mariadb + postfix + dovecot + phpMyAdmin + postfixadmin + roundcubemail

필요 소프트웨어

  • phpMyAdmin-3.4.3-all-languages.tar.xz
  • postfixadmin-3.2.tar.gz
  • roundcubemail-1.3.9-complete.tar.gz

위 소프트웨어들을 준비한 후 구축을 시작한다.

SELinux 비활성화

이메일 서비스는 다양한 권한 요구사항이 있으므로, 구성을 간단하게 하기 위해 SELinux를 비활성화한다.

sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
reboot

YUM 저장소 구성 및 소프트웨어 설치

YUM 저장소 설정

mkdir /root/back
mv /etc/yum.repos.d/* /root/back/
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
curl -o /etc/yum.repos.d/CentOS-Epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
yum makecache

필수 소프트웨어 설치

yum install httpd mod_ssl mariadb mariadb-server php dovecot dovecot-mysql vim wget nc php-xml php-mbstring php-mysql php-mcrypt php-imap php-intl php-ldap php-gd bash-completion bash-completion-extras bind bind-utils

LAMP 환경 구성 및 phpMyAdmin 설치

LAMP 서비스 시작

systemctl enable httpd
systemctl enable mariadb
systemctl start httpd
systemctl start mariadb

데이터베이스 초기화

mysql_secure_installation

방화벽 설정

firewall-cmd --add-service=http

phpMyAdmin 설치

cd /var/www/html
tar -xf phpMyAdmin-3.4.3-all-languages.tar.xz
mv phpMyAdmin-3.4.3-all-languages /var/www/html/
ln -s phpMyAdmin-3.4.3-all-languages phpMyAdmin
cd phpMyAdmin
cp config.sample.inc.php config.inc.php
openssl rand -base64 32
vim config.inc.php

설정 완료 후 phpMyAdmin에 접근할 수 있다.

PostfixAdmin 설치

PostfixAdmin 설치 및 설정

cd /var/www/html
tar -xf postfixadmin-3.2.tar.gz
mv postfixadmin-3.2 /var/www/html/
ln -s postfixadmin-3.2/public/ postfixadmin

데이터베이스 생성

mysql -uroot -p123456

CREATE DATABASE postfix;
GRANT ALL ON postfix.* TO 'postfix'@'localhost' IDENTIFIED BY 'postfixadmin';
FLUSH PRIVILEGES;

환경설정 파일 생성

vim /var/www/html/postfixadmin-3.2/config.local.php
<?php
$CONF['database_type'] = 'mysqli';
$CONF['database_user'] = 'postfix';
$CONF['database_password'] = 'postfixadmin';
$CONF['database_name'] = 'postfix';
$CONF['configured'] = true;
?>
vim /var/www/html/postfixadmin-3.2/config.inc.php

아래 항목들을 수정한다:

$CONF['configured'] = true;
$CONF['default_language'] = 'cn';
$CONF['database_type'] = 'mysqli';
$CONF['database_host'] = 'localhost';
$CONF['database_user'] = 'postfix';
$CONF['database_password'] = 'postfixadmin';
$CONF['database_name'] = 'postfix';
$CONF['admin_email'] = 'root@localhost';

캐시 디렉토리 생성

mkdir /var/www/html/postfixadmin-3.2/templates_c
chown -R apache:apache /var/www/html/postfixadmin-3.2/templates_c

관리자 계정 생성

브라우저에서 setup.php에 접근하여 관리자 계정을 생성한다. 생성 완료 후 로그인하여 도메인 및 사용자를 추가한다.

도메인 추가 예: somata.com
사용자 추가 예: mail1, mail2

이제 postfixadmin 구성이 완료되었으며, 이후 Postfix와 Dovecot 서비스를 설정하게 된다.

참고: 생성된 도메인과 사용자는 실제 리눅스 시스템 사용자가 아닌 MariaDB 데이터베이스에 저장된다. Postfix와 Dovecot가 데이터베이스에서 정보를 읽어들이도록 구성해야 한다.

DNS 서버 구성

BIND를 사용하여 DNS 서버를 구성한다.

/etc/named.conf 설정

options {
    listen-on port 53 { any; };
    directory       "/var/named";
    dump-file       "/var/named/data/cache_dump.db";
    statistics-file "/var/named/data/named_stats.txt";
    memstatistics-file "/var/named/data/named_mem_stats.txt";
    recursing-file  "/var/named/data/named.recursing";
    secroots-file   "/var/named/data/named.secroots";
    allow-query     { any; };
    recursion yes;
    dnssec-enable yes;
    dnssec-validation yes;
    bindkeys-file "/etc/named.iscdlv.key";
    managed-keys-directory "/var/named/dynamic";
    pid-file "/run/named/named.pid";
    session-keyfile "/run/named/session.key";
};
zone "." IN {
    type hint;
    file "named.ca";
};
zone "somata.com" IN {
    type master;
    file "named.somata.com";
};

도메인 zone 파일 생성

vim /var/named/named.somata.com
$TTL 1D
somata.com.     IN SOA  ns.somata.com. root.somata.com. (
                                        2019052701
                                        1D
                                        1H
                                        1W
                                        3H )
        NS      ns.somata.com.
        MX 10   mail.somata.com.
ns      A       172.16.102.141
mail    A       172.16.102.141
www     A       172.16.102.141

DNS 서비스 시작

chgrp named /var/named/named.somata.com
systemctl restart named
firewall-cmd --add-service=dns

Postfix 구성

가상 메일 사용자 생성

groupadd -g 2000 vmail
useradd -r -u 2000 -g 2000 -d /var/spool/mail/vmail -c "Virtual mail user" vmail

/etc/postfix/main.cf 설정

queue_directory = /var/spool/postfix
command_directory = /usr/sbin
daemon_directory = /usr/libexec/postfix
data_directory = /var/lib/postfix
mail_owner = postfix

myhostname = mail.somata.com
mydomain = somata.com
myorigin = $mydomain
inet_interfaces = all
inet_protocols = ipv4
mydestination = $myhostname, localhost.$mydomain, localhost
unknown_local_recipient_reject_code = 550
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
home_mailbox = Maildir/
smtpd_banner = $myhostname ESMTP $mail_name
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_gid_maps = static:2000
virtual_uid_maps = static:2000
virtual_mailbox_domains = proxy:mysql:/etc/postfix/sql/mysql_virtual_domains_maps.cf
virtual_alias_maps =
   proxy:mysql:/etc/postfix/sql/mysql_virtual_alias_maps.cf,
   proxy:mysql:/etc/postfix/sql/mysql_virtual_alias_domain_maps.cf,
   proxy:mysql:/etc/postfix/sql/mysql_virtual_alias_domain_catchall_maps.cf
virtual_mailbox_maps =
   proxy:mysql:/etc/postfix/sql/mysql_virtual_mailbox_maps.cf,
   proxy:mysql:/etc/postfix/sql/mysql_virtual_alias_domain_mailbox_maps.cf
virtual_mailbox_base = /var/mail/vmail

# 사용자 인증 설정
broken_sasl_auth_clients = yes
smtpd_sasl_auth_enable = yes
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_recipient_restrictions = permit_mynetworks,permit_sasl_authenticated,reject_unauth_destination,reject_unknown_sender_domain

SQL 설정 파일 생성

postfixadmin에서 제공하는 스크립트를 실행하여 SQL 설정 파일을 생성한다.

su nobody -s /bin/bash -c 'bash /var/www/html/postfixadmin-3.2/POSTFIX_CONF.txt'

생성된 파일을 지정된 디렉토리에 복사한다.

mkdir /etc/postfix/sql
cp /tmp/postfixadmin-*/etc/postfix/sql/

Dovecot 구성

/etc/dovecot/dovecot.conf 설정

protocols = pop3 imap
listen = *

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

disable_plaintext_auth = no
auth_mechanisms = plain login
!include auth-sql.conf.ext

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

mail_location = maildir:/var/mail/vmail/%d/%n
first_valid_uid = 2000
first_valid_gid = 2000

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

ssl = no

/etc/dovecot/conf.d/10-master.conf 설정

unix_listener /var/spool/postfix/private/auth {
    mode = 0666
    user = postfix
    group = postfix
}

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

driver = mysql
default_pass_scheme = MD5-CRYPT
connect = host=localhost dbname=postfix user=postfix password=postfixadmin
password_query = SELECT username AS user,password FROM mailbox WHERE username = '%u' AND active='1'
user_query = SELECT CONCAT('/var/mail/vmail/', maildir) AS home, 2000 AS uid, 2000 AS gid, CONCAT('*:bytes=', quota) AS quota_rule FROM mailbox WHERE username = '%u' AND active='1'

서비스 테스트

방화벽 설정

firewall-cmd --add-service=pop3
firewall-cmd --add-service=smtp
firewall-cmd --add-service=dns

로그 활성화

vim /etc/my.cnf
[mysqld]
log=/var/log/mariadb/access.log
systemctl restart mariadb

이제 클라이언트 이메일 软件(예: Thunderbird, Foxmail 등)을 사용하여 연결을 테스트한다. 문제가 발생하면 /var/log/mariadb/access.log를 확인한다.

Webmail 설치 (Roundcube)

Roundcube 설치

tar -xf roundcubemail-1.3.9-complete.tar.gz
mv roundcubemail-1.3.9 /var/www/html/
cd /var/www/html/
ln -s roundcubemail-1.3.9 webmail

데이터베이스 생성

phpMyAdmin 또는命令行에서 roundcube 데이터베이스와 사용자를 생성한다.

설치 마법사 실행

브라우저에서 http://서버IP/webmail/installer에 접근하여 설치를 진행한다.

  1. 환경 확인
  2. 데이터베이스 설정
  3. IMAP 설정
  4. 언어 및 테마 설정
  5. 설정 파일 생성
vim /var/www/html/webmail/config/config.inc.php

생성된 설정을 파일에 저장한다.

설치 디렉토리 삭제

mv /var/www/html/roundcubemail-1.3.9/installer/ /tmp/

이제 웹메일에 이메일 계정으로 로그인할 수 있다.

보안 구성

Apache SSL 설정

mod_ssl이 설치되어 있으므로 인증서만 구성하면 된다.

openssl genrsa -out private/mailserver.pem 2048
openssl req -new -key private/mailserver.key -out mailserver.csr
openssl ca -in mailserver.csr -out certs/mailserver.crt -days 365

/etc/httpd/conf.d/ssl.conf 수정

SSLCertificateFile /etc/pki/tls/certs/mailserver.crt
SSLCertificateKeyFile /etc/pki/tls/private/mailserver.key

/etc/httpd/conf/httpd.conf 수정

<VirtualHost *:80>
   RewriteEngine on
   RewriteCond %{HTTPS} !=on
   RewriteRule ^(.*)?$ https://www.somata.com$1 [L,R]
</VirtualHost>

<Directory "/var/www/html/postfixadmin-3.2/">
    Order allow,deny
    allow from 172.16.102.188/32
    deny from all
</Directory>

<Directory "/var/www/html/phpMyAdmin-3.4.3-all-languages/">
    Order allow,deny
    allow from 172.16.102.188/32
    deny from all
</Directory>

설치 파일 제거

mv /var/www/html/postfixadmin-3.2/public/setup.php /tmp/
mv /var/www/html/phpMyAdmin-3.4.3-all-languages/setup/ /tmp/

Postfix TLS 설정

/etc/postfix/main.cf에 추가:

smtpd_use_tls = yes
smtpd_tls_cert_file = /etc/pki/tls/certs/mailserver.crt
smtpd_tls_key_file = /etc/pki/tls/private/mailserver.key

/etc/postfix/master.cf에서 smtps 주석 해제:

smtps     inet  n       -       n       -       -       smtpd
systemctl restart postfix

Dovecot SSL 설정

vim /etc/dovecot/conf.d/10-ssl.conf
ssl = yes
ssl_cert = </etc/pki/tls/certs/mailserver.crt
ssl_key = </etc/pki/tls/private/mailserver.key
systemctl restart dovecot

방화벽 영구 설정

firewall-cmd --permanent --add-service=dns
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
firewall-cmd --permanent --add-service=pop3s
firewall-cmd --permanent --add-service=smtps
firewall-cmd --reload

로그 비활성화

vim /etc/my.cnf
#log=/var/log/mariadb/access.log
systemctl restart mariadb

부팅 시 서비스 자동 시작

systemctl enable mariadb
systemctl enable httpd
systemctl enable dovecot
systemctl enable named

이제 가상 도메인 및 가상 사용자를 지원하는 이메일 서버가 완성되었다.

태그: postfix dovecot MariaDB BIND DNS

7월 3일 19:10에 게시됨