ไคลเอนต์ 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 ได้ แม้ว่าไฟล์จะไม่ใช่การนำเข้าสากล และพอร์ตหรือโหมดอุโมงค์ที่ไม่ใช่ค่าเริ่มต้นมักหายไปในการถ่ายโอน

เริ่มจากสิ่งที่เกตเวย์เสนอจริง แล้วเลือกไคลเอนต์ที่พูดโปรโตคอลนั้น การคัดลอกโปรไฟล์จากไซต์อื่นคือวิธีที่ผู้คนลงเอยด้วยการดีบักข้อมูลรับรองที่ไม่เคยเป็นปัญหา

บทความที่เกี่ยวข้อง