Кайсы systemd sandbox OpenVPN илгичиңизди четке какканын кантип табуу керек
Илгич root катары иштейт жана systemd астында ийгиликсиз болот, анткени unit азыраак мүмкүнчүлүктү, кичине /dev жана окууга гана арналган жолдорду сактайт.
Илгичти 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 оңдолгон эмес.