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 нь төлөвийн файлыг хэн ч уншиж чадахгүй лог болгож хувиргадаг. Үйлдлийг идемпотент болго, эсвэл сессээр түлхүүрлэсэн нэг бичлэгийг солихыг зөвшөөр.
Эцэст нь хохирлын радиусыг нэгжийн дотор хязгаарла: төлөвийн лавлахаас гадна зөвхөн уншигдах файлын системийн харагдац, шинэ эрх мэдэлгүй, тодорхой хугацааны хязгаартай. Демон ба хэрэглэгчийн үйлдлийн тусгаарлалт нь өөрөө үнэ цэнэтэй, гэхдээ үйлдэл нь таны зөвшөөрсөн ганц зүйлээс өөр юу ч хийж чадахгүй үед илүү үнэ цэнэтэй.