---
title: 'Kod Olarak Altyapı Taraması'
source: 'https://academia.sh/tr/kurslar/guvenlik-otomasyonu/kod-olarak-altyapi-taramasi'
course: 'Güvenlik Otomasyonu ve Tedarik Zinciri'
language: tr
updated: '2026-08-17T18:06:43+00:00'
license: 'CC BY-SA 4.0'
---

# Kod Olarak Altyapı Taraması

420 şablon kaleminde kuralın dağıtımdan önce verebildiği karar sayılıyor: 100 gerçek ihlalin 55'i kesin olarak yakalanır, 26'sı değeri dağıtım anında hesaplandığı için belirlenemez kalır, 19'u hiç kural yazılmamış alan sınıfındadır. Belirlenemezi geçirmek 26 ihlali görmeden bırakır, durdurmak 65 uygun kalemi boşuna bloklar. Aynı kural seti 60 yapı boyunca dört yerleşimde koşar: kesin kapı 34 yapı durdurup 1 339 yapı-kalem maruziyet bırakır, yalnız dağıtımdan sonra tarayan denetim hiçbir yapıyı durdurmadan 979'a iner, ikisi birlikte 697'ye; her yerleşimde aynı 19 ihlal hiç kapanmaz.

Önceki beş denetim çalıştırılabilir metne bakıyordu: kaynak kodu, çalışan uç, bağımlılık
envanteri, depo geçmişi, imaj katmanı. Depoda bir metin daha durur ve hiçbiri onu okumadı — imajın
**nerede, kaç kopya, hangi ağ kuralıyla ve hangi yetkiyle** koşacağını tanımlayan şablonlar.
Buradaki tek bir alan, imajın içindeki bütün bulgulardan daha geniş bir yol açabilir.

**Kod olarak altyapı taraması**, bu şablonları dağıtımdan önce bir kural setinden geçiren
denetimdir. Ayırt edici yanı zamanlamasıdır: kural, kaynak henüz oluşmadan koşar ve durdurduğu
kalemde ortada düzeltilecek bir kaynak bile olmaz. Ama bu zamanlamanın kendi sınırı vardır ve bu
ders onu sayar — şablon metni her zaman ne olacağını söylemez.

- **OD30.** Kaynak tanımlarının metin olarak yazılması bu kursta **girdidir**; şablon yazımı ve
  kural yazımı tekrarlanmaz. Aşağıdaki 420 kalem, beş şablondaki alanların **kurgu** bir
  modelidir. Bir **kalem** bir kaynak tanımındaki bir alandır.
- **OD31.** Her alan sınıfı için yazılmış bir kural yoktur. Kuralsız kalem hiçbir yerleşimde
  değerlendirilmez ve bu sayı ayarla değişmez.
- **OD32.** Bir alanın değeri her zaman şablon metninden okunamaz: bir bölümü dağıtım anında
  hesaplanır. Okunamayan alanda kural kesin karar veremez; sonuç **belirlenemez**dir.
- **OD33.** Değeri okunabilen alanda kural kesin karar verir. Bu denetimin okunabilir kalemde
  yanlış pozitifi yoktur; belirsizliğin tek kaynağı okunamayan değerdir.
- **OD34.** Dağıtımdan önce durdurulan kalemde kaynak hiç oluşmaz. Dağıtımdan sonra bulunan
  kalemde kaynak vardır ve düzeltmesi bir dağıtım daha ister.
- **OD35.** Şablon taraması yapı başına 2, çalışan kaynak denetimi koşum başına 9, bloke yapı
  başına 20 model dakikası. **Maruziyet** yapı-kalem birimindedir. Süreler **veridir**.

## Kesin, Belirlenemez ve Kuralsız

```js
// sablon.mjs — kaynak tanimi sablonlari kural setinden geciriliyor; olculen sey
// dagitimdan once kesin karar verilebilen kalem ile belirlenemeyen kalemdir. MODELDIR.
export const TOHUM = 20260411, KALEM = 420;
const uretec = (t) => { let s = t >>> 0;
  return () => (s = (s * 1664525 + 1013904223) >>> 0) / 4294967296; };
const r = uretec(TOHUM);

// Her kalem bir kaynak tanimindaki bir alandir. kuralVar: o alan sinifi icin yazilmis
// bir kural olup olmadigi. okunur: alanin degerinin sablon metninden okunabilme
// olasiligi — sabit yazilmis deger okunur, dagitimda uretilen deger okunmaz.
export const SINIF = [
  ["ag erisim kurali", 0.18, 0.26, 0.95, 0.86],
  ["depo gorunurlugu", 0.12, 0.31, 0.95, 0.62],
  ["kimlik yetkisi", 0.16, 0.34, 0.95, 0.41],
  ["sifreleme ayari", 0.14, 0.19, 0.95, 0.78],
  ["kayit toplama", 0.11, 0.22, 0.95, 0.70],
  ["kaynak siniri", 0.15, 0.15, 0.00, 0.88],
  ["etiket ve sahiplik", 0.14, 0.11, 0.00, 0.93],
].map(([ad, pay, ihlal, kural, okunur]) => ({ ad, pay, ihlal, kural, okunur }));
const sec = (u) => { let t = 0;
  for (const s of SINIF) { t += s.pay; if (u < t) return s; } return SINIF.at(-1); };

export const KALEMLER = Array.from({ length: KALEM }, (_, i) => {
  const s = sec(r());
  return { i, sinif: s, ihlal: r() < s.ihlal, okunur: r() < s.okunur,
    kuralVar: r() < s.kural, dogus: Math.floor(r() * 60) };
});

// Dagitimdan once verilen karar: kural yoksa sessiz, deger okunamiyorsa belirlenemez.
export const karar = (k) => !k.kuralVar ? "kuralsiz"
  : !k.okunur ? "belirlenemez" : k.ihlal ? "ihlal" : "uygun";

const gen = (B) => (h) => h.map((v, j) => (j ? String(v).padStart(B[j])
  : String(v).padEnd(B[0]))).join("");

if (import.meta.url === `file://${process.argv[1]}`) {
  const ihlaller = KALEMLER.filter((k) => k.ihlal);
  console.log(`model (tohum ${TOHUM}): ${KALEM} sablon kalemi, ${ihlaller.length} tanesi ` +
    `gercek ihlal; ${KALEMLER.filter((k) => !k.kuralVar).length} kalem icin yazilmis kural yok`);
  const y1 = gen([20, 8, 8, 11, 9, 15, 13]);
  console.log("\n" + y1(["alan sinifi", "kalem", "ihlal", "kuralsiz", "ihlal+", "belirlenemez",
    "bel. ihlal"]));
  for (const s of SINIF) {
    const l = KALEMLER.filter((k) => k.sinif === s);
    const b = l.filter((k) => karar(k) === "belirlenemez");
    console.log(y1([s.ad, l.length, l.filter((k) => k.ihlal).length,
      l.filter((k) => karar(k) === "kuralsiz").length,
      l.filter((k) => karar(k) === "ihlal").length, b.length,
      b.filter((k) => k.ihlal).length]));
  }

  const bel = KALEMLER.filter((k) => karar(k) === "belirlenemez");
  const kuralsiz = KALEMLER.filter((k) => karar(k) === "kuralsiz");
  const kesinIhlal = KALEMLER.filter((k) => karar(k) === "ihlal");
  const y2 = gen([26, 10, 9, 12, 14]);
  console.log("\nbelirlenemez kalem iki ayri sekilde ele alinabilir");
  console.log(y2(["ele alis", "bulgu", "gercek", "yanlis+", "kacan ihlal"]));
  for (const [ad, kume] of [["belirlenemez gecer", kesinIhlal],
    ["belirlenemez durdurur", [...kesinIhlal, ...bel]]]) {
    const g = kume.filter((k) => k.ihlal).length;
    console.log(y2([ad, kume.length, g, kume.length - g, ihlaller.length - g]));
  }
  console.log(`\ngecirme secildiginde ${bel.filter((k) => k.ihlal).length} gercek ihlal ` +
    `dagitimdan once gorulmuyor; durdurma secildiginde ${bel.filter((k) => !k.ihlal).length} ` +
    `uygun kalem bosuna durduruluyor. Iki secenegin arasinda ucuncu bir deger yok`);
  console.log(`her iki secenekte de ${kuralsiz.filter((k) => k.ihlal).length} ihlal kural ` +
    `yazilmadigi icin hic degerlendirilmiyor; bu sayi ele alisla degismez`);
}
```

```
model (tohum 20260411): 420 sablon kalemi, 100 tanesi gercek ihlal; 132 kalem icin yazilmis kural yok

alan sinifi            kalem   ihlal   kuralsiz   ihlal+   belirlenemez   bel. ihlal
ag erisim kurali          85      22          3       18              8            3
depo gorunurlugu          48      16          1        8             22            8
kimlik yetkisi            66      21          3       10             39           11
sifreleme ayari           57      18          2       15             15            3
kayit toplama             44       5          3        4              7            1
kaynak siniri             59      10         59        0              0            0
etiket ve sahiplik        61       8         61        0              0            0

belirlenemez kalem iki ayri sekilde ele alinabilir
ele alis                       bulgu   gercek     yanlis+   kacan ihlal
belirlenemez gecer                55       55           0            45
belirlenemez durdurur            146       81          65            19

gecirme secildiginde 26 gercek ihlal dagitimdan once gorulmuyor; durdurma secildiginde 65 uygun kalem bosuna durduruluyor. Iki secenegin arasinda ucuncu bir deger yok
her iki secenekte de 19 ihlal kural yazilmadigi icin hic degerlendirilmiyor; bu sayi ele alisla degismez
```

İkinci tablonun ilk satırı bu denetimi öncekilerden ayıran şeyi yazıyor: 55 bulgunun 55'i
gerçektir, yanlış pozitif sıfırdır. Statik çözümleme bir kod konumunun tehlikeli olup olmadığını
tahmin ediyordu; burada kural bir alanın yazılı değerini okur ve karşılaştırır. Değeri okunabilen
kalemde tahmin yoktur. **Bu denetimin belirsizliği bulgu üretme biçiminden değil, okuyamadığı
alandan gelir.**

O alan ilk tablonun altıncı sütununda duruyor. 420 kalemin 91'i belirlenemez: değeri dağıtım
anında hesaplandığı için kural karar veremiyor. Dağılım sınıflara göre keskin biçimde ayrışıyor.
Kimlik yetkisi sınıfının 66 kaleminin 39'u belirlenemez — yetkinin kime verildiği çoğunlukla
dağıtımda çözülen bir başvurudur. Ağ erişim kuralı sınıfında aynı sayı 85 kalemde yalnız 8'dir,
çünkü adres aralıkları şablona yazılıdır. **Şablon taramasının kapsaması alan sınıfına göre
değişir ve bu değişkenliğin kaynağı kural setinin olgunluğu değil, değerin ne zaman
belirlendiğidir.**

İkinci tablo bu belirsizliğin iki ucunu ölçüyor ve arada bir seçenek yok. Belirlenemez kalemi
geçirmek 55 kesin bulguyla kapanır ve 26 gerçek ihlali dağıtımdan önce hiç göstermez. Durdurmak
bulguyu 146'ya çıkarır, 81 gerçek ihlali yakalar, ama 65 uygun kalemi boşuna bloklar — raporun
yüzde 44,5'i yanlış pozitife dönüşür. Bu kursun ilk dersindeki eşik takasının aynısıdır, ama
düğme burada bir sayı değil bir varsayımdır: okunamayan değer iyi mi kabul edilecek, kötü mü.

Son sayı ikisinin de dışında. 132 kalem için yazılmış bir kural yoktur ve bunların 19'u gerçek
ihlaldir. Kaynak sınırı ile etiket ve sahiplik sınıflarında kural seti hiç bakmaz. Bu 19 kalem
belirlenemez de değildir — değerleri okunabilir durumdadır, yalnız soran yoktur. **Bir şablon
taramasının raporunda "ihlal yok" yazan alan sınıfı, ya uygun olan ya da hiç sorulmamış olandır.**

## Kapı mı, Sonraki Koşum mu

```js
// yerlesim.mjs — ayni kural seti dagitimdan once ve sonra kosuyor; olculen sey bloke
// edilen yapi ile kaynak olustuktan sonra gecen maruziyettir. Sureler MODELDIR.
import { KALEMLER, karar } from "./sablon.mjs";

const YAPI = 60, DENETIM = 5, DUZELTME = 3;
const SABLON_DK = 2, CALISAN_DK = 9, BLOKE_DK = 20;

// kapi: dagitimdan once neyi durdurur. Durdurulan kalemde kaynak hic olusmaz.
// sonra: calisan kaynagi okuyan denetim; orada belirsiz deger yoktur, ama kalem
// zaten uretimdedir ve duzeltmesi bir dagitim daha ister.
function olc(ad, kapi, sonra, sablonTarar) {
  const durdurulan = new Map(), uretimde = new Map();
  for (const k of KALEMLER) {
    if (kapi(k)) durdurulan.set(k.dogus, [...(durdurulan.get(k.dogus) || []), k]);
    else if (k.ihlal) uretimde.set(k, null);
  }
  const bloke = durdurulan.size;
  const yanlisBloke = [...durdurulan.values()].filter((l) => !l.some((k) => k.ihlal)).length;
  let maruziyet = 0, kosum = 0;
  for (let y = 0; y < YAPI; y++) {
    if (sonra && y % DENETIM === DENETIM - 1) {
      kosum++;
      for (const [k, kapanis] of uretimde)
        if (kapanis === null && k.kuralVar && k.dogus <= y) uretimde.set(k, y + DUZELTME);
    }
    for (const [k, kapanis] of uretimde)
      if (k.dogus <= y && (kapanis === null || y < kapanis)) maruziyet++;
  }
  return { ad, bloke, yanlisBloke, ulasan: uretimde.size,
    kapanmayan: [...uretimde.values()].filter((v) => v === null).length, maruziyet,
    dk: Math.round((sablonTarar ? YAPI * SABLON_DK : 0) + kosum * CALISAN_DK +
      bloke * BLOKE_DK) };
}

const YERLESIM = [
  olc("once: kesin ihlal durur", (k) => karar(k) === "ihlal", false, true),
  olc("once: belirlenemez de durur",
    (k) => karar(k) === "ihlal" || karar(k) === "belirlenemez", false, true),
  olc("yalniz dagitimdan sonra", () => false, true, false),
  olc("once kesin + sonra denetim", (k) => karar(k) === "ihlal", true, true),
];

const gen = (B) => (h) => h.map((v, j) => (j ? String(v).padStart(B[j])
  : String(v).padEnd(B[0]))).join("");
const y = gen([28, 8, 14, 9, 13, 12, 11]);
console.log(`${YAPI} yapi; kaynak olustuktan sonra her yapida acik kalan ihlal maruziyet ` +
  `sayilir. Dagitim sonrasi denetim ${DENETIM} yapida bir kosar, duzeltme ${DUZELTME} yapi surer`);
console.log(y(["yerlesim", "bloke", "yanlis bloke", "ulasan", "kapanmayan",
  "maruziyet", "toplam dk"]));
for (const o of YERLESIM) {
  console.log(y([o.ad, o.bloke, o.yanlisBloke, o.ulasan, o.kapanmayan, o.maruziyet, o.dk]));
}

const [kesin, genis, sadeceSonra, ikisi] = YERLESIM;
console.log(`\ndagitimdan once duran kapi ${kesin.ulasan} ihlali uretime birakiyor ve ` +
  `${kesin.bloke} yapi durduruyor; kapiyi belirlenemez kalemlere genisletmek ulasani ` +
  `${genis.ulasan}'a indiriyor ama ${genis.yanlisBloke} yapiyi bosuna durduruyor`);
console.log(`yalniz dagitimdan sonra tarayan denetim hicbir yapiyi durdurmuyor ve ` +
  `${sadeceSonra.ulasan} ihlalin ${sadeceSonra.ulasan - sadeceSonra.kapanmayan} tanesini ` +
  `kapatiyor; maruziyeti ${sadeceSonra.maruziyet}, yani kesin kapinin ` +
  `${(sadeceSonra.maruziyet / kesin.maruziyet).toFixed(2)} kati`);
console.log(`ikisini birlikte kosturmak maruziyeti ${ikisi.maruziyet} yapi-kaleme indiriyor; ` +
  `geriye kalan ${ikisi.kapanmayan} ihlal her yerlesimde ayni, cunku o alan sinifi icin ` +
  `yazilmis kural yok`);
```

```
60 yapi; kaynak olustuktan sonra her yapida acik kalan ihlal maruziyet sayilir. Dagitim sonrasi denetim 5 yapida bir kosar, duzeltme 3 yapi surer
yerlesim                       bloke  yanlis bloke   ulasan   kapanmayan   maruziyet  toplam dk
once: kesin ihlal durur           34             0       45           45        1339        800
once: belirlenemez de durur       52             9       19           19         572       1160
yalniz dagitimdan sonra            0             0      100           19         979        108
once kesin + sonra denetim        34             0       45           19         697        908

dagitimdan once duran kapi 45 ihlali uretime birakiyor ve 34 yapi durduruyor; kapiyi belirlenemez kalemlere genisletmek ulasani 19'a indiriyor ama 9 yapiyi bosuna durduruyor
yalniz dagitimdan sonra tarayan denetim hicbir yapiyi durdurmuyor ve 100 ihlalin 81 tanesini kapatiyor; maruziyeti 979, yani kesin kapinin 0.73 kati
ikisini birlikte kosturmak maruziyeti 697 yapi-kaleme indiriyor; geriye kalan 19 ihlal her yerlesimde ayni, cunku o alan sinifi icin yazilmis kural yok
```

Birinci satır dağıtımdan önce koşmanın kazancını yazıyor: 34 yapı duruyor, hiçbiri boşuna
durmuyor ve durdurulan 55 kalemde kaynak hiç oluşmuyor. Ama aynı satırın maruziyet sütunu
1 339 yapı-kalem. Kapının geçirdiği 45 ihlal üretime ulaşıyor ve hiçbiri kapanmıyor, çünkü bu
yerleşimde onları arayan başka bir denetim yok.

Üçüncü satır sıralamayı bozuyor. Yalnız dağıtımdan sonra çalışan kaynağı okuyan denetim hiçbir
yapıyı durdurmuyor, 108 model dakikası harcıyor — kesin kapılı yerleşimin yedide birinden az — ve
maruziyeti 979 yapı-kaleme indiriyor: kesin kapının **0,73 katı**. Nedeni birinci bölümde
yazılıydı. Çalışan kaynakta belirlenemez alan yoktur; değer artık hesaplanmıştır ve okunur.
Dağıtımdan önce koşan kural 26 ihlali hiç görmüyordu, dağıtımdan sonra koşan denetim hepsini
görüyor. **Erken koşmak her zaman daha çok yakalamak demek değildir; şablon metninin
söyleyemediği şeyi hiçbir erken kural söyleyemez.**

İkinci satır bu boşluğu kapının kendisiyle kapatmayı deniyor ve en düşük maruziyeti veriyor: 572.
Bedeli iki sütunda yazılı — 52 bloke yapı, 9'u boşuna, toplam 1 160 dakika. Bu, birinci bölümdeki
takasın hattaki karşılığıdır: belirsizliği ihlal saymak maruziyeti yarıya indirir ve her altıncı
durdurmayı gereksiz kılar.

Dördüncü satır ikisini birleştiriyor. Kesin ihlaller dağıtımdan önce durur — 34 yapı, sıfır
boşuna — ve kalanı beş yapıda bir koşan çalışan kaynak denetimi kapatır. Maruziyet 697,
toplam 908 dakika. Her iki denetim de aynı 19 ihlali görmez ve bu sayı dört yerleşimde de aynıdır.
**İki denetimi de koşturmak, kural seti sessiz kalan alan sınıfını sesli kılmaz.**

## Özet

- Şablon taraması okunabilir alanda yanlış pozitif üretmez: 55 kesin bulgunun 55'i gerçektir.
  Belirsizliğin tek kaynağı değeri dağıtımda hesaplanan alandır.
- 420 kalemin 91'i belirlenemezdir ve dağılım sınıfa göre keskin ayrışır: kimlik yetkisinde 66
  kalemin 39'u, ağ erişim kuralında 85 kalemin 8'i.
- Belirlenemez kalemin iki ele alışı arasında orta yol yoktur: geçirmek 26 gerçek ihlali görünmez
  kılar, durdurmak 65 uygun kalemi boşuna bloklar ve raporun yüzde 44,5'ini yanlış pozitife çevirir.
- Kural yazılmamış 132 kalemdeki 19 ihlal hiçbir ele alışta ve hiçbir yerleşimde görünmez; bu sayı
  ayarla da yerleşimle de değişmez.
- Erken koşmak her zaman daha çok yakalamak değildir: kesin kapı 34 yapı durdurup 1 339 yapı-kalem
  maruziyet bırakır, yalnız dağıtımdan sonra tarayan denetim hiçbir yapıyı durdurmadan 979'a iner,
  çünkü çalışan kaynakta belirlenemez alan yoktur.
- İkisini birlikte koşturmak maruziyeti 697 yapı-kaleme, toplam bedeli 908 dakikaya getirir ve
  sıfır boşuna blokajla çalışır.

## Sonraki Adım

Altı denetim, her değişiklikte neyin tarandığını ve neyin kaçtığını saydı: kod konumu, çalışan uç,
bağımlılık kaydı, depo geçmişi, imaj katmanı, şablon alanı. Hepsinin ortak bir varsayımı vardı —
taranan şey **elde duran metindi**. Oysa bu ölçümlerin kendisi tersini söylüyor. İmajın 144
bulgusunun 75'i kimsenin yazmadığı temel katmandan geliyordu, bağımlılık envanterinin 210
bileşeninin 186'sı bildirim dosyasında adı bile geçmeyen geçişli bileşenlerdi. Üretime giden
yapının büyük bölümü başka yerde üretilmiştir ve o parçalar için sorulacak soru "içinde ne var"
değildir; **onu kimin, neyden, hangi ortamda ürettiğidir**. Sonraki konu bu soruyu ölçülebilir
hale getirir: bir yapı çıktısının taşıdığı bileşen listesi hangi soruları cevaplayabiliyor, bir
imza neyi kanıtlıyor ve neyi kanıtlamıyor, köken belgesindeki hangi iddia gerçekten
doğrulanabiliyor.
