Звычайная праграма Linux карыстаецца VPN, не зачэпліваючы TUN
Дэман валодае прыладай TUN і тунэлем; праграмы проста адкрываюць сокеты. Трымайце правы на наладку і доступ да сеткі як асобныя межы.
Браўзер, які выкарыстоўвае ўжо створаны VPN у Linux, не адкрывае /dev/net/tun. Ён адкрывае сокет, а ядро вырашае, праз які інтэрфейс пойдуць пакеты гэтага сокета. Працэс, які стварыў тунэль, займаецца іншай справай, чым працэс, чый трафік ён пераносіць. Падзел гэтых дзвюх роляў адказвае на большасць пытанняў пра правы яшчэ да таго, як іх зададуць.
Прасачыце адзін пакет ад сокета да тунэля
Звычайная праграма выклікае connect або send, і ядро шукае маршрут да пункту прызначэння. Калі выбраны маршрут паказвае на інтэрфейс тунэля, пакет ставіцца ў чаргу прылады, якую чытае дэман VPN. Дэман шыфруе яго і адпраўляе праз фізічны інтэрфейс. Кожная стрэлка ў гэтым апісанні — месца, дзе можна адказаць на пытанне пра правы.
Нішто ў гэтым шляху не патрабуе, каб праграма ведала пра прыладу. Дэман трымае дэскрыптар файла і выконвае аперацыі з інтэрфейсам, а праграма бачыць толькі звычайны сеткавы API.
Намалюйце дзве паловы адзін раз, і пытанні пра правы стане лягчэй размясціць. Верхняя палова — гэта свет праграм, а ніжняя належыць дэману.
Вызначце, каму патрэбна прылада, а каму не
Стварэнне інтэрфейса TUN або далучэнне да яго патрабуе доступу да прылады і дадаткова права на яго наладку, таму падтрыманая служба VPN пачынаецца з правамі адміністравання сеткі або выкарыстоўвае прывілеяваны памочнік. Гэта патрабаванне датычыцца дэмана. Яно нічога не кажа пра браўзер, кліент базы даных або інструмент перадачы файлаў. Службе, якой патрэбна гэта права, яно патрэбна для ўласнага кроку наладкі, а не для яе кліентаў.
Калі маршрут і палітыка ўжо на месцы, звычайны працэс выкарыстоўвае атрыманы шлях праз свае звычайныя выклікі сокетаў. Яму не патрэбны вузел прылады, і яму не патрэбны root.
Змяненне правоў прылады — не спосаб даць праграме доступ да пункту прызначэння. Яно толькі пераносіць мяжу прылады ў іншае месца.
Праверце прастору імёнаў, у якой праграма фактычна працуе
Кантэйнер або другая сеткавая прастора імёнаў дае сваім працэсам асобны набор інтэрфейсаў і табліцу маршрутаў. Тунэль на хасце не з’яўляецца там аўтаматычна, і ніякая колькасць змен правоў прылады гэтага не зменіць. Праграма проста пойдзе праз тое, што дае гэтая прастора. Таму вобраз кантэйнера не можа выпадкова атрымаць тунэль хасцёра ў спадчыну.
Праверце з дапамогай ip netns list і ip -n NAME route або агледзеўшы спасылку прасторы імёнаў для працэсу. Адказ звычайна бачны ў адной камандзе.
Двум карыстальнікам на адным хасце таксама можна даць розныя шляхі праз палітыку. Гэта сеткавае рашэнне, а не доказ валодання прыладай.
Аддзяліце правы ад сеткавай палітыкі
Некаторым інструментам патрэбна больш за сокет. Захоп пакетаў патрабуе сырога сокета, а змяненне маршрутаў — права адміністравання. Гэта асобныя аперацыі з асобнымі дазволамі, і дазвол аднаго не варта чытаць як агульнае патрабаванне для выкарыстання VPN.
Праграма, якая рэалізуе ўласны тунэль, — гэта трэці выпадак. Яна сапраўды адкрывае TUN, бо бярэ на сябе ролю дэмана, таму ёй патрэбны прывілеі дэмана.
Назавіце аперацыю раней, чым назваць прывілей. Звычайна іх лягчэй раздзяліць, чым здаецца.
Праверце падзел двума ўліковымі запісамі
Падключыце тунэль як службу, потым запусціце праграму як звычайны карыстальнік і пераканайцеся, што яна дасягае прыватнага рэсурсу. Праверце ip route get для пункту прызначэння з абалонкі гэтага карыстальніка, каб убачыць, які інтэрфейс абраны. Калі маршрут правільны, а злучэнне ўсё роўна не ўдаецца, праблема ў палітыцы, а не ў прывілеі.
Атрыманы дызайн — мінімальныя правы з яснай мяжой: адзін кампанент валодае наладкай і рэсурсамі тунэля, працоўныя нагрузкі захоўваюць свае звычайныя ўліковыя запісы, а сеткавая палітыка вырашае, што можа прайсці. Запуск усяго ад імя root згортвае гэтыя ролі, нічога не тлумачачы.