Masuk ke Cisco Secure Client dari shell Linux, tanpa GUI
Here-document bukan protokol masuk. Catat urutan prompt yang sebenarnya, gunakan expect saat urutannya berubah, dan jauhkan kata sandi dari argv dan riwayat.
Keyakinannya adalah here-document empat baris merupakan login non-interaktif yang lengkap, dan keyakinan itu bertahan sampai gateway menawarkan dua grup, mencetak banner, atau meminta token setelah kata sandi. Saat itulah skrip yang sama mengetikkan kata sandi ke menu yang mengharapkan angka. Klien baris perintah di Linux bisa diskrip, tetapi hanya jika Anda memberinya apa yang benar-benar ditunggunya, bukan apa yang diasumsikan tutorial.
Here-document tetap itu mitos
Klien Linux Cisco memasang program kecil di /opt/cisco/anyconnect/bin/vpn, dan Secure Client 5 masih menyertakannya. Saat layanan vpnagentd berjalan, flag -s membaca jawaban dari input standar dalam urutan yang diminta klien. Urutan itu tidak tetap antar server.
Menu grup menambah satu baris. Banner login menambah satu lagi. Permintaan token setelah kata sandi merusak skrip empat baris sepenuhnya, karena baris kelima tidak pernah dimaksudkan sebagai token. Kegagalannya senyap: klien menerima string yang salah, upaya koneksi berakhir, dan skrip tidak melaporkan apa pun yang berguna.
Jalankan klien secara manual sekali terhadap gateway dan versi yang sama, lalu catat prompt dalam urutan kemunculannya. Transkrip itulah spesifikasi yang harus dipenuhi skrip Anda.
Apa yang ditunggu klien
Pada kasus umum satu grup, urutannya adalah nama pengguna, kata sandi, dan kadang konfirmasi banner. Baris pertama here-document baru menjadi indeks menu ketika server benar-benar menampilkan menu, dan itulah sebabnya skrip yang sama berhasil di satu tempat dan gagal di tempat berikutnya.
/opt/cisco/anyconnect/bin/vpn -s connect vpn.example.net <<EOF
0
alice
$VPN_PASSWORD
y
EOF
Bacalah sebagai empat jawaban untuk empat kemungkinan pertanyaan, bukan sebagai protokol tetap. Nol adalah pilihan menu, bukan kata sandi, dan y di akhir menerima banner yang tidak pernah dikirim banyak gateway.
Gunakan expect saat urutannya tidak bisa diprediksi
Ketika urutan prompt berubah, berhenti menghitung baris dan tunggu prompt-nya. Skrip expect menjalankan perintah connect, menunggu prompt nama pengguna, mengirim, menunggu prompt kata sandi, mengirim, lalu menunggu status terhubung. Setiap penantian punya batas waktunya sendiri.
Perlakukan timeout sebagai kegagalan dan keluar. Skrip yang terus mengirim input setelah prompt tak terduga akan dengan senang mengetikkan kata sandi ke shell, menu, atau apa pun yang sedang membaca. Begitulah skrip login berubah menjadi insiden.
expect juga memberi Anda transkrip yang bisa dicatat tanpa rahasianya, dan itu lebih bernilai daripada kode keluar ketika gateway mengubah prompt-nya setelah pembaruan.
Rahasia harus tinggal di suatu tempat
Setiap versi masalah ini berbagi satu kelemahan: kata sandi harus ada dalam bentuk yang bisa dibaca klien. Mengirimkannya sebagai argumen mengeksposnya di tabel proses. Menggemakannya melalui pipa sering menaruhnya di riwayat shell. Keduanya bisa dibaca pengguna lokal lain pada host lompat bersama.
install -m 600 /dev/null ~/.vpn-secret
umask 077; VPN_PASSWORD=$(cat ~/.vpn-secret) /opt/cisco/anyconnect/bin/vpn -s connect vpn.example.net
Berkas dengan mode 600 milik akun adalah batas minimum, dan itu masih rahasia teks polos di disk. secret-tool lookup membaca dari keyring Linux, dan di macOS tugas yang sama dilakukan security find-generic-password -w. Di tempat organisasi mendukung autentikasi sertifikat atau SAML, utamakan itu, karena kata sandi tersimpan plus MFA tetap tidak bisa menyelesaikan login tanpa manusia.
Pastikan terowongannya, lalu tangani penutupannya
Jangan percaya pada tidak adanya teks galat. Tanyakan statusnya ke klien dan periksa antarmuka secara terpisah:
/opt/cisco/anyconnect/bin/vpn state
ip -brief address
Statusnya seharusnya Connected, dan antarmuka terowongan seharusnya punya alamat. Lalu minta satu sumber daya yang seharusnya dijangkau terowongan, karena status terhubung tanpa rute adalah hasil nyata dan mudah terlewat.
Putuskan dengan vpn disconnect, dan biarkan skrip yang memulai terowongan menangani penutupannya. Pekerjaan gagal yang membiarkan sesi terbuka memakai satu kursi lisensi dan tampak seperti masalah autentikasi bagi orang berikutnya yang mencoba.
Urutan kerja: pastikan vpnagentd, tangkap urutan prompt yang sebenarnya, pilih here-document atau expect, jauhkan rahasia dari argv dan riwayat, verifikasi status dan satu sumber daya, lalu putuskan di skrip yang sama.