VPN demonundakı bağlantı hook-ları demon kimi işləyir və bu, adətən, onların root kimi işləməsi deməkdir. Həmin hook-lardan biri kiminsə ev qovluğuna yazan və ya masaüstü köməkçisini yenidən başladan kimi, siz şəbəkə hadisinə ixtiyari yerli istifadəçi kimi hərəkət etmək imkanı vermiş olursunuz. Adi qısa yol, yəni mühit dəyişənindən istifadəçi adını oxuyub onu ötürmək, bunu həll etmir. O, əməliyyatı yenidən etiketləyir, amma onu hansı hesabın icra etdiyini dəyişmir. İşləyən yol üç hissəli ötürmədir: imtiyazlı addım nə baş verdiyini deyir, ayrı bir vahid isə fəaliyyəti düzgün kimlik altında yerinə yetirir.

Mühitdəki istifadəçi adı etimad açarı deyil

Unix prosesin nəyə toxuna biləcəyini onun effektiv istifadəçi ID-sinə görə həll edir, mühitindəki sətirlərə görə deyil. USER=alice qurmaq və ya LOGNAME ixrac etmək diqqətsiz proqramın çıxışında nə çap etdiyini dəyişir; fayl sahibliyi yoxlamalarında heç nə dəyişmir. Həmin dəyişən qurulmuş halda root kimi işləyən hook yenə də Alisin fayllarını root kimi açır.

Adlar da eyni ad deyil. Uzaq giriş hesabı, yerli Unix hesabı və sertifikatın ümumi adı, bunlar tez-tez üst-üstə düşən, bəzən isə düşməyən üç identifikatordur. a.smith kimi autentifikasiya olunan istifadəçinin heç yerli hesabı olmaya bilər, ya da kataloq xidməti vasitəsilə asmith hesabına uyğunlaşdırıla bilər. Bir sətrin hər üç rolu yerinə yetirdiyini fərz edən istənilən dizayn ilk podratçıda sınacaq.

Deməli, ilk sual «hansı istifadəçi qoşulub» deyil, «bu əməliyyatı hansı yerli hesab yerinə yetirə bilər» sualıdır. Buna öz hesab verilənlər bazanızdan cavab verin, müştərinin göndərdiyindən deyil:

id -u alice
getent passwd alice | cut -d: -f1,3,6
stat -c '%U:%G %a %n' /home/alice/.local/state/vpn-status.json

Üçüncü əmr insanların atladığı əmrdir. Əgər hədəf fayl əvvəlki hook tərəfindən yaradıldığı üçün root-a məxsusdursa, düzgün qurulmuş istifadəçi əməliyyatı systemd probleminə bənzəyən, amma olmayan icazə xətası ilə uğursuz olacaq.

Demon yerində qalır

VPN xidmətinin öz User= dəyərini Alisə dəyişmək yanlış qoldur. Bu, demonun interfeysləri necə bağladığını, açarları necə oxuduğunu, status faylını necə yazdığını və marşrutları necə idarə etdiyini dəyişir və bütün bu riski işləyən bir vahidə köçürür. Demon öz imtiyazlarına ehtiyac duyur; sonrakı əməliyyat duymur.

Vahidə toxunmazdan əvvəl onun əslində nə etdiyinə baxın. İki əmr sizə icra kimliyini və qüvvədə olan dəqiq əmr sətirlərini göstərir, o cümlədən ləğvetmə faylının əlavə etdiyi hər şeyi:

systemctl show -p User -p Group -p ExecStart openvpn-server@server
systemctl cat openvpn-server@server

Defolt paket quraşdırmasında demon root-dur və --up skripti bunu miras alır. Fərz etmək əvəzinə təsdiqləyin, çünki sərtləşdirilmiş distributiv onu ayrı hesaba keçirmiş ola bilər və əl ilə yazılmış drop-in hook-u fərqli qaydaları olan sarğı vasitəsilə işlədə bilər.

Üç adlı hissə, bir dar tetikləyici

Texniki xidmətdən sonra da qalan quruluşun hadisəsi, tetikləyicisi və əməliyyatı var. Demon adlı sessiyanın qalxdığını bildirir. Tetikləyici bu kiçik faktı qəbul edir və bir sabit əməliyyat istəyir. Əməliyyat toxunduğu fayllara sahib olan yerli hesab altında işləyir. Zəncirdə heç nə ixtiyari əmr yolunu qəbul etmir.

Əməliyyatın özü adi xidmət vahididir və kimlik onun içindəki bir direktivdir:

[Service]
Type=oneshot
User=alice
Group=alice
ExecStart=/usr/local/bin/refresh-vpn-status --slot %i

Qeyd edin ki, User=alice bütün vahidə aiddir və systemd bilməyə dəyər bir istisnanı sənədləşdirir: + ilə başlayan əmr nədən asılı olmayaraq tam imtiyazlarla işləyir. Bu prefiks tək imtiyazlı addım üçün qanuni bir vasitədir və yenicə qurduğunuz ayrılığı ləğv etməyin rahat yoludur, ona görə də həmin vahiddəki istənilən +-i baxışda əsaslandırılmalı bir şey kimi qəbul edin.

Tetikləyicinin girişini minimal və gizli olmayan saxlayın. Sessiya identifikatoru, uyğunlaşdırılmış hesab və vaxt möhürü adətən lazım olanların hamısıdır. Sərhəddən heç vaxt shell fraqmenti, icra oluna bilən fayl yolu və ya müştərinin təqdim etdiyi mühit bloku ötürməyin, çünki qəbul edən tərəfin qanuni dəyəri yerləşdirilmiş dəyərdən ayırmaq üçün heç bir yolu yoxdur.

Əslində işləyən kimliyi yoxlayın

Konfiqurasiya baxışı sübut deyil. Təsdiqlənmiş sınaq bağlantısından sonra fayla toxunan UID-ni və demonun hələ də istifadə etdiyi UID-ni təsdiqləyin:

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

Birinci sətir Alisi və sınaq pəncərənizin içində bir vaxt möhürünü göstərməlidir. İkinci sətir hələ də root və ya paketlə gələn xidmət hesabını göstərməlidir ki, bu da demonun yerini dəyişmədiyini sübut edir. Üçüncüsü real yenidən qoşulmanı gözləmədən əməliyyatın icazələrini yoxlamağın ən ucuz yoludur.

Əgər faylın sahibi Alisdirsə, lakin qrupu və ya rejimi işə salmalar arasında dəyişibsə, məntiq xətası yerinə UMask= və ya qovluq icazəsi fərqi axtarın. Əgər vaxt möhürü heç tərpənməyibsə, tetikləyici heç vaxt işə düşməyib və faydalı növbəti addım başqa müştəri yenidən qoşulması deyil, əməliyyat vahidi üçün journalctl -u-dir.

Bağlantı hadisəsinin hələ də sübut etmədiyi şeylər

Qurulmuş tunel bir faktdır. Bu, masaüstü sessiyasının açıq olduğunu, sessiya avtobusunun əlçatan olduğunu və ya əməliyyatın istədiyi şəxsi resursun artıq mövcud olduğunu ifadə etmir. Alisin UID-si altındakı oneshot vahidi onun kimliyinə malikdir, sessiyasına isə heç malik deyil, ona görə də qrafik avtobus tələb edən hər şey dəstəklənən istifadəçi sessiyası mexanizmindən keçməli və o, sistemdən çıxdıqda nə baş verdiyini müəyyən etməlidir.

Yenidən qoşulmalar da təkrarlanır. Qatarda yatan noutbuk bir saatda onlarla bağlantı hadisi yarada bilər və hər dəfə sətir əlavə edən hook status faylını heç kimin oxuya bilmədiyi jurnala çevirir. Əməliyyatı idempotent edin və ya onun sessiya ilə açarlanmış tək qeydi əvəz etməsinə icazə verin.

Nəhayət, təsir radiusunu vahidin özündə məhdudlaşdırın: status qovluğundan başqa yalnız oxuna bilən fayl sistemi görünüşü, yeni imtiyaz yoxdur və açıq timeout. Demon ilə istifadəçi əməliyyatı arasındakı ayrılıq tək başına dəyərlidir, amma əməliyyat təsdiqlədiyiniz tək şeydən başqa heç nə edə bilmədikdə qat-qat dəyərlidir.

Əlaqəli məqalələr