Ders 12 / 21
Yapılandırma Uyum Denetimi
Sapmanın otomatik tespiti: 22 kiralanmış kaynakta 6 kuralın koşturulması, 46 ateşleyen çiftin 40'ının işaretlenmesi, 38 gerçek uyumsuzluğun 32'sinin yakalanıp 6'sının kaçması, üç düzeltme kipinde açıkta kalan kaynağın 16'dan 6'ya inerken 8 meşru yapılandırmanın bozulması ve 6 meşru değişiklikten 5'inin durdurulması.
İçindekiler
Önceki ders kimin ne yaptığını kayda geçirdi: denetim günlüğü, geçmiş kipinde bir kayıttır ve sorusu “bu işlem oldu mu” sorusudur. Bu dersin sorusu şimdiki kiptedir — kaynağın şu anki yapılandırması kurala uyuyor mu? Kayıt, yanlış olanı gösterip göstermediği konusunda sessizdir; bir depoyu genel erişime açan işlem kayda düzgünce düşer ve kayıt o işlemin yanlış olduğunu söylemez.
Yapılandırma uyum denetimi (configuration compliance), kaynak kümesinin üzerinde bir kural kümesi koşturup uyumsuz olanı işaretlemektir. Yapılandırma sapması M22/K01’de, sapmayı kapatan uzlaştırıcı döngü M22/K05’te ölçüldü; ikisi de burada tekrarlanmaz. Ayrım şudur: orada istenen durumu yazan da, sapmayı kapatan da aynı taraftı. Burada kaynak kiralanmıştır, kural kümesini başkası yazar ve düzeltme, kiralanan katmana yazma yetkisi ister — düzeltmenin kendisi bir erişim kalemi hâline gelir.
Kural Kümesi ve Uyumsuz Kaynak
Örnek kursun kurgu bölgesel ölçüm ağıdır: beş ekip, üç ortam. BG25 — kaynak çizelgesi: yirmi iki kaynak; her satır bir kaynağın sahibi ekibi, ortamını ve altı yapılandırma alanını taşır. BG26 — kural kümesi: altı kural; her kural bir yüklem, düzeltmenin değiştireceği alan ve düzeltilmiş değerden oluşur. BG27 — istisna kayıtları: dört kayıt; üçü kaynak, biri ekip düzeyinde yazılmıştır. BG28 — gerçek uyumsuzluk etiketi: otuz sekiz kaynak-kural çifti elle uyumsuz etiketlenmiştir; ikisi kural kümesinde karşılığı olmayan bir türdedir. BG29 — değişiklik akışı: yirmi değişiklik, altısı meşru etiketli. BG30 — birim girdiler: elle düzeltme kalem başına 25 dakika, denetleyicinin tarama başına değerlendirme kotası 240 (kurgu birim).
Aşağıdaki dosya çizelgeleri, kuralları ve üç kipi kurar. Süreç içi bir modeldir; gerçek bulut kaynağı, denetleyici ya da düzeltme yoktur.
// uyum/denetim.mjs — kiralanan katmanda yapilandirma uyum denetimi. Surec ici model: bolgesel // olcum agi (kurgu); gercek bulut kaynagi, denetleyici ya da duzeltme yoktur. const satir = (s) => s.trim().split("\n").map((l) => l.trim().split("|")); const yaz = (g, ...s) => console.log(s.map((v, i) => (g[i] < 0 ? String(v).padEnd(-g[i]) : String(v).padStart(g[i]))).join("")); // Kaynak: ad|ekip|ortam|genel erisim|beklemede sifreleme|denetim gunlugu|yonetim portu genis|sahip etiketi|anahtar yasi (gun) const KAYNAK = satir(` olcum-depo|olcum|uretim|0|1|1|0|1|120 olcum-arsiv|olcum|uretim|0|0|1|0|1|900 olcum-sinama|olcum|sinama|1|0|0|1|0|500 akis-kuyruk|akis|uretim|0|1|1|0|1|200 akis-depo|akis|uretim|1|1|0|0|1|410 akis-gelistirme|akis|gelistirme|1|0|0|1|0|730 katalog-depo|katalog|uretim|0|1|1|0|1|90 katalog-kapi|katalog|uretim|1|1|1|0|1|150 katalog-sinama|katalog|sinama|0|0|1|1|1|380 kapi-genel|kapi|uretim|1|1|1|0|1|60 kapi-yonetim|kapi|uretim|0|1|1|1|1|340 kapi-gelistirme|kapi|gelistirme|1|1|0|1|0|620 isletim-gunluk|isletim|uretim|0|1|1|0|1|280 isletim-yedek|isletim|uretim|0|0|1|0|1|1100 isletim-arac|isletim|sinama|0|1|0|1|1|450 isletim-gelistirme|isletim|gelistirme|1|1|0|0|0|800 olcum-kenar|olcum|uretim|1|1|1|0|1|170 akis-arsiv|akis|uretim|0|0|1|0|0|960 katalog-yedek|katalog|uretim|0|1|0|0|1|520 kapi-sinama|kapi|sinama|0|1|1|1|1|300 isletim-kota|isletim|uretim|0|1|1|0|1|110 olcum-rapor|olcum|sinama|0|1|0|0|0|240`) .map(([ad, ekip, ortam, genel, sifre, gunluk, port, etiket, yas]) => ({ ad, ekip, ortam, genel: +genel, sifre: +sifre, gunluk: +gunluk, port: +port, etiket: +etiket, yas: +yas })); // Kural kumesi: kural kimligi -> [yuklem, duzeltmenin degistirdigi alan, duzeltilmis deger] const KURAL = { Y1: [(k) => k.genel === 1, "genel", 0], Y2: [(k) => k.sifre === 0, "sifre", 1], Y3: [(k) => k.gunluk === 0, "gunluk", 1], Y4: [(k) => k.port === 1, "port", 0], Y5: [(k) => k.etiket === 0, "etiket", 1], Y6: [(k) => k.yas > 365, "yas", 90], }; const AD = { Y1: "genel erisim kapali", Y2: "beklemede sifreleme", Y3: "denetim gunlugu", Y4: "yonetim portu dar", Y5: "sahip etiketi", Y6: "anahtar yasi <= 365", Y7: "aktarimda sifreleme" }; // Bildirilmis istisna kayitlari (model girdisi). Ucu kaynak, biri ekip duzeyinde yazilmistir. const ISTISNA = satir(` kapi-genel|Y1 olcum-kenar|Y1 isletim-yedek|Y6 ekip:akis|Y6`).map((x) => x.join("|")); const istisnali = (k, r) => ISTISNA.includes(`${k.ad}|${r}`) || ISTISNA.includes(`ekip:${k.ekip}|${r}`); // Elle etiketli gercek uyumsuzluk (model girdisi): sapmanin mesru olmadigi kaynak-kural ciftleri. // Y7 kural kumesinde yoktur; iki gercek uyumsuzluk bu turdedir. const GERCEK = satir(` olcum-sinama|Y1 Y2 Y3 Y4 Y5 Y6 akis-depo|Y1 Y3 Y6 akis-gelistirme|Y1 Y2 Y6 kapi-gelistirme|Y1 Y3 Y6 isletim-gelistirme|Y1 Y3 Y5 Y6 olcum-arsiv|Y2 katalog-sinama|Y2 Y4 Y6 isletim-yedek|Y2 Y6 akis-arsiv|Y2 Y5 Y6 isletim-arac|Y3 Y6 katalog-yedek|Y3 Y6 olcum-rapor|Y3 Y5 kapi-yonetim|Y4 kapi-sinama|Y4 akis-kuyruk|Y7 katalog-depo|Y7`).flatMap(([ad, r]) => r.split(" ").map((x) => `${ad}|${x}`)); const KURALLAR = Object.keys(KURAL); const TUM = [...KURALLAR, "Y7"]; // Atesleyen: yuklem dogru. Isaretlenen: atesleyen ve istisna kaydi yok. const atesle = (kume) => { const a = [], i = []; for (const k of kume) for (const r of KURALLAR) if (KURAL[r][0](k)) { a.push(`${k.ad}|${r}`); if (!istisnali(k, r)) i.push(`${k.ad}|${r}`); } return { atesleyen: a, isaretli: i }; }; const taban = atesle(KAYNAK); const yak = taban.isaretli.filter((x) => GERCEK.includes(x)); const yanlis = taban.isaretli.filter((x) => !GERCEK.includes(x)); const kacan = GERCEK.filter((x) => !taban.isaretli.includes(x)); const uyumsuzKaynak = new Set(taban.isaretli.map((x) => x.split("|")[0])); console.log(`${KAYNAK.length} kaynak, ${KURALLAR.length} kural, ${ISTISNA.length} istisna kaydi, ` + `${GERCEK.length} elle etiketli gercek uyumsuzluk`); console.log(`isaretlenen kaynak: ${uyumsuzKaynak.size}/${KAYNAK.length}, ` + `isaretlenen cift: ${taban.isaretli.length} (atesleyen ${taban.atesleyen.length})`); const K = [-8, -22, 11, 12, 11, 8, 15]; console.log(); yaz(K, "kural", "ne bakiyor", "atesleyen", "isaretlenen", "yakalanan", "kacan", "yanlis isaret"); for (const r of TUM) { const at = taban.atesleyen.filter((x) => x.endsWith(`|${r}`)).length; const is = taban.isaretli.filter((x) => x.endsWith(`|${r}`)); const y = is.filter((x) => GERCEK.includes(x)).length; const kc = GERCEK.filter((x) => x.endsWith(`|${r}`) && !is.includes(x)).length; yaz(K, r, AD[r], at, is.length, y, kc, is.length - y); } yaz(K, "toplam", "", taban.atesleyen.length, taban.isaretli.length, yak.length, kacan.length, yanlis.length); // Degisiklik akisi: kaynak|alan|yeni deger|mesru mu (model girdisi) const DEGISIKLIK = satir(` katalog-depo|genel|1|1 katalog-depo|gunluk|0|0 olcum-depo|port|1|0 olcum-depo|yas|900|0 akis-kuyruk|genel|1|1 akis-kuyruk|sifre|0|0 isletim-kota|port|1|1 isletim-kota|etiket|0|0 kapi-genel|gunluk|0|0 kapi-genel|yas|700|0 olcum-kenar|port|1|1 katalog-kapi|sifre|0|0 katalog-kapi|yas|800|0 isletim-gunluk|genel|1|1 isletim-gunluk|port|1|0 olcum-depo|etiket|0|0 akis-kuyruk|yas|900|1 kapi-yonetim|gunluk|0|0 isletim-kota|yas|600|0 katalog-depo|etiket|0|0`) .map(([ad, alan, deger, mesru]) => ({ ad, alan, deger: +deger, mesru: mesru === "1" })); // Uc kip: yalniz bildir, engelle, duzelt. Her kip ayni akisi ayni sirayla gorur. const kipKos = (kip) => { const durum = KAYNAK.map((k) => ({ ...k })); const bul = (ad) => durum.find((k) => k.ad === ad); let durdurulan = 0, geriAlinan = 0, bozulan = 0, duzeltilen = 0; if (kip === "duzelt") for (const k of durum) for (const r of KURALLAR) if (KURAL[r][0](k) && !istisnali(k, r)) { if (!GERCEK.includes(`${k.ad}|${r}`)) bozulan++; k[KURAL[r][1]] = KURAL[r][2]; duzeltilen++; } for (const d of DEGISIKLIK) { const k = bul(d.ad); const once = { ...k }; k[d.alan] = d.deger; const yeni = KURALLAR.filter((r) => KURAL[r][0](k) && !KURAL[r][0](once) && !istisnali(k, r)); if (yeni.length === 0) continue; if (kip === "engelle") { Object.assign(k, once); if (d.mesru) durdurulan++; } else if (kip === "duzelt") { for (const r of yeni) { k[KURAL[r][1]] = KURAL[r][2]; duzeltilen++; } if (d.mesru) geriAlinan++; } } // Pencere sonunda acikta kalan: hala gercek uyumsuzluk tasiyan kaynak ve cift const acik = new Set(), cift = []; for (const k of durum) { for (const r of KURALLAR) if (KURAL[r][0](k) && GERCEK.includes(`${k.ad}|${r}`)) { acik.add(k.ad); cift.push(`${k.ad}|${r}`); } if (GERCEK.includes(`${k.ad}|Y7`)) { acik.add(k.ad); cift.push(`${k.ad}|Y7`); } } // Denetleyicinin yazma yetkisi: yalnizca duzelt kipi alan yazar const alan = kip === "duzelt" ? KAYNAK.length * KURALLAR.length : 0; return { acik: acik.size, cift: cift.length, durdurulan, geriAlinan, bozulan, duzeltilen, alan }; }; const KIP = ["bildir", "engelle", "duzelt"], SONUC = {}; for (const kip of KIP) SONUC[kip] = kipKos(kip); const D = [-10, 15, 13, 11, 23, 20, 15]; console.log(); yaz(D, "kip", "acikta kaynak", "acikta cift", "duzeltme", "durdurulan/geri alinan", "bozulan mesru yap.", "yazma yetkisi"); for (const kip of KIP) { const s = SONUC[kip]; yaz(D, kip, s.acik, s.cift, s.duzeltilen, s.durdurulan + s.geriAlinan, s.bozulan, `${s.alan} alan`); } // Elle duzeltme yuku (kurgu birim): bildir kipinde her isaretli cift bir is kalemidir const DAKIKA = 25, KISI_SAAT = (n) => ((n * DAKIKA) / 60).toFixed(1); const mesruDeg = DEGISIKLIK.filter((d) => d.mesru).length; console.log(`\nbildir kipi kuyrugu: ${taban.isaretli.length} cift x ${DAKIKA} dk = ` + `${KISI_SAAT(taban.isaretli.length)} kisi-saat; akistaki ${DEGISIKLIK.length} degisikligin ` + `${mesruDeg} tanesi mesru etiketli`); console.log(`engelle: mesru degisikligin ${SONUC.engelle.durdurulan}/${mesruDeg} tanesi ` + `durduruldu; duzelt: ${SONUC.duzelt.geriAlinan}/${mesruDeg} tanesi geri alindi`); console.log(`kacan ${kacan.length} ciftin ${kacan.filter((x) => x.endsWith("|Y7")).length} tanesi ` + `kural kumesinde karsiligi olmayan tur, ` + `${kacan.filter((x) => !x.endsWith("|Y7")).length} tanesi istisna kaydinin kapsadigi cift`); const ekipIstisna = GERCEK.filter((x) => { const [ad, r] = x.split("|"); const k = KAYNAK.find((z) => z.ad === ad); return ISTISNA.includes(`ekip:${k.ekip}|${r}`); }).length; console.log(`ekip duzeyinde yazilmis tek istisna kaydi ${ekipIstisna} gercek uyumsuzlugu ortuyor`); // Sinir ve kalan (kurgu): denetleyicinin tarama basina degerlendirme kotasi const KOTA = 240, kullanilan = KAYNAK.length * KURALLAR.length; console.log(`\ndegerlendirme kotasi ${KOTA}/tarama; kullanilan ${KAYNAK.length} x ` + `${KURALLAR.length} = ${kullanilan}, kalan ${KOTA - kullanilan} -> ayni kural kumesiyle ` + `${Math.floor((KOTA - kullanilan) / KURALLAR.length)} kaynak daha, ya da ayni kaynak ` + `kumesiyle ${Math.floor(KOTA / KAYNAK.length) - KURALLAR.length} kural daha`);
22 kaynak, 6 kural, 4 istisna kaydi, 38 elle etiketli gercek uyumsuzluk isaretlenen kaynak: 15/22, isaretlenen cift: 40 (atesleyen 46) kural ne bakiyor atesleyen isaretlenen yakalanan kacan yanlis isaret Y1 genel erisim kapali 8 6 5 0 1 Y2 beklemede sifreleme 6 6 6 0 0 Y3 denetim gunlugu 8 8 7 0 1 Y4 yonetim portu dar 7 7 4 0 3 Y5 sahip etiketi 6 6 4 0 2 Y6 anahtar yasi <= 365 11 7 6 4 1 Y7 aktarimda sifreleme 0 0 0 2 0 toplam 46 40 32 6 8 kip acikta kaynak acikta cift duzeltme durdurulan/geri alinan bozulan mesru yap. yazma yetkisi bildir 16 38 0 0 0 0 alan engelle 16 38 0 5 0 0 alan duzelt 6 6 59 5 8 132 alan bildir kipi kuyrugu: 40 cift x 25 dk = 16.7 kisi-saat; akistaki 20 degisikligin 6 tanesi mesru etiketli engelle: mesru degisikligin 5/6 tanesi durduruldu; duzelt: 5/6 tanesi geri alindi kacan 6 ciftin 2 tanesi kural kumesinde karsiligi olmayan tur, 4 tanesi istisna kaydinin kapsadigi cift ekip duzeyinde yazilmis tek istisna kaydi 3 gercek uyumsuzlugu ortuyor degerlendirme kotasi 240/tarama; kullanilan 22 x 6 = 132, kalan 108 -> ayni kural kumesiyle 18 kaynak daha, ya da ayni kaynak kumesiyle 4 kural daha
Sayılar ölçüm sınıfındadır; girdileri yukarıdaki varsayımlardır. Yirmi iki kaynak üzerinde altı kural kırk altı yerde ateşliyor, istisna kayıtları altısını süzüyor ve geriye kırk işaretli çift kalıyor. Kaynak düzeyinde bakıldığında yirmi ikinin on beşi uyumsuz görünüyor — bu, ilk taramada okunacak sayıdır ve tek başına yanıltıcıdır, çünkü işaretlenen her çift gerçekten uyumsuz değildir.
Kural Başına Yakalanan ve Kaçan
Alt tablo kuralları ayırıyor ve kuralların birbirine benzemediğini gösteriyor. Y2 temiz çalışıyor: altı yerde ateşliyor, altısı da gerçekten uyumsuz, yanlış işareti yok — çünkü yüklemi bir kaynağın niyetinden bağımsızdır, beklemede şifrelemenin kapalı olmasının meşru bir okuması yoktur. Y4 aynı biçimde yazılmış ama başka türlü davranıyor: yedi ateşlemenin dördü gerçek, üçü meşru bir yapılandırmayı işaretliyor; geliştirme ortamındaki bir yönetim aracının portunun açık olması o ortamın kendi düzenidir. Y5 de aynı: altı ateşlemenin ikisi geçici geliştirme kaynağına ait ve sahip etiketi bilerek boştur.
Kırk işaretli çiftin otuz ikisi gerçek uyumsuzluk, sekizi yanlış işaret. Kaçan altı çift ise iki ayrı yerden geliyor ve ikisi de kuralın eşiğiyle ilgili değildir. Dördü istisna kayıtlarının altında duruyor: Y6 on bir yerde ateşliyor ama yalnız yedisi işaretleniyor, çünkü bir istisna kaydı ekip düzeyinde yazılmıştır ve tek başına üç gerçek uyumsuzluğu örtüyor. İstisnanın kapsamı, uyumsuzluğun kendisinden daha belirleyicidir — istisna kaydı yazma yetkisi bir denetim kalemidir ve kimin yazabildiği sayılmalıdır. Kalan iki kaçan çift kural kümesinde karşılığı olmayan bir türdedir: aktarımda şifreleme için yazılmış bir kural yoktur, dolayısıyla o iki kaynak için üretilen sayı da yoktur. Kuralları sıkılaştırmak bu boşluğu kapatmaz; boşluk eşikte değil, kural kümesinin kapsamındadır.
Üç Düzeltme Kipi
Yirmi değişiklikten oluşan akış üç kipte de aynı sırayla koşuyor. Yalnız bildir kipi hiçbir şeye dokunmaz: açıkta kalan otuz sekiz çift ve on altı kaynak duruyor, denetleyicinin kiralanan katmanda yazma yetkisi sıfır alandır, karşılığında kırk kalemlik bir elle düzeltme kuyruğu doğuyor — kalem başına 25 dakikayla 16,7 kişi-saat. Engelle kipi yeni değişikliği reddeder ama var olana dokunmaz; açıkta kalan sayı değişmiyor, on altı kaynak ve otuz sekiz çift aynen duruyor. Engellemenin bedeli ise başka bir sütunda: akıştaki altı meşru değişikliğin beşi durduruldu.
Kaçan tek meşru değişikliğin nasıl geçtiği söylenmeye değer. Akış kuyruğunun anahtar yaşını uzatan değişikliği reddedilmedi, çünkü o ekibin Y6 için ekip düzeyinde bir istisna kaydı var — yani meşru işi geçiren kayıt ile üç gerçek uyumsuzluğu örten kayıt aynı kayıttır. İstisnayı daraltmak kaçanı dörtten bire indirir ve durdurulan meşru değişikliği beşten altıya çıkarır; iki sütun aynı düğmeye bağlıdır.
Düzelt kipi açıkta kalanı on altı kaynaktan altıya, otuz sekiz çiftten altıya indiriyor. Kalan altı çift zaten kaçanlardır: dördü istisna kaydının örttüğü, ikisi kural kümesinde karşılığı olmayan tür. Denetleyici bunun için elli dokuz düzeltme yazıyor ve yirmi iki kaynağın altı alanına, yani yüz otuz iki alana yazma yetkisi istiyor. Kiralanan katmanda bu, hiçbir insanın sahip olmadığı genişlikte bir yetkidir: bir kaynağı ağa açan, şifrelemeyi çeviren ve anahtarı değiştiren tek özne, denetim aracının kendisi olur.
Yanlış Düzeltmenin Bedeli
Düzelt kipinin ikinci sütunu asıl ölçüdür: sekiz meşru yapılandırma bozuldu. Bunlar yanlış işaretlenen sekiz çiftin tamamıdır — kamuya açık olması gereken katalog kapısı kapatıldı, üç yönetim portu daraltıldı, iki geçici kaynağa sahip etiketi yazıldı, bir arşiv anahtarının ömrü kısaltıldı, bir sınama kaynağının günlüğü açıldı. Denetleyici bunların meşru olduğunu bilmiyor, çünkü meşruluk bilgisinin tek taşıyıcısı istisna kaydıdır ve bu sekiz çift için yazılmamıştır.
Oran adıyla anılmalı: taban taramasındaki kırk düzeltmenin sekizi, yani her beş düzeltmeden biri meşru bir yapılandırmayı bozuyor. Üstüne akıştan gelen beş meşru değişiklik uygulandıktan sonra geri alınıyor. Kip seçimi bu yüzden bir kural sıkılığı seçimi değil, iki sütun arasında bir seçimdir: bildir kipi hiçbir meşru işi durdurmaz ve on altı kaynağı açıkta bırakır; düzelt kipi on kaynağı kapatır ve on üç meşru işlemi bozar ya da geri alır. Ortadaki engelle kipi ikisini de yapmaz — yeni uyumsuzluğu içeri sokmaz ama eskisini de kapatmaz; var olan on altı kaynak için hâlâ bir elle düzeltme kuyruğu gerekir.
Sınır ve Kalan
Denetleyicinin kendi sınırı da sayılır. Tarama başına değerlendirme kotası 240 birimdir; yirmi iki kaynak çarpı altı kural, 132 birim kullanıyor ve 108 kalıyor. Aynı kural kümesiyle on sekiz kaynak daha eklenebilir ya da aynı kaynak kümesiyle dört kural daha yazılabilir; ikisi birden yapılamaz. Kapsam boşluğunu kapatmak için yazılacak aktarımda şifreleme kuralı yirmi iki değerlendirme yer kaplar, yani kalan bütçenin beşte birini. Kota, kural yazmayı ücretsiz olmaktan çıkarır: kural kümesini büyütmek ile kaynak sayısını büyütmek aynı sınıra çarpar.
Özet
- Yirmi iki kaynak üzerinde altı kural kırk altı yerde ateşliyor, dört istisna kaydı altısını süzüyor; kırk işaretli çiftin otuz ikisi gerçek uyumsuzluk, sekizi yanlış işarettir.
- Kaçan altı çiftin dördü istisna kayıtlarının altındadır ve tek bir ekip düzeyinde kayıt üç gerçek uyumsuzluğu örtüyor; ikisi kural kümesinde karşılığı olmayan türdür ve eşik sıkılaştırmakla kapanmaz.
- Yalnız bildir kipi on altı kaynağı açıkta bırakır, hiçbir meşru işi durdurmaz ve kırk kalemlik bir kuyruk üretir (16,7 kişi-saat, kurgu birim).
- Engelle kipi açıkta kalanı değiştirmez ama altı meşru değişikliğin beşini durdurur; geçen tek meşru değişiklik, üç gerçek uyumsuzluğu örten istisna kaydı sayesinde geçiyor.
- Düzelt kipi açıkta kalanı on altı kaynaktan altıya indirir; karşılığında sekiz meşru yapılandırmayı bozar, beş meşru değişikliği geri alır ve yüz otuz iki alanda yazma yetkisi ister.
- Denetleyicinin tarama başına 240 değerlendirmelik kotasının 132’si kullanılıyor; kalan 108 birim on sekiz kaynağa ya da dört kurala yeter, ikisine birden değil.
Sonraki Adım
Uyum denetimi kaynağın yapılandırmasını okudu ve ilk kuralı genel erişimle ilgiliydi: Y1 sekiz yerde ateşledi, altısı işaretlendi. Ama bu kural bir kaynağın açık olup olmadığına bakan tek bir bayrağı okuyor. Bayrak kapatıldığında o kaynağa gerçekten kaç yol kaldığı, hizmete hangi uçtan gidildiği ve adın nasıl çözümlendiği hiç sorulmadı. Sonraki ders yönetilen bir hizmete erişimin kaç yoldan sağlandığını sayar ve genel uç kapatıldığında kaç meşru erişimin kırıldığını ölçer.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.