Kuidas teada saada, milline systemd liivakast sinu OpenVPN konksu tagasi lükkas
Konks töötab rootina ja ebaõnnestub systemd all, sest unit hoiab vähem võimeid, väiksemat /dev-i ja kirjutuskaitstud radu.
Konks töötab, kui käivitad selle käsitsi rootina, ja tagastab Operation not permitted hetkel, mil teenus selle käivitab. Fail nende käivituste vahel ei muutunud; muutus keskkond. systemd annab protsessile väiksema maailma: vähem võimeid, teistsuguse /dev, kirjutuskaitstud failisüsteemi rajad ja ülesannete ülempiiri. Loe ebaõnnestumist piirina, mis lükkas tagasi ühe konkreetse toimingu, mitte skriptina, mis katki läks.
Alusta toimingust, mis tagasi lükati
Logirida, mis ütleb, et unit ebaõnnestus, ei ütle sulle peaaegu midagi. Kasulik rida nimetab kõne, mis tagasi lükati: seadmesõlm, mida ei saanud avada, kataloog, kuhu ei saanud kirjutada, nimeruum, mida ei saanud luua. Leia see kõne enne, kui puudutad ühtki direktiivi, sest igaüks vastab erinevale piirangule. Seejärel loe unit, mis tegelikult töötas, koos drop-in-idega, mitte faili, mille pakett tarnis.
Allolev päring trükib fragmendi tee, drop-in kataloogid ja atribuudid, mis on seadme või failisüsteemi tagasilükkamise puhul olulised. Loe need kõik enne, kui otsustad, milline piir on asjakohane:
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'Selles plokis ei kirjuta miski. Kui tagasilükatud kõne logis puudub, tõsta kliendi detailsust üheks käivituseks, selle asemel et direktiive oletada. Töötav protsess tõestab, et unit käivitus, mitte et konks töötas vajalike õigustega.
Nimeruum vajab mount-õigusi, mida TUN-seade kunagi ei kasuta
Kahel toimingul, mis ühe konksu sees ühesugused välja näevad, on erinevad lubade profiilid. Avamine /dev/net/tun ja liidese loomine vajab võrguhaldust pluss juurdepääsu sellele sõlmele. Nimega võrgu nimeruumi loomine vajab samuti mount-tööd, sest nimeruumi tööriist mountib värske /sys vaate ja seob olekukataloogi oma kohale. upstreami kliendi unit jätab mount-halduse teadlikult oma piirikomplektist välja, seega nimeruumi samm lükatakse tagasi, kuigi tunnel ise oleks töötanud.
Seepärast ei päästa seadmesõlme andmine skripti. Seadmeluba vastab ühele küsimusele, kas see protsess tohib selle sõlme avada, ja nimeruumi küsimus on teine. Sobita ebaõnnestuv kõne selle võimekusega enne, kui midagi laiendad.
Test sinu shellis pärib iga võime, mis piiramatul rootil on, ja unit pärib selle, mille tema piirikomplekt alles hoidis. Need kaks käivitust on erinevad katsed isegi kui binaarfail on identne.
Seadmed, kaitstud rajad ja ülesannete ülempiirid
Kui tagasilükatud toiming on teada, selgitavad kolm direktiivide rühma enamikku ebaõnnestumisi. Seadmetele juurdepääsu reguleerib PrivateDevices, mis asendab /dev minimaalse pseudo-seadmete komplektiga, ja DevicePolicy koos DeviceAllow, mis otsustavad, mida cgroup lubab. /dev/net/tun ei kuulu sellesse minimaalsesse komplekti, seega unit, millel on PrivateDevices=yes ei saa seda avada, ükskõik mida seadmepoliitika ütleb.
Failisüsteemi kaitse vastab teisele küsimusele. ProtectHome=yes muudab /home, /root ja /run/user kättesaamatuks ning ProtectSystem=full muudab /usr, /boot ja /etc kirjutuskaitstuks. Seepärast töötab konks, mis kirjutab oma konfiguratsioonifaili kõrvale, sinu shellis ja ebaõnnestub uniti all, sama loa kujuga nagu puuduv võime. Liiguta kirjutatav sisend rajale, mille poliitika lubab, või lisa kitsas ReadWritePaths= kirje.
Ressursipiirangud on kolmas rühm ja kõige vähem ilmne. TasksMax= piirab, kui palju ülesandeid unit tohib luua, ja failideskriptorite ülempiir käitub samamoodi socketite ja käepidemete puhul. Ülempiiri ületanud juurutus ebaõnnestub ressursivea, mitte loavea tõttu, ja seetõttu loeb täpne sõnum endiselt.
Too nimeruumi samm konksust välja
Ettevalmistus, mis vajab õigust, mida klient ei tohi omada, kuulub oma uniti. Oneshot, mis töötab enne klienti, hoiab oma tulemuse alles ja on järjestatud enne ühendust, annab nimeruumi sammule vajaliku, andmata neid õigusi tunneli protsessile. Seejärel viitab klient sellele unitile, selle asemel et skripti oma up-konksust kutsuda.
Allolev mall on algne kuju, mitte midagi, mida rakendatakse lugemata. See hoiab ettevalmistuse seal, kus õigus elab, ja jätab tunneli uniti puutumata:
# /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.targetLisa järjestus drop-iniga, selle asemel et pakendatud uniti muuta, et uuendus ei saaks sinu muudatust vaikselt maha jätta. Kataloog on seotud eksemplari nimega, seega teine profiil vajab oma faili:
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-reloadKorda sama kutset pärast muudatust
Parandus kinnitub alles siis, kui sama kutse annab teistsuguse tulemuse. Taaskäivita mõlemad unitid, käivita toiming, mis ebaõnnestus, ja võrdle selle tulemust logireaga, mille enne muudatust salvestasid. Unit, mis käivitub, samal ajal kui konks enam kunagi ei tööta, ei ole parandus.
Allolev jada hoiab võrdluse ausana, sest see kontrollib tagasilükatud kõnet, mitte uniti värvi. Salvesta selle väljund enne muudatust püütud logirea kõrvale:
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 tun0Loenda tagasilükkamisi, selle asemel et lugeda viimast rida, sest konks võib ebaõnnestuda, uuesti proovida ja õnnestuda, ning ainult arv näitab, kas piir liikus. Jäta drop-ini kommentaar, mis nimetab direktiivi, mille lõdvendasid, ja põhjuse, kuna järgmine uuendus võrdleb sinu konfiguratsiooni pakendi vaikeväärtusega. Unit, mis käivitub alles siis, kui iga kaitse on välja lülitatud, ei ole parandatud.