Wdrażanie przypinania kluczy publicznych w ramach raportowania HPKP

Emily Stark

Używanie protokołu SSL w witrynie to ważny sposób na zapewnienie bezpieczeństwa i prywatności użytkowników. Włączenie protokołu SSL nie kończy się jednak na tym, że witrynę można lepiej zabezpieczyć na wiele sposobów: od ustawienia atrybutu bezpiecznego w plikach cookie przez włączenie protokołu HTTP Strict Transport Security po użycie polityki bezpieczeństwa treści do zablokowania uprawnień witryny. Wdrożenie tych zaawansowanych funkcji może jednak być trudne. Aby pomóc w wdrożeniu bardziej rygorystycznego protokołu SSL, w Chrome 46 udostępniamy funkcję o nazwie raportowanie HPKP.

Co oznaczają te wszystkie akronimy?

Bezpieczeństwo w internecie opiera się obecnie na certyfikatach SSL, czyli podpisach kryptograficznych, które potwierdzają tożsamość danej witryny. Gdy przeglądarka wysyła żądanie na adres URL taki jak https://developers.google.com, serwer dostarcza certyfikat SSL, a jeśli jest on ważny, przeglądarka zezwala na jego kontynuowanie i wyświetla adres URL witryny z zieloną kłódką w pasku adresu.

Jaki certyfikat jest jednak ważny? Aby certyfikat został uznany za ważny, musi być podpisany przez urząd certyfikacji (CA) lub inny certyfikat podpisany przez urząd certyfikacji (nazywany pośrednim urzędem certyfikacji). Przeglądarki i systemy operacyjne zawierają listę kilkuset urzędów certyfikacji, które są zaufane w celu wystawiania certyfikatów. Problem polega jednak na tym, że domyślnie każdy z urzędów certyfikacji może wystawiać certyfikaty dla dowolnej witryny. Jeśli któreś z nich zostanie przejęte lub będzie się zachowywać w niewłaściwy sposób, może to mieć katastrofalne skutki dla całej sieci.

Wpisz przypinanie klucza publicznego HTTP lub HPKP. Ten standard pozwala witrynom wysyłać nagłówek HTTP instruujący przeglądarkę, by pamiętała (czyli „przypinała”) części łańcucha certyfikatów SSL. Przeglądarka odrzuca kolejne połączenia, które nie pasują do otrzymanych wcześniej kodów PIN. Oto przykład nagłówka HPKP:

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

Ten nagłówek określa dwa hasze certyfikatów w postaci kodów PIN. Pierwszy to skrót certyfikatu w łańcuchu certyfikatów witryny, a drugi to zapasowy kod PIN lub hasz certyfikatu, którego witryna może użyć w razie konieczności przeprowadzenia rotacji certyfikatu. Nagłówek zawiera też wartość max-age. Po upływie tej liczby sekund przeglądarka zapomni kod PIN.

Więcej informacji o HPKP znajdziesz w specyfikacji i w świetnym poście na blogu innego dewelopera Chrome, Chrisa Palmera.

Czy mam teraz włączyć HPKP?

Niekoniecznie. Przy wdrażaniu HPKP łatwo jest popełnić błąd i przypadkowo doprowadzić witrynę do ataku. Jeśli przypniesz witrynę do jednego zestawu certyfikatów, a później musisz wdrożyć nowy, użytkownicy, którzy zobaczyli kod PIN, nie będą mogli uzyskać do niej dostępu do momentu wygaśnięcia kodu PIN (zgodnie z wartością max-age w nagłówku).

Prawdziwe podejście nie jest łatwe, dlatego HPKP jest obecnie używany głównie przez kilka zaawansowanych witryn, które są szczególnie niebezpieczne dla bezpieczeństwa. Jeśli zdecydujesz się włączyć HPKP, zacznij od bardzo krótkiej wartości max-age i stopniowo ją zwiększaj, gdy nie wystąpią problemy.

Co to jest raportowanie HPKP i w czym może pomóc?

Raportowanie HPKP w Chrome 46 to funkcja, której możesz użyć do wykrywania błędów konfiguracji podczas wdrażania HPKP.

Najpierw możesz wysłać nagłówek Public-Key-Pins-Report-Only zamiast nagłówka Public-Key-Pins:

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"

Gdy Twoja witryna wyśle taki nagłówek, Chrome sprawdzi, czy bieżące połączenie jest zgodne z kodami PIN, a w przeciwnym razie wyśle do interfejsu report-uri raport. Chrome nigdy nie będzie blokować żądań na podstawie kodu PIN w nagłówku „Tylko raportowanie”. Jest to bezpieczny sposób testowania rozwiązania HPKP przez użytkowników bez ryzyka ataku na witrynę.

Pamiętaj, że nagłówek „Tylko raporty” ma zastosowanie tylko do żądania, w którego przypadku został otrzymany. Przeglądarka nie zapamiętuje pinezek używanych tylko do raportowania tak samo jak w przypadku prawdziwych pinezek. Dzięki temu możesz przetestować konfigurację bez obaw o buforowanie nieprawidłowych wartości w przeglądarkach użytkowników. Możesz też wdrażać je stopniowo (na przykład tylko w jednym zasobie), aby uniknąć zalania serwera raportami.

Gdy wdrażasz prawdziwy nagłówek Public-Key-Pins, aby zacząć egzekwować kody PIN, możesz w nim też umieścić wartość report-uri, aby w razie problemów nadal otrzymywać raporty.

Co znajduje się w zgłoszeniu naruszenia zasad HPKP?

Raport o naruszeniu HPKP to wiadomość JSON wysłana w żądaniu HTTP POST na skonfigurowany przez Ciebie report-uri. Listę pól można znaleźć w spec, ale tutaj wyróżnię 2 z nich: served-certificate-chain i validated-certificate-chain. served-certificate-chain jest certyfikatem dokładnie w takiej postaci, w jakiej został odebrany przez Chrome podczas konfigurowania połączenia SSL dla tego żądania. validated-certificate-chain to natomiast łańcuch utworzony przez Chrome podczas próby zweryfikowania certyfikatu serwera. Co ciekawe, może on różnić się od łańcucha served-certificate-chain. Różni klienci przeprowadzają weryfikację certyfikatu na różne sposoby. Może to być częstą przyczyną błędów konfiguracji HPKP. Pamiętaj, by zaznaczyć to pole, jeśli otrzymujesz nieoczekiwane raporty.

I ostatnie pytanie

Jeśli wdrażasz raportowanie HPKP, pamiętaj, że Chrome weryfikuje przypięcie wszystkich żądań, w tym żądań wysyłania raportów. Jeśli więc w swojej witrynie wdrożysz HPKP, prawdopodobnie zechcesz wysyłać raporty HPKP do innej domeny, która nie jest przypięta. W przeciwnym razie naruszenie kodu PIN w Twojej witrynie spowoduje wysłanie zgłoszenia do tej samej domeny. W rezultacie nie otrzymasz zgłoszenia o naruszeniu przypięcia.

Jeśli nie masz pod ręką innej domeny, możesz wypróbować usługę, taką jak report-uri.io, która obsługuje zgłoszenia naruszeń za Ciebie.