VPN туташуусунан кийинки аракетти демон катары эмес, колдонуучу катары аткарыңыз
USER=alice деген чөйрө өзгөрмөсү hook кайсы эсеп менен иштешин өзгөртпөйт. Окуяны, триггерди жана аракетти бөлүп, анан UID-ди далилдеңиз.
VPN демонундагы туташуу hook-тору демон катары иштейт, жана бул адатта алар root катары иштешет дегенди билдирет. Ошол hook-тордун бири бирөөнүн үй каталогуна жазганда же жумуш үстөлүнүн жардамчысын кайра баштаганда, сиз тармак окуясына каалаган жергиликтүү колдонуучу катары аракет кылуу мүмкүнчүлүгүн бердиңиз. Адаттагы кыска жол, чөйрө өзгөрмөсүнөн колдонуучу атын окуп, аны андан ары берүү, муну оңдобойт. Ал аракетти кайра белгилейт, бирок аны кайсы эсеп аткарарын өзгөртпөйт. Иштеген нерсе — үч бөлүктүү өткөрүп берүү: артыкчылыгы бар кадам эмне болгонун айтат, ал эми өзүнчө бирдик аракетти туура инсандык менен аткарат.
Чөйрөдөгү колдонуучу аты — инсандык которгуч эмес
Unix процесстин эмнеге тийүүгө укугу бар экенин анын натыйжалуу колдонуучу ID-си менен чечет, чөйрөсүндөгү саптар менен эмес. USER=alice коюу же LOGNAME экспорттоо этиятсыз программа өз чыгышында эмнени басарын өзгөртөт; файл ээлигин текшерүүлөрдө эч нерсени өзгөртпөйт. Ошол өзгөрмө коюлган бойдон root катары иштеген hook дагы эле Alice-тин файлдарын root катары ачат.
Аталыштар да бир аталыш эмес. Алыскы кирүү логини, жергиликтүү Unix эсеби жана сертификаттын жалпы аты — көп учурда дал келүүчү, кээде келбеген үч идентификатор. a.smith катары аутентификацияланган колдонуучунун жергиликтүү эсеби такыр болбошу мүмкүн, же каталог кызматы аркылуу asmith-ге салыштырылышы мүмкүн. Бир сап үч ролду тең аткарат деп болжолдогон ар кандай долбоор биринчи мердигерде бузулат.
Ошондуктан биринчи суроо «кайсы колдонуучу туташкан» эмес, «кайсы жергиликтүү эсепке бул аракетти аткарууга уруксат бар». Муну өзүңүздүн эсеп маалымат базаңыздан жооп бериңиз, кардар жибергенден эмес:
id -u alice
getent passwd alice | cut -d: -f1,3,6
stat -c '%U:%G %a %n' /home/alice/.local/state/vpn-status.json
Үчүнчү буйрук — адамдар өткөрүп жиберген буйрук. Эгер максаттуу файл мурунку hook аны түзгөндүктөн root-ко таандык болсо, туура конфигурацияланган колдонуучу аракети systemd көйгөйүнө окшош, бирок андай болбогон уруксат катасы менен ишке ашпайт.
Демон өз ордунда калат
VPN кызматынын өз User= маанисин Alice-ге алмаштыруу — туура эмес рычаг. Бул демондун интерфейстерди кантип байланыштырарын, ачкычтарды кантип окуй турганын, абал файлын кантип жазарын жана маршруттарды кантип башкарарын өзгөртөт жана ушул тобокелдиктин баарын иштеп турган бирдикке которот. Демонго өз артыкчылыктары керек; кийинки аракетке керек эмес.
Бирдикке тийүүдөн мурун анын чындыгында эмне кылып жатканын караңыз. Эки буйрук аткаруу инсандыгын жана күчүндөгү так буйрук саптарын айтат, анын ичинде кайра аныктоо кошкондун баарын:
systemctl show -p User -p Group -p ExecStart openvpn-server@server
systemctl cat openvpn-server@server
Демейки пакет орнотууда демон root, ал эми --up скрипти муну мураска алат. Болжолдоонун ордуна ырастаңыз, анткени катууландырылган бөлүштүрүү аны өзүнчө эсепке которгон болушу мүмкүн, ал эми кол менен жазылган drop-in hook-ту башка эрежелери бар каптоо аркылуу иштетиши мүмкүн.
Үч аталган бөлүк, бир тар триггер
Тейлөөдөн аман калган жайгашууда окуя, триггер жана аракет бар. Демон аталган сессия көтөрүлгөнүн билдирет. Триггер ушул кичине фактыны кабыл алып, бир туруктуу аракетти сурайт. Аракет тийип жаткан файлдарга ээ болгон жергиликтүү эсептин астында иштейт. Чынжырда эч нерсе ыктыярдуу буйрук жолун кабыл албайт.
Аракеттин өзү — кадимки кызмат бирдиги, ал эми инсандык анын ичиндеги бир директива:
[Service]
Type=oneshot
User=alice
Group=alice
ExecStart=/usr/local/bin/refresh-vpn-status --slot %i
User=alice бүт бирдикке тиешелүү экенин эске алыңыз, жана systemd билүүгө татыктуу бир өзгөчөлүктү документтештирет: + префикси бар буйрук ага карабастан толук артыкчылыктар менен иштейт. Бул префикс бир артыкчылыгы бар кадам үчүн мыйзамдуу курал жана жаңы эле курган бөлүнүүнү жокко чыгаруунун ыңгайлуу жолу, ошондуктан ошол бирдиктеги ар кандай +-ди кароодо негизделүүгө тийиш нерсе катары караңыз.
Триггердин кирүүсүн кичине жана купуя эмес кармаңыз. Сессия идентификатору, салыштырылган эсеп жана убакыт белгиси адатта керектүүнүн баары. Чек арадан эч качан shell үзүндүсүн, аткарылуучу файлдын жолун же кардар сунуштаган чөйрө блогун өткөрбөңүз, анткени кабыл алуучу тарапта мыйзамдуу маанини киргизилген мааниден ажыратуу жолу жок.
Чындыгында иштеген инсандыкты текшериңиз
Конфигурацияны кароо далил эмес. Бекитилген сыноо туташуусунан кийин файлга тийген UID-ди жана демон дагы эле колдонуп жаткан UID-ди ырастаңыз:
stat -c '%U %G %y %n' /home/alice/.local/state/vpn-status.json
ps -o user=,pid=,cmd= -p "$(pgrep -o -f 'openvpn --daemon')"
systemd-run --uid=alice --pipe /usr/local/bin/refresh-vpn-status --dry-run
Биринчи сап Alice-ти жана сыноо терезеңиздин ичиндеги убакыт белгисин көрсөтүшү керек. Экинчиси дагы эле root же пакеттин кызмат эсебин көрсөтүшү керек, бул демон ордунан жылбаганын далилдейт. Үчүнчүсү — чыныгы кайра туташууну күтпөстөн аракеттин уруксаттарын текшерүүнүн эң арзан жолу.
Эгер файлдын ээси Alice болсо, бирок анын тобу же режими иштетүүлөрдүн ортосунда өзгөрсө, логика катасын эмес, UMask= же каталог уруксатынын айырмасын издеңиз. Эгер убакыт белгиси такыр кыймылдабаса, триггер эч качан иштеген эмес, жана пайдалуу кийинки кадам — кардарды дагы кайра туташтыруу эмес, аракет бирдиги үчүн journalctl -u.
Туташуу окуясы дагы эмнени далилдебейт
Орнотулган туннель — бир факт. Бул жумуш үстөлүнүн сессиясы ачык, сессия шинасы жеткиликтүү же аракет каалаган жеке ресурс азыр эле бар дегенди билдирбейт. Alice-тин UID-инин астындагы oneshot бирдиги анын инсандыгына ээ, ал эми сессиясынан эч нерсе жок, ошондуктан графикалык шина талап кылгандын баары колдоого алынган колдонуучу сессиясы механизминен өтүшү жана ал системадан чыкканда эмне болорун аныкташы керек.
Кайра туташуулар да кайталанат. Поездде уктаган ноутбук бир саатта ондогон туташуу окуясын жаратышы мүмкүн, ал эми ар жолу сап кошкон hook абал файлын эч ким окуй албаган журналга айландырат. Аракетти идемпотенттүү кылыңыз же ага сессия боюнча ачкычталган бир жазууну алмаштырууга уруксат бериңиз.
Акырында, зыян радиусун бирдиктин өзүндө чектеңиз: абал каталогунан тышкары тек окулуучу файл системасынын көрүнүшү, жаңы артыкчылыктар жок жана так убакыт чеги. Демон менен колдонуучу аракетинин бөлүнүшү өз алдынча баалуу, бирок аракет сиз бекиткен жалгыз нерседен башка эч нерсе кыла албаганда ал алда канча баалуу.