가상 도메인 및 가상 사용자 이메일 서버 구축
본 문서에서는 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에 접근하여 설치를 진행한다.
- 환경 확인
- 데이터베이스 설정
- IMAP 설정
- 언어 및 테마 설정
- 설정 파일 생성
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
이제 가상 도메인 및 가상 사용자를 지원하는 이메일 서버가 완성되었다.