Complete Virtual Mail Server/SSL Certificates/ko

From Gentoo Wiki
Jump to: navigation, search
This page is a translated version of the page Complete Virtual Mail Server/SSL Certificates and the translation is 94% complete.

Outdated translations are marked like this.
Other languages:
English • ‎русский • ‎日本語 • ‎한국어

도입부

오늘날 보안과 개인정보 처리는 점점 중요한 문제가 되기에, 서버 보안에 SSL을 활용하는건 쉬워 보입니다. Apache, Courier-imap, postfix 모두 SSL로 보안처리할 수 있습니다.

SSL 설치

SSL은 의존 대상이며 대부분 꾸러미에 대한 컴파일 옵션입니다. dev-libs/openssl 꾸러미는 핵심 요소이며, ssl USE 플래그를 활용하면 끌어옵니다. 만약 활성화하고 업데이트 하기 전에 설정하지 않았다면 이 플래그를 모든 꾸러미에서 사용합니다:

root #emerge --newuse @world

SNI

단일 IP에서 다중 도메인을 활용할 때 몇가지 문제가 일어납니다. Apache는 단일 IP 상에서 여러 인증서를 보유할 수 있게 하는 SNI 를 활용하여 문제를 해결합니다. 하지만 브라우저와 서버 양측에서 이 기능을 지원해야합니다. IMAP(과 POP3) 와 SMTP 그 어느 수단에서도 실제로는 지원하지 않습니다. 단지 단일 IP상의 다중 호스트를 대상으로 인증서를 지원하는 방법은 모든 도메인을 대상으로 하는 인증서를 사용하는 방법입니다. 매력적이진 않지만 동작할 수 있습니다.

SSL 인증서 취득

현재 SSL 인증서를 가져오는 방법에는 두가지 이상의 약간의 방법이 있습니다. 평판이 좋은 인증서 제공자에게 인증서를 구매하는건 선택지 중 하나입니다. 사용자 클라이언트에 경고를 띄우는 방식이긴 하지만 사용자 자체 서명 방식 인증서도 가능합니다. 나머지 절반의 선택지는 인증서를 구매하지 않을 경우 cacert.org에서 발급한 인증서를 활용하는 추천 방식입니다. 메인 브라우저와 운영체제에 인증서를 넣는 방법은 쉽지 않지만, 자유로운데다 꽁짜입니다.

자체 서명

대부분 프로그램에서는 자체 서명 인증서를 미리 만들어두고 /etc/ssl에 설치합니다. 새로 자체 서명한 인증서는 OpenSSL로 쉽게 만들 수 있습니다:

root #mkdir -p /etc/ssl/postfix/
root #cd /etc/ssl/postfix/
root #/etc/ssl/misc/CA.pl -newca
root #/etc/ssl/misc/CA.pl -newreq-nodes
root #/etc/ssl/misc/CA.pl -sign

이 과정에서 /etc/ssl/postfix/newkey.pem, /etc/ssl/postfix/newreq.pem, /etc/ssl/postfix/newcert.pem 파일 세가지를 만들어야하며, 관련 CA 루트 인증서 /etc/ssl/postfix/demoCA/cacert.pem 파일도 만들어야합니다. 파일 이름이 말이 되게 하려면 이름을 바꿔두는것이 좋겠습니다.

CACert.org 서명

CACert.org에서는 SSL 인증서 생성을 돕는 간단한 스크립트를 제공합니다. csr 스크립트를 다운로드하고 실행하면 됩니다. 이 예제에서 IMAP 메일 서버는 mail, pop, pop3, pop3s, imap, foo 등의 이름을 지닌 DNS 별칭을 보유합니다. 물론 용도에 따라 더 추가할 수 있습니다. foo를 추가한 이유는 imap 서비스를 제공하는 시스템의 이름이기 때문입니다 :P postfix, 웹 또는 다른 서버에 foo라는 이름이 붙으면 foo라는 이름을 붙이지 않습니다.

user $sh csr
Private Key and Certificate Signing Request Generator
This script was designed to suit the request format needed by
the CAcert Certificate Authority. www.CAcert.org
 
Short Hostname (ie. imap big_srv www2): foo
FQDN/CommonName (ie. www.example.com) : foo.example.com
Type SubjectAltNames for the certificate, one per line. Enter a blank line to finish
SubjectAltName: DNS:mail.example.com
SubjectAltName: DNS:smtp.example.com
SubjectAltName: DNS:smtps.example.com
SubjectAltName: DNS:imap.example.com
SubjectAltName: DNS:imaps.example.com
SubjectAltName: DNS:pop.example.com
SubjectAltName: DNS:pop3.example.com
SubjectAltName: DNS:pop3s.example.com
SubjectAltName: DNS:mail.example.net
SubjectAltName: DNS:imap.example.net
SubjectAltName: DNS:imaps.example.net
SubjectAltName: DNS:pop.example.net
SubjectAltName: DNS:pop3.example.net
SubjectAltName: DNS:pop3s.example.net
SubjectAltName: DNS:
Running OpenSSL...
Generating a 2048 bit RSA private key
.................+++
..................................+++
writing new private key to '/root/imap.example.com_privatekey.pem'
-----
Copy the following Certificate Request and paste into CAcert website to obtain a Certificate.
When you receive your certificate, you 'should' name it something like foo.example.com_server.pem
 
-----BEGIN CERTIFICATE REQUEST-----
MIIDHTsdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfsdfasdf
<snip>
asdfasdfasdfasdfasdfasdfasdfasdfasdfasdfpyqT
-----END CERTIFICATE REQUEST-----
 
 
The Certificate request is also available in /root/foo_csr.pem
The Private Key is stored in /root/foo_privatekey.pem

CACert.org 전용이 아닌 어떤 루트 인증 기관에서든 사용할 수 있는 인증서 서명 요청을 만들었습니다. 허나, CACert.org에서는 Server Certificates에서 New라는 링크가 있는데, 여기로 들어가면 위에서 언급한 인증서 요청을 여는 편집 상자를 엽니다. -----BEGIN CERTIFICATE REQUEST-----부터 -----END CERTIFICATE REQUEST-----를 포함하는 부분까지 편집 창에 붙여넣어야하며 submit 단추를 눌러 제출해야합니다. 서버넌 요청을 검증하고 요청에 따른 인증서를 만듭니다. 다음 인증서를 복사하여 붙여넣어야 하는데, 인증서의 내용에는 BEGINEND 마커도 새 foo.example.com_crt.pem 파일에 포함해야합니다. 인증서 링크는 ca-cert.org 계정에 연결한 전자메일 주소로 보낼 수 있습니다.

root #cat > foo.example.com_crt.pem
-----BEGIN CERTIFICATE-----
MIIGhzClkjhlkjhlkjhkljhkljhkljhkljhkljhkljhlkjhkljhkljhlkjhkljhk
<snip>
kljhlkjhkljhlkjhlkjhlkjhkljhkljhlkjhlkjhkljhk==
-----END CERTIFICATE-----

여기서 foo.example.com_[privatekey, csr, crt].pem 파일 3개가 나옵니다. 앞으로 이 문서의 다음 절차를 따라 이름을 짓습니다.

참고
인증서를 요청하기 전에 CAcert 웹사이트에서 계정을 만들어야합니다. 로그인을 하고 나면 인증서의 도메인 이름을 등록해야합니다. 등록이 끝나면 인증서 요청을 Server Certificates (New) 페이지에 붙여넣을 수 있습니다.

Apache

Apache 설정은 다른 곳에 충분히 설명했으며, 웹서버에서 SSL이 동작하도록 합니다. postfixadmin을 외부에서 사용한다면, 이상적으로 https를 통해서만 사용하도록 보호해야합니다. 일반적으로 Roundcube 또는 웹 메일을 SSL을 통해 보안처리를 하도록 설정할 수 있지만, 일반 HTTP로 열어둘 수도 있습니다.

하지만 Roundcube는 HTTPS로 모든 요청을 받을 수 있도록 강제로 설정할 수 있는 멋진 선택이 되겠습니다. 이는 사용자가 http://webmail.example.com을 연다면 https://webmail.example.com으로 요청 대상을 즉시 바꾸어 응답을 받는다는 의미입니다. 만약 적당한 SSL 인증서를 사용한다면 강력히 추천합니다. 자체 서명 인증서를 사용하거나 모든 사용자에게 설치한 루트가 없는 CA-cert.org 인증서를 활용한다면, 그 자체로 두어야합니다.

파일 /var/www/webmail.example.com/htdocs/roundcube/config/main.inc.phphttps 강제
$rcmail_config['force_https'] = true;

Courier-imap

차라리 SSL로 IMAP의 보안을 강화하는 편을 더욱 추천합니다. IMAP에서 보안 연결을 활용한다는건 곧 암호를 일반 텍스트로 보낸다고 했을 때 보안 IMAP망 연결을 통해 보안 처리를 하므로 어떤 보안 문제도 일어나지 않음을 의미합니다.

자체 서명 인증서 만들기

Courier-imap에는 SSL 자체 서명을 만드는 mkpop3dcertmkimapdcert 두가지 간단한 스크립트가 있습니다. 이 스크립트는 각각 /etc/courier-imap/pop3d.cnf 파일과 /etc/courier-imap/imapd.cnf 파일을 해석합니다. 자체 서명 인증서를 처음 사용하는 개념일 것이며, 서명한 인증서와 바꿔치기하여 시험과정을 진행하기 더욱 쉽게 합니다. 자체 서명 인증서를 써야한다면 앞서 언급한 파일을 편집하시고, 그렇지 않으면 기본으로도 충분합니다.

root #mkpop3dcert
root #mkimapdcert
경고
현재, #251047 젠투 버그에서 언급한 바와 같이, 설정 파일의 형식이 잘못되어 있어 오류가 나타납니다. 자세한 내용은 버그 보고서에서 확인하십시오.
참고
만들어놓은 인증서는 /etc/courier-imap/pop3d.pem/etc/courier-imap/imapd.pem입니다. 자체 서명 인증서를 고집한다면, 이 파일을 가리키는 설정 파일 기본 경로를 아래에 언급한 바와 같이 확인해야합니다.

CACert.org 서명 인증서 만들기

mkimapdcert 스크립트는 자체 서명 인증서를 만들며, 다른 프로그램에서 동작하고 특별한 형식을 갖췄기에, Courier-imap에서 실제로 파일 세개를 다루지 않으므로 하나의 파일로 합칩니다.

파일은 개인키로 시작합니다.

참고
/etc/ssl에 courier-imap 디렉터리가 없다면, 직접 만들어야합니다.
root #mkdir -p /etc/ssl/courier-imap/
root #cat foo.example.com_privatekey.pem > /etc/ssl/courier-imap/foo.example.com.pem

그 다음 서명 인증서를 따릅니다:

root #cat foo.example.com_crt.pem >> /etc/ssl/courier-imap/foo.example.com.pem

마지막으로 Diffie-Hellman 매개변수를 추가했습니다:

root #openssl gendh 1024 >> /etc/ssl/courier-imap/foo.example.com.pem

결과는 다음과 같아야합니다:

파일 /etc/ssl/courier-imap/foo.example.com.pemimap 인증서
-----BEGIN PRIVATE KEY-----
MIIEvaasdfasdfSfasdfadfasdfasdfasdfasdfasdfasdfasdfasdsahdahhgfh
<snip>
asdfasdfasdfsdfsdf

BEGIN CERTIFICATE REQUEST----- MIIDHTsdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfsdfasdf <snip> asdfasdfasdfasdfaswYEdpa+rdFfs=
END PRIVATE KEY-----
END CERTIFICATE REQUEST-----
BEGIN CERTIFICATE----- MIIGhzClkjhlkjhlkjhkljhkljhkljhkljhkljhkljhlkjhkljhkljhlkjhkljhk <snip> kljhlkjhkljhlkjhlkjhlkjhkljhkljhlkjhlkjhkljhk==
END CERTIFICATE-----
BEGIN DH PARAMETERS----- MIGHAoGBAPF7fJnfw+VPPev9FAkf2XJNFimn4ik+zkXXuHD5t9Oke1Yx224WTocq KJ+Zv9onecK0MPYRUj8PPqqy+Q00pScW9+qPSr9T2sEG/meKjLqqA3XQf4Gwzqco SUG0PEjiYNNfe966p9E1vp6yN5+gSyu6zv9Vn+cfYY2q7d3a4x9rAgEC
END DH PARAMETERS-----

SSL 설정

위에 언급한 바와 같이 인증서에는 imap 호스트 이름으로 pop3를 보유하며, 따라서 동일한 IP/호스트에 pop3와 imap 서비스를 구동한다고 가정합니다. 필요하진 않지만 pop3는 동일한 인증서(추천 안함) 또는 자체 인증서로 돌아가는 전혀 다른 머신이 될 수 있습니다.

POP3

파일 /etc/courier-imap/pop3d-ssl인증서 설정
##NAME: POP3DSSLSTART:0
POP3DSSLSTART=YES
 
##NAME: TLS_CERTFILE:0
TLS_CERTFILE=/etc/ssl/courier-imap/foo.example.com.pem

서버를 시작할 때 SSL에서 pop3를 동작하게 해야합니다:

root #/etc/init.d/courier-pop3-ssl restart

IMAP

파일 /etc/courier-imap/imapd-ssl인증서 설정
##NAME: IMAPDSSLSTART:0
IMAPDSSLSTART=YES
 
##NAME: TLS_CERTFILE:0
TLS_CERTFILE=/etc/ssl/courier-imap/foo.example.com.pem

서버를 시작할 때 IMAP이 SSL에서 동작하도록 해야합니다:

root #/etc/init.d/courier-imapd-ssl restart

SSL 시험

텔넷을 더이상 사용할 수 없기에 시험 과정이 까다로울 수 있습니다. 최적의 선택지는 썬더버드 같은 메일 클라이언트를 시작하고, 앞서 텔넷이 정상적으로 동작한바와 같이 모든 기능이 제대로 동작하는지 확인하도록 일반 연결을 우선 설정하며, 잘 동작한다면 계정의 SSL 옵션을 활성화해야합니다. 기본 imap-ssl 포트는 993입니다. STARTTLS 기능 동작 여부를 텔넷으로 확인하려는 목적만으로 활성화했는지는 STARTTLS로 확인할 수 있습니다.

참고
일부 전자메일 클라이언트는 비호환 TLS 구현체를 지니고 있으니, 이 클라이언트를 동작하게 하려면 /etc/courier-imap/imapd-ssl에 있는 TLS_STARTTLS_PROTOCOL 값을 TLS1을 SSL3로 바꾸시면 됩니다(하지만 SSL 3.0은 고유 취약성으로 인해 사용을 권장하지 않습니다. 역자 주.).

기대하던대로 SSL 보안 서비스가 동작한다면 기본 런레벨에 추가할 수 있습니다:

root #rc-update add courier-pop3d-ssl default
root #rc-update add courier-imapd-ssl default
참고
이전에 언급한바와 같이 정말 필요한 경우에만 pop3를 추가하십시오.

SSL로 SMTP 보안 처리

postfix에서 활용할 인증서는 /etc/ssl/postfix/에 저장하거나 courier-imap에서 같은 인증서를 사용하는 경우 마찬가지로 /etc/ssl/postfix/에 저장해야합니다. CACert.org 인증서를 사용한다면 루트 인증서를 사용해야합니다. 젠투는 CACert.org 루트 인증서를 미리 설치하며 이 인증서를 활용해야합니다.

파일 /etc/postfix/main.cfSMTP 인증서 설정
# SSL Authentication
smtpd_tls_security_level = may
smtpd_tls_auth_only = no
smtpd_tls_loglevel = 3
smtpd_tls_key_file = /etc/ssl/postfix/foo.example.com_privatekey.pem
smtpd_tls_cert_file = /etc/ssl/postfix/foo.example.com_crt.pem
smtpd_tls_CAfile = /etc/ssl/certs/cacert.org_root.pem
smtpd_tls_received_header = yes
smtpd_tls_session_cache_timeout = 3600s
tls_random_source = dev:/dev/urandom
참고
디버깅 목적으로 smtp_tls_loglevel 값을 "3"으로 올리십시오. 사용자(와 웹메일)가 안전하지 않게 로그온할 수 있게 smtpd_tls_auth_only # no 로 설정하십시오. 이 옵션값을 yes로 설정하면 모든 클라이언트는 인증 연결만을 사용해야합니다.
참고
CaCert 파일은 보통 /etc/ssl/certs/cacert.org.pem 이름을 지니고 있지만 /etc/ssl/certs/cacert.org_root.pem 이름으로 바뀌어있습니다.

이제 STARTTLS는 포트 25번을 통해 인증 연결을 활용할 수 있습니다. 하지만, 465(smtps)번 포트의 SSL/TLS지원도 마찬가지로 활성화해야 합니다. Courier-imap은 자동으로 처리합니다만 postfix는 master.cf 내용을 바꾸어야합니다:

파일 /etc/postfix/master.cfsmtps 지원 활성화
smtps     inet  n       -       n       -       -       smtpd
  -o smtpd_tls_wrappermode=yes

SSL로 보안 처리한 데몬을 시작하려면 postfix를 다시 시작하십시오:

root #/etc/init.d/postfix restart

시험

텔넷은 간단한 시험 용도만으로 활용할 수 있습니다. 실제로는 지원 옵션을 확인하는 용도로만 사용할 수 있습니다. STARTTLS는 지원 옵션중 하나로 떠야합니다.

user $telnet foo.example.com 25
220 foo.example.com ESMTP Postfix
EHLO example.com
250-mail.example.com
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-STARTTLS
250-AUTH LOGIN PLAIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
quit
221 2.0.0 Bye
Connection closed by foreign host.

원하는데로 모든 연결이 돌아가는지 시험한다면, 최신 버전의 썬더버드가 가장 잘 동작합니다. 계정을 새로 추가할 때 썬더버드에서는 STARTTLS를 활용하여 기본 포트로 연결을 시도합니다. 문제가 발생했거나 수동 연결을 시도하는 경우, SSL/TLS를 993번 또는 465번 포트를 통해 재시험 단추를 눌러 진행할 수 있습니다. 보안 연결을 통해 계정을 만들 수 있게 해야합니다.

서버간 연결 보안

postfix는 메일을 보낼 목적으로 다른 smtp 서버로 연결할 때 보안 연결을 사용해볼 수 있습니다. 모든 서버에서 지원하지 않겠지만, 활성화할 수는 있습니다.

파일 /etc/postfix/main.cf전자메일 전송시 TLS 사용 시도
# Enable TLS for sending mails if supported by other server
smtp_tls_security_level = may
smtp_tls_CApath = /etc/ssl/certs
smtp_tls_loglevel = 3
참고
디버깅 목적으로 smtp_tls_loglevel 값을 "3"으로 올리십시오. smtp_tls_security_level 값은 TLS 연결로만 메일을 보내도록 "encrypt"값으로 설정할 수 있습니다. 하지만 인터넷의 대부분 모든 서버가 TLS를 추천하지 않거나 호환 상태가 아니므로 추천하지 않습니다.

다음 postfix를 다시 시작하십시오:

root #/etc/init.d/postfix restart

동작하는지 시험하려면, TLS를 지원하는 서버의 주소로 메일을 보낼 수 있습니다. 기록에는 다음과 같은 내용이 있어야합니다:

user $tail -n 10 /var/log/mail/mailinfo.log
...
postfix/smtp[15209]: Trusted TLS connection established to mx.example.com[x.x.x.x]:25: TLSv1 with cipher AES256-SHA (256/256 bits)
...

마무리

모든 부분이 기대한대로 동작한다면, 기록을 꺼도 됩니다:

파일 /etc/postfix/main.cf로깅 비활성화
smtpd_tls_loglevel = 0
smtp_tls_loglevel = 0