VPN dēmona savienojuma hook darbojas kā dēmons, un tas parasti nozīmē, ka darbojas ar root tiesībām. Tajā mirklī, kad kāds no šiem hook ieraksta kāda mājas direktorijā vai restartē darbvirsmas palīgu, jūs esat devis tīkla notikumam iespēju rīkoties kā jebkuram vietējam lietotājam. Ierastais īsceļš, nolasīt lietotājvārdu no vides mainīgā un to nodot tālāk, to neizlabo. Tas tikai pārlīmē darbību, nemainot, kurš konts to izpilda. Tas, kas darbojas, ir trīsdaļīga nodošana, kurā privileģētais solis pasaka, kas notika, un atsevišķa vienība izpilda darbību ar pareizo identitāti.

Lietotājvārds vidē nav identitātes slēdzis

Unix izlemj, kam procesam drīkst pieskarties, pēc tā efektīvā lietotāja ID, nevis pēc virknēm tā vidē. USER=alice iestatīšana vai LOGNAME eksportēšana maina to, ko nolaidīga programmatūra izdrukā savā izvadē; tas nemaina neko failu īpašumtiesību pārbaudēs. Hook, kas darbojas kā root ar šo mainīgo, joprojām atver Alice failus kā root.

Arī nosaukumi nav viens un tas pats nosaukums. Attālinātās piekļuves pieteikšanās, vietējais Unix konts un sertifikāta vispārējais nosaukums ir trīs identifikatori, kas bieži sakrīt un dažreiz ne. Lietotājam, kas autentificējas kā a.smith, var vispār nebūt vietējā konta, vai arī tas tiek kartēts uz asmith caur direktoriju servisu. Jebkurš dizains, kas pieņem, ka viena virkne pilda visas trīs lomas, salūzīs pie pirmā darbuzņēmēja.

Tāpēc pirmais jautājums nav «kurš lietotājs ir pievienots», bet «kuram vietējam kontam ir atļauts veikt šo darbību». Atbildiet uz to no savas kontu datubāzes, nevis no tā, ko nosūtījis klients:

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

Trešā komanda ir tā, ko cilvēki izlaiž. Ja mērķa fails pieder root, jo to izveidoja iepriekšējais hook, pareizi konfigurēta lietotāja darbība neizdosies ar atļauju kļūdu, kas izskatās kā systemd problēma un nav.

Dēmons paliek tur, kur tas ir

Mainīt paša VPN servisa User= uz Alice ir nepareizā svira. Tas maina, kā dēmons piesaista saskarnes, lasa atslēgas, raksta savu statusa failu un pārvalda maršrutus, un pārvieto visu šo risku uz vienību, kas darbojās. Dēmonam ir vajadzīgas tā privilēģijas; turpmākajai darbībai nav.

Paskatieties, ko vienība faktiski dara, pirms tai pieskarties. Divas komandas pasaka izpildes identitāti un spēkā esošās precīzās komandu rindas, tostarp visu, ko pievienojis pārraksts:

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

Noklusējuma pakotnes instalācijā dēmons ir root, un --up skripts to manto. Apstipriniet to, nevis pieņemiet, jo rūdīts sadalījums to var būt pārcēlis uz veltītu kontu, un ar roku rakstīts drop-in var palaist hook caur ietvaru ar citiem noteikumiem.

Trīs nosauktas daļas, viens šaurs trigeris

Izkārtojumam, kas iztur apkopi, ir notikums, trigeris un darbība. Dēmons ziņo, ka nosaukta sesija ir pacēlusies. Trigeris pieņem šo mazo faktu un pieprasa vienu fiksētu darbību. Darbība darbojas zem vietējā konta, kuram pieder aizskartie faili. Nekas ķēdē nepieņem patvaļīgu komandas ceļu.

Darbība pati par sevi ir parasta servisa vienība, un identitāte ir viena direktīva tajā:

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

Ievērojiet, ka User=alice attiecas uz visu vienību, un systemd dokumentē vienu izņēmumu, ko ir vērts zināt: komanda ar prefiksu + darbojas ar pilnām privilēģijām neatkarīgi no tā. Šis prefikss ir likumīgs instruments vienam privileģētam solim un ērts veids, kā atcelt tikko uzbūvēto atdalījumu, tāpēc uzskatiet jebkuru + šajā vienībā par kaut ko, kas pārskatā jāpamato.

Turiet trigera ievadi minimālu un ne slepenu. Sesijas identifikators, kartētais konts un laika zīmogs parasti ir viss nepieciešamais. Nekad nenododiet pāri robežai shell fragmentu, izpildāma faila ceļu vai klienta nodrošinātu vides bloku, jo saņēmējai pusei nav veida, kā atšķirt likumīgu vērtību no ievadītas.

Pārbaudiet identitāti, kas faktiski darbojās

Konfigurācijas pārskats nav pierādījums. Pēc apstiprināta testa savienojuma apstipriniet UID, kas pieskārās failam, un UID, ko dēmons joprojām izmanto:

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

Pirmajā rindā jābūt Alice un laika zīmogam jūsu testa logā. Otrajā joprojām jābūt root vai pakotnes servisa kontam, kas pierāda, ka dēmons nav pārvietojies. Trešā ir lētākais veids, kā pārbaudīt darbības atļaujas, negaidot īstu atkārtotu savienojumu.

Ja faila īpašnieks ir Alice, bet tā grupa vai režīms ir mainījies starp palaidēm, meklējiet UMask= vai direktorijas atļauju atšķirību, nevis loģikas kļūdu. Ja laika zīmogs vispār nav kustējies, trigeris nekad nav iedarbojies, un noderīgais nākamais solis ir journalctl -u darbības vienībai, nevis vēl viens klienta atkārtots savienojums.

Ko savienojuma notikums joprojām nepierāda

Izveidots tunelis ir viens fakts. Tas nenozīmē, ka darbvirsmas sesija ir atslēgta, sesijas kopne ir sasniedzama vai ka privātais resurss, ko darbība vēlas, jau ir pieejams. oneshot vienībai zem Alice UID ir viņas identitāte un nekas no viņas sesijas, tāpēc visam, kam vajadzīga grafiskā kopne, jāiet caur atbalstīto lietotāja sesijas mehānismu un jādefinē, kas notiek, kad viņa ir izgājusi.

Atkārtoti savienojumi arī atkārtojas. Klēpjdators, kas guļ vilcienā, stundā var radīt duci savienojuma notikumu, un hook, kas katru reizi pievieno rindu, pārvērš statusa failu žurnālā, ko neviens nevar lasīt. Padariet darbību idempotentu vai ļaujiet tai aizstāt vienu ierakstu, kas atslēgots pēc sesijas.

Visbeidzot, ierobežojiet bojājumu rādiusu pašā vienībā: tikai lasāms failu sistēmas skats ārpus statusa direktorijas, nekādu jaunu privilēģiju un skaidrs taimauts. Dēmona un lietotāja darbības atdalīšana ir vērtīga pati par sevi, bet tā ir daudz vērtīgāka, kad darbība nevar izdarīt neko citu kā vien to vienu lietu, ko jūs apstiprinājāt.

Saistītie raksti