NET_ADMIN — Linux мүмкүнчүлүгү, ал процесске тармактык администрация жүргүзүүгө мүмкүндүк берет, ал эми контейнерде ал дал ушундай ишти процесс иштеп жаткан тармактык ат мейкиндигинин ичинде аткарат. Бул сокет ачууга лицензия эмес жана түзмөктүн же маршруттун ордун баспайт. Кызыктуу суроо эч качан мүмкүнчүлүктүн берилгенинде эмес, өзгөртүү кайсы ат мейкиндигине түшөрүндө.

Мүмкүнчүлүк эмнени камтыйт

Өз ат мейкиндигинин ичинде NET_ADMIN кармаган процесс интерфейстерди көтөрүп, түшүрө алат, даректерди дайындайт, маршруттарды кошуп, өчүрө алат жана firewall эрежелерин жаза алат, бул capabilities(7) ушул мүмкүнчүлүктүн астында топтогон операциялар тобу. Ал ошондой эле ядро трафикти кантип кезекке коюп, чыпкалаганын башкаруучу интерфейс деңгээлиндеги параметрлерди жөндөй алат. VPN кардары адатта иштетилгенде алардын бир нечесин талап кылат, андан кийин башка эч нерсе талап кылбайт. Ошондуктан көпчүлүк образдар колдонгоновунан кененирээк укук сурашат.

Ошол ат мейкиндигинин сыртындагы операциялар камтылбайт, ал эми коңшу артыкчылыктар өзүнчө. Чийки пакеттерди окуу жана жазуу NET_RAW-гө таандык, tun түзмөгүн түзүү үчүн мүмкүнчүлүк да, түзмөк түйүнүнө кирүү да керек. Түзмөгү жок процесс тармактык көйгөйгө окшош, бирок андай эмес уруксат катасын алат.

Ат мейкиндиги зыяндын радиусун аныктайт

Өз көпүрө тармагындагы контейнер өз loopbackына, өз интерфейстерине жана өз маршруттоо таблицасына жетет. Ал жерде NET_ADMIN берүү VPN кардарына хосттун маршруттоо чечимдерине тийбестен туннель курууга мүмкүндүк берет, бул контейнер образдарынын көпчүлүгү болжолдогон жайгашуу.

Ошол контейнерди хост тармагына которуңуз, ошондо ошол эле уруксат эми хосттун маршруттарын жана хосттун firewallын оңдойт, анткени өзүнчө ат мейкиндиги калган жок. Бир туннелди башкарышы керек болгон кардар бүтүн машинанын трафигин багыттай алат, ал эми анын бузуу скрибиндеги ката хостто эч ким жазбаган эрежелерди калтырат. Мүмкүнчүлүктүн өзүндө эч нерсе өзгөргөн жок; контекст өзгөрдү. Ошондуктан бир compose файлы эки хостто башкача жүрүм-турум көрсөтөт.

Бириктирилүүчү үч шарт

VPN контейнерлериндеги иштетүү каталары адатта үч өзүнчө нерсенин бирине тиешелүү: мүмкүнчүлүк, туннель түзмөгү жана протоколду ядронун колдоосу. Үчөөнү тең бирге берүү иштейт, ошондой эле кийинки катаны айыптоого мүмкүн болбойт кылат. Эң аз compose үзүндүсү мүмкүнчүлүктү берет жана түзмөк түйүнүн ачык өткөрөт:

services:
  vpn:
    image: example/vpn-client:latest
    cap_add:
      - NET_ADMIN
    devices:
      - /dev/net/tun
    sysctls:
      - net.ipv4.conf.all.src_valid_mark=1

Кайсы sysctl керек экенин образдын өз документтеринен окуңуз, анткени контейнердеги sysctl кошумча артыкчылыкты же хост деңгээлиндеги жөндөөнү талап кылышы мүмкүн. Образ пайдалануучу мейкиндигинин режимин гана колдогон жерде түзмөк таптакыр керек эмес жана мүмкүнчүлүктөрдүн тизмеси ошого жараша кыскарат.

Тар операцияны бериңиз, режимди эмес

Артыкчылыктуу режим бардык мүмкүнчүлүктү өткөрүп, ошол эле учурда түзмөккө кирүүнү кеңейтет, ошондуктан үч шарттын кайсынысы жетишпегенин жашырат. Ал контейнердин ката режимдерин хосттун өзгөрүүлөрүнөн айырмалоого мүмкүн болбойт кылат. Жазуу узунураак болсо да, ачык тизмени артык көрүңүз.

Rootсуз жана пайдалануучу ат мейкиндигиндеги жайгаштыруулар мүмкүнчүлүктүн практикадагы маанисин өзгөртөт, анткени процесс аны картага түшүрүлгөн ат мейкиндигинде гана кармай алат. Мүмкүнчүлүктөрдүн тизмесин rootтуу мисалдан rootсуз аткаруу чөйрөсүнө көчүрүп, ошол эле укукту күтүү түштөн кийинки убакытты жоготуунун күнүмдүк жолу.

Купуялар өзүнчө чечимге таандык. NET_ADMIN кармоо кардардын кайсы өнөктөш идентификаторын сунуштаарын, кайсы ырастоочу маалыматтарды жүктөөрүн же алардын кантип алмаштырыларын эч нерсе айтпайт. Тармактык администрация ишеним бербейт.

Өзгөртүүнү текшериңиз жана уруксат эмне үчүн бар экенин жазыңыз

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

docker inspect --format '{{.HostConfig.CapAdd}} {{.HostConfig.NetworkMode}} {{.HostConfig.Privileged}}' vpn
docker exec vpn sh -c 'grep CapEff /proc/self/status'
docker exec vpn ip -br addr
docker exec vpn ip route

Эгер мүмкүнчүлүк бар болуп, интерфейстер тизмеси дагы бош болсо, кардар бир нерсе жарата электе эле иштебей калган, жана кийинки кароочу жер — контейнер журналдары. Эгер туннель бар болуп, трафик агып жатпаса, контейнердин ичиндеги маршруттоо таблицасы кийинки суроого жооп берет.

Бузуу жолун да текшериңиз, анткени firewall эрежелерин жазган кардар аларды артында калтырышы мүмкүн. Контейнерди токтотуп, хост тармагы колдонулса хосттун эрежелер жыйындысын кайра текшериңиз. Иштетүү учурунда эки секунд гана керектелүүчү уруксатты compose файлында аны түшүндүргөн эскертүүсүз туруктуу талап катары сүрөттөөгө болбойт.

Ар бир мүмкүнчүлүктүн жанына себебин жазыңыз: кайсы операция аны талап кылды жана ансыз эмне иштебейт. Бул эскертүү образ жаңыртууларынан кийин да сакталат, жана дал ушул текшерилген артыкчылыктар тизмеси менен көчүрүп коюу менен өскөн тизменин айырмасы.

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