Kif issir taf liema sandbox ta' systemd irrifjuta l-hook OpenVPN tiegħek
Il-hook jaħdem bħala root u jonqos taħt systemd għax l-unit iżomm inqas kapaċitajiet, /dev iżgħar u mogħdijiet qari biss.
Il-hook jaħdem meta tmexxih bl-idejn bħala root u jirritorna Operation not permitted fil-mument li s-servizz jibda ħaddmu. Il-fajl ma nbidilx bejn dawk it-tħaddimiet; l-ambjent inbidel. systemd jagħti lill-proċess dinja iżgħar: inqas kapaċitajiet, /dev differenti, mogħdijiet tas-sistema tal-fajls qari biss u limitu ta' fuq għall-kompiti. Aqra l-falliment bħala fruntiera li rrifjutat operazzjoni waħda speċifika, mhux bħala skript li nqasam.
Ibda mill-operazzjoni li ġiet rifjutata
Linja tal-log li tgħid li l-unit falliet kważi ma tgħidlek xejn. Il-linja utli ssemmi s-sejħa li ġiet rifjutata: nod tad-dispożittiv li ma setax jinfetaħ, direttorju li ma setax jinkiteb fih, spazju tal-ismijiet li ma setax jinħoloq. Sib dik is-sejħa qabel ma tmiss direttiva waħda, għax kull waħda tikkorrispondi għal restrizzjoni differenti. Imbagħad aqra l-unit li tassew ħadem, inklużi d-drop-in, minflok il-fajl li bagħat il-pakkett.
Il-mistoqsija hawn taħt tipprintja l-mogħdija tal-framment, id-direttorji drop-in u l-proprjetajiet li jgħoddu għal rifjut ta' dispożittiv jew sistema tal-fajls. Aqrahom kollha qabel ma tiddeċiedi liema fruntiera hija rilevanti:
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'Xejn f'dak il-blokk ma jikteb. Jekk is-sejħa rifjutata hija nieqsa mill-ġurnal, għolli l-verbosity tal-klijent għal tħaddima waħda minflok ma taqta' x'inhuma d-direttivi. Proċess li qed jaħdem jipprova li l-unit beda, mhux li l-hook ħadem bil-privileġġi li kien jeħtieġ.
Spazju tal-ismijiet jeħtieġ drittijiet tal-mount li dispożittiv TUN qatt ma juża
Żewġ operazzjonijiet li jidhru l-istess ġewwa hook wieħed għandhom profili tal-permess differenti. Il-ftuħ ta' /dev/net/tun u l-ħolqien tal-interface jeħtieġ amministrazzjoni tan-netwerk flimkien ma' aċċess għal dak in-nod. Il-ħolqien ta' spazju tal-ismijiet tan-netwerk bl-isem jeħtieġ ukoll xogħol tal-mount, għax l-għodda tal-ispazji tal-ismijiet iżżomm mount ta' /sys veduta friska u torbot direttorju tal-istat fil-post tiegħu. l-unit tal-klijent upstream tħalli deliberatament l-amministrazzjoni tal-mount barra mis-sett tal-fruntieri tagħha, għalhekk il-pass tal-ispazju tal-ismijiet jiġi rifjutat filwaqt li t-tunnel innifsu kien jaħdem.
Għalhekk l-għoti tan-nod tad-dispożittiv ma jsalvax l-iskript. Permess tad-dispożittiv iwieġeb mistoqsija waħda, jekk dan il-proċess jistax jiftaħ dan in-nod, u l-mistoqsija tal-ispazju tal-ismijiet hija oħra. Qabbel is-sejħa li qed tonqos mal-kapaċità tagħha qabel ma twessa' xejn.
Test fil-shell tiegħek jiret kull kapaċità li għandu root mingħajr restrizzjoni, u l-unit jiret dak li żamm is-sett tal-fruntieri tiegħu. Dawk iż-żewġ tħaddimiet huma esperimenti differenti anke meta l-binarju huwa identiku.
Dispożittivi, mogħdijiet protetti u limiti tal-kompiti
Ladarba l-operazzjoni rifjutata tkun magħrufa, tliet gruppi ta' direttivi jispjegaw ħafna mill-fallimenti. L-aċċess għad-dispożittivi huwa rregolat minn PrivateDevices, li jissostitwixxi /dev b'sett minimu ta' psewdo-dispożittivi, u minn DevicePolicy ma' DeviceAllow, li jiddeċiedu x'jippermetti l-cgroup. /dev/net/tun mhuwiex parti minn dak is-sett minimu, għalhekk unit b' PrivateDevices=yes ma jistax jiftħu, x'jikteb il-politika tad-dispożittivi.
Il-protezzjoni tas-sistema tal-fajls twieġeb it-tieni mistoqsija. ProtectHome=yes tagħmel /home, /root u /run/user inaċċessibbli, u ProtectSystem=full tagħmel /usr, /boot u /etc qari biss. Għalhekk hook li jikteb ħdejn il-fajl tal-konfigurazzjoni tiegħu stess jaħdem fil-shell tiegħek u jonqos taħt l-unit, bl-istess forma ta' permess bħal kapaċità nieqsa. Ċaqlaq l-input li jista' jinkiteb għal mogħdija li l-politika tippermetti, jew żid entrata ReadWritePaths= dejqa.
Il-limiti tar-riżorsi huma t-tielet grupp, u l-inqas ovvju. TasksMax= jillimita kemm-il kompitu l-unit jista' joħloq, u limitu ta' fuq tad-deskritturi tal-fajl iġib ruħu l-istess għas-sockets u l-handles. Skjerament li kiber lil hinn mil-limitu jonqos bi żball tar-riżorsi minflok żball tal-permess, u għalhekk il-messaġġ preċiż għadu jgħodd.
Oħroġ il-pass tal-ispazju tal-ismijiet mill-hook
It-tħejjija li teħtieġ privileġġ li l-klijent m'għandux ikollu tappartjeni għall-unit tagħha stess. oneshot li jaħdem qabel il-klijent, iżomm ir-riżultat tiegħu u huwa ordnat qabel il-konnessjoni jagħti lill-pass tal-ispazju tal-ismijiet dak li jeħtieġ mingħajr ma jagħti dawk id-drittijiet lill-proċess tat-tunnel. Il-klijent imbagħad jirreferi għal dak l-unit minflok ma jsejjaħ l-iskript mill-hook up tiegħu.
Il-mudell hawn taħt huwa forma tal-bidu, mhux xi ħaġa li tiġi applikata bla ma tinqara. Iżomm it-tħejjija fejn tgħix il-privileġġ u jħalli l-unit tat-tunnel bla ma jmissha:
# /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.targetŻid l-ordni b'drop-in minflok ma teditja l-unit ippakkjat, sabiex aġġornament ma jistax iwaddab il-bidla tiegħek fis-skiet. Id-direttorju huwa marbut mal-isem tal-istanza, għalhekk it-tieni profil jeħtieġ il-fajl tiegħu stess:
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-reloadIrrepeti l-istess sejħa wara l-bidla
Tiswija tiġi kkonfermata biss meta l-istess sejħa tagħti riżultat differenti. Erġa' ibda ż-żewġ units, wettaq l-operazzjoni li falliet u qabbel ir-riżultat tagħha mal-linja tal-ġurnal li salvajt qabel il-bidla. Unit li jibda filwaqt li l-hook qatt ma jerġa' jaħdem mhuwiex tiswija.
Is-sekwenza hawn taħt iżżomm il-paragun onest, għax tivverifika s-sejħa rifjutata u mhux il-kulur tal-unit. Issejvja l-output tagħha ħdejn il-linja tal-ġurnal li qbadt qabel il-bidla:
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 tun0Għodd ir-rifjuti minflok ma taqra l-aħħar linja, għax hook jista' jonqos, jerġa' jipprova u jirnexxi, u n-numru biss juri jekk il-fruntiera mxietx. Ħalli kumment fid-drop-in li jsemmi d-direttiva li llaxkajt u r-raġuni, għax l-aġġornament li jmiss iqabbel il-konfigurazzjoni tiegħek mal-pakkett default. Unit li jibda biss wara li kull protezzjoni tiġi mitfija mhuwiex imsewwi.