Penjanaan kunci tidak memerlukan fail sementara, dan melangkaunya membetulkan lebih sedikit daripada yang disyaratkan oleh kebanyakan panduan. Apa yang dibuangnya ialah kitaran hayat fail dan perlumbaan pembersihan di sekelilingnya. Apa yang dibiarkan tidak disentuh ialah setiap peluang membocorkan rahsia itu kemudian. Masalah ketepatan dalam skrip ini biasanya duduk di tempat lain, kerana diagnostik dan bahan kunci bergerak pada strim yang berbeza.

Fail itu tidak pernah menjadi pendedahan yang anda sangkakan

Fail sementara ialah risiko konkrit apabila ia boleh dibaca oleh semua, apabila ia terselamat daripada ranap, atau apabila langkah pembersihan dilangkau selepas pengecualian. Semua itu nyata, dan ia wajar dibetulkan. Ia juga setempat, kelihatan dan mudah diuji. Namakan setiap satu dalam skrip anda sendiri sebelum membuat kesimpulan bahawa perubahan itu hanya kosmetik.

Risiko yang lebih senyap duduk di hilir: kunci yang dicetak semasa nyahpepijat, pengecualian yang menyerialkan seluruh objek hasil, pengendali ranap yang menulis dump teras, pengagregat log yang menerima laluan fail dan kemudian kandungannya. Mengelakkan fail sementara tidak melakukan apa-apa untuk mana-mana daripadanya, dan mempercayai sebaliknya ialah cara penulisan semula berniat baik membiarkan rahsia lebih terdedah daripada sebelumnya. Anggap perubahan itu sebagai satu penambahbaikan dalam urutan, bukan sebagai penyelesaiannya.

Apa yang ditulis klien apabila tiada nama fail diberikan

Versi klien semasa menghantar kunci yang dijana ke output standard apabila arahan kunci diberikan tanpa laluan output. Tingkah laku berdokumen itulah yang menjadikan pendekatan dalam memori berdaya maju, dan ia menghapuskan keperluan helah lama menghalakan alat ke laluan peranti.

import subprocess
proc = subprocess.run(
    ["openvpn", "--genkey", "tls-crypt"],
    stdout=subprocess.PIPE,
    stderr=subprocess.PIPE,
    check=True,
)
key_material = proc.stdout

Hantar arahan sebagai senarai. Tiada pengembangan shell diperlukan di sini, dan membolehkan shell akan membuat sempadan argumen bergantung pada tanda petik yang anda tidak kawal. Gunakan fail boleh laku yang dimaksudkan melalui laluan mutlak jika skrip mungkin berjalan dengan laluan carian berbeza daripada yang anda jangkakan.

Pemeriksaan kod pulangan menghalang laluan kejayaan daripada berterusan selepas panggilan gagal. Tanpanya, rentetan bait kosong boleh mengalir ke hadapan dan hanya gagal jauh kemudian, pada titik kunci digunakan dan mesej ralat tidak lagi menyebut penjanaan sama sekali.

Dua strim, dua makna

Output standard membawa kunci. Ralat standard membawa segala-galanya yang alat itu mahu beritahu anda, termasuk amaran tentang konfigurasi, versi dan jenis kunci. Mengalihkan kedua-duanya ke satu penimbal ialah kesilapan yang menghasilkan kunci yang kelihatan meyakinkan dengan satu ayat dijahit di tengahnya.

Asingkan juga laluan kegagalan. Apabila panggilan gagal, laporkan arahan yang gagal dan status keluar, kemudian putuskan secara sedar sama ada mana-mana bahagian ralat standard selamat ditunjukkan. Membuang seluruh objek hasil ke dalam log ialah jalan pintas biasa, dan ia boleh membawa kunci itu bersamanya.

Bacaan yang selamat untuk binari penting jika anda kemudian menghash atau membandingkan bahan itu. Mod teks dengan pengekodan tidak dijangka boleh mengubah bait yang tidak pernah dimaksudkan sebagai teks, dan kunci yang berubah tidak dapat dibezakan daripada kunci yang salah sehingga jabat tangan gagal.

Jika anda tetap menyimpannya, lakukan secara sedar

Kebanyakan penggunaan akhirnya memerlukan kunci itu pada cakera, pada get laluan atau dalam stor rahsia. Tulis sekali, dengan kebenaran ketat sejak penciptaan dan bukan chmod kemudian, dan jadikan tulisan itu atomik supaya fail separa tidak pernah menjadi fail yang dibaca perkhidmatan semasa permulaan. Penamaan semula daripada laluan dalam direktori yang sama biasanya mencukupi untuk itu. Buang laluan persediaan pada cabang kegagalan, kerana tulisan yang gagal itulah salinan yang orang lupakan.

Tetapkan mod fail apabila fail dicipta, dan kekalkan mod direktori juga ketat. Elakkan mana-mana laluan di bawah lokasi yang disapu oleh kerja sandaran tanpa berfikir, kerana rahsia dalam sandaran malam ialah rahsia dalam setiap salinan sandaran itu. Penaakulan yang sama terpakai kepada volum dikongsi yang boleh dibaca oleh perkhidmatan lain.

Kunci dikongsi bukan identiti

Menjana bahan ini tidak mengeluarkan sijil, tidak mendaftarkan klien dan tidak menetapkan siapa yang menyambung. Kunci dikongsi melindungi saluran antara pihak yang sudah saling mempercayai; identiti masih datang daripada sijil dan apa-apa pengesahan yang berdiri di hadapannya.

Jenis kunci juga tidak boleh ditukar ganti. Kunci simetri untuk satu ciri bukan pengganti terus untuk yang lain, dan keluaran yang lebih baru menambah varian mereka sendiri dengan fail berbeza di setiap hujung. Jana jenis yang benar-benar dinamakan oleh konfigurasi anda, kemudian gunakannya dalam peranan yang ditakrifkan oleh jenis itu.

Uji hasilnya dengan sambungan sebenar dan bukannya memeriksa saiz fail. Jika jabat tangan selesai dan log tidak menunjukkan amaran kunci, laluan penjanaan itu betul; jika kunci dipotong oleh strim yang digabungkan, sambungan akan gagal dengan cara yang menunjuk kepada rakan sebaya dan bukannya skrip.

Artikel berkaitan