무료 SSL 보안인증서[Let's Encrypt] 발급받기 : https://foxydog.tistory.com/63
이제 받은 인증서를 가지고 Roundcube 메일서버 SSL 보안 인증서를 적용해보도록 하겠습니다.
Roundcube 메일서버는 Apache로 구성되어 있으므로 httpd.conf 설정을 수정을 하면 되며 SMTP를 통해 메일을 주고받을 경우와 POP/IMAP 클라이언트 이용 시에도 SSL로 인증하기 위한 Postfix, Dovecot 설정도 같이 알아보도록 하겠습니다.
메일서버 구축 참고 : https://foxydog.tistory.com/104
※ 인증서 확인
Let's Encrypt 통해 인증서를 발급받았다면 기본 생성 경로는 아래와 같습니다.
[root@localhost ~]# ls -al /etc/letsencrypt/archive/mail.foxydog.co.kr/
-rw-r--r-- 1 root root 1854 6월 2 02:42 cert1.pem [인증서 파일]
-rw-r--r-- 1 root root 3749 6월 2 02:42 chain1.pem [인증서(체인) 파일]
-rw-r--r-- 1 root root 5603 6월 2 02:42 fullchain1.pem [인증서 종합(Cert+Chain) 파일]
-rw------- 1 root root 1704 6월 2 02:42 privkey1.pem [인증서(Key)파일]
STEP01 - Roundcube Apache에 보안 인증서 적용
※ 진행하기 전 Apache 보안 인증서를 이용하기 위해서는 [mod_ssl] 모듈이 꼭 설치가 되어있어야 합니다. 만약 설치 안 하고 적용하면 " Invalid command 'SSLEngine', perhaps misspelled or defined by a module not included in the server configuration " 에러가 발생합니다.
[root@localhost ~]# dnf install mod_ssl [SSL 모듈 설치]
① Apache ssl.conf 인증서 설정하기
※ RPM설치 시 기본 경로에 ssl.conf 파일이 생성됩니다.
※ 꼭 아래에 설정 파일에 할 필요는 없으며 vhost.conf 별도의 가상 호스트 설정이 있다면 최소 아래 값들을 등록하면 됩니다.
[root@localhost ~]# vim /etc/httpd/conf.d/ssl.conf [파일 수정]
5 Listen 443 https
40 <VirtualHost _default_:443> [▷ 시작 지점]
44 DocumentRoot "/var/www/html/roundcube" [#주석 제거 후 RoundCube 설치 경로 입력]
46 ServerName mail.foxydog.co.kr [#주석 제거 후 메일서버 접속 호스트 주소 입력]
56 SSLEngine on [SSL엔진 사용 여부]
88 SSLCertificateFile /etc/letsencrypt/archive/mail.foxydog.co.kr/cert1.pem [인증서 경로 변경]
97 SSLCertificateKeyFile /etc/letsencrypt/archive/mail.foxydog.co.kr/privkey1.pem [인증서(개인키) 경로 변경]
107 SSLCertificateChainFile /etc/letsencrypt/archive/mail.foxydog.co.kr/chain1.pem [인증서(체인) 경로 변경]
207 </VirtualHost> [◀끝 지점(이 범위 안에 각 옵션 포함 적용)]
[참고]
[SSLCACertificateFile / SSLCertificateChainFile] 이 두 개의 옵션이 [root(루트) / Chain(체인)] 인증서를 설치할 때 가장 많이 혼동할 수 있는 부분인데요, 이렇게 생각하시면 편합니다.
패턴 1. CA 번들[ca_bundle] 형태로 인증서를 받았을 경우
ca_bundle.crt(pem) 인증서는 [루트 / 체인]이 같이 통합된 파일입니다. 인증서 업체에서 처음부터 번들 형태로 발급을 해준다면 [SSLCACertificateFile] 에만 적용해주면 됩니다.
패턴 2. [루트 / 체인] 두 개로 나누어 받았을 경우
AAACertificateServices.crt (루트) / chain-bundle.pem (체인) 예시와 같이 따로 받았을 경우는 각각 추가로 등록을 해줘야 합니다.
SSLCACertificateFile /.../AAACertificateServices.crt (루트)
SSLCertificateChainFile /.../chain-bundle.pem (체인)
만약 번들로 통합하고 싶다면 아래와 같이 진행
※ 통합 방법[cat 루트 인증서 체인 인증서 > 변경할 이름.crt(pem)]
[root@localhost ~]# cat AAACertificateServices.crt chain-bundle.pem > Ca_bundle.crt(pem)
② 무조건 보안접속을 위한 HTTP(80) → HTTPS(443) URL 강제 리다이렉트 설정
※ 리다이렉트를 사용하기 위한 RewriteEngine 설치 확인 [RPM 설치 시 기본 모듈 포함]
[root@localhost ~]# httpd -t -D DUMP_MODULES | grep -i rewrite [확인 방법]
rewrite_module (shared) [사용 확인]
[root@localhost ~]# vim /etc/httpd/conf.d/vhost.conf [파일 새로 생성]
패턴 1. RewriteEngine을 이용한 적용
<VirtualHost *:80>
DocumentRoot /var/www/html/roundcube
ServerName mail.foxydog.co.kr
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R,L]
</VirtualHost>
패턴 2. Redirect을 이용한 단순 적용
<VirtualHost *:80>
DocumentRoot /var/www/html/roundcube
ServerName mail.foxydog.co.kr
Redirect / https://mail.foxydog.co.kr
</VirtualHost>
[참고]
두 개의 차이점은 [호스트 주소]가 변경이 되는지에 대한 차이입니다.
제가 사용하는 도메인을 예시로
1. http://[A.foxydog.co.kr / B.foxydog.co.kr] [호스트 주소]가 변경이 되는 사이트라면 패턴 1의 RewriteEngine을 사용, 어떤 호스트 정보가 들어오더라도 https로 처리
2. http://[mail.foxydog.co.kr] [호스트 주소]가 절대값으로 변경되지 않는다면 단순 Redirect 사용
필자는 가장 무난한 패턴 1로 해보겠습니다.
③ Apache 서비스 재시작
[root@localhost ~]# systemctl restart httpd
④ 방화벽 허용[Firewall] 및 응답 확인
※ HTTPS 접속을 위해 기본 포트인 443을 허용합니다.
[root@localhost ~]# firewall-cmd --permanent --add-port=443/tcp [추가]
success
[root@localhost ~]# firewall-cmd --reload [적용]
success
[root@localhost ~]# netstat -nlp |grep 443 [적용 확인]
tcp6 0 0 :::443 :::* LISTEN [정상 응답] 32943/httpd
⑤ 웹메일 접속 인증서 확인[HTTPS URL 리다이렉트 확인]
STEP02 - Roundcube, Postfix 웹메일 SSL/TLS설정 사용하기
① Postfix[master.cf]설정 수정
[root@localhost ~]# vim /etc/postfix/master.cf
※ 아래 (#)주석 제거
smtps inet n - n - - smtpd
-o syslog_name=postfix/smtps
-o smtpd_sasl_auth_enable=yes
-o smtpd_relay_restrictions=permit_sasl_authenticated,reject
-o milter_macro_daemon_name=ORIGINATING
② Postfix[main.cf]설정 수정
[root@localhost ~]# vim /etc/postfix/main.cf
※ 아래 (#)주석 해제 또는 추가 SSL/TLS 관련 설정
smtpd_use_tls = yes [SSL/TLS 사용]
#smtpd_tls_auth_only = yes [선택사항 강제로 보안 SSL/TLS 사용할 경우에만 적용]
smtpd_tls_cert_file = /etc/letsencrypt/archive/mail.foxydog.co.kr/cert1.pem [인증서(CRT) 경로]
smtpd_tls_key_file = /etc/letsencrypt/archive/mail.foxydog.co.kr/privkey1.pem [인증서(KEY) 경로]
smtpd_tls_CAfile = /etc/letsencrypt/archive/mail.foxydog.co.kr/chain1.pem [인증서(CA) 번들 경로]
smtpd_tls_security_level = may [클라이언트 선택적 SSL/TLS 적용]
smtp_tls_security_level = may [클라이언트 선택적 SSL/TLS 적용]
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
③ Postfix 서비스 재시작 및 SMTPS[465]활성화 확인
[root@localhost ~]# systemctl restart postfix [서비스 재시작]
[root@localhost ~]# netstat -nlp |grep 465 [포트 확인]
tcp 0 0 0.0.0.0:465 0.0.0.0:* LISTEN [정상 응답] 34443/master
tcp6 0 0 :::465 :::* LISTEN [정상 응답] 34443/master
[root@localhost ~]# telnet localhost 465 [포트 접속 테스트]
Trying ::1...
Connected to localhost.
Escape character is '^]'.
220 mail.foxydog.co.kr ESMTP Postfix [정상 응답]
④ Roundcube config 파일 수정
[root@localhost ~]# vim /var/www/html/roundcube/config/config.inc.php
※ 특정 옵션 보안 포트 변경 및 URL SSL/TLS 추가 설정
$config['defautl_port'] = 993;
$config['smtp_server'] = 'tls://localhost';
$config['smtp_port'] = 465;
$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 적용한 상태에서 SMTP연결 시도를 하면 RoundCube에서도 인증 시도를 하려고 하기 때문에 이 옵션은 필수로 넣어야 합니다.
※ $config['smtp_conn_options'] 옵션을 넣지 않으면 다음과 같은 에러가 발생한다.
[root@localhost ~]# tail -f /var/log/maillog [로그 확인]
Jun 4 06:27:09 mail postfix/smtps/smtpd[34683]: SSL_accept error from localhost[::1]: -1
Jun 4 06:27:09 mail postfix/smtps/smtpd[34683]: warning: TLS library problem: error:14094418:SSL routines:ssl3_read_bytes:tlsv1 alert unknown ca:ssl/record/rec_layer_s3.c:1544:SSL alert number 48:
⑤ 웹 접속 및 발송 최종 테스트
◇ RoundCube 로그인 인증 테스트 시 다음과 같은 메시지[secured]가 추가로 붙어 있다면 SSL/TLS인증으로 보안 처리가 되고 있다는 뜻
[root@localhost ~]# tail -f /var/log/dovecot.log [로그 확인]
Jun 04 06:39:36 imap-login: Info: Login: user=<foxydog@foxydog.co.kr>, method=PLAIN, rip=::1, lip=::1, mpid=34732, secured [보안 연결], session=<8D352pzgrMAAAAAAAAAAAAAAAAAAAAAB>
◇ RoundCube 웹메일에서 SMTPS[465] 보안 발송
[root@localhost ~]# tail -f /var/log/maillog [로그 확인]
Jun 4 06:50:59 mail postfix/smtps/smtpd[34759]: connect from localhost[::1] [◁ SMTPS 시작]
Jun 4 06:50:59 mail postfix/smtps/smtpd[34759]: discarding EHLO keywords: CHUNKING
Jun 4 06:50:59 mail postfix/smtps/smtpd[34759]: discarding EHLO keywords: CHUNKING
Jun 4 06:50:59 mail postfix/smtps/smtpd[34759]: 8714F800FD: client=localhost[::1], sasl_method=LOGIN, sasl_username=foxydog@foxydog.co.kr
Jun 4 06:50:59 mail postfix/cleanup[34773]: 8714F800FD: message-id=<메시지ID>
Jun 4 06:50:59 mail postfix/qmgr[34445]: 8714F800FD: from=
<foxydog@foxydog.co.kr>, size=722, nrcpt=1 (queue active)
Jun 4 06:50:59 mail postfix/smtps/smtpd[34759]: disconnect from localhost[::1] ehlo=2 starttls=1 auth=1 mail=1 rcpt=1 data=1 quit=1 commands=8 [◀ SMTPS 통신 끝]
Jun 4 06:50:59 mail postfix/smtp[34775]: 8714F800FD: to=<수신자>, relay=수신 메일서버 MX [IP]:25, delay=0.44, delays=0.08/0.04/0.08/0.23, dsn=2.0.0, status=sent (250 2.0.0 OK - nsmtp) [발송 성공]
STEP03 - POP/IMAP 메일 클라이언트 SSL/TLS설정 사용하기
① Postfix[master.cf] 설정 수정
[root@localhost ~]# 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
※ smtpd_tls_wrappermode 이 옵션이 Roundcube와 Postfix 정책과는 SSL/TLS 처리하는 게 다르다 보니 이것을 사용할 경우 내부(localhost) 465 포트 통신이 안되기 때문에 Roundcube config 설정을 해도 처리를 하지 못합니다. 그래서 웹의 경우는 인증서를 적용하더라도 SSL/TLS를 포기해야 하는 상황이 발생합니다. 전체 구글을 찾아보았지만 자료가 부족하기도 하고 옵션도 많기 때문에 가능한 방법을 찾게 되면 추가 업로드하도록 하겠습니다. 일단 웹메일과 POP3S/IMAPS 클라이언트를 같이 사용하기 위해 다음과 같이 진행
② Roundcube config 파일 수정
[root@localhost ~]# vim /var/www/html/roundcube/config/config.inc.php
$config['smtp_port'] = 587; [submission 포트로 변경]
※ 최근에는 SMTP 기본 25 포트를 인터넷 공급자[ISP] 단에서 보안에 취약하다고 특히 해외에서는 차단하는 경우가 많아졌습니다. 클라이언트를 이용할 경우 대체 포트 587[submission] 사용하는 게 좋습니다.
③ Dovecot[10-auth.conf] 파일 수정
[root@localhost ~]# vim /etc/dovecot/conf.d/10-auth.conf
disable_plaintext_auth = no
※ [선택사항] 강제로 보안 SSL/TLS 적용하실 경우는 YES, 클라이언트 POP/IMAP 세팅 시 무조건 보안 포트 995/993로 해야 연결이 가능합니다. 혼합으로 사용할 경우는 NO 세팅
④ Dovecot[10-master.conf] 파일 수정
[root@localhost ~]# vim /etc/dovecot/conf.d/10-master.conf
※ IMAPS (#)주석 제거하여 SSL/TLS 활성화
inet_listener imaps {
port = 993
ssl = yes
}
※ POP3S (#)주석 제거하여 SSL/TLS 활성화
inet_listener pop3s {
port = 995
ssl = yes
}
⑤ Dovecot[10-ssl.conf] 파일 수정
[root@localhost ~]# vim /etc/dovecot/conf.d/10-ssl.conf
※ SSL/TLS 활성화 및 인증서 경로 설정
ssl = yes
ssl_cert = </etc/letsencrypt/archive/mail.foxydog.co.kr/cert1.pem
ssl_key = </etc/letsencrypt/archive/mail.foxydog.co.kr/privkey1.pem
ssl_ca = </etc/letsencrypt/archive/mail.foxydog.co.kr/chain1.pem
※ 사용할 최소 SSL/TLS 프로토콜 버전[선택 사항]
#ssl_min_protocol = TLSv1.2
프로토콜 통신할 경우 최소 무조건 TLSv1.2 이상 통신, 최대 TLSv1.3까지 지원하며 사용하는 OpenSSL 버전에 따라 적용할 수 있는 조건이 다릅니다. 필자는 이번에는 세팅하지 않고 넘어갑니다.
⑥ Dovecot 서비스 재시작 및 IMAPS[993], POP3S[995]활성화 확인
[root@localhost ~]# systemctl restart dovecot [서비스 재시작]
[root@localhost ~]# netstat -nlp | egrep "993|995" [포트 확인]
tcp 0 0 0.0.0.0:993 0.0.0.0:* LISTEN [정상응답] 35068/dovecot
tcp 0 0 0.0.0.0:995 0.0.0.0:* LISTEN [정상응답] 35068/dovecot
tcp6 0 0 :::993 :::* LISTEN [정상응답] 35068/dovecot
tcp6 0 0 :::995 :::* LISTEN [정상응답] 35068/dovecot
⑦ 방화벽 허용[Firewall]
※ 외부 메일 클라이언트를 연결을 위해 보안 포트 SSL/TLS POP3S(995)/IMAPS(993)/SMTPS(465)연결을 허용 합니다.
[root@localhost ~]# firewall-cmd --permanent --add-port=465/tcp --add-port=993/tcp --add-port=995/tcp [추가]
success
[root@localhost ~]# firewall-cmd --reload [적용]
success
⑧ 마이크로소프트 아웃룩 프로그램을 이용하여 인증 시도
◇ IMAPS(993) 세팅 인증 확인
[root@localhost ]# tail -f /var/log/dovecot.log [로그 확인]
Jun 04 09:07:48 imap-login: Info: Login: user=<foxydog@foxydog.co.kr>, method=PLAIN, rip=접속IP, lip=서버IP, mpid=35804, TLS [보안 연결], session=<>
◇ POP3S(995) 세팅 인증 확인
[root@localhost ]# tail -f /var/log/dovecot.log [로그 확인]
Jun 04 09:14:51 pop3-login: Info: Login: user=<foxydog@foxydog.co.kr>, method=PLAIN, rip=접속IP, lip=서버IP, mpid=35844, TLS [보안 연결], session=<>
이렇게 해서 메일서버 구축이 최종 완료되었습니다. 이전 포스팅을 보니 생각보다 놓친 부분이 많았네요.
현재 최종 검수 단계 입니다. 잘못된 점이나 오타가 확인되신다면 문의하시면 수정하도록 하겠습니다.
'◈『Open(Source) Solution』 > 메일서버(RoundCube)' 카테고리의 다른 글
Rocky Linux - 메일서버(Postfix) SPF 정책 적용 (2) | 2022.06.20 |
---|---|
Rocky Linux - 메일서버 구축 트러블슈팅(troubleshooting) (0) | 2022.06.04 |
Rocky Linux - 메일서버 구축(Postfix, Dovecot, MariaDB And Roundcube) [리뉴얼] (50) | 2022.05.30 |
CentOS 8 - Roundcube 메일 보안 인증서 적용하기 (Postfix, Dovecot) (0) | 2020.11.06 |
CentOS 8 - Roundcube 메일 보안 인증서 적용하기 (Apache) (0) | 2020.11.04 |