Sæt én OpenVPN-klient på pause: hvorfor tilbagekaldelse er det forkerte greb
At dræbe sessionen er reversibelt; at tilbagekalde certifikatet er ikke. Beslut hvilket greb sagen har brug for, og genopbyg først CRL'en, når det passer.
At sætte én klients adgang på pause og at fjerne den for altid ligner den samme opgave, indtil man prøver at fortryde en af dem. Tilbagekaldelse af et certifikat skriver en post, som serveren behandler som endelig, og at rulle det tilbage betyder at redigere udstederens database i hånden. At droppe den levende tunnel er en administrationskommando, der ikke ændrer noget ved tilliden. Vælg grebet ved at spørge, om nøglen stadig er troværdig, ikke ved at spørge, hvor presserende anmodningen føles.
Troen: tilbagekaldt og suspenderet er det samme
En underleverandør sættes på pause i en uge, og refleksen er at tilbagekalde, fordi tilbagekaldelse lyder som at slukke for noget. Det ser pænt ud, det tager ti sekunder, og det efterlader en databaseredigering som den eneste vej tilbage. Refleksen er forståelig, og den er tættere på at brænde et pas end på at lukke en dør. En enhed på pause og en kompromitteret nøgle kræver forskellig behandling, og kun den ene er billig at rulle tilbage.
Forskellen handler om legitimationsoplysningen og ikke om personen. En nøgle, der stadig er i de rigtige hænder, kan sættes på pause og genoptages uden tab af tillid. En nøgle, der kan være kopieret, bør aldrig gendannes, fordi gendannelse hævder, at kopien ikke findes.
Skriv svaret ned, før du rører ved noget af de to systemer. Hvis du ikke kan sige, om nøglen er afsløret, er det konservative svar udskiftning.
Drop den levende session med administrationsgrænsefladen
OpenVPN stiller en administrationsgrænseflade til rådighed, som kan liste sessioner og dræbe en af dem ved fællesnavn. Aktivér den på localhost, hold den væk fra den offentlige grænseflade, og send dræb-kommandoen, når en session skal forsvinde nu. Kommandoen lukker kun den tunnel, og alle andre klienter fortsætter med at virke.
Dette er et svar på et aktivt problem, ikke en suspensionspolitik. Den samme profil kan genoprette forbindelsen på et minut, fordi intet ved dens legitimationsoplysning er ændret. Brug den, når sessionen skal væk, og den varige beslutning stadig træffes.
Bekræft, at sessionen var tilkoblet, før du dræber den, så du ikke jager en klient, der aldrig blev forbundet. Statuskommandoen nedenfor udskriver, hvad der aktuelt er tilkoblet.
printf 'status 2\nquit\n' | nc 127.0.0.1 7506
printf 'kill kiosk-14\nquit\n' | nc 127.0.0.1 7506Hvis dræb-kommandoen rapporterer, at der ikke findes en sådan klient, er fællesnavnet i certifikatet ikke den streng, du skrev. Læs statusoutputtet i stedet for profilfilens navn.
Hvad CRL'en faktisk styrer
Serveren konsulterer ikke et tilbagekaldelsesflag, der er gemt på certifikatet. Den læser certifikatets tilbagekaldelsesliste, som er angivet i crl-verify, ved hver ny forbindelse og afviser et certifikat, hvis serienummer optræder på den liste. To konsekvenser følger, og begge betyder noget driftsmæssigt. Filen skal være læsbar for den konto, serveren afgiver privilegier til, og en allerede forbundet klient kører videre, indtil den genopretter forbindelsen.
Den anden konsekvens overrasker folk under hændelser. Tilbagekaldelse af et certifikat lukker ikke den tunnel, der bruger det lige nu. Par tilbagekaldelsen med et administrativt drab, hvis sessionen skal slutte med det samme, og behandl de to handlinger som separate trin i runbooken.
Inspicér listen for at se, hvad serveren faktisk vil håndhæve, i stedet for at stole på tidsstemplet på den sidste fil, du kopierede. Det er antallet af serienumre, der betyder noget.
openssl crl -in /etc/openvpn/server/crl.pem -noout -text | sed -n '1,14p'
ls -l /etc/openvpn/server/crl.pemEn liste uden poster og en liste med de rigtige poster ser ens ud i en mappeliste, og derfor er det værd at udskrive antallet af serienumre. Tilladelseslinjen betyder lige så meget, fordi en fil, som daemonen ikke kan læse, giver en fejl, der ligner en afvist klient.
Gendan en post, forsigtigt
At gendanne et certifikat betyder at vende en post i udstedelsesdatabasen og offentliggøre en ny liste. easy-rsa 3 holder den database som index.txt under PKI-mappen, mens ældre opsætninger brugte en anden ordning. En række begynder med et statusbogstav og en udløbsdato. En tilbagekaldt række indsætter et tidsstempel for tilbagekaldelsen, før den fortsætter med serienummeret, certifikatfilens navn og det distingverede navn. At sætte en række tilbage betyder at slette det tidsstempel og vende bogstavet, mens alt andet lades i fred.
Tag en sikkerhedskopi af filen først, og lav ændringen som et script i stedet for at skrive i en teksteditor. En tastefejl, der ændrer, hvor mange felter en række har, ødelægger udstedelsen for hvert certifikat, der tilføjes bagefter. Det er grunden til at automatisere ændringen og kopiere filen, før du rører ved den.
En anden tilbagekaldelse af samme navn mislykkes ofte også, fordi den første kørsel flyttede det certifikat og dets nøgle ud af de mapper, værktøjet forventer at finde dem i. Værktøjet kan så ikke finde det, det blev bedt om at tilbagekalde, og fejlmeddelelsen er ikke altid klar om hvorfor.
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-crlOffentliggør den nye liste, ret dens ejerskab, og få serveren til at læse den. En genindlæsning er nok på de fleste installationer, men bekræftelsen skal komme fra en frisk forbindelse, da den eksisterende session aldrig tjekkede noget igen.
Tjek hvilket greb sagen fortjener
Stil det ene spørgsmål, der afgør hele runbooken: er den private nøgle stadig kun der, hvor den bør være. Hvis den er, dækker drabet på sessionen plus en dokumenteret pause sagen og efterlader ingen permanent post. Hvis den ikke er, er det eneste sikre svar en ny nøgle med det gamle certifikat efterladt tilbagekaldt.
Verificér derefter resultatet med et forbindelsesforsøg i stedet for med en konfigurationsforskel. Forskellen fortæller, hvad du havde til hensigt, og forbindelsen fortæller, hvad serveren håndhæver.
openssl crl -in /etc/openvpn/server/crl.pem -noout -text | grep -c 'Serial Number'
printf 'status 2\nquit\n' | nc 127.0.0.1 7506Når en gendannet klient opretter forbindelse og vises i statusoutputtet, virkede redigeringen af posten. Når en tilbagekaldt klient afvises, og loggen nævner CRL'en, virkede tilbagekaldelsen. Alt derimellem er et tilladelses- eller genindlæsningsproblem, og det er værd at rette, før den næste anmodning kommer.