VPN демон нь эрх мэдэлтэй сүлжээний үйлдэл шаарддаг боловч энгийн програмууд ямар ч эрхгүйгээр гарч буй сокетыг нээдэг. Яг энэ завсарт боломжийн алдааны ихэнх нь эхэлдэг: хэн нэгэн зөвшөөрлийн алдаа харж, бүх багцыг өгдөг, үйлчилгээ дараа нь хэн ч тайлбарлаж чадахгүй шалтгаанаар ажилладаг. Доорх тойм нь бүтэлгүйтсэн үйлдлээс эхэлж, түүнийг нэг эрх мэдэлтэй холбож, дараа нь процесс бодитоор ажиллаж буй орчныг шалгана. Хязгааргүй root-оор ажиллах нь зарим байршуулалтад хүчинтэй хариулт боловч энэ нь өгөгдмөл биш, шийдвэр байх ёстой.

Бүтэлгүйтсэн үйлдлээс эхэл

Заавар уншихаас өмнө алдааг унш. Интерфейс өөрчлөх үеийн «үйлдэл зөвшөөрөгдөөгүй», төхөөрөмжийн зангилаа нээхээс татгалзах, бага порт дээр bind бүтэлгүйтэх нь гурван өөр зөвшөөрөл шаардсан гурван өөр асуудал юм. Хэрэв процесс эхэлж, зөвхөн эхний маршрутын өөрчлөлтөд бүтэлгүйтвэл, энэ нь интерфейсийн бүтээлт аль хэдийн амжилттай болсныг ч хэлнэ, энэ нь хариултыг нэлээд нарийсгана.

Үйлчилгээг зогсоосон байхад алдааг дахин гаргаж, дараа нь хэрэгжүүлэлт зөвшөөрвөл ижил хэрэглэгчийн дор урд талд эхлүүл. Харж буй алдаа чинь таамаглах ёстой лог мөрөөс дээр бөгөөд боломжийн асуудал болон SELinux эсвэл AppArmor-ийн татгалзлын ялгааг тодорхой болгоно.

Үйлдэл бүрийг нэг эрх мэдэлтэй холбо

Хүснэгт бол эхлэлийн зураг бөгөөд хэрэгжүүлэлтийн баримт бичгийг орлохгүй:

OperationUsual authorityWatch for
Create or configure tun/tapCAP_NET_ADMIN in the relevant namespaceCreating the device and opening it are separate steps
Add routes, rules, firewall entriesCAP_NET_ADMINSame capability, different namespace than you think
Open /dev/net/tunDevice permissions, not a capabilityGroup membership or a udev rule may be enough
Raw socketsCAP_NET_RAWNeeded by some user-space tunnel implementations
Bind a port below 1024CAP_NET_BIND_SERVICEIrrelevant for most modern tunnel ports

Тэр хүснэгтийн хоёр мөр нь хүмүүсийн андуурдаг мөрүүд юм. /dev/net/tun нээх нь файлын зөвшөөрлийн асуудал; нээсэн зүйлээ тохируулахыг цөмөөс хүсэх нь боломжийн асуудал. CAP_NET_ADMIN өгөх нь үйлчилгээний хэрэглэгч уншиж чадахгүй төхөөрөмжийн зангилааг засдаггүй, зангилааг засах нь танд маршрутын эрх өгөхгүй. Аль нэгийг нь өөрчлөхөөс өмнө хоёуланг нь шалга.

Цөмийн WireGuard болон хэрэглэгчийн орон зайн туннелийн програмууд ч ижил шаардлагагүй. Цөмийн модулийн зам нь одоо байгаа интерфейсийг netlink-ээр тохируулдаг бол хэрэглэгчийн орон зайн хэрэгжүүлэлтэд төхөөрөмж, зарим тээвэрт түүхий сокет ч хэрэгтэй байж болно.

Орчныг унш: үйлчилгээ, контейнер эсвэл shell

Хостын сүлжээний нэрийн орон зай дахь боломж нь санаатайгаар тусгаарласан стек дэх ижил үйлдлээс хамаагүй илүү нөлөөлж болно. Контейнерийн ажиллагааны орчин ихэвчлэн багасгасан хязгаарын багцаар эхэлдэг; хостын сүлжээг хуваалцдаг контейнерт NET_ADMIN нэмэх нь өөрийн сүлжээний нэрийн орон зайтай, хостын mountгүй контейнерт нэмэхээс хамаагүй том зөвшөөрөл юм.

systemd нэгжүүдийн хувьд нэгжийн файл хэлж байгаа мэт харагдахыг биш, бодитоор хэрэгжиж буйг унш: systemctl show -p CapabilityBoundingSet -p AmbientCapabilities үр дүнтэй утгуудыг мэдээлдэг бөгөөд тэдгээрийг мартагдсан drop-in тогтоосон байж болно. Үр дүнтэй утгыг асуу, хэзээ ч зорьсон утгыг биш. Ambient боломжууд чухал, учир нь root бус үйлчилгээ тэдгээргүйгээр exec үед боломжоо алддаг.

Багц эсвэл образын дэмжигдсэн тохиргоог суурь болгон ав. Өөр заавар тэдгээрийг өөр хэрэгсэлд жагсаасан гэж түүхий сокетын зөвшөөрөл эсвэл эрх мэдэлтэй горим нэмэх хэрэггүй; тэр үндэслэл юу ч шилжүүлэхгүй бөгөөд таны төлсөн тусгаарлалтыг үрэгдүүлнэ. Эргэлзвэл юу ч өгөхгүй, шаардлагатай яг үйлдлийн талаар хэрэгжүүлэлтийн тэмдэглэлийг унш.

Эрх мэдэл буусны дараа юу болохыг ажигла

Олон демон эрх мэдэлтэй эхэлж, интерфейсийг тохируулаад, дараа нь эрхгүй хэрэглэгч рүү шилжиж туннелийг хадгалдаг. Тэр мөчөөс процесс маршрут нэмэх, галт ханын дүрмийг дахин бичих эсвэл шинэ эрх мэдэлтэй төхөөрөмж нээх боломжгүй болдог бөгөөд дахин холбогдоход яг үүнийг шаардах хүртэл энэ нь хэвийн. Дараагийн файл уншилт болон hook ажиллуулалт мөн адил шалтгаанаар бүтэлгүйтэж болно.

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

Хэрэглэгчийн солилцооны туршид туннелийг нээлттэй барьдаг хэрэгжүүлэлтүүд үүнийг ихэвчлэн туннель болон түлхүүрийг хадгалах сонголттой хослуулдаг. systemd талд ижил асуулт нь нэгжийн боломжийн багц таны тохируулсан хэрэглэгчийн солилцоог даван туулах эсэх юм.

Олгосон эрх болон түүний шалтгааныг тэмдэглэ

Яг эрхийг, түүний боломж болгодог үйлдлийг, түүний зассан алдааг бич. Байршуулалтын тэмдэглэлд нэг мөр — «нэгжийн сүлжээний нэрийн орон зай дахь CAP_NET_ADMIN, дахин холбогдсоны дараах маршрутын өөрчлөлтөд шаардлагатай» — дараагийн хүн эрхийг дахин өргөжүүлэхээс сэргийлэхэд хангалттай.

Дараа нь шинэчлэл бүрийн дараа үр дүнтэй багцыг дахин унш. Нийлүүлэгчид функц нэмдэг, образ өгөгдмөл утгыг өөрчилдөг, өнгөрсөн жил шаардлагагүй байсан боломж хэнд ч мэдэгдэхгүйгээр тулгуур болж болно.

Холбоотой нийтлэлүүд