OpenVPN push-peer-info: beri label klien tanpa memberi akses
Bidang UV_ ikut menumpang di terowongan yang terautentikasi, tetapi nilainya tetap klaim klien. Pasang, verifikasi apa yang tiba, dan pertahankan otorisasi di sisi server.
Tag penerapan adalah alasan umum orang menggapai fitur ini: setiap koneksi seharusnya membawa sesuatu seperti situs atau peran, dan server seharusnya membacanya tanpa mengarang format kredensial kedua. OpenVPN komunitas sudah memiliki mekanismenya, dan mekanisme itu kecil. Bagian yang menyakitkan adalah ekspektasinya. Menetapkan variabel biasa di profil klien tidak melakukan apa pun di server, dan nilai yang tetap tiba hanya membuktikan bahwa klien mengirimkannya.
Ini adalah runbook untuk jalur yang berfungsi, langkah verifikasi yang menunjukkan apa yang benar-benar tiba, dan pengembalian yang tidak meninggalkan hook setengah terkonfigurasi. Tidak ada yang memerlukan sertifikat baru, plugin baru, atau ekstensi protokol.
Tetapkan variabel dan aktifkan jalurnya
Dua baris melakukan pekerjaan di profil klien, dan keduanya diperlukan. Tanpa yang pertama tidak ada yang dikirim; tanpa yang kedua klien sama sekali tidak menawarkan informasi peer. Urutan tidak penting, dan itu layak diketahui karena kedua baris sering berakhir di bagian berbeda dari profil yang dihasilkan. Yang penting adalah keduanya bertahan dari apa pun yang menulis ulang profil sebelum klien membacanya.
setenv UV_DEPLOY field-support
push-peer-info
Awalan UV_ bukan hiasan. Variabel DEPLOY biasa tetap lokal pada proses klien dan tidak pernah diteruskan, sedangkan bentuk berawalan adalah ruang nama yang dicadangkan protokol untuk bidang yang ditentukan pengguna. Pertahankan bagian lain dari profil yang disetujui dan pastikan build klien yang Anda terapkan mendukung kedua direktif sebelum menerapkannya.
Satu pemeriksaan praktis pantas dilakukan di sini, bukan di akhir: pastikan direktif mencapai biner klien dan tidak ditelan pembungkus. Klien grafis yang menghasilkan baris perintahnya sendiri, atau antarmuka manajemen yang memuat ulang profil tersimpan, dapat membuang baris yang tidak dikenalnya. Jika server tidak melihat apa pun, inilah tempat pertama untuk mencari.
Baca bidang dari hook server
Di sisi server, informasi peer yang diterima divalidasi dan dimasukkan ke lingkungan alur kerja koneksi, dan itulah yang membuatnya dapat dibaca dari hook tanpa pekerjaan protokol apa pun dari Anda. Server tidak perlu mengurai kanal kontrol atau menyimpan apa pun untuk Anda; nilainya hadir begitu saja saat koneksi disiapkan. Skrip client-connect minimal yang mencatat label di samping nama terautentikasi tampak seperti ini.
#!/bin/sh
# /etc/openvpn/server/hooks/label.sh
printf '%s %s\n' "$common_name" "${UV_DEPLOY:-unset}" \
>> /var/log/openvpn/deploy-labels.log
Baca variabel melalui lingkungan alih-alih mengurai log, dan selalu beri nilai bawaan. ${UV_DEPLOY:-unset} menjaga skrip tetap berfungsi untuk klien yang tidak pernah mengirim bidang itu, yang merupakan keadaan normal selama penerapan bertahap. Jangan membuang seluruh lingkungan ke log untuk menemukan nama; isinya jauh lebih banyak daripada label, termasuk nilai yang tidak ingin Anda pertahankan.
Jalankan skrip dengan tangan dan skrip akan melaporkan unset untuk semuanya, karena shell manual tidak membawa lingkungan koneksi. Itu bukan bug dalam skrip dan bukan bukti bahwa bidang itu hilang. Ujilah melalui koneksi nyata, satu-satunya konteks tempat variabel itu ada.
Verifikasi apa yang benar-benar tiba
Hubungkan satu klien dengan label dan satu tanpanya, lalu baca berkasnya. Pasangan itulah ujiannya: satu baris seharusnya membawa nilai dan yang lain membawa nilai bawaan, dan keduanya harus menyebut identitas terautentikasi yang sama seperti yang Anda harapkan.
tail -n 5 /var/log/openvpn/deploy-labels.log
# field-support deployed-client-07
# unset legacy-laptop-02
Baris komentar itu adalah bentuk keluarannya, bukan transkrip dari server Anda; bacalah berkas Anda sendiri. Jika klien kedua juga menunjukkan nilai, variabel ditetapkan di tempat lain dalam lingkungan, dan Anda membaca pengaturan usang alih-alih bidang peer.
Periksa juga log server untuk koneksi itu. Informasi peer dapat muncul di sana, yang praktis untuk penelusuran kesalahan dan alasan untuk menjaga nilainya tetap membosankan: tanpa nama orang, tanpa nomor tiket, tanpa apa pun yang tidak ingin Anda lihat oleh pembaca log.
Perlakukan label sebagai klaim, bukan identitas
Siapa pun yang dapat menyunting profil klien dapat mengubah tag, dan terowongan yang terautentikasi tidak membuat tag itu berwenang. Transportasi melindungi nilainya selama perjalanan; ia tidak mensertifikasi klaim tersebut. Otorisasi tetap milik identitas terautentikasi dan catatan pendaftaran yang dimiliki server, dengan label dibandingkan dengan catatan itu ketika hal itu penting.
Perbedaan itu menentukan di mana label boleh dipakai. Penggunaan yang baik adalah mengarahkan sesi ke berkas log yang tepat, memilih grup tampilan di dasbor, atau menandai sesi dukungan agar seseorang menemukannya nanti. Penggunaan yang buruk adalah mengizinkan perangkat masuk ke subnet, memilih kebijakan firewall, atau memutuskan data pelanggan mana yang boleh dibaca sesi.
Validasi nilainya sebelum mencapai jalur, kueri, atau perintah shell. Daftar izin berisi string yang diharapkan sudah cukup untuk tag penerapan, dan tidak memakan biaya. Jangan pernah menyisipkan string yang dipasok peer ke baris perintah shell, dan batasi setiap pengamatan tersimpan pada sesi, bukan pada alamat terowongan yang akan dipakai ulang klien berikutnya.
case "${UV_DEPLOY:-}" in
field-support|field-qa|lab) : ;;
*) UV_DEPLOY=unknown ;;
esac
Kembalikan dengan bersih
Menghapus fitur ini adalah dua penghapusan dan satu verifikasi. Hapus baris setenv dan push-peer-info dari profil klien, lalu hapus atau nonaktifkan hook dan target lognya di server.
grep -rn 'UV_DEPLOY\|push-peer-info' /etc/openvpn/
tail -n 3 /var/log/openvpn/deploy-labels.log
Hubungkan ulang satu klien setelahnya dan pastikan baris log berhenti muncul. Hook yang terus menyala setelah perubahan profil biasanya adalah profil kedua yang masih diterapkan pada perangkat uji, dan menemukannya sekarang lebih murah daripada menemukannya saat audit.
Yang tersisa di akhir adalah potongan metadata sesi yang kecil dan terbatas dengan asal yang terdokumentasi: klien mengklaimnya, server mencatatnya, dan tidak ada apa pun tentang akses yang bergantung padanya. Itulah versi berguna dari fitur ini, dan tidak perlu kredensial baru untuk sampai ke sana.