Rocky Linux - 메일서버 보안 인증서 적용하기 (Roundcube, Postfix, Dovecot) [리뉴얼]

    무료 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

            Redirecthttps://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=<>


    이렇게 해서 메일서버 구축이 최종 완료되었습니다. 이전 포스팅을 보니 생각보다 놓친 부분이 많았네요.

    현재 최종 검수 단계 입니다. 잘못된 점이나 오타가 확인되신다면 문의하시면 수정하도록 하겠습니다.

    Designed by JB FACTORY