HPKP 보고를 사용하여 공개 키 고정 출시

에밀리 스타크

사이트에서 SSL을 사용하는 것은 사용자의 보안과 개인 정보를 보호하는 중요한 방법입니다. 하지만 SSL을 사용 설정한다고 해서 끝이 아닙니다. 쿠키의 보안 속성 설정, HTTP 엄격한 전송 보안 사용 설정, 콘텐츠 보안 정책 사용으로 사이트 권한 잠금 설정 등 다양한 조치를 통해 사이트에서 제공하는 보안을 강화할 수 있습니다. 하지만 이렇게 강력한 기능을 배포하기가 어려울 수도 있습니다 Chrome 46에서는 더욱 엄격한 형태의 SSL을 출시할 수 있도록 HPKP 보고라는 기능이 함께 제공됩니다.

이러한 약어는 무엇을 의미하나요?

오늘날의 웹 보안은 SSL 인증서를 사용합니다. 웹사이트의 신원을 증명하는 암호화 서명입니다. 브라우저에서 https://developers.google.com과 같은 URL로 요청을 보내면 서버에서 SSL 인증서를 제공하며, 인증서가 유효하면 브라우저에서 요청 진행을 허용하고 주소 표시줄에 녹색 자물쇠와 함께 웹사이트 URL을 표시합니다.

하지만 유효한 인증서는 무엇입니까? 유효한 것으로 간주되려면 인증서는 인증 기관 (CA) 또는 CA가 서명한 다른 인증서 (중개 CA라고 함)가 서명해야 합니다. 브라우저와 운영체제에는 인증서를 발급할 수 있는 수백 개의 CA 목록이 포함되어 있습니다. 하지만 문제는 이러한 CA가 기본적으로 모든 웹사이트에 대해 인증서를 발급할 수 있다는 것입니다. 그중 하나라도 손상되거나 오작동하는 경우 웹 전체가 피해를 입을 수 있습니다.

HTTP 공개 키 고정(HPKP)을 입력하세요. 이 표준을 사용하면 웹사이트에서 브라우저가 SSL 인증서 체인의 일부를 기억 (또는 '고정')하도록 지시하는 HTTP 헤더를 보낼 수 있습니다. 그러면 브라우저는 이전에 수신한 핀과 일치하지 않는 후속 연결을 거부합니다. 다음은 HPKP 헤더의 예입니다.

Public-Key-Pins:  
       pin-sha256="d6qzRu9zOECb90Uez27xWltNsj0e1Md7GkYYkVoZWmM=";  
       pin-sha256="LPJNul+wow4m6DsqxbninhsWHlwfp0JecwQzYpOLmCQ=";  
       max-age=259200

이 헤더는 두 개의 인증서 해시를 핀으로 지정합니다. 하나는 사이트 인증서 체인의 인증서 해시이고 다른 하나는 백업 핀 또는 사이트에서 인증서를 순환해야 할 때 사용할 수 있는 인증서의 해시입니다. 헤더에는 max-age 값도 포함됩니다. 1초가 지나면 브라우저에서 핀을 기억하지 않습니다.

일반적인 HPKP에 대한 자세한 내용은 사양 또는 동료 Chrome 개발자 크리스 팔머의 블로그 게시물을 참고하세요.

지금 HPKP를 사용 설정할까요?

꼭 그런 것은 아닙니다. HPKP를 배포하면 실수를 해서 실수로 사이트를 도스하기가 쉽습니다. 사이트를 하나의 인증서 세트에 고정한 다음 새 인증서를 배포해야 하는 경우, 핀을 본 사용자는 핀이 만료될 때까지 사이트에 액세스할 수 없습니다 (헤더의 max-age 값 참고).

제대로 파악하기가 까다롭기 때문에 HPKP는 현재 보안에 민감한 유명 사이트에서 주로 사용됩니다. HPKP를 사용 설정하기로 한 경우 매우 짧은 max-age 값으로 시작하고 문제가 없다면 점차적으로 늘려야 합니다.

HPKP 보고란 무엇이며 어떻게 도움이 되나요?

Chrome 46에서 제공되는 HPKP 보고는 HPKP를 출시할 때 구성 오류를 감지하는 데 사용할 수 있는 기능입니다.

먼저 Public-Key-Pins 헤더 대신 Public-Key-Pins-Report-Only 헤더를 전송하여 시작할 수 있습니다.

Public-Key-Pins-Report-Only: 
       max-age=2592000;  
       pin-sha256="E9CZ9INDbd+2eRQozYqqbQ2yXLVKB9+xcprMF+44U1g=";  
       pin-sha256="LPJNul+wow4m6DsqxbninhsWHlwfp0JecwQzYpOLmCQ=";  
report-uri="https://example.net/pkp-report"

사이트에서 이러한 헤더를 전송하면 Chrome은 현재 연결이 핀과 일치하는지 확인하고 일치하지 않으면 report-uri에 보고서를 전송합니다. Chrome은 보고서 전용 헤더의 핀을 기반으로 한 요청을 차단하지 않으므로 HPKP를 사용해 보고 사이트를 DoSing하는 위험을 실행하지 않고 사용자에게 문제가 발생하는지 확인하는 안전한 방법입니다.

보고서 전용 헤더는 수신된 요청에만 적용됩니다. 브라우저는 실제 핀과 달리 보고서 전용 핀을 기억하지 않습니다. 이렇게 하면 사용자의 브라우저에서 잘못된 값을 캐시하지 않고도 구성을 테스트할 수 있으며, 서버가 보고서로 가득 차는 것을 방지하기 위해 점진적으로 (예: 단일 리소스에만) 출시할 수 있습니다.

핀 적용을 시작하기 위해 실제 Public-Key-Pins 헤더를 출시할 때 이 헤더에 report-uri 값을 포함하여 문제가 발생해도 계속 보고서를 받을 수 있습니다.

HPKP 위반 신고에는 어떤 내용이 포함되나요?

HPKP 위반 보고서는 구성된 report-uri에 HTTP POST 요청으로 전송되는 JSON 메시지입니다. 필드 목록은 spec에서 확인할 수 있지만 여기에서는 served-certificate-chainvalidated-certificate-chain 중에서 두 가지를 중점적으로 설명합니다. served-certificate-chain는 요청에 대해 SSL 연결을 설정할 때 Chrome에서 받은 것과 정확히 일치하는 인증서입니다. 반면 validated-certificate-chain는 서버의 인증서의 유효성을 검사하려고 할 때 Chrome이 다시 빌드한 체인이며 놀랍게도 served-certificate-chain와 다를 수 있습니다. 클라이언트마다 인증서 유효성 검사를 수행하는 방식이 다르므로 HPKP 구성 오류가 발생하는 일반적인 원인일 수 있습니다. 예상치 못한 보고서를 받으면 이 입력란을 확인하세요.

마지막 한 가지:

HPKP 보고를 배포하는 경우 Chrome은 보고서 전송 요청을 포함한 모든 요청에 대해 PIN 검사를 수행합니다. 따라서 사이트에 HPKP를 배포한 경우 고정하지 않은 다른 도메인에 HPKP 보고서를 보내야 할 수도 있습니다. 그렇지 않으면 사이트에서 PIN 위반이 발생하면 동일한 도메인으로 신고가 트리거되어 PIN 위반에 실패하게 되므로 보고서가 전송되지 않습니다.

다른 도메인이 없다면 위반 신고를 자동으로 처리해 주는 report-uri.io와 같은 서비스를 대신 사용할 수 있습니다.