Visual Studio가 VPN에서만 느린가요? CRL과 OCSP를 확인하세요
WDAC 정책이 적용되면 느린 실행 하나가 터널이 아니라 해지 조회일 수 있습니다. 정책을 완화하기 전에 어느 단계가 막는지 증명하세요.
Visual Studio는 집에서는 정상적으로 시작되지만, 같은 노트북이 회사 터널에 연결되면 모든 실행이 시작 화면에서 삼십 초 동안 멈춥니다. 정책을 제거하면 지연도 함께 사라지고, 터널을 제거하면 같은 일이 벌어집니다. 두 관찰 모두 정확하므로 두 구성 요소가 계속 서로를 탓합니다. 결정적인 질문은 인증서 해지 조회가 터널만 제공하는 경로를 기다리는지, 아니면 그러한 경로를 전혀 찾지 못하는지입니다.
실행이 아니라 가져오기 시간을 측정하세요
서명된 WDAC 정책은 SiPolicy.p7b 파일로 배포되며, 컴퓨터에서 어떤 이미지가 실행될 수 있는지 결정합니다. 코드 무결성은 실행 전에 이미지의 서명 체인을 검증하며, 그 검증에는 해지 질문이 포함될 수 있습니다. 답은 인증서가 내부에 명시한 CRL 배포 지점이나 OCSP 응답자에 따라 달라집니다.
이는 일반적인 네트워크 요청이므로 비용은 응답자가 어디에 있는지에 달려 있습니다. 터널을 통해서만 접근할 수 있거나 이름이 터널 뒤의 DNS 서버를 통해서만 확인되는 경우, 검증은 터널이 준비될 때까지 기다립니다. Visual Studio는 시작할 때 다수의 서명된 어셈블리와 확장을 로드하며, 이미지당 작은 지연이 눈에 보이는 멈춤이 됩니다. 잘못된 것은 없고 정책은 구성된 그대로 동작하므로, 정책을 제거하면 문제가 해결된 것처럼 보입니다.
서명된 모든 이미지가 네트워크 호출을 일으킬 수 있습니다
디스크에 이미 있는 서명된 바이너리로 시작해 실행이 사용하는 것과 동일한 가져오기 동작으로 플랫폼에 검증을 요청하세요. 명령을 터널에서 한 번, 외부에서 한 번 실행한 뒤 최종 판정 대신 가져오기 줄을 비교하세요.
certutil -verify -urlfetch C:\Tools\Contoso.Editor.dll
nslookup ocsp.contoso.example
Test-NetConnection ocsp.contoso.example -Port 80
출력에는 체인, CRL 및 OCSP 주소, 각 가져오기의 성공 여부가 나열됩니다. 터널에서 시간 초과되고 외부에서 응답하는 응답자가 바로 필요한 증거이며, 느리다는 인상보다 훨씬 무겁습니다. 가져오기가 느리게 성공하면 다음 단계에서 해당 호스트를 직접 테스트할 수 있도록 주소를 기록하세요.
응답자의 호스트 이름을 확인하고 애플리케이션 외부에서 도달 가능성을 테스트하세요. 확인되지 않는 이름은 클라이언트 설정으로 절대 고쳐지지 않기 때문입니다. CodeIntegrity 운영 로그가 증거의 나머지 절반을 제공하며, 검증 이벤트를 느린 실행의 타임스탬프와 연결합니다.
제어를 제거하지 않고 지연을 줄이세요
정책을 비활성화하거나 감사 모드로 전환하면 지연이 사라지고 조직이 배포한 제어도 사라지므로, 그것을 잘못된 복구로 보세요. 더 좁은 선택지는 응답자가 터널을 통해 도달 가능하도록 하는 라우팅 변경, 응답자 호스트에 대한 분할 터널 예외, 이름이 도달할 수 없는 주소로 확인될 때의 DNS 수정, 또는 해지 데이터를 위한 지원되는 캐싱 프록시입니다. 각각 소유자가 다릅니다. PKI 팀은 응답자 도달 가능성을, 네트워크 팀은 터널 분할을, 엔드포인트 팀은 정책을 담당합니다.
모든 해지 호스트를 터널에서 제외하는 것이 자동으로 안전하지는 않습니다. 내부 응답자가 의도적으로 내부에 있을 수 있기 때문입니다. 인증서 검사를 조용히 공용 인터넷으로 보내는 규칙을 작성하기 전에 PKI를 운영하는 팀과 예외를 확인하세요. 그 확인 없이 만든 변경은 다음 정책 새로 고침에서 되돌려지는 종류입니다.
변경 후 콜드 스타트를 검증하세요
두 상태 모두에서 콜드 스타트를 측정하고 숫자를 보관하세요. 어셈블리가 캐시된 뒤에는 웜 스타트가 거의 아무것도 증명하지 못하기 때문입니다. 새 세션에서 실행을 반복해 확장 로드 경로를 다시 거치게 하세요.
Get-WinEvent -LogName Microsoft-Windows-CodeIntegrity/Operational -MaxEvents 40 |
Where-Object { $_.TimeCreated -gt (Get-Date).AddMinutes(-10) }
Get-ChildItem C:\Windows\System32\CodeIntegrity\CiPolicies\Active
Get-CimInstance -ClassName Win32_DeviceGuard -Namespace root\Microsoft\Windows\DeviceGuard
복구된 구성은 여전히 응답자와 통신하거나 PKI 팀이 승인한 캐시 경로를 사용하며, 로그는 검증이 시간 초과되지 않고 완료됨을 보여 줍니다. 최근에 서명된 애플리케이션이 여전히 시작되는지 확인하세요. 모든 것을 허용하는 정책은 성공적인 복구가 아닙니다. 활성 정책 폴더와 적용 상태도 확인해 디버깅하는 정책이 실제로 실행 중인 정책임을 알 수 있게 하세요. 인증서 체인, 응답자 주소, 실행 타임스탬프를 같은 티켓에 보관하세요. 갱신은 보통 응답자를 옮기고 예외나 DNS 규칙을 낡은 채로 남기기 때문입니다.