OpenVPN push-peer-info: označte klientov bez udelenia prístupu
Pole UV_ putuje overeným tunelom, ale hodnota je stále tvrdením klienta. Zapojte ho, overte, čo dorazilo, a autorizáciu nechajte na serveri.
Značky nasadenia sú zvyčajným dôvodom, prečo ľudia siahajú po tejto funkcii: každé pripojenie by malo niesť niečo ako lokalitu alebo rolu a server by to mal čítať bez vymýšľania druhého formátu prihlasovacích údajov. Komunitné OpenVPN už mechanizmus má a je malý. Bolestivá časť sú očakávania. Nastavenie obyčajnej premennej v profile klienta na serveri nič neurobí a hodnota, ktorá predsa dorazí, dokazuje len to, že ju klient odoslal.
Toto je návod na funkčnú cestu, krok overenia, ktorý ukáže, čo skutočne dorazilo, a vrátenie zmien, ktoré po sebe nenechá napoly nakonfigurovaný hook. Nič tu nepotrebuje nový certifikát, nový plugin ani rozšírenie protokolu.
Nastavte premennú a zapnite cestu
V profile klienta prácu urobia dva riadky a obidva sú potrebné. Bez prvého nie je čo odoslať; bez druhého klient vôbec neponúka informácie o peerovi. Poradie nehrá rolu a oplatí sa to vedieť, pretože oba riadky často skončia v rôznych častiach vygenerovaného profilu. Dôležité je, aby oba prežili všetko, čo profil prepíše, kým ho klient prečíta.
setenv UV_DEPLOY field-support
push-peer-info
Predpona UV_ nie je dekorácia. Obyčajná premenná DEPLOY zostáva lokálna pre proces klienta a nikdy sa nepreposiela, kým forma s predponou je menný priestor, ktorý protokol vyhradzuje pre používateľsky definované polia. Zvyšok schváleného profilu nechajte nedotknutý a pred nasadením overte, že zostavenie klienta, ktoré nasadzujete, podporuje obe direktívy.
Jedna praktická kontrola patrí sem, nie na koniec: uistite sa, že direktíva dorazí do binárky klienta a že ju nezhltne obal. Grafický klient, ktorý si generuje vlastný príkazový riadok, alebo rozhranie na správu, ktoré znovu načíta uložený profil, môžu zahodiť riadky, ktoré nepoznajú. Ak server nič nevidí, je to prvé miesto, kam sa pozrieť.
Prečítajte pole zo serverového hooku
Na strane servera sa prijaté informácie o peerovi overia a vložia do prostredia pracovného postupu pripojenia, a práve to ich robí čitateľnými z hooku bez akejkoľvek vašej práce s protokolom. Server nemusí analyzovať riadiaci kanál ani pre vás nič ukladať; hodnota je jednoducho prítomná, kým sa pripojenie zostavuje. Minimálny skript client-connect, ktorý zapíše značku vedľa overeného mena, vyzerá takto.
#!/bin/sh
# /etc/openvpn/server/hooks/label.sh
printf '%s %s\n' "$common_name" "${UV_DEPLOY:-unset}" \
>> /var/log/openvpn/deploy-labels.log
Čítajte premennú cez prostredie, nie analýzou logu, a vždy jej dajte predvolenú hodnotu. ${UV_DEPLOY:-unset} udržiava skript funkčný pre klientov, ktorí pole nikdy neposielajú, čo je pri postupnom zavádzaní normálny stav. Nevysypávajte celé prostredie do logu, aby ste našli meno; obsahuje oveľa viac než značku, vrátane hodnôt, ktoré ste nechceli trvalo uchovať.
Spustite skript ručne a nahlási unset pri všetkom, pretože ručný shell nenesie prostredie pripojenia. To nie je chyba skriptu a nie je to dôkaz, že pole chýba. Otestujte ho cez skutočné pripojenie, čo je jediný kontext, v ktorom premenná existuje.
Overte, čo skutočne dorazilo
Pripojte jedného klienta so značkou a jedného bez nej, potom prečítajte súbor. Dvojica je test: jeden riadok by mal niesť hodnotu a druhý predvolenú hodnotu a oba by mali uviesť tú istú overenú identitu, ktorú očakávate.
tail -n 5 /var/log/openvpn/deploy-labels.log
# field-support deployed-client-07
# unset legacy-laptop-02
Tie komentárové riadky sú tvar výstupu, nie prepis z vášho servera; čítajte svoj vlastný súbor. Ak aj druhý klient ukazuje hodnotu, premenná je nastavená niekde inde v prostredí a čítate zastarané nastavenie, nie pole peera.
Skontrolujte aj log servera pre toto pripojenie. Informácie o peerovi sa tam môžu objaviť, čo je vhodné na ladenie a dôvod držať hodnoty nudné: žiadne mená ľudí, žiadne čísla tiketov, nič, čo by vám prekážalo, keby to čítal niekto iný.
Berte značku ako tvrdenie, nie ako identitu
Ktokoľvek môže upraviť profil klienta, môže zmeniť značku, a to, že tunel je overený, značku neautorizuje. Transport chráni hodnotu pri prenose; tvrdenie nepotvrdzuje. Autorizácia stále patrí overenej identite a záznamu o zápise, ktorý vlastní server, a značka sa s týmto záznamom porovnáva, keď na tom záleží.
Toto rozlíšenie rozhoduje o tom, kde sa značka smie používať. Dobré použitia sú smerovanie relácie do správneho logu, voľba zobrazovacej skupiny na dashboarde alebo označenie relácie podpory, aby ju človek neskôr našiel. Zlé použitia sú vpustenie zariadenia do podsiete, voľba pravidla firewallu alebo rozhodnutie, ktoré údaje zákazníka smie relácia čítať.
Hodnotu overte, kým sa dostane do cesty, dotazu alebo príkazu shellu. Zoznam povolených očakávaných reťazcov pre značku nasadenia stačí a nič nestojí. Nikdy nevkladajte reťazec dodaný peerom do príkazového riadku shellu a každé uložené pozorovanie obmedzte na reláciu, nie na adresu tunela, ktorú ďalší klient znova použije.
case "${UV_DEPLOY:-}" in
field-support|field-qa|lab) : ;;
*) UV_DEPLOY=unknown ;;
esac
Vráťte to čisto
Odstránenie funkcie sú dve zmazania a jedno overenie. Odstráňte riadky setenv a push-peer-info z profilu klienta, potom odstráňte alebo zakážte hook a jeho cieľ logu na serveri.
grep -rn 'UV_DEPLOY\|push-peer-info' /etc/openvpn/
tail -n 3 /var/log/openvpn/deploy-labels.log
Potom znova pripojte jedného klienta a potvrďte, že riadok v logu sa prestal objavovať. Hook, ktorý po zmene profilu stále beží, je zvyčajne druhý profil stále nasadený na testovacom zariadení, a nájsť ho teraz je lacnejšie než ho nájsť pri audite.
Na konci zostáva malá, ohraničená časť metadát relácie s doloženým pôvodom: klient ju tvrdí, server ju zaznamenáva a nič o prístupe na nej nezávisí. To je užitočná verzia funkcie a na jej dosiahnutie nie sú potrebné nové prihlasovacie údaje.