
OSINT 유출 방어를 위한 Cloudflare Zero Trust 도입하기
개요
Cloudflare Proxy를 사용하고 있었지만 Censys, Shodan 등 OSINT(Open Source Intelligence) 검색 엔진에 Origin IP와 포트 정보가 노출되는 문제가 있었다.
원인을 확인하고 Origin 직접 접속 차단, 관리 포트 비공개화, Cloudflare Tunnel 기반 ZTNA까지 구성하였다.
문제 상황 분석
Cloudflare를 통해 서비스를 운영 중이었으나 OSINT 검색 엔진에서 Proxy IP가 아닌 Origin IP가 확인되었다.
원인 분석
서버의 IP가 노출된 원인은 다음과 같았다.
- TLS 인증서 노출
- Censys와 같은 스캐너는 인터넷의 Public IP를 지속적으로 스캔한다.
- Origin IP의 443 포트에 직접 연결했을 때 Nginx가 실제 서비스 인증서를 반환하고 있었다.
- 인증서의 SAN 등을 통해 해당 IP와 도메인을 연관 지을 수 있었다.
- Inbound 방화벽 정책 미흡 (80, 443 포트의 방화벽 설정을 안해두어 프록시를 거치지 않은 접속이 가능했다)
Nginx 보안 강화
IP 기반 직접 접속 시 불필요하게 실제 인증서를 반환하지 않도록 설정한다.
SSL Handshake 거부 설정
ssl_reject_handshake는 Nginx 1.19.4 이상에서 지원된다.
먼저 버전을 확인한다.
File: /etc/nginx/sites-available/default
이 설정은 Default Server로 들어오는 TLS Handshake를 거부하는 용도다.
공격자가 실제 도메인을 SNI로 지정하면 정상 Server Block이 선택될 수 있으므로 이것만으로 Origin 접근을 막을 수는 없다.
방화벽 정책 변경
Inbound Access List를 Cloudflare IP 대역 변경에 대비해 목록을 자동으로 갱신한다.
File: cloudflare_ip_update.sh
스크립트가 오류나거나 기타 부득이한 이유로 서버에 접근하지 못하는 문제가 생길 수 있으므로, 22 SSH 포트는 인스턴스 관리 대시보드에서 직접 관리하는 것을 추천한다.
요즘은 캐릭터 세탁 말고 컴퓨터 세탁도 합니다

@Binci
Public IP 교체
기존 Public IP를 반납하고 새로운 Ephemeral IP를 할당받는다.
SSH Host Key 재생성
실제 키 유출이 없는 경우 반드시 해야 하는 작업은 아니지만, Fingerprinting 을 막기위해 변경하였다.
Zero Trust Network Access
이제 Public Internet에 직접 노출하지 않고 Cloudflare Tunnel로 접근한다.
cloudflared 설치

Cloudflare One Dashboard에서 Tunnel을 생성하고 Token을 발급받는다.
설치 후 확인한다.
Split Tunnel 및 Private Network 구성

먼저 서버의 IP를 확인한다.
예시:
Private IPv4 대역은 다음과 같다.
Private IP 대역
10.0.0.0/8172.16.0.0/12192.168.0.0/16
Team & Resources/Devices > Devices > Device profiles > Profile > Split Tunnels

접근하려는 Private Network 대역이 Exclude에 포함되어 있다면 해당 범위를 조정한다.

Networks/Routes > Routes > CIDR Routes
Private Network를 추가한다.

접속
Cloudflare One Agent (WARP Client)를 설치 후, 구성 시 사용한 Team Domain에 로그인한다.
