1 puan yazan GN⁺ 2 시간 전 | 1 yorum | WhatsApp'ta paylaş
  • Mevcut OpenBSD geliştiricilerinin ilgisi azalınca durağanlaşan relayd(8) ve httpd(8) geliştirmesi, gerçek operasyonel ihtiyaçları olan katkıcıların katılımıyla yeniden canlandı
  • LLM’lerin kodlama bilgisinin yerini aldığı bir dönemde bile doğrudan C öğrenip buna meydan okumak gerekir düşüncesiyle yola çıkılarak, önce relayd(8)’nin el yapımı imsg sistemi modernize edildi
  • 2024~2026 arasındaki tech@ posta listesinde depoya alınmamış yamaların ve mevcut GitHub aynasındaki eski issue’ların büyük kısmı temizlendi; yeni katkıcılar için ayrıca Git mirror ve README hazırlandı
  • relayd(8), güvenli imsg API’si, TLS ve istek ayrıştırma güvenliği ile yeniden yükleme çakışmaları konusunda iyileştirilirken; httpd(8)’ye request smuggling savunması, özel başlıklar ve statik dosya cache kontrolü eklendi
  • Her iki daemon’un güvenlik, kararlılık ve genişletilebilirliği birlikte ilerledi; ancak çalışma sürecinde backlog da büyüdü ve fikirlerle geri bildirimler alınmaya devam ediliyor

İlginin kaybolduğu bir projeyi yeniden canlandırmanın arka planı

  • OpenBSD 7.8 başlıca değişikliklerinde ele alındığı gibi, relayd(8) ve httpd(8) geliştirmesi durağan bir durumdaydı
    • Birçok katkıcı tech@ posta listesine yamalar gönderdi, ancak bunların neredeyse hiçbiri depoya yansımadı
    • Bunun başlıca nedeni, mevcut OpenBSD geliştiricilerinin artık bu iki daemon’la ilgilenmemesiydi
  • kirill@ ile birlikte iki daemon’u düzenli olarak kullanıp gerçek kullanım senaryolarını ele alma deneyimine dayanarak aktif geliştirmeye başlandı
    • Karmaşık httpd(8)·relayd(8) yapılandırmalarıyla OpenBSD müşterilerine destek verme şeklindeki pratik ihtiyaç, doğrudan itici güç oldu

LLM çağında neden yeniden C’ye dönüldü

  • En büyük tetikleyici LLM’lerin ortaya çıkışı oldu
    • Geçmişte modern C++ kodunu profesyonel olarak yazıyordu; ancak sonrasında çözüm mimarisi, platform mühendisliği ve ekip kurmaya geçince neredeyse hiç gerçek kod yazmamaya başladı
    • Daha çok bildirimsel YAML yazıyor, OpenBSD ports(7) için kod okuyup port ediyordu
  • “Kodlama çözüldü” iddiasının aksine, bilginin dışarı devredildiği bir dönemde o bilgiye doğrudan sahip olmanın daha da önemli olduğu sonucuna varıldı
  • C++ ve Rust bazı zor kararları geliştirici adına alsa da C bunu yapmıyor; bu da relayd(8) ve httpd(8)ye katkı yapma kararında bir meydan okuma olarak görüldü

Motivasyondan çok disiplinle sürdürülen katkı

  • Açık kaynak katkıları birkaç hafta içinde hayal kırıklığıyla bitebilir; ancak ilk sancılı aşama geçildikten sonra istikrarlı biçimde çalışılabilen bir noktaya ulaşıldı
  • Başta kod tabanı pasif biçimde okunurken birçok noktada moral bozuldu
    • Bunun nedeni yetersiz yorumlar, bazı kötü tasarımlar ve karmaşık biçimde iç içe geçmiş koddı; bunun C kodunun doğasından mı yoksa kişisel deneyim eksikliğinden mi kaynaklandığı ise hâlâ net değil
  • OpenBSD daemon bakımcılarıyla yapılan görüşmelerden sonra, elle hazırlanmış imsg mesaj sistemini modernize etmeye karar verildi
    • Önce relayd(8)ye odaklanıldı, sonra kapsam httpd(8)ye genişletildi
    • Modernizasyon çalışmasının kendisi, kod tabanını anlamanın bir aracı olarak kullanıldı

Depoya alınmamış yamalar ve eski issue’ların temizlenmesi

  • 2024~2026 dönemindeki tech@ posta listesi kayıtları incelenerek işlenmemiş yamalar ve sorunlar toplandı; bunların büyük kısmının ele alındığı düşünülüyor
  • Bu iki daemon ilk olarak, bugün OpenBSD’den emekli olan Reyk Floeter tarafından geliştirildi
  • Reyk’in yönettiği relayd GitHub aynasındaki eski issue’lar da incelendi
    • Tüm issue’lar kapatılabilecek ya da düzeltilebilecek durumda; bazıları artık geçerli değil

Yeni katkıcılar için Git mirror

  • Mevcut GitHub aynasından ilhamla, yeni ve genç katkıcıların girişini kolaylaştırmak ve OpenBSD posta listesi dışındaki topluluklarla da temas kurmak için ayrı bir mirror kuruldu
  • CVS ağacı Git mirror olarak kullanılıyor; geliştirme önce Gothub örneğinde yapılıyor, ardından diğer depolara senkronize ediliyor
  • Aynı yaklaşım httpd(8) için de uygulandı ve gerekli bilgileri içeren ayrıntılı bir README.md yazıldı

relayd(8)’nin modernizasyonu ve kod kalitesi

  • imsg sistemi, daha güvenli imsg_get_data, imsg_get_type, imsgbuf_get erişimcilerine geçirildi
  • imsg payload okumanın tüm sürecine uygun hata işleme eklendi
  • bgpd ile tutarlı olacak şekilde loglama ve yorumlar standartlaştırıldı
  • HTTP başlangıç satırı işlemesi özel bir fonksiyona ayrılarak kod yapısı iyileştirildi
  • knfmt biçimi uygulandı

relayd(8)’nin güvenlik güçlendirmeleri

  • Varsayılan TLS şifre takımı HIGH:!aNULL yerine secure olarak değiştirildi
  • CA privilege separation (privsep) motoruna ECDSA desteği eklendi
  • Yinelenen Content-Length başlıkları HTTP 400 yanıtıyla reddediliyor
  • RFC 9112 5.2 uyarınca ayrıştırıcı farklarını önlemek için obs-fold başlıklarına izin verilmiyor
  • Süreç kimliği denetleniyor ve IMSG_CTL_PROCFD üst süreçle sınırlandırılıyor
  • Hassas parola verilerini silmek için explicit_bzero kullanılıyor

relayd(8)’de hata ve kararlılık iyileştirmeleri

  • Çökmeye yol açan yeniden yükleme race condition düzeltildi
  • X509_dup, config_purge, tls_cfg ile ilgili çeşitli bellek sızıntıları giderildi
  • NULL kontrolleri ve sınır kontrolleri düzeltildi
  • OpenSSL hataları için uygun hata işleme eklendi
  • TLS hatasında OpenSSL hata kuyruğunun temizlenmesi sağlandı

relayd(8)’ye eklenen özellikler

  • MKCALENDAR HTTP yöntemi destekleniyor
  • Birden fazla listener üzerinde TLS kullanılabiliyor
  • Ad çözümlemesi yapılabilen birden fazla adres destekleniyor
  • Sertifika, anahtar ve OCSP staple yolları açıkça ayarlanabiliyor
  • HTTP sağlık kontrolü isteklerinde User-Agent ayarlanabiliyor
  • Gövdesi olmayan HTTP yanıtları doğru şekilde işleniyor

httpd(8)’nin modernizasyonu ve kod kalitesi

  • proc.c, yeni imsg API’sine taşınarak relayd(8) ile tutarlılık sağlandı
  • Gelecekte yapılandırma seçeneklerinin kolay genişletilebilmesi için token sırası değiştirildi
  • bgpd ile tutarlı olacak şekilde loglama standartlaştırıldı
  • Yinelenen kod ve boş fonksiyonlar kaldırıldı
  • knfmt biçimi uygulandı
  • Yerleşik özellik işlemesi özel fonksiyonlara ayrıldı

httpd(8)’nin güvenlik güçlendirmeleri

  • Varsayılan TLS şifre takımı compat yerine secure olarak değiştirildi
  • Request smuggling saldırılarını önlemek için CL.TE request framing reddediliyor
  • RFC 9112 5.2 uyarınca obs-fold başlıklarına HTTP 400 ile yanıt veriliyor
  • Content-Length ve Transfer-Encoding başlıkları aynı anda bulunursa hata kabul ediliyor
  • Ek koruma için açılışta rastgele relinking yapılıyor
  • Süreç kimliği denetleniyor ve IMSG_CTL_PROCFD üst süreçle sınırlandırılıyor
  • Yanıtlarda sunucu kimlik bilgisini gizleyen no banner seçeneği eklendi

httpd(8)’de hata ve kararlılık iyileştirmeleri

  • HTTP isteklerinde suffix range işleme düzeltildi
  • server_http_time() fonksiyonunun GMT zamanını doğru üretmesi sağlandı
  • Kılavuz sayfasındaki tanıma uygun olarak timegm(3) hataları denetleniyor
  • chunked transfer-encoding kullanan yüklemelerdeki sorun çözüldü
  • location içindeki fcgiparams’ın iki kez gönderilmesi engellendi
  • dispatch_parent için uygun hata işleme eklendi
  • İptal edilen yanıtların bufferevent üzerinden doğru şekilde boşaltılması sağlandı
  • scan-build tarafından bulunan gereksiz depolama kaldırıldı
  • Veri kopyalanmadan önce return_uri_len doğrulanıyor

httpd(8)’nin yeni özellikleri ve kalan işler

  • Özel HTTP başlıkları destekleniyor
  • Daha iyi yapılandırma kalıtımı için location içinde gzip-static kalıtımı eklendi
  • Daha fazla bayrak seçeneğini taşıyabilmesi için sunucu bayrakları 64 bit tamsayıya genişletildi
  • Statik dosyalar için cache kontrolü eklendi
  • Çalışma ilerledikçe backlog büyüdü; gelecekteki geliştirmeler için fikir ve geri bildirimler alınmaya devam ediliyor

1 yorum

 
GN⁺ 2 시간 전
Lobste.rs yorumları
  • Özel HTTP başlıkları desteğinin gelmesi sevindirici. Eskiden bu özellik olmadığı için basit kullanım durumlarında bile httpd kullanamıyordum; artık desteklenmesi güzel.

  • relayd(8) ve httpd(8) geliştirmesi duraklamıştı; birkaç katkıcı tech@ posta listesine yamalar göndermiş olsa da bunlar depoya pek yansıtılmamıştı. Asıl nedenin mevcut OpenBSD geliştiricilerinin artık bu daemon’larla ilgilenmemesi olduğu söyleniyor; bakımı devraldıkları için minnettarım.

  • İki yazılımı da düzenli olarak kullanıyorum; yeniden düzgün biçimde yönetiliyor olmaları sevindirici. Geliştirmenin durakladığından hiç haberim yoktu.
    Basit yazılım yapısı sayesinde, büyük bir ekip olmadan da geliştirmeyi yeniden başlatıp bu kadar çok özellik ve düzeltmeyi dahil edebilmişler gibi görünüyor.

  • Yazılım adlarının sonundaki sayılar bir süre kafamı karıştırmıştı; bunların kılavuz bölüm numaraları olduğunu öğrendim.
    1 çalıştırılabilir programları ve kabuk komutlarını, 2 sistem çağrılarını, 3 kütüphane çağrılarını, 4 özel dosyaları, 5 dosya biçimlerini ve kuralları, 6 oyunları, 7 diğer konuları, 8 sistem yönetimi komutlarını; standart dışı 9 ise çekirdek rutinlerini ifade eder.

    • man(1)’i görmek için man 1 man ya da kısaca man man çalıştırabilirsiniz. Özellikle SEE ALSO kısmında yer alan çeşitli intro sayfaları faydalıdır.
  • Bu iyileştirmelerin OpenBSD 8.0’a dahil edilip edilmeyeceğini merak ediyorum.

  • Bağlantının en baştan okunabilir olacak şekilde tasarlanıp tasarlanmadığını merak ediyorum. Android için Firefox’ta şöyle görünüyor:
    https://imgur.com/a/oTimS9R