Il-hooks tal-konnessjoni fuq daemon tal-VPN joperaw bħala d-daemon, u normalment dan ifisser li joperaw bħala root. Fil-mument li wieħed minn dawn il-hooks jikteb fid-direttorju tad-dar ta’ xi ħadd jew jerġa’ jibda assistent tad-desktop, tkun tajt lil avveniment tan-netwerk il-kapaċità li jaġixxi bħala kwalunkwe utent lokali. Il-qasira tas-soltu, li taqra isem tal-utent minn varjabbli tal-ambjent u tgħaddih, ma tiffissax dan. Hija biss terġa’ ttikketta l-azzjoni mingħajr ma tbiddel liema kont iwettaqha. Li jaħdem huwa konsenja f’tliet partijiet, fejn il-pass privileġġjat jgħid x’ġara u unità separata twettaq l-azzjoni taħt l-identità t-tajba.

Isem tal-utent fl-ambjent mhuwiex swiċċ tal-identità

Unix jiddeċiedi x’jista’ jmiss proċess mill-ID tal-utent effettiv tiegħu, mhux mis-strings fl-ambjent tiegħu. L-issettjar ta’ USER=alice jew l-esportazzjoni ta’ LOGNAME ibiddel x’jistampa software traskurat fl-output tiegħu; ma jbiddel xejn fil-verifiki tal-propjetà tal-fajls. Hook li jopera bħala root b’dik il-varjabbli settjata xorta jiftaħ il-fajls ta’ Alice bħala root.

L-ismijiet lanqas mhumiex l-istess isem. Il-login tal-aċċess mill-bogħod, il-kont Unix lokali u l-isem komuni taċ-ċertifikat huma tliet identifikaturi li spiss jaqblu u xi drabi le. Utent li jawtentika bħala a.smith jista’ ma jkollu l-ebda kont lokali, jew jista’ jiġi mmappjat għal asmith permezz ta’ servizz tad-direttorju. Kwalunkwe disinn li jassumi li string wieħed iservi t-tliet rwoli se jinkiser fl-ewwel kuntrattur.

Għalhekk l-ewwel mistoqsija mhijiex «liema utent huwa konness» imma «liema kont lokali huwa permess iwettaq din l-azzjoni». Wieġeb dan mid-database tal-kontijiet tiegħek stess, mhux minn dak li bagħat il-klijent:

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

It-tielet kmand huwa dak li n-nies jaqbeżu. Jekk il-fajl fil-mira huwa proprjetà ta’ root għax il-hook preċedenti ħoloq, azzjoni tal-utent konfigurata sewwa se tfalli bi żball ta’ permess li jidher bħala problema ta’ systemd u mhuwiex.

Id-daemon jibqa’ fejn hu

Li tbiddel il-User= tas-servizz VPN innifsu għal Alice huwa l-lieva ħażina. Dan ibiddel kif id-daemon jorbot l-interfaces, jaqra ċ-ċwievet, jikteb il-fajl tal-istat tiegħu u jamministra r-rotot, u jċaqlaq dan ir-riskju kollu f’unità li kienet qed taħdem. Id-daemon jeħtieġ il-privileġġi tiegħu; l-azzjoni ta’ wara le.

Ħares x’inhu tassew jagħmel l-unità qabel ma tmissha. Żewġ kmandi jgħidulek l-identità tal-eżekuzzjoni u l-linji tal-kmand eżatti fis-seħħ, inkluż kull ma żied override:

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

F’installazzjoni standard tal-pakkett id-daemon huwa root u l-iskript --up jiret dan. Ikkonfermah minflok ma tassumih, għax distribuzzjoni msaħħa setgħet ċaqilqitu għal kont iddedikat, u drop-in miktub bl-idejn jista’ jopera l-hook permezz ta’ wrapper b’regoli differenti.

Tliet partijiet imsemmija, trigger wieħed dejjaq

L-arranġament li jgħaddi mill-manutenzjoni għandu avveniment, trigger u azzjoni. Id-daemon jirrapporta li sessjoni msemmija telgħet. Trigger jilqa’ dik il-fatt żgħira u jitlob azzjoni waħda fissa. L-azzjoni topera taħt il-kont lokali li jippossjedi l-fajls li tmiss. Xejn fil-katina ma jaċċetta perkors tal-kmand arbitrarju.

L-azzjoni nnifisha hija unità tas-servizz ordinarja, u l-identità hija direttiva waħda ġo fiha:

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

Innota li User=alice japplika għall-unità kollha, u systemd jiddokumenta eċċezzjoni waħda li jiswa li tkun taf: kmand b’prefiss + jopera b’privileġġi sħaħ irrispettivament. Dak il-prefiss huwa għodda leġittima għal pass privileġġjat wieħed u mod komdu biex tħassar is-separazzjoni li għadek kemm bnejt, għalhekk ittratta kwalunkwe + f’dik l-unità bħala xi ħaġa li trid tiġi ġġustifikata fir-reviżjoni.

Żomm l-input tat-trigger minimu u mhux sigriet. L-identifikatur tas-sessjoni, il-kont immappjat u timestamp huma normalment kull ma hu bżonn. Qatt tgħaddix framment ta’ shell, perkors ta’ esegwibbli jew blokk tal-ambjent ipprovdut mill-klijent minn naqas il-fruntiera, għax in-naħa li tirċievi m’għandhiex mod kif tiddistingwi valur leġittimu minn wieħed injettat.

Ivverifika l-identità li tassew ħadmet

Ir-reviżjoni tal-konfigurazzjoni mhijiex prova. Wara konnessjoni tat-test approvata, ikkonferma l-UID li mess il-fajl u l-UID li d-daemon għadu juża:

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

L-ewwel linja għandha turi lil Alice u timestamp fit-tieqa tat-test tiegħek. It-tieni għandha turi għadha root jew il-kont tas-servizz tal-pakkett, li jipprova li d-daemon ma ċċaqlaqx. It-tielet hija l-irħas mod biex tittestja l-permessi tal-azzjoni mingħajr ma tistenna konnessjoni mill-ġdid vera.

Jekk is-sid tal-fajl huwa Alice imma l-grupp jew il-mod tiegħu nbidel bejn is-sejħiet, fittex UMask= jew differenza fil-permessi tad-direttorju minflok żball tal-loġika. Jekk it-timestamp ma ċċaqlaqx xejn, it-trigger qatt ma nfirex, u l-pass li jmiss utli huwa journalctl -u għall-unità tal-azzjoni minflok konnessjoni mill-ġdid oħra tal-klijent.

X’għadu ma jippruvax avveniment tal-konnessjoni

Tunnel stabbilit huwa fatt wieħed. Dan ma jfissirx li s-sessjoni tad-desktop hija miftuħa, li l-bus tas-sessjoni jintlaħaq jew li r-riżors privat li trid l-azzjoni huwa diġà disponibbli. Unità oneshot taħt l-UID ta’ Alice għandha l-identità tagħha u xejn mis-sessjoni tagħha, għalhekk kull ma jeħtieġ bus grafiku jrid jgħaddi mill-mekkaniżmu tas-sessjoni tal-utent appoġġjat u jiddefinixxi x’jiġri meta tkun illogkjata.

Anki l-konnessjonijiet mill-ġdid jirrepetu. Laptop li jorqod fil-ferrovija jista’ jipproduċi tużżana avvenimenti tal-konnessjoni f’siegħa, u hook li jżid linja kull darba jagħmel fajl tal-istat f’log li ħadd ma jista’ jaqra. Agħmel l-azzjoni idempotenti, jew ħalliha tissostitwixxi rekord wieħed imċavvi tas-sessjoni.

Fl-aħħar, illimita r-raġġ tad-dannu fl-unità stess: veduta tas-sistema tal-fajls tinqara biss barra mid-direttorju tal-istat, l-ebda privileġġ ġdid, u timeout espliċitu. Is-separazzjoni bejn id-daemon u l-azzjoni tal-utent tiswa waħedha, imma tiswa ħafna aktar meta l-azzjoni ma tistax tagħmel xejn ħlief dik il-ħaġa waħda li approvajt.

Artikli relatati