OpenVPN-ni ishga tushirib, hech qachon ulanmaydigan skript odatda tarmoq muammosi emas: mijoz terminali yo'q so'rov oldida o'tiribdi. OpenVPN o'sha so'rovga odamsiz javob berishning aynan ikkita qo'llab-quvvatlanadigan yo'lini taklif qiladi: auth-user-pass orqasidagi hisob ma'lumotlari fayli va boshqaruv soketi, va ular bir-birini almashtirmaydi. Fayl bitta direktivaga tushadi va bitta so'rovga javob beradi; soket har bir so'rovga javob beradi va loopback portini ocha oladigan har qanday narsaga autentifikatsiyasiz boshqaruv kanalini beradi. Qaysi biri joylashtirishingizga mos kelishi qaysi so'rov haqiqatan to'sib turganiga va qaysi sirni xotirjam qoldirishga imkoningiz borligiga bog'liq.

Mexanizmni tanlashdan oldin so'rovni nomlang

To'rt so'rov terminalda bir xil ko'rinadi. Hisob juftligi serverning PAM yoki auth-user-pass-verify sozlamasidan keladi va unga auth-user-pass javob beradi. Shaxsiy kalitning maxfiy so'zi kalit fayliga tegishli va --askpass orqali o'qiladi yoki qo'lda teriladi. PKCS#12 to'plami o'z parolini so'raydi. Proksi autentifikatsiyasi hisob ma'lumotlarini emas, --http-proxy oladigan auth faylini ishlatadi.

OpenVPN systemd, PHP yoki Node-ning bolasi sifatida ishlaganda terminal yo'q, shuning uchun ularning har biri jim to'sadi. Jarayon o'sha yerda o'tiradi, jurnal shifr satridan keyin to'xtaydi va birlik oxir-oqibat vaqt chegarasidan o'tadi; bu sukunat odamlarning qaysi so'rov kutayotganini ko'rish o'rniga qayta urinish sikli yoki sleep qo'shishiga sabab. To'rttasiga ham faqat boshqaruv soketi javob bera oladi. Hisob ma'lumotlari fayli birinchisiga javob beradi, boshqa hech narsaga emas.

auth-user-pass: bitta fayl, bitta so'rov

Fayl foydalanuvchi nomini birinchi satrda, parolni ikkinchi satrda saqlaydi, boshqa hech narsa yo'q: qo'shtirnoq yo'q, kalit nomlari yo'q, izoh yo'q. 600 rejimini o'rnating va egasini openvpn ishga tushiradigan hisob qiling, bu xizmat uchun ko'pincha sizning kirishingiz emas, alohida foydalanuvchi. /root ostidagi root-ga tegishli fayl sizning shellda ishlaydigan buyruq bilan yuklashda muvaffaqiyatsiz bo'ladigan birlik o'rtasidagi farq.

Ikki tafsilot to'g'ri faylni so'rovga aylantiradi. CRLF saqlaydigan muharrir parolga yopishgan karetka qaytarishni qoldiradi, shuning uchun server faylda to'g'ri ko'rinadigan parolni rad etadi; ko'z bilan emas, cat -A yoki od -c bilan tekshiring. Va profil ichidagi argumentsiz auth-user-pass dizayn bo'yicha «foydalanuvchidan so'ra» degani, uni buyruq satridagi ikkinchi direktiva bekor qila olmasligi mumkin, chunki profil o'zi turgan joyda tahlil qilinadi.

Variantlar tartibi uchinchi tuzoq va versiyaga bog'liq. Ba'zi OpenVPN 2.4 qurilmalari --config oldidan kelganda --auth-user-pass-ni e'tiborsiz qoldiradi, shuning uchun o'sha ikki variant boshqa tartibda ulanadi. Direktivani profil ichiga yoki buyruq satrida --config-dan keyin qo'ying va boshqa narsani o'zgartirishdan oldin profilda har bir uchrashni grep qiling.

auth-nocache bu mexanizmga tegishli, lekin hech narsa bermaydi. Mijoz hisob ma'lumotlarini xotirada qancha vaqt saqlashini cheklaydi, bu halokatdan keyin yordam beradi va fayl yo'q bo'lganda umuman yordam bermaydi. Server tomonidagi sessiya muddati tugagach qayta ulanish faylni yana o'qiydi, shuning uchun yuklashda ishlagan hisob ma'lumotlari kun o'rtasida ham tugashi mumkin.

Boshqaruv soketi: har bir so'rov, ko'proq yuza

Mijozni tinglovchi bilan ishga tushiring va so'rovlar uning ustida xabar qilinishini aniq e'lon qiling, OpenVPN 2.6 qo'llanmasida hujjatlashtirilgan direktivalardan foydalanib:

management 127.0.0.1 3030
management-query-passwords

bash-dan ulanishni zaxira fayl deskriptorida ushlang va o'rin o'rniga so'rov nomi bo'yicha javob bering, chunki qayta ulanish boshqa tartibda so'rashi mumkin:

exec 3<>/dev/tcp/127.0.0.1/3030
while read -r -u 3 line; do
  case "$line" in
    *"Need 'Auth' username/password"*)
      echo 'username "Auth" alice' >&3
      echo 'password "Auth" secret' >&3 ;;
    *"Need 'Private Key' password"*)
      echo 'password "Private Key" secret' >&3 ;;
  esac
done

Chegara — transport. Boshqaruv protokoli loopback-da TCP ustidagi ochiq matn, shuning uchun uzoq kontroller yetib borishi uchun tinglovchini LAN yoki tunnel manzilida e'lon qilish mumkin emas; uzoq kontroller SSH yo'naltirishini bildiradi, kengroq bog'lashni emas. Hamjamiyat daemoni ham bir vaqtda faqat bitta boshqaruv mijozini qabul qiladi, shuning uchun GUI yoki monitor skriptingiz bilan soketni baham ko'ra olmaydi. Ikkinchi ulanish navbatga qo'yilmasdan rad etiladi va nosozlik kar bo'lib qolgan skriptga o'xshaydi.

Bu soket boshqaruv kanali ham. Boshqaruv parolisiz 127.0.0.1:3030-ga ulanishi mumkin bo'lgan har qanday narsa holatni o'qiy oladi, tunnelni o'ldira oladi yoki o'zi so'rovga javob bera oladi. Boshqaruv paroli va hisob ma'lumotlari fayli bir sinfdagi sirlar va ikkalasi ham bir xil ehtiyotga loyiq.

Joylashtirishga qaysi biri mos keladi

Hisob ma'lumotlari faylini yagona so'rov hisob juftligi bo'lganda, mijoz barqaror egasi bilan xizmat sifatida ishlaganda va siz nazorat qilmaydigan zaxira nusxalardan tashqarida 600 faylni ushlab tura olganingizda tanlang. Boshqaruv soketini kalit maxfiy so'zi yoki PKCS#12 paroli ishtirok etganda, o'ram jarayonni allaqachon kuzatib turganda yoki qayta ulanishni tuzatishda holat va so'rovlarni ko'rish kerak bo'lganda tanlang.

Ikki shart qarorni suradi. Agar o'ram /bin/sh bo'lsa, binar faylni to'g'ridan-to'g'ri chaqiradigan systemd birligi bo'lsa yoki minimal konteyner bo'lsa, faqat bash uchun soket yelimi mavjud emas va fayl arzonroq javob. Agar sir tez-tez aylansa, hech bir fayl unga yaxshi uy emas: kichik o'ramdan kalit halqasini so'rang va birlik o'ramni chaqirishiga ruxsat bering, bu aylanishni bir joyda saqlaydi va parolni shell tarixidan tashqarida.

Jarayon almashtirish ikkalasi orasida turadi va hech biriga tegishli emas. Quyidagi bir satr ishlaydi, chunki bash uni openvpn boshlanishidan oldin kengaytiradi, mijoz sintaksisni tushungani uchun emas:

openvpn --config client.ovpn --auth-user-pass <(printf "%s
%s
" "$USER" "$PASS")

U /bin/sh ostida, shellni chetlab o'tadigan birlikda va bash yoki /dev/fd bo'lmagan tasvirlarda buziladi. Uni interaktiv sinash uchun saqlang, hech qachon xizmat bog'liq bo'lgan shartnoma sifatida emas.

Sirni himoya qiling, so'ng jurnaldan tekshiring

Ikki mexanizm ham OpenVPN jarayoni o'qiy oladigan sir qoldiradi. Parolni hech qachon buyruq satriga yoki birlik fayliga qo'ymang, u yerda ps va systemctl uni har bir mahalliy foydalanuvchiga ko'rsatadi; faylga yo'lni bering, ichidagi qiymatni emas. Sertifikatlar hisob juftligini almashtira oladigan joyda bu so'rov toifasini yashirish o'rniga olib tashlaydi.

To'g'ri ishga tushirish so'rovlar ketma-ketligi tugashini va sessiya «Initialization Sequence Completed»-ga yetishini ko'rsatadi. Agar mijoz o'sha so'rovda to'xtasa, moslik muvaffaqiyatsiz bo'ldi: soket yuborgan aniq satrlarni chop eting, qo'shtirnoqlar va so'rov nomini tekshiring va sleep qo'shish o'rniga naqshni tuzating. Muvaffaqiyat haqida xabar berib, hech narsa tashimaydigan tunnel marshrutlash yoki push muammosi, hisob ma'lumotlari muammosi emas.

So'ng faqat birinchi ishga tushirishni emas, qayta ulanishni ham sinab ko'ring. Server tomonidagi sessiyani uzing yoki uning vaqti tugashini kuting; mijoz yana so'raydi va aynan o'sha yerda yuklashda to'g'ri ko'ringan fayl qayta ulanadigan hisob uchun hali o'qilishini ko'rsatadi.

O'xshash maqolalar