AnyConnect di Linux: menulis skrip urutan login dengan aman
Biner vpn Cisco AnyConnect membaca jawaban dari stdin, dan itu cukup untuk login yang bisa diulang. Susun urutannya, lindungi berkasnya, verifikasi, lalu berhenti.
Klien vpn yang disertakan dengan Cisco AnyConnect berperilaku seperti percakapan: ia mencetak prompt, menunggu satu baris, lalu mencetak prompt berikutnya. Umpankan percakapan itu dari berkas atau pipa dan biner yang sama berjalan tanpa pengawasan. Tekniknya adalah satu pengalihan ditambah daftar jawaban yang berurutan, dan daftarlah, bukan pengalihan, yang menentukan apakah skrip dapat diandalkan.
Dua hal merusaknya dalam praktik. Urutan prompt bergeser ketika gateway menanyakan sesuatu tambahan, dan kata sandi yang disimpan mengubah satu salah ketik menjadi penguncian akun. Perlakukan urutan itu sebagai data berversi yang bisa Anda bandingkan setelah setiap perubahan gateway. Gagallah dengan berisik alih-alih mencoba ulang, karena perulangan justru cara kata sandi yang salah ketik menjadi akun terkunci.
Satu urutan, dalam urutan yang klien tanyakan
Jalankan klien secara interaktif sekali dan catat setiap prompt dalam urutan kemunculannya. Transkrip itu menjadi berkas jawaban. Saat Anda mengalihkan berkas ke biner, baris pertama harus berupa perintah koneksi itu sendiri, itulah sebabnya urutannya dimulai dengan nama host, bukan nama pengguna.
connect vpn.example.com
0
<username>
<password>
y
exit
0 telanjang memilih profil koneksi pertama saat gateway menawarkan daftar; gunakan indeks yang dicetak gateway Anda. y menerima banner login, jadi hapus baris itu jika tidak ada banner dan sisipkan satu di mana gateway Anda menanyakan pertanyaan tambahan. exit di akhir adalah yang memungkinkan klien berhenti dengan bersih saat jawaban terakhir sudah terpakai.
/opt/cisco/anyconnect/bin/vpn -s < anyconnect.txt
Mode non-interaktif di sini bukan pilihan. Tanpa -s klien dapat mengambil alih terminal dan mengabaikan masukan yang dialihkan; dengannya jawaban dibaca dari aliran dan proses kembali. Di tempat biner membutuhkan hak istimewa yang lebih tinggi, bungkus pemanggilannya dalam sudo -n agar skrip langsung gagal alih-alih tersangkut pada permintaan kata sandi.
Di mana berkas jawaban bocor
Berkas yang berisi kata sandi adalah kredensial, jadi beri ia izin seperti kredensial: mode 600, dimiliki akun yang menjalankan tugas, dan tidak pernah di dalam direktori bersama atau tersinkronisasi. Buatlah dengan mode yang sudah diterapkan alih-alih memperbaikinya setelahnya, karena berkas sebentar dapat dibaca semua orang antara penulisan dan chmod.
install -m 600 /dev/null ~/.config/anyconnect.txt
chmod 700 ~/.config
Separuh lainnya adalah argv. Kata sandi yang diteruskan sebagai argumen terlihat oleh setiap pengguna lokal yang mendaftar proses, dan juga masuk ke riwayat shell. Bacalah dari deskriptor berkas atau variabel lingkungan sebagai gantinya, dan kutip muatannya agar shell tidak dapat memperluas apa pun di dalamnya.
printf '%s\n' 'connect vpn.example.com' '0' "$VPN_USER" "$VPN_PASS" 'y' 'exit' \
| sudo -n /opt/cisco/anyconnect/bin/vpn -s
Perhatikan pengutipan. Di dalam tanda kutip ganda, kata sandi yang berisi ! dapat diperluas oleh shell interaktif sebelum klien melihatnya, dan kegagalan datang sebagai galat event-not-found umum yang tampak seperti masalah protokol.
Buktikan terowongannya, lalu tutup
Status terhubung hanya membuktikan bahwa klien percaya memiliki sesi. Pilih host yang hanya menjawab dari dalam jaringan perusahaan dan ujilah sekali sebelum melakukan hal lain. Kegagalan di sana adalah kesalahan perutean atau kebijakan, dan menjalankan login lagi tidak akan mengubahnya.
/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
Periksa keluaran status sebelum dan sesudah pemutusan. Klien yang tertinggal dengan sesi basi dapat menolak koneksi berikutnya sementara skrip masih melaporkan sukses, dan mode kegagalan itu tidak terlihat jika Anda hanya melihat kode keluar. Bandingkan kedua pembacaan alih-alih mempercayai yang kedua saja. Alias dalam profil shell cukup untuk penggunaan harian, sedangkan apa pun yang terjadwal layak mendapat tinjauan kredensial dan identitas yang sama seperti pekerjaan tanpa pengawasan lainnya.
Ketika daftar tetap tidak lagi aman
Berkas jawaban mengodekan urutan prompt hari ini. Banner yang berubah, perubahan kata sandi yang dipaksakan, atau tantangan faktor kedua mengubahnya menjadi perulangan yang dapat mengunci akun, itulah sebabnya skrip harus keluar pada jawaban tak terduga pertama alih-alih memulai ulang.
Tangkap apa yang dicetak klien, kembalikan status bukan nol, dan biarkan pemanggil memutuskan. Di mana gateway menuntut faktor kedua, jawaban jujurnya adalah login tanpa pengawasan tidak tersedia untuk profil itu, bukan bahwa urutannya perlu satu baris lagi.
Rotasi termasuk dalam tinjauan yang sama. Jika kredensial disimpan, putuskan siapa yang boleh membacanya, kapan berubah, dan apa yang menghapusnya saat host dibangun ulang. Skrip yang bekerja selama setahun karena tidak ada yang menyentuh kata sandinya bukanlah desain, melainkan kecelakaan yang menunggu kebijakan rotasi.
Profil yang bukan AnyConnect
Dua gaya kredensial Cisco yang lebih lama sering tertukar dengan yang ini. Profil vpnc meminta IPSec ID, yang sebenarnya nama grup, lalu rahasia grup, lalu kredensial Anda sendiri, dan ketiganya berasal dari siapa pun yang menjalankan gateway. Cisco IPsec lama adalah protokol berbeda dari AnyConnect, jadi vpnc tidak dapat menjangkau layanan khusus AnyConnect; openconnect --protocol=anyconnect adalah klien terbuka untuk pekerjaan itu.
Berkas .pcf menjelaskan profil klien yang lebih lama. Host, nama grup, dan kata sandi grup di dalamnya dapat dimasukkan ulang secara manual di klien yang berbicara Cisco IPsec, meskipun berkas itu bukan impor universal dan porta atau mode terowongan non-standar biasanya hilang dalam pemindahan.
Mulailah dari apa yang sebenarnya ditawarkan gateway, lalu pilih klien yang berbicara protokol itu. Menyalin profil dari situs lain adalah cara orang berakhir men-debug kredensial yang tidak pernah menjadi masalah.