VPN 운영자는 당신이 어떤 사이트를 방문하는지 볼 수 있을까?
기본 OpenVPN 서버는 세션을 기록할 뿐 URL은 기록하지 않는다. 운영자가 무엇을 보는지 말하기 전에 연결 로그, 터널 캡처, DNS 누출 점검을 비교하라.
VPN이 무엇을 볼 수 있는지 물으면 답은 경로의 어디에 서 있는지에 달려 있다. 세션 계층에서 운영자는 인증 이벤트와 바이트 수를 갖는다. 패킷 계층에서는 목적지 주소와 시각을 갖는다. DNS 계층에서는 이름 자체를 가질 수 있다. 각 계층은 서로 다른 질문에 답하며, 어떤 스위치 하나로 계층 사이를 옮겨 다닐 수는 없다.
주장하기 전에 계층을 정하라
같은 연결이라도 지점마다 다른 기록이 남고, 프라이버시에 관한 진술은 그 지점을 지목할 때만 의미가 있다. 표를 열별로 읽어 보라. 그 계층에 무엇이 존재하고, 운영자가 그곳에서 무엇을 볼 수 있으며, 같은 기록이 여전히 말해 주지 못하는 것은 무엇인가.
| Layer | Visible there | Not visible there |
|---|---|---|
| Session and authentication | Account, client address, start and stop times, assigned address, byte counts | URLs, page content, search terms |
| Forwarded packets | Destination address and port, sizes, timing, often the TLS server name | HTTP path, headers, response body |
| DNS resolver | Queried names and the client that asked | Page content and later requests |
| TLS-terminating proxy | Full request line, headers and body | Nothing, by design |
한 계층을 전체 그림으로 읽는 것이 과장된 주장과 거짓 안도의 공통된 시작점이다. 탐색 기록을 남기지 않는다는 제공자라도 URL 기록에 관해서는 정확하면서 세션 기록을 보관할 수 있고, 주소만 보여 주는 패킷 캡처는 역조회와 추측 없이는 방문 기록이 되지 않는다.
정책을 평가할 때는 각 계층을 설명하는 문장을 찾아라. 정책이 계층을 구분하지 않는다면 암호화에 관한 일반적인 진술을 받아들이지 말고 어떤 기록이 존재하는지 물어야 한다.
세션 목록: 기본 OpenVPN 서버가 보관하는 것
기본 설정에서는 OpenVPN 서버가 트래픽을 캡처하지 않는다. 일반적인 출력은 세션 목록이다. 인증한 계정, 그 계정이 온 원본 주소, 시작과 종료 시각, 부여된 터널 주소, 양방향 바이트 합계. 이것은 세션의 목록이며 목적지의 목록이 아니다.
로깅 옵션은 세부를 더할 수 있다. 세부 수준을 높이면 핸드셰이크에 관해 더 많이 기록하고 상태 파일은 연결된 클라이언트를 나열할 수 있지만, 둘 다 서버를 투명 프록시로 바꾸지는 않는다. URL을 만들어 내려면 TLS를 종료하거나 명시적 프록시를 실행해야 하며, 둘 다 숨은 기능을 켜는 것이 아니라 신뢰 구도를 바꾼다.
그래서 탐색 로그 없음이라는 주장의 정확한 판본은 들리는 것보다 좁다. 서버는 페이지를 알지 못하지만 세션이 있었다는 것과 그 세션을 대략 얼마만큼의 데이터가 지나갔는지는 안다. 그 세션 기록을 보관하는지, 얼마나 오래 보관하는지는 별도의 정책 문제다.
안쪽 패킷과 바깥쪽 패킷은 다른 증거다
패킷 캡처는 터널을 실제로 무엇이 지나가는지 보는 수단이다. 서버에서 터널 인터페이스를 지정하고 나중에 오프라인으로 분석할 수 있는 파일에 기록하라:
sudo tcpdump -ni tun0 -w /tmp/tun.pcap
sudo tcpdump -r /tmp/tun.pcap -nn | head그 파일에는 복호화된 안쪽 트래픽이 들어 있다. 출발지로 클라이언트의 터널 주소, 목적지 주소와 포트, 패킷 크기와 시각. 어딘가에서 TLS를 종료하지 않는 한 HTTP 경로나 응답 본문은 들어 있지 않으며, 이는 민감한 데이터라 보관 여부는 디버깅 편의가 아니라 정책의 결정이다.
물리 인터페이스에서의 캡처는 다른 것을 보여 준다. 거기에는 VPN 엔드포인트로 향하는 바깥쪽 패킷이 보이고 그 안에 암호화된 페이로드가 있다. 가상 어댑터가 있으면 그 파일에 무관한 주소가 나타나는 것은 정상이다. 터널 장치가 안쪽 흐름을 나르고 암호화된 전송이 바깥쪽 흐름을 나르기 때문이다.
그 캡처가 무엇에 답하려는 것인지 물어라. 애플리케이션의 터널 사용은 가상 어댑터에서 보이고, 엔드포인트까지 터널이 닿는지는 물리 어댑터에서 보인다. 어느 한 파일을 전체 그림처럼 쓰면 데이터가 뒷받침하지 못하는 결론이 나온다.
DNS는 이름이 보이게 되는 지점이다
DNS는 실무상의 예외로 남는다. 리졸버는 해석을 요청받은 이름을 보므로, 리졸버를 운영하는 쪽은 이후 연결이 암호화되어 있어도 클라이언트가 어떤 사이트를 찾는지 알게 된다. 터널 캡처는 주소를 보여 주고, 리졸버는 이름을 보여 준다.
리졸버가 외부 서비스에 닿을 때 어느 주소를 썼는지 확인하라. 답은 리졸버의 출구 주소이며, VPN 출구와 비교하면 질의가 터널을 지났는지 알 수 있다:
dig +short myip.opendns.com @resolver1.opendns.com
dig example.com
sudo tcpdump -ni any udp port 53그 주소가 터널 출구가 아니라 로컬 연결과 일치한다면 조회가 VPN을 우회했고 이름은 로컬 경로에서 보였다. 클라이언트를 업데이트한 뒤에는 점검을 반복하라. 새 버전이면 프로필이 설치하는 리졸버가 달라질 수 있다.
암호화 DNS는 가시성을 없애는 것이 아니라 옮긴다. 네트워크는 더 이상 질의를 보지 못하지만 리졸버는 여전히 보고, 신뢰의 문제는 그저 손을 바꾼다. 연결 핸드셰이크의 TLS 서버 이름도 부분적인 단서다. 페이로드가 불투명해도 남는 경우가 많으므로 목적지 주소만이 포워딩 서버가 관찰할 수 있는 메타데이터는 아니다.
세 가지 기록 유형과 그것을 읽을 수 있는 사람
세션 회계, 이름별 기록, 누출 증거는 서로 다른 세 가지 의무를 지는 세 가지 산출물이다. 세션 로그는 값이 싸고 민감도가 낮으며 누가 언제 연결했는지에 답한다. 이름별 기록은 기록하는 리졸버나 명시적 프록시를 필요로 하고 영향을 받는 사람들에게 알릴 의무를 만든다. 누출 증거는 리졸버가 드러내는 것과 터널 출구를 비교하는 클라이언트 측 점검이다.
이 셋 중 무엇을 운영하는지, 누가 읽을 수 있는지, 얼마나 남는지를 적어 두라. 서비스가 로그를 남기지 않는다는 진술은 한 계층을 설명하며 그 범위 안에서만 참이다. 같은 제공자가 세션에 관해서는 정확하고 DNS에 관해서는 틀릴 수 있다.
점검은 재현 가능하게 유지하라. 같은 리졸버 질의, 같은 캡처 인터페이스, 같은 비교다. 이름 붙인 계층에서 점검할 수 없는 프라이버시 주장은 구호이지 운영상의 사실이 아니다.