TLS용 디피-헬만 설정 가이드
Guide to Deploying Diffie-Hellman for TLS
이전 포스팅을 통해 암호화 통신을 다운그레이드시킬 수 있는 새로운 암호화 취약점인 Logjam에 대해 소개해드렸습니다.
Logjam 취약점이란?
중간자 공격(MITM)을 통해 사용자와 웹, 또는 이메일 서버 간의 암호화 통신을 다운그레이드시킬 수 있는 취약점입니다. ▶자세히 보기
Logjam 취약점은 TLS 프로토콜 자체의 기본 설계상의 취약점이므로 TSL를 사용하는 웹 브라우저와 메일 서버들은 해당 취약점에 노출될 가능성이 매우 큽니다. 이에 따라, TLS용 디피-헬만을 안전하게 설정하는 세 가지 방법을 소개해드립니다.
1. 수출용 암호 스위트를 비활성화하라.
현재 사용되고 있는 브라우저들이 수출용 스위트를 지원하지 않는다고 하더라도 FREAK과 Logjam 취약점을 통해 중간자 공격을 실시할 수 있습니다. 이러한 공격은 브라우저를 속여 수출용 등급의 암호화법을 사용해 TLS 연결을 복호화시킬 수 있습니다. 수출용 암호화기법(이전 포스팅 참고 ▶)은 1990년대 강력한 암호화 프로토콜이 미국 밖으로 수출되는 것을 막기 위한 목적으로 만들어졌습니다. 이러한 수출용 스위트를 비활성화시키는 경우, 약간의 불리한 점은 존재할 수 있습니다. 그러나 현대의 많은 클라이언트는 수출용 스위트에 의존하지 않고 있지 않습니다.
2. 타원 곡선형 디피-헬만((Ephemeral) Elliptic-Curve Hellman (ECDHE)를 설정하라.
타원-곡선형 디피-헬만(ECDH) 키 교환 방식은 실현 가능하다고 알려진 모든 암호 해독학적 공격을 우회할 수 있습니다. 현대의 웹 브라우저들은 기존의 디피-헬만 방식보다 ECDHE방식을 선호하고 있습니다. 표준 디피-헬만 그룹을 공격하기 위해 사용한 또 다른 로그 알고리즘은 사전계산(precomputation)을 통해 큰 효과를 보지 못했으며, 각각의 서버가 고유의 타원 곡선을 생성할 필요도 없습니다.
3. 강력하고 고유한 디피-헬만 그룹을 생성하라.
단 몇 개의 그룹만이 수백만 개의 서버들에 사용되어, 사전계산(precomputation) 및 잠재적 도청을 위한 타겟이 되고 있습니다. 따라서 관리자들은 반드시 고유한 2048비트 또는 소수를 사용한 강력한 디피-헬만 그룹을 생성해야 합니다.
(1), (2) 단계는 현대의 안전한 암호 스위트를 사용하도록 설정을 변경하는 것만으로 해결할 수 있습니다. 많이 사용되고 있는 서버별로 암호를 정의하는 방법과 고유한 디피-헬만 그룹을 생성하는 방법을 아래와 같이 소개해 드립니다. Qualsys SSL Server Test(▶ 바로가기)를 사용하여 서버를 테스트할 수 있습니다.
어떤 서버 소프트웨어를 사용하던간에 새롭고 고유한 디피-헬만 그룹을 생성해야 합니다. 구글 크롬, 모질라 파이어폭스, MS IE등의 브라우저들은 미니멈 그룹 사이즈를 1024비트로 상향조정했습니다. 새로운 그룹을 생성하는 가장 쉬운 방법은 OpenSSL을 사용하는 것입니다.
openssl dhparam -out dhparams.pem 2048
각각의 서버 제품들을 위한 설정 옵션
(1) 안전한 암호화 스위트 사용
(2) 위에서 생성한 디피-헬먼 파라미터를 명시하는 방법
아래의 암호들은 모질라의 Moderate Cipher List를 기반으로 선택되었습니다.
Apache HTTP Server (mod_ssl)
SSL 파라미터들은 httpd.conf나 특정 가상 호스트에서 세팅할 수 있습니다.
암호 스위트
SSLv2와 SSLv3의 지원을 비활성화시킵니다. 또한 TLS 지원을 활성화한 후 아래의 순서대로 암호들을 허용/비허용합니다.
SSLProtocol all -SSLv2 -SSLv3
SSLCipherSuite ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA
SSLHonorCipherOrder on
DH 파라미터
OpenSSL에 링크되어있는 새로운 버전의 아파치 (2.4.7 이상)에서는 DH 파라미터를 아래와 같이 직접 명시할 수 있습니다.
SSLOpenSSLConfCmd DHParameters "{path to dhparams.pem}"
LibreSSL 아파치를 사용하고 있다면, 이전에 생성한 DH 파라미터를 인증서(certificate)의 끝에 첨부합니다.
Reload 설정
sudo service apache2 reload
nginx
웹사이트 설정 서버블록에 배치 /etc/nginx/sites-enabled/default
암호 스위트
ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
ssl_prefer_server_ciphers on;
DH 파라미터
ssl_dhparam {path to dhparams.pem}
Reload 설정
Microsoft IIS
1. Group Policy Object Editor 오픈 (명령 프롬프트에서 gpedit.msc 를 실행한다.)
2. Computer Configuration, Administrative Templates, Network에서 SSL Configuration Settings를 클릭합니다.
3. SSL Configuration Settings 아래에 SSL Cipher Suite Order 세팅을 오픈합니다.
4. 강력한 암호 스위트 오더를 세팅합니다. MS의 지원 암호들 및 모질라의 TLS 설정에 대한 설명을 참고합니다.
Lighttpd
/etc/lighttpd/lighttpd.conf의 위치에서 변경해야 합니다.
암호 스위트
ssl.cipher-list = "ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA "
DH 파라미터
ssl.dh-file="{path to dhparams.pem}"
Reload 설정
sudo service lighttpd restart
Apache Tomcat
Server.xml 파일(JSSE 용)
<Connector
ciphers="TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_DHE_RSA_WITH_AES_128_GCM_SHA256,TLS_DHE_DSS_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_SHA256,TLS_ECDHE_ECDSA_WITH_AES_128_SHA256,TLS_ECDHE_RSA_WITH_AES_128_SHA,TLS_ECDHE_ECDSA_WITH_AES_128_SHA,TLS_ECDHE_RSA_WITH_AE_256_SHA384,TLS_ECDHE_ECDSA_WITH_AES_256_SHA384,TLS_ECDHE_RSA_WITH_AES_256_SHA,TLS_ECDHE_ECDSA_WITH_AES_256_SHA,TLS_DHE_RSA_WITH_AES_128_SHA256,TLS_DHE_RSA_WITH_AES_128_SHA,TLS_DHE_DSS_WITH_AES_128_SHA256,TLS_DHE_RSA_WITH_AES_256_SHA256,TLS_DHE_DSS_WITH_AES_256_SHA,TLS_DHE_RSA_WITH_AES_256_SHA"
/>
※ 256비트의 AES 암호를 사용하기 위해서는 JCE Unlimited Strength Jurisdiction Policy Files를 설치해야 합니다.
Postfix SMTP
두 개의 파라미터 모두 /etc/postfix/main.cf에 세팅해야 합니다.
암호 스위트
smtpd_tls_exclude_ciphers = aNULL, eNULL, EXPORT, DES, RC4, MD5, PSK, aECDH, EDH-DSS-DES-CBC3-SHA, EDH-RSA-DES-CDC3-SHA, KRB5-DE5, CBC3-SHA
DH 파라미터
smtpd_tls_dh1024_param_file = ${config_directory}/dhparams.pem
Reload 설정
Send Mail
/etc/mail/sendmail.mc의 LOCAL_CONFIG 섹션을 변경해야 합니다.
암호 스위트
O CipherList=ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA
DH 파라미터
O DHParameters={path to dhparams.pem}
Reload 설정
sudo service sendmail restart
Dovecot
/etc/dovecot.conf을 변경해야 합니다.
암호 스위트
ssl_cipher_list=ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA
ssl_prefer_server_ciphers = yes (Dovecot 2.2.6 or greater)
DH 파라미터
#regenerates every week
ssl_dh_parameters_length = 2048
Reload 설정
HAProxy
설정의 글로벌 섹션을 변경해야 합니다.
암호 스위트
ssl-default-bind-ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA
DH 파라미터
OpenSSL을 사용하는 DH 파라미터 파일을 인증서(crt 파일)에 첨부합니다.
※ tune.ssl.default-dh-param 설정 옵션이 DHE에 사용되는 소수의 최대 사이즈로 설정되어 있다면 이를 무시하도록 인증서 파일에 커스텀 파라미터를 삽입해야 합니다.
Reload 설정
sudo haproxy -f haproxy.cfg -p $(</var/run/haproxy-private.pid) -st $(</var/run/haproxy-private.pid)
Amazon Elastic Beanstalk
Predefined SSL 파라미터의 최신 세트(2015-05)는 DHE가 아닌 ECDHE를 사용하기 때문에 Logjam의 영향을 받지 않습니다.
OpenSSH
SSH 프로토콜은 공격자가 수출용 암호로 다운그레이드를 시도한다는 점에서는 Logjam 으로부터 안전합니다. 하지만, 많은 OpenSSH를 포함한 SSH 들이 1024 비트의 Oakley 그룹 2를 포함한 고정 소수를 사용합니다. 이에 따라 두가지의 옵션이 존재합니다. 첫 번째 옵션은 가장 쉬운 방법으로 ECDH를 사용하도록 클라이언트를 설정하는 것입니다. 이는 Curve 25519이며 키 교환 알고리즘을 아래와 같이 설정해야 합니다.
KexAlgorithms curve25519-sha256@libssh.org
비 타원형 곡선 디피-헬만을 계속 지원하기 위해서는 diffie-hellman-group1-sha1 키 교환을 제거하여 그룹1 지원을 비활성화해야 합니다. 2048 비트 소수를 사용하는 diffie-hellman-group14-sha1은 그대로 유지해도 괜찮습니다.
두 번째 옵션은 새로운 고유 디피-헬만 그룹을 생성하는 것입니다.
ssh-keygen -G moduli-2048.candidates -b 2048
ssh-keygen -T moduli-2048 -f moduli-2048.candidates
다음으로 시스템의 moduli 파일에 module-2048을 설치해야 합니다. Debian/Ubuntu는 /etc/ssh/moduli에 존재합니다. SSH는 (사실상 랜덤) 해당 파일에서 선택하므로 새로운 그룹을 덧붙이는 대신, 현재의 moduli 파일을 사용자가 생성한 새로운 그룹으로 교체해야 합니다.
참고:
https://weakdh.org/sysadmin.html
댓글 영역