Кызмат башталат, журнал tun түзмөгүн ача албай жатканын даттанат, ал эми маршруттар эч качан пайда болбойт. Өз shell'иңизде capsh --print иштетиңиз жана cap_net_admin дал ошол жерде болот, бул катаны мүмкүн эмес кылып көрсөтөт. Сиздин shell менен юниттин ортосундагы айырма — артыкчылыктардын өтүшү, ядронун мүмкүнчүлүк берүүгө даярдыгы эмес. Төмөнкү төрт текшерүүнү тартиби менен өткөрүңүз жана айырманы түшүндүргөн биринчисинде токтоңуз.

Жетишпеген мүмкүнчүлүктү жашырылган түзмөктөн ажыратыңыз

Журнал сабынан эки ката бирдей көрүнөт. CAP_NET_ADMIN жок процесс туннелдин интерфейсин түзө албайт же баптай албайт, ал эми sandbox'ы /dev/net/tun жашырган процесс аны башынан эле ача албайт. Мүмкүнчүлүктөрдү кошуу экинчи учурду оңдобойт.

Бир нерсени оңдоодон мурун түзмөктүн кызматтын ат мейкиндигинде бар-жоктугун текшериңиз. PrivateDevices=yes tun түйүнүн толугу менен алып салган кеңири таралган катуулантуу сабы, ал эми чектөөчү ProtectSystem конфигурация жолун уруксат катасындай окулгандай кылып, окууга гана жарактуу кыла алат. Экөө тең туннелди эске салган журнал саптарын жаратат, ошондуктан күнөө мүмкүнчүлүктөргө тагылат. Адегенде түйүндүн бар экенин жана ачыларын ырастаңыз, анан андан ары өтүңүз.

Кайсы мүмкүнчүлүктөр топтомун карап жатканыңызды билиңиз

Linux уруксат берилген, натыйжалуу, мураска өтүүчү, чектөөчү жана айлана-чөйрө топтомдорун кармайт, ал эми айлана-чөйрө топтому — root эмес колдонуучунун exec аракетинен кийин сактала турганы. Бинардагы файлдык мүмкүнчүлүктөр exec учурунда уруксат берилген жана натыйжалуу укуктарды бере алат, бирок тизмекте эч нерсе бул өткөрүүнү тосмогонго чейин гана.

Ушул жерде sudo адамдарды адаштырат. sudo -u аркылуу иштетилген буйрук жаңы артыкчылык өтүүсүн баштайт жана айлана-чөйрө топтому жоголот, ошондуктан root катары ийгиликтүү болгон ошол эле текшерүү ал жерде ийгиликсиз болот. Кызмат менеджери дагы башка өтүү, жана юнит айтпаса, ал айлана-чөйрөгө эч нерсе бербейт.

Мүмкүнчүлүктү юнитте бериңиз, каптамада эмес

Түзмөк түзүп, маршруттарды орнотушу керек болгон туннел үчүн эң аз кызмат бөлүмү мындай көрүнөт.

[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 процесс башталганга чейин укукту айлана-чөйрө топтомуна салат, ал эми CapabilityBoundingSet процесстин ошол тизмеден тышкары эч нерсе кармашына жол бербейт. NoNewPrivileges=yes setuid же файлдык мүмкүнчүлүктөр аркылуу артыкчылык алууну тосот, ал эми юнит ачык берген мүмкүнчүлүк дагы деле колдонулат. CAP_NET_BIND_SERVICE ны кызмат төмөн портту байлоого тийиш болгондо гана кошуңуз, ал эми CAP_SYS_ADMIN ты форум жиби ошентти деп эч качан кошпоңуз.

Эгер юнит бинарды sudo ичине ороп койсо, каптаманы алып салыңыз. systemd User= ты мурунтан эле колдонот, жана ошол кошумча катмар айлана-чөйрө топтомунун бош болушунун эң ыктымалдуу себеби.

Юнит файлына эмес, тирүү процесске каршы текшериңиз

Менеджер иш жүзүндө эмнени колдонгонун окуңуз, анан ал жараткан процессти окуңуз.

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

Эгер юнит мүмкүнчүлүктү тизмелеп турса, ал эми CapEff да ал күнү бүгүнкүгө чейин жок болсо, кандайдыр drop-in параметрди басып өтөт же ExecStartPre кадамы чөйрөнү өзгөртөт. Негизги файлды ыйгарымдуу деп эсептебестен мурун drop-in каталогдорунан юниттин атын издеңиз, анткени кийин келген файл үнсүз жеңет. Эгер юнит да, процесс да мүмкүнчүлүктү көрсөтсө, ал эми туннель дагы деле иштебесе, чектөөчү топтомду кеңейтүүнүн ордуна түзмөк жана жол текшерүүлөрүнө кайтыңыз. Аны кеңейтүү чыныгы себепти жашырат жана кызматты мурункудан да артыкчылыктуу кылып калтырат.

Башталгандан кийин артыкчылыктардан баш тартканды артык көрүңүз

OpenVPN артыкчылык менен башталып, анан өзүнүн user жана group опциялары аркылуу артыкчылыгы жок эсепке түшө алат, ал эми persist-key менен persist-tun туннелди кийин да колдонууга жарактуу кармайт. Мындай тартип процесстин укуктары бар терезесин куушурат жана бүт демонду туруктуу мүмкүнчүлүктөр менен артыкчылыксыз баштоодон көбүнчө ыңгайлуураак.

Кайсы моделди тандасаңыз да, юнитти кайра баштаңыз жана кайра жүктөөдөн кийин текшерүүлөрдү кайталаңыз, анткени интерактивдүү root shell'ден иштеп, жүктөөдө ийгиликсиз болгон кызмат адатта мүмкүнчүлүк, түзмөк же файл уруксатынын айырмасы. Юнит жөндөөлөрүн процесстин мүмкүнчүлүк чыгарылышынын жанына жазып коюңуз, ошондо кийинки кароочу пакет жаңыртуусу же drop-in чек араны жылдырганын көрө алат.

Тектеш макалалар