ProtectHome наспрам TOTP семена: зашто пријава на VPN не успева
Тачан код не помаже PAM модулу који не може да отвори семе. Изаберите између drop-in и уписиве путање стања, затим проверите јединицу.
Аутентификатор приказује нови шестоцифрени код, VPN га одбија, а исти код се беспрекорно верификује када га тестирате из сопствене шкољке. Та разлика је цела прича. PAM модул који не може да отвори тајну регистрације враћа грешку која изгледа идентично као погрешан код, а сервисно окружење које скрива кућне директоријуме је чест разлог. Пре него што олабавите било коју дозволу, одлучите у којој од три ситуације се налазите.
Која од три грешке је ово?
Прва је тајна коју модул уопште не може да прочита. Друга је тајна коју може да прочита али не и да ажурира. Трећа је код који је заиста погрешан, обично због померања сата или поново употребљене вредности.
Раздвојите их читањем сервисног дневника и системског дневника аутентификације за један неуспешан покушај, затим потврдите коју PAM услугу учитава додатак и коју линију модула та услуга користи. Општа порука о неуспешној аутентификацији их не разликује, ни успешан ручни тест, јер ваша шкољка није окружење услуге.
Приказ фајл система јединице је уобичајени кривац када само услуга не успева.
systemctl show -p ProtectHome -p ProtectSystem -p ReadWritePaths [email protected]
ls -l /var/lib/vpn-otp/*/.google_authenticator 2>/dev/null | head -n 20Опција A: преместите тајну изван кућног директоријума
Када услуга скрива /home а ви радије задржавате ту заштиту, чувајте тајну тамо где она може да је види. Модул прихвата путању secret= и налог user= који обавља операције са фајловима, што омогућава централном складишту да опслужује много идентитета.
Ово је уредна опција и она захтева највише пажње, јер заједничко складиште чини један директоријум безбедносном границом за сваки налог.
auth required pam_google_authenticator.so secret=/var/lib/vpn-otp/${USER}/.google_authenticator user=vpn-otpПроверите три ствари пре него што му поверујете: налог постоји, радни процес модула може да пређе на њега и фајлови су његови са ограничењима режимима. Не користите ~ или путању са кућном променљивом заједно са user= и не искључујте провере власништва модула да би путања прорадила. Сачувајте фазу лозинке и остатак стека нетакнутим.
Опција B: оставите фајл и отворите путању
Ако тајна мора да остане у кућном директоријуму корисника, јединици је потребан приказ који укључује тај један директоријум без откривања свих кућних директоријума на хосту. Drop-in може да дода уско ограничено bind монтирање испод сендбоксованог кућног директоријума.
Тиме се власништво по кориснику задржава као модел, по цену промене јединице која мора да се прегледа сваки пут када се сендбокс промени.
Две границе је лако пропустити. Путања само за читање додата испод директоријума који сендбокс скрива не открива га, јер родитеља једноставно нема. И монтирање мора да буде уписиво ако модул треба да ажурира стање, што уводи следећу опцију. Напишите drop-in као засебан фајл уместо да уређујете паковану јединицу под /usr/lib, да је надоградња пакета не поништи тихо.
Опција C: задржите сендбокс и поправите уписе стања
Читање тајне је само половина аутентификације. Модул може да препише информације о временском одступању, заштиту од понављања или бројач, а фајл који прође проверу читања ипак може да не успе при уписивању.
Тај неуспех изгледа као лош код при следећем покушају, а не при овом, због чега се меша са померањем сата.
Дајте му сопствени уписиви директоријум и усмерите путању тајне тамо, уместо да учините уписивим цео кућни директоријум. Потврдите власника директоријума, слободан простор фајл система и да ли јединица ограничава уписе на другом месту. Затим тестирајте две узастопне пријаве, јер друга доказује путању уписивања, а прва само читање.
Проверавајте као услуга, не као ви сами
Свака важна провера мора да се изврши унутар сендбокса јединице са идентитетом јединице.
Команда која успе као root каже вам да фајл постоји и ништа више. Пријава кроз стварну услугу каже вам да ли модул може да прочита тајну, употреби је и запише назад оно што му треба.
На крају, сачувајте захтев нетакнутим. Додавање опције нулте лозинке, прихватање неуспеха само при читању или уклањање сендбокса сви би уклонили симптом променом политике. Корисник који мора да представи код треба и даље да буде одбијен када је тајна недоступна.