İçeriğe geç
academia.sh

Ders 06 / 17

Güvenlik Çerçeveleri

İşlev tabanlı çerçevenin yapısı ve kurgu bir kontrol kümesinde olgunluk hesabı: 5 işlev, 14 kategori ve 31 kontrol kaleminde genel olgunluğun 1,35 çıkması, 5 kontrolün düzey 0'da durması ve bir kategorinin hiçbir işleyen kontrole sahip olmaması, 31 kontrolün 15'inin kanıt üretmesi ve 25 kanıt kalemi vermesi, 45 adam-günlük bütçede boşluk önceliğiyle verim önceliğinin beş işlevi de farklı sıralaması ve verim sırasının ortalamayı 0,07 yükseltirken en zayıf işlevi 0,33 geride bırakması.

İçindekiler

Önceki konu bir liste bıraktı: kalemler sıralandı, seçenekler bedeliyle yarıştırıldı ve kıt bütçenin hangi kaleme gideceği sayıyla gerekçelendirildi. O listenin kurum içinden görünmeyen bir kusuru vardır — tamamı kurumun kendi dilinde yazılmıştır. Ölçütleri kurum seçti, ağırlıkları kurum verdi, sıralamayı kurum çıkardı. Dışarıdan bakan biri, bir alıcı, bir sigortacı ya da hizmeti satın alan başka bir kurum “güvenlik durumunuzu gösterin” dediğinde bu liste yanıt olmaz: karşı tarafın onu kendi listesiyle yan yana koyabileceği ortak bir eksen yoktur.

Güvenlik çerçevesi (security framework) o eksendir. Bir kurumun yaptığı güvenlik işini, kimin yaptığından ve hangi araçla yaptığından bağımsız olarak sayılabilir başlıklara bölen ortak bir sınıflandırmadır. Bu ders çerçeveyi yapısıyla ele alır ve tek bir soruya bağlar: aynı kontrol kümesi bu yapıya oturtulduğunda hangi sayı çıkıyor, o sayı neyi gösteriyor, neyi saklıyor. Ders boyunca hiçbir çerçeve, standart ya da kurum adı geçmez; ölçülen şey ad değil, yapının kendisidir.

İşlev, Kategori, Kontrol

İşlev tabanlı çerçeve üç katmanlıdır. En üstte işlev durur ve güvenlik işini birbirini izleyen beş başlığa böler: kimlik (neye sahibim, hangi riski taşıyorum), koruma (erişimi neyle daraltıyorum), tespit (olan biteni nasıl görüyorum), yanıt (görünce ne yapıyorum) ve kurtarma (sonrasında nasıl ayağa kalkıyorum). Her işlev kategorilere, her kategori tek tek kontrollere ayrılır. Bu bölünmenin işlevi şudur: farklı iki kurumun farklı araçlarla yaptığı işler aynı beş başlığa düşer, böylece iki kurum aynı tabloda karşılaştırılabilir.

İkinci katman olgunluk düzeyidir (maturity level) ve kontrolün varlığını değil, ne kadar kurumsallaştığını ölçer. Bu ayrım dersin ana kavramıdır: bir kontrolün var olması ile denetlenebilir biçimde işlemesi aynı şey değildir. Aşağıdaki model beş düzey kullanır — yok, belgesiz yapılıyor, belgeli, ölçülüyor, sürekli iyileştiriliyor.

  • CE1. Örnek kurum, dokuz kurs boyunca sürdürülen kurgu bölgesel ölçüm ağıdır: uç noktalar, ağ, kimlik, kiralanan hesaplar ve üç tedarikçi. Kontrol kümesi ve düzeyler kurgudur.
  • CE2. Çerçeve beş işlev, on dört kategori ve otuz bir kontrol kaleminden oluşur.
  • CE3. Olgunluk düzeyi 0–4 aralığındadır: 0 yok, 1 belgesiz yapılıyor, 2 belgeli, 3 ölçülüyor, 4 sürekli iyileştiriliyor.
  • CE4. Kategori olgunluğu kontrollerinin, işlev olgunluğu kategorilerinin ağırlıksız ortalamasıdır; genel olgunluk beş işlevin ortalamasıdır.
  • CE5. Bir kontrolü bir düzey yükseltmek 2 + 3 × mevcut düzey adam-gün tutar: düşük düzeyden çıkmak ucuz, yüksek düzeyi taşımak pahalıdır.
  • CE6. Kanıt üretimi düzeye bağlıdır: düzey 2’den itibaren bir belge, düzey 3’ten itibaren iki ölçüm kaydı daha üretilir. Düzey 0 ve 1 hiçbir kanıt kalemi üretmez.
// cerceve/olgunluk.mjs — islev tabanli cercevede olgunluk duzeyinin hesaplanmasi.
// MODELDIR: bolgesel olcum agi (kurgu); kontrol kumesi ve duzeyler kurgudur.
export const satir = (s) => s.trim().split("\n").map((l) => l.trim().split("|"));
export const gen = (B) => (...h) => h.map((v, j) =>
  (j ? String(v).padStart(B[j]) : String(v).padEnd(B[0]))).join("");

// islev | kategori | kategorideki kontrollerin olgunluk duzeyleri (0-4)
export const KATEGORI = satir(`
  kimlik|varlik envanteri|3 2 1
  kimlik|is baglami|2 2
  kimlik|risk degerlendirmesi|3 2
  koruma|erisim denetimi|3 3 2
  koruma|veri guvenligi|3 2 2
  koruma|bakim ve yama|2 1
  tespit|surekli izleme|2 1 1
  tespit|olay ayirdetme|1 0
  yanit|yanit plani|2 1
  yanit|bildirim|1 0
  yanit|azaltma|1 1
  kurtarma|kurtarma plani|1 0
  kurtarma|iyilestirme|0 0
  kurtarma|iletisim|1`)
  .map(([islev, ad, d]) => ({ islev, ad, duzey: d.split(" ").map(Number) }));

export const ISLEV = ["kimlik", "koruma", "tespit", "yanit", "kurtarma"];
export const kategoriler = (i) => KATEGORI.filter((k) => k.islev === i);
export const kOrt = (k) => k.duzey.reduce((a, b) => a + b, 0) / k.duzey.length;
export const iOrt = (i) => kategoriler(i).reduce((a, k) => a + kOrt(k), 0) / kategoriler(i).length;
// Bir kontrolu bir duzey yukseltmek 2 + 3 x mevcut duzey adam-gun tutar (kurgu).
export const gun = (d) => 2 + 3 * d;
// Kanit: duzey 2'den itibaren 1 belge, duzey 3'ten itibaren 2 olcum kaydi daha.
export const kanit = (d) => (d >= 2 ? 1 : 0) + (d >= 3 ? 2 : 0);

if (import.meta.url === `file://${process.argv[1]}`) {
  const kontrol = KATEGORI.flatMap((k) => k.duzey);
  console.log(`model: ${ISLEV.length} islev, ${KATEGORI.length} kategori, ` +
    `${kontrol.length} kontrol kalemi`);

  const y = gen([10, 9, 8, 10, 22, 9]);
  console.log("\n" + y("islev", "kategori", "kontrol", "olgunluk", "en zayif", "duzey 0"));
  for (const i of ISLEV) {
    const c = kategoriler(i), d = c.flatMap((k) => k.duzey);
    const enZayif = c.reduce((a, k) => (kOrt(k) < kOrt(a) ? k : a));
    console.log(y(i, c.length, d.length, iOrt(i).toFixed(2),
      `${enZayif.ad} ${kOrt(enZayif).toFixed(1)}`, d.filter((x) => x === 0).length));
  }
  const hepsi = KATEGORI.flatMap((k) => k.duzey);
  const genelOrt = ISLEV.reduce((a, i) => a + iOrt(i), 0) / ISLEV.length;
  const isleyensiz = KATEGORI.filter((k) => k.duzey.every((d) => d === 0));
  console.log(`\ngenel olgunluk ${genelOrt.toFixed(2)}; duzey 0 kontrol ` +
    `${hepsi.filter((d) => d === 0).length}/${hepsi.length}; ` +
    `hicbir isleyen kontrolu olmayan kategori ${isleyensiz.length} ` +
    `(${isleyensiz.map((k) => k.ad).join(", ")})`);
  console.log(`kanit ureten kontrol ${hepsi.filter((d) => d >= 2).length}/${hepsi.length}; ` +
    `uretilen kanit kalemi ${hepsi.reduce((a, d) => a + kanit(d), 0)}`);

  // Bir duzey yukseltmenin islev olgunluguna kazanci: 1 / (kategori x kontrol).
  const z = gen([10, 9, 14, 24, 11]);
  console.log("\n" + z("islev", "olgunluk", "olgunluk sira", "en ucuz +1", "verim sira"));
  const verim = ISLEV.map((i) => {
    const c = kategoriler(i);
    const en = c.flatMap((k) => k.duzey.map((d) =>
      ({ ad: k.ad, kazanc: 1 / (c.length * k.duzey.length) / gun(d), d })))
      .reduce((a, b) => (b.kazanc > a.kazanc ? b : a));
    return { i, ort: iOrt(i), en };
  });
  const sO = [...verim].sort((a, b) => a.ort - b.ort).map((v) => v.i);
  const sV = [...verim].sort((a, b) => b.en.kazanc - a.en.kazanc).map((v) => v.i);
  for (const v of verim) {
    console.log(z(v.i, v.ort.toFixed(2), sO.indexOf(v.i) + 1,
      `${v.en.ad} ${gun(v.en.d)} gun`, sV.indexOf(v.i) + 1));
  }
  const ayni = sO.filter((i, k) => i === sV[k]).length;
  console.log(`\nolgunluk sirasi: ${sO.join(" > ")}`);
  console.log(`verim sirasi   : ${sV.join(" > ")}`);
  console.log(`ayni sirada kalan islev: ${ayni}/${ISLEV.length}`);
}
model: 5 islev, 14 kategori, 31 kontrol kalemi

islev      kategori kontrol  olgunluk              en zayif  duzey 0
kimlik            3       7      2.17  varlik envanteri 2.0        0
koruma            3       8      2.17     bakim ve yama 1.5        0
tespit            2       5      0.92    olay ayirdetme 0.5        1
yanit             3       6      1.00          bildirim 0.5        1
kurtarma          3       5      0.50       iyilestirme 0.0        3

genel olgunluk 1.35; duzey 0 kontrol 5/31; hicbir isleyen kontrolu olmayan kategori 1 (iyilestirme)
kanit ureten kontrol 15/31; uretilen kanit kalemi 25

islev      olgunluk olgunluk sira              en ucuz +1 verim sira
kimlik         2.17             4  varlik envanteri 5 gun          5
koruma         2.17             5     bakim ve yama 5 gun          4
tespit         0.92             2    olay ayirdetme 2 gun          1
yanit          1.00             3          bildirim 2 gun          2
kurtarma       0.50             1    kurtarma plani 2 gun          3

olgunluk sirasi: kurtarma > tespit > yanit > kimlik > koruma
verim sirasi   : tespit > yanit > kurtarma > koruma > kimlik
ayni sirada kalan islev: 0/5

Birinci tablo çerçevenin asıl işini yapıyor: otuz bir dağınık kontrol kalemi beş sayıya iniyor ve beş sayı karşılaştırılabilir. Kurumun dağılımı çarpıktır — koruma ve kimlik 2,17, kurtarma 0,50. Dokuz kursun bıraktığı tablo tam olarak budur: erişimi daraltmak, verinin okunduğunda ne göstereceğini değiştirmek ve sınırı çekmek üzerine çok iş yapılmış, olaydan sonra ayağa kalkmak üzerine az iş yapılmıştır. Bu çarpıklık ancak beş başlık ayrı ayrı yazıldığında görünür.

Genel olgunluk 1,35’tir ve bu sayı tek başına verildiğinde yanıltır. İki nedenle: birincisi, ortalama en zayıf halkayı yutar — kurtarma işlevi ortalamanın üçte biri kadar bir değerdeyken genel sayı orta bir yerde durur. İkincisi, ortalama bir kontrolün hiç bulunmadığı durumla düşük düzeyde bulunduğu durumu ayırmaz. Son sütun bu ayrımı yapıyor: otuz bir kontrolün beşi düzey 0’dadır ve bir kategori — iyileştirme — hiçbir işleyen kontrole sahip değildir. Bu tek satır, “kurtarma olgunluğumuz 0,50” cümlesinden farklı bir karar doğurur, çünkü bir kategorinin tamamen boş olması bir yavaşlık değil, bir boşluktur.

Üçüncü sayı kanıt tarafını açar ve sonraki iki dersin girdisidir. Otuz bir kontrolün on beşi kanıt üretiyor, üretilen kanıt kalemi yirmi beştir. Düzey 0 ve 1’deki on altı kontrol ise denetimde hiçbir şey gösteremez: yapılıyor olabilir, ama yapıldığını ortaya koyan bir kalem yoktur. Olgunluk düzeyinin kanıtla bu kadar sıkı bağlı olması rastlantı değildir — düzey tanımlarının kendisi belge ve ölçüm kaydı üzerinden yazılmıştır.

İkinci tablo kursun ölçü eksenini çerçeveye taşıyor. Sol taraf işlevleri olgunluğa göre sıralıyor: en zayıf olan kurtarma birinci sırada. Sağ taraf ise aynı işlevleri birim çabaya düşen olgunluk kazancına göre sıralıyor. İki sıra hiçbir işlevde çakışmıyor. Nedeni yapısaldır: bir işlevin olgunluğuna yapılan katkı, o işlevin kategori sayısına ve kategorideki kontrol sayısına bölünür. Tespit iki kategorilidir, bu yüzden oradaki bir yükseltme kurtarmadaki bir yükseltmeden daha çok oynatır — kurtarma en düşük olduğu hâlde verim sırasında üçüncüdür.

Aynı Bütçe, İki Sıra

İki sıralamanın gerçek farkı, sabit bir bütçe harcandığında ortaya çıkar. Aşağıdaki dosya aynı kontrol kümesini iki ayrı kuralla yükseltir: boşluk önce her adımda en düşük olgunluklu işlevin en ucuz kalemini alır; verim önce genel olgunluğa birim gün başına en çok katkı veren kalemi alır. Bütçe kırk beş adam-gündür ve kurgudur.

// cerceve/butce.mjs — ayni cerceve iki farkli sirayla yukseltilir (kurgu butce).
import { KATEGORI, ISLEV, gen, gun, kanit } from "./olgunluk.mjs";

const BUTCE = 45;                                    // adam-gun (kurgu birim)
const kopya = () => KATEGORI.map((k) => ({ ...k, duzey: [...k.duzey] }));
const ort = (K, i) => { const c = K.filter((k) => k.islev === i);
  return c.reduce((a, k) => a + k.duzey.reduce((x, d) => x + d, 0) / k.duzey.length, 0) / c.length; };
const genel = (K) => ISLEV.reduce((a, i) => a + ort(K, i), 0) / ISLEV.length;
const kanitSay = (K) => K.flatMap((k) => k.duzey).reduce((a, d) => a + kanit(d), 0);
const sifir = (K) => K.flatMap((k) => k.duzey).filter((d) => d === 0).length;

// Aday yukseltme: kategori, kontrol, maliyet ve genel olgunluga kazanc.
const adaylar = (K) => K.flatMap((k, ki) => k.duzey.map((d, di) => ({ ki, di, d, k,
  maliyet: gun(d), kazanc: 1 / (ISLEV.length * K.filter((x) => x.islev === k.islev).length
    * k.duzey.length) })).filter((a) => a.d < 4));

function kostur(sec) {
  const K = kopya(); let kalan = BUTCE, adim = 0;
  for (;;) {
    const uygun = adaylar(K).filter((a) => a.maliyet <= kalan);
    if (!uygun.length) break;
    const a = sec(uygun, K);
    K[a.ki].duzey[a.di]++; kalan -= a.maliyet; adim++;
  }
  return { K, kalan, adim };
}

const YOL = [
  ["bosluk once", (u, K) => { const enDusuk = [...ISLEV].sort((a, b) => ort(K, a) - ort(K, b))[0];
    const ic = u.filter((a) => a.k.islev === enDusuk);
    return (ic.length ? ic : u).sort((a, b) => a.maliyet - b.maliyet || a.ki - b.ki)[0]; }],
  ["verim once", (u) => [...u].sort((a, b) =>
    b.kazanc / b.maliyet - a.kazanc / a.maliyet || a.ki - b.ki)[0]],
];

const y = gen([13, 9, 7, 8, 9, 7, 17]);
console.log(`butce ${BUTCE} adam-gun; baslangic genel olgunluk ` +
  `${genel(kopya()).toFixed(2)}, duzey 0 kontrol ${sifir(kopya())}, ` +
  `kanit kalemi ${kanitSay(kopya())}`);
console.log("\n" + y("sira", "yukselen", "kalan", "genel", "duzey 0", "kanit", "en zayif islev"));
const sonuc = {};
for (const [ad, sec] of YOL) {
  const { K, kalan, adim } = kostur(sec);
  const enZayif = [...ISLEV].sort((a, b) => ort(K, a) - ort(K, b))[0];
  sonuc[ad] = { K, enZayif };
  console.log(y(ad, adim, kalan, genel(K).toFixed(2), sifir(K), kanitSay(K),
    `${enZayif} ${ort(K, enZayif).toFixed(2)}`));
}

const z = gen([11, 12, 14, 14, 12]);
console.log("\n" + z("islev", "baslangic", "bosluk once", "verim once", "fark"));
for (const i of ISLEV) {
  const a = ort(sonuc["bosluk once"].K, i), b = ort(sonuc["verim once"].K, i);
  console.log(z(i, ort(kopya(), i).toFixed(2), a.toFixed(2), b.toFixed(2), (b - a).toFixed(2)));
}
const v = sonuc["verim once"].K;
const dokunulmayan = ISLEV.filter((i) => ort(v, i) === ort(kopya(), i));
console.log(`\nverim sirasi ${dokunulmayan.length} islevi hic yukseltmedi: ` +
  `${dokunulmayan.join(", ")}`);
console.log(`genel olgunluk farki ${(genel(v) - genel(sonuc["bosluk once"].K)).toFixed(2)}; ` +
  `en zayif islev farki ${(ort(v, sonuc["verim once"].enZayif) -
    ort(sonuc["bosluk once"].K, sonuc["bosluk once"].enZayif)).toFixed(2)}`);
butce 45 adam-gun; baslangic genel olgunluk 1.35, duzey 0 kontrol 5, kanit kalemi 25

sira          yukselen  kalan   genel  duzey 0  kanit   en zayif islev
bosluk once         12      0    1.77        0     32      tespit 1.50
verim once          11      2    1.83        0     32       yanit 1.17

islev         baslangic   bosluk once    verim once        fark
kimlik             2.17          2.17          2.17        0.00
koruma             2.17          2.17          2.33        0.17
tespit             0.92          1.50          1.83        0.33
yanit              1.00          1.50          1.17       -0.33
kurtarma           0.50          1.50          1.67        0.17

verim sirasi 1 islevi hic yukseltmedi: kimlik
genel olgunluk farki 0.07; en zayif islev farki -0.33

İki satır aynı kırk beş günü harcıyor ve ikisi de düzey 0’daki beş kontrolü sıfırdan çıkarıyor; kanıt kalemi ikisinde de yirmi beşten otuz ikiye çıkıyor. Ayrıldıkları yer son iki sütundur. Verim sırası genel olgunluğu 1,83’e taşıyor, boşluk sırası 1,77’de kalıyor — arada 0,07 vardır ve tek başına okunduğunda verim sırası kazanmış görünür. Ama en zayıf işleve bakıldığında iş tersine döner: boşluk sırası en zayıf işlevi 1,50’ye kadar getiriyor, verim sırası 1,17’de bırakıyor. Fark 0,33’tür, yani ortalamada kazanılanın yaklaşık beş katı kadar bir kayıp en zayıf halkada birikiyor.

Alt tablo bunun nedenini gösteriyor. Verim sırası yanıt işlevini boşluk sırasından 0,33 geride bırakıyor ve kimlik işlevine hiç dokunmuyor. Kural bunu bilerek yapıyor: kimlikteki bir yükseltme beş gün tutuyor ve az oynatıyor, tespitteki iki gün tutuyor ve çok oynatıyor. Verim ölçüsü bir kalemin ne kadar kritik olduğunu değil, ölçüyü ne kadar oynattığını sorar. Bu ders için sonuç biçimseldir: olgunluk sayısı bir hedef hâline geldiğinde, sayıyı en ucuza yükselten sıra ile boşluğu kapatan sıra ayrışır ve ikisi aynı bütçeyle farklı kurumlar üretir.

Buradan çıkan üçüncü gözlem çerçevenin kendisiyle ilgilidir. Ağırlıksız ortalama (CE4) bir tercihtir, kaçınılmaz değildir: kategori sayısı az olan işlev, kalem başına daha çok oynar. Ölçüyü kuran kural, ölçünün hangi kalemi öne alacağını da kurar. Bir çerçeve raporunda yalnız beş sayı görünüyorsa, o beş sayının nasıl toplandığı da sorulmalıdır.

Özet

  • İşlev tabanlı çerçeve üç katmanlıdır — işlev, kategori, kontrol — ve otuz bir dağınık kalemi karşılaştırılabilir beş sayıya indirir: kimlik ve koruma 2,17, yanıt 1,00, tespit 0,92, kurtarma 0,50.
  • Genel olgunluk 1,35’tir ve iki şeyi saklar: en zayıf işlevi yutar, “yok” ile “düşük”ü ayırmaz. Otuz bir kontrolün beşi düzey 0’dadır ve bir kategorinin hiçbir işleyen kontrolü yoktur.
  • Kanıt üretimi düzeye bağlıdır: otuz bir kontrolün yalnız on beşi kanıt üretiyor ve toplam yirmi beş kalem veriyor; düzey 0 ve 1’deki on altı kontrol denetimde hiçbir şey gösteremez.
  • İşlevleri olgunluğa göre sıralamakla birim çabaya düşen kazanca göre sıralamak beş işlevin hiçbirinde aynı sonucu vermiyor; kurtarma en düşük olduğu hâlde verim sırasında üçüncüdür.
  • Kırk beş adam-günlük bütçede verim sırası genel olgunluğu 0,07 daha yükseltiyor ama en zayıf işlevi 0,33 geride bırakıyor ve bir işleve hiç dokunmuyor: sayıyı yükseltmekle boşluğu kapatmak aynı iş değildir.

Sonraki Adım

Çerçeve ortak bir eksen kurdu ve dağınık kontrolleri karşılaştırılabilir sayılara indirdi. Bu sayıların hepsinin ortak bir özelliği var: kurumun kendisi hesapladı. Düzeyleri kurum atadı, ortalamayı kurum aldı, hangi kalemin yükseltileceğine kurum karar verdi. Dışarıdan bakan biri için bu, önceki konudaki listeden yalnız bir adım ilerdedir — dil ortaklaştı, ama sayıyı üreten taraf değişmedi.

Sonraki ders bu adımı atan yapıyı ele alır: kapsamı bildirilen, hangi kontrolün neden uygulanıp neden uygulanmadığı yazılan, iç denetimden geçen ve dışarıdan bir tarafça belgelendirilen yönetim sistemi modelini. Ölçülecek şey belgenin kendisi değil, kapsam bildirimidir: kapsamı daraltmak belgeyi ucuzlatır ve aynı hareketle kaç kalemi belgenin dışında bırakır.

İ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