İçeriğe geç
academia.sh

Ders 19 / 19

Güvenlik Yapılandırması

Yetkinin bir ayar olarak ölçülmesi: kimlik doğrulaması kapalı bir kurulumda erişilebilen derlem ve kayıt sayısının sayılması, aynı beş uygulama kimliğinin küme geneli, veritabanı düzeyi ve derlem düzeyi rollerle koşturulup okunabilir, yazılabilir ve kişisel veri taşıyan kayıt toplamlarının karşılaştırılması, en az yetkinin küçültemediği artığın adlandırılması ve aktarım ile durağan şifrelemenin bedelinin ek bayt ve ek işlem adımı olarak çıkarılması.

İçindekiler

Önceki ders aynı kümeyi aynı bölünmede dört ayarla koşturdu ve sınıf adının deponun değil isteğin gittiği yolun özelliği olduğunu saydı. O koşumlarda kümeye ulaşan her yazma ya kabul edildi ya reddedildi, her okuma ya yanıtlandı ya yanıtsız kaldı. İsteğin kimden geldiği bir kez bile sorulmadı.

Bu ders o soruyu sorar ve yanıtı yine bir yapılandırmadır. Kimlik doğrulamanın mekaniği burada anlatılmaz; buranın konusu deponun kendi ayarlarıdır. Ölçülecek üç şey var: kapalı bir yetki ayarının neye açık olduğu, rol kapsamını daraltmanın bunu ne kadar küçülttüğü ve şifrelemenin hangi kalemde ne kadar bedel eklediği.

Açık Yüzey Sayılabilir Bir Niceliktir

Güvenlik yapılandırması anlatılırken kullanılan sıfatlar — sıkı, gevşek, yeterli — karar taşımaz. Ölçülebilir karşılığı açık yüzeydir: bir yapılandırmada tanımlı kimliklerin okuyabildiği kayıtların toplamı. Yanında iki nicelik daha durur: yazılabilir kayıt ve kişisel veri taşıyan okunabilir kayıt toplamı. Girdileri derlem boyları, deponun tanıdığı kimlikler ve her kimliğe atanan rolün kapsamıdır; ilk ikisi kurulumdan gelir, üçüncüsü karardır.

Düzenek

NS31 — kurulumda yedi derlem, 154.540 kayıt ve beş uygulama kimliği vardır; her kimliğin işi belli birkaç derleme dokunur. Gerekçe: kurs boyunca kullanılan katalog, üye, ödünç ve ceza derlemlerine personel ve denetim derlemleri eklenir; bir arama hizmeti, bir ödünç ucu, bir ceza işi, bir rapor işi ve bir yedek işi tipik bir ayrışmadır. NS32 — aktarım şifrelemesinde bir çerçeve en çok 16.384 bayt taşır ve 29 bayt ek alır; bağlantı kurulumu bağlantı başına 5.200 bayttır. Gerekçe: ek bir başlık, bir sıra sayacı ve bir kimlik doğrulama etiketidir; sonucu belirleyen sayının kendisi değil, yanıt boyundan bağımsız olmasıdır. NS33 — durağan şifreleme 4.096 baytlık bloklar üzerinde çalışır, blok başına 28 bayt üstveri tutar ve her blok okunuşu bir ek çözme adımıdır.

Düzenek bir modeldir: gerçek kurulum, ağ ya da kimlik sağlayıcı yoktur. Ölçüm sınıfında sayı yoktur; NS31–NS33 varsayım, çıktıdaki her sayı onlardan türeyen hesaptır.

// guvenlik/model.mjs — depo YAPILANDIRMASI modelidir: gercek kurulum, ag ya da kimlik
// saglayici yoktur. Rol kapsami ve sifreleme bedeli parametreden hesaplanir.
export const DERLEM = [
  // veritabani, derlem, kayit, kayit basina bayt, kisisel veri tasir mi
  ["kutuphane", "kitap", 20000, 368, false],
  ["kutuphane", "uye", 12000, 214, true],
  ["kutuphane", "odunc", 20000, 96, true],
  ["kutuphane", "ceza", 4800, 72, true],
  ["kutuphane", "ozet", 1560, 88, false],
  ["isletim", "personel", 180, 260, true],
  ["isletim", "denetim", 96000, 128, false],
];
export const KIMLIK = ["katalog-arama", "odunc-uc", "ceza-isleme", "rapor", "yedek"];
const izin = (vt, d, ...e) => ({ vt, d, e });
const HEPSI = [izin("*", "*", "oku", "yaz")];
const her = (r) => Object.fromEntries(KIMLIK.map((k) => [k, r]));
const VT = [izin("kutuphane", "*", "oku", "yaz")];
const AZ = {
  "katalog-arama": [izin("kutuphane", "kitap", "oku")],
  "odunc-uc": [izin("kutuphane", "kitap", "oku"), izin("kutuphane", "uye", "oku"),
    izin("kutuphane", "odunc", "oku", "yaz")],
  "ceza-isleme": [izin("kutuphane", "odunc", "oku"), izin("kutuphane", "ceza", "oku", "yaz")],
  rapor: [izin("kutuphane", "odunc", "oku"), izin("kutuphane", "ceza", "oku")],
  yedek: [izin("*", "*", "oku")],
};
export const YAPILANDIRMA = [
  { ad: "Y0 kimlik dogrulama kapali", kimlik: "hayir", rol: her(HEPSI) },
  { ad: "Y1 kume geneli tek rol", kimlik: "evet", rol: her(HEPSI) },
  { ad: "Y2 veritabani duzeyi rol", kimlik: "evet", rol: { ...her(VT), yedek: AZ.yedek } },
  { ad: "Y3 derlem duzeyi (en az yetki)", kimlik: "evet", rol: AZ },
  { ad: "Y4 derlem duzeyi + ozet derlemi", kimlik: "evet",
    rol: { ...AZ, rapor: [izin("kutuphane", "ozet", "oku")] } },
];

const uyar = (i, d) => (i.vt === "*" || i.vt === d[0]) && (i.d === "*" || i.d === d[1]);

export function yuzey(y) {
  const satir = KIMLIK.map((k) => {
    let oku = 0, yaz = 0, kisisel = 0;
    for (const d of DERLEM) {
      const ilgili = y.rol[k].filter((i) => uyar(i, d));
      if (ilgili.some((i) => i.e.includes("oku"))) { oku += d[2]; if (d[4]) kisisel += d[2]; }
      if (ilgili.some((i) => i.e.includes("yaz"))) yaz += d[2];
    }
    return { k, oku, yaz, kisisel };
  });
  const top = (a) => satir.reduce((s, r) => s + r[a], 0);
  const uyg = satir.filter((r) => r.k !== "yedek").map((r) => r.oku);
  return { satir, oku: top("oku"), yaz: top("yaz"), kisisel: top("kisisel"),
    enGenisUyg: Math.max(...uyg) };
}

export const CERCEVE = 16384, CERCEVE_EK = 29, ELSIKISMA = 5200, BLOK = 4096, BLOK_EK = 28;
export const cerceve = (b) => Math.ceil(b / CERCEVE);
export const blok = (b) => Math.ceil(b / BLOK);
export const bayt = (d) => d[2] * d[3];
export const TOPLAM_BAYT = DERLEM.reduce((s, d) => s + bayt(d), 0);
export const TOPLAM_BLOK = DERLEM.reduce((s, d) => s + blok(bayt(d)), 0);
const OZET = bayt(DERLEM.find((d) => d[1] === "ozet"));
export const ISYUKU = [
  // ad, istek sayisi, istek basina tasinan bayt, istek basina dokunulan blok
  ["katalog-arama noktasal", 180000, 1472, 1],
  ["odunc-uc noktasal", 20000, 640, 1],
  ["ceza-isleme noktasal", 4800, 208, 1],
  ["rapor ozet taramasi", 12, OZET, blok(OZET)],
  ["gecelik yedek", 1, TOPLAM_BAYT, TOPLAM_BLOK],
];
// guvenlik/olc.mjs — ayni derlemler, ayni bes kimlik, bes yapilandirma; sonra ayni is yukunun
// aktarim ve duragan sifreleme bedeli
import { DERLEM, KIMLIK, YAPILANDIRMA, ISYUKU, yuzey, cerceve, blok, bayt,
  CERCEVE_EK, ELSIKISMA, BLOK_EK, TOPLAM_BAYT, TOPLAM_BLOK } from "./model.mjs";

const n = (x) => String(x).replace(/\B(?=(\d{3})+(?!\d))/g, ".");
const s = (x, w) => n(x).padStart(w);
const y = (x) => (x * 100).toFixed(2).replace(".", ",");
const KAYIT = DERLEM.reduce((a, d) => a + d[2], 0);

console.log(`${DERLEM.length} derlem, ${n(KAYIT)} kayit, ${n(TOPLAM_BAYT)} bayt, ` +
  `${KIMLIK.length} uygulama kimligi; kayit sutunlari bes kimlik uzerinden toplanmistir.\n`);
console.log("yapilandirma                    | kimlik | okunabilir | en genis uyg | yazilabilir | kisisel");
console.log("--------------------------------|--------|------------|--------------|-------------|--------");
for (const yp of YAPILANDIRMA) {
  const r = yuzey(yp);
  console.log(`${yp.ad.padEnd(31)} | ${yp.kimlik.padEnd(6)} | ${s(r.oku, 10)} | ` +
    `${s(r.enGenisUyg, 12)} | ${s(r.yaz, 11)} | ${s(r.kisisel, 7)}`);
}
const yd = YAPILANDIRMA.map((yp) => yuzey(yp).satir.find((r) => r.k === "yedek"));
console.log(`\nYedek kimliginin okudugu kayit bes yapilandirmada: ` +
  `${yd.map((r) => n(r.oku)).join(", ")} (kisisel ${n(yd[4].kisisel)}).`);

const istek = ISYUKU.reduce((a, w) => a + w[1], 0);
const yuk = ISYUKU.reduce((a, w) => a + w[1] * w[2], 0);
const cerEk = ISYUKU.reduce((a, w) => a + w[1] * cerceve(w[2]) * CERCEVE_EK, 0);
console.log(`\nAyni gunun is yuku: ${n(istek)} istek, ${n(yuk)} bayt tasindi.`);
console.log("is yuku                |   istek | istek bayti | cerceve eki | oran   | cozme adimi");
console.log("-----------------------|---------|-------------|-------------|--------|------------");
for (const [ad, sayi, b, bl] of ISYUKU) {
  const ek = cerceve(b) * CERCEVE_EK;
  console.log(`${ad.padEnd(22)} | ${s(sayi, 7)} | ${s(b, 11)} | ${s(sayi * ek, 11)} | ` +
    `${("%" + y(ek / b)).padStart(6)} | ${s(sayi * bl, 11)}`);
}
console.log(`${"toplam".padEnd(22)} | ${s(istek, 7)} | ${s(yuk, 11)} | ${s(cerEk, 11)} | ` +
  `${("%" + y(cerEk / yuk)).padStart(6)} | ${s(ISYUKU.reduce((a, w) => a + w[1] * w[3], 0), 11)}`);

const HAVUZ = 64, kitap = DERLEM.find((d) => d[1] === "kitap");
console.log(`\nBaglanti kurulumu ${n(ELSIKISMA)} bayt: ${HAVUZ} baglantilik havuzla ` +
  `${n(HAVUZ * ELSIKISMA)} bayt (%${y(HAVUZ * ELSIKISMA / yuk)}), istek basina baglantiyla ` +
  `${n(istek * ELSIKISMA)} bayt (%${y(istek * ELSIKISMA / yuk)}).`);
console.log(`Duragan sifreleme ${n(TOPLAM_BLOK)} blok x ${BLOK_EK} bayt = ` +
  `${n(TOPLAM_BLOK * BLOK_EK)} bayt ek (%${y(TOPLAM_BLOK * BLOK_EK / TOPLAM_BAYT)}); tek noktasal ` +
  `okuma 1 blok cozer, kitap derleminin taranmasi ${n(blok(bayt(kitap)))}.`);
console.log(`\nkosumdan bagimsiz: cerceve eki ${CERCEVE_EK} bayt sabittir, orani yanit boyuna ` +
  `bolunur — 208 baytlik yanitta %${y(CERCEVE_EK / 208)}, dolu cercevede ` +
  `%${y(CERCEVE_EK / 16384)}, ${(16384 / 208).toFixed(0)} kat.`);
7 derlem, 154.540 kayit, 24.665.680 bayt, 5 uygulama kimligi; kayit sutunlari bes kimlik uzerinden toplanmistir.

yapilandirma                    | kimlik | okunabilir | en genis uyg | yazilabilir | kisisel
--------------------------------|--------|------------|--------------|-------------|--------
Y0 kimlik dogrulama kapali      | hayir  |    772.700 |      154.540 |     772.700 | 184.900
Y1 kume geneli tek rol          | evet   |    772.700 |      154.540 |     772.700 | 184.900
Y2 veritabani duzeyi rol        | evet   |    387.980 |       58.360 |     233.440 | 184.180
Y3 derlem duzeyi (en az yetki)  | evet   |    276.140 |       52.000 |      24.800 | 118.580
Y4 derlem duzeyi + ozet derlemi | evet   |    252.900 |       52.000 |      24.800 |  93.780

Yedek kimliginin okudugu kayit bes yapilandirmada: 154.540, 154.540, 154.540, 154.540, 154.540 (kisisel 36.980).

Ayni gunun is yuku: 204.813 istek, 305.071.440 bayt tasindi.
is yuku                |   istek | istek bayti | cerceve eki | oran   | cozme adimi
-----------------------|---------|-------------|-------------|--------|------------
katalog-arama noktasal | 180.000 |       1.472 |   5.220.000 |  %1,97 |     180.000
odunc-uc noktasal      |  20.000 |         640 |     580.000 |  %4,53 |      20.000
ceza-isleme noktasal   |   4.800 |         208 |     139.200 | %13,94 |       4.800
rapor ozet taramasi    |      12 |     137.280 |       3.132 |  %0,19 |         408
gecelik yedek          |       1 |  24.665.680 |      43.674 |  %0,18 |       6.024
toplam                 | 204.813 | 305.071.440 |   5.986.006 |  %1,96 |     211.232

Baglanti kurulumu 5.200 bayt: 64 baglantilik havuzla 332.800 bayt (%0,11), istek basina baglantiyla 1.065.027.600 bayt (%349,11).
Duragan sifreleme 6.024 blok x 28 bayt = 168.672 bayt ek (%0,68); tek noktasal okuma 1 blok cozer, kitap derleminin taranmasi 1.797.

kosumdan bagimsiz: cerceve eki 29 bayt sabittir, orani yanit boyuna bolunur — 208 baytlik yanitta %13,94, dolu cercevede %0,18, 79 kat.

Kimlik Doğrulamak Yüzeyi Küçültmüyor, Kapsam Küçültüyor

Birinci tablonun ilk iki satırı aynı: 772.700 okunabilir, 772.700 yazılabilir, 184.900 kişisel kayıt. Kimlik doğrulamasını açmak açık yüzeyi bir kayıt bile küçültmedi.

Farkı tablo göstermiyor, çünkü tablo kimlik sayısını sabit tutuyor. Y0’da o sayı beş değildir: depoya ulaşabilen her istemci bu beş satırdan biri gibi davranır, silme dahil. Y0’ın açık yüzeyi 772.700 değil, erişebilen istemci sayısı çarpı 154.540’tır. Kimlik doğrulaması yüzeyi küçülten değil, onu sonlu bir kimlik kümesine bağlayan ayardır; küçültme işini kapsam yapar.

Kapsamın üç düzeyi üç sayı veriyor: veritabanı düzeyi okunabilir kaydı 387.980’e, derlem düzeyi 276.140’a indirdi. Asıl fark yazmadadır — 772.700 → 233.440 → 24.800, yani 31,2 kat — çünkü beş kimlikten yalnız ikisinin yazması gerekir.

en genis uyg sütunu tek bir kimlik ele geçtiğinde görüneni veriyor: 154.540 → 58.360 → 52.000. Ama o sütun yedek kimliğini dışarıda bırakıyor; altındaki satıra göre yedeğin okuduğu kayıt beş yapılandırmanın hepsinde 154.540 kaldı, 36.980’i kişisel. En az yetki en kötü durumu değiştirmedi, onu tek bir kimliğe hapsetti; sınırı, işi gereği her şeyi okuyan kimliktir.

Y4 son adımı gösteriyor: rapor işine kişisel alan taşımayan bir özet derlemi verildiğinde okunabilir kayıt 252.900’e, kişisel kayıt 93.780’e indi. Yetki daraltmanın bittiği yerde veri daraltmak başlar.

Şifrelemenin Bedeli Sabittir, Oranı Değil

İkinci tablo aktarım şifrelemesini aynı günün iş yükünde hesaplıyor: toplam oran %1,96, yani 305.071.440 bayta karşılık 5.986.006 bayt. Yayılma büyüktür — 208 baytlık ceza yanıtında %13,94, 24.665.680 baytlık yedek aktarımında %0,18. Çerçeve eki 29 bayt olarak sabittir; oranı belirleyen şifreleme değil yanıtın küçüklüğüdür, ve son satır bunu koşumdan bağımsız veriyor: 79 kat.

Asıl kalem tablonun altındadır. Bağlantı kurulumu bağlantı başına 5.200 bayttır: 64 bağlantılık havuzla günde 332.800 bayt, yükün %0,11’i. Aynı iş yükü her istek için yeni bağlantı açtığında 1.065.027.600 bayta, taşınan verinin %349’una çıkıyor. Aktarım şifrelemesini pahalı gösteren çoğu kez bağlantı kurma biçimidir.

Durağan şifreleme ayrı bir kalemdir: 6.024 blok × 28 bayt = 168.672 bayt, verinin %0,68’i ve veri boyundan bağımsız. Yerdeki bedel küçüktür; asıl bedel işlem adımıdır ve kayıt sayısıyla değil dokunulan blok sayısıyla ölçülür: noktasal okuma 1, kitap derlemi taraması 1.797. Günün 204.813 isteği 211.232 çözme adımı üretiyor, 6.024’ü tek bir gecelik yedeğe ait.

Özet

  • Açık yüzey sayılabilir bir niceliktir: tanımlı kimliklerin okuyabildiği kayıt toplamı, yanında yazılabilir ve kişisel kayıt toplamı.
  • Kimlik doğrulamasını açmak açık yüzeyi hiç küçültmedi (772.700 → 772.700); o ayar yüzeyi sonlu bir kimlik kümesine bağlar. Kapalıyken açık yüzey erişebilen istemci sayısı çarpı 154.540’tır, yazma ve silme dahil.
  • Kapsamı küme geneli rolden derlem düzeyine indirmek okunabilir kaydı 276.140’a, yazılabilir kaydı 24.800’e (31,2 kat) indirdi.
  • En az yetki en kötü durumu değiştirmedi: yedek kimliği beş yapılandırmanın hepsinde 154.540 kaydın tamamını okudu. Yetki daraltmanın bittiği yerde veri daraltmak başlar — rapor işine özet derlemi verildiğinde kişisel kayıt 118.580’den 93.780’e indi.
  • Aktarım şifrelemesinin çerçeve eki 29 bayt olarak sabittir: oranı 208 baytlık yanıtta %13,94, dolu çerçevede %0,18. Havuzsuz bağlantı kurulumu taşınan verinin %349’unu ekliyor.
  • Durağan şifreleme yerde %0,68 tutar; işlem bedeli dokunulan blok sayısıdır — noktasal okumada 1, kitap derlemi taramasında 1.797 ek çözme adımı.

Kurs Kapanışı

Bu kurs on dokuz derste tek bir soruyu sordu: aynı iş iki modelde ya da iki kararla koşturulduğunda ölçülen fark nedir ve hangi güvenceden vazgeçilmiştir.

Ders Karşılaştırılan iki model/karar Ölçülen fark Vazgeçilen güvence
Anahtar–Değer Depoları anahtar erişimi — dizin ceza sorgusu 1 — 20.000 gidiş alan üzerinde koşul
Belge Veritabanları belge — ilişkisel iç içe kayıt 1 — 4 gidiş yazma anında denetim
Geniş Sütun Depoları satır — aile yerleşimi dolaşım özeti 1.867 — 46 sayfa tek yerleşimin iki örüntüye yetmesi
Çizge Veritabanları birleştirme — dolaşma beşinci derecede 14.190.839 — 217.544 maliyetin dereceden bağımsızlığı
Zaman Serisi Depoları tam damga — fark kodlaması 9.331.200 — 329.013 bayt erişim birimi bölüt olur
Model Seçim Ölçütleri tek örüntü — karışım kazanan karışımla değişiyor puanlamanın yazmayı sayması
Belge Veri Tipleri açık — kısa ad — sabit şema 7.357.008 — 6.082.574 — 3.139.138 bayt alan adının depoda durması
Gömme ve Referans gömülü — referanslı şema şube sorgusu 6.149.233 — 781.096 bayt kitap sayfasının tek gidişi
Sorgu İşleçleri belge düzeyi — öge düzeyi bağlaç 6.033 — 3.340 belge koşulların aynı ögede karşılanması
Toplama Boru Hattı süzme önce — gruplama önce doruk bellek 2.418 — 40.276 aşama sırasının serbestliği
Dizinleme kesişim — öge düzeyi bileşik dizin 6.033 — 3.340 okunan belge bakım 10.840 — 173.994 giriş
Şema Doğrulama yüzeysel — tam kural, reddet kipi 2.500 — 3.200 yakalanan belge sıradan yazmaların geçmesi
İşlemler tek belge — çok belgeli işlem 0/20 — 12/20 ihlal, 18 iptal iptalsizlik, 604.903 bayt geri alma
Çoğaltma Kümeleri üç–dört — beş üyeli küme 12 yazmasız tur, geri alınan 9 — 6 kabul edilmiş yazmanın kalıcılığı
Parçalama alinma_gunukarma(alinma_gunu)uye_id sıcak pay %100 — %59,6 dengenin sıcak parçayı önlemesi
Okuma ve Yazma İlgileri w=1w=çoğunlukw=hepsi onay turu 0/10/16, kayıp yazma 3/0/0 yazma erişilebilirliği
Tutarlılık Modelleri yapışkan yönlendirme — oturum belirteci nedensel kopma 24 → 12 → 0 bayat okumanın 47/108 kalması
CAP ve PACELC w=çoğunluk·çoğunluk — w=1·yerel 16 red/16 yanıtsız — 0 yanıtsız azınlıktaki kabulün kalıcılığı
Güvenlik Yapılandırması küme geneli rol — en az yetki yazılabilir 772.700 — 24.800 tek kimliğin her işi görmesi

Sağdaki iki sütun kursun kuralıdır: aile değil erişim örüntüsü seçilir; her model bir güvenceden vazgeçerek bir başarım satın alır. Bir aileyi adıyla seçmek karar değildir — karar, hangi işin kaç kat ucuzlayacağını ve hangi güvencenin düşeceğini yazmaktır. On dokuz satırın hiçbirinde bedelsiz bir kazanç yok.

Bu on dokuz satırın söylenmemiş ortak bir varsayımı daha var. Anahtar–değer deposu değeri diske yazdı, geniş sütun deposu bellekteki tabloyu dosyaya döktü, çoğaltma kümesi onayı yazma diske indikten sonra verdi ve durağan şifreleme bu derste tam olarak o diski şifreledi. Verinin tamamının bellekte tutulduğu ve dayanıklılığın kendisinin bir ayara dönüştüğü depolar hiç ele alınmadı. Bir sonraki kurs — Bellek İçi Depolar ve Önbellek Sistemleri — oradan başlı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