NoName_1000 | 2020-02-07 11:30:45 UTC | #1
W tym poradniku dowiesz się jak skonfigurować serwer WWW aby móc logować się certyfikatem zabezpieczeń.
Wstęp
Logowanie certyfikatem do strony internetowej jest wygodnym i bezpiecznym sposobem autoryzacji. Aby móc zalogować się do zabezpieczonej strony przy pomocy wyżej wymienionego sposobu należy posiadać na komputerze certyfikat (który jest cyfrowo podpisany przez serwer) w magazynie “Osobisty” (w przypadku Windowsa). Jeżeli taki certyfikat (wraz z kluczem prywatnym) posiadamy to przy próbie wejścia na zabezpieczoną stronę pokaże się komunikat dot. wyboru certyfikatu jakim chcemy się zalogować, wybieramy certyfikat, klikamy OK i mamy dostęp.
Zasada działania
Mechanizm logowania certyfikatem do strony WWW działa na bazie infrastruktury klucza publicznego (PKI).
Infrastruktura klucza publicznego (PKI) składa się z:
Urząd certyfikacji (CA) to podmiot który wystawia certyfikaty cyfrowe. Kluczem CA cyfrowo podpisuje się certyfikat subskrybenta, podpisany cyfrowo certyfikat subskrybenta automatycznie ma dostęp do chronionej zawartości strony WWW. CA też generuje listy unieważnionych certyfikatów (CRL) , jeżeli certyfikat użytkownika znajduje się na takiej liście to wtedy użytkownik nie będzie mógł się zalogować.
Urząd rejestracji (RA) to podmiot zbierający wnioski o złożenie podpisu cyfrowego na certyfikacie (plik .csr). RA może weryfikować tożsamość subskrybentów i decydować czy podpis cyfrowy zostanie złożony.
Organ zatwierdzający (VA) jest to system który weryfikuje poprawność certyfikatu wysłanego do serwera i sprawdza czy wysłany certyfikat nie znajduje się na liście CRL (lista unieważnionych certyfikatów).
Subskrybent to podmiot który posiada certyfikat cyfrowo podpisany przez CA. Inaczej osoba która ma dostęp do zawartości chronionej na serwerze WWW.
Administrator serwera WWW który chce dać użytkownikowi dostęp do zawartości chronionej na serwerze WWW musi użytkownikowi wygenerować certyfikat który jest cyfrowo podpisany przez CA. Po wygenerowaniu certyfikatu administrator przekazuje certyfikat wraz z kluczem prywatnym użytkownikowi, użytkownik musi certyfikat zainstalować na swoim urządzeniu. Przy każdym wejściu na stronę WWW użytkownik cyfrowo podpisuje swoim certyfikatem żądanie dostępu, następnie certyfikat z podpisanym żądaniem jest wysyłany na serwer WWW, serwer WWW wysyła żądanie weryfikacji do VA gdzie jest sprawdzana poprawność podpisu cyfrowego i jest sprawdzana obecność certyfikatu na liście CRL. VA wysyła serwerowi WWW odpowiedź pozytywną lub negatywną. Jeżeli serwer otrzyma odpowiedź pozytywną od VA to wtedy użytkownik zostanie zalogowany, w przeciwnym razie użytkownikowi wyświetli się odpowiedni komunikat.
Koniec tej teorii, pewnie nikt tego nie czytał
Infrastruktura klucza publicznego (PKI) będzie odpowiedzialna za wystawianie/anulowanie certyfikatów i sprawdzania ich poprawności. PKI nie jest serwerem czy usługą, PKI możemy nawet zrobić na swoim komputerze czy na maszynie która nie ma dostępu do internetu a listę certyfikatów anulowanych (CRL) można aktualizować manualnie.
Aby zainstalować narzędzie które pomoże w tworzeniu PKI w systemie Ubuntu czy Debian należy wykonać polecenie:
apt install easy-rsa
Po zainstalowaniu easy-rsa
należy stworzyć katalog w którym będzie się znajdować PKI, robimy to tym poleceniem:
make-cadir [nazwa katalogu]
następnie przechodzimy do katalogu w którym jest PKI, w tym celu wykonujemy to polecenie:
cd [nazwa katalogu]
teraz trzeba edytować pare linijek w pliku vars
, aby otworzyć edytor należy użyć tego polecenia (na potrzeby poradnika użyłem polecenia nano) :
nano vars
przechodzimy do linijki nr. 29 i edytujemy wartość export KEY_CONFIG
. Należy usunąć wartość $EASY_RSA/witchopensslcnf $EASY_RSA
i zastąpić wartością "$EASY_RSA/openssl-1.0.0.cnf"
. Linijka nr. 29 powinna wyglądać tak:
następnie przechodzimy do linijki nr. 69 i trzeba teraz edytować wartości następujących zmiennych:
Przykładowa konfiguracja:
Zapisujemy plik vars
i wychodzimy z edytora.
Po dokonaniu zmian w pliku vars
należy wykonać następujące polecenia:
source vars
./clean-all
./build-ca
Po wykonaniu polecenia ./build-ca
openssl będzie nas pytał o dane do certyfikatu, zostawiamy wartości domyślne (klikamy cały czas enter aż do momentu kiedy pokaże się znak zachęty).
Nie będę tutaj opisywać jak skonfigurować serwer WWW tylko opiszę jak skonfigurować VirtualHosta tak aby wymagał certyfikatu zabezpieczeń.
Konfiguracja dla apache2
VirtualHost w apache2 musi mieć skonfigurowany SSL i musi być wymuszone przekierowanie z HTTP na HTTPS.
Tworzymy folder ssl
w którym będą przechowywane certyfikaty CA. Robimy to poleceniem:
mkdir /etc/apache2/ssl
teraz przechodzimy do folderu w którym mamy PKI. Następnie trzeba przejść do folderu keys
poleceniem:
cd keys
następnie trzeba skopiować plik ca.crt
do /etc/apache2/ssl
, robimy to poleceniem:
cp ca.crt /etc/apache2/ssl
Otwieramy konfigurację VirtualHosta którego chcemy zabezpieczyć. Po otworzeniu konfiguracji VirtualHosta należy dodać następujące linijki tekstu do konfiguracji:
SSLCACertificateFile “/etc/apache2/ssl/ca.crt”
SSLVerifyClient require
SSLVerifyDepth 5
Zapisujemy plik i restartujemy serwer poleceniem:
service apache2 restart
Przykładowa konfiguracja:
Konfiguracja dla nginx
Podobnie jak wyżej. VirtualHost w nginx musi mieć skonfigurowany SSL i wymuszone przekierowanie z HTTP na HTTPS.
Tworzymy folder ssl
w którym będą przechowywane certyfikaty CA. W tym celu wykonujemy następujące polecenie:
mkdir /etc/nginx/ssl
Przechodzimy do folderu w którym mamy PKI. Następnie przechodzimy do folderu keys
, aby to zrobić trzeba wykonać następujące polecenie:
cd keys
teraz kopiujemy plik ca.crt
do /etc/nginx/ssl
. Robimy to tym poleceniem:
cp ca.crt /etc/nginx/ssl
Otwieramy konfigurację VirtualHosta którego chcemy zabezpieczyć. Po otworzeniu konfiguracji VirtualHosta należy dodać następujące linijki tekstu do konfiguracji:
sslclientcertificate /etc/nginx/ssl/ca.crt;
sslverifyclient optional;
sslsessiontimeout 5m;
keepalivetimeout 10;
sslsessioncache shared:SSL:10m;
sslverify_depth 10;if ($sslclientverify = NONE) {
return 302 http://example.com;
}
W miejscu http://example.com
można wstawić inny adres strony do której użytkownik zostanie przekierowany w przypadku niepowodzenia autoryzacji.
Zapisujemy plik i restatrujemy serwer poleceniem:
service nginx restart
Przykładowa konfiguracja:
Aby wygenerować certyfikat użytkownikowi należy przejść do folderu w którym zostało stworzone PKI. Jeżeli znajdujesz się w tym folderze wykonaj następujące polecenie:
./build-key-pkcs12 [nazwa pospolita (CN)]
W zmiennej nazwa pospolita
wpisz nazwę certyfikatu. Może to być login, imię czy jakakolwiek inna nazwa.
Jak wykonasz polecenie ./build-key-pkcs12
to wyświetlą się pytania dot. danych do certyfikatu. Jeżeli chcesz możesz zmienić, jeżeli chcesz zostawić pole domyślne klikasz ENTER, jeżeli chcesz wyczyścić pole wpisujesz kropkę [.
]. Na końcu pokaże się pytanie czy chcesz podpisać ten certyfikat, wybierz tak [y
]. Tak samo zrób z pytaniem 1 out of 1 certificate requests certified, commit?
.
Wyświetli się prośba aby wpisać hasło które będzie zabezpieczać klucz prywatny (hasło eksportu), wymyślamy hasło i klikamy enter, potem wyświetli się prośba o potwierdzenie hasła. Wpisujemy ponownie to samo hasło i klikamy ENTER.
Klucz został zapisany w folderze keys
pod nazwą [nazwa pospolita (CN)].p12
. Logujemy się poprzez SFTP i przenosimy ten klucz na swój komputer.
Po skopiowaniu pliku z rozszerzeniem .p12
uruchamiamy ten plik. Zaznaczamy Bieżący użytkownik
i klikamy Dalej.
W następnym oknie nic nie zmieniamy, klikamy Dalej. Po kliknięciu Dalej trzeba wpisać hasło zabezpieczające klucz prywatny (hasło eksportu) i zalecane jest zaznaczenie opcji Włącz silną ochronę klucza prywatnego
, włączenie tej opcji będzie wymagało potwierdzenia użytkownika przed użyciem klucza prywatnego przez jakąkolwiek aplikacje.
W następnym oknie zostawiamy opcję Automatycznie wybierz magazyn certyfikatów na podstawie typu certyfikatu
i klikamy Dalej.
Potem klikamy Zakończ
.
Jeżeli wybraliśmy opcję Włącz silną ochronę klucza prywatnego
to teraz trzeba będzie skonfigurować ochronę. Należy kliknąć przycisk Ustaw poziom zabezpieczeń...
i trzeba wybrać poziom ochrony. Jeżeli wybierzemy Wysoki
to trzeba będzie wpisać hasło aby jakakolwiek aplikacja mogła użyć klucza prywatnego.
Jeżeli wybierzemy Średni
to tylko trzeba będzie kliknąć przycisk Zezwalaj
jakby jakakolwiek aplikacja chciałaby wykorzystać klucz prywatny.
Po wybraniu poziomu zabezpieczeń należy nacisnąć przycisk OK
.
Następnie wyświetli się komunikat informujący że certyfikat CA będzie musiał być dodany do zaufanych, należy nacisnąć przycisk TAK.
Po naciśnięciu przycisku TAK, wyświetli się komunikat że import został zakończony sukcesem.
Wystarczy wejść na stronę która została zabezpieczona powyższym sposobem. Przeglądarka sama wyświetli okienko z możliwością wyboru certyfikatu. Wybieramy certyfikat, klikamy OK
a następnie Zezwalaj
(Jeżeli został ustawiony wysoki poziom zabezpieczeń wpisujemy hasło i klikamy Zezwalaj
, jeżeli nie została zaznaczona opcja Włącz silną ochronę klucza prywatnego
drugi komunikat się nie wyświetli.) .
Jeżeli wszystko zostało dobrze skonfigurowane powinna wyświetlić się zawartość chronionej strony:
Nieraz z różnych powodów trzeba konkretnemu użytkownikowi odebrać dostęp do zabezpieczonej strony WWW. Aby to zrobić należy wejść do katalogu w którym jest PKI i trzeba wykonać polecenie:
source vars
./revoke-full [nazwa pospolita (CN)]
W folderze keys
został zapisany plik o nazwie crl.pem
. Teraz trzeba w konfiguracji serwera WWW wskazać lokalizację tego pliku.
Do konfiguracji zabezpieczonego VirtualHosta trzeba dodać następującą linijkę tekstu:
Dla apache2:
SSLCARevocationFile [ścieżka do folderu PKI]/keys/crl.pem
Dla nginx:
ssl_crl [ścieżka do folderu PKI]/keys/crl.pem;
Zapisujemy konfigurację i restatujemy serwer WWW.
UWAGA!!! Jeżeli anulujemy certyfikat poleceniem ./revoke-full
to trzeba zrestartować serwer WWW aby zmiany zostały wprowadzone w życie.
Certyfikat zabezpieczeń wraz z kluczem prywatnym można przechowywać w:
* Karcie inteligentnej
* Module TPM
Jeżeli chcemy przechowywać certyfikat z kluczem prywatnym na karcie inteligentnej czy w module TPM (Trusted Platform Module) to przy każdej próbie użycia klucza trzeba będzie wpisać kod PIN od karty inteligentnej czy TPMu.
Moduł TPM to mikroukład który może znajdywać się na płycie głównej komputera (zazwyczaj TPMy są instalowane w laptopach) który daje możliwość użytkownikowi lub systemowi do korzystania z zaawansowanych funkcji zabezpieczeń. Działanie TPM jest zbliżone do działania karty inteligentnej.
Instalowanie certyfikatu na module TPM
aby móc zainstalować certyfikat na TPM’ie trzeba stworzyć wirtualną kartę inteligentną która będzie przechowywana na TPM’ie. Aby to zrobić należy otworzyć wiersz poleceń (cmd) w trybie administratora i wpisać polecenie:
tpmvscmgr create /name “nazwa modułu” /adminkey random /pin prompt /puk prompt /pinpolicy minlen 4 maxlen 8 /attestation AIKANDCERT /generate
W zmiennej nazwa modułu
wpisujemy jakąkolwiek wymyśloną nazwę wirtualnej karty inteligentnej. Po wpisaniu tego polecenia wyświetlą się pytania o kod PIN i kod PUK. Wymyślamy 4-cyfrowy kod PIN i wpisujemy ten kod. Potem wymyślamy 8-cyfrowy kod PUK i też go wpisujemy. Warto gdzieś zapisać kod PUK, w przypadku jak zablokujemy wirtualną kartę inteligentną na TPM’ie poprzez wpisanie 5 razy złego PINu to przy pomocy kodu PUK możemy tą kartę odblokować.
Po stworzeniu wirtualnej karty inteligentnej możemy zainstalować certyfikat zabezpieczeń wraz z kluczem na wirtualnej karcie, robimy to poleceniem w cmd (z uprawnieniami administratora) :
certutil -csp “Microsoft Base Smart Card Crypto Provider” -importpfx [ścieżka do pliku .p12]
po wpisaniu polecenia trzeba wpisać hasło eksportu certyfikatu, hasło zatwierdzamy klawiszem ENTER. Potem wyświetli się żądanie wpisania kodu PIN od TPMu.
Po wpisaniu poprawnego kodu PIN certyfikat zostanie zaimportowany na moduł TPM.
Od tej pory jak wejdziemy na stronę WWW wymagającą certyfikatu to trzeba będzie wpisać kod PIN od TPM aby móc się zalogować.
Ogólnie mówiąc jest to wygodny i bezpieczny sposób autoryzacji, jest przydatny np. do zabezpieczenia dostępu do stron natury technicznej typu phpMyAdmin. Da się też skonfigurować serwer WWW tak aby dodać zmienną w PHP która zwracałaby nazwę pospolitą certyfikatu którym użytkownik aktualnie się zalogował.
Mam nadzieję że jakoś pomogłem.