Ubuntu/Debian 서버에서 Logjam 취약점 방어하기
TL;DR
서버에서 Diffie-Hellman(DH) 기반 Logjam 공격을 막으려면 고유한 DH 파라미터 파일을 생성하고(Apache, Nginx, Postfix, Dovecot, Pure-FTPd 등) 각 서비스의 암호화 설정에서 약한 암호화 조합을 비활성화하세요. 이 가이드는 명령어와 구성 위치를 단계별로 제공합니다. 주요 점검: dhparams.pem 생성, 각 서비스에 DH 파라미터 적용, 서비스 재시작.
소개
이 튜토리얼은 최근 발견된 Logjam 공격으로부터 Ubuntu 또는 Debian 리눅스 서버를 보호하기 위한 절차를 설명합니다. Logjam은 Diffie-Hellman 키 교환을 표적화하는 공격으로 HTTPS, TLS, SMTPS, SSH 등에서 영향을 줄 수 있습니다. 자세한 기술적 설명은 https://weakdh.org/에서 확인하세요.
이 가이드는 ISPConfig 3가 설치된 Debian/Ubuntu 시스템과 호환됩니다. 모든 명령은 셸에서 루트(root) 권한으로 실행해야 합니다.
사전 요구사항
- 루트 또는 sudo 권한
- openssl, apache2/nginx/postfix/dovecot/pure-ftpd 설치 여부 확인
- /etc/ssl/private 디렉터리에 쓰기 권한
중요: 운영 중인 서버에서 설정 변경 전에 구성 파일과 인증서의 백업을 반드시 받아두세요.
고유한 DH 그룹 생성
서버를 보호하는 첫 단계는 openssl로 고유한 DH 그룹을 생성하는 것입니다. 예시에서는 /etc/ssl/private/dhparams.pem 파일을 사용합니다. 해당 디렉터리가 없으면 생성합니다:
mkdir -p /etc/ssl/private
chmod 710 /etc/ssl/private
dhparams 파일을 생성하고 보안 권한을 설정합니다:
cd /etc/ssl/private
openssl dhparam -out dhparams.pem 2048
chmod 600 dhparams.pem
참고: 2048 비트는 현실적인 보안-성능 균형입니다. 더 높은 보안을 원하면 4096 비트를 고려하되 생성 시간이 크게 늘어납니다.
Apache 설정
먼저 weakdh.org 권장 사항 기반의 안전한 암호화 스위트를 추가합니다. /etc/apache2/mods-available/ssl.conf 파일을 열어 수정하세요:
nano /etc/apache2/mods-available/ssl.conf
다음 줄을 추가하거나 변경합니다: (SSLCipherSuite는 한 줄로 유지하세요)
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
두 번째로 Apache에서 DH 파라미터를 설정합니다. SSLOpenSSLConfCmd 옵션은 Apache 2.4.8 이상과 OpenSSL 1.0.2 이상에서만 사용 가능합니다. 먼저 버전을 확인하세요:
apache2 -v
그리고 OpenSSL 버전도 확인:
openssl version
예시에서 Apache가 2.2.x이거나 OpenSSL이 1.0.1 같은 구버전이면 SSLOpenSSLConfCmd를 사용할 수 없습니다. 이 경우에도 SSLCipherSuite를 조정하는 것만으로도 약한 암호를 많이 비활성화할 수 있습니다.
Apache와 OpenSSL 버전이 조건을 충족하면 ssl.conf에 다음 줄을 추가하세요:
SSLOpenSSLConfCmd DHParameters "/etc/ssl/private/dhparams.pem"
그리고 Apache를 재시작합니다:
service apache2 restart
중요: SSLOpenSSLConfCmd를 활성화하면 Apache는 OpenSSL 구성에서 DH 파라미터를 직접 사용합니다. 버전 호환성을 먼저 확인하세요.
Nginx 설정
/etc/nginx/nginx.conf 파일을 열고 http { … } 블록 안에 다음을 추가 또는 교체하세요:
nano /etc/nginx/nginx.conf
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;
ssl_dhparam /etc/ssl/private/dhparams.pem;
설정 후 Nginx를 재시작합니다:
service nginx restart
노트: Nginx 설정 파일의 위치는 배포판 및 패키지에 따라 달라질 수 있습니다(예: /etc/nginx/sites-enabled/*.conf). 전체 http 블록이 아닌 서버 블록에서 설정을 오버라이드하지 않도록 주의하세요.
Postfix 설정
Postfix에 안전한 암호화 스위트와 DH 파일을 지정하려면 다음 명령을 실행하세요:
postconf -e "smtpd_tls_mandatory_exclude_ciphers = aNULL, eNULL, EXPORT, DES, RC4, MD5, PSK, aECDH, EDH-DSS-DES-CBC3-SHA, EDH-RSA-DES-CDC3-SHA, KRB5-DE5, CBC3-SHA"
postconf -e "smtpd_tls_dh1024_param_file = /etc/ssl/private/dhparams.pem"
그런 다음 Postfix를 재시작합니다:
service postfix restart
중요: 위 postconf 명령의 리스트는 기존 구성을 대체할 수 있으므로, 기존 설정을 확인하고 필요시 병합하세요.
Dovecot 설정
/etc/dovecot/dovecot.conf를 열고 ssl_protocols 항목 바로 뒤에 ssl_cipher_list를 추가하세요:
nano /etc/dovecot/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
Dovecot 버전을 확인하세요:
dovecot --version
- 버전이 2.2.6 이상이면 다음을 추가하세요:
ssl_prefer_server_ciphers = yes
- 버전이 2.2.7 이상이면 다음을 추가하세요:
ssl_dh_parameters_length = 2048
마지막으로 Dovecot을 재시작합니다:
service dovecot restart
Pure-FTPd 설정
Debian/Ubuntu의 pure-ftpd-wrapper 스크립트는 기본적으로 -J 옵션을 지원하지 않아 SSL Cipher Suite를 설정하기 복잡할 수 있습니다. 먼저 래퍼 스크립트에 -J 옵션을 추가합니다:
nano /usr/sbin/pure-ftpd-wrapper
스크립트에서 다음 줄을 찾습니다:
'TLS' => ['-Y %d', \&parse_number_1],
그 바로 아래에 다음 줄을 추가합니다:
'TLSCipherSuite' => ['-J %s', \&parse_string],
그다음 /etc/pure-ftpd/conf/TLSCipherSuite 파일을 생성하거나 편집하고 다음 암호 목록을 입력하세요:
nano /etc/pure-ftpd/conf/TLSCipherSuite
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
파일을 저장한 후 pure-ftpd를 재시작합니다(예시: MySQL 백엔드인 경우):
service pure-ftpd-mysql restart
주의: 배포판에 따라 서비스 이름이 pure-ftpd 또는 pure-ftpd-mysql 등으로 다릅니다.
테스트 및 검증
변경 후에는 외부 도구로 서버의 TLS 설정을 검사하세요. 예: Qualys SSL Labs, testssl.sh 같은 도구를 사용하면 취약점(예: Logjam, BEAST, POODLE 등) 여부를 확인할 수 있습니다.
간단한 로컬 확인 예시 (OpenSSL 사용):
openssl s_client -connect yourserver.example.com:443 -cipher ECDHE
정상적으로 연결되고 약한 DH 파라미터가 사용되지 않는지 로그와 인증서 체인을 확인하세요.
대안 및 예외 상황
- OpenSSL 또는 Apache 버전 제약으로 SSLOpenSSLConfCmd를 못 쓰는 경우: 최소한 SSLCipherSuite/ssl_ciphers를 업데이트하여 약한 암호화를 비활성화하세요.
- 완전한 키 교환 강제(예: 강력한 ECDHE 전용)를 원하면 서버와 클라이언트 호환성을 고려해야 합니다(구형 클라이언트 접속 불가 가능).
- CPU 부담을 줄이려면 2048 비트를 기본으로 하고, 트래픽/성능 특성에 따라 4096을 신중히 검토하세요.
운영자별 체크리스트
- 시스템 관리자
- dhparams.pem 생성 및 권한 설정 확인
- 각 서비스의 구성 파일 백업
- 서비스 재시작 및 로그 확인
- 보안 담당자
- SSL/TLS 테스트 툴(SSL Labs/testssl.sh)로 검증
- 취약 클라이언트 목록 파악 및 커뮤니케이션
- 개발 팀
- 애플리케이션 레벨에서 TLS 핸들링(예: 라이브러리 의존성) 점검
간단한 점검 절차(미니-방법론)
- 현재 버전 확인: apache2 -v, openssl version, dovecot –version
- dhparams.pem 생성(또는 재생성)
- 각 서비스의 암호화 스위트 업데이트
- DH 파라미터 적용 가능한 서비스에 적용
- 서비스 재시작 및 외부 검사 수행
결정 트리
flowchart TD
A[서버 준비] --> B{OpenSSL >= 1.0.2?
}
B -- 예 --> C{Apache >= 2.4.8?}
C -- 예 --> D[SSLOpenSSLConfCmd로 DH 적용]
C -- 아니오 --> E[SSLCipherSuite만 적용]
B -- 아니오 --> E
E --> F[각 서비스에 ssl_ciphers/ssl_cipher_list 적용]
D --> F
F --> G[서비스 재시작 및 테스트]
수용 기준(검증 항목)
- dhparams.pem 파일이 /etc/ssl/private에 존재하고 권한이 600으로 설정되어 있다.
- Apache/Nginx/Postfix/Dovecot/Pure-FTPd 의 구성 파일에 권장 암호 목록이 반영되어 있다.
- 외부 TLS 검사에서 Logjam 관련 취약점이 보고되지 않는다.
간단 용어집
- Diffie-Hellman (DH): 두 쪽이 안전하게 공유 비밀을 만드는 키 교환 방식.
- Logjam: DH의 약한 파라미터를 악용해 보안 세션을 약화시키는 공격.
요약
이 문서에서는 Logjam 공격을 완화하기 위해 고유한 DH 파라미터(dhparams.pem)를 생성하고, Apache/Nginx/Postfix/Dovecot/Pure-FTPd에 권장 암호 스위트를 적용하는 방법을 설명했습니다. 핵심은 버전 호환성을 확인하고(특히 OpenSSL/Apache), 구성 변경 후 반드시 외부 도구로 검증하는 것입니다.
중요: 운영 중인 시스템에서 변경하기 전 항상 구성과 데이터를 백업하세요.