Ders 08 / 16
Gönderen Doğrulama Kayıtları
Gönderim politikası ve imza kayıtlarını kurgu bir ileti kümesinde koşturmak: yakalanan sahte ileti, geçen sahte ileti ve yanlışlıkla düşen meşru ileti sayıları ile fazla geniş yetkilendirmenin açtığı yüzey.
İçindekiler
Önceki ders adın nereyi gösterdiğini ölçtü. Aynı ad ikinci bir iş daha yapar: bölgesel ölçüm ağı
saha ekiplerine bildirim e-postaları gönderir ve bu iletilerin üzerinde olcumag.gecersiz yazar.
Ağ kurgudur; sayaç okumalarını toplayan bir toplayıcı, bir doğrulayıcı, faturalama ve iş emri
servisleri her gece ileti üretir.
Varsayılan durumda o iletilerin gerçekten bu addan çıktığını hiçbir şey söylemez. Gönderen alanı iletinin içinde yazan bir metindir; onu yazmak için o ada sahip olmak gerekmez. Kurulumdan sonra hiçbir şey yapılmadığında açık kalem tektir ve büyüktür: adın adına ileti göndermek herkese açıktır, ve ad ne kadar tanıdıksa taklit o kadar işe yarar. Faturalama bildirimi taklit edildiğinde saha ekibi bunu ayırt edemez.
Bu boşluğu kapatan iki kayıt vardır ve ikisi ayrı sorulara yanıt verir. Gönderen politikası kaydı, bu adın adına ileti göndermeye yetkili makinelerin listesidir; sorusu “bu ileti hangi makineden geldi” sorusudur. İmza kaydı bir açık anahtar yayınlar; gönderen makine iletiyi karşılık gelen gizli anahtarla imzalar, alıcı taraf imzayı kayıttaki anahtarla doğrular. Sorusu “bu içerik anahtarı elinde tutandan mı çıktı ve yolda değişti mi” sorusudur. İkisi birbirinin yerine geçmez ve aşağıda görüleceği gibi ikisi de tek başına yetmez.
İki Denetim, Bir Koşum
Aşağıdaki program iki denetimi de gerçekten çalıştırır. İmzalar node:crypto ile üretilir ve
doğrulanır; anahtarlar koşum sırasında yaratılır, hiçbir anahtar gövdesi metne yazılmaz.
AK7. İleti kümesi 16 kurgu iletidir: 10 meşru bildirim, 6 sahte. sinif alanı yalnız sayım
içindir, denetleyici o alanı görmez.
AK8. İmza, gönderen–konu–gövde üçlüsü üzerinden alınır; gerçek bir posta iletisinin başlık
kümesi modellenmez.
AK9. Alıcı taraf iki denetimi de yapar ve sonuçlarını görür; sonuçla ne yapacağı bu
dersin konusu değildir.
import { generateKeyPairSync, sign, verify } from 'node:crypto'; // Model: gönderen doğrulaması. Anahtarlar koşum sırasında üretilir, hiçbir anahtar // gövdesi yazılmaz ya da basılmaz. İleti kümesi ve kayıtlar kurgudur. const ANAHTAR = { k1: generateKeyPairSync('ed25519'), // ölçüm ağının kendi anahtarı k2: generateKeyPairSync('ed25519'), // üçüncü taraf göndericinin anahtarı }; const SAHTE_ANAHTAR = generateKeyPairSync('ed25519'); // saldırganın anahtarı // Bölgedeki iki kayıt. Gönderen politikası kaydı yetkili gönderen listesidir; // imza kaydı etiket başına bir açık anahtar taşır. const POLITIKA_KAYDI = { tekil: ['198.51.100.11', '198.51.100.12', '198.51.100.13', '198.51.100.14', '198.51.100.20'], agBloklari: [{ onek: '203.0.113.', boyut: 256 }], // üçüncü taraf göndericinin tüm çıkış ağı }; const IMZA_KAYDI = { k1: ANAHTAR.k1.publicKey, k2: ANAHTAR.k2.publicKey }; const govdeleyaz = (i) => `${i.gonderen}|${i.konu}|${i.govde}`; function imzala(i, etiket, ozelAnahtar) { i.etiket = etiket; i.imza = sign(null, Buffer.from(govdeleyaz(i)), ozelAnahtar); return i; } function politikaDenetimi(kaynak) { if (POLITIKA_KAYDI.tekil.includes(kaynak)) return true; return POLITIKA_KAYDI.agBloklari.some((b) => kaynak.startsWith(b.onek)); } function imzaDenetimi(i) { if (!i.imza || !IMZA_KAYDI[i.etiket]) return false; return verify(null, Buffer.from(govdeleyaz(i)), IMZA_KAYDI[i.etiket], i.imza); } // 16 kurgu ileti: 10 meşru bildirim, 6 sahte. const ILETILER = [ { id: 'm01', kaynak: '198.51.100.11', gonderen: '[email protected]', konu: 'sayac paketi', govde: 'gece toplu is tamam', sinif: 'mesru', anahtar: 'k1' }, { id: 'm02', kaynak: '198.51.100.12', gonderen: '[email protected]', konu: 'sapma uyarisi', govde: 'bolge 4 sapma', sinif: 'mesru', anahtar: 'k1' }, { id: 'm03', kaynak: '198.51.100.13', gonderen: '[email protected]', konu: 'donem kapanisi', govde: 'donem 7 kapandi', sinif: 'mesru', anahtar: 'k1' }, { id: 'm04', kaynak: '198.51.100.14', gonderen: '[email protected]', konu: 'saha is emri', govde: 'ekip 2 icin 5 emir', sinif: 'mesru', anahtar: 'k1' }, { id: 'm05', kaynak: '198.51.100.20', gonderen: '[email protected]', konu: 'haftalik ozet', govde: 'ozet ektedir', sinif: 'mesru', anahtar: 'k1' }, { id: 'm06', kaynak: '203.0.113.40', gonderen: '[email protected]', konu: 'toplu duyuru', govde: 'bakim penceresi', sinif: 'mesru', anahtar: 'k2' }, { id: 'm07', kaynak: '203.0.113.41', gonderen: '[email protected]', konu: 'toplu duyuru', govde: 'bakim penceresi', sinif: 'mesru', anahtar: 'k2' }, { id: 'm08', kaynak: '198.51.100.13', gonderen: '[email protected]', konu: 'gecelik rapor', govde: 'toplu is ciktisi', sinif: 'mesru', anahtar: null }, { id: 'm09', kaynak: '192.0.2.77', gonderen: '[email protected]', konu: 'esik asimi', govde: 'yeni uyari servisi', sinif: 'mesru', anahtar: 'k1' }, { id: 'm10', kaynak: '198.51.100.30', gonderen: '[email protected]', konu: 'saha is emri', govde: 'ekip 3 icin 2 emir', sinif: 'mesru', anahtar: 'k1', bozulan: ' -- iletildi' }, { id: 'f01', kaynak: '203.0.113.200', gonderen: '[email protected]', konu: 'odeme talebi', govde: 'hesap degisti', sinif: 'sahte', anahtar: null }, { id: 'f02', kaynak: '192.0.2.200', gonderen: '[email protected]', konu: 'acil is emri', govde: 'sayaci sokun', sinif: 'sahte', anahtar: null }, { id: 'f03', kaynak: '192.0.2.201', gonderen: '[email protected]', konu: 'sifre yenileme', govde: 'baglantiya gidin', sinif: 'sahte', anahtar: 'sahte' }, { id: 'f04', kaynak: '203.0.113.201', gonderen: '[email protected]', konu: 'donem kapanisi', govde: 'yeni hesap no', sinif: 'sahte', anahtar: 'sahte' }, { id: 'f05', kaynak: '198.51.100.13', gonderen: '[email protected]', konu: 'donem kapanisi', govde: 'ele gecirilmis makine', sinif: 'sahte', anahtar: 'k1' }, { id: 'f06', kaynak: '192.0.2.202', gonderen: '[email protected]', konu: 'sayac paketi', govde: 'gece toplu is tamam', sinif: 'sahte', anahtar: 'k1', bozulan: ' ek satir' }, ]; for (const i of ILETILER) { if (i.anahtar === 'sahte') imzala(i, 'k1', SAHTE_ANAHTAR.privateKey); else if (i.anahtar) imzala(i, i.anahtar, ANAHTAR[i.anahtar].privateKey); if (i.bozulan) i.govde += i.bozulan; // imzadan sonra gövde değişir } const denetle = () => ILETILER.map((i) => ({ id: i.id, sinif: i.sinif, politika: politikaDenetimi(i.kaynak), imza: imzaDenetimi(i), })); const KURALLAR = { 'yalniz politika': (s) => s.politika, 'yalniz imza': (s) => s.imza, 'herhangi biri': (s) => s.politika || s.imza, 'ikisi de': (s) => s.politika && s.imza, }; const mesru = ILETILER.filter((i) => i.sinif === 'mesru').length; const sahte = ILETILER.length - mesru; function tablo(baslik) { const sonuc = denetle(); console.log(`\n[${baslik}] kural yakalanan sahte gecen sahte dusen mesru`); for (const [ad, kural] of Object.entries(KURALLAR)) { const gecen = sonuc.filter((s) => s.sinif === 'sahte' && kural(s)).length; const dusen = sonuc.filter((s) => s.sinif === 'mesru' && !kural(s)).length; console.log(' '.padEnd(baslik.length + 5) + ad.padEnd(18) + `${sahte - gecen}/${sahte}`.padEnd(17) + String(gecen).padEnd(13) + `${dusen}/${mesru}`); } } console.log('ileti sinif politika imza'); for (const s of denetle()) { console.log(`${s.id.padEnd(6)} ${s.sinif.padEnd(7)} ${(s.politika ? 'gecti' : 'dustu').padEnd(9)} ${s.imza ? 'gecti' : 'dustu'}`); } console.log(`\nmesru ileti: ${mesru} sahte ileti: ${sahte}`); tablo('genis'); const genisYetki = POLITIKA_KAYDI.tekil.length + POLITIKA_KAYDI.agBloklari.reduce((a, b) => a + b.boyut, 0); const kullanilan = [...new Set(ILETILER.filter((i) => i.sinif === 'mesru' && politikaDenetimi(i.kaynak)) .map((i) => i.kaynak))]; console.log('\nyetkilendirilen adres:', genisYetki, '| gercekten gonderen:', kullanilan.length, '| fazladan yetkili:', genisYetki - kullanilan.length); POLITIKA_KAYDI.agBloklari = []; // ağ bloğu kaldırılır POLITIKA_KAYDI.tekil = kullanilan; // yalnız kullanılan adresler kalır tablo('dar');
ileti sinif politika imza
m01 mesru gecti gecti
m02 mesru gecti gecti
m03 mesru gecti gecti
m04 mesru gecti gecti
m05 mesru gecti gecti
m06 mesru gecti gecti
m07 mesru gecti gecti
m08 mesru gecti dustu
m09 mesru dustu gecti
m10 mesru dustu dustu
f01 sahte gecti dustu
f02 sahte dustu dustu
f03 sahte dustu dustu
f04 sahte gecti dustu
f05 sahte gecti gecti
f06 sahte dustu dustu
mesru ileti: 10 sahte ileti: 6
[genis] kural yakalanan sahte gecen sahte dusen mesru
yalniz politika 3/6 3 2/10
yalniz imza 5/6 1 2/10
herhangi biri 3/6 3 1/10
ikisi de 5/6 1 3/10
yetkilendirilen adres: 261 | gercekten gonderen: 7 | fazladan yetkili: 254
[dar] kural yakalanan sahte gecen sahte dusen mesru
yalniz politika 5/6 1 2/10
yalniz imza 5/6 1 2/10
herhangi biri 5/6 1 1/10
ikisi de 5/6 1 3/10
Sayının Okunuşu
Hiçbir satır altı sahtenin altısını da yakalamıyor ve hiçbir satır meşru iletilerin hepsini geçirmiyor. Karar, iki sütun arasında yapılıyor.
Yalnız politika kaydı üç sahteyi kaçırır. Nedeni sütunda görünür: f01 ve f04 yetkili ağ
bloğunun içinden gelmiştir, f05 ise doğrudan meşru makinenin kendisinden. Politika kaydı adresi
sorar, içeriği sormaz — yetkili bir adresten gönderilen her şeyi geçirir.
Bu denetimin neyi sorduğu, ne kadarını kapattığını da belirler. Politika kaydı bağlanan makinenin adresini sınar; iletinin içinde yazan gönderen alanını değil. İkisi arasında zorunlu bir bağ yoktur ve denetim yalnız adresi gördüğü için, yetkili bir adresten gönderilen ileti içinde hangi adı taşırsa taşısın geçer. Kaydın kapattığı şey, ağın herhangi bir yerinden bu adın adına ileti göndermektir — az bir şey değil, ama içeriğe dair hiçbir şey söylemez.
Yalnız imza kaydı beş sahteyi yakalar ve tek kaçırdığı f05’tir. Buna karşılık iki meşru
iletiyi düşürür: m08 imzalanmamıştır (gecelik toplu iş imzalama adımından geçmiyor), m10 ise
imzalandıktan sonra gövdesi değişmiştir — bir ara sunucu iletiyi yönlendirirken sonuna bir satır
eklemiştir. İmza içeriği sorar, kaynağı sormaz.
İkisinin birleştirilmesi bir üçüncü karardır. Gevşek birleşim (herhangi biri geçerse kabul) düşen meşru iletiyi 1’e indirir ama geçen sahteyi 3’te tutar; sıkı birleşim (ikisi de geçmeli) geçen sahteyi 1’e indirir, bedeli üç meşru iletinin düşmesidir. Aynı iki kayıt, birleştirme kuralına göre üç kat farklı sonuç verir. Bu kuralın kim tarafından ve nasıl bildirileceği sonraki dersin konusudur.
Kaydın Gerçeklikten Kayması
Önceki derste bölge dosyası ile canlı envanterin ayrışması sayılmıştı. Aynı kayma burada da var ve daha hızlı ilerler, çünkü gönderen kümesi kayıt kümesinden bağımsız büyür.
Modelde meşru iletiler dokuz ayrı adresten çıkıyor, politika kaydı bunlardan yedisini tanıyor.
Tanınmayan ikisi konuşuyor: m09 yeni kurulmuş bir eşik uyarısı servisidir, ileti göndermeye
başlamış ama kayda eklenmemiştir; m10 ise bir yönlendirme sonucu başka bir makineden çıkmıştır.
Kayda ekleme adımı bir kurulumun parçası değildir — servis yazılır, dağıtılır, çalışır, ileti
gönderir ve kimse bölgeye bakmaz. Kayma tek yönlüdür ve sessizdir: eksik kayıt bir hata
üretmez, yalnız iletinin bir denetimi kaybetmesine yol açar.
Bu kaymanın ölçüsü, iki listeyi karşılaştırmaktır: kayıtta yetkili adresler ile son bir dönemde gerçekten gönderim yapmış adresler. Farkın iki yönü de kalemdir. Kayıtta olup göndermeyen adres gereksiz yüzeydir; gönderip kayıtta olmayan adres ise düşmeye aday meşru iletidir. Bu iki sayının nereden okunacağı, sonraki dersin rapor akışının varlık nedenidir; şu an için ikisi de yalnız bu koşumda görünüyor, işletmede görünmüyor.
Fazla Geniş Yetkilendirme
Politika kaydında bir tek adres yerine bir ağ bloğu yetkilendirmek yaygın bir kısayoldur; üçüncü taraf gönderici çıkış adresini değiştirdiğinde kayıt bozulmasın diye yapılır. Bedeli sayıda:
AK10. Politika kaydındaki ağ bloğu 256 adres taşır; üçüncü taraf gönderici bunlardan ikisini kullanır.
Kayıt 261 adresi yetkilendiriyor, gerçekten gönderen adres 7. Aradaki 254 adres
kimsenin kullanmadığı ama ölçüm ağının adına ileti göndermeye yetkili olan adreslerdir. Bunlar
üçüncü taraf göndericinin başka müşterilerine ayrılmış olabilir; o müşterilerden biri ele
geçirildiğinde olcumag.gecersiz adına ileti gönderme yetkisi de onunla birlikte el değiştirir.
Koşumdaki f01 ve f04 tam olarak budur.
Blok daraltıldığında sayı yerine oturuyor: yalnız politika kuralı 3/6’dan 5/6‘ya çıkıyor, geçen sahte 3’ten 1’e iniyor ve düşen meşru ileti hiç artmıyor. Bu, açık kalemi meşru işi durdurmadan kapatan bir adımdır ve konuda tek örneğidir. Karşılığında bir bakım yükü doğar: üçüncü taraf gönderici adres değiştirdiğinde kayıt güncellenmezse meşru duyurular düşer, ve bu düşüş sessizdir.
Yetkilendirmenin ikinci katmanı ayrıca sayılmalıdır. Üçüncü taraf gönderici yalnız adres
bloğuyla değil, imza kaydındaki ikinci etiketle de yetkilidir: m06 ve m07 iletileri onun
anahtarıyla imzalanmıştır ve doğrulamadan geçerler. Yani o taraf, ölçüm ağının adına geçerli
imza üretebilen ikinci bir taraftır. Adres bloğu daraltılsa bile bu yetki durur; ancak etiket
kayıttan çıkarılarak geri alınır. İki katman iki ayrı kalemdir ve ikisi ayrı ayrı sayılmadıkça
“gönderen doğrulaması kuruldu” cümlesi bir sayı taşımaz.
Kapatılamayan Kalem ve Yeni Yüzey
f05 hiçbir kuralda yakalanmıyor.
AK11. Ele geçirilmiş meşru makine, o makinede duran imzalama anahtarına da erişir.
Bu kalem kapatılamaz, çünkü iki kayıt da makinenin yetkili olup olmadığını sorar, o an kimin
elinde olduğunu değil. Sonucun yönü de ters işler: doğrulamadan geçen ileti, alıcı tarafta
geçmeyenden daha güvenilir görünür. f05 yalnız yakalanmamakla kalmaz, iki denetimden de
geçtiği için taklit iletilerin en inandırıcısı durumundadır. Gönderen doğrulaması kurmak, bu tek
iletinin değerini yükseltir; kapatılan beş kalemin karşılığında kalan bir kalem ağırlaşır. Gönderen doğrulaması adın taklit edilmesini engeller; adın kendi
makinesinden kötüye kullanılmasını engellemez. Bunun ölçüsü bu konuda değil, makinenin
sertleştirilmesindedir.
m10 de kapatılamayanlar arasındadır: bir ileti yönlendirildiğinde kaynak adres değişir ve gövde
değişebilir. İki denetim de bunu bir saldırı gibi görür. Yönlendirmeyi kimse bölge dosyasından
yönetemez.
AK12. Anahtar değiştirilirken eski etiket kayıtta bir süre daha kalır; o süre boyunca iki anahtarla üretilmiş imza da doğrulanır.
Kapatmanın kendi yüzeyi ise anahtarın yerindedir. İmza kaydı bir açık anahtar yayınlar, ama karşılığındaki gizli anahtar bir makinede durur ve orada bir sırdır. Kayıt etiket başına anahtar taşıdığı için birden çok etiket bir arada yayınlanabilir — anahtar değiştirilirken yeni etiket eklenir, eski etiket bir süre kalır. O süre boyunca iki anahtar birden geçerlidir ve eski anahtarı ele geçiren biri hâlâ geçerli imza üretir. Anahtar döndürme, kapanan bir kalemin karşılığında açılan bir penceredir; penceresinin uzunluğu önceki derste ölçülen yaşam süresine bağlıdır.
Özet
- Varsayılan durumda bir adın adına ileti göndermek için o ada sahip olmak gerekmez; kurulum sonrası açık kalem tektir ve adın tanınırlığıyla büyür.
- Gönderen politikası kaydı “hangi makineden” sorusuna, imza kaydı “içerik anahtar sahibinden mi ve değişti mi” sorusuna yanıt verir; ikisi birbirinin yerine geçmez.
- 16 iletilik kurgu kümede yalnız politika 3/6, yalnız imza 5/6 sahteyi yakalar; imza iki meşru iletiyi düşürür (imzasız toplu iş ve yönlendirilirken gövdesi değişen bildirim).
- Birleştirme kuralı sonucu belirler: gevşek kural düşen meşruyu 1’e indirir ama 3 sahte geçirir, sıkı kural 1 sahte geçirir ama 3 meşru ileti düşürür.
- Politika kaydındaki ağ bloğu 261 adresi yetkilendirir, gerçekte 7 adres gönderir; 254 fazladan yetkili adres bir yüzeydir ve blok daraltıldığında meşru ileti kaybı olmadan kapanır.
- Ele geçirilmiş meşru makineden gönderilen ileti hiçbir kuralda yakalanmaz; anahtar döndürme ise iki anahtarın birlikte geçerli olduğu bir pencere açar.
Sonraki Adım
İki denetim artık bir sonuç üretiyor: her ileti için iki bit. Bu dersin bıraktığı asıl boşluk şu ki, o iki bitle ne yapılacağını kimse söylemiyor. Denetimden düşen bir iletiyi alıcı tarafın teslim mi, karantinaya mı alacağı, yoksa reddedecek mi olduğu ad sahibinin değil alıcının kararı durumunda ve alıcılar farklı davranıyor. Sonraki ders bu kararın bölgeden bildirilmesini ele alır: politika bildirimi aşamalı sıkılaştırılır — yalnız raporla, karantina, reddet — ve her aşamada düşen meşru ileti ile engellenen sahte ileti ayrı ayrı sayılır. Rapor akışının kendisi de bir ölçüm aracıdır: yetkilendirilmemiş göndericilerin ne kadarı oradan bulunuyor.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.