Logowanie kartą PKI
Moje korpo używa kart PKI (taka karta z certyfikatem) do logowania do różnych systemów. Używa też zcentralizowanego logowania, które regularnie się zawiesza w godzinach szczytu. A gdyby tak pominąć SSO i logować się bezpośrednio kartą?
Potrzebny będzie mod_ssl https://httpd.apache.org/docs/2.4/mod/mod_ssl.html (oczywista oczywistość)
[VirtualHost]
SSLEngine on
SSLCertificateFile /etc/pki/tls/private/certyfikat.pem
SSLCertificateKeyFile /etc/pki/tls/private/key.pem
ServerName example.com
SSLOptions +StdEnvVars +ExportCertData
SSLVerifyClient require
SSLVerifyDepth 10
SSLCACertificateFile /etc/pki/tls/certs/ca-bundle.crt
SSLCADNRequestFile /etc/pki/ca-trust/source/anchors/CA.pem
SSLCARevocationFile /etc/pki/tls/crls/list.crl
SSLCARevocationCheck chain
[/VirtualHost]
[Directory "/protected"]
[RequireAny]
# Require ssl-verify-client
Require expr %{SSL_CLIENT_SAN_Email_0} == "lemat@example.com"
Require expr %{SSL_CLIENT_SAN_Email_0} == "lemat2@example.com"
[/RequreAny]
[/Directory]
Gdzie:
SSLCADNRequestFile to jest certyfikat firmowy, który są podpisane karty PKI
SSL_CLIENT_SAN_Email_0 to pole, które zawiera adres email, w zasadzie lepiej by było używać SSL_CLIENT_M_SERIAL, tu poszedłem na łatwiznę bo adresy email sa znane, seriale - niekoniecznie.
Gdyby nastąpiła utrata karty PKI, to nowa karta zostanie wystawiona na ten sam adres email, ale z innym serialem. Stara karta powinna byc unieważniona przez Certificate Revocation List ale lepiej chuchać na zimne. (plik CRL należy pobierać i uaktualniać)
Jeżeli dajemy dostęp do strony całej firmie to wystarczy "Require ssl-verify-client".
Jeżeli dajemy dostęp do strony wyłącznie określonym osobom - używamy "Require expr".
Jak się do tego dobrać z poziomu PHP?
Jak zrobimy phpinfo() to pokaże się (dzięki SSLOptions +StdEnvVars +ExportCertData) w tablicy $_SERVER zawartość karty PKI. Możemy danego usera wtedy sprawdzić w jakiejś bazie danych, LDAPie - czy i jaki poziom dostępu powinien mieć user.


![strona http://nospam-pl.net/ [Nospam-PL.NET]](banners/nospn_125x60_2.png)
