Pauzirati jednog OpenVPN klijenta: zašto je opoziv pogrešna poluga
Ubijanje sesije je reverzibilno; opoziv certifikata nije. Odlučite koja je poluga potrebna slučaju, pa ponovo izgradite CRL samo kada to odgovara.
Pauziranje pristupa jednog klijenta i njegovo trajno uklanjanje izgledaju kao isti zadatak dok ne pokušate poništiti jedno od toga. Opoziv certifikata upisuje zapis koji server tretira kao konačan, a poništavanje toga znači ručno uređivanje baze izdavaoca. Obustavljanje živog tunela je upravljačka naredba koja ne mijenja ništa u povjerenju. Odaberite polugu pitajući da li je ključ još uvijek pouzdan, a ne koliko se zahtjev čini hitnim.
Uvjerenje: opozvan i suspendovan su ista stvar
Izvođač se pauzira na nedjelju dana i refleks je da se opozove, jer opoziv zvuči kao isključivanje nečega. Izgleda uredno, traje deset sekundi i ostavlja uređivanje baze kao jedini put natrag. Refleks je razumljiv i bliži je spaljivanju pasoša nego zatvaranju vrata. Pauziran uređaj i kompromitovan ključ traže različit tretman, a samo je jedno od toga jeftino poništiti.
Razlika je u vjerodajnici, a ne u osobi. Ključ koji je još u pravim rukama može se pauzirati i nastaviti bez ikakvog gubitka povjerenja. Ključ koji je možda kopiran ne treba nikada vraćati, jer vraćanje tvrdi da kopija ne postoji.
Zapišite odgovor prije nego što dotaknete bilo koji od dva sistema. Ako ne možete reći da li je ključ izložen, konzervativan odgovor je zamjena.
Obustavite živu sesiju pomoću upravljačkog interfejsa
OpenVPN nudi upravljački interfejs koji može izlistati sesije i ubiti jednu od njih po zajedničkom imenu. Omogućite ga na localhost, držite ga dalje od javnog interfejsa i pošaljite naredbu za ubijanje kada sesija mora nestati odmah. Naredba zatvara samo taj tunel i svaki drugi klijent nastavlja raditi.
Ovo je odgovor na aktivan problem, a ne politika suspenzije. Isti profil se može ponovo povezati za minutu, jer se ništa u njegovoj vjerodajnici nije promijenilo. Koristite ga kada sesija mora nestati, a trajna odluka se tek donosi.
Potvrdite da je sesija bila povezana prije nego što je ubijete, da ne lovite klijenta koji se nikada nije povezao. Naredba za status ispod ispisuje šta je trenutno povezano.
printf 'status 2\nquit\n' | nc 127.0.0.1 7506
printf 'kill kiosk-14\nquit\n' | nc 127.0.0.1 7506Ako ubijanje prijavi da takav klijent ne postoji, zajedničko ime u certifikatu nije onaj niz koji ste otkucali. Čitajte izlaz statusa, a ne naziv datoteke profila.
Šta CRL zapravo kontroliše
Server ne konsultuje oznaku opoziva sačuvanu u certifikatu. On čita listu opozvanih certifikata navedenu u crl-verify, pri svakoj novoj vezi, i odbija certifikat čiji se serijski broj pojavljuje na toj listi. Iz toga slijede dvije posljedice, a obje su operativno važne. Datoteka mora biti čitljiva računu na koji server spušta privilegije, a već povezan klijent nastavlja raditi dok se ponovo ne poveže.
Ta druga posljedica iznenađuje ljude tokom incidenata. Opoziv certifikata ne zatvara tunel koji ga trenutno koristi. Uparite opoziv sa upravljačkim ubijanjem ako sesija mora završiti odmah, i tretirajte te dvije radnje kao odvojene korake u proceduri.
Pregledajte listu da vidite šta će server zaista provoditi, umjesto da vjerujete vremenskoj oznaci zadnje datoteke koju ste kopirali. Broj serijskih brojeva je dio koji je važan.
openssl crl -in /etc/openvpn/server/crl.pem -noout -text | sed -n '1,14p'
ls -l /etc/openvpn/server/crl.pemLista bez unosa i lista sa pravim unosima izgledaju identično u ispisu direktorija, zato je broj serijskih brojeva vrijedan ispisa. Red sa dozvolama je jednako važan, jer datoteka koju daemon ne može pročitati proizvodi kvar koji izgleda kao odbijen klijent.
Vraćanje zapisa, pažljivo
Vratiti certifikat znači preokrenuti zapis u bazi izdavanja i objaviti novu listu. easy-rsa 3 drži tu bazu kao index.txt u PKI direktoriju, dok su stariji rasporedi koristili drugačiji poredak. Red počinje slovom statusa i datumom isteka. Opozvan red ubacuje vremensku oznaku opoziva prije nego što nastavi sa serijskim brojem, nazivom datoteke certifikata i razlikovnim imenom. Vratiti red na mjesto znači izbrisati tu vremensku oznaku i preokrenuti slovo, a sve ostalo ostaviti na miru.
Prvo napravite kopiju datoteke, a izmjenu izvedite skriptom umjesto tipkanjem u uređivaču teksta. Greška u kucanju koja promijeni broj polja u redu kvari izdavanje za svaki certifikat dodan poslije. Zato promjenu treba automatizirati i kopirati datoteku prije nego što je dotaknete.
Drugi opoziv istog imena često takođe ne uspije, jer je prvo pokretanje premjestilo taj certifikat i njegov ključ iz direktorija u kojima alat očekuje da ih nađe. Alat tada ne može pronaći ono što je zamoljen da opozove, a poruka o grešci nije uvijek jasna o razlogu.
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-crlObjavite novu listu, popravite njeno vlasništvo i natjerajte server da je pročita. Ponovno učitavanje je dovoljno na većini instalacija, ali potvrda mora doći sa svježe veze, jer postojeća sesija nikada ništa nije ponovo provjerila.
Provjerite koju polugu slučaj zaslužuje
Postavite jedno pitanje koje odlučuje cijelu proceduru: da li je privatni ključ još uvijek samo tamo gdje treba biti. Ako jeste, ubijanje sesije plus dokumentovana pauza pokriva slučaj i ne ostavlja trajan zapis. Ako nije, jedini siguran odgovor je novi ključ, a stari certifikat ostaje opozvan.
Zatim provjerite ishod pokušajem povezivanja, a ne razlikom u konfiguraciji. Razlika vam kaže šta ste namjeravali, a veza vam kaže šta server provodi.
openssl crl -in /etc/openvpn/server/crl.pem -noout -text | grep -c 'Serial Number'
printf 'status 2\nquit\n' | nc 127.0.0.1 7506Kada se vraćeni klijent poveže i pojavi u izlazu statusa, izmjena zapisa je uspjela. Kada opozvani klijent bude odbijen i dnevnik navede CRL, opoziv je uspio. Sve između je problem sa dozvolama ili ponovnim učitavanjem, i vrijedi ga popraviti prije nego stigne sljedeći zahtjev.