Mae'r gwasanaeth yn cychwyn, mae'r log yn cwyno na all agor y ddyfais tun, ac ni fydd llwybrau byth yn ymddangos. Rhedwch capsh --print o'ch shell ac mae cap_net_admin yno'n syth, sy'n gwneud y methiant yn edrych yn amhosibl. Yr hyn sy'n wahanol rhwng eich shell a'r uned yw'r trawsnewidiad braint, nid parodrwydd y cnewyllyn i roi'r galluedd. Ewch drwy'r pedwar gwiriad isod yn eu trefn a stopiwch ar yr un cyntaf sy'n esbonio'r bwlch.

Gwahanu galluedd coll oddi wrth ddyfais gudd

Mae dau fethiant yn edrych yr un fath o'r llinell log. Ni all proses heb CAP_NET_ADMIN greu na ffurfweddu rhyngwyneb y twnnel, ac ni all proses y mae ei sandbox yn cuddio /dev/net/tun ei agor o gwbl. Ni fydd ychwanegu galluoedd yn trwsio'r ail un.

Gwiriwch a yw'r ddyfais yn bodoli y tu mewn i namespace y gwasanaeth cyn i chi olygu unrhyw beth. Mae PrivateDevices=yes yn llinell galedu gyffredin sy'n tynnu'r nod tun yn gyfan gwbl, a gall ProtectSystem cyfyngol wneud y llwybr ffurfweddu'n ddarllen-yn-unig mewn ffordd sy'n darllen fel gwall caniatâd. Mae'r ddau yn cynhyrchu llinellau log sy'n sôn am y twnnel, a dyna pam y beïir galluoedd. Cadarnhewch fod y nod yn bresennol ac yn agoradwy yn gyntaf, yna ewch ymlaen.

Gwybod pa set galluoedd rydych yn edrych arni

Mae Linux yn cadw setiau a ganiateir, effeithiol, etifeddadwy, terfynol ac amgylchynol, a'r set amgylchynol yw'r un sy'n goroesi exec gan ddefnyddiwr nad yw'n root. Gall galluoedd ffeil ar y deuaidd drosglwyddo hawliau a ganiateir ac effeithiol ar exec, ond dim ond tra nad oes unrhyw beth yn y gadwyn yn rhwystro'r trosglwyddiad hwnnw.

Dyma lle mae sudo yn camarwain pobl. Mae gorchymyn a redir drwy sudo -u yn dechrau trawsnewidiad braint newydd ac mae'r set amgylchynol yn diflannu, felly mae'r un gwiriad sy'n llwyddo fel root yn methu yno. Mae'r rheolwr gwasanaeth yn drawsnewidiad arall eto, ac nid yw'n rhoi dim amgylchynol oni bai bod yr uned yn dweud hynny.

Rhowch y galluedd yn yr uned, nid mewn lapio

Mae adran gwasanaeth ffiniol ar gyfer twnnel sydd angen creu dyfais a gosod llwybrau yn edrych fel hyn.

[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.conf

AmbientCapabilities yn rhoi'r hawl yn y set amgylchynol cyn i'r broses gychwyn, ac mae CapabilityBoundingSet yn atal y broses rhag dal unrhyw beth y tu allan i'r rhestr honno. Mae NoNewPrivileges=yes yn rhwystro ennill braint drwy setuid neu alluoedd ffeil, tra bod y galluedd y mae'r uned yn ei roi yn benodol yn dal i fod yn berthnasol. Ychwanegwch CAP_NET_BIND_SERVICE dim ond pan fo'r gwasanaeth yn gorfod rhwymo porth isel, ac na ychwanegwch CAP_SYS_ADMIN byth dim ond oherwydd bod edefyn fforwm wedi gwneud hynny.

Os yw'r uned yn lapio'r deuaidd mewn sudo, tynnwch y lapio. Mae systemd eisoes yn cymhwyso User=, a'r haen ychwanegol honno yw'r rheswm mwyaf tebygol fod y set amgylchynol yn wag.

Gwiriwch yn erbyn y broses fyw, nid y ffeil uned

Darllenwch beth a gymhwysodd y rheolwr mewn gwirionedd, yna darllenwch y broses a gafodd ei genhedlu.

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")/status

Os yw'r uned yn rhestru'r galluedd ac mae CapEff yn dal hebddi, mae drop-in yn gorbwyso'r gosodiad neu mae cam ExecStartPre yn newid yr amgylchedd. Chwiliwch y cyfeiriaduron drop-in am enw'r uned cyn tybio mai'r prif ffeil sydd awdurdodol, oherwydd mae ffeil hwyrach yn ennill yn dawel. Os yw'r uned a'r broses ill dau yn dangos y galluedd ac mae'r twnnel yn dal yn methu, ewch yn ôl at y gwiriadau dyfais a llwybr yn hytrach na lledu'r set derfynol. Mae ei lledu yn cuddio'r gwir achos ac yn gadael y gwasanaeth yn fwy breintiedig nag o'r blaen.

Braf yw gollwng braint ar ôl cychwyn

OpenVPN yn gallu cychwyn gyda braint ac yna disgyn i gyfrif heb fraint drwy ei opsiynau user a group ei hun, gyda persist-key a persist-tun yn cadw'r twnnel yn ddefnyddiol wedyn. Mae'r drefn honno'n culhau'r ffenestr lle mae'r broses yn dal hawliau, ac yn aml mae'n gweddu'n well na chychwyn y daemon cyfan heb fraint gyda galluoedd parhaol.

Pa fodel bynnag a ddewiswch, ailgychwynnwch yr uned ac ailadroddwch y gwiriadau ar ôl ailgychwyn, oherwydd gwasanaeth sy'n gweithio o shell root ryngweithiol ac yn methu wrth gychwyn fel arfer yw gwahaniaeth galluedd, dyfais neu ganiatâd ffeil. Cofnodwch osodiadau'r uned wrth ymyl allbwn galluoedd y broses fel y gall y nesaf adolygydd weld a symudodd diweddariad pecyn neu drop-in y ffin.

Erthyglau cysylltiedig