E16
"켜져 있다"와 "막고 있다"는 다르다
차단 정책이 실제로 우회될 수 있는 구조를 찾아 고치고, 로그로 증명하다
이미 수정된 사례입니다
- WAF
- CloudFront
- Athena
- Log Analysis
한 줄 요약
CDN + 로드밸런서 구조에서 해외 접속 차단 정책이 우회될 수 있는 지점을 찾아 고치고, 차단 결과를 로그로 증명했습니다. 이미 수정된 사례입니다.
배경
CDN + 로드밸런서 구조에서 있었던 일입니다. 이미 수정된 사례입니다.
서비스 구조는 사용자 → CloudFront(전 세계에 콘텐츠를 빠르게 전달하는 서비스) → ALB(로드밸런서) → 서버였고, 해외 접속을 막는 Geo-blocking(국가별 접속 차단) 정책이 적용되어 있었습니다.
문제
정책이 실제로 의도대로 막고 있는지 확인하려고 구조를 따라가며 점검했습니다.
ALB 입장에서 요청을 보낸 상대는 사용자가 아니라 CloudFront입니다. 그래서 ALB에 붙은 WAF(웹 방화벽) 규칙은 사용자 IP를 직접 보지 못하고, 전달된 헤더 값(예: X-Forwarded-For)으로 국가를 판별하고 있었습니다.
이 헤더는 사용자가 요청할 때 임의로 값을 넣을 수 있어서, 헤더 조작으로 차단이 우회될 수 있는 지점이었습니다.
쉬운 설명쉬운 비유
건물 안쪽 문 경비원이 사람 얼굴이 아니라 손에 든 쪽지(“나는 한국인”)를 보고 통과시키는 상황입니다. 쪽지는 누구나 쓸 수 있습니다. 그래서 얼굴을 직접 보는 바깥 정문에서 확인하도록 검문 위치를 옮겼습니다.
실행
- 국가 판별을 실제 접속 IP를 보는 CloudFront 단 규칙으로 옮겨 우회 가능성을 없앴습니다.
- 차단이 실제로 되는지 확인하려고 Athena(저장된 로그를 SQL로 조회하는 서비스)로 WAF 로그를 분석하던 중, 국가 필드가 조회되지 않는 문제를 발견했습니다.
- 원인을 추적해 보니 로그 원본에는 국가 값이 있지만 테이블 정의(DDL)에 해당 필드가 빠져 있었습니다. DDL을 직접 수정해 해결했습니다.
쉬운 설명왜 DDL만 고치면 되나요?
Athena는 데이터를 미리 변환해 넣는 DB가 아니라, 원본 파일을 읽는 순간 테이블 구조를 입혀서 보는 방식입니다. 그래서 원본에 값이 있어도 테이블 정의에 필드가 없으면 보이지 않고, 원본을 고칠 필요 없이 정의만 고치면 됩니다.
결과
- 우회 가능성 제거
- 국가별 차단 결과를 로그로 검증 가능
배운 점
보안 기능을 켜두는 것과, 그 기능이 실제로 위협을 막고 있다는 것을 증명하는 것은 다른 일입니다.