Bios.Web.Hardening 0.2.0
Bios.Web.Hardening
Bir web servisinin dış kapısındaki üç koruma, tek pakette: her cevaba yazılan
güvenlik başlıkları, yalnız tanınan proxy'ye inanan X-Forwarded-For işleme ve
girişten sonra nereye dönüleceğini doğrulayan yol denetimi. Üçünün de
varsayılanı en dar olan taraftır; unutmanın bedeli açık kapı değil, kapalı
kapıdır.
SecurityHeaders. Content-Security-Policy başta olmak üzere güvenlik
başlıklarını her cevaba yazar; cevap hangi durum koduyla dönerse dönsün.
Hazır profiller: ApiOnly belge sunmayan bir servis için her kaynağı kapatır,
NoScript hiç betik çalıştırmayan bir yüzeyin bunu tarayıcıya söylemesini
sağlar, NoScriptPostingTo buna formun çıkabileceği adresleri ekler.
TrustedForwardedHeaders. X-Forwarded-For herhangi bir istemcinin
gönderebileceği bir başlıktır; körü körüne inanılırsa denetim izi ve hız sınırı
kandırılır. Bu ara katman başlığa yalnız yapılandırılmış güvenilen proxy'lerden
geldiğinde inanır, listede kimse yoksa hiçbirine inanmaz.
ReturnPath. Girişten sonra "kaldığın yere dön" değerini doğrular. Yalnız kök
/ ile başlayan, tek gövdeli, kontrol karakteri içermeyen bir yol kabul edilir;
başka bir adrese çıkabilecek her değer varsayılana düşer. Open redirect bu
kapıdan geçmez.
Bağlama
// Program.cs
builder.Services.AddBiosHardening(builder.Configuration); // Forwarding bolumunu okur
var app = builder.Build();
app.UseTrustedForwardedHeaders(); // istek hattinda ilk sirada
app.UseSecurityHeaders(SecurityHeaderOptions.ApiOnly);
Sayfa sunan bir yüzeyde profil değişir. Giriş sonrası devir yapan bir yüzey, formun çıkabileceği adresleri devir listesinin kendisinden verir; böylece politika ile izin listesi birbirinden ayrı düşemez:
app.UseSecurityHeaders(SecurityHeaderOptions.NoScriptPostingTo(devirAdresleri));
Dönüş yolu, çağıran unutamayacağı için tek bir çağrıda hem doğrulanır hem seçilir:
var hedef = ReturnPath.Or(istenen, "/"); // guvenli degilse "/"
Yapılandırma
Bölüm adı Forwarding; adı pakette ForwardingOptions.SectionName olarak
durur, tüketici tekrar yazmaz.
| Anahtar | Anlamı |
|---|---|
KnownProxies |
Güvenilen proxy'lerin tam adresleri |
KnownNetworks |
Güvenilen aralıklar, CIDR biçiminde (10.0.0.0/8) |
Limit |
Kaç durak geriye gidileceği; varsayılan 1 |
AcknowledgeNoProxy |
Bu sunucuya doğrudan gelindiğini, yani proxy yokluğunun bilinçli olduğunu bildirir |
{
"Forwarding": {
"KnownProxies": [ "10.0.0.7" ],
"KnownNetworks": [ "10.0.0.0/8" ],
"Limit": 1
}
}
Proxy arkasında olmayan bir sunucu listeleri boş bırakır ama bunu söyler:
{
"Forwarding": { "AcknowledgeNoProxy": true }
}
Dikkat
Sıra önemlidir. UseTrustedForwardedHeaders çağıran adresini okuyan ya da
isteğin TLS üzerinden gelip gelmediğine bakan her şeyden önce çalışmalıdır;
sonra çalışırsa denetim izi proxy'nin adresini yazmış olur.
Boş liste kimseye inanmamak demektir. Bu meşru bir kurulumdur ve açılışı
engellemez. Ama unutulmuş bir ayar da aynı görüntüyü verdiği için ikisi
ayrılmıştır: bölüm hiç yoksa açılışta Error seviyesinde, gerekçesiyle birlikte
bildirilir; AcknowledgeNoProxy yazıldığında aynı durum sıradan bir bilgi
satırına döner. Yanlış bölüm adıyla bağlanan bir kurulumun sessizce her şeyi
reddetmesi böylece görünür olur.
Anlamsız değer açılışı durdurur. Ayrışmayan bir adres, CIDR olmayan bir
aralık ya da birden küçük bir Limit kimsenin kasten yazmayacağı değerlerdir;
sunucu gerekçesini söyleyip açılmaz. Ayarlanmamış bir ortam değişkeninden gelen
boş girdi ise ayar yokluğu sayılır, hata değil.
Limiti proxy zinciriniz kadar tutun. Bir güvenilen proxy varken ikiye
çıkarmak, ziyaretçinin başlığa kendi yazdığı duraklara inanmaya başlamak
demektir.
No packages depend on Bios.Web.Hardening.
.NET 10.0
- No dependencies.