Ілгек оны root ретінде қолмен іске қосқанда жұмыс істейді және қайтарады Operation not permitted қызмет оны іске қосқан сәтте. Файл бұл іске қосулар арасында өзгерген жоқ; орта өзгерді. systemd процеске кішірек әлем береді: азырақ мүмкіндік, басқа /dev, тек оқуға арналған файлдық жүйе жолдары және тапсырмалардың жоғарғы шегі. Сәтсіздікті бір нақты операциядан бас тартқан шекара ретінде оқыңыз, бұзылған скрипт ретінде емес.

Бас тартылған операциядан бастаңыз

unit сәтсіз аяқталды дейтін журнал жолы сізге ештеңе дерлік айтпайды. Пайдалы жол бас тартылған шақыруды атайды: ашылмаған құрылғы түйіні, жазылмаған қалта, құрылмаған аттар кеңістігі. Бір директиваға қол тигізбес бұрын сол шақыруды табыңыз, өйткені әрқайсысы басқа шектеуге сәйкес келеді. Содан кейін пакет жіберген файлды емес, шын мәнінде жұмыс істеген unit-ті оқыңыз, drop-in-дарды қоса.

Төмендегі сұрау фрагмент жолын, drop-in қалталарын және құрылғы не файлдық жүйе бас тартқанда маңызды қасиеттерді шығарады. Қай шекараның қатысы барын шешпес бұрын барлығын оқыңыз:

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'

Бұл блокта ештеңе жазбайды. Егер бас тартылған шақыру журналда жоқ болса, директиваларды болжаудың орнына бір іске қосу үшін клиенттің егжей-тегжейлілігін арттырыңыз. Жұмыс істеп тұрған процесс unit-тің басталғанын дәлелдейді, ілгектің қажетті құқықтармен жұмыс істегенін емес.

Аттар кеңістігіне TUN құрылғысы ешқашан пайдаланбайтын mount құқықтары қажет

Бір ілгектің ішінде бірдей көрінетін екі операцияның рұқсат профилі әртүрлі. /dev/net/tun ашу және интерфейс құру үшін желілік әкімшілік және сол түйінге қатынас қажет. Атаулы желілік аттар кеңістігін құру да mount жұмысын қажет етеді, өйткені аттар кеңістігі құралы жаңа /sys көріністі mount етіп, күй қалтасын өз орнына байлайды. жоғарғы ағымдағы клиент unit-і mount әкімшілігін өз шекаралар жиынының сыртында әдейі қалдырады, сондықтан аттар кеңістігі қадамы бас тартылады, ал туннельдің өзі жұмыс істер еді.

Сондықтан құрылғы түйінін беру скриптті құтқармайды. Құрылғы рұқсаты бір сұраққа жауап береді, бұл процесс бұл түйінді аша ала ма, ал аттар кеңістігінің сұрағы басқа. Бірдеңені кеңейтпес бұрын сәтсіз шақыруды оның мүмкіндігімен сәйкестендіріңіз.

Сіздің shell-дегі тест шектеусіз root-тың барлық мүмкіндігін мұра етеді, ал unit өз шекаралар жиыны сақтағанын мұра етеді. Бұл екі іске қосу әртүрлі эксперимент бинар бірдей болса да.

Құрылғылар, қорғалған жолдар және тапсырма шектері

Бас тартылған операция белгілі болғанда, үш директива тобы сәтсіздіктердің көбін түсіндіреді. Құрылғыларға қатынасты реттейді PrivateDevices, ол /dev -ты ең аз жалған құрылғылар жиынымен алмастырады, және DevicePolicy -пен DeviceAllow, олар cgroup-тың неге рұқсат беретінін шешеді. /dev/net/tun сол ең аз жиынның бөлігі емес, сондықтан PrivateDevices=yes бар unit оны аша алмайды, құрылғы саясаты не десе де.

Файлдық жүйе қорғанысы екінші сұраққа жауап береді. ProtectHome=yes жасайды /home, /root және /run/user қолжетімсіз, ал ProtectSystem=full жасайды /usr, /boot және /etc тек оқуға арналған. Сондықтан өз конфигурация файлының қасына жазатын ілгек сіздің shell-де жұмыс істейді және unit астында сәтсіздікке ұшырайды, жетіспейтін мүмкіндік сияқты рұқсат пішінімен. Жазылатын кірісті саясат рұқсат ететін жолға жылжытыңыз немесе тар ReadWritePaths= жазба қосыңыз.

Ресурс шектеулері үшінші топ және ең анық емесі. TasksMax= unit қанша тапсырма құра алатынын шектейді, ал файл дескрипторларының шегі socket-тер мен тұтқалар үшін дәл солай әрекет етеді. Шектен асқан орналастыру рұқсат қатесінің орнына ресурс қатесімен сәтсіз аяқталады, сондықтан нақты хабарлама әлі де маңызды.

Аттар кеңістігі қадамын ілгектен шығарыңыз

Клиентте болмауы тиіс құқықты қажет ететін дайындық өз unit-іне тиесілі. Клиенттен бұрын жұмыс істейтін, нәтижесін сақтайтын және қосылымға дейін реттелген oneshot аттар кеңістігі қадамына қажетін береді, сол құқықтарды туннель процесіне бермей. Содан кейін клиент скриптті өз up ілгегінен шақырудың орнына сол unit-ке сілтеме жасайды.

Төмендегі үлгі бастапқы пішін, оқылмай қолданылатын нәрсе емес. Ол дайындықты құқық тұратын жерде ұстайды және туннель unit-ін тимей қалдырады:

# /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.target

Реттілікті пакеттелген unit-ті өңдеудің орнына drop-in арқылы қосыңыз, сонда жаңарту сіздің өзгерісіңізді үнсіз тастай алмайды. Қалта дана атауына байланған, сондықтан екінші профильге өз файлы қажет:

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-reload

Өзгерістен кейін сол шақыруды қайталаңыз

Жөндеу сол шақыру басқа нәтиже бергенде ғана расталады. Екі unit-ті де қайта іске қосыңыз, сәтсіз аяқталған операцияны орындаңыз және оның нәтижесін өзгеріске дейін сақталған журнал жолымен салыстырыңыз. Ілгек енді ешқашан жұмыс істемесе де іске қосылатын unit жөндеу емес.

Төмендегі реттілік салыстыруды адал ұстайды, өйткені ол unit-тің түсін емес, бас тартылған шақыруды тексереді. Оның шығысын өзгеріске дейін ұсталған журнал жолының қасына сақтаңыз:

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 tun0

Соңғы жолды оқудың орнына бас тартуларды санаңыз, өйткені ілгек сәтсіз аяқталып, қайталап, сәтті болуы мүмкін, және шекараның жылжығанын тек санақ көрсетеді. drop-in-де әлсіреткен директиваңызды және себебін атайтын түсініктеме қалдырыңыз, өйткені келесі жаңарту сіздің конфигурацияңызды пакеттің әдепкі мәнімен салыстырады. Барлық қорғаныс өшірілгеннен кейін ғана іске қосылатын unit түзетілмеген.

Қатысты мақалалар