Sut i ddarganfod pa sandbox systemd a wrthododd eich bachyn OpenVPN
Mae'r bachyn yn gweithio fel root ac yn methu o dan systemd oherwydd bod yr uned yn cadw llai o alluoedd, /dev llai a llwybrau darllen yn unig.
Mae'r bachyn yn gweithio pan fyddwch yn ei redeg â llaw fel root ac yn dychwelyd Operation not permitted y munud y bydd y gwasanaeth yn ei gychwyn. Ni newidiodd y ffeil rhwng y rhediadau hynny; newidiodd yr amgylchedd. Mae systemd yn rhoi byd llai i'r broses: llai o alluoedd, a /devgwahanol, llwybrau system ffeiliau darllen yn unig a nenfwd tasgau. Darllenwch y methiant fel ffin a wrthododd un gweithrediad penodol, nid fel sgript a dorrodd.
Dechreuwch o'r gweithrediad a wrthodwyd
Nid yw llinell log yn dweud bod yr uned wedi methu yn dweud fawr ddim wrthych. Mae'r llinell ddefnyddiol yn enwi'r alwad a wrthodwyd: nod dyfais na ellid ei agor, cyfeiriadur na ellid ysgrifennu iddo, gofod enwau na ellid ei greu. Dewch o hyd i'r alwad honno cyn cyffwrdd ag un gyfarwyddeb, oherwydd mae pob un yn cyfateb i gyfyngiad gwahanol. Yna darllenwch yr uned a redodd mewn gwirionedd, gan gynnwys drop-in, yn lle'r ffeil a gludwyd gan y pecyn.
Mae'r ymholiad isod yn argraffu llwybr y darn, y cyfeiriaduron drop-in a'r priodweddau sy'n bwysig ar gyfer gwrthodiad dyfais neu system ffeiliau. Darllenwch bob un cyn penderfynu pa ffin sy'n berthnasol:
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'Nid oes dim yn y bloc hwnnw yn ysgrifennu. Os yw'r alwad a wrthodwyd ar goll o'r log, codwch leferydd y cleient am un rhediad yn lle dyfalu cyfarwyddebau. Mae proses sy'n rhedeg yn profi bod yr uned wedi cychwyn, nid bod y bachyn wedi rhedeg gyda'r breiniau yr oedd eu hangen.
Mae angen hawliau mowntio ar ofod enwau nad yw dyfais TUN byth yn eu defnyddio
Mae gan ddau weithrediad sy'n edrych yn debyg o fewn un bachyn broffiliau caniatâd gwahanol. Mae agor /dev/net/tun a chreu'r rhyngwyneb angen gweinyddiaeth rwydwaith ynghyd â mynediad i'r nod hwnnw. Mae creu gofod enwau rhwydwaith â enw hefyd angen gwaith mowntio, oherwydd mae'r offeryn gofod enwau yn mowntio /sys golwg ffres ac yn rhwymo cyfeiriadur cyflwr yn ei le. uned cleient i fyny'r afon yn gadael gweinyddiaeth mowntio allan o'i set ffiniau yn fwriadol, felly gwrthodir y cam gofod enwau tra byddai'r twnnel ei hun wedi gweithio.
Dyna pam nad yw rhoi'r nod dyfais yn achub y sgript. Mae caniatâd dyfais yn ateb un cwestiwn, a yw'r broses hon yn cael agor y nod hwn, ac mae cwestiwn gofod enwau yn un arall. Cydweddwch yr alwad sy'n methu â'i gallu cyn ehangu unrhyw beth.
Mae prawf yn eich shell yn etifeddu pob gallu sydd gan root heb gyfyngiad, ac mae'r uned yn etifeddu'r hyn a gadwodd ei set ffiniau. Mae'r ddau rediad yn arbrofion gwahanol hyd yn oed pan fo'r deuaidd yn union yr un fath.
Dyfeisiau, llwybrau gwarchodedig a nenfydau tasgau
Unwaith y gwyddys am y gweithrediad a wrthodwyd, mae tair grŵp o gyfarwyddebau yn esbonio'r rhan fwyaf o fethiannau. Rheolir mynediad i ddyfeisiau gan PrivateDevices, sy'n disodli /dev â set feinimal o bseudo-ddyfeisiau, a chan DevicePolicy gyda DeviceAllow, sy'n penderfynu beth mae'r cgroup yn ei ganiatáu. /dev/net/tun nid yw'n rhan o'r set feinimal honno, felly uned sydd â PrivateDevices=yes ni all ei agor beth bynnag a ddywed y polisi dyfeisiau.
Mae gwarchodaeth system ffeiliau yn ateb ail gwestiwn. ProtectHome=yes yn gwneud /home, /root a /run/user yn anghyraeddadwy, a ProtectSystem=full yn gwneud /usr, /boot a /etc yn ddarllen yn unig. Felly mae bachyn sy'n ysgrifennu wrth ymyl ei ffeil ffurfweddu ei hun yn gweithio yn eich shell ac yn methu o dan yr uned, gyda'r un siâp caniatâd â gallu ar goll. Symudwch y mewnbwn ysgrifennadwy i lwybr y mae'r polisi yn ei ganiatáu, neu ychwanegwch gofnod ReadWritePaths= cul.
Mae terfynau adnoddau yn drydydd grŵp, a'r lleiaf amlwg. TasksMax= yn capio faint o dasgau y caiff yr uned eu creu, ac mae nenfwd disgrifydd ffeil yn ymddwyn yr un fath ar gyfer socedi a dolenni. Mae gosodiad sydd wedi tyfu y tu hwnt i'r nenfwd yn methu â gwall adnoddau yn lle gwall caniatâd, a dyna pam mae'r union neges yn dal i fod o bwys.
Symudwch y cam gofod enwau allan o'r bachyn
Mae paratoad sydd angen braint na chaiff y cleient ei chadw yn perthyn i'w uned ei hun. Mae oneshot sy'n rhedeg cyn y cleient, yn cadw ei ganlyniad ac wedi'i drefnu o flaen y cysylltiad yn rhoi i'r cam gofod enwau yr hyn sydd ei angen heb drosglwyddo'r hawliau hynny i broses y twnnel. Yna mae'r cleient yn cyfeirio at yr uned honno yn lle galw'r sgript o'i fachyn up.
Mae'r templed isod yn siâp cychwynnol, nid rhywbeth i'w gymhwyso heb ei ddarllen. Mae'n cadw'r paratoad lle mae'r fraint yn byw ac yn gadael uned y twnnel heb ei chyffwrdd:
# /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.targetYchwanegwch y trefniant â drop-in yn lle golygu'r uned becyn, fel na all uwchraddiad ollwng eich newid yn dawel. Mae'r cyfeiriadur wedi'i allweddu i enw'r enghraifft, felly mae angen ffeil ei hun ar ail broffil:
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-reloadAiladroddwch yr un alwad ar ôl y newid
Ni chadarnheir atgyweiriad ond pan fydd yr un alwad yn cynhyrchu canlyniad gwahanol. Ailgychwynnwch y ddwy uned, rhedegwch y gweithrediad a fethodd, a chymharwch ei ganlyniad â'r llinell log a gadwoch cyn y newid. Nid yw uned sy'n cychwyn tra nad yw'r bachyn byth yn rhedeg eto yn atgyweiriad.
Mae'r dilyniant isod yn cadw'r gymhariaeth yn onest, oherwydd mae'n gwirio'r alwad a wrthodwyd yn hytrach na lliw'r uned. Cadwch ei allbwn wrth ymyl y llinell log a ddaliwyd gennych cyn y newid:
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 tun0Cyfrwch y gwrthodiadau yn lle darllen y llinell olaf, oherwydd gall bachyn fethu, ceisio eto a llwyddo, a dim ond y cyfrif sy'n dangos a symudodd y ffin. Gadewch sylw yn y drop-in yn enwi'r gyfarwyddeb a laciwyd gennych a'r rheswm, gan fod yr uwchraddiad nesaf yn cymharu eich ffurfwedd â'r rhagosodiad becyn. Nid yw uned sy'n cychwyn dim ond ar ôl analluogi pob gwarchodaeth wedi'i thrwsio.