In lange uptiid bewiist allinnich dat it opstarten slagge is mei de privilezjes dy’t de daemon op dat stuit hie. De flaters dy’t hjir ta sizze, komme letter: in nije klient ferbynt, in weromlûklist wurdt ferfongen, in helperscript moat in bestân skriuwe. Elk dêrfan is in nije iepening troch it akkount sûnder privilezjes, mei syn eigen tastimmingsfraach en syn eigen flaterberjocht. Trije besluten skiede in konfiguraasje dy’t trochwurket fan ien dy’t by de folgjende barren flopt.

Skied wat betiid laden is fan wat letter iepene wurdt

In beskriver is in hannel op in iepene bestânbeskriuwing, en de tagongsmody is fêstlein doe’t dy beskriuwing makke waard. It letter feroarjen fan de brûker fan it proses slút de hannel net, dêrom wurket in kaaisbestân dat as root lêzen is nei de ferlaging noch. De mody feroaret ek net: in hannel iepene foar lêzen wurdt net skriuwber, en in skriuwbere hannel wurdt net ynlutsen allinnich om’t it akkount syn rjochten op it paad ferlern hat. Dy twa feiten ferklearje it grutste part fan it ferrassende hâlden en dragen yn dizze rapporten.

De oare helte is ûnthâld. In daemon kin in sertifikaat parse, it parste materiaal hâlde en it bestân slute; wat yn gebrûk bliuwt, binne gegevens, net in iepen bestân. Dêrom bewiist trochgeand ferkear noch dat in beskriver iepen is, noch dat de paadnamme berikber is. It bewiist allinnich dat it materiaal foar de hjoeddeiske sesje earder krigen is.

In lettere iepening is in oare transaksje. Hy rint ûnder de hjoeddeiske tagongsgegevens, de hjoeddeiske feiligenskontekst en de hjoeddeiske mountwerjefte, dêrom kin in paad dat by it opstarten lêsber wie by de folgjende ferbining wegere wurde. Rotaasje foeget in falstrik ta: it skriuwen fan in nij bestân oer deselde paadnamme lit in besteande beskriver oan it âlde objekt fêst, dêrom kin in werladen slagge lykje wylst de daemon noch de foarige ynhâld brûkt. Ferlykje de inode dy’t it proses hâldt mei dy op de skiif foardat jo in rotaasje leauwe.

Neam de trije runtime-lêzingen en wannear’t elk ôfgiet

Trije boarnen wurde normaal folle letter as de initialisaasje iepene, en se flopje op ferskillende mominten. In kliïntspesifyk konfiguraasjebestân wurdt lêzen as dy klient ferbynt, dêrom kin it foar ien brûker brekke wylst de oaren trochgeane. Weromlûkgegevens wurde by de autentikaasje fan de partner en wer by it ferfangen fan it bestân besjoen. In tydlike map wurdt allinnich oanrekke as in skript of in plugin eat skriuwt.

Gjin fan de trije heart by it opstartpaad, dêrom kin in server dy’t wiken sûn wie by de folgjende ferbining flopje. De kategory neamt ek de eigner fan de reparaasje: de earste twa binne lêsrjochten op de konfiguraasje ûnder it daemonakkount, en de tredde is in skriuwbere lokaasje mei in smel doel.

Path reopened laterWhat triggers the openFirst sign when it fails
Client configuration fileA connection for that client identityOne client rejected while others connect
Revocation dataPeer authentication, including after replacementRevoked and valid peers both refused
Script or plugin temporary directoryA helper needs to create a fileThe helper exits with a path error

persist-key beantwurdet in smellere fraach as de measte minsken tinke. It hâldt it kaaisbestân iepen oer de dokumintearre SIGUSR1- en ping-restart-resets, en it docht neat foar CCD-bestannen, weromlûkgegevens, helpende útfierbere bestannen of in folsleine werstart fan it proses. Dy folgje noch altyd har eigen iepeningspaden, ûnder hokker akkount dan ek op dat stuit rint.

Befêstigje it akkount en de werjefte dy’t it wier hat

Freegje de rinnende daemon hokker akkount it brûkt yn plak fan it unit-bestân te leauwen, en ferlykje dan it antwurd mei wat de unit ynstelt. In ôfwiking is it earste dat oplost wurde moat, want elke lettere tastimmingskontrôle rint as wa’t it proses wier is. Kuierje dêrnei it paad komponint foar komponint; trochgong wurdt op elk nivo beoardiele, dêrom bliuwt in lêsber bestân yn in net trochgongbere map ûnlêsber. De definitive bestânsmody is de lêste fraach, net de earste.

Nammromten en tsjinst-sânbakken foegje grinzen ta dy’t eigendom en modybits net beskriuwe. In paad dat yn jo shell sichtber is, kin ôfwêzich wêze of allinnich-lêze binnen in chroot, in mountnammromte of in unit dy’t thúsmappen ferberget. Feiligensmodules foegje noch in laach ta, dêrom kin in bestân dat lêsber liket by it iepenjen noch wegere wurde.

ps -o user:12,pid,args -C openvpn
systemctl show -p User -p Group -p ProtectHome -p RootDirectory [email protected]
sudo -u openvpn namei -l /etc/openvpn/ccd/alice

In slagge lêzing yn de shell fan de behearder test gjin fan dy kombinearre betingsten. Rin de kontrôle as it daemonakkount, mei deselde nammromte en deselde sânbak, of akseptearje dat it resultaat jo shell beskriuwt en net de server. It tredde kommando is de geunstige ferzje fan dy test: it prints de mody fan elk komponint en flopt op it earste dat it daemonakkount net trochkomme kin.

Jou it runtime-skriuwen in eigen map

Lêzen is mar de helte fan de ynventarisaasje. In helperscript hat miskien in statusbestân nedich, in plugin moat miskien steat njonken syn konfiguraasje skriuwe, en dy skriuwen wurde net dutsen troch de konfiguraasjebeam skriuwber te meitsjen. Jou de konkrete map de skriuwtastimming dy’t syn funksje nedich hat, mei in eigner en mody dy’t jo útlizze kinne. Ferkies allinnich-lêze tagong foar alles dat allinnich lêzen wurdt.

Hâld de rjochten fan de priveekaai skieden fan de beliedsbestannen. In kaai dy’t nei in reset op’t nij lêzen wurde moat, hat in oare eask as in klientbestân dat by elke ferbining lêzen wurdt, en ien tawitchjende mody foar beide jout mear tagong as it probleem freget. In tawijde daemonakkount mei smel eigendom is makliker te auditearjen as in brede groep. As de kaai resets oerlibje moat, persist-key hellet it de werlêzing fuort yn plak fan de map te ferbreedzjen.

Beslis út it barren dat jo reprodusearje kinne

In libbene tunnel bewiist ien paad troch de koade. It barren dat it bestân nedich hat, is de iennichste test dy’t de iepening dutsen dêr’t jo om jouwe, itsij in nije klientferbining, in ferfongen weromlûkbestân, in tastiene sêfte reset of in plande werstart. Kies it barren, rin it, en hâld de earste flater yn plak fan de lêste.

By in sêfte reset litte ien sinjaal en it logboek fan de unit sjen oft de kaai op’t nij lêzen is. Stjoer it sinjaal en lês dan de lêste rigels dy’t de unit skreaun hat:

systemctl kill -s SIGUSR1 [email protected]
journalctl -u [email protected] -n 40 --no-pager

Konkludearje net dat in kompromittearre daemon gjin bestannen mear feroarje kin allinnich om’t de privilezjes ferlege binne. Wat it noch kin, hinget ôf fan de oerbleaune tagongsgegevens, syn kapasiteiten, de mappen dêr’t it yn skriuwe kin en elke skriuwbere beskriver dy’t it noch hâldt. Privilezjeferlaging ferraunt de autoriteit, en de ynventarisaasje fan runtime-iepeningen lit sjen hoe fier. Skriuw dy grins njonken de konfiguraasje, sadat de folgjende persoan dy net op’t nij ûntdekke moat.

Relatearre artikelen