시스템d-resolved의 버그로 인해 Caddy 인증서 갱신 실패, 해결 과정 공개

by DD
4주 전
조회수 8

Caddy가 Let's Encrypt 인증서를 갱신하는 과정에서 시스템d-resolved의 DNS 쿼리 실패(DNS Query Failure)로 인해 인증서 만료 문제가 발생함

문제 해결을 위해 DNS 설정 변경(DNS Configuration Change), Caddy 컨테이너 DNS 설정, NextDNS DoT 설정 제거 등 다양한 시도가 이루어짐

시스템d-resolved의 특정 설정(Specific Configuration)과 NextDNS DoT 환경에서 NXDOMAIN 응답 처리에 버그가 있음을 확인

인증서 만료 알림 부재(Absence of Certificate Expiry Alert), Caddy의 갱신 실패 알림 부재 등 모니터링 시스템의 허점을 지적하며 개선 필요성을 강조함

시스템d-resolved의 NXDOMAIN 응답 처리 문제

저자는 시스템d-resolved가 특정 DNS 쿼리에 대해 NXDOMAIN 응답을 처리하는 과정에서 문제를 겪었다고 보고한다. 특히, NextDNS DoT(DNS over TLS)를 사용하고 특정 도메인에 대해 NXDOMAIN 응답을 받을 때, 시스템d-resolved가 응답을 반환하지 않고 타임아웃(Timeout)되는 현상이 발생했다. 이는 시스템d-resolved의 내부적인 버그로 추정되며, 캐시 플러시(Cache Flush) 및 서비스 재시작(Service Restart)에도 문제가 해결되지 않았다.

Caddy 인증서 갱신 실패와 문제 해결 과정

Caddy는 Let's Encrypt를 사용하여 TLS 인증서를 자동으로 갱신한다. 하지만 시스템d-resolved의 DNS 쿼리 실패로 인해 Caddy가 DNS-01 챌린지를 해결하지 못해 인증서 갱신에 실패했다. 저자는 Synapse 서비스의 DNS 설정을 변경하여 문제를 해결했다. 구체적으로, Caddy 컨테이너에 직접 DNS 서버를 지정하여 시스템d-resolved를 우회(Bypass)했다. 또한, NextDNS DoT 설정을 제거하여 문제의 근본 원인을 해결했다.

모니터링 시스템의 중요성 및 개선 필요성

저자는 Caddy의 인증서 갱신 실패를 감지하지 못한 모니터링 시스템(Monitoring System)의 허점을 지적한다. Caddy는 갱신 실패를 로그로 기록하지만, 별도의 알림을 제공하지 않았다. 또한, 인증서 만료 알림 설정 부재로 인해 문제 발생 시 즉각적인 대응이 어려웠다. 따라서, 저자는 로그 기반 알림(Log-based Alerting)인증서 만료 알림(Certificate Expiry Notification) 설정을 통해 모니터링 시스템을 개선할 필요성을 강조한다.

DNS 설정의 복잡성과 보안 문제

저자는 DNS 설정의 복잡성이 문제를 악화시켰다고 지적한다. 특히, NextDNS DoT 설정은 서버에 불필요한 설정을 추가하여 시스템d-resolved의 버그를 트리거했다. 또한, DNS 설정 오류는 서비스 중단으로 이어질 수 있으며, 보안 취약점을 발생시킬 수 있다. 따라서, 저자는 DNS 설정의 단순화(Simplification)정기적인 감사(Regular Audit)를 통해 보안을 강화해야 한다고 강조한다.

Caddy의 갱신 실패 처리 및 개선 방안

Caddy는 인증서 갱신 실패 시 지수 백오프(Exponential Backoff)를 사용하지만, 인증서 만료 시점까지 갱신을 시도하지 못할 수 있다. 저자는 Caddy에 갱신 시도 간격(Retry Interval)을 인증서 만료 시점과 비교하여 갱신 시도를 조절하는 기능을 추가할 것을 제안한다. 또한, Caddy의 갱신 실패에 대한 Prometheus 메트릭(Prometheus Metric)을 제공하여 모니터링을 강화할 필요가 있다.

A Caddy Cert Expired Because systemd-resolved Was Selectively Broken