CentOS 8 +dovecot +postfix+mariaDB+Roundcube+letsencrypt =Emailserver
개인 세부 설정은 개인취향에 따라 적용
CentOS-8.1.1911-x86_64-dvd1.iso
https://www.centos.org/download/


하드 설정 은 필수이고 날짜 및 시간의 정확성을 위해 한국 설정을 하시는게 좋습니다.
네트워크 설정도 여기에서 하고 넘어가기

둘다 설정
기본설정 할것들 체크
1.yum update 전체 패키지와 커널을 업그레이드 나중에 할시 운이없을시 서버가 다운될수있음 처음시작시 업데이트
#yum update -y
옵션 사용은 알아서
2./etc/sysconfig/selinux
----------------------------

-----------------------------
or
#sed -i 's/^SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config
보안정책 기본적으로 활성화 되어있어 테스팅에 힘듬이 있음 비활성후 기능 구현후 재설정하여 체크하거나 다른 방화벽사용
3./etc/resolv.conf 자신의 네임서버를 생각해서 설정
nameserver 8.8.8.8
nameserver 168.126.63.1 <kt
nameserver 192.168.0.1 <사설
4.iptables 방화벽 (꼭 사용안해도됌 모든 프로그램 구성후 사용해도 괜찮)centos 7 부터 자동으로 사용되는
firewalld 나 iptables 둘중 하나는 사용하길 권고
둘중 하나 만 사용
#systemctl stop firewalld (firewalld 중지)
#systemctl mask firewalld (firewalld 자동시작 중지)
#yum install -y iptables-services (iptables 서비스 관련 패키지 설치)
# systemctl enable iptables (iptables 자동 시작)
# systemctl start iptables(iptables 시작)
# iptables -nL (적용 확인)
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT)
target prot opt source destination
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
기입방법
vi /etc/sysconfig/iptables
------------------------------------------------------
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
------------------------------------------------------
# service iptables stop
# service iptables start
#hostnamectl set-hostname mail.eztest.com
#hostname
#reboot
postfix,apache,php 다운
# dnf install httpd postfix postfix-mysql policycoreutils-python-utils epel-release
php7.4.x버전 설치 remi
# dnf install https://rpms.remirepo.net/enterprise/remi-release-8.rpm
# dnf module list php
# dnf module enable php:remi-7.4
# dnf install php
# dnf install php-common php-json php-xml php-mbstring php-mysqlnd
mariadb 설치
vi /etc/yum.repos.d/MariaDB.repo
----------------------------------------------------------------
# MariaDB 10.5 CentOS repository list - created 2020-08-26 07:08 UTC
# http://downloads.mariadb.org/mariadb/repositories/
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.5/centos8-amd64
module_hotfixes=1
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
---------------------------------------------------------------
# dnf install MariaDB-server MariaDB-client (설치)
# systemctl start mariadb (DB 구동)
# systemctl enable mariadb (부팅 자동 실행)
# ps -ef | grep mariadbd (구동 확인)
mysql_secure_installation (초기 세팅)
Enter current password for root (enter for none): Enter
Switch to unix_socket authentication [Y/n] Y
Change the root password? [Y/n] Y
New password: 패스워드 입력
Re-enter new password: 패스워드 재입력
Remove anonymous users? [Y/n] Y
Disallow root login remotely? [Y/n] Y
Remove test database and access to it? [Y/n] Y
Reload privilege tables now? [Y/n] Y
Thanks for using MariaDB!
로그인 계정 및 RoundCube를 사용하기 위한 구성
※ Postfix가 IMAP을 이용하여 계정을 인증할 때 크게 3가지 방법이 있습니다.
1. /etc/passwd 리눅스 계정 리스트의 PAM을 이용한 인증
2. 직접 사용자 계정 login.list (임의) 파일을 만들어 관리 및 인증
3. MariaDB 같은 데이터베이스에 저장하여 인증 (해당 방법을 이용)
# mysql -u root -p (DB 접속, 순서대로 진행)
□Postfix 계정을 저장할 데이터베이스 생성
MariaDB [(none)]> create database postfix_accounts;
□방금 생성한 데이터베이스에 접근할 전체 권한 계정을 생성
예시) grant all on 데이터베이스 이름.* to '유저 ID'@'localhost' identified by '패스워드';
MariaDB [(none)]> grant all on postfix_accounts.* to test123@localhost identified by 'test123';
MariaDB [(none)]> flush privileges; (바로 적용)
□서버에 도메인을 저장할 테이블 만들기(전체 한 줄)
MariaDB [(none)]> CREATE TABLE postfixaounts.doma∈stab≤ ( Doma∈Id INT NOT NULL AUTO_INCREMENT , Doma∈Name VARCHAR(50) NOT NULL , PRIMARY KEY (Doma∈Id)) ENGINE = InnoDB;
□사용자 계정을 보관할 테이블 만들기(전체 한 줄)
MariaDB [(none)]> CREATE TABLE postfixaounts.aountstab≤ (
AountId INT NOT NULL AUTO_INCREMENT,
Doma∈Id INT NOT NULL,
password VARCHAR(300) NOT NULL,
Email VARCHAR(100) NOT NULL,
PRIMARY KEY (AountId),
UNIQUE KEY Email (Email),
FOREIGN KEY (DomainId) REFERENCES domains_table(DomainId) ON DELETE CASCADE
) ENGINE = InnoDB;
□별칭 사용자 계정을 보관할 테이블 만들기(전체 한 줄)
별칭은 일종의 리다이렉션처럼 A계정이 수신을 받으면 B계정으로 받는 기능
MariaDB [(none)]> CREATE TABLE postfixaounts.aliastab≤ (
AliasId INT NOT NULL AUTO_INCREMENT,
Doma∈Id INT NOT NULL,
Source varchar(100) NOT NULL,
Dest∈ation varchar(100) NOT NULL,
PRIMARY KEY (AliasId),
FOREIGN KEY (DomainId) REFERENCES domains_table(DomainId) ON DELETE CASCADE
) ENGINE = InnoDB;
□eztest.com 도메인 등록
MariaDB [(none)]> INSERT INTO postfixaounts.doma∈stab≤ (DomainName) VALUES ('test123.com');
□test1@eztest.com 계정 생성
MariaDB [(none)]> INSERT INTO postfixaounts.aountstab≤ (DomainId, password, Email) VALUES (1, ENCRYPT('test123', CONCAT('6', SUBSTRING(SHA(RAND()), -16))), 'test1@test123.com');
□test2@eztest.com 계정 생성
MariaDB [(none)]> INSERT INTO postfixaounts.aountstab≤ (DomainId, password, Email) VALUES (1, ENCRYPT('test123', CONCAT('6', SUBSTRING(SHA(RAND()), -16))), 'test2@test123.com');
□testfc@eztest.com ▷ testsc@eztest.com 별칭 계정 생성
MariaDB [(none)]> INSERT INTO postfixaounts.aliastab≤ (DomainId, Source, Destination) VALUES (1, 'testfc@test123.com', 'testsc@test123.com');
□나중에 설치할 RoundCube 데이터베이스 미리 생성하기
MariaDB [none]> create database roundcube;
□동일하게 데이터베이스에 접근할 전체 권한 계정을 생성
MariaDB [none]> grant all on roundcube.* to roundcube_admin@localhost identified by 'test123';
MariaDB [none]> flush privileges; (바로 적용)
MariaDB [none]> quit (끝)
/etc/postfix/
master.cf 파일 설정(수정 또는 추가 후 저장)
# vim /etc/postfix/master.cf
17 submission inet n - n - - smtpd
18 -o syslog_name=postfix/submission
20 -o smtpd_sasl_auth_enable=yes
22 -o smtpd_reject_unlisted_recipient=no
27 -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
28 -o milter_macro_daemon_name=ORIGINATING
41 pickup unix n - n 60 1 pickup
42 cleanup unix n - n - 0 cleanup
43 qmgr unix n - n 300 1 qmgr
45 tlsmgr unix - - n 1000? 1 tlsmgr
46 rewrite unix - - n - - trivial-rewrite
47 bounce unix - - n - 0 bounce
48 defer unix - - n - 0 bounce
49 trace unix - - n - 0 bounce
50 verify unix - - n - 1 verify
51 flush unix n - n 1000? 0 flush
52 proxymap unix - - n - - proxymap
53 proxywrite unix - - n - 1 proxymap
54 smtp unix - - n - - smtp
55 relay unix - - n - - smtp
58 showq unix n - n - - showq
59 error unix - - n - - error
60 retry unix - - n - - error
61 discard unix - - n - - discard
62 local unix - n n - - local
63 virtual unix - n n - - virtual
64 lmtp unix - - n - - lmtp
65 anvil unix - - n - 1 anvil
66 scache unix - - n - 1 scache
□맨 하단에 Dovecot 관련 값 미리 추가하기
134 dovecot unix - n n - - pipe
135 flags=DRhu user=vmail:vmail argv=/usr/libexec/dovecot/deliver -f sender−d{recipient}
[root@localhost ]# vim /etc/postfix/main.cf
□다음과 같이 아래 주석(#) 제거하거나 추가(스크린샷 참고)
96 myhostname = mail.test123.com
104 mydomain = test123.com
120 myorigin = $mydomain
137 inet_interfaces = all
140 inet_protocols = all
185 mydestination = myhostname,localhost.mydomain, localhost
273 smtpd_recipient_restrictions = permit_mynetworks
440 home_mailbox = Maildir/
712 #smtpd_tls_cert_file = /etc/pki/tls/certs/postfix.pem (SSL인증서 Cert 파일, 지금은 사용안함으로 주석처리)
718 #smtpd_tls_key_file = /etc/pki/tls/private/postfix.key (SSL인증서 Key 파일, 지금은 사용안함으로 주석처리)
723 smtpd_tls_security_level = may
739 smtp_tls_security_level = may
□맨 하단에는 SSL 보안 관련 옵션으로 당장 사용하지는 않지만 미리 등록
743 append_dot_mydomain = no
744 biff = no
745 config_directory = /etc/postfix
746 dovecot_destination_recipient_limit = 1
747 message_size_limit = 4194304
748 smtpd_use_tls = yes
749 smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
750 smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
751 virtual_transport = dovecot
752 smtpd_sasl_type = dovecot
753 smtpd_sasl_path = private/auth
□마지막으로 STEP03에서 데이터베이스에 저장 한 계정 대한 Postfix 액세스 권한 부여하는 구성 추가
755 virtual_mailbox_domains = mysql:/etc/postfix/database-domains.cf
756 virtual_mailbox_maps = mysql:/etc/postfix/database-users.cf
757 virtual_alias_maps = mysql:/etc/postfix/database-alias.cf
Postfix가 데이터베이스에 각 정보를 엑세스 할 수 있도록 파일 생성(추가 후 저장)
□도메인 엑세스
[root@localhost ]# vim /etc/postfix/database-domains.cf
user = test123.com
password = test123
hosts = 127.0.0.1
dbname = postfix_accounts
query = SELECT 1 FROM domains_table WHERE DomainName='%s'
□사용자 계정 엑세스
[root@localhost ]# vim /etc/postfix/database-users.cf
user = test123.com
password = test123
hosts = 127.0.0.1
dbname = postfix_accounts
query = SELECT 1 FROM accounts_table WHERE Email='%s'
□별칭 계정 엑세스
[root@localhost ]# vim /etc/postfix/database-alias.cf
user = test123.com
password = test123
hosts = 127.0.0.1
dbname = postfix_accounts
query = SELECT Destination FROM alias_table WHERE Source='%s'
생성한 파일 권한 설정
[root@localhost ]# chmod 640 /etc/postfix/database-domains.cf
[root@localhost ]# chmod 640 /etc/postfix/database-users.cf
[root@localhost ]# chmod 640 /etc/postfix/database-alias.cf
[root@localhost ]# chown root:postfix /etc/postfix/database-domains.cf
[root@localhost ]# chown root:postfix /etc/postfix/database-users.cf
[root@localhost ]# chown root:postfix /etc/postfix/database-alias.cf
[root@localhost postfix]# ls -al /etc/postfix/ | grep database (적용 확인)
-rw-r----- 1 root postfix 145 8월 27 02:57 database-alias.cf
-rw-r----- 1 root postfix 145 8월 27 02:55 database-domains.cf
-rw-r----- 1 root postfix 137 8월 27 02:56 database-users.cf
[root@localhost ]# systemctl restart postfix (서비스 재시작)
[root@localhost postfix]# systemctl status postfix | grep active (Active 되어 있어야 정상 구동)
Active: active (running)
설정 테스트(Postfix가 데이터베이스에 정상 접근하는지)
※ 응답 값이 숫자 1이 나오거나 끝에는 별칭(리다이렉트) 계정이 표시되면 정상
[root@localhost postfix]# postmap -q test123.com mysql:/etc/postfix/database-domains.cf
1
[root@localhost postfix]# postmap -q test1@test123.com mysql:/etc/postfix/database-users.cf
1
[root@localhost postfix]# postmap -q test2@etest123.com mysql:/etc/postfix/database-users.cf
1
[root@localhost postfix]# postmap -q testfc@test123.com mysql:/etc/postfix/database-alias.cf
testsc@test123.com
STEP05
Dovecot 설치 및 구성
5-1 Dovecot 설치하기
[root@localhost ~]# dnf install dovecot dovecot-mysql
5-2 설치 후 시스템에서 메일을 처리할 사용자 및 그룹을 추가
[root@localhost ~]# groupadd -g 6000 vmail
[root@localhost ~]# useradd -g vmail -u 6000 vmail -d /home/vmail -m
5-3 dovecot.conf 설정(수정 후 저장)
[root@localhost ]# vim /etc/dovecot/dovecot.conf
24 protocols = imap pop3 lmtp
30 listen = *, ::
98 !include conf.d/*.conf
102 !include_try local.conf
104 log_path = /var/log/dovecot.log
10-auth.conf 설정(수정 후 저장)
[root@localhost ]# vim /etc/dovecot/conf.d/10-auth.conf
10 disable_plaintext_auth = yes
100 auth_mechanisms = plain login
123 !include auth-sql.conf.ext
활성화한 auth-sql.conf.ext 파일 구성 (수정 후 저장)
[root@localhost ~]# vim /etc/dovecot/conf.d/auth-sql.conf.ext
5 passdb { 6 driver = sql
9 args = /etc/dovecot/dovecot-sql.conf.ext
10 }
27 userdb { 28 driver = static 29 args = uid=vmail gid=vmail home=/home/vmail/%d/%n/Maildir 30 }
변수에 맞게 해당 경로 도메인 등록
※ /home/vmail/domain 디렉터리 (/home/vmail/%d/ )를 생성
[root@localhost ~]# mkdir /home/vmail/eztest.com
5-7 위 설정에서 "args"에 포함된 파일에 postfix에 대해 구성한 데이터베이스 세부 정보를 추가
[root@localhost ~]# vim /etc/dovecot/dovecot-sql.conf.ext (추가 후 저장)
driver = mysql
connect = "host=127.0.0.1 dbname=postfix_accounts user=test123 password=test123"
default_pass_scheme = SHA512-CRYPT
password_query = SELECT Email as User, password FROM accounts_table WHERE Email='%u';
5-8 10-mail.conf 파일 구성
※ 메일 사서함(저장 위치) 및 네임스페이스(Namespace) inbox 사용 설정
[root@localhost ~]# vim /etc/dovecot/conf.d/10-mail.conf (수정 후 저장)
30 mail_location = maildir:/home/vmail/%d/%n/Maildir
42 namespace inbox {
61 inbox = yes
80 }
114 mail_privileged_group = mail
325 mbox_write_locks = fcntl
10-master.conf 파일 구성
※ 각 서비스에 대한 포트 지정 생각하면 됩니다.
[root@localhost ~]# vim /etc/dovecot/conf.d/10-master.conf
17 service imap-login {
18 inet_listener imap {
19 port = 143
20 }
21 inet_listener imaps {
24 }
36 }
38 service pop3-login {
39 inet_listener pop3 {
40 port = 110
41 }
42 inet_listener pop3s {
45 }
54 service lmtp {
55 unix_listener /var/spool/postfix/private/dovecot-lmtp {
56 mode = 0666
57 user = postfix
58 group = postfix
59 }
67 }
88 service auth {
102 unix_listener /var/spool/postfix/private/auth {
103 mode = 0666
104 user = postfix
105 group = postfix
106 }
107 unix_listener auth-userdb {
108 mode = 0600
109 user = vmail
110 }
111 user = dovecot
120 }
122 service auth-worker {
126 user = vmail
127 }
129 service dict {
132 unix_listener dict {
136 }
137 }
10-ssl.conf 파일 구성※ SSL을 선택하여 사용할 수 있으나 현재는 인증서가 없기 때문에 제외(사용 안 함 처리)
[root@localhost ~]# vim /etc/dovecot/conf.d/10-ssl.conf
□[사용 안 함] 8 ssl = no 14 #ssl_cert =
□[사용할 경우] 8 ssl = required 14 ssl_cert =
vmail 권한 설정
※ 메일을 처리할 vmail 계정은 사용자 메일 위치에 액세스를 해야 하므로 아래와 같이 필요한 권한을 부여
[root@localhost ~]# chown -R vmail:vmail /home/vmail
[root@localhost ~]# ls -al /home/vmail | grep eztest
[root@localhost ~]# chown -R vmail:dovecot /etc/dovecot
[root@localhost ~]# chmod -R o-rwx /etc/dovecot
[root@localhost ~]# ls -al /etc | grep dovecotdrwxr-x--- 3 vmail dovecot 5-11 Dovecot 서비스 실행 테스트
[root@localhost ~]# systemctl restart dovecot (서비스 시작)
[root@localhost ~]# systemctl status dovecot | grep Active (Active 되어 있어야 정상 구동) Active: active (running)
RoundCube 설치 및 구성
※ 공식 홈페이지에서 최신 파일 다운, [2020-08-28] 기준으로 [1.4.8] 버전 설치
6-1 RoundCube 다운 및 경로 설정
[root@localhost ~]# wget https://github.com/roundcube/roundcubemail/releases/download/1.4.8/roundcubemail-1.4.8-complete.tar.gz (한줄)
[root@localhost ~]# tar xvzf roundcubemail-1.4.8-complete.tar.gz (압축 해제)
[root@localhost ~]# mv roundcubemail-1.4.8 roundcube (이름 변경)
[root@localhost ~]# mv roundcube /var/www/html/ (경로 이동)
[root@localhost ~]# chown -R apache:apache /var/www/html/ (권한 설정)
[root@localhost ~]# ls -al /var/www/html/ | grep roundcube (변경 확인)
drwxr-xr-x 13 apache apache
[root@localhost ~]# systemctl restart httpd (웹 서버스 시작)
6-2 진행하기 전 웹브라우저 접속 연결을 위한 방화벽 포트 허용
[root@localhost ~]# vi /etc/sysconfig/iptables (추가 후 저장)
## WEB ACCEPT ##
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT
## MAIL ACCEPT ##
-A INPUT -p tcp -m state --state NEW -m tcp --dport 25 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 587 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 465 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 110 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 143 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 993 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 995 -j ACCEPT
[root@localhost ~]# systemctl restart iptables (방화벽 재시작)
웹 브라우저(크롬/엣지)를 통해 URL 접속
http://서버IP/roundcube/installer/ 접속
[CREATE CONFIG] 설정에서 [Database setup] 부분만 세팅 후에 다음 진행




# ls -al /var/www/html/roundcube/config/ | grep config.inc.php
-rw-r--r-- 1 apache apache 2562 8월 28 01:18 config.inc.php
# vim /var/www/html/roundcube/config/config.inc.php
36 $config['default_host'] = 'localhost';
40 $config['support_url'] = '';
52 $config['plugins'] = array('virtuser_query');
53 $config['virtuser_query'] = "SELECT Email FROM postfix_accounts.accounts_table WHERE Email = '%u'";
54 $config['defautl_port'] = 143;
55 $config['smtp_server'] = 'localhost';
56 $config['smtp_port'] = 587;
57 $config['smtp_user'] = '%u';
58 $config['smtp_pass'] = '%p';
59 $config['smtp_auth_type'] = 'LOGIN';
60 $config['debug_level'] = 1;
61 $config['smtp_debug'] = true;
# rm -rf /var/www/html/roundcube/installer/
http://서버IP/roundcube/ 접속

테스트 시 발송은 되었으나 수신이 안되어있어 로그 확인시
□수발신 로그 경로 중 발췌
[root@localhost ~]# cat /var/log/maillog
Aug 28 03:14:24 mail postfix/qmgr[1978]: 0DFD567: from=<test1@eztest.com>, size=662, nrcpt=1 (queue active)
Aug 28 03:14:25 mail postfix/pipe[3204]: 0DFD567: to=<test2@eztest.com>,
relay=dovecot, delay=1194, delays=1194/0.02/0/0.42, dsn=4.3.0, status=defeorary failure.
Command output: lda(test2@eztest.com): Error: net_connect_unix(/var/run/dovecot/stats-writer) failed:
Permission denied Can't open lar/log/dovecot.log: Permission denied)
결과값에 대한 로그를 내보낼 때 dovecot.log 파일이 권한 때문에 Postfix가 제대로 처리를 하지 못함
[root@mail log]# ls -al /var/log | grep dovecot
-rw------- 1 root root 33498 8월 28 03:26 dovecot.log
[root@mail log]# chown vmail:dovecot /var/log/dovecot.log (권한 수정)
[root@mail log]# ls -al /var/log | grep dovecot
-rw------- 1 vmail dovecot 34208 8월 28 03:28 dovecot.log
□수발신은 잘되는 것을 확인했습니다만 또 다른 에러 로그 확인
[root@localhost ~]# cat /var/log/maillog
(delivered via dovecot service (lda(test2@eztest.com):
Error: net_connect_unix(/var/run/dovecot/stats-writer) failed: Permission den))
이것도 역시 권한 문제로 확인됩니다. 다만 통계 데이터를 사용할 일은 없어서 무시해도 됩니다만 어떤 서비스든 사소한 에러 로그라도 없는 게 좋습니다.
□권한 확인
[root@localhost ~]# ls -al /var/run/dovecot/stats-writer
srw-rw---- 1 root dovecot 0 8월 27 22:52 /var/run/dovecot/stats-writer
[root@localhost ~]# chown vmail:dovecot /var/run/dovecot/stats-writer (권한 수정)
[root@mail log]# ls -al /var/run/dovecot/stats-writer
srw-rw---- 1 vmail dovecot 0 8월 27 22:52 /var/run/dovecot/stats-writer
□최종 로그 확인(에러 없이 정상 발송)
[root@localhost ~]# cat /var/log/maillog
Aug 28 04:07:36 mail postfix/qmgr[1978]: BB07767: from=<test1@eztest.com>, size=828, nrcpt=1 (queue active)
Aug 28 04:07:36 mail postfix/pipe[3849]: BB07767: to=<test2@eztest.com>,
relay=dovecot, delay=0.24, delays=0.05/0.01/0/0.18, dsn=2.0.0, status=sent (delivered via dovecot service)
인증서 종류체크
해외 SSL 무료 발급 사이트. 그중 3개의
SSL For Free : https://www.sslforfree.com
ZeroSSL : https://zerossl.com
※ 두 업체의 경우 현재는 파트너로서 협력하고 있는 것으로 보이며 각각의 사이트 메뉴는 다르겠지만 발급 방식은 비슷합니다. (무료가입이 필요하며 관리 정보는 ZeroSSL 사이트에서 발급 및 관리를 하게 됩니다.)
Let's Encrypt : https://letsencrypt.org
또한, 처음 도메인 인증을 받아 3개월 발급받고 그 이후에는 재발급의 번거로움을 없애기 위해 [Certbot]을 이용하여 자동으로 연장이 가능하며 해당 업체에서 무료로 제공할 때까지 무제한입니다. 그렇기에 개인 또는 소중 기업에서 비용 부담 없이 이용

ssl 적용
sudo dnf install epel-release
sudo dnf install certbot python3-certbot-apache mod_ssl
---------------------------------------------
vim /etc/httpd/conf.d/nextcloud.conf
<VirtualHost *:80>
ServerAdmin test123.com
ServerName test123.com
ServerAlias www.test123.com
DocumentRoot /var/www/html
</VirtualHost>
-----------------------------------------------
systemctl restart httpd
certbot certonly -d api.mailstoa.com
//현재 사용중인 크론 목록
crontab -l
//크론 수정
crontab -e
//매월 1일 새벽 3시에 certbot renew 실행하고 , 아파치 재시작
0 3 1 * * /usr/bin/certbot renew --renew-hook="systemctl restart httpd"
-------------------------------------------
rm -rf /etc/httpd/conf.d/nextcloud.conf
--------------------------------------------
/etc/httpd/conf.d/ssl.conf
SSLCertificateFile /etc/letsencrypt/live/test.123/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/test.123/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/test.123/chain.pem
-------------------------
/etc/postfix/main.cf
smtpd_tls_cert_file = /etc/letsencrypt/live/test.123/cert.pem
smtpd_tls_key_file = /etc/letsencrypt/live/test.123/privkey.pem
smtpd_tls_CAfile = /etc/letsencrypt/live/test.123/chain.pem
-----------
/etc/dovecot/con.d/10-ssl.conf
ssl_cert = </etc/letsencrypt/live/test.123/cert.pem
ssl_key = </etc/letsencrypt/live/test.123/privkey.pem
ssl_ca = </etc/letsencrypt/live/test.123/chain.pem
ssl 적용이후 바뀌는 옵션들 체크
# vim /etc/postfix/main.cf
smtpd_sasl_auth_enable = yes
mydestination = localhost
smtpd_use_tls = yes
smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_unauth_destination
virtual_transport = lmtp:unix:private/dovecot-lmtp
systemctl restart postfix
vim /etc/dovecot/conf.d/10-auth.conf
disable_plaintext_auth = no
vim /etc/httpd/conf.d/ssl.conf
<VirtualHost _default_:443>
DocumentRoot "/var/www/html/roundcube"
ServerName test123.com
SSLEngine on
vi /etc/httpd/conf/vhost.conf
<virtualhost *:80>
DocumentRoot /var/www/html/roundcube
ServerName mail.foxydog.co.kr [◁ 해당 주소로 80 포트로 응답 들어올 경우]
Redirect / test123.com [◀ URL로 강제로 리다이렉트]
</virtualhost>
systemctl restart httpd
vim /etc/sysconfig/iptables
-A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT (443 포트 허용 추가)
systemctl restart iptables
netstat -nlp | grep 443
vim /etc/postfix/master.cf
smtps inet n - n - - smtpd
-o syslog_name=postfix/smtps
-o smtpd_tls_wrappermode=yes
-o smtpd_sasl_auth_enable=yes
-o smtpd_recipient_restrictions=permit_sasl_authenticated,reject
-o milter_macro_daemon_name=ORIGINATING
vim /etc/postfix/main.cf
smtpd_use_tls = yes [SSL/TLS 사용]
#smtpd_tls_auth_only = yes [선택사항 강제로 보안 SSL/TLS 사용할 경우에만 적용 권고]
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
smtpd_tls_security_level = may [클라이언트 선택적 SSL/TLS 적용]
smtp_tls_security_level = may [클라이언트 선택적 SSL/TLS 적용]
vim /var/www/html/roundcube/config/config.inc.php
$config['defautl_port'] = 993;
$config['smtp_server'] = 'tls://localhost';
$config['smtp_port'] = 587;
$config['smtp_conn_options'] = array(
'ssl' => array(
'verify_peer' => false,
'verify_peer_name' => false,
),
);
※ 참조 사이트 : https://wiki.archlinux.org/index.php/Roundcube
※ Roundcube Config 옵션 중 [smtp_conn_options]으로 SSL/TLS 수동 설정으로 추가해야 하며 저의 경우는 웹메일에서 발송 시도를 하면 Postfix SMTP(S)로 전달되면서 처리하기 때문에 [fales]만 넣었습니다. Postfix Config 설정에 이미 인증서 옵션을 적용했기 때문에 이중으로 세팅할 필요 없습니다. 필자도 번역본은 의미 전달이 애매하여 직접 테스트를 해보았습니다. 저 옵션을 주지 않을 경우 SSL/TLS 인증 에러가 발생하기 때문에 필수로 넣어야 하는 옵션은 맞는 것으로 판단됩니다.
※ Roundcube Config 설정에 직접 SSL/TLS 세팅할 경우에 자체 (CA) 서명 인증서를 이용할 경우는 [true] 옵션을, 만약 config 발급받은 (CA) 인증서 처리를 하려면 [fales] 설정 후 [cafile / ssl_cert / ssl_key] 인증서 경로를 잡아줘야 합니다.

systemctl restart postfix
vim /etc/postfix/master.cf
vim /etc/dovecot/dovecot.conf
protocols = imap pop3 lmtp
vim /etc/dovecot/conf.d/10-master.conf
service imap-login {
inet_listener imap {
port = 143
}
inet_listener imaps {
port = 993
ssl = yes
}
}
service pop3-login {
inet_listener pop3 {
port = 110
}
inet_listener pop3s {
port = 995
ssl = yes
}
}
Dovecot (10-ssl.conf)
[root@localhost ~]# vim /etc/dovecot/conf.d/10-ssl.conf
※ SSL YES 활성화 및 인증서 경로 설정
ssl = yes
ssl_cert = </etc/ssl/mail.foxydog.co.kr/certificate.crt
ssl_key = </etc/ssl/mail.foxydog.co.kr/private.key
ssl_ca = </etc/ssl/mail.foxydog.co.kr/ca_bundle.crt
Dovecot 서비스 재시작
[root@localhost ~]# systemctl restart dovecot
방화벽
[root@localhost ~]# vim /etc/sysconfig/iptables
## MAIL ACCEPT ##
-A INPUT -p tcp -m state --state NEW -m tcp --dport 25 -j ACCEPT [smtp]
-A INPUT -p tcp -m state --state NEW -m tcp --dport 587 -j ACCEPT [submission]
-A INPUT -p tcp -m state --state NEW -m tcp --dport 465 -j ACCEPT [smtps]
-A INPUT -p tcp -m state --state NEW -m tcp --dport 110 -j ACCEPT [pop3]
-A INPUT -p tcp -m state --state NEW -m tcp --dport 143 -j ACCEPT [imap]
-A INPUT -p tcp -m state --state NEW -m tcp --dport 993 -j ACCEPT [imaps]
-A INPUT -p tcp -m state --state NEW -m tcp --dport 995 -j ACCEPT [pop3s]
[root@localhost ~]# systemctl restart iptables
마이크로소프트 아웃룩 프로그램 이용 테스팅
/var/log/maillog
/var/log/dovecot
에러를 체크를 계속하며 구글링
재부팅이후 권한 문제 및 포트 재확인 테스팅을좀더해바야될뜻