OpenVPN-ийн итгэмжлэлийн файл эсвэл удирдлагын сокет: алийг нь скриптлэх вэ
auth-user-pass бүртгэлийн асуултыг хамарна; удирдлагын сокет бүх дөрвийг хамарна. Илрэлт, скриптийн зардал, үйлчилгээнд тус бүр хэрхэн бүтэлгүйтдэгийг харьцуулна уу.
OpenVPN-ийг ажиллуулаад хэзээ ч холбогддоггүй скрипт нь ихэвчлэн сүлжээний асуудал биш: клиент терминалгүй асуултын өмнө сууж байна. OpenVPN тэр асуултад хүнгүйгээр хариулах яг хоёр дэмжигдсэн аргатай: auth-user-pass-ийн ард байх итгэмжлэлийн файл болон удирдлагын сокет, мөн тэдгээр нь бие биенээ орлохгүй. Файл нэг зааварт өртөж нэг асуултад хариулна; сокет бүх асуултад хариулж loopback порт нээж чадах бүхэнд баталгаажуулалтгүй удирдлагын суваг өгнө. Аль нь таны байршуулалтад тохирох нь аль асуулт үнэхээр саатуулж байгаа, аль нууцыг тайван орхиж чадахаас хамаарна.
Механизм сонгохын өмнө асуултад нэр өг
Дөрвөн асуулт терминал дээр ижил харагдана. Бүртгэлийн хос серверийн PAM эсвэл auth-user-pass-verify тохиргооноос ирдэг бөгөөд түүнд auth-user-pass хариулна. Хувийн түлхүүрийн нууц үг түлхүүрийн файлд хамаарах бөгөөд --askpass-аар уншина эсвэл гараар бичнэ. PKCS#12 багц өөрийн нууц үгийг асууна. Прокси баталгаажуулалт нь бүртгэлийн итгэмжлэл биш, --http-proxy-ийн авдаг auth файлыг ашиглана.
OpenVPN нь systemd, PHP эсвэл Node-ийн хүүхэд болж ажиллах үед терминал байхгүй тул эдгээрийн аль нь ч чимээгүйхэн саатуулна. Процесс тэнд сууж, лог шифрийн мөрний дараа зогсох бөгөөд нэгж эцэстээ хугацаа хэтэрнэ; хүмүүс аль асуулт хүлээж байгааг харахын оронд дахин оролдлогын цикл эсвэл sleep нэмдэг шалтгаан нь тэр чимээгүй байдал юм. Дөрөвийн хариултыг зөвхөн удирдлагын сокет өгч чадна. Итгэмжлэлийн файл эхнийхэд хариулж, өөр юунд ч хариулахгүй.
auth-user-pass: нэг файл, нэг асуулт
Файл эхний мөрөнд хэрэглэгчийн нэрийг, хоёрдугаар мөрөнд нууц үгийг хадгална, өөр юу ч үгүй: хашилтгүй, түлхүүрийн нэргүй, тайлбаргүй. 600 горимыг тохируулж, эзэмшигчийг openvpn ажиллуулдаг бүртгэл болго, энэ нь үйлчилгээний хувьд ихэвчлэн таны нэвтрэлт биш тусдаа хэрэглэгч юм. /root-ийн дор root-д харьяалагдах файл нь таны shell дээр ажилладаг команд болон ачаалах үед бүтэлгүйтдэг нэгжийн хоорондох ялгаа юм.
Хоёр нарийн зүйл зөв файлыг асуулт болгоно. CRLF хадгалдаг редактор нууц үгэнд наалдсан тэрэгний буцалтыг үлдээдэг тул сервер файлд зөв харагдах нууц үгийг татгалзана; нүдээр биш, cat -A эсвэл od -c-ээр шалга. Мөн профайл доторх аргументгүй auth-user-pass нь дизайны хувьд «хэрэглэгчээс асуу» гэсэн утгатай бөгөөд командын мөрний хоёр дахь заавар үүнийг дарж чадахгүй байж магадгүй, учир нь профайл байгаа газраа задлагддаг.
Сонголтын дараалал гурав дахь урхи бөгөөд хувилбараас хамаарна. Зарим OpenVPN 2.4 бүтээц --config-ийн өмнө --auth-user-pass-ийг үл тоомсорлодог тул ижил хоёр сонголт өөр дараалалд холбогддог. Зааврыг профайл дотор эсвэл командын мөрөнд --config-ийн дараа тавьж, өөр юу ч өөрчлөхөөс өмнө профайлаас тохиолдол бүрийг grep хий.
auth-nocache энэ механизмд хамаарах боловч юу ч өгөхгүй. Клиент итгэмжлэлийг санах ойд хэр удаан хадгалахыг хязгаарладаг нь осолын дараа тусалж, файл байхгүй үед огт тусалдаггүй. Серверийн талын сессийн хугацаа дууссаны дараах дахин холболт файлыг дахин уншдаг тул ачаалах үед ажилласан итгэмжлэл өдрийн дунд ч дуусч болно.
Удирдлагын сокет: асуулт бүр, илүү гадаргуу
Клиентийг сонсогчтой эхлүүлж, асуултууд түүн дээр мэдээлэгдэх болно гэдгийг тодорхой зарла, OpenVPN 2.6 гарын авлагад баримтжсан заавруудыг ашиглан:
management 127.0.0.1 3030
management-query-passwords
bash-аас холболтыг нэмэлт файлын дескриптор дээр барьж, байрлалаар биш асуултын нэрээр хариул, учир нь дахин холболт өөр дарааллаар асууж магадгүй:
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
Хил нь тээвэрлэлт. Удирдлагын протокол нь loopback дээрх TCP дээгүүр нээлттэй текст тул сонсогчийг LAN эсвэл туннелийн хаяг дээр нийтэлж болохгүй, эс бөгөөс алсын контроллер түүнд хүрнэ; алсын контроллер гэдэг нь SSH дамжуулалт, илүү өргөн холболт биш. Нийгэмлэгийн демон нэг удаад зөвхөн нэг удирдлагын клиентийг хүлээн авдаг тул GUI эсвэл монитор таны скрипттэй сокетыг хуваалцаж чадахгүй. Хоёр дахь холболт дараалалд орохгүйгээр татгалзагдаж, алдаа нь дүлий болсон скрипт мэт харагдана.
Тэр сокет нь мөн удирдлагын суваг. Удирдлагын нууц үггүйгээр 127.0.0.1:3030-д холбогдож чадах бүхэн төлөвийг уншиж, туннелийг устгаж, эсвэл өөрөө асуултад хариулж чадна. Удирдлагын нууц үг болон итгэмжлэлийн файл нь нэг ангиллын нууц бөгөөд хоёулаа ижил анхаарал хандуулах ёстой.
Аль нь байршуулалтад тохирох вэ
Ганц асуулт нь бүртгэлийн хос, клиент нь тогтвортой эзэмшигчтэй үйлчилгээ болж ажилладаг, мөн та 600 файлыг өөрөө хянадаггүй нөөц хуулбараас гадуур барьж чадвал итгэмжлэлийн файлыг сонго. Түлхүүрийн нууц үг эсвэл PKCS#12 нууц үг оролцож байгаа, бүрхүүл процессыт аль хэдийн хянаж байгаа, эсвэл дахин холболтыг дибаг хийхдээ төлөв, асуултыг хянах шаардлагатай бол удирдлагын сокетыг сонго.
Хоёр нөхцөл шийдвэрийг зөөнө. Бүрхүүл нь /bin/sh, бинарыг шууд дууддаг systemd нэгж, эсвэл хамгийн бага контейнер бол зөвхөн bash-д зориулсан сокетын цавуу боломжгүй бөгөөд файл нь хямд хариулт юм. Нууц байнга эргэлддэг бол аль ч файл түүнд сайн гэр биш: жижиг бүрхүүлээс түлхүүрийн цагиргийг асууж, нэгжийг бүрхүүлийг дуудахыг зөвшөөр, энэ нь эргэлтийг нэг дор барьж, нууц үгийг shell-ийн түүхээс гадуур үлдээнэ.
Процессын орлуулалт хоёрын хооронд зогсож, аль нэгэнд ч хамаарахгүй. Доорх нэг мөр ажилладаг шалтгаан нь bash үүнийг openvpn эхлэхээс өмнө өргөтгөдөг, клиент синтаксийг ойлгодог учраас биш:
openvpn --config client.ovpn --auth-user-pass <(printf "%s
%s
" "$USER" "$PASS")
Энэ нь /bin/sh-ийн дор, shell-ийг тойрсон нэгжид, bash эсвэл /dev/fd-гүй дүрсүүдэд эвдэрдэг. Үүнийг интерактив туршилтад хадгал, хэзээ ч үйлчилгээнд хамаарах гэрээ болгож болохгүй.
Нууцыг хамгаал, дараа нь логээс баталгаажуул
Хоёр механизм OpenVPN процесс уншиж чадах нууцыг үлдээдэг. Нууц үгийг хэзээ ч командын мөрөнд эсвэл нэгжийн файлд бүү тавь, тэнд ps болон systemctl үүнийг орон нутгийн хэрэглэгч бүрт харуулна; файл руу хүрэх замыг өг, доторх утгыг биш. Сертификатууд бүртгэлийн хосыг орлож чадах газарт энэ нь асуултын ангиллыг нуухын оронд устгана.
Зөв ажиллагаа нь асуултын дараалал дуусаж, сесс «Initialization Sequence Completed»-д хүрэхийг харуулна. Клиент ижил асуулт дээр зогсвол тохирол амжилтгүй болсон: сокет илгээсэн яг мөрүүдийг хэвлэж, хашилт болон асуултын нэрийг шалга, sleep нэмэхийн оронд загварыг зас. Амжилт мэдээлдэг ч юу ч зөөдөггүй туннель бол чиглүүлэлт эсвэл push-ийн асуудал, итгэмжлэлийн асуудал биш.
Дараа нь зөвхөн эхний эхлэл биш, дахин холболтыг шалга. Серверийн талын сессийг тасал эсвэл хугацаа дуустал хүлээ; клиент дахин асуух бөгөөд яг тэнд ачаалах үед зөв харагдсан файл дахин холбогдож буй бүртгэлд одоо ч уншигдахуйц эсэхийг харуулна.