OpenVPN 관리 소켓: 제어 채널이지 메트릭이 아니다
승인된 관리 클라이언트는 제어 명령을 보유하며 읽기 전용 보기가 아니다. Unix 소켓을 소유하고, 스냅샷에는 세션을 건너뛰고, TCP는 배제하라.
관리 인터페이스에 상태를 한 번 물으면 그것은 상태 포트처럼 보이기 시작한다. 하지만 그렇지 않다. 클라이언트가 승인되면 프로토콜의 제어 명령을 내릴 수 있고, 그 클라이언트를 실행하는 계정은 그 명령이 데몬에 할 수 있는 모든 것을 물려받는다. 이를 읽기 전용 피드로 취급하는 것이 모니터링 통합을 인증 없는 콘솔로 바꾸는 실수다.
그 믿음과 그 대가
흔한 믿음은 관리 리스너가 메트릭 엔드포인트와 같다는 것으로, 수집기를 붙이고, 카운터를 읽고, 넘어가면 된다. 실제로는 수집기가 제어 기능을 가진 세션을 열고, 배포에 대해 세운 다른 모든 가정은 이제 그 수집기가 잘 동작하는지에 달려 있다.
인터페이스 어디에도 읽기 전용 모드를 광고하지 않는다. 선택할 관찰자 역할은 없고, 구성의 사용자 이름이 그것을 만들어 주지도 않는다.
승인된 클라이언트가 실제로 가진 것
커뮤니티 데몬은 한 번에 하나의 활성 관리 클라이언트만 받아들인다. 그 하나의 슬롯은 GUI, 스크립트, 모니터링 에이전트가 모두 연결할 수 없다는 뜻이며, 첫 번째가 세션을 쥐고 있는 동안 두 번째는 기다리거나 실패한다. 설계가 동시 읽기자를 전제한다면 이미 틀렸다.
주기적 스냅샷으로 충분한 경우, 상태 파일 출력은 라이브 세션 없이 같은 숫자를 준다. 그 파일을 일정 간격으로 쓰고 일반 파일 권한으로 읽으면 수집기는 제어 평면 밖에 완전히 머물며, 이것이 대부분의 모니터링이 실제로 필요로 하는 배치다.
소유한 소켓이지 열린 소켓이 아니다
Unix 도메인 소켓은 제어 경로를 네트워크에서 떼어내므로 변하는 터널 주소를 문제에서 제거한다. 그것이 권한 문제를 없애지는 않는다. 상위 디렉터리는 서비스 계정이 쓸 수 있어야 하고 컨트롤러의 계정이 접근할 수 있어야 하며, 이는 별개의 두 권한이다:
management /run/openvpn/office-management.sock unix /etc/openvpn/management.password
management-client-user vpn-observer
management-client-group vpn-observer비밀번호 파일은 첫 줄에 관리 비밀을 담고 있다. 그 파일을 다른 자격 증명처럼 보호하고, 내용을 로그와 지원 티켓에 남기지 않는다. 사용자와 그룹 제한은 Unix 소켓의 피어 검사이지 파일 시스템 권한이 아니므로, 의도한 프로세스에는 파일 접근과 일치하는 신원이 모두 필요하다.
권한 오류를 없애려고 소켓을 전 세계에 열어 주는 것이 유일하게 피해야 할 조치다. 그것은 로컬 제어 채널을 호스트의 어떤 프로세스든 조종할 수 있는 것으로 바꾼다.
TCP로 게시하는 것은 같은 설계가 아니다
리스너를 TCP 포트로 옮긴다고 더 안전해지거나 더 편리해지지 않는다. 관리 비밀번호는 평문으로 전송되므로, TCP 리스너는 자격 증명과 세션 모두를 경로를 관찰할 수 있는 누구에게나 노출한다. 다른 호스트에서 접근하려면 승인된 관리 채널이나, 필요한 관측만 노출하는 작은 로컬 에이전트가 필요하다.
평문 전송 위의 비밀번호는 기밀성 없는 인증이며, 그 조합은 보호받는 느낌을 주기 때문에 보기보다 나쁘다.
요청하지 않은 시작 의존성
여러 관리 옵션이 데몬의 수명 주기를 바꾼다. 컨트롤러가 연결될 때까지 시작을 붙잡거나 컨트롤러가 사라지면 종료하는 것은 선택적 관찰자를 단단한 의존으로 만든다. 그러면 충돌하는 모니터링 에이전트가 터널도 함께 끌어내린다.
소켓 자체를 넘어서 무엇이든 활성화하기 전에 그 옵션들을 검토하라. 선택적 관측은 선택적으로 남아야 하고, 재시작 정책은 그래프를 위해 추가한 수집기에 묶여서는 안 된다.
실패한 프로세스 뒤에 남은 소켓 파일은 리스너가 존재한다는 증거가 아니다. 제거하기 전에 어느 인스턴스가 그 경로를 소유하는지 확인하고, 실행 중인 데몬 아래에서 파일을 지우는 대신 서비스 자체의 복구 절차를 사용하라.
승인의 모습
네 가지 검사가 설계를 덮는다: 의도한 컨트롤러 신원이 연결되고, 그 신원이 없는 프로세스는 거부되며, 경고 없이 끊는 컨트롤러에서 데몬이 살아남고, 통제된 재시작을 거쳐도 터널이 트래픽을 실어 나른다. 성공한 관리 연결은 제어 평면만 증명한다. 사설 애플리케이션 트래픽이 동작하는지에 대해서는 아무것도 말하지 않으므로 따로 테스트하라. 네 가지 결과를 다음 운영자가 찾을 수 있는 곳에 적어 두라.
관리 인터페이스 문서는 단일 클라이언트 모델과 프로토콜의 특권적 성격을 설명하며, 대시보드를 그쪽으로 향하기 전에 읽을 만한 부분이 바로 그것이다.