Gefa OpenVPN CAP_NET_ADMIN án þess að gefa því root
Eining sem byrjar sem notandi án forréttinda þarf samt rétta hæfileikamengið. Athugaðu eininguna, lifandi ferlið og exec-mörkin, í þeirri röð.
Þjónustan startar, loggið kvartar yfir því að geta ekki opnað tun-tækið, og leiðir birtast aldrei. Keyrðu capsh --print í skelinni þinni og cap_net_admin er þar rétt hjá, sem gerir bilunina ómögulega. Það sem er ólíkt milli skelarinnar þinnar og einingarinnar er forréttindaskiptin, ekki vilji kjarnans að veita hæfileikann. Farðu í gegnum fjórar athuganir hér að neðan í röð og stöðvaðu við þá fyrstu sem útskýrir bilið.
Aðskildu vantaðan hæfileika frá földu tæki
Tvær bilanir líta eins út í loglínunni. Ferli án CAP_NET_ADMIN getur ekki búið til eða stillt tunnelviðmótið, og ferli sem sandkassi þess felur /dev/net/tun getur alls ekki opnað það. Að bæta við hæfileikum lagar ekki seinna tilfellið.
Athugaðu hvort tækið sé til inni í nafnrými þjónustunnar áður en þú breytir einhverju. PrivateDevices=yes er algeng harðningarlína sem fjarlægir tun-hnútinn algjörlega, og takmarkandi ProtectSystem getur gert stillingarleiðina skrifvarða á þann hátt sem les eins og heimildarvilla. Bæði framleiða loglínur sem nefna tunnelinn, og þess vegna er hæfileikunum kennt um. Staðfestu fyrst að hnúturinn sé til staðar og opnanlegur, farðu svo áfram.
Vitaðu hvaða hæfileikamengi þú ert að skoða
Linux heldur leyfðu, virku, arfbæru, takmarkandi og umhverfismenginu, og umhverfismengið er það sem lifir exec af notanda sem er ekki root. Skráarhæfileikar á tvíundarskránni geta afhent leyfð réttindi og virk við exec, en aðeins svo lengi sem ekkert í keðjunni hindrar þá yfirfærslu.
Hér villir sudo fólk um. Skipun sem keyrð er í gegnum sudo -u byrjar ný forréttindaskipti og umhverfismengið hverfur, svo sama athugunin sem heppnast sem root mistekst þar. Þjónustustjórinn er enn önnur skipti, og hann veitir ekkert umhverfis nema einingin segi það.
Veittu hæfileikann í einingunni, ekki í umbúðum
Lágmarksþjónustukafli fyrir tunnel sem þarf að búa til tæki og setja upp leiðir lítur svona út.
[Unit]
Description=OpenVPN client, office profile
After=network-online.target
[Service]
Type=notify
User=openvpn
Group=openvpn
NoNewPrivileges=yes
AmbientCapabilities=CAP_NET_ADMIN
CapabilityBoundingSet=CAP_NET_ADMIN
ExecStart=/usr/sbin/openvpn --config /etc/openvpn/office.confAmbientCapabilities setur réttinn í umhverfismengið áður en ferlið byrjar, og CapabilityBoundingSet kemur í veg fyrir að ferlið haldi einhverju utan þess lista. NoNewPrivileges=yes hindrar öflun forréttinda í gegnum setuid eða skráarhæfileika, á meðan hæfileikinn sem einingin veitir skýrt gildir áfram. Bættu CAP_NET_BIND_SERVICE aðeins við þegar þjónustan verður að binda lága gátt, og bættu aldrei við CAP_SYS_ADMIN bara af því að þráður á spjallborði gerði það.
Ef einingin umbúðar tvíundarskrána í sudo, fjarlægðu umbúðirnar. systemd beitir þegar User=, og það aukalag er líklegasta ástæðan fyrir því að umhverfismengið er tómt.
Staðfestu gagnvart lifandi ferlinu, ekki einingarskránni
Lestu hvað stjórinn beitti í raun, lestu svo ferlið sem hann skapaði.
unit=openvpn-client@office
systemctl show -p User -p AmbientCapabilities "$unit"
systemctl show -p MainPID --value "$unit" | xargs -r getpcaps
grep -E '^Cap(Eff|Amb)' /proc/$(systemctl show -p MainPID --value "$unit")/statusEf einingin telur upp hæfileikann og CapEff hefur hann samt ekki, þá hnekkir drop-in stillingunni eða ExecStartPre skref breytir umhverfinu. Leitaðu að heiti einingarinnar í drop-in möppunum áður en þú gerir ráð fyrir að aðalskráin sé ráðandi, því seinna skrá vinnur hljóðlega. Ef bæði einingin og ferlið sýna hæfileikann og tunnelinn mistekst samt, farðu aftur í tækis- og leiðarathuganir í stað þess að víkka takmarkandi mengið. Að víkka það felur raunverulegu orsökina og skilur þjónustuna eftir með meiri forréttindi en áður.
Veldu frekar að sleppa forréttindum eftir ræsingu
OpenVPN getur byrjað með forréttindum og síðan farið niður í reikning án forréttinda í gegnum eigin user og group valkosti, með persist-key og persist-tun sem halda tunnelnum nothæfum eftir á. Þessi skipan þrengir gluggann þar sem ferlið hefur réttindi, og hún hentar oft betur en að ræsa allan dæmoninn án forréttinda með varanlegum hæfileikum.
Hvaða líkan sem þú velur, endurræstu eininguna og endurtaktu athuganirnar eftir endurræsingu, því þjónusta sem virkar úr gagnvirkri root-skel og mistekst við ræsingu er venjulega munur á hæfileika, tæki eða skráarheimildum. Skráðu stillingar einingarinnar við hlið hæfileikauttaks ferlisins svo næsti yfirferðarmaður sjái hvort pakkauppfærsla eða drop-in færði mörkin.