신뢰할 수 없는 VPN은 하나가 아니라 세 개의 별도 경계입니다
원격 피어, 경로에 있는 운영자, 호스트의 클라이언트는 서로 다른 세 가지 위협입니다. 방화벽 규칙은 그중 첫 번째에만 답합니다.
«이 VPN을 신뢰하지 않는다»는 말은 보통 하나의 문장을 입은 세 가지 주장입니다. 그 네트워크의 원격 피어는 호스트의 서비스에 도달할 수 있고, 터널을 운영하는 주체는 그곳을 지나는 트래픽을 관찰할 수 있으며, 설치한 클라이언트 소프트웨어는 머신의 네트워크 정책을 바꿀 수 있습니다. 바로잡을 만한 믿음은 방화벽 규칙, 가상 머신, 또는 신중한 운영체제 선택이 세 가지 모두에 답한다는 것입니다. 각 조치는 그중 정확히 하나에 답합니다.
신화: 하나의 통제가 전체 위험을 덮는다
흔한 가정은 신뢰할 수 없는 네트워크에 합류하는 것이 하나의 결정이자 하나의 완화책이라는 것입니다. 사람들은 이미 믿는 통제를 골라 적용하고 위험은 정리되었다고 봅니다. 방화벽은 켜져 있고, 작업 공간은 일회용이며, 클라이언트는 평판 있는 공급자에게서 왔다는 것입니다.
이 통제들은 가정이 암시하는 방식으로 겹치지 않습니다. 호스트 방화벽은 원격 피어가 도달할 수 있는 범위를 제한하지만, 당신의 TLS를 종료하는 운영자에게는 아무것도 하지 않습니다. 가상 머신은 작업 공간을 호스트 파일과 분리하지만, 그 둘 아래의 네트워크 스택을 재구성할 수 있는 클라이언트 구성 요소에는 아무것도 하지 않습니다. 각 통제가 실제로 만드는 경계를 이름 붙이는 것이 이 연습의 전부입니다.
이들을 분리하면 어떤 위험을 받아들이기로 했는지도 알려 줍니다. 대부분의 실제 결정은 한 경계를 완화하고 다른 경계를 용인하며, 변경 기록이 어느 쪽이 어느 쪽인지 적는 한 그래도 괜찮습니다.
원격 피어가 실제로 도달할 수 있는 것
수신 대기하는 서비스부터 시작하십시오. 패킷이 암호화되어 도착했다는 이유로 널리 신뢰된다고 취급되는 터널 인터페이스가 흔한 실수이며, 그것은 그 네트워크의 다른 누구에게나 모든 로컬 수신자를 후보 표적으로 만듭니다. 암호화는 두 끝점 사이의 선로를 보호합니다. 그것은 반대편 피어의 의도에 대해 아무것도 말하지 않습니다.
ss -tulpn sudo nft list ruleset ip -br addr
서비스를 모든 인터페이스가 아니라 필요한 주소에 묶고, 승인된 작업이 요구하는 연산만 허용하십시오. 전달, 브리징, 애플리케이션 프록시는 명시적으로 유지하십시오. 두 개의 네트워크 연결만으로는 통과 경로가 생기지 않지만, 프록시 규칙은 분명히 만들 수 있습니다.
승인된 일회용 작업 공간은 원격 네트워크가 도달할 수 있는 범위를 줄이지만, 공유 설정이 주장과 일치할 때만 그렇습니다. 공유 폴더, 클립보드 통합, 자격 증명 에이전트, 관리 채널은 모두 작업 공간이 만들어야 했던 경계를 넘습니다. 작업 공간의 라벨은 그중 무엇이 열려 있는지 아무것도 증명하지 않습니다.
NIST의 제로 트러스트 아키텍처는 이 모든 것 뒤에 있는 원칙을 말합니다. 네트워크 위치만으로는 암묵적 신뢰를 주지 않습니다. 터널이 허용된 뒤에도 자원 인증에는 할 일이 있고, 그 네트워크를 또 누가 공유하는지라는 질문에도 할 일이 있습니다.
경로에 있는 운영자가 볼 수 있는 것
VPN은 트래픽을 경로의 다른 지점으로 옮길 뿐, 애플리케이션 암호화를 더하지 않습니다. 공급자가 당신의 TLS를 종료하면 브라우저가 보호했을 내용을 읽을 수 있고, 어떤 로컬 방화벽 규칙도 그것을 바꾸지 않습니다.
실제 목적지에 대해서는 정상적인 인증서 검증을 유지하고 리졸버와 메타데이터 경로를 이해하십시오. DNS 질의는 그 앞에 오는 페이로드보다 많은 것을 드러낼 수 있습니다. 메타데이터만으로, 즉 어느 주소에 언제 접촉했는지는 내용을 읽을 필요 없이 운영자의 질문에 답하는 경우가 많습니다. 그래서 «트래픽은 암호화되어 있다»와 «트래픽은 사적이다»는 서로 다른 주장입니다.
그 가시성이 작업에 받아들일 수 없다면, 답은 더 많은 로컬 필터링이 아니라 다른 승인된 아키텍처입니다. 로컬 필터링은 아직 머물러 있는 경로에서 관찰자를 제거할 수 없습니다.
로컬 클라이언트가 바꿀 수 있는 것
이것이 사람들이 놓치는 경계이며, 다른 둘을 무의미하게 만드는 경계입니다. 리눅스에서 CAP_NET_ADMIN은 자체 네트워크 문맥 안에서 인터페이스 구성, 방화벽 관리, 경로 변경을 포괄합니다. 그 능력을 가진 소프트웨어는 방금 쓴 정책을 다시 쓸 수 있습니다.
getcap /usr/sbin/openvpn systemd-analyze security vpn-client.service ip netns list
네트워크 네임스페이스는 네트워크 상태에는 진짜 경계이고 나머지 모든 것에는 형편없는 경계입니다. 파일 시스템도 자격 증명 저장소도 격리하지 않습니다. 문제 전체의 컨테이너가 아니라 하나의 계층으로 다루십시오.
클라이언트와 그 구성을 유지 관리되는 출처에서 얻고, 그것이 요청하는 권한을 검토하며, 특권 구성 요소는 관리자의 통제 아래 두십시오. 가상 머신은 값비싼 자격 증명 옆에서 설명되지 않은 설치 프로그램을 실행하는 허가가 되지 않고도 적격 평가 경계의 일부가 될 수 있습니다. 설치 프로그램은 당신이 부여한 권한으로 실행되며, 그 권한이 곧 경계입니다.
어떤 경계를 받아들였는지 적어 두십시오
네 가지를 이름 붙이는 문장으로 끝내십시오. 신뢰하는 로컬 코드, 허용된 원격 접근, 보호되는 애플리케이션 데이터, 그리고 남는 운영자 관계입니다. 그 문장은 VM이나 운영체제나 백신 제품이 적대적 네트워크를 안전하게 만들었다는 포괄적 주장보다 값집니다.
그다음 좁은 연산이 작동하고 요구된 거부가 여전히 성립함을 확인하십시오. 터널이 끊긴 뒤에도 마찬가지입니다. 터널이 올라가 있는 동안에만 존재하는 경계는 당신이 문서화한 경계가 아닙니다.
어떤 시험도 모든 취약점이 없다는 것을 증명하지 못하며, 반대로 주장하는 검토는 과장입니다. 정직한 산출물은 잔여 위험과 그것을 받아들인 사람을 지목합니다.