VPN 내부의 OAuth: 어떤 구간이 여전히 TLS를 요구하는가
VPN은 누가 서버에 도달하는지를 바꾸지, OAuth 메시지가 어떻게 이동하는지를 바꾸지 않는다. 구간별로 판단하라: 인가 응답, 토큰 요청, 베어러 호출.
사설 라우팅은 누가 서버에 도달하는지를 정하고, OAuth의 전송 규칙은 각 메시지가 어떻게 이동하는지를 정한다. 브라우저, 인가 서버, 토큰 엔드포인트, 리소스 서버는 모두 같은 VPN 뒤에 있으면서도 서로 다른 구간으로 메시지를 교환할 수 있다. 각 구간에는 고유한 전송 요구 사항이 있고, VPN은 그중 어느 것도 완화하지 않는다. VPN 경계와 프로토콜 경계는 서로 다른 선이다.
네트워크를 신뢰할 수 있는지 묻기를 멈추고 어떤 교환이 어떤 경계를 넘는지 묻기 시작하면 결정이 더 쉬워진다.
네트워크가 아니라 구간으로 판단하라
엔드포인트를 따로 적어라. 인가 엔드포인트, 토큰 엔드포인트, 리디렉션 URI, 리소스 서버 URL, TLS 종료 지점, VPN 게이트웨이를 적고, 그다음 각 요청을 어느 쪽이 시작하고 응답이 어디로 가는지 표시하라.
게이트웨이에서 종료되는 VPN은 그 게이트웨이까지의 구간을 암호화한다. 요청은 그 뒤에서 평범한 HTTP로 계속될 수 있으며, 앞선 구간이 암호화되었다고 해서 남은 구간이 HTTPS가 된 것은 아니다. 프로토콜이 신경 쓰는 구간이 바로 이 연속 부분이다. 첫 홉을 암호화한다고 두 번째 홉이 안전해지지는 않는다.
전송은 서비스 신원 확인도 함께 진다. 브라우저는 애플리케이션 URL의 인증서를 검증하지만, VPN은 브라우저를 대신해 그 검증을 수행하지 않으며 검증되지 않은 엔드포인트를 받아들일 만한 것으로 만들지도 않는다. 인증서는 클라이언트가 호출한다고 믿는 엔드포인트의 이름을 담는다. 게이트웨이로 가는 터널은 그 엔드포인트의 이름을 바꾸지도, 검증하지도 않는다.
인가 응답과 리디렉션 URI
OAuth의 현행 보안 모범 사례는 암호화되지 않은 연결로 인가 응답을 전송하는 것을 금지한다. 이는 최초 요청뿐 아니라 인가 코드나 토큰을 클라이언트로 되돌려 보내는 리디렉션도 포함한다.
같은 지침은 명시된 네이티브 클라이언트 루프백 경우를 제외하고 HTTP 리디렉션 URI를 허용하지 않는다. 내부 호스트 이름이라고 해서 새로운 예외가 생기지 않으며, VPN 내부에서만 확인되는 DNS 이름도 스킴이 그렇게 말한다면 여전히 HTTP URL이다. 등록된 URI의 스킴을 확인하라, 호스트 이름만 보지 말고.
정확한 HTTPS 리디렉션 URI를 인가 서버에 등록하고 클라이언트에서 인증서 검증을 켜 둬라. HTTPS 요구 사항을 억제하는 개발용 지름길은 그것이 모델링해야 할 운영 구성과 다르게 동작하는 흐름을 만든다.
토큰 엔드포인트와 베어러 토큰 요청
토큰 요청은 자격 증명이나 접근 권한과 교환할 수 있는 코드를 진다. 보호되지 않은 구간으로 보내면 주변 네트워크가 사설이라 해도 리소스 서버가 나중에 신뢰할 자료를 노출한다. 요청을 읽을 수 있는 프록시는 그것이 지닌 자격 증명도 읽을 수 있다.
베어러 토큰을 사용하는 리소스 요청에 대해 RFC 6750은 해당 명세에서 TLS를 구현하고 사용하는 것을 의무로 본다. 사무실 서브넷을 신뢰한다고 부르는 것은 평문 베어러 배포에 필요한 일반적인 프로토콜 예외가 아니다.
두 구간 모두 문서화된 안전한 엔드포인트 URL을 사용하라. 라이브러리가 HTTP 토큰 엔드포인트 호출을 거부한다면 그 거부는 명세가 작동하는 것이지 우회할 구성 오류가 아니다. 그 URL은 런타임에 도출하지 말고 클라이언트 구성에 기록하라.
TLS가 끝나는 곳과 그 뒤에 남는 것
TLS가 권한이 부여된 프런트엔드에서 끝난다면 그 프런트엔드를 지목하고 그곳에서 애플리케이션까지의 경로를 검토하라. 프런트엔드는 남은 구간의 전달, 신뢰, 기밀성에 책임을 지게 되며, 서비스의 지원 아키텍처는 그 배치를 설명해야 한다.
경로의 다른 곳에 있는 VPN은 그 책임을 해결하지 않는다. 브라우저가 보는 애플리케이션 URL이 프런트엔드가 제시하는 인증서와 일치하는지도 알려주지 않는다.
내부 배포라면 종료 지점과 그것이 제시하는 신원을 기록하라. 다른 이름의 인증서로 TLS를 종료하는 프런트엔드는 운영자가 고치는 대신 흔히 억제하는 브라우저 경고를 만든다.
네이티브 루프백 예외는 좁다
루프백 리디렉션 예외는 클라이언트와 브라우저가 같은 기기를 공유하는 사용자 자신의 기기에서의 콜백에 관한 것이다. 그 배치는 한 기기에서의 콜백에 속하며, 일반 인가 서버나 토큰을 지닌 API를 HTTP로 사무실 서브넷에 제공할 권한을 주지 않는다.
예외는 그것이 설명하는 클라이언트 유형과 콜백으로 한정하라. 이를 웹 애플리케이션, 공유 내부 서비스, 다른 호스트의 리디렉션 URI에 적용하면 배포가 바뀌는 것이지 예외가 바뀌는 것이 아니다.
각 경계에서 실제 흐름을 시험하고 클라이언트 유형과 비교하라. 작동하는 리디렉션은 토큰을 지닌 모든 구간이 요구된 보호를 사용했는지에 대해 아무것도 말하지 않으며, 초록색 VPN 아이콘은 다음 요청의 스킴에 대해 아무것도 말하지 않는다.