HTTPS 연결의 보안 수준은 TLS 버전과 암호화 스위트(cipher suite)에 의해 결정됩니다. 약한 암호화는 중간자 공격에 취약하므로, 로그 분석으로 구형 프로토콜 사용 클라이언트를 찾아 대응해야 합니다.
``nginx log_format ssl '$remote_addr - [$time_local] "$request" $status $ssl_protocol $ssl_cipher'; access_log /var/log/nginx/ssl.log ssl; `
로그 예시:
` 192.0.2.100 - [10/Oct/2024:14:00:00 +0000] "GET / HTTP/1.1" 200 TLSv1.3 TLS_AES_256_GCM_SHA384 `
`apache LogFormat "%h %l %u %t \"%r\" %>s %b %{SSL_PROTOCOL}x %{SSL_CIPHER}x" ssl CustomLog /var/log/apache2/ssl-access.log ssl `
`bash awk '{print $(NF-1)}' /var/log/nginx/ssl.log | sort | uniq -c | sort -rn `
출력 예시:
` 45231 TLSv1.3 12341 TLSv1.2 421 TLSv1.1 ← 보안 취약 87 TLSv1.0 ← 매우 취약 `
| 버전 | 상태 | 조치 |
|---|---|---|
| ------ | ------ | ------ |
| TLSv1.3 | 최신, 안전 | 권장 |
| TLSv1.2 | 안전 (현재 표준) | 허용 |
| TLSv1.1 | 취약 (2021년 폐기) | 차단 권장 |
| TLSv1.0 | 매우 취약 (2020년 폐기) | 즉시 차단 |
| SSLv3 | 극히 취약 (POODLE 공격) | 절대 사용 금지 |
| Cipher | 위험 | |
| -------- | ------ | |
RC4 | 스트림 암호 취약점 | |
DES, 3DES | 키 길이 부족 | |
MD5 | 해시 충돌 취약 | |
NULL | 암호화 없음 | |
EXPORT | 의도적으로 약한 암호 |
`bash grep -iE '(RC4|DES|MD5|NULL|EXPORT)' /var/log/nginx/ssl.log `
`nginx ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256'; ssl_prefer_server_ciphers on; `
PFS는 개인키 유출 시에도 과거 통신을 보호합니다.
PFS 지원 Cipher:
`bash PFS=$(grep -c 'ECDHE\|DHE' /var/log/nginx/ssl.log) TOTAL=$(wc -l < /var/log/nginx/ssl.log) echo "PFS: $((100 * PFS / TOTAL))%" `
HTTPS만 사용하도록 브라우저에 강제:
`nginx add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always; `
서버 외부에서 테스트:
` https://www.ssllabs.com/ssltest/analyze.html?d=example.com `
A+ 등급을 목표로 하세요.
HTTPS 페이지에서 HTTP 리소스 로드 시 브라우저 경고 발생:
`bash grep 'http://' /var/log/nginx/access.log | grep -v 'https://' ``
TLS 1.2 이상만 허용하고, ECDHE 기반 PFS 암호화 스위트를 사용하세요. 로그에서 TLSv1.0/1.1, RC4, DES 사용 흔적이 있다면 즉시 차단해야 합니다.