---
title: 'Güvenlik Operasyon Merkezi'
source: 'https://academia.sh/tr/kurslar/guvenlik-operasyonlari/guvenlik-operasyon-merkezi'
course: 'Güvenlik Operasyonları ve Olay Müdahalesi'
language: tr
updated: '2026-08-17T18:08:41+00:00'
license: 'CC BY-SA 4.0'
---

# Güvenlik Operasyon Merkezi

Kurgu bir hatta düşen 273 uyarı üç kişilik vardiyaya karşı ölçülür: günün işi 1.506 dakika, kapasite 1.440 dakika; yirmi dört saati eşit bölen plan 64 uyarıya hiç baktırmıyor ve medyan beklemeyi 222 dakikaya çıkarıyor, yoğunluğa yaslanan plan sekiz saati kapsamasız bırakıp bunu 13 uyarıya ve 83 dakikaya indiriyor. 26 vakanın 19'u devir noktasını aşıyor; devir notu boşken 19 vaka hiç birleşmiyor ve medyan vaka kararı 987 dakika, altı kalemlik notta birleşmeyen sıfıra iniyor ve medyan 273 dakikaya düşüyor, on iki kalemde ise devir 72 dakika yiyip hiç bakılmayan uyarıyı 26'ya çıkarıyor.

Bir önceki kurs on sekiz derste her savunma adımının geride kaç kayıt bıraktığını saydı. O sayım
sessiz bir varsayım taşıyordu: kaydın okunduğu. Bu kurs varsayımı kaldırır ve kaydı okuyan yapıyı
ölçer. Ölçü birimi de değişir — sayılan şey artık kayıt sayısı değil, **süredir**. Olayın
gerçekleşmesi ile onun bir uyarı olarak görülmesi arasında geçen süreye **fark etme süresi** (time
to detect), görüldükten sonra durdurulmasına kadar geçen süreye **sınırlama süresi** (time to
contain) denir. Kursun bütün ölçümleri bu ikisinden birine bağlanır.

Güvenlik operasyon merkezi bir oda değil, bir kapasite ve bir devir düzenidir. Bu ders o düzenin
iki sayısını çıkarır: kaç saatlik pencerede kaç uyarı kime düşüyor, ve vardiya değişiminde kaç
kalem kayboluyor. Nöbet politikası — kimin çağrılacağı, hangi eşikte yükseltileceği — DevOps
Gözlemlenebilirlik kursunda ölçülmüştü; burada ölçülen şey çağrı değil, sürekli bir hattın
kapasitesidir.

- **TA1.** Bölgesel ölçüm ağı **kurgudur**: sayaç toplayıcılar, abone portalı ve şube uçları
  kayıtlarını merkezî bir hatta gönderir. Hat günde 273 uyarı üretir. Sayılar ve süreler
  **veridir**, ölçüm değildir.
- **TA2.** Merkez üç kişiliktir, kişi başına sekiz saatlik vardiya. Günlük kapasite
  3 × 8 × 60 = 1.440 analist-dakikadır.
- **TA3.** Uyarı beş türdendir. Her türün iki sayısı vardır: ortalama inceleme dakikası ve **olayın
  gerçekleşmesi ile kaydın hatta düşmesi arasındaki dakika**.
- **TA4.** Bir analist aynı anda tek uyarı inceler ve vardiyası biterken tamamlayamayacağı işi
  almaz. Nöbette kimse yoksa uyarı bekler.
- **TA5.** Vaka, aynı kurgu aktöre ait ve 30–240 dakikaya yayılan 2–5 uyarıdır. Bu bağ **kayıtta
  yazılı değildir**; analistin belleğindedir.
- **TA6.** Devir notu kalem başına iki dakika tutar ve devralan analistin inceleme kapasitesinden
  düşer.

## Bir Günün Akışı ve İki Vardiya Planı

```js
// vardiya.mjs — kurgu uyari akisi ve uc kisilik vardiya duzeni. MODELDIR.
// Bolgesel olcum agi kurgudur; gercek kurum, adres ve olay adi yoktur.
// Uretec kendi yazilmistir, tohum asagida gorunur.
export const TOHUM = 20260401;
const uretec = (t) => { let s = t >>> 0;
  return () => (s = (s * 1664525 + 1013904223) >>> 0) / 4294967296; };
const r = uretec(TOHUM);
const tam = (n) => Math.floor(r() * n);

// Saat basina uyari sayisi (kurgu veri, olcum degil): is saatlerinde yogun.
const YOGUNLUK = [4, 3, 3, 2, 2, 3, 6, 11, 18, 22, 24, 21,
                  19, 23, 25, 22, 17, 12, 9, 7, 6, 5, 5, 4];
// [tur, yuzde pay, ortalama inceleme dakikasi, olay ile kaydin dusmesi arasindaki dakika]
const TUR = [["kimlik-dogrulama", 34, 3, 1], ["ag-akisi", 26, 4, 5],
             ["uc-nokta", 22, 8, 2], ["veri-erisimi", 12, 11, 12],
             ["yonetim-duzlemi", 6, 6, 9]];

export const UYARI = [];
for (const [s, n] of YOGUNLUK.entries())
  for (let k = 0; k < n; k++) {
    let p = tam(100), t = TUR[0];
    for (const kalem of TUR) { if (p < kalem[1]) { t = kalem; break; } p -= kalem[1]; }
    UYARI.push({ id: UYARI.length, varis: s * 60 + tam(60), tur: t[0],
      is: Math.max(1, t[2] + tam(5) - 2), gecik: t[3] });
  }
UYARI.sort((a, b) => a.varis - b.varis);

// Vardiya plani: [ad, baslangic saati, bitis saati]. Uc kisi, kisi basina sekiz saat.
export const PLAN = {
  "esit bolunmus": [["N1", 0, 8], ["N2", 8, 16], ["N3", 16, 24]],
  "yogunluga yasli": [["N1", 6, 14], ["N2", 10, 18], ["N3", 14, 22]],
};

// Kuyruk benzetimi: bir uyari ancak nobetteki bir analist bosaldiginda incelenir.
export function kosturt(vardiyalar, hazirlik = []) {
  const bos = vardiyalar.map(([, b], i) => b * 60 + (hazirlik[i] || 0));
  const bit = vardiyalar.map(([, , s]) => s * 60);
  const sonuc = [];
  for (const u of UYARI) {
    let en = -1;
    for (const [i, v] of bos.entries()) {
      const bas = Math.max(v, u.varis);
      if (bas + u.is > bit[i]) continue;            // vardiya biterken yeni is alinmaz
      if (en < 0 || bas < Math.max(bos[en], u.varis)) en = i;
    }
    if (en < 0) { sonuc.push({ ...u, analist: null, bekleme: null }); continue; }
    const bas = Math.max(bos[en], u.varis);
    bos[en] = bas + u.is;
    sonuc.push({ ...u, analist: vardiyalar[en][0], bekleme: bas - u.varis, kapanis: bos[en] });
  }
  return sonuc;
}

const dk = (v) => v.slice().sort((a, b) => a - b)[Math.floor(v.length / 2)];
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 yz = gen([18, 12, 16, 13, 14, 13]), yt = gen([18, 8, 12, 14]);
  console.log(`model (tohum ${TOHUM}): ${UYARI.length} uyari, toplam ` +
    `${UYARI.reduce((a, u) => a + u.is, 0)} dakika inceleme isi; ` +
    `uc analistin kapasitesi 3 x 8 x 60 = 1440 dakika`);
  console.log(yt(["tur", "uyari", "kayit gec.", "inceleme dk"]));
  for (const [ad, , , g] of TUR) {
    const l = UYARI.filter((u) => u.tur === ad);
    console.log(yt([ad, l.length, `${g} dk`, l.reduce((a, u) => a + u.is, 0)]));
  }
  console.log();
  console.log(yz(["plan", "kapsamasiz", "hic bakilmayan", "medyan bek.", "en uzun bek.",
    "30 dk asan"]));
  for (const [ad, v] of Object.entries(PLAN)) {
    const s = kosturt(v), bakilan = s.filter((u) => u.analist !== null);
    const kapsanan = new Set(v.flatMap(([, b, e]) =>
      Array.from({ length: e - b }, (_, i) => b + i)));
    console.log(yz([ad, `${24 - kapsanan.size} saat`, s.length - bakilan.length,
      dk(bakilan.map((u) => u.bekleme)), Math.max(...bakilan.map((u) => u.bekleme)),
      bakilan.filter((u) => u.bekleme > 30).length]));
  }
  console.log("\nyogunluga yasli planda analist basina dusen (kurgu gun):");
  const s2 = kosturt(PLAN["yogunluga yasli"]), y2 = gen([8, 8, 10, 12, 14]);
  console.log(y2(["analist", "uyari", "is dakika", "bos dakika", "en uzun bek."]));
  for (const [ad, b, e] of PLAN["yogunluga yasli"]) {
    const l = s2.filter((u) => u.analist === ad), is = l.reduce((a, u) => a + u.is, 0);
    console.log(y2([ad, l.length, is, (e - b) * 60 - is, Math.max(...l.map((u) => u.bekleme))]));
  }
}
```

```
model (tohum 20260401): 273 uyari, toplam 1506 dakika inceleme isi; uc analistin kapasitesi 3 x 8 x 60 = 1440 dakika
tur                  uyari  kayit gec.   inceleme dk
kimlik-dogrulama       104        1 dk           308
ag-akisi                68        5 dk           271
uc-nokta                53        2 dk           439
veri-erisimi            39       12 dk           430
yonetim-duzlemi          9        9 dk            58

plan                kapsamasiz  hic bakilmayan  medyan bek.  en uzun bek.   30 dk asan
esit bolunmus           0 saat              64          222           477          161
yogunluga yasli         8 saat              13           83           363          260

yogunluga yasli planda analist basina dusen (kurgu gun):
analist    uyari is dakika  bos dakika  en uzun bek.
N1            85       480           0           363
N2            86       480           0           101
N3            89       479           1           127
```

İlk satır dersin sınırını veriyor: günün işi 1.506 dakika, kapasite 1.440 dakika. Doluluk yüzde
yüzü aşıyor ve bu, hiçbir vardiya düzeninin kurtaramayacağı bir açıktır. Ama açığın **nereye
düştüğü** düzene bağlıdır ve iki plan bunu ters yönlerde gösteriyor.

Tür tablosu ilk sütunu veriyor: kaydın olaydan kaç dakika sonra düştüğü. Kimlik doğrulama kaydı bir
dakikada geliyor, veri erişimi kaydı on iki dakikada. Bu, hattın hiç bilmediği bir gecikmedir —
kayıt hatta düştüğünde olay zaten on iki dakika önce olmuştur ve kuyruk ondan sonra başlar.

Yirmi dört saati eşit bölen plan **kapsamayı** tam sağlıyor: kapsamasız saat sıfır. Karşılığında 64
uyarıya hiç bakılmıyor ve medyan bekleme 222 dakika. Neden açıktır: gece vardiyası saatte üç uyarı
alıp boş bekliyor, gündüz vardiyası saatte yirmi beş uyarıyla karşılaşıp kuyruğu büyütüyor.
**Kapsama bir kapasite ölçüsü değildir.** Nöbette birinin bulunması, o kişinin o saatteki yükü
karşılayabildiği anlamına gelmez.

Yoğunluğa yaslanan plan sekiz saati tümüyle kapsamasız bırakıyor — 22:00 ile 06:00 arasında hiç
kimse yok. Buna karşılık hiç bakılmayan uyarı 64'ten 13'e, medyan bekleme 222'den 83 dakikaya
iniyor. İki sütun ters yönde hareket ediyor: otuz dakikayı aşan uyarı 161'den 260'a **çıkıyor**.
Bunun nedeni sayının tanımıdır — eşit bölünmüş planda 64 uyarı hiç incelenmediği için hiçbir
bekleme sütununa girmiyor. Kaybolan kalem ortalamayı iyileştirir.

Son tablo üç analistin de dolu olduğunu söylüyor: boş dakika 0, 0 ve 1. Yük dengeli dağılmış
görünüyor, ama en uzun bekleme sütunu bunun ne pahasına olduğunu yazıyor. N1'in devraldığı bir uyarı
363 dakika kuyrukta beklemiş; gece düşen kayıt sabah altıya kadar kimsenin önünde değildir. Fark
etme süresi bu modelde üç parçadan oluşur ve üçü de tabloda ayrı ayrı okunuyor: kaydın olaydan kaç
dakika sonra düştüğü, kuyrukta kaç dakika beklediği ve incelemenin kaç dakika sürdüğü.

## Devir Noktasında Birleşmeyen Vaka

Kuyruk süresi tek başına eksik bir ölçüdür, çünkü kararın uyarı başına verildiğini varsayar. Gerçek
karar çoğu zaman **birden çok uyarının birlikte okunmasıyla** verilir ve o bağı kuran şey bu modelde
analistin belleğidir. Vardiya değişimi tam olarak o belleğin sıfırlandığı andır.

```js
// devir.mjs — vardiya devrinde birlesmeden kalan vaka ve devir notunun bedeli. MODELDIR.
import { UYARI, PLAN, kosturt } from "./vardiya.mjs";

const uretec = (t) => { let s = t >>> 0;
  return () => (s = (s * 1664525 + 1013904223) >>> 0) / 4294967296; };
const r2 = uretec(760413);

// Vaka: ayni kurgu aktore ait, 30-240 dakikaya yayilan 2-5 uyari. Bagi analist kurar;
// kayitta yazili degildir. Kok uyarilar tohumla secilir.
const alinmis = new Set();
export const VAKA = [];
for (const u of UYARI) {
  if (alinmis.has(u.id) || r2() > 0.16 || VAKA.length === 26) continue;
  const grup = [u.id]; alinmis.add(u.id);
  for (const v of UYARI)
    if (!alinmis.has(v.id) && grup.length < 2 + Math.floor(r2() * 4) &&
        v.varis > u.varis + 30 && v.varis < u.varis + 240) { grup.push(v.id); alinmis.add(v.id); }
  VAKA.push(grup);
}

const V = PLAN["yogunluga yasli"];
const SON = V.map(([, , e]) => e * 60);

function gun(sinir) {
  const s = kosturt(V, [2 * sinir, 2 * sinir, 2 * sinir]);   // kalem basina iki dakika devir
  const d = new Map(s.map((u) => [u.id, u]));
  const tek = [], devir = [];
  for (const g of VAKA) {
    const kalem = g.map((i) => d.get(i));
    const gorulen = kalem.filter((u) => u.analist !== null);
    const kim = [...new Set(gorulen.map((u) => u.analist))];
    if (kim.length === 1 && gorulen.length === kalem.length)
      tek.push({ g, karar: Math.max(...kalem.map((u) => u.kapanis)) });
    else devir.push({ g, sinirIndeks: kim.length ? V.findIndex(([a]) => a === kim[0]) : 2,
      ilk: Math.min(...kalem.map((u) => u.varis)),
      son: Math.max(...gorulen.map((u) => u.kapanis), 0) });
  }
  let tasinan = 0, kalan = 0, korKalem = 0;
  for (const i of [0, 1, 2]) {
    const liste = devir.filter((v) => v.sinirIndeks === i).sort((a, b) => a.ilk - b.ilk);
    for (const [j, v] of liste.entries())
      if (j < sinir) { tasinan++; v.karar = Math.max(v.son, SON[i]) + 3; }
      else { kalan++; korKalem += v.g.length; v.karar = 1800; }   // ertesi gun 06:00
  }
  const sure = [...tek, ...devir]
    .map((v) => v.karar - Math.min(...v.g.map((i) => d.get(i).varis - d.get(i).gecik)))
    .sort((a, b) => a - b);
  return { tek: tek.length, devir: devir.length, tasinan, kalan, korKalem,
    devirDk: 6 * sinir, bakilmayan: s.filter((u) => u.analist === null).length,
    medyan: sure[Math.floor(sure.length / 2)] };
}

const gen = (B) => (h) => h.map((v, j) => (j ? String(v).padStart(B[j])
  : String(v).padEnd(B[0]))).join("");
const yz = gen([12, 12, 10, 12, 12, 11, 16, 12]);
console.log(`${VAKA.length} vaka var, ${VAKA.reduce((a, g) => a + g.length, 0)} uyari ` +
  `iceriyor; bagi kuran sey analistin bellegidir, kayitta yazili degildir`);
console.log(`bir vardiyada tek basina kapanan vaka ${gun(0).tek}, ` +
  `devir noktasini asan vaka ${gun(0).devir}`);
console.log();
console.log(yz(["not siniri", "devri asan", "tasinan", "birlesmeyen", "kayan uyari",
  "devir dk", "hic bakilmayan", "medyan vaka"]));
for (const sinir of [0, 2, 4, 6, 12]) {
  const g = gun(sinir);
  console.log(yz([`${sinir} vaka`, g.devir, g.tasinan, g.kalan, g.korKalem, g.devirDk,
    g.bakilmayan, `${g.medyan} dk`]));
}
```

```
26 vaka var, 128 uyari iceriyor; bagi kuran sey analistin bellegidir, kayitta yazili degildir
bir vardiyada tek basina kapanan vaka 7, devir noktasini asan vaka 19

not siniri    devri asan   tasinan birlesmeyen kayan uyari   devir dk  hic bakilmayan medyan vaka
0 vaka                19         0          19          94          0              13      987 dk
2 vaka                18         6          12          59         12              15      528 dk
4 vaka                18        12           6          29         24              18      436 dk
6 vaka                18        18           0           0         36              18      273 dk
12 vaka               20        20           0           0         72              26      285 dk
```

Yirmi altı vakanın yalnız yedisi tek bir vardiyada kapanıyor; **on dokuzu devir noktasını aşıyor**.
Bu oran modelin bir sonucu değil, sürelerin aritmetiğidir: bir vaka en çok dört saate yayılıyor,
vardiya sekiz saat, kuyruk beklemesi de eklendiğinde bir vakanın iki analiste düşmesi olağan hâle
geliyor.

Devir notu boşken 19 vaka hiç birleşmiyor. Bu, o vakaların uyarılarının **incelenmediği** anlamına
gelmez — 94 uyarının hepsi tek tek açılıp tek tek kapanıyor. Kaybolan şey uyarı değil, uyarılar
arasındaki bağdır ve bağ olmadan her uyarı tek başına önemsiz görünür. Medyan vaka kararı 987
dakikaya, yani on altı saate çıkıyor.

Not sınırını altı kaleme çıkarmak birleşmeyen vakayı sıfırlıyor ve medyanı 273 dakikaya indiriyor.
Bedeli tabloda yazılı: 36 analist-dakika devir toplantısına gidiyor ve hiç bakılmayan uyarı 13'ten
18'e çıkıyor. On iki kalemde ise eğri döner — birleşmeyen vaka zaten sıfırdır, devir 72 dakika yer,
hiç bakılmayan uyarı 26'ya fırlar ve medyan 273'ten 285 dakikaya **geri çıkar**. Karar süresini
kısaltmak için harcanan kapasite, bir noktadan sonra karar süresini uzatır.

İki yönlü bedel bu tabloda birlikte okunuyor. Geç kararın bedeli, on altı saat boyunca vakanın
açık kalmasıdır; bu sürede kaç kaleme daha erişildiği bu modelde yazılı değildir ve sonraki
derslerde sayılacaktır. Erken kararın bedeli ise kapasitedir: devre ayrılan her dakika bir uyarının
hiç açılmaması demektir.

## Özet

- Kurgu hattın günlük işi 1.506 dakika, üç kişilik vardiyanın kapasitesi 1.440 dakikadır; doluluk
  yüzde yüzü aştığında düzen açığı kapatmaz, yalnız nereye düşeceğini belirler.
- Yirmi dört saati eşit bölen plan kapsamasız saati sıfırlıyor ama 64 uyarıya hiç baktırmıyor ve
  medyan beklemeyi 222 dakikaya çıkarıyor; kapsama bir kapasite ölçüsü değildir.
- Yoğunluğa yaslanan plan sekiz saati kapsamasız bırakıp hiç bakılmayanı 13'e, medyan beklemeyi 83
  dakikaya indiriyor; otuz dakikayı aşan uyarının 161'den 260'a çıkması, kaybolan kalemin
  ortalamayı iyileştirmesindendir.
- Yirmi altı vakanın 19'u devir noktasını aşıyor; devir notu boşken hiçbiri birleşmiyor, 94 uyarı
  tek tek kapanıyor ve medyan vaka kararı 987 dakikada kalıyor.
- Altı kalemlik devir notu birleşmeyen vakayı sıfırlayıp medyanı 273 dakikaya indiriyor; on iki
  kalemde devir 72 dakika yiyor, hiç bakılmayan uyarı 26'ya çıkıyor ve medyan 285 dakikaya geri
  dönüyor.

## Sonraki Adım

Devir notunun yaptığı iş, bir analistin belleğindeki bağı yazıya geçirmekti. O bağı en baştan
kayıtta kurmak, yani iki uyarının aynı aktöre ait olduğunu makinenin görebilmesi, bu dersin
modelinde varsayılmıştı. Gerçekte varsayılamaz: sayaç toplayıcının kaydı ile abone portalının kaydı
aynı kişiyi farklı alan adlarıyla, farklı zaman biçimiyle ve farklı ayrıntı düzeyiyle yazar. Sonraki
ders üç ayrı biçimdeki kurgu günlüğü tek şemaya oturtur ve kursun ölçü birimini kurar: kaç alan
eşleniyor, kaç alan hiçbir karşılığa oturmuyor ve eşlenemeyen alan hangi soruyu yanıtsız bırakıyor.
