Korzystanie z protokołu SSL w witrynie to ważny sposób na zapewnienie bezpieczeństwa i prywatności użytkownikom. Włączenie SSL to nie wszystko: możesz podjąć wiele działań, aby zwiększyć bezpieczeństwo witryny, od ustawienia atrybutu Secure w plikach cookie po włączenie HTTP Strict Transport Security czy użycie zasad bezpieczeństwa treści w celu zablokowania uprawnień witryny. Wdrożenie tych zaawansowanych funkcji może być czasami trudne. Aby ułatwić wdrożenie bardziej rygorystycznej formy SSL, Chrome 46 zawiera funkcję raportowania HPKP.
Co oznaczają wszystkie te akronimy?
Bezpieczeństwo w internecie opiera się obecnie na certyfikatach SSL: podpisy kryptograficzne potwierdzające, że dana witryna jest tym, za co się podaje. Gdy przeglądarka wysyła żądanie do adresu URL, takiego jak https://developers.google.com, serwer dostarcza certyfikat SSL. Jeśli certyfikat jest prawidłowy, przeglądarka pozwala na kontynuowanie żądania i wyświetla adres URL witryny z zielonym zamkiem w pasku adresu.
Co to jest ważny certyfikat? Aby był uznawany za ważny, musi być podpisany przez urząd certyfikacji (CA) lub inny certyfikat podpisany przez urząd certyfikacji (zwany pośrednim urzędem certyfikacji). Przeglądarki i systemy operacyjne zawierają listę kilkuset urzędów certyfikacji, które mogą wydawać certyfikaty. Problem polega jednak na tym, że domyślnie każdy z tych urzędów certyfikacji może wystawiać certyfikaty dla dowolnej witryny. Jeśli któryś z nich zostanie naruszony lub zacznie działać nieprawidłowo, może to mieć katastrofalne skutki dla całej sieci.
Wpisz nazwę HTTP Public Key Pinning (HPKP). Ten standard pozwala witrynom wysyłać nagłówek HTTP, który instruuje przeglądarkę, aby zapamiętała (lub „przypięła”) części łańcucha certyfikatu SSL. Przeglądarka odrzuci kolejne połączenia, które nie pasują do wcześniej otrzymanych pinezek. Oto przykład nagłówka HPKP:
Public-Key-Pins:
pin-sha256="d6qzRu9zOECb90Uez27xWltNsj0e1Md7GkYYkVoZWmM=";
pin-sha256="LPJNul+wow4m6DsqxbninhsWHlwfp0JecwQzYpOLmCQ=";
max-age=259200
Ten nagłówek określa 2 skróty certyfikatu jako piny. Pierwszy to hasz certyfikatu w łańcuchu certyfikatów witryny, a drugi to kod PIN zapasowy lub hasz certyfikatu, którego witryna może użyć w przypadku konieczności zastąpienia certyfikatu. Nagłówek zawiera też wartość max-age
. Po upływie tej liczby sekund przeglądarka zapomni o pinie.
Więcej informacji o HPKP znajdziesz w specyfikacji lub w wybitnym poście na blogu autorstwa Chrisa Palmera, który jest też deweloperem Chrome.
Czy mam teraz włączyć HPKP?
Niekoniecznie. Podczas wdrażania HPKP łatwo popełnić błąd i przypadkowo zaatakować witrynę za pomocą DoS. Jeśli przypniesz swoją witrynę do jednego zestawu certyfikatów, a potem będziesz musiał wdrożyć nowy, użytkownicy, którzy widzieli przypięty certyfikat, nie będą mogli uzyskać dostępu do Twojej witryny, dopóki nie wygaśnie (na podstawie wartości max-age
w nagłówku).
Ze względu na to, że trudno jest je prawidłowo skonfigurować, obecnie są one używane głównie przez kilka witryn o wysokiej renomie, które wymagają szczególnej ochrony. Jeśli zdecydujesz się włączyć HPKP, zacznij od bardzo krótkiej wartości max-age i stopniowo ją zwiększaj, jeśli nie masz żadnych problemów.
Czym jest raportowanie HPKP i jak może pomóc?
Raportowanie HPKP, dostępne w Chrome 46, to funkcja, której możesz używać 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 witryna wyśle taki nagłówek, Chrome sprawdzi, czy bieżące połączenie jest zgodne z pinami, a jeśli nie, wyśle raport do report-uri
. Chrome nigdy nie będzie blokować żądań na podstawie pinów w nagłówku tylko do raportowania, więc jest to bezpieczny sposób na wypróbowanie HPKP i sprawdzenie, czy powoduje ono problemy u użytkowników, bez ryzyka DoS-a w przypadku Twojej witryny.
Pamiętaj, że nagłówek Report-Only dotyczy tylko żądania, w którym został odebrany. Podczas przeglądania nie są zapamiętywane pinezki tylko do zgłaszania, tak jak ma to miejsce w przypadku prawdziwych pinezek. Pozwoli Ci to przetestować konfigurację bez obaw o zapisywanie w pamięci podręcznej nieprawidłowych wartości w przeglądarkach użytkowników. Możesz też wdrożyć zmiany stopniowo (np. tylko w przypadku jednego zasobu), aby uniknąć zalewania serwera raportami.
Gdy wdrożysz rzeczywisty nagłówek Public-Key-Pins
, aby zacząć stosować piny, możesz w tym nagłówku uwzględnić też wartość report-uri, dzięki czemu w razie wystąpienia problemów nadal będziesz otrzymywać raporty.
Co zawiera raport o naruszeniu zasad HPKP?
Raport o naruszeniu HPKP to wiadomość w formacie JSON wysłana w żądaniu HTTP POST do skonfigurowanego report-uri
. Listę pól znajdziesz w specyfikacji, ale tutaj wyróżnię 2 z nich: served-certificate-chain
i validated-certificate-chain
. served-certificate-chain
to certyfikat w takim samym formacie, w jakim Chrome otrzymał go podczas konfigurowania połączenia SSL dla żądania. Z drugiej strony validated-certificate-chain
to łańcuch odtworzony przez Chrome podczas próby sprawdzenia certyfikatu serwera, który może się okazać inny niż served-certificate-chain
. Różne klienty weryfikują certyfikaty na różne sposoby, co może być częstą przyczyną nieprawidłowej konfiguracji HPKP. Jeśli otrzymujesz nieoczekiwane raporty, koniecznie zaznacz to pole.
Jeszcze jedna ważna uwaga
Jeśli wdrażasz raportowanie HPKP, pamiętaj, że Chrome weryfikuje piny we wszystkich żądaniach, w tym w żądaniach wysyłania raportów. Jeśli masz wdrożone HPKP dla swojej witryny, prawdopodobnie chcesz wysyłać raporty HPKP do innej domeny, której nie masz przypiętej. W przeciwnym razie naruszenie zasad dotyczących pinów w Twojej witrynie spowoduje wygenerowanie raportu dotyczącego tej samej domeny, który również zostanie odrzucony z powodu naruszenia zasad dotyczących pinów, więc nie otrzymasz tego raportu.
Jeśli nie masz pod ręką innej domeny, możesz skorzystać z usługi takiej jak report-uri.io, która zajmuje się raportami o naruszeniu.