ProtectHome prieš TOTP sėklą: kodėl VPN prisijungimas nepavyksta
Taisyklingas kodas nepadeda PAM moduliui, kuris negali atidaryti sėklos. Pasirinkite tarp drop-in ir įrašomo būsenos kelio, tada patikrinkite vienetą.
Autentifikavimo programėlė rodo naują šešių skaitmenų kodą, VPN jį atmeta, o tas pats kodas puikiai patikrinamas, kai bandote iš savo paties apvalkalo. Šis skirtumas yra visa istorija. PAM modulis, kuris negali atidaryti registracijos paslapties, grąžina klaidą, atrodančią identiškai kaip neteisingas kodas, o paslaugos aplinka, kuri slepia namų katalogus, yra dažna to priežastis. Prieš susilpnindami bet kokią teisę, nuspręskite, kurioje iš trijų situacijų esate.
Kuri iš trijų klaidų tai yra?
Pirmoji – paslaptis, kurios modulis visiškai negali perskaityti. Antroji – paslaptis, kurią jis gali perskaityti, bet negali atnaujinti. Trečioji – kodas, kuris tikrai neteisingas, paprastai dėl laikrodžio dreifo ar pakartotinai panaudotos reikšmės.
Atskirkite juos perskaitydami paslaugos žurnalą ir sistemos autentifikavimo žurnalą vienam nepavykusiam bandymui, tada patvirtinkite, kurią PAM paslaugą įkelia įskiepis ir kurią modulio eilutę ta paslauga naudoja. Bendra autentifikavimo klaidos žinutė jų neišskiria, o sėkmingas rankinis testas taip pat ne, nes jūsų apvalkalas nėra paslaugos aplinka.
Vieneto failų sistemos vaizdas yra įprastas kaltininkas, kai nepavyksta tik paslauga.
systemctl show -p ProtectHome -p ProtectSystem -p ReadWritePaths [email protected]
ls -l /var/lib/vpn-otp/*/.google_authenticator 2>/dev/null | head -n 20A variantas: perkelti paslaptį iš namų katalogo
Kai paslauga slepia /home, o jūs norite išsaugoti šią apsaugą, laikykite paslaptį ten, kur ji gali ją matyti. Modulis priima secret= kelią ir user= paskyrą, kuri atlieka failų operacijas, o tai leidžia centrinei saugyklai aptarnauti daug tapatybių.
Tai tvarkingas variantas, ir jam reikia daugiausia atsargumo, nes bendra saugykla vieną katalogą paverčia kiekvienos paskyros saugumo riba.
auth required pam_google_authenticator.so secret=/var/lib/vpn-otp/${USER}/.google_authenticator user=vpn-otpPrieš juo pasitikėdami patikrinkite tris dalykus: paskyra egzistuoja, modulio darbo procesas gali prie jos pereiti, o failai jai priklauso su ribojančiais režimais. Nenaudokite ~ ar kelio su namų kintamuoju kartu su user= ir neišjunkite modulio nuosavybės patikrinimų, kad kelias veiktų. Išlaikykite slaptažodžio etapą ir likusį rinkinį nepaliestus.
B variantas: palikti failą ir atidaryti kelią
Jei paslaptis turi likti vartotojo namų kataloge, vienetui reikia vaizdo, kuris apima tą vieną katalogą neatskleidžiant visų namų katalogų pagrindiniame kompiuteryje. Drop-in gali pridėti siaurai apibrėžtą bind mount po sandboxintu namų katalogu.
Tai išlaiko nuosavybę pagal vartotoją kaip modelį, tačiau kainuoja vieneto pakeitimą, kurį reikia peržiūrėti kiekvieną kartą pasikeitus sandboxui.
Dviejų ribų lengva nepastebėti. Tik skaitymui skirtas kelias, pridėtas po katalogu, kurį sandboxas slepia, jo neatskleidžia, nes tėvinio katalogo tiesiog nėra. O prijungimas turi būti įrašomas, jei modulis turi atnaujinti būseną, ir tai įtraukia kitą variantą. Rašykite drop-in kaip atskirą failą, o ne redaguokite supakuotą vienetą po /usr/lib, kad paketo naujinimas jo tyliai nepanaikintų.
C variantas: palikti sandboxą ir sutvarkyti būsenos įrašymą
Paslapties skaitymas – tik pusė autentifikavimo. Modulis gali perrašyti laiko poslinkio informaciją, apsaugą nuo pakartojimo arba skaitiklį, o failas, praėjęs skaitymo patikrą, vis tiek gali nepavykti įrašant.
Ta klaida atrodo kaip blogas kodas kito bandymo metu, o ne šio, todėl ji painiojama su laikrodžio dreifu.
Suteikite jam savo įrašomą katalogą ir nukreipkite paslapties kelią ten, o ne darykite įrašomus visus namus. Patvirtinkite katalogo savininką, failų sistemos laisvą vietą ir ar vienetas riboja įrašymą kitur. Tada išbandykite du iš eilės prisijungimus, nes antrasis įrodo įrašymo kelią, o pirmasis – tik skaitymą.
Tikrinkite kaip paslauga, o ne kaip jūs pats
Kiekviena svarbi patikra turi vykti vieneto sandboxe su vieneto tapatybe.
Komanda, kuri pavyksta kaip root, pasako, kad failas egzistuoja, ir nieko daugiau. Prisijungimas per tikrąją paslaugą pasako, ar modulis gali perskaityti paslaptį, ja naudotis ir įrašyti atgal tai, ko jam reikia.
Galiausiai išlaikykite reikalavimą nepaliestą. Nulinio slaptažodžio parinkties pridėjimas, tik skaitymo klaidų priėmimas ar sandboxo pašalinimas visi pašalintų simptomą pakeisdami politiką. Vartotojas, privalantis pateikti kodą, vis tiek turi būti atmetamas, kai paslaptis nepasiekiama.