İçeriğe geç
academia.sh

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.

Aramak için yazmaya başlayın.

↑↓ Esc gezin · aç · kapat