AnyConnect على لينكس: أتمتة تسلسل تسجيل الدخول بأمان
يقرأ ملف vpn الثنائي في 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، وهو في الحقيقة اسم المجموعة، ثم سرًا للمجموعة، ثم بيانات اعتمادك الخاصة، والثلاثة تأتي ممن يدير البوابة. بروتوكول Cisco IPsec القديم مختلف عن AnyConnect، لذا لا يمكن لـ vpnc الوصول إلى خدمة مخصّصة لـ AnyConnect فقط؛ وopenconnect --protocol=anyconnect هو العميل المفتوح لهذه المهمة.
ملف .pcf يصف ملف تعريف العميل الأقدم. يمكن إعادة إدخال المضيف واسم المجموعة وكلمة مرور المجموعة الموجودة فيه يدويًا في عميل يتحدث Cisco IPsec، مع أن الملف ليس استيرادًا عالميًا وأي منفذ غير افتراضي أو وضع نفق يختفي عادة في النقل.
ابدأ مما تقدّمه البوابة فعليًا، ثم اختر العميل الذي يتحدث ذلك البروتوكول. نسخ ملف تعريف من موقع آخر هو الطريق الذي ينتهي به الناس إلى تصحيح بيانات اعتماد لم تكن المشكلة أبدًا.