CentOS 8 +dovecot +postfix+mariaDB+Roundcube+letsencrypt =Emailserver

2021. 11. 17. 11:39

개인 세부 설정은 개인취향에 따라 적용
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 `postfix_accounts`.`domains_table` ( `DomainId` INT NOT NULL AUTO_INCREMENT , `DomainName` VARCHAR(50) NOT NULL , PRIMARY KEY (`DomainId`)) ENGINE = InnoDB;

 

사용자 계정을 보관할 테이블 만들기(전체 한 줄)

MariaDB [(none)]> CREATE TABLE `postfix_accounts`.`accounts_table` (
    `AccountId` INT NOT NULL AUTO_INCREMENT,
    `DomainId` INT NOT NULL,
    `password` VARCHAR(300) NOT NULL,
    `Email` VARCHAR(100) NOT NULL,
    PRIMARY KEY (`AccountId`),
    UNIQUE KEY `Email` (`Email`),
    FOREIGN KEY (DomainId) REFERENCES domains_table(DomainId) ON DELETE CASCADE
) ENGINE = InnoDB;

 

별칭 사용자 계정을 보관할 테이블 만들기(전체 한 줄)

별칭은 일종의 리다이렉션처럼 A계정이 수신을 받으면 B계정으로 받는 기능

MariaDB [(none)]> CREATE TABLE `postfix_accounts`.`alias_table` (
    `AliasId` INT NOT NULL AUTO_INCREMENT,
    `DomainId` INT NOT NULL,
    `Source` varchar(100) NOT NULL,
    `Destination` 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 `postfix_accounts`.`domains_table` (DomainName) VALUES ('test123.com');

 

□test1@eztest.com 계정 생성

MariaDB [(none)]> INSERT INTO `postfix_accounts`.`accounts_table` (DomainId, password, Email) VALUES (1, ENCRYPT('test123', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))), 'test1@test123.com');

 

□test2@eztest.com 계정 생성

MariaDB [(none)]> INSERT INTO `postfix_accounts`.`accounts_table` (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 `postfix_accounts`.`alias_table` (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 

에러를 체크를 계속하며 구글링

재부팅이후  권한 문제 및  포트 재확인 테스팅을좀더해바야될뜻