Hoe't jo fine hokker systemd-sandbox jo OpenVPN-hook wegere
De hook wurket as root en mislearret ûnder systemd, om't de unit minder mooglikheden, in lytser /dev en allinnich-lêzen paden hâldt.
De hook wurket as jo him mei de hân as root útfiere en jout Operation not permitted werom op it stuit dat de tsjinst him start. It bestân feroare net tusken dy runs; de omjouwing wol. systemd jout it proses in lytsere wrâld: minder mooglikheden, in oar /dev, allinnich-lêzen bestânsysteempaden en in taakplafond. Lês it mislearjen as in grins dy't ien spesifike operaasje wegere, net as in skript dat stikken gien is.
Begjin by de operaasje dy't wegere waard
In logrigel dy't seit dat de unit mislearre is, fertelt jo hast neat. De nuttige rigel neamt de oprop dy't wegere waard: in apparaatknooppunt dat net iepene wurde koe, in map dêr't net yn skreaun wurde koe, in namespace dy't net makke wurde koe. Fyn dy oprop foardat jo ien rjochtline oanreitsje, om't elk fan harren by in oare beheining heart. Lês dan de unit dy't echt rûn, drop-ins ynbegrepen, yn stee fan it bestân dat it pakket levere.
De fraach hjirûnder prints it fragmintpaad, de drop-in-mappen en de eigenskippen dy't fan belang binne foar in wegere apparaat of bestânsysteem. Lês se allegear foardat jo beslute hokker grins relevant is:
systemctl show "[email protected]" -p FragmentPath -p DropInPaths -p PrivateDevices -p DevicePolicy -p DeviceAllow -p ProtectHome -p ProtectSystem -p TasksMax
journalctl -u "[email protected]" -b --no-pager | grep -iE 'operation not permitted|permission denied|cannot open|failed'Neat yn dat blok skriuwt. As de wegere oprop yn it journaal mist, ferheegje dan de wiidweidichheid fan 'e klant foar ien run yn stee fan rjochtlinen te rieden. In rinnend proses bewiist dat de unit start is, net dat de hook mei de nedige foech rûn hat.
In namespace hat mount-rjochten nedich dy't in TUN-apparaat nea brûkt
Twa operaasjes dy't binnen ien hook itselde lykje, hawwe ferskillende tastimmingprofylen. It iepenjen fan /dev/net/tun en it meitsjen fan de ynterface freget netwurkbehear plus tagong ta dat knooppunt. In neamd netwurknamespace meitsje freget ek mount-wurk, om't it namespace-ark in farske /sys werjefte mountet en in steatmap op syn plak bynt. upstream-klantunit lit mountbehear bewust bûten syn grinsset, dat is wêrom't de namespacestap wegere wurdt wylst de tunnel sels wurke hawwe soe.
Dêrom rêdt it jaan fan it apparaatknooppunt it skript net. In apparaattastimming beantwurdet ien fraach, oft dit proses dit knooppunt iepenje mei, en de namespace-fraach is in oare. Keppelje de mislearjende oprop oan syn mooglikheid foardat jo wat dan ek ferbreedzje.
In test yn jo shell ervet elke mooglikheid dy't in ûnbeheinde root hat, en de unit ervet wat syn grinsset holden hat. Dy twa runs binne ferskillende eksperiminten sels as de binary identyk is.
Apparaten, beskerme paden en taakplafonds
As de wegere operaasje ienris bekend is, ferklearje trije groepen rjochtlinen de measte mislearrings. Tagong ta apparaten wurdt regele troch PrivateDevices, dy't /dev ferfangt troch in minimale set pseudo-apparaten, en troch DevicePolicy mei DeviceAllow, dy't beslute wat de cgroup tastiet. /dev/net/tun is gjin diel fan dy minimale set, dat in unit mei PrivateDevices=yes kin him net iepenje, wat it apparaatbelied ek seit.
Bestânsysteembeskerming beantwurdet in twadde fraach. ProtectHome=yes makket /home, /root en /run/user ûnberikber, en ProtectSystem=full makket /usr, /boot en /etc allinnich-lêzen. In hook dy't njonken syn eigen konfiguraasjebestân skriuwt, wurket dêrom yn jo shell en mislearret ûnder de unit, mei deselde tastimmingsfoarm as in ûntbrekkende mooglikheid. Ferpleats de skriuwbere ynfier nei in paad dat it belied tastiet, of foegje in smelle ReadWritePaths= ynfier ta.
Boarnebeheiningen binne de tredde groep, en de minst foar de hân lizzende. TasksMax= beheint hoefolle taken de unit meitsje mei, en in plafond foar bestânsbeskriuwers gedraacht him itselde foar sockets en handgrepen. In útrol dy't foarby it plafond groeid is, mislearret mei in boarneflater yn stee fan in tastimmingsflater, en dêrom docht it krekte berjocht der noch ta.
Helje de namespacestap út 'e hook
Tarieding dy't in foech freget dat de klant net hawwe mei, heart yn syn eigen unit. In oneshot dy't foar de klant rint, syn resultaat hâldt en foar de ferbining oardere is, jout de namespacestap wat er nedich hat sûnder dy rjochten oan it tunnelproses te jaan. De klant ferwiist dan nei dy unit yn stee fan it skript út syn up-hook te roppen.
It sjabloan hjirûnder is in begjinfoarm, net eat dat jo ûnlêzen tapasse. It hâldt de tarieding dêr't it foech wennet en lit de tunnelunit ûnoantaaste:
# /etc/systemd/system/[email protected]
[Unit]
Description=Namespace preparation for %i
Before=openvpn-client@%i.service
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/local/sbin/netns-up.sh %i
CapabilityBoundingSet=CAP_NET_ADMIN CAP_SYS_ADMIN
[Install]
WantedBy=multi-user.targetFoegje de oardering ta mei in drop-in yn stee fan de ferpakke unit te bewurkjen, sadat in upgrade jo feroaring net stilwei falle litte kin. De map is kaaie oan de eksimplaarnamme, dat in twadde profyl hat syn eigen bestân nedich:
sudo mkdir -p /etc/systemd/system/[email protected]
sudo tee /etc/systemd/system/[email protected]/10-namespace.conf >/dev/null <<'CONF'
[Unit]
[email protected]
[email protected]
CONF
sudo systemctl daemon-reloadWerhelje deselde oprop nei de feroaring
In reparaasje wurdt pas befêstige as deselde oprop in oar resultaat jout. Start beide units opnij, fier de operaasje út dy't mislearre, en fergelykje de útkomst mei de logrigel dy't jo foar de feroaring bewarre hawwe. In unit dy't start wylst de hook nea wer rint, is gjin reparaasje.
De folchoarder hjirûnder hâldt de fergeliking earlik, om't er de wegere oprop kontrolearret en net de kleur fan 'e unit. Bewarje syn útfier njonken de logrigel dy't jo foar de feroaring fêstleine hawwe:
sudo systemctl restart "[email protected]" "[email protected]"
systemctl status "[email protected]" --no-pager
journalctl -u "[email protected]" -b --no-pager | grep -c 'Operation not permitted'
ip -brief addr show tun0Tel de wegeringen yn stee fan de lêste rigel te lêzen, om't in hook mislearje, opnij besykje en slagje kin, en allinnich it oantal sjen lit oft de grins ferpleatst is. Lit in kommentaar efter yn 'e drop-in mei de rjochtline dy't jo fersoepje hawwe en de reden, om't de folgjende upgrade jo konfiguraasje fergeliket mei de ferpakke standert. In unit dy't pas start as elke beskerming útskeakele is, is net reparearre.