실험

실험

나는 여러 개의 가상 호스트를 실행하는 웹 서버를 가지고 있으며, 도청자가 클라이언트가 어떤 가상 호스트에 액세스하고 있는지 알려주지 못하게 하고 싶습니다. 이 문제를 해결하기 위한 TLS 확장 프로그램인 암호화된 SNI가 이미 있습니다. Cloudflare가 서버에서 이를 지원하고 Firefox에는 클라이언트에서 이를 활성화하는 설정이 있다는 것을 알았습니다. 하지만 내 서버에서 이를 활성화하는 방법에 대한 문서를 찾을 수 없습니다. 어떻게 해야 하나요? (저는 특정 서버 스택에 얽매이지 않으며 "Cloudflare 뒤에 배치" 이외의 모든 작업 설정/아키텍처를 허용합니다.)

답변1

ESNI(암호화된 서버 이름 표시)는 여전히 인터넷 초안이므로 변경될 수 있으므로 주요 서버 구현에서는 찾을 수 없습니다. 실제로 Firefox가 구현한 초안 버전은 다음을 지원합니다.초안-ietf-tls-esni-01와 호환되지 않는 것최신초안 버전.

2019년 4월 관찰한 생태계 현황을 포스팅했습니다.여기:

보시다시피 Nginx와 Apache에서 사용되는 OpenSSL은 이를 지원하지 않습니다. 당신은 구축을 시도할 수 있습니다캐디패치된 Go crypto/tls 라이브러리 사용(사용tls-tris의 이 PR), 하지만 시간이 지나면 작동하지 않을 수도 있습니다.

실험

을 위한실험또는 교육 목적으로 esnitool 및 tris-localserver를 사용할 수 있습니다.TLS-트리스. Linux 또는 macOS에 적절한 Go 도구 모음이 설치되어 있다고 가정하면 다음과 같이 작동합니다.

# Get source code and build stuff
git clone https://github.com/cloudflare/tls-tris -b pwu/esni
cd tls-tris
make build-esnitool
(cd _dev/tris-localserver && ../go.sh build -v -i .)

# Generate ESNI key material, valid for 24 hours (one day)
_dev/esnitool/esnitool -validity=24h -esni-keys-file=esni.pub -esni-private-file=esni.key

두 개의 파일이 생성됩니다.

  • /wFsX6klACQA...AAAA=esni.pub - DNS에서 구성해야 하는 값입니다 . 에 대해 ESNI를 구성하려면 해당 항목 www.example.com에 대한 TXT 레코드를 만드세요._esni.www.example.com/wFsX6klACQA<snip>AAAA= . 이 형식은 Firefox 및 Cloudflare에서 지원하는draft-ietf-tls-esni-01 사양을 준수합니다. 그렇습니다~ 아니다최신 초안 사양을 사용하세요.
  • esni.priv - 테스트 구현과 관련된 개인 키 파일입니다.

테스트 서버는 다음과 같이 시작할 수 있습니다.

_dev/tris-localserver/tris-localserver -esni-keys=esni.pub -esni-private=esni.priv

그 다음에ESNI 사용을 활성화하도록 Firefox 구성, 열고 about:config설정network.security.esni.enabled . 또한 DNS-over-HTTPS도 활성화해야 합니다. Firefox 지침은 해당 페이지에서 찾을 수 있습니다. 각 기본 설정에 대한 자세한 내용은 여기에서도 확인할 수 있습니다.https://bagder.github.io/TRRPrefs/

이 지침은 지금은 효과가 있을 수 있지만 Firefox가 최신 초안 버전을 지원하도록 업데이트될 가능성이 높기 때문에 향후에는 작동하지 않을 것입니다. 위의 esnitool은 허용되는 암호화 제품군(AES128-GCM)과 키 교환 알고리즘(X25519)도 하드 코딩합니다. 이는 Cloudflare에서 사용하는 매개변수를 반영합니다.

주목

ESNI는 TLS 1.3을 의미하므로 인증서와 포함된 호스트 이름이 암호화됩니다. ESNI를 활성화하고 DoH(DNS-over-HTTPS) 또는 DoT(DNS-over-TLS)와 같은 보안 DNS 전송을 사용하면 서버 이름이 실제로 유선상에서 표시되지 않습니다. 이는 Wireshark에서 다음을 사용하여 확인할 수 있습니다. frame contains "wireshark"방문할 때 와 같이 필터링합니다 wireshark.org.

그러나 단일 IP가 몇 개의 도메인만 호스팅하는 경우 모든 수동적 공격자는 귀하가 해당 도메인 중 하나를 방문하고 있다고 추측할 수 있습니다. Cloudflare와 같은 대규모 운영자는 이것이 큰 문제가 되지 않는 더 많은 도메인을 보유하고 있습니다.

ESNI는 반정적 키를 사용하므로 개인 키가 손상되면 도청자가 암호화된 서버 이름을 해독할 수 있습니다. 이것이 ESNI 키가 자주 순환되고 자동화가 필요한 이유입니다. Cloudflare에는 DNS에 ESNI 키가 잘 통합되어 있으며 HTTPS 서비스는 정기적으로 업데이트됩니다.

결론적으로 ESNI는 유망하지만 클라이언트(웹 브라우저), 보안 전송(DoH/DoT)을 통한 DNS 서버 및 웹 서버의 지원이 필요합니다. 아직 개발 중이므로 개발을 면밀히 따르지 않는 한 실험 이외의 용도로 설정하는 것은 좋지 않을 것입니다.

답변2

이전의 매우 상세한 답변은 재사용에 영감을 받았습니다.TLS-트리스실제로 ESNI를 사용하여 TLS 1.3을 종료하고 일반 트래픽을 선택한 백엔드로 전달할 수 있는 작은 esni 역방향 프록시를 구축합니다. 이를 통해 사용 중인 웹 서버를 수정하지 않고도 ESNI를 쉽게 사용할 수 있습니다. 소스 코드와 자세한 지침은 여기에서 찾을 수 있습니다.esni-rev-프록시

관련 정보