TLS 인증서 투명성 로그 감사(Auditing TLS Certificate Transparency Logs)
사용 시점
- 소유한 도메인에 대해 알려지지 않은 인증 기관(CA)에 의한 무단 또는 예상치 못한 인증서 발급 모니터링
- 공개 CT 로그에 기록된 인증서를 통해 서브도메인 및 숨겨진 서비스 발견
- 유사 도메인 인증서(타이포스쿼팅, 동형 공격)를 사용하는 피싱 인프라 탐지
- 브라우저 정책에 따라 발급된 모든 인증서가 CT 로그에 나타나는지 확인하여 인증 기관 규정 준수 감사
- 새로운 발급에 대한 알림을 포함한 지속적인 인증서 모니터링을 보안 운영 파이프라인에 구축
사용하지 말아야 할 경우: 인증 기관을 공격하거나 방해하는 목적, 요율 제한 또는 서비스 약관을 위반하여 CT 로그를 스크래핑하는 목적, DNS 확인을 통한 교차 검증 없이 서브도메인 열거의 유일한 방법으로 사용하는 목적.
사전 요구 사항
- Python 3.10+ 및
requests,cryptography,pyOpenSSL라이브러리 설치 - crt.sh(HTTPS) 및 공개 CT 로그 서버에 대한 네트워크 액세스
- 모니터링할 도메인 목록(소유 도메인, 브랜드 변형, 타이포스쿼 후보)
- 새 인증서 발견 시 알림을 보내기 위한 SMTP 자격 증명 또는 웹훅 URL
- X.509 인증서 구조 및 TLS 인증서 체인 검증에 대한 기본적인 이해
워크플로우
1단계: 도메인 인벤토리 및 기준선 설정
모니터링할 도메인에 대한 초기 인증서 인벤토리를 구축합니다:
- 모니터링 범위 정의: 소유한 모든 루트 도메인, 등록된 브랜드 이름, 알려진 자회사를 나열합니다. 포괄적인 서브도메인 커버리지를 위해 와일드카드 패턴(
%.example.com)을 포함합니다. - crt.sh에서 과거 인증서 조회: crt.sh JSON API를 사용하여 각 도메인에 대해 알려진 모든 인증서를 검색합니다. API 엔드포인트
https://crt.sh/?q=%.example.com&output=json은 와일드카드 패턴과 일치하는 인증서를issuer_ca_id,issuer_name,common_name,name_value,not_before,not_after,serial_number필드와 함께 반환합니다. - 기준선 데이터베이스 구축: 초기 인증서 세트를 인증서 ID, 도메인, 발급자, 유효 기간, SAN(주체 대체 이름), 최초 발견 타임스탬프 컬럼을 포함한 로컬 SQLite 데이터베이스에 저장합니다. 이 기준선은 이미 알려진 인증서에 대한 알림을 방지합니다.
- 승인된 CA 식별: 기준선에서 도메인에 대해 합법적으로 인증서를 발급한 인증 기관 세트를 추출합니다. 이 세트에 없는 CA의 향후 발급은 높은 우선순위의 알림을 트리거합니다.
- 서브도메인 매핑: 모든 인증서의
name_value필드에서 고유한 서브도메인을 추출하여 초기 서브도메인 인벤토리를 구축합니다.
2단계: 지속적인 CT 로그 모니터링
새로운 인증서 발급에 대한 지속적인 모니터링을 설정합니다:
- 정기적으로 crt.sh 폴링: 정기적인 간격(15-60분)으로 crt.sh API를 조회하여 새 인증서를 확인합니다.
exclude=expired매개변수를 사용하여 현재 유효한 인증서에 초점을 맞춥니다. 결과를 기준선 데이터베이스와 비교하여 새 항목을 식별합니다. - 인증서 세부 정보 파싱: 각 새 인증서에 대해 전체 SAN 목록, 발급자 체인, 유효 기간, 키 유형 및 크기, CT 로그 SCT(서명된 인증서 타임스탬프) 세부 정보, 인증서 지문(SHA-256)을 추출합니다.
- 사전 인증서 탐지: CT 로그에는 최종 발급 전에 제출된 사전 인증서(poisoned certificate)가 포함됩니다. 이러한 사전 인증서를 조기 경고로 추적하면 인증서가 발급되려 하고 있지만 아직 활성화되지 않았음을 나타냅니다.
- CT 로그 서명된 트리 헤드(STH) 모니터링: 고급 모니터링을 위해 CT 로그 서버에 직접 조회하여 최신 STH를 가져오고 연속된 트리 헤드 간의 일관성 증명을 확인합니다. 불일치는 로그 오작동(분할 뷰 공격)을 나타냅니다.
- 요율 제한 인식: 쿼리 간격을 두고 응답을 캐싱하여 crt.sh의 요율 제한을 준수합니다. HTTP 429 응답에는 지수 백오프를 구현합니다. 대용량 모니터링의 경우 crt.sh PostgreSQL 인터페이스를
crt.sh:5432에서 직접 쿼리하는 것을 고려하십시오. - Atom/RSS 피드 대안: 더 가벼운 모니터링을 위해 crt.sh의 Atom 피드를 구독합니다:
https://crt.sh/atom?q=%25.example.com은 새 로그 항목에 대한 실시간 알림을 제공합니다.
3단계: CT 데이터를 통한 서브도메인 발견
인증서 투명성 데이터에서 발견된 서브도메인을 추출하고 검증합니다:
- 와일드카드 확장: 와일드카드 SAN(
*.dev.example.com)이 있는 인증서는 DNS 영역 파일에 없을 수 있는 서브도메인의 존재를 드러냅니다. 상위 도메인을 추가 열거 대상으로 기록합니다. - 과거 인증서 마이닝:
exclude=expired매개변수 없이 crt.sh를 조회하여 DNS에서 여전히 확인될 수 있는 만료된 인증서의 서브도메인을 찾습니다. 이는 서브도메인 탈취에 취약할 수 있는 레거시 인프라를 나타냅니다. - DNS 검증: 발견된 각 서브도메인에 대해 DNS 확인(A, AAAA, CNAME 레코드)을 수행하여 서브도메인이 현재 활성 상태인지 확인합니다. 알려진 IP 범위와 교차 참조하여 섀도 IT 또는 무단 서비스를 식별합니다.
- 타이포스쿼 탐지: 모니터링되는 도메인의 변형(비트스쿼팅, 동형, 삽입, 생략, 전치, 키보드 인접 대체)을 생성하고 CT 로그에서 이러한 변형에 발급된 인증서를 쿼리합니다. 타이포스쿼 도메인에 대한 인증서는 피싱 인프라를 강력히 나타냅니다.
- 중복 제거 및 보강: 발견된 서브도메인을 정규화(소문자 변환, 후행 점 제거)하고 중복을 제거한 후 WHOIS 데이터, IP 지리적 위치, HTTP 응답 헤더로 보강하여 조사 우선순위를 지정합니다.
4단계: 인증서 발급 알림
보안 관련 인증서 이벤트에 대한 알림 규칙을 구성합니다:
- 승인되지 않은 CA 알림: 승인된 CA 목록에 없는 CA가 인증서를 발급할 때 트리거됩니다. 이는 도메인 하이재킹, 도메인 검증을 위한 BGP 하이재킹 또는 손상된 CA를 나타낼 수 있으므로 가장 높은 우선순위의 알림입니다.
- 새 서브도메인 알림: 이전에 보지 못한 서브도메인이 있는 SAN을 포함하는 인증서가 발견될 때 트리거됩니다. 이는 섀도 IT 배포 및 무단 서비스를 포착합니다.
- 와일드카드 인증서 알림: 새로운 와일드카드 인증서 발급 시 트리거됩니다. 와일드카드 인증서는 손상될 경우 영향 범위가 넓으므로 발급을 엄격히 통제해야 합니다.
- 단기 인증서 이상 알림: 조직의 정상적인 인증서 수명 주기와 다른 비정상적으로 짧은 유효 기간(24시간 미만)의 인증서가 있을 때 알림을 보냅니다. Let's Encrypt 남용 또는 자동화된 피싱 인프라를 나타낼 수 있습니다.
- 만료 경고: CT 로그 데이터의
not_after필드를 기준으로 중요 서비스의 인증서가 만료에 가까워지면(30, 14, 7일) 알림을 보냅니다. - 알림 전달: 이메일(SMTP), Slack 웹훅, PagerDuty를 통해 알림을 보내거나 기존 보안 모니터링과 통합하기 위해 SIEM 호환 JSON 로그 형식으로 기록합니다.
5단계: CT 로그 무결성 검증 및 보고
로그 무결성을 검증하고 규정 준수 증거를 생성합니다:
- 서명된 트리 헤드(STH) 모니터링:
get-sthAPI 엔드포인트를 통해 각 모니터링되는 CT 로그에서 최신 STH를 가져옵니다. STH에는 트리 크기와 서명된 타임스탬프가 포함되어 있습니다. 로그의 공개 키를 사용하여 서명을 확인합니다. - 일관성 증명 검증: 연속된 STH 가져오기 사이에
get-sth-consistency를 통해 일관성 증명을 요청하여 로그가 추가 전용으로 유지되고 항목이 수정되거나 제거되지 않았는지 확인합니다. - 인증서 인벤토리 보고서: 모니터링되는 도메인에 대해 발급된 모든 인증서의 전체 인벤토리를 발급자별로 그룹화하고 유효성 상태 및 키 강도 메트릭과 함께 생성합니다.
- CA 다양성 분석: 조직을 위해 인증서를 발급하는 CA의 수를 보고하여 통합 기회와 단일 실패 지점을 식별합니다.
- 규정 준수 증거: PCI-DSS, SOC 2 또는 유사한 프레임워크를 적용받는 조직의 경우 CT 모니터링 로그는 인증서 수명 주기 관리 및 무단 발급 탐지 기능에 대한 증거를 제공합니다.
주요 개념
| 용어 | 정의 |
|---|---|
| 인증서 투명성 (CT) | RFC 6962에 정의된 개방형 프레임워크로, 인증 기관이 발급한 모든 인증서를 공개적으로 감사 가능한 추가 전용 로그에 기록하도록 요구하여 도메인 소유자가 무단 발급을 탐지할 수 있도록 함 |
| 서명된 인증서 타임스탬프 (SCT) | CT 로그가 인증서를 최대 병합 지연 시간(일반적으로 24시간) 내에 포함시키겠다는 약속입니다. 브라우저는 인증서를 신뢰하기 전에 여러 로그의 SCT를 요구합니다 |
| 머클 트리 | CT 로그에서 사용하는 암호화 데이터 구조로, 리프 노드는 인증서 해시이고 상위 노드는 자식의 해시이며, 효율적인 일관성 및 포함 증명을 가능하게 합니다 |
| 사전 인증서 | 최종 발급 전에 CT 로그에 제출되는 인증서로, TLS에 사용되지 못하도록 하는 포이즌 확장(OID 1.3.6.1.4.1.11129.2.4.3)을 포함하지만 로그에서 그 자리를 예약합니다 |
| crt.sh | Sectigo가 운영하는 무료 웹 서비스로, 모든 주요 CT 로그의 인증서를 검색 가능한 PostgreSQL 데이터베이스로 집계하며 웹 및 API 액세스를 모두 제공합니다 |
| 서브도메인 탈취 | 서브도메인의 DNS 레코드가 공격자가 회수할 수 있는 폐기된 서비스(클라우드 제공업체, CDN)를 가리키는 취약점으로, 만료된 CT 인증서를 통해 발견 가능 |
| 최대 병합 지연 시간 (MMD) | CT 로그가 SCT를 반환한 후 제출된 인증서를 머클 트리에 통합해야 하는 최대 시간(일반적으로 24시간) |
| CAA 레코드 | DNS 인증 기관 인가 레코드로, 도메인에 대한 인증서를 발급할 수 있는 CA를 지정합니다. CT 모니터링은 CAA 정책 위반을 탐지합니다 |
도구 및 시스템
- crt.sh: 기본 CT 로그 수집기로
https://crt.sh/?q=<query>&output=json에서 JSON API 액세스를 제공하며 와일드카드 쿼리, 신원 필터링, 인증서 세부 정보 검색을 지원합니다 - ct-woodpecker: Let's Encrypt의 오픈 소스 CT 로그 모니터링 도구로, 로그 상태 및 일관성의 운영 모니터링을 위해 Prometheus 및 Grafana와 통합됩니다
- certspotter: SSLMate의 CT 로그 모니터로, 새로 발급된 인증서를 감시하고 알림을 보냅니다. 호스팅 서비스 또는 자체 호스팅 도구로 사용 가능
- Google Argon / Xenon / Icarus: Google이 운영하는 CT 로그로 가장 널리 사용되며, 각 로그 URL에서 RFC 6962 API를 통해 쿼리 가능
- OpenSSL: 인증서 세부 정보를 파싱하고, 체인을 검증하고, CT 모니터링을 통해 검색된 인증서에서 SAN 목록을 추출하기 위한 명령줄 도구
일반적인 시나리오
시나리오: 금융 서비스 회사의 무단 인증서 발급 탐지
상황: 한 은행이 기본 도메인(bank.example.com)을 모니터링하던 중 CT 로그를 통해 secure-login.bank.example.com을 포함하는 인증서가 한 번도 사용한 적 없는 CA에서 발급되었음을 발견했습니다. 이 서브도메인은 DNS에 존재하지 않습니다.
접근 방식:
- CT 모니터링 에이전트가 crt.sh 결과에서
secure-login.bank.example.com에 대한 "FreeSSL CA"의 새 인증서를 탐지합니다. 이 CA는 승인된 CA 목록(DigiCert, Sectigo)에 없습니다. - 승인되지 않은 CA + 새 서브도메인으로 알림이 발생하여 CT 로그 항목 후 15분 이내에 보안 팀에 에스컬레이션됩니다.
- 인증서 조사: 공개 키 추출, HTTP-01 또는 DNS-01 챌린지를 통해 도메인이 검증되었는지 확인, 발급 조직에 대한 WHOIS 조회
secure-login.bank.example.com에 대한 DNS 조회 결과 은행이 사용하지 않는 호스팅 제공업체의 IP 주소로 확인되어 공격자 인프라임을 확인- 사고 대응 시작: FreeSSL CA에 인증서 폐기 요청, 도메인 남용 신고 제출, IP를 블록리스트에 추가, 안티피싱 팀에 알림
- CAA DNS 레코드(
bank.example.com. CAA 0 issue "digicert.com")를 구현하여 승인되지 않은 CA가 향후 인증서를 발급하지 못하도록 방지
주의할 점:
- 와일드카드 패턴(
%.bank.example.com)을 모니터링하지 않고 서브도메인에 대한 인증서를 놓침 - 실제 인증서가 발급되기 전에 CT 로그에 나타나는 사전 인증서를 무시하여 조기 경고 이점을 잃음
- 사고 후 모든 도메인에 CAA 레코드가 제대로 구성되었는지 확인하지 않음
- 승인된 변경 후 기준선 데이터베이스를 업데이트하지 않아 합법적인 인증서 갱신에 과도한 알림이 발생
시나리오: CT 로그 서브도메인 발견을 통한 공격 표면 매핑
상황: 침투 테스터가 CT 로그를 외부 정찰의 첫 번째 단계로 사용하여 활성 스캔 전에 대상 조직의 인터넷 연결 서비스를 매핑합니다.
접근 방식:
%.target.com및 모든 알려진 자회사 도메인에 대해 crt.sh를 조회하여 8년 동안 2,400개의 고유 인증서를 수집합니다.- 만료된 인증서를 포함한 모든 인증서의 SAN 필드에서 347개의 고유 서브도메인을 추출합니다.
- 347개 서브도메인 모두에 대해 DNS 확인을 수행하여 A/AAAA 레코드가 있는 189개의 활성 서브도메인을 찾습니다.
- 서브도메인 탈취 후보인 폐기된 클라우드 서비스(S3 버킷, Azure 엔드포인트에 대한 CNAME)를 가리키는 12개의 서브도메인을 식별합니다.
- 대상의 문서화된 범위에는 없지만 연결 가능하고 이전 소프트웨어 버전을 실행 중인
staging-api.target.com및dev-portal.target.com을 발견합니다. - 알려진 자산 인벤토리와 CT에서 파생된 공격 표면 간의 격차를 보여주는 결과를 대상 조직에 제시합니다.
주의할 점:
- CT에서 발견된 모든 서브도메인이 자산 소유자 확인 없이 범위 내에 있다고 가정
- 와일드카드 DNS 응답을 확인하지 않아 catch-all로 확인될 때 서브도메인이 존재하는 것처럼 보이게 함
- 포괄적인 커버리지를 위해 수동 DNS 데이터베이스와 교차 참조하지 않고 CT 데이터에만 의존
출력 형식
## CT 로그 모니터링 보고서
**도메인**: example.com
**모니터링 기간**: 2026-03-01 ~ 2026-03-19
**추적된 총 인증서**: 142
**탐지된 새 인증서**: 7
**생성된 알림**: 2
### 알림: 승인되지 않은 CA 발급
- **심각도**: 치명적
- **인증서 CN**: secure-login.example.com
- **SAN**: secure-login.example.com, ...
### 알림: 새 서브도메인 발견
- **심각도**: 높음
- **새 SAN**: staging-api.example.com
- **출처**: 만료된 인증서 #85123 (2025-08-14 발급, DigiCert)
- **DNS 상태**: 확인됨 (A: 203.0.113.42)
- **HTTP 상태**: 200 OK, 서버: nginx/1.24.0
---
*보고서 자동 생성: 2026-03-19T14:30:00Z*
*다음 조회 예정: 2026-03-19T15:00:00Z*