---
title: 'Gönderen Doğrulama Kayıtları'
source: 'https://academia.sh/tr/kurslar/sunucu-ve-sertlestirme/gonderen-dogrulama-kayitlari'
course: 'Sunucu, Ağ ve Sertleştirme'
language: tr
updated: '2026-08-17T18:09:10+00:00'
license: 'CC BY-SA 4.0'
---

# 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.

Ö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.

```javascript
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: 'toplayici@olcumag.gecersiz', konu: 'sayac paketi', govde: 'gece toplu is tamam', sinif: 'mesru', anahtar: 'k1' },
  { id: 'm02', kaynak: '198.51.100.12', gonderen: 'dogrulayici@olcumag.gecersiz', konu: 'sapma uyarisi', govde: 'bolge 4 sapma', sinif: 'mesru', anahtar: 'k1' },
  { id: 'm03', kaynak: '198.51.100.13', gonderen: 'faturalama@olcumag.gecersiz', konu: 'donem kapanisi', govde: 'donem 7 kapandi', sinif: 'mesru', anahtar: 'k1' },
  { id: 'm04', kaynak: '198.51.100.14', gonderen: 'isemri@olcumag.gecersiz', konu: 'saha is emri', govde: 'ekip 2 icin 5 emir', sinif: 'mesru', anahtar: 'k1' },
  { id: 'm05', kaynak: '198.51.100.20', gonderen: 'bildirim@olcumag.gecersiz', konu: 'haftalik ozet', govde: 'ozet ektedir', sinif: 'mesru', anahtar: 'k1' },
  { id: 'm06', kaynak: '203.0.113.40', gonderen: 'bildirim@olcumag.gecersiz', konu: 'toplu duyuru', govde: 'bakim penceresi', sinif: 'mesru', anahtar: 'k2' },
  { id: 'm07', kaynak: '203.0.113.41', gonderen: 'bildirim@olcumag.gecersiz', konu: 'toplu duyuru', govde: 'bakim penceresi', sinif: 'mesru', anahtar: 'k2' },
  { id: 'm08', kaynak: '198.51.100.13', gonderen: 'faturalama@olcumag.gecersiz', konu: 'gecelik rapor', govde: 'toplu is ciktisi', sinif: 'mesru', anahtar: null },
  { id: 'm09', kaynak: '192.0.2.77', gonderen: 'uyari@olcumag.gecersiz', konu: 'esik asimi', govde: 'yeni uyari servisi', sinif: 'mesru', anahtar: 'k1' },
  { id: 'm10', kaynak: '198.51.100.30', gonderen: 'isemri@olcumag.gecersiz', konu: 'saha is emri', govde: 'ekip 3 icin 2 emir', sinif: 'mesru', anahtar: 'k1', bozulan: ' -- iletildi' },
  { id: 'f01', kaynak: '203.0.113.200', gonderen: 'faturalama@olcumag.gecersiz', konu: 'odeme talebi', govde: 'hesap degisti', sinif: 'sahte', anahtar: null },
  { id: 'f02', kaynak: '192.0.2.200', gonderen: 'isemri@olcumag.gecersiz', konu: 'acil is emri', govde: 'sayaci sokun', sinif: 'sahte', anahtar: null },
  { id: 'f03', kaynak: '192.0.2.201', gonderen: 'bildirim@olcumag.gecersiz', konu: 'sifre yenileme', govde: 'baglantiya gidin', sinif: 'sahte', anahtar: 'sahte' },
  { id: 'f04', kaynak: '203.0.113.201', gonderen: 'faturalama@olcumag.gecersiz', konu: 'donem kapanisi', govde: 'yeni hesap no', sinif: 'sahte', anahtar: 'sahte' },
  { id: 'f05', kaynak: '198.51.100.13', gonderen: 'faturalama@olcumag.gecersiz', konu: 'donem kapanisi', govde: 'ele gecirilmis makine', sinif: 'sahte', anahtar: 'k1' },
  { id: 'f06', kaynak: '192.0.2.202', gonderen: 'toplayici@olcumag.gecersiz', 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.
