Bí o ṣe lè mọ irú systemd sandbox tó kọ OpenVPN hook rẹ
Hook náà ṣiṣẹ́ nígbà tí o bá fi ọwọ́ ṣe é gẹ́gẹ́ bí root, ó sì kùnà lábẹ́ systemd nítorí pé unit náà ní agbára díẹ̀, /dev kékeré àti àwọn ọ̀nà kíkà nìkan.
Hook náà ṣiṣẹ́ nígbà tí o bá fi ọwọ́ ṣe é gẹ́gẹ́ bí root, ó sì dá Operation not permitted padà ní àkókò tí iṣẹ́ náà bá bẹ̀rẹ̀. Fáìlì náà kò yí padà láàárín àwọn ìṣe wọ̀nyẹn; àyíká náà yí padà. systemd fi ayé kékeré fún ìlànà náà: agbára díẹ̀, /dev mìíràn, àwọn ọ̀nà fáìlìsístẹ́ẹ̀mù kíkà nìkan àti ààlà iṣẹ́ kan. Ka ìkùnà náà gẹ́gẹ́ bí ààlà tó kọ ìṣe kan pàtó, kì í ṣe bí script tó já.
Bẹ̀rẹ̀ pẹ̀lú ìṣe tí wọ́n kọ̀
Ìlà log tó sọ pé unit náà kùnà kò sọ nǹkan kan fún ọ. Ìlà tó wúlò máa ń dárúkọ ìpè tí a kọ̀: node ẹ̀rọ tí kò lè ṣí, àpò tí kò lè kọ̀wé sínú rẹ̀, namespace tí kò lè dá. Wá ìpè yẹn kí o tó fi ọwọ́ kan ìtọ́nisọ́nà kan ṣoṣo, nítorí pé ọ̀kọ̀ọ̀kan wọn bá ìdíwọ́ mìíràn mu. Lẹ́yìn náà ka unit tó gbé ṣiṣẹ́ gan-an, pẹ̀lú àwọn drop-in, dípò fáìlì tí àpò náà fi ránṣẹ́.
Ìbéèrè tó wà nísàlẹ̀ yìí máa ń tẹ̀jáde ọ̀nà fragment, àwọn àpò drop-in àti àwọn ànímọ́ tó ṣe pàtàkì fún kíkọ̀ ẹ̀rọ tàbí fáìlìsístẹ́ẹ̀mù. Ka gbogbo wọn kí o tó pinnu ààlà tó yẹ kí o káwọ́:
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'Kò sí nǹkan tó ń kọ̀wé nínú búlọ́kì yẹn. Tí ìpè tí a kọ̀ kò bá sí nínú journal, gbé ìsọ̀tẹ̀ client ga fún ìṣe kan dípò kí o máa fojú díbọ̀kùn àwọn ìtọ́nisọ́nà. Ìlànà tó ń ṣiṣẹ́ fi hàn pé unit náà bẹ̀rẹ̀, kì í ṣe pé hook náà gbé ṣiṣẹ́ pẹ̀lú àwọn ẹ̀tọ́ tó nílò.
Namespace nílò àwọn ẹ̀tọ́ mount tí ẹ̀rọ TUN kò lò rí
Ìṣe méjì tó jo ara wọn nínú hook kan ní àwọn profáìlì ẹ̀tọ́ tó yàtọ̀. Ṣíṣí /dev/net/tun àti dídá interface náà nílò ìṣàkóso nẹ́tíwọ́kì pẹ̀lú àǹfààní sí node yẹn. Dídá namespace nẹ́tíwọ́kì tó ní orúkọ tún nílò iṣẹ́ mount, nítorí pé irinṣẹ́ namespace máa ń mount /sys ìwò tuntun, ó sì so àpò ipò mọ́ ibi rẹ̀. I-unit client oríṣa òkè mọ̀ọ́mọ̀ fi ìṣàkóso mount síta kúrò nínú àkójọ ààlà rẹ̀, nítorí náà a kọ̀ ìgbésẹ̀ namespace nígbà tí tunnel fúnra rẹ̀ ì bá ti ṣiṣẹ́.
Ìdí niyẹn tí fífúnni ní node ẹ̀rọ kò gba script náà là. Ìyọ̀ǹda ẹ̀rọ máa ń dá ìbéèrè kan lóhùn, bóyá ìlànà yìí lè ṣí node yìí, ìbéèrè namespace sì yàtọ̀. So ìpè tó kùnà mọ́ agbára rẹ̀ kí o tó gbè é pọ̀.
Ìdánwò nínú shell rẹ máa ń jogún gbogbo agbára tí root tí kò ní ààlà ní, unit náà sì jogún ohun tí àkójọ ààlà rẹ̀ pa mọ́. Àwọn ìṣe méjì náà jẹ́ àwọn ìdánwò tó yàtọ̀ bí binary náà tilẹ̀ jẹ́ kan náà.
Àwọn ẹ̀rọ, àwọn ọ̀nà tí a dáàbò bo àti àwọn ààlà iṣẹ́
Nígbà tí a bá mọ ìṣe tí a kọ̀, àwọn ẹgbẹ́ ìtọ́nisọ́nà mẹ́ta máa ń ṣàlàyé ọ̀pọ̀lọpọ̀ àwọn ìkùnà. Àǹfààní ẹ̀rọ ni PrivateDevices ń ṣàkóso, èyí tó máa ń rọ́pò /dev pẹ̀lú àkójọ ẹ̀rọ àròyé tó kéré jù, àti pẹ̀lú DevicePolicy pẹ̀lú DeviceAllow, wọ́n máa ń pinnu ohun tí cgroup gbà. /dev/net/tun kò sí nínú àkójọ kékeré yẹn, nítorí náà unit tó ní PrivateDevices=yes kò lè ṣí i bí ìlànà ẹ̀rọ bá ti sọ.
Ìdáàbò fáìlìsístẹ́ẹ̀mù máa ń dá ìbéèrè kejì lóhùn. ProtectHome=yes máa ń sọ /home, /root àti /run/user di àìlèwọlé, àti ProtectSystem=full máa ń sọ /usr, /boot àti /etc di kíkà nìkan. Nítorí náà hook tó ń kọ̀wé lẹ́gbẹ̀ẹ́ fáìlì ìṣètò rẹ̀ máa ń ṣiṣẹ́ nínú shell rẹ, ó sì kùnà lábẹ́ unit, pẹ̀lú irú ẹ̀tọ́ kan náà bí agbára tó ṣáìn. Gbé ohun tí a lè kọ̀wé sínú lọ sí ọ̀nà tí ìlànà gbà, tàbí fi ReadWritePaths= tó kéré kun.
Àwọn ààlà ohun àmúṣọrò ni ẹgbẹ́ kẹta, àti èyí tó hàn jùlọ. TasksMax= máa ń pààlà iye iṣẹ́ tí unit náà lè dá, ààlà descriptor fáìlì sì máa ń hùwà bákan náà fún socket àti handle. Ìfilélẹ̀ tó dàgbà ju ààlà lọ máa ń kùnà pẹ̀lú àṣìṣe ohun àmúṣọrò dípò àṣìṣe ẹ̀tọ́, ìdí niyẹn tí ìfiránṣẹ́ pàtó fi ṣe pàtàkì.
Gbé ìgbésẹ̀ namespace kúrò nínú hook
Ìmúrasílẹ̀ tó nílò ẹ̀tọ́ tí client kò gbọdọ̀ ní jẹ́ ti unit rẹ̀ fúnra rẹ̀. oneshot tó ń ṣiṣẹ́ kí client tó bẹ̀rẹ̀, tó pa àbájáde rẹ̀ mọ́, tí a sì tò ó ṣáájú ìsopọ̀ máa ń fún ìgbésẹ̀ namespace ní ohun tó nílò láìfi àwọn ẹ̀tọ́ yẹn fún ìlànà tunnel. Lẹ́yìn náà client máa ń tọ́ka sí unit yẹn dípò kí ó pe script náà láti inú up hook rẹ̀.
Àwòkọ́ tó wà nísàlẹ̀ yìí jẹ́ ìrísí ìbẹ̀rẹ̀, kì í ṣe nǹkan tí a máa fi ṣe láìkà á. Ó máa ń pa ìmúrasílẹ̀ mọ́ ibi tí ẹ̀tọ́ wà, ó sì fi unit tunnel sílẹ̀ láìfi ọwọ́ kàn.
# /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.targetFi ìtòlẹ́sẹẹsẹ kun pẹ̀lú drop-in dípò kí o ṣàtúnṣe unit tí a ti ṣe àdìpọ̀, kí ìgbésẹ̀ àtúnṣe lè má ṣe fi ìyípadà rẹ sílẹ̀ ní ìdákẹ́jẹ́ẹ́. Àpò náà so mọ́ orúkọ instance, nítorí náà profáìlì kejì nílò fáìlì rẹ̀ fúnra rẹ̀:
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-reloadTún ìpè kan náà ṣe lẹ́yìn ìyípadà
Àtúnṣe máa ń ní ìjẹ́rìí nígbà tí ìpè kan náà bá mú àbájáde tó yàtọ̀ jáde. Tún àwọn unit méjèèjì bẹ̀rẹ̀, ṣe ìṣe tó kùnà, kí o sì fi àbájáde rẹ̀ wé ìlà journal tí o fipamọ́ kí ìyípadà tó ṣẹlẹ̀. Unit tó bẹ̀rẹ̀ nígbà tí hook kò tún ṣiṣẹ́ mọ́ kì í ṣe àtúnṣe.
Ìtẹ̀lé tó wà nísàlẹ̀ yìí máa ń jẹ́ kí ìfiwéra náà jẹ́ olóòtítọ́, nítorí pé ó máa ń yẹ ìpè tí a kọ̀ wò dípò àwọ̀ unit. Fi àbájáde rẹ̀ pamọ́ lẹ́gbẹ̀ẹ́ ìlà journal tí o gbà kí ìyípadà tó ṣẹlẹ̀:
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 tun0Ka iye àwọn ìkọ̀ dípò kíkà ìlà tó gbẹ̀yìn, nítorí pé hook lè kùnà, tún gbìyànjú kí ó sì ṣàṣeyọrí, ìye nìkan ni ó fi hàn bóyá ààlà náà ti yí. Fi àkíyèsí sílẹ̀ nínú drop-in tó dárúkọ ìtọ́nisọ́nà tí o tú àti ìdí rẹ̀, níwọ̀n bí ìgbésẹ̀ àtúnṣe tó kàn yóò fi ìṣètò rẹ wé àìpé àdìpọ̀. Unit tí ó kàn bẹ̀rẹ̀ lẹ́yìn tí a ti dè gbogbo ìdáàbò kò tíì ní àtúnṣe.