İçeriğe geç
academia.sh

Ders 01 / 22

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.

İçindekiler

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ı

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

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

İ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