Jeda satu klien OpenVPN: mengapa pencabutan adalah tuas yang salah
Mematikan sesi bersifat reversibel; mencabut sertifikat tidak. Putuskan tuas mana yang dibutuhkan kasus ini, lalu bangun ulang CRL hanya saat cocok.
Menjeda akses satu klien dan menghapusnya untuk selamanya terlihat seperti tugas yang sama sampai Anda mencoba membatalkan salah satunya. Mencabut sertifikat menulis catatan yang dianggap final oleh server, dan membalikkannya berarti menyunting basis data penerbit secara manual. Melepas tunnel yang hidup adalah perintah manajemen yang tidak mengubah apa pun soal kepercayaan. Pilih tuas dengan bertanya apakah kuncinya masih bisa dipercaya, bukan dengan bertanya seberapa mendesak permintaannya.
Keyakinan: dicabut dan ditangguhkan adalah hal yang sama
Seorang kontraktor dijeda selama sepekan dan refleksnya adalah mencabut, karena pencabutan terdengar seperti mematikan sesuatu. Tampak rapi, hanya butuh sepuluh detik, dan meninggalkan penyuntingan basis data sebagai satu-satunya jalan kembali. Refleks itu bisa dimengerti dan lebih dekat ke membakar paspor daripada menutup pintu. Perangkat yang dijeda dan kunci yang terekspos butuh perlakuan berbeda, dan hanya satu di antaranya yang murah untuk dibalik.
Pembedanya ada pada kredensial, bukan pada orangnya. Kunci yang masih di tangan yang tepat bisa dijeda dan dilanjutkan tanpa kehilangan kepercayaan apa pun. Kunci yang mungkin pernah disalin tidak boleh dipulihkan, karena pemulihan menegaskan bahwa salinan itu tidak ada.
Tuliskan jawabannya sebelum menyentuh salah satu sistem. Jika Anda tidak bisa mengatakan apakah kuncinya terekspos, jawaban konservatifnya adalah penggantian.
Lepas sesi yang hidup dengan antarmuka manajemen
OpenVPN menyediakan antarmuka manajemen yang dapat mendaftar sesi dan mematikan salah satunya berdasarkan common name. Aktifkan di localhost, jauhkan dari antarmuka publik, dan kirim perintah mati ketika sebuah sesi harus hilang sekarang. Perintah itu hanya menutup tunnel tersebut, dan setiap klien lain tetap bekerja.
Ini respons terhadap masalah yang aktif, bukan kebijakan penangguhan. Profil yang sama bisa menyambung lagi dalam satu menit, karena tidak ada yang berubah pada kredensialnya. Gunakan saat sesinya harus pergi dan keputusan yang bertahan masih diambil.
Pastikan sesinya memang tersambung sebelum Anda mematikannya, agar tidak memburu klien yang tidak pernah menyambung. Perintah status di bawah mencetak apa yang sedang tersambung.
printf 'status 2\nquit\n' | nc 127.0.0.1 7506
printf 'kill kiosk-14\nquit\n' | nc 127.0.0.1 7506Jika perintah mati melaporkan tidak ada klien seperti itu, common name di sertifikat bukan string yang Anda ketik. Bacalah keluaran status, bukan nama berkas profil.
Apa yang sebenarnya dikendalikan CRL
Server tidak melihat bendera pencabutan yang tersimpan di sertifikat. Ia membaca daftar pencabutan sertifikat yang disebut di crl-verify pada setiap koneksi baru, dan menolak sertifikat yang nomor serinya muncul di daftar itu. Ada dua konsekuensi, dan keduanya penting secara operasional. Berkas harus bisa dibaca oleh akun tempat server menurunkan hak istimewanya, dan klien yang sudah tersambung tetap berjalan sampai ia menyambung ulang.
Konsekuensi kedua itu mengejutkan orang saat insiden. Mencabut sertifikat tidak menutup tunnel yang sedang memakainya. Pasangkan pencabutan dengan perintah mati manajemen jika sesinya harus berakhir segera, dan perlakukan kedua tindakan sebagai langkah terpisah di runbook.
Periksa daftarnya untuk melihat apa yang benar-benar akan ditegakkan server, alih-alih memercayai stempel waktu berkas terakhir yang Anda salin. Jumlah nomor seri adalah bagian yang penting.
openssl crl -in /etc/openvpn/server/crl.pem -noout -text | sed -n '1,14p'
ls -l /etc/openvpn/server/crl.pemDaftar tanpa entri dan daftar dengan entri yang benar terlihat identik di daftar direktori, karena itu jumlah nomor seri layak dicetak. Baris izin sama pentingnya, karena berkas yang tidak bisa dibaca daemon menghasilkan kegagalan yang tampak seperti klien yang ditolak.
Memulihkan catatan, dengan hati-hati
Memulihkan sertifikat berarti membalik catatan di basis data penerbitan dan menerbitkan daftar baru. easy-rsa 3 menyimpan basis data itu sebagai index.txt di dalam direktori PKI, sedangkan tata letak lama memakai susunan lain. Satu baris diawali huruf status dan tanggal kedaluwarsa. Baris yang dicabut menyisipkan stempel waktu pencabutan sebelum melanjutkan dengan nomor seri, nama berkas sertifikat, dan nama pembeda. Mengembalikan baris berarti menghapus stempel waktu itu dan membalik hurufnya, sambil membiarkan semua hal lain apa adanya.
Cadangkan berkasnya lebih dulu, lalu lakukan penyuntingan sebagai skrip, bukan dengan mengetik di editor teks. Salah ketik yang mengubah berapa banyak bidang yang dibawa satu baris merusak penerbitan untuk setiap sertifikat yang ditambahkan sesudahnya. Itulah alasan mengotomatiskan perubahan dan menyalin berkas sebelum menyentuhnya.
Pencabutan kedua dengan nama yang sama juga sering gagal, karena jalannya yang pertama telah memindahkan sertifikat itu dan kuncinya keluar dari direktori tempat alat itu mengharapkan keberadaannya. Alat itu lalu tidak menemukan apa yang diminta dicabut, dan pesan galatnya tidak selalu jelas soal alasannya.
cp /etc/easy-rsa/pki/index.txt /root/index.txt.$(date +%F-%H%M)
grep -c '^R' /etc/easy-rsa/pki/index.txt
easyrsa gen-crlTerbitkan daftar baru, perbaiki kepemilikannya, dan buat server membacanya. Muat ulang cukup pada sebagian besar pemasangan, tetapi konfirmasinya harus datang dari koneksi baru, karena sesi yang ada tidak pernah memeriksa ulang apa pun.
Periksa tuas mana yang layak didapat kasus ini
Ajukan satu pertanyaan yang menentukan seluruh runbook: apakah kunci privat masih hanya berada di tempat yang seharusnya. Jika ya, mematikan sesi plus jeda yang terdokumentasi menutup kasusnya dan tidak meninggalkan catatan permanen. Jika tidak, satu-satunya jawaban aman adalah kunci baru dengan sertifikat lama dibiarkan dicabut.
Lalu verifikasi hasilnya dengan percobaan koneksi, bukan dengan selisih konfigurasi. Selisih memberi tahu apa yang Anda maksudkan, dan koneksi memberi tahu apa yang ditegakkan server.
openssl crl -in /etc/openvpn/server/crl.pem -noout -text | grep -c 'Serial Number'
printf 'status 2\nquit\n' | nc 127.0.0.1 7506Ketika klien yang dipulihkan tersambung dan muncul di keluaran status, penyuntingan catatannya berhasil. Ketika klien yang dicabut ditolak dan log menyebut CRL, pencabutannya berhasil. Apa pun di antaranya adalah masalah izin atau muat ulang, dan itu layak diperbaiki sebelum permintaan berikutnya datang.