OpenVPN username-as-common-name: de ce verificarea CN este goală
Un script client-connect care compară common_name cu username poate compara un nume cu el însuși. Leagă certificatul de cont înainte ca înlocuirea să ruleze.
Adaugi un script client-connect care respinge orice conexiune în care common_name diferă de username, și pare o legătură între un certificat și un cont. Pe un server care rulează username-as-common-name, acea comparație și-a pierdut deja sensul până când rulează scriptul. Ambele valori sunt același șir, așa că testul trece pentru un certificat emis cuiva complet diferit.
Verificarea nu este greșită pentru că scriptul este scris prost. Este greșită pentru că valoarea pe care o citește a fost înlocuită mai devreme în aceeași conexiune.
Ce pare că dovedește comparația
Autentificarea prin certificat și autentificarea prin parolă sunt dovezi separate, iar un server poate cere ambele fără a cere să aparțină aceleiași persoane. Diferența este reală: un certificat de dispozitiv valid plus orice cont valid este o afirmație diferită de acel certificat plus un singur cont numit. Un script care compară common_name cu username se citește ca veriga lipsă dintre cele două. Ar fi, dacă common_name ar mai însemna ceea ce spunea certificatul.
Dacă este așa depinde de o singură opțiune a serverului, iar acea opțiune este de obicei activată dintr-un motiv nelegat, cum ar fi să fie mai ușor de numit fișierele de configurare pentru fiecare utilizator.
Ce face username-as-common-name cu numele
Cu username-as-common-name activat, OpenVPN înlocuiește numele comun al certificatului cu numele de utilizator autentificat după ce numele de utilizator și parola au fost verificate. Cârligul de verificare care rulează în timpul acelei verificări primește în continuare numele comun al certificatului, pentru că înlocuirea nu a avut loc încă. Tot ce urmează, inclusiv client-connect, vede numele de utilizator. Astfel apelul ulterior primește o singură identitate de două ori și nu o poate compara cu certificatul prezentat.
| Stage | What common_name holds |
|---|---|
| Username and password verification hook | The certificate common name, for example bob-device |
| After the replacement | The authenticated account, alice |
| client-connect callback | The account again, alice |
Urmărește o conexiune ilustrativă: un certificat emis pentru bob-device, o autentificare reușită în director ca alice și opțiunea activată. Faza de verificare poate vedea încă două șiruri diferite. Faza de conectare vede alice și alice.
Acest exemplu arată de ce comparația este goală. Nu arată că conexiunea ar fi acceptată altfel, deoarece validarea certificatului și verificarea parolei rulează în continuare pe cont propriu.
Pune legătura acolo unde ambele identități încă există
Regula trebuie aplicată într-o fază care vede identitatea certificatului și contul în același timp, ceea ce în practică înseamnă cârligul de verificare a numelui de utilizator și a parolei sau un plugin încărcat acolo. Un plugin acceptat care efectuează deja verificarea parolei este de obicei locul potrivit pentru a adăuga o regulă de asociere, pentru că înlocuirea lui cu o comparație de nume ar elimina complet verificarea parolei.
Definește maparea înainte de a scrie cod, deoarece egalitatea este rareori politica reală. Un certificat identifică adesea un dispozitiv, în timp ce autentificarea identifică o persoană, iar un dispozitiv poate servi în mod legitim mai multe persoane. Stochează relația într-o formă al cărei emitere o controlezi și decide ce se întâmplă la redenumire, la reemitere și la numele calificate cu domeniu. Trecerea la litere mici sau eliminarea unui prefix de domeniu fără a înțelege directorul poate fuziona două conturi care trebuiau să rămână separate.
Amintește-ți că opțiunea schimbă și ce configurație pentru fiecare client se aplică, pentru că client-config-dir este indexat după numele comun.
Testează asocierea cu două credențiale valide
Începe cu perechea pe care politica ta o permite și confirmă că se conectează. Apoi prezintă același certificat valid cu un alt cont, dar valabil: acea încercare trebuie să eșueze, iar eșecul trebuie să fie din cauza regulii de asociere, nu a unei parole tastate greșit. O parolă greșită dovedește că verificarea parolei funcționează și nu spune nimic despre regula dintre certificat și cont.
Verifică și traseele cu certificat lipsă și cu certificat invalid, și confirmă ce identitate folosește serverul pentru setările pe fiecare client. Dacă singurul mod de a face comparația să funcționeze este să dezactivezi username-as-common-name, estimează mai întâi costul acelei schimbări, pentru că readuce căutarea configurației fiecărui client la numele certificatului.