AnyConnect در لینوکس: اسکریپتنویسی ایمن توالی ورود
برنامه دودویی vpn در Cisco AnyConnect پاسخها را از stdin میخواند و همین برای ورود تکرارپذیر کافی است. توالی را بساز، فایل را محافظت کن، بررسی کن و متوقف شو.
کلاینت vpn که همراه Cisco AnyConnect عرضه میشود مانند یک گفتگو رفتار میکند: یک پرسش چاپ میکند، منتظر یک خط میماند و سپس پرسش بعدی را چاپ میکند. اگر این گفتگو را از یک فایل یا یک لوله تغذیه کنید، همان برنامه دودویی بدون نظارت اجرا میشود. تکنیک عبارت است از یک تغییرمسیر بههمراه فهرستی مرتب از پاسخها، و این فهرست است نه تغییرمسیر که تعیین میکند اسکریپت قابل اعتماد است یا نه.
در عمل دو چیز این را خراب میکند. ترتیب پرسشها وقتی دروازه چیز اضافهای میپرسد جابهجا میشود و یک گذرواژه ذخیرهشده یک غلط تایپی را به قفلشدن حساب تبدیل میکند. با توالی مانند دادههای نسخهدار رفتار کنید که پس از هر تغییر دروازه میتوانید آن را مقایسه کنید. بهجای تلاش دوباره با صدای بلند شکست بخورید، زیرا حلقه دقیقاً همان راهی است که یک گذرواژه اشتباه تایپشده به حسابی قفلشده تبدیل میشود.
یک توالی، به همان ترتیبی که کلاینت میپرسد
کلاینت را یک بار تعاملی اجرا کنید و هر پرسش را به ترتیبی که ظاهر میشود بنویسید. آن رونوشت همان فایل پاسخ میشود. وقتی فایل را به برنامه دودویی تغییرمسیر میدهید، خط اول باید خودِ فرمان اتصال باشد، به همین دلیل توالی با نام میزبان آغاز میشود نه با نام کاربری.
connect vpn.example.com
0
<username>
<password>
y
exit
0 خالی نخستین پروفایل اتصال را وقتی دروازه فهرستی ارائه میدهد انتخاب میکند؛ از همان نمایهای که دروازهتان چاپ میکند استفاده کنید. y یک بنر ورود را میپذیرد، پس اگر بنری نیست آن خط را حذف کنید و هرجا دروازهتان پرسش اضافهای میکند یک خط درج کنید. exit پایانی همان چیزی است که به کلاینت اجازه میدهد وقتی آخرین پاسخ مصرف شد تمیز پایان یابد.
/opt/cisco/anyconnect/bin/vpn -s < anyconnect.txt
حالت غیرتعاملی اینجا اختیاری نیست. بدون -s کلاینت میتواند ترمینال را در دست بگیرد و ورودی تغییرمسیریافته را نادیده بگیرد؛ با آن، پاسخها از جریان خوانده میشوند و فرایند بازمیگردد. جایی که برنامه دودویی به امتیازهای بالاتر نیاز دارد، فراخوانی را در sudo -n بپیچید تا اسکریپت بیدرنگ شکست بخورد نه اینکه روی درخواست گذرواژه مسدود شود.
کجا فایل پاسخ نشت میکند
فایلی که گذرواژه دارد یک اعتبارنامه است، پس به آن مجوزهای یک اعتبارنامه را بدهید: حالت 600، در مالکیت حسابی که کار را اجرا میکند، و هرگز داخل یک پوشه مشترک یا همگامسازیشده نباشد. آن را با حالتی که از پیش اعمال شده بسازید نه اینکه بعداً اصلاح کنید، زیرا فایل بین نوشتن و chmod لحظهای برای همه خواندنی است.
install -m 600 /dev/null ~/.config/anyconnect.txt
chmod 700 ~/.config
نیمه دیگر argv است. گذرواژهای که بهعنوان آرگومان داده میشود برای هر کاربر محلی که فرایندها را فهرست میکند دیدنی است و در تاریخچه شل هم مینشیند. در عوض آن را از یک توصیفگر فایل یا متغیر محیطی بخوانید و محتوا را کوتیشنگذاری کنید تا شل نتواند چیزی درون آن را بسط دهد.
printf '%s\n' 'connect vpn.example.com' '0' "$VPN_USER" "$VPN_PASS" 'y' 'exit' \
| sudo -n /opt/cisco/anyconnect/bin/vpn -s
مراقب کوتیشنگذاری باشید. درون کوتیشنهای دوگانه، گذرواژهای که ! دارد میتواند پیش از آنکه کلاینت آن را ببیند توسط یک شل تعاملی بسط داده شود، و خطا بهصورت یک خطای عمومی event-not-found میرسد که شبیه مشکل پروتکل است.
تونل را اثبات کن، سپس ببندش
وضعیت متصل فقط اثبات میکند که کلاینت باور دارد نشستی دارد. میزبانی را انتخاب کنید که فقط از داخل شبکه سازمانی پاسخ میدهد و پیش از هر کار دیگری یک بار آن را بیازمایید. شکست در آنجا یک ایراد مسیریابی یا سیاست است و اجرای دوباره ورود آن را تغییر نمیدهد.
/opt/cisco/anyconnect/bin/vpn state
curl -sS -o /dev/null -w '%{http_code}\n' --max-time 10 https://<internal-host>/
/opt/cisco/anyconnect/bin/vpn disconnect
خروجی وضعیت را پیش و پس از قطع اتصال بررسی کنید. کلاینتی که با نشستی کهنه رها شود میتواند اتصال بعدی را رد کند در حالی که اسکریپت هنوز موفقیت گزارش میدهد، و این حالت شکست اگر فقط کدهای خروج را ببینید نامرئی است. دو خوانش را مقایسه کنید نه اینکه به دومی بهتنهایی اعتماد کنید. نامهای مستعار در پروفایل شل برای استفاده روزانه کافی است، اما هر چیز زمانبندیشده همان بازبینی اعتبارنامه و هویت هر کار دیگر بدون نظارت را میطلبد.
وقتی فهرست ثابت دیگر ایمن نیست
فایل پاسخ ترتیب پرسشهای امروز را کد میکند. بنر تغییرکرده، تغییر اجباری گذرواژه یا چالش عامل دوم آن را به حلقهای تبدیل میکند که میتواند حساب را قفل کند، به همین دلیل اسکریپت باید در نخستین پاسخ غیرمنتظره خارج شود نه اینکه دوباره شروع کند.
آنچه کلاینت چاپ کرد را ثبت کنید، وضعیت غیرصفر برگردانید و تصمیم را به فراخواننده بسپارید. جایی که دروازه عامل دوم میطلبد، پاسخ صادقانه این است که ورود بدون نظارت برای آن پروفایل در دسترس نیست، نه اینکه توالی به یک خط دیگر نیاز دارد.
چرخش به همان بازبینی تعلق دارد. اگر اعتبارنامه ذخیره میشود، تصمیم بگیرید چه کسی میتواند آن را بخواند، کِی تغییر میکند و چه چیزی آن را هنگام بازسازی میزبان حذف میکند. اسکریپتی که یک سال کار میکند چون کسی به گذرواژه دست نزده طراحی نیست، بلکه حادثهای است که منتظر سیاست چرخش است.
پروفایلهایی که AnyConnect نیستند
دو سبک قدیمیتر اعتبارنامه Cisco با این یکی اشتباه گرفته میشوند. پروفایل vpnc یک IPSec ID میخواهد که در واقع نام گروه است، سپس یک رمز گروه و سپس اعتبارنامههای خودتان، و هر سه از کسی میآید که دروازه را اداره میکند. Cisco IPsec قدیمی پروتکلی متفاوت از AnyConnect است، پس vpnc نمیتواند به سرویسی که فقط AnyConnect است برسد؛ openconnect --protocol=anyconnect کلاینت باز برای این کار است.
فایل .pcf پروفایل کلاینت قدیمیتر را توصیف میکند. میزبان، نام گروه و گذرواژه گروه درون آن را میتوان در کلاینتی که Cisco IPsec میفهمد دستی دوباره وارد کرد، هرچند فایل یک ورود همگانی نیست و هر پورت یا حالت تونلسازی غیرپیشفرض معمولاً در انتقال از بین میرود.
از آنچه دروازه واقعاً ارائه میدهد شروع کنید، سپس کلاینتی را انتخاب کنید که آن پروتکل را میفهمد. کپی کردن پروفایل از سایت دیگر همان راهی است که مردم به اشکالزدایی اعتبارنامههایی میرسند که هرگز مشکل نبودهاند.