OpenVPN hook olayları: ad ve zaman damgası neden anahtar değil
Bir bağlantı kesme hook'u bağlanma zamanını bildirir, kesilme zamanını değil. Kullanıcı adıyla eşleştirildiğinde yanlış oturumu kapatabilir; bunun yerine bir kimliğe sahip olun.
Aynı ad altında ikinci bir bağlantı başladıktan sonra bir bağlantı kesme kaydı gelir ve o kullanıcının en yeni satırını güncelleyen işleyici yanlış oturumu kapatır. Hata zaman damgalarının karşılaştırılmasında değil. Hata, ad artı tam bir saniyenin tek bir oturumu tanımladığı varsayımında. Hook olayları bağlantıları tanımlar ve bir bağlantının yalnızca kendisine ait bir anahtara ihtiyacı vardır.
Bağlantı kesme değişkenlerinin gerçekte ne anlama geldiğiyle başlayın. Ancak o zaman tanımlayıcı seçimi anlamlı olur.
Bağlantı kesme hook'unun gerçekte taşıdığı şey
Community OpenVPN 2.6'da hook başvurusu time_unix değerini istemcinin bağlandığı an olarak tanımlar; bağlanma hook'u çalışmadan önce ayarlanır ve bağlantı kesme hook'u daha sonra tetiklendiğinde yeniden tanımlanmaz. time_duration o oturumun uzunluğunu saniye cinsinden verir, yani son yaklaşık olarak bağlanma zamanı artı süredir. İkisi de tam saniyedir ve hiçbiri veritabanınızın olayı işlediği an değildir. Bu üç zamanı ayrı tutmak, bir korelasyonun yalnızca test sırasında doğru görünmesi yerine gerçekten tutmasını sağlar.
Bu aritmetik yazılmaya değer, çünkü hook'un kendisinin sunduğu tek bitiş zamanıdır. İşleme gecikmesi ve ana makineler arasındaki saat farkları hâlâ bunun dışındadır.
Bariz çift neden benzersiz değil
Adı bağlanma zamanıyla eşleştirmek aramayı daraltır ve yine de bir oturumu tanımlamaz. Bir istemci aynı saniye içinde yeniden bağlanabilir, bu yüzden iki oturum her iki değeri paylaşabilir. İki daemon örneği veya aynı yapılandırmayı koruyan bir sunucu değişimi, bu çifti farklı süreçlerden üretebilir. Tünel adresleri de aynı nedenle geri dönüştürülür, bu da onları bir oturumun tanımlayıcıları değil nitelikleri yapar.
Arıza biçimi sessizdir. İlk oturum için geç gelen bağlantı kesme en yeni satırla eşleşir ve ikinci oturumun hâlâ kullandığı bir tahsisi sonlandırır, bu yüzden kullanıcı kendi yapmadığı rastgele bir erişim kaybı yaşar. Sonradan doğru görünen satır sayısı sorunu fark etmeyi zorlaştırır.
Kararlı kimlik nereden gelir
Yönetim arayüzü her istemciye bir istemci örneği tanımlayıcısı atar ve bu tanımlayıcı, onu veren daemon örneğiyle sınırlıdır. Kullanılabilir bir dış anahtar, kararlı bir sunucu tanımlayıcısını, daemon başladığında değişen bir dönemi ve o istemci ID'sini birleştirir. Dönem önemlidir çünkü tanımlayıcılar süreçle birlikte yeniden başlar ve çıplak bir süreç ID'si daha sonra ilgisiz bir şey tarafından yeniden kullanılabilir.
Bir alt bağlanma betiğinin içinde ayarlanan ortam değişkenleri, üst daemonun sonraki bağlantı kesme betiğine geçmez, çünkü bu betikler kendi ortamlarına sahip ayrı süreçler olarak çalışır. Bu nedenle bağlanma anında UUID üretmek çözümün yarısıdır. Bağlantı kesme tarafı aynı UUID'yi adlandırabilmelidir, bu da kimliğin her iki olayın da ulaşabileceği bir yerde yaşaması gerektiği anlamına gelir.
Kapatmayı koşullu ve idempotent yapın
Kullanıcıya göre değil, oturum sahibine göre kapatın. Bir ada şu anda ait olan herhangi bir tahsisi silen işleyici sonunda yanlış olanı silecektir ve tek savunma, kaldırılan kaydın bu olayın tanımladığı kayıt olduğunu doğrulamaktır.
Yönetim arayüzü aynı anda yalnızca bir bağlı yönetim istemcisi kabul eder, bu nedenle aynı soket için rekabet eden ikinci bir gözlemci eklemek yerine onu zaten elinde bulunduranla bütünleşin.
Yinelenen olayları sonucu iki kez değiştirmeden işleyin ve eşleşmemiş olayları atmak yerine uzlaştırma için saklayın. Bağlantı kesme geri çağrısının belgelenmiş yaşam döngüsü koşulları vardır ve bir çökme veya zorla durdurmanın ardından hiç gelmeyebilir, bu nedenle tasarımın bitiş olayı eksik bir oturumu temsil etme yolu olmalıdır.
Zor durumları bilerek test edin: bir saniye içinde iki yeniden bağlanma, iki daemon örneği, işlenmesi başarısız olan bir bağlantı ve bir oturumun ortasında daemon yeniden başlatma. Dördünü de atlatan bir anahtar güvenilmeye değer bir anahtardır.