Jebakan dua tailnet: key usang yang mengedit jaringan yang salah
Pelanggan menjangkau Mac sewaan mereka lewat Tailscale. Kami menyimpan aturan akses SSH di tailnet policy, dan mengelola aturan itu dari kode. Saat sewa dimulai, alamat pelanggan ditambahkan. Saat sewa berakhir, alamatnya dihapus. Sistemnya kecil dan membosankan. Lalu ia memberi tahu kami bahwa semua pelanggan kehilangan akses, padahal ia berbohong.
Yang dilaporkan tool
Sebuah cek rutin mengumumkan bahwa aturan SSH pelanggan kosong. Menurutnya, tiga pelanggan yang membayar tidak bisa terhubung lagi. Itu pesan darurat besar bagi bisnis yang produknya adalah akses ke sebuah mesin.
Aturannya tidak kosong. Kami membaca tailnet yang berbeda.
Dua jaringan, satu alias
Akun itu punya dua tailnet. Yang satu berisi armada: Mac sewaan, hub, dan setiap share pelanggan. Yang lain jaringan pribadi lama sisa setup, berisi satu mesin mati dan satu laptop.
API Tailscale memungkinkan Anda menyebut nama tailnet, atau memberi -, yang berarti "tailnet mana pun yang dimiliki key pemanggil". Kode kami memberi -. Itu tidak masalah sampai ada dua key. Key-nya berupa string yang tidak bisa dibedakan, jadi - diam-diam mengikuti key mana pun yang ada di environment. Sebuah key usang menyelinap ke satu file config.
Bagian berbahayanya adalah penulisan
Pembacaan yang berbohong membuang satu sore. Penulisan yang berbohong menyebabkan insiden. Tool yang sama punya mode perbaikan yang menyesuaikan aturan akses dengan pelanggan saat ini. Saat dijalankan ke tailnet yang salah, ia dengan patuh menulis tiga alamat email pelanggan sungguhan ke policy jaringan lama, dan di sana itu tidak berpengaruh apa pun.
Tidak ada pelanggan yang benar-benar terdampak, karena tailnet armada tidak tersentuh dan tetap benar sepanjang waktu. Tapi selama beberapa menit, otomasi kami mengedit kontrol akses di jaringan yang salah dan melaporkan sukses.
Perbaikannya: sebut nama jaringannya
Kami berhenti memberi -. Kini kode menyebut tailnet armada secara eksplisit. Key yang tidak bisa melihatnya akan gagal dengan jelas, bukan melenceng ke apa pun yang bisa ia lihat.
Kini setiap run mencetak tailnet yang diajaknya bicara. Jika baris itu bukan armada, hasil di bawahnya tidak berarti apa-apa. Dan Anda tahu itu sebelum bertindak berdasarkan hasilnya.
Pelajaran umumnya
Default praktis yang berarti "apa pun yang ditunjuk kredensial ini" menjadi jebakan begitu Anda punya lebih dari satu kredensial. Ia mengubah key yang salah dari error menjadi pengalihan diam-diam. Apa pun yang menulis harus menyebut targetnya. Dengan begitu kredensial yang salah akan gagal, bukan berhasil di tempat yang tidak Anda maksud.
Polanya sama dengan kegagalan diam-diam lain yang pernah kami tulis di cek yang tidak bisa gagal. Tool-nya yakin. Tool-nya salah. Dan tidak ada output-nya yang akan memberi tahu Anda, sampai ia menyebut nama jaringan yang sedang ia edit.
Pertanyaan
- Bagaimana API key Tailscale menentukan tailnet mana yang ia edit?
- Key itu milik satu tailnet, dan nama tailnet '-' di API berarti 'tailnet mana pun yang dimiliki key ini'. Dua key untuk dua tailnet terlihat sama, jadi '-' diam-diam mengikuti key-nya.
- Bagaimana cara aman membedakan dua tailnet?
- Jangan pernah dengan mata. Bandingkan perangkat apa saja yang bisa ditampilkan tiap key. Key yang benar melihat armada Anda. Key yang salah melihat apa pun lainnya yang dimiliki akun itu.
- Apakah tool boleh memakai alias tailnet '-'?
- Tidak untuk apa pun yang menulis. Sebutkan nama tailnet secara eksplisit, supaya key untuk jaringan yang salah gagal dengan 404, bukan diam-diam mengedit ACL yang salah.
Hitung angka Anda sendiri dengan kalkulator atau sewa runner.