Dvofaktorska autentikacija na web stranici koristeći USB token. Sada i za Linux

Dvofaktorska autentikacija na web stranici koristeći USB token. Sada i za Linux
U u jednom od naših prethodnih članaka govorili smo o važnosti dvostruke autentifikacije na korporativnim portalima kompanija. Prošli put smo pokazali kako postaviti sigurnu autentifikaciju na web-serveru IIS.

U komentarima su nas zamolili da napišemo upute za najčešće korištene web-servere na Linuxu — nginx i Apache.

Niste tražili — mi smo napisali.

Što je potrebno za početak?

  • Bilo koja moderna Linux distribucija. Izvrsio sam testnu konfiguraciju na MX Linux 18.2_x64. To svakako nije server distribucija, ali za Debian će teško biti nekih razlika. Za druge distribucije putanje do biblioteka i konfiguracija mogu se malo razlikovati.
  • Token. Nastavljamo koristiti model RUTOKEN ECP PKI, koji idealno odgovara po brzinskim karakteristikama za korporativnu primjenu.
  • Za rad s tokenom na Linuxu potrebno je instalirati sljedeće pakete:
    libccid libpcsclite1 pcscd pcsc-tools opensc

Dvofaktorska autentikacija na web stranici koristeći USB token. Sada i za Linux

Izdavanje certifikata

U prethodnim člancima oslanjali smo se na to da će se certifikati servera i klijenata izdavati pomoću Microsoft CA. No, kako postavljamo sve na Linuxu, tako ćemo objasniti alternativni način izdavanja tih certifikata — ne napuštajući Linux.
Kao CA koristit ćemo XCA (https://hohnstaedt.de/xca/), koji je dostupan u svakoj modernoj distribuciji Linuxa. Sve radnje koje ćemo obavljati u XCA mogu se izvršiti i u naredbenom retku pomoću alata OpenSSL i pkcs11-tool, ali radi veće jednostavnosti i preglednosti u ovom članku ih nećemo navoditi.

Početak rada

  1. Instaliramo:
    $ apt-get install xca
  2. I pokrećemo:
    $ xca
  3. Stvaramo našu bazu podataka za CA — /root/CA.xdb
    Preporučujemo pohranu baze podataka Certificate Authority u mapu kojoj pristup ima samo administrator. Ovo je važno za zaštitu privatnih ključeva korijenskih certifikata koji se koriste za potpisivanje svih ostalih certifikata.

Stvaramo ključeve i certifikat root CA

U osnovi infrastrukture javnih ključeva (PKI) leži hijerarhijski sustav. Glavni u ovom sustavu je korijenska certifikacijska agencija ili root CA. Njegov certifikat trebamo stvoriti kao prvi.

  1. Stvaramo za CA privatni ključ RSA-2048. Za to na kartici Privatni ključevi kliknite Novi ključ i odabiremo odgovarajući tip.
  2. Postavljamo ime za novi ključni par. Nazvao sam ga — CA Ključ.
  3. Izdajemo sam CA certifikat koristeći kreirani par ključeva. U tu svrhu prelazimo na karticu Certifikati i pritisnemo Novi certifikat.
  4. Obavezno odabiremo SHA-256, jer korištenje SHA-1 više ne može biti smatrano sigurnim.
  5. Kao predložak obavezno odabiremo [default] CA. Ne zaboravite pritisnuti Primijeni sve, inače predložak neće biti primijenjen.
  6. Na kartici Predmet odabiremo naš par ključeva. Tamo možete ispuniti sve osnovne podatke certifikata.

Dvofaktorska autentikacija na web stranici koristeći USB token. Sada i za Linux

Kreiramo ključeve i certifikat za https poslužitelj

  1. Na sličan način kreiramo privatni ključ RSA-2048 za server, nazvao sam ga - Server Key.
  2. Prilikom kreiranja certifikata odabiremo da certifikat servera treba biti potpisan certifikatom CA.
  3. Ne zaboravite odabrati SHA-256.
  4. Kao predložak odabiremo [default] HTTPS_server. Kliknemo na Primijeni sve.
  5. Nakon čega na kartici Predmet odabiremo naš ključ i ispunjavamo potrebne podatke.

Dvofaktorska autentikacija na web stranici koristeći USB token. Sada i za Linux

Kreiramo ključeve i certifikat za korisnika

  1. Privatni ključ korisnika bit će pohranjen na našem tokenu. Za rad s njim potrebno je instalirati PKCS#11 biblioteku s naše stranice. Za popularne distribucije distribuiramo gotove pakete, koji se nalaze ovdje - https://www.rutoken.ru/support/download/pkcs/. Također imamo verzije za arm64, armv7el, armv7hf, e2k, mipso32el, koje možete pronaći u našem SDK - https://www.rutoken.ru/developers/sdk/. Osim verzija za linux, postoji i verzija za macOS, freebsd i android.
  2. Dodajemo novog PKCS#11 Provider u XCA. U tu svrhu biramo iz menija Opcije na kartici PKCS#11 Provider.
  3. Kliknemo Dodati i odabiremo put do biblioteke PKCS#11. U mom slučaju to je usrliblibrtpkcs11ecp.so.
  4. Trebamo formatirani token RUTOKEN EDC PKI. Preuzimamo alat rtAdmin - https://dev.rutoken.ru/pages/viewpage.action?pageId=7995615
  5. Izvršavamo
    $ rtAdmin -f -q -z /usr/lib/librtpkcs11ecp.so -u
  6. Kao tip ključa biramo - ključ RSA-2048 na RUTOKEN EDC PKI. Nazvao sam ovaj ključ Client Key.

    Dvofaktorska autentikacija na web stranici koristeći USB token. Sada i za Linux

  7. Unosimo PIN-kod. I čekamo završetak hardverske generacije para ključeva

    Dvofaktorska autentikacija na web stranici koristeći USB token. Sada i za Linux

  8. Certifikat za korisnika kreiramo analogno certifikatu servera. Ovaj put odabiremo predložak [default] HTTPS_client i ne zaboravljamo pritisnuti Primijeni sve.
  9. Na kartici Predmet unosimo informacije o korisniku. Na upit o čuvanju certifikata na tokenu odgovaramo potvrdno.

Na kraju, na kartici Certifikati u XCA treba izgledati otprilike ovako.

Dvofaktorska autentikacija na web stranici koristeći USB token. Sada i za Linux
Ova minimalna postava ključeva i certifikata dovoljna je da započnemo s postavljanjem servera.

Za postavljanje potrebno je izvesti certifikat CA, certifikat servera i privatni ključ servera.

Za to je potrebno odabrati odgovarajući unos na odgovarajućoj kartici u XCA i pritisnuti Izvesti.

Nginx

Neću pisati kako instalirati i pokrenuti nginx-server — na tu temu ima dovoljno članaka na internetu, a da ne govorim o službenoj dokumentaciji. Odmah ćemo preći na postavke HTTPS-a i dvostruke autentifikacije putem tokena.

Dodajemo sljedeće retke u sekciju server u nginx.conf:

server {
	listen 443 ssl;
	ssl_verify_depth 1;
	ssl_certificate /etc/nginx/Server.crt;
	ssl_certificate_key /etc/nginx/ServerKey.pem;
	ssl_client_certificate /etc/nginx/CA.crt;
	ssl_verify_client on;
}

Detaljan opis svih parametara koji se odnose na postavke ssl u nginx-u može se pronaći ovdje — https://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_client_certificate

Ja ću samo ukratko opisati one koje sam sam postavio:

  • ssl_verify_client — ukazuje da je potrebno provjeriti lanac povjerenja za certifikat.
  • ssl_verify_depth — određuje dubinu pretrage pouzdane korijenske certifikate u lancu. Budući da je naš korisnički certifikat odmah potpisan na korijenskom certifikatu, dubina je postavljena na 1. Ako je certifikat korisnika potpisan na posredničkom CA-u, tada treba navesti 2 u ovom parametru, i tako dalje.
  • ssl_client_certificate — ukazuje put do pouzdane korijenske certifikacije koja se koristi pri provjeri povjerenja do korisničkog certifikata.
  • ssl_certificate/ssl_certificate_key — ukazuju put do certifikata/privatnog ključa servera.

Ne zaboravite izvršiti nginx -t kako biste provjerili da u konfiguraciji nema tipfelera, a svi datoteke su na pravim mjestima i tako dalje.

I zapravo, to je sve! Kao što vidite, postavka je vrlo jednostavna.

Provjeravamo rad u Firefoxu

Budući da sve potpuno radimo u Linuxu, smatrat ćemo da i naši korisnici koriste Linux (ako imaju Windows, onda pogledajte upute za postavljanje preglednika u prethodnom članku.

  1. Pokrećemo Firefox.
  2. Pokušat ćemo prvo ući bez tokena. Dobivamo ovakvu sliku:

    Dvofaktorska autentikacija na web stranici koristeći USB token. Sada i za Linux

  3. Idemo na about:preferences#privacy, i idemo u Security Devices…
  4. Kliknemo Load, kako bismo dodali novi PKCS#11 uređaj i navodimo put do naše librtpkcs11ecp.so.
  5. Za provjeru da li certifikat postoji, može se otići u Certificate Manager. Pojavit će se zahtjev za unos PIN koda. Nakon pravilnog unosa možete provjeriti da li je na kartici Your Certificates pojavila naš certifikat s tokena.
  6. Sada se prijavljujemo s tokenom. Firefox nudi izbor certifikata koji će biti odabran na serveru. Biramo naš certifikat.

    Dvofaktorska autentikacija na web stranici koristeći USB token. Sada i za Linux

  7. PROFIT!

    Dvofaktorska autentikacija na web stranici koristeći USB token. Sada i za Linux

Postavke se izvršavaju samo jednom, a kao što se može vidjeti u prozoru za zahtjev za certifikat, možemo sačuvati naš odabir. Nakon toga, pri svakom ulasku na portal, trebamo samo unijeti token i PIN kod korisnika koji je postavljen prilikom formatiranja. Nakon takve autentifikacije, server već zna koji se korisnik prijavio i više ne trebamo otvarati dodatna okna za provjeru, nego odmah pustiti korisnika u njegov osobni račun.

Apache

Baš kao i kod nginx, ne bi smjelo biti problema s instalacijom apachea. Ako ne znate kako instalirati ovaj web server, jednostavno se poslužite službenom dokumentacijom.

Sada prelazimo na postavljanje našeg HTTPS-a i dvofaktorske autentifikacije:

  1. Prvo je potrebno aktivirati mod_ssl:
    $ a2enmod ssl
  2. Zatim uključujemo zadan HTTPS postavke za stranicu:
    $ a2ensite default-ssl
  3. Sada uređujemo konfiguracijski fajl: /etc/apache2/sites-enabled/default-ssl.conf:
        SSLEngine on
        SSLProtocol all -SSLv2
    
        SSLCertificateFile	/etc/apache2/sites-enabled/Server.crt
        SSLCertificateKeyFile /etc/apache2/sites-enabled/ServerKey.pem
    
        SSLCACertificateFile /etc/apache2/sites-enabled/CA.crt
    
        SSLVerifyClient require
        SSLVerifyDepth  10

    Kao što vidite, nazivi parametara gotovo se poklapaju s nazivima parametara u nginx-u, tako da ih neću dodatno objašnjavati. Opet, tko je zainteresiran za detalje — dobrodošli u dokumentaciju.
    Sada ponovo pokrećemo naš server:

    $ service apache2 reload
    $ service apache2 restart

  4. Kao što vidite, postavljanje dvofaktorske autentifikacije na bilo kojem web serveru, bilo na Windows-u ili Linux-u, potraje najviše jedan sat. A postavljanje preglednika traje oko 5 minuta. Mnogi misle da je postavljanje i rad s dvofaktorskom autentifikacijom komplicirano i nerazumljivo. Nadam se da naš članak barem malo razbija ovaj mit.

Samo registrirani korisnici mogu sudjelovati u anketi. Prijavite se, molimo.

Treba li upute za postavljanje TLS-a s certifikatima prema GOST 34.10-2012:

  • Da, TLS-GOST je veoma potreban

  • Ne, postavljanje s GOST-algoritmima nije zanimljivo

Glasalo je 44 korisnika. Suzdržano 9 korisnika.

Izvor: habr.com

Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere 🔥 Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere | ProHoster