Pembuatan kunci tidak memerlukan file sementara, dan melewatinya memperbaiki lebih sedikit daripada yang disiratkan sebagian besar panduan. Yang dihilangkannya adalah siklus hidup file dan perlombaan pembersihan di sekitarnya. Yang dibiarkannya utuh adalah setiap kesempatan membocorkan rahasia sesudahnya. Masalah kebenaran dalam skrip ini biasanya terletak di tempat lain, karena diagnostik dan materi kunci berjalan pada aliran yang berbeda.

File itu tidak pernah menjadi paparan yang Anda kira

File sementara adalah risiko nyata ketika dapat dibaca semua orang, ketika bertahan dari crash, atau ketika langkah pembersihan dilewati setelah pengecualian. Itu nyata, dan layak diperbaiki. Itu juga lokal, terlihat, dan mudah diuji. Sebutkan masing-masing di skrip Anda sendiri sebelum menyimpulkan bahwa perubahannya hanya kosmetik.

Risiko yang lebih sunyi berada di hilir: kunci yang tercetak saat penelusuran kesalahan, pengecualian yang menyerialkan seluruh objek hasil, penangan crash yang menulis dump inti, agregator log yang menerima jalur file lalu isinya. Menghindari file sementara tidak melakukan apa pun untuk salah satu dari itu, dan mempercayai sebaliknya adalah cara penulisan ulang berniat baik meninggalkan rahasia lebih terbuka daripada sebelumnya. Perlakukan perubahan itu sebagai satu perbaikan dalam rangkaian, bukan sebagai solusinya.

Apa yang ditulis klien ketika tidak ada nama file diberikan

Versi klien saat ini mengirim kunci yang dihasilkan ke keluaran standar ketika perintah kunci diberikan tanpa jalur keluaran. Perilaku terdokumentasi itulah yang membuat pendekatan di memori layak, dan itu menghapus kebutuhan akan trik lama mengarahkan alat ke jalur perangkat.

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

Berikan perintah sebagai daftar. Tidak ada ekspansi shell yang diperlukan di sini, dan mengaktifkan shell akan membuat batas argumen bergantung pada tanda kutip yang tidak Anda kendalikan. Gunakan eksekutabel yang dimaksud dengan jalur absolut jika skrip dapat berjalan dengan jalur pencarian berbeda dari yang Anda harapkan.

Pemeriksaan kode balik mencegah jalur sukses berlanjut setelah pemanggilan yang gagal. Tanpanya, string byte kosong dapat mengalir maju dan baru gagal jauh kemudian, pada titik di mana kunci digunakan dan pesan galat sama sekali tidak lagi menyebut pembuatan.

Dua aliran, dua makna

Keluaran standar membawa kunci. Galat standar membawa semua yang ingin dikatakan alat itu kepada Anda, termasuk peringatan tentang konfigurasi, versi, dan jenis kunci. Mengalihkan keduanya ke satu buffer adalah kesalahan yang menghasilkan kunci berpenampilan meyakinkan dengan sebuah kalimat terjahit di tengahnya.

Pisahkan juga jalur kegagalan. Ketika pemanggilan gagal, laporkan perintah yang gagal dan status keluar, lalu putuskan dengan sadar apakah ada bagian dari galat standar yang aman ditampilkan. Membuang seluruh objek hasil ke log adalah jalan pintas yang lazim, dan itu dapat membawa kunci bersamanya.

Pembacaan yang aman untuk biner penting jika nanti Anda melakukan hash atau membandingkan materi itu. Mode teks dengan pengodean tak terduga dapat mengubah byte yang tidak pernah dimaksudkan sebagai teks, dan kunci yang berubah tidak dapat dibedakan dari yang salah sampai jabat tangan gagal.

Jika Anda tetap menyimpannya, lakukan dengan sadar

Sebagian besar penerapan pada akhirnya memerlukan kunci di disk, di gateway, atau di penyimpanan rahasia. Tulis sekali, dengan izin ketat sejak pembuatan alih-alih chmod belakangan, dan buat penulisan bersifat atomik agar file parsial tidak pernah menjadi file yang dibaca layanan saat mulai. Penggantian nama dari jalur di direktori yang sama biasanya cukup untuk itu. Hapus jalur pementasan pada cabang kegagalan, karena tulisan yang gagal justru salinan yang orang lupakan.

Atur mode file saat file dibuat, dan jaga juga mode direktori tetap ketat. Hindari jalur apa pun di bawah lokasi yang disapu tugas cadangan tanpa berpikir, karena rahasia dalam cadangan malam adalah rahasia di setiap salinan cadangan itu. Alasan yang sama berlaku untuk volume bersama yang dapat dibaca layanan lain.

Kunci bersama bukanlah identitas

Membuat materi ini tidak menerbitkan sertifikat, tidak mendaftarkan klien, dan tidak menetapkan siapa yang terhubung. Kunci bersama melindungi kanal antara pihak yang sudah saling percaya; identitas tetap berasal dari sertifikat dan autentikasi apa pun yang berdiri di depannya.

Jenis kunci juga tidak dapat dipertukarkan. Kunci simetris untuk satu fitur bukan pengganti langsung bagi yang lain, dan rilis yang lebih baru menambahkan variannya sendiri dengan file berbeda di setiap ujung. Buat jenis yang benar-benar disebut konfigurasi Anda, lalu gunakan dalam peran yang didefinisikan jenis itu.

Uji hasilnya dengan koneksi nyata alih-alih memeriksa ukuran file. Jika jabat tangan selesai dan log tidak menunjukkan peringatan kunci, jalur pembuatan sudah benar; jika kunci terpotong oleh aliran yang tergabung, koneksi akan gagal dengan cara yang menunjuk ke rekan, bukan ke skrip.

Artikel terkait