Eén OpenVPN-client pauzeren: waarom intrekken de verkeerde hendel is
De sessie doden is omkeerbaar; het certificaat intrekken niet. Bepaal welke hendel de zaak nodig heeft, en bouw de CRL pas opnieuw op als dat past.
De toegang van één client pauzeren en hem definitief verwijderen lijken dezelfde taak tot je een van beide probeert terug te draaien. Een certificaat intrekken schrijft een record dat de server als definitief behandelt, en dat terugdraaien betekent de database van de uitgever met de hand bewerken. De levende tunnel laten vallen is een beheercommando dat niets aan vertrouwen verandert. Kies de hendel door te vragen of de sleutel nog betrouwbaar is, niet door te vragen hoe dringend het verzoek aanvoelt.
De overtuiging: ingetrokken en opgeschort zijn hetzelfde
Een onderaannemer wordt een week gepauzeerd en de reflex is intrekken, omdat intrekken klinkt als iets uitzetten. Het ziet er netjes uit, het kost tien seconden, en het laat een databasebewerking als enige weg terug. De reflex is begrijpelijk en hij zit dichter bij het verbranden van een paspoort dan bij het sluiten van een deur. Een gepauzeerd apparaat en een gecompromitteerde sleutel vragen een andere behandeling, en slechts één van beide is goedkoop terug te draaien.
Het onderscheid gaat over het bewijs van identiteit en niet over de persoon. Een sleutel die nog in de juiste handen is, kan worden gepauzeerd en hervat zonder verlies van vertrouwen. Een sleutel die gekopieerd kan zijn, mag nooit worden hersteld, omdat herstel beweert dat de kopie niet bestaat.
Schrijf het antwoord op voordat je een van beide systemen aanraakt. Als je niet kunt zeggen of de sleutel is blootgesteld, is het conservatieve antwoord vervanging.
Laat de levende sessie vallen met de beheerinterface
OpenVPN biedt een beheerinterface die sessies kan opsommen en er één kan doden op common name. Schakel hem in op localhost, houd hem weg van de openbare interface, en stuur het doodcommando wanneer een sessie nu moet verdwijnen. Het commando sluit alleen die tunnel, en elke andere client blijft werken.
Dit is een reactie op een actief probleem, geen schorsingsbeleid. Hetzelfde profiel kan binnen een minuut opnieuw verbinden, omdat er niets aan zijn bewijs van identiteit is veranderd. Gebruik het wanneer de sessie weg moet en de blijvende beslissing nog wordt genomen.
Bevestig dat de sessie verbonden was voordat je hem doodt, zodat je geen client jaagt die nooit verbonden is geweest. Het statuscommando hieronder drukt af wat er nu verbonden is.
printf 'status 2\nquit\n' | nc 127.0.0.1 7506
printf 'kill kiosk-14\nquit\n' | nc 127.0.0.1 7506Als het doden meldt dat er geen zo'n client is, is de common name in het certificaat niet de tekenreeks die je hebt getypt. Lees de statusuitvoer in plaats van de naam van het profielbestand.
Wat de CRL werkelijk beheert
De server raadpleegt geen intrekkingsvlag die op het certificaat is opgeslagen. Hij leest de certificaatintrekkingslijst die in crl-verify wordt genoemd, bij elke nieuwe verbinding, en weigert een certificaat waarvan het serienummer op die lijst staat. Daaruit volgen twee gevolgen, en beide zijn operationeel belangrijk. Het bestand moet leesbaar zijn voor het account waaraan de server zijn rechten afstaat, en een al verbonden client blijft werken tot hij opnieuw verbindt.
Dat tweede gevolg verrast mensen tijdens incidenten. Een certificaat intrekken sluit de tunnel die het nu gebruikt niet. Koppel het intrekken aan een beheerdoding als de sessie onmiddellijk moet eindigen, en behandel beide acties als afzonderlijke stappen in het draaiboek.
Bekijk de lijst om te zien wat de server werkelijk zal afdwingen, in plaats van te vertrouwen op de tijdstempel van het laatst gekopieerde bestand. Het aantal serienummers is het deel dat telt.
openssl crl -in /etc/openvpn/server/crl.pem -noout -text | sed -n '1,14p'
ls -l /etc/openvpn/server/crl.pemEen lijst zonder regels en een lijst met de juiste regels zien er in een mapweergave identiek uit, daarom loont het de moeite het aantal serienummers af te drukken. De permissieregel is even belangrijk, omdat een bestand dat de daemon niet kan lezen een fout oplevert die op een geweigerde client lijkt.
Een record herstellen, voorzichtig
Een certificaat herstellen betekent een record in de uitgiftedatabase omkeren en een nieuwe lijst publiceren. easy-rsa 3 houdt die database als index.txt onder de PKI-map, terwijl oudere indelingen een andere ordening gebruikten. Een regel begint met een statusletter en een vervaldatum. Een ingetrokken regel voegt een tijdstempel voor de intrekking in voordat hij verdergaat met het serienummer, de bestandsnaam van het certificaat en de distinguished name. Een regel terugzetten betekent dat tijdstempel wissen en de letter omdraaien, terwijl al het andere met rust wordt gelaten.
Maak eerst een reservekopie van het bestand, en doe de bewerking als script in plaats van te typen in een teksteditor. Een typefout die verandert hoeveel velden een regel heeft, breekt de uitgifte voor elk certificaat dat daarna wordt toegevoegd. Dat is de reden om de wijziging te automatiseren en het bestand te kopiëren voordat je het aanraakt.
Een tweede intrekking van dezelfde naam mislukt vaak ook, omdat de eerste run dat certificaat en zijn sleutel heeft verplaatst uit de mappen waar de tool ze verwacht. De tool vindt dan niet wat hem is gevraagd in te trekken, en de foutmelding legt niet altijd duidelijk uit waarom.
cp /etc/easy-rsa/pki/index.txt /root/index.txt.$(date +%F-%H%M)
grep -c '^R' /etc/easy-rsa/pki/index.txt
easyrsa gen-crlPubliceer de nieuwe lijst, corrigeer het eigenaarschap, en zorg dat de server hem leest. Een herlaadactie is op de meeste installaties genoeg, maar de bevestiging moet van een verse verbinding komen, omdat de bestaande sessie nooit iets opnieuw heeft gecontroleerd.
Controleer welke hendel de zaak verdient
Stel de ene vraag die het hele draaiboek bepaalt: staat de privésleutel nog alleen waar hij hoort. Als dat zo is, dekt het doden van de sessie plus een gedocumenteerde pauze de zaak en blijft er geen permanent record achter. Als dat niet zo is, is het enige veilige antwoord een nieuwe sleutel terwijl het oude certificaat ingetrokken blijft.
Verifieer daarna de uitkomst met een verbindingspoging en niet met een configuratieverschil. Het verschil vertelt wat je bedoelde, en de verbinding vertelt wat de server afdwingt.
openssl crl -in /etc/openvpn/server/crl.pem -noout -text | grep -c 'Serial Number'
printf 'status 2\nquit\n' | nc 127.0.0.1 7506Wanneer een herstelde client verbindt en in de statusuitvoer verschijnt, heeft de bewerking van het record gewerkt. Wanneer een ingetrokken client wordt geweigerd en het log de CRL noemt, heeft het intrekken gewerkt. Alles daartussen is een rechten- of herlaadprobleem, en het loont dat op te lossen voordat het volgende verzoek binnenkomt.