LXD прадстаўляе сімвальную прыладу хасцёлкі кантэйнеру шляхам дадання вузла прылады, а не шляхам навучання гасця ствараць яе. Калі ў кантэйнеры няма /dev/net/tun, прылада можа быць на хасцёлцы, а госць усё роўна не зможа яе адкрыць. Запіс unix-char — гэта палова гэтага шляху на баку менеджара, і ён наўмысна вузейшы за прывілеяваны кантэйнер. Таму вузел хасцёлкі і вузел кантэйнера вартыя асобных праверак.

Механізм дастаткова кароткі, каб трымаць яго ў полі зроку: LXD развязвае шлях на хасцёлцы, стварае адпаведны вузел унутры асяроддзя і дадае прыладу ў cgroup прылад кантэйнера. Пасля гэтага працэс гасця мае патрэбу ў сваіх уласных дазволе і магчымасці, каб выкарыстоўваць вузел для чаго-небудзь.

Што запіс unix-char фактычна змяняе

Прылада unix-char кажа LXD прадставіць адну сімвальную прыладу хасцёлкі па абраным шляху ўнутры кантэйнера. Запіс мае тры часткі, якія маюць значэнне: метка прылады, якую выкарыстоўвае менеджар, шлях source на хасцёлцы і path, які бачыць госць. Толькі апошнія дзве апісваюць саму прыладу. Памылка ў любым з іх стварае вузел у месцы, якое кліент ніколі не адкрывае.

На хасцёлцы прылада звычайна /dev/net/tun. Унутры кантэйнера вы можаце пакінуць той жа шлях або выбраць іншы, але шлях павінен адпавядаць таму, што чакае VPN-кліент. Захаванне /dev/net/tun пазбягае другой праблемы з канфігурацыяй, бо большасць кліентаў адкрываюць гэты шлях без пытанняў.

Менеджар прымяняе запіс пры запуску асяроддзя або пры гарачым падключэнні прылады. Ён не капіюе драйвер у госця і не стварае інтэрфейс тунеля. Ён робіць вузел бачным і дазваляе доступ праз групу кіравання прыладамі кантэйнера.

Абвясціце прыладу на асяроддзі, а не ўнутры госця

Дадайце запіс з кантэксту адміністравання LXD, назваўшы асяроддзе і метку, якую вы пазнаеце пазней. Для кантэйнера з назвай vpnbox каманда такая:

lxc config device add vpnbox tun unix-char source=/dev/net/tun path=/dev/net/tun
lxc config device show vpnbox

Метка tun лакальная для канфігурацыі асяроддзя. Яна не з'яўляецца назвай інтэрфейса і не павінна ні з чым супадаць у госці. Калі профіль ужо прадастаўляе тую ж прыладу, другі запіс стварае канфлікт, а не рэзерв, таму спачатку агледзьце эфектыўную канфігурацыю.

Рэдагаванне файлаў унутры кантэйнера — гэта няправільны ўзровень. mknod у стартавым скрыпце можа здавацца працоўным у прывілеяваным кантэйнеры, а потым знікнуць пры перастварэнні або не спрацаваць у менш прывілеяваным. Менеджар валодае наборам прылад асяроддзя; хай ён валодае і вузлом.

Узгадніце ўласнасць і рэжым з працэсам госця

Запіс unix-char можа задаць uid, gid і mode для вузла ўнутры кантэйнера. Выкарыстоўвайце іх, каб адпавядаць уліковаму запісу, які запускае VPN-кліент, замест таго каб адкрываць прыладу ўсім карыстальнікам або пераключаць кантэйнер у прывілеяваны рэжым.

Бачнасць — не тое ж самае, што дазвол. Вузел, якім валодае root з рэжымам 600, бачны службе, што працуе ад непрывілеяванага карыстальніка, і ўсё роўна не можа быць ёй адкрыты. Спачатку праверце ўліковы запіс госця, затым прызначце ўласнасць гэтаму запісу і трымайце рэжым не шырэйшым, чым патрэбна кліенту.

Працэсу таксама патрэбна магчымасць наладзіць інтэрфейс тунеля, звычайна CAP_NET_ADMIN у сеткавым прасторы імёнаў кантэйнера. Перадача прылады не дае гэтай магчымасці, а прадастаўленне магчымасці не дае прылады; гэта незалежныя патрабаванні.

Ведайце, чаго запіс не дае

Бачны вузел — гэта не працоўны VPN. Пакет кліента ўсё яшчэ трэба ўсталяваць, профіль усё яшчэ павінен быць сапраўдным, і служба ўсё яшчэ павінна запусціцца. Аўтэнтыфікацыя, маршруты і DNS застаюцца справай кліента, і збой там не з'яўляецца доказам таго, што запіс прылады няправільны.

systemd можа дадаць яшчэ адно абмежаванне. Юніт з DeviceAllow або ўзмоцненай палітыкай прылад можа адмовіць у доступе да вузла, які прадаставіў менеджар кантэйнераў. Праверце палітыку прылад юніта, калі вузел існуе, але служба паведамляе пра памылку дазволу, і змяніце гэтую палітыку, а не пашырайце кантэйнер.

Гарачае падключэнне неабавязковае і яўнае. Запіс з required=false патрабуе шляху крыніцы і можа з'яўляцца або знікаць пры змене прылады хасцёлкі. Такі жыццёвы цыкл падыходзіць для абсталявання, якое прыходзіць і сыходзіць; для прылады TUN, патрэбнай VPN пры загрузцы, неабавязковы запіс можа пакінуць службу стартаваць раней, чым з'явіцца яе перадумова.

Праверце бачнасць, адкрыццё і інтэрфейс менавіта ў такім парадку

Спачатку пацвердзіце вузел унутры патрэбнага кантэйнера. Шлях, старэйшы і малодшы нумары і ўласнасць павінны адпавядаць прыладзе хасцёлкі і запісу, які вы дадалі. Адсутнасць вузла азначае, што менеджар не прымяніў запіс або прымяніў яго да іншага асяроддзя.

lxc exec vpnbox -- ls -l /dev/net/tun
lxc exec vpnbox -- sh -c 'test -c /dev/net/tun && echo char-device-ok'

Затым пацвердзіце, што ўліковы запіс службы можа яго адкрыць. Кароткі тэст ад гэтага запісу аддзяляе праблему ўласнасці ад праблемы службы. Нарэшце запусціце кліента і пацвердзіце, што з'явіўся інтэрфейс тунеля; толькі гэты трэці крок даказвае ўвесь шлях, бо першыя два могуць прайсці, пакуль профіль кліента або магчымасць яшчэ няправільныя.

Запішыце асяроддзе, метку прылады, крыніцу на хасцёлцы, шлях у госці і ўліковы запіс-уладальнік, калі змяненне зацверджана. Гэтыя пяць значэнняў — тое, што павінны захаваць пазнейшае перастварэнне, міграцыя або змена профілю, і іх значна лягчэй параўнаць, чым памылку дазволу без кантэксту.

Падобныя артыкулы