İçeriğe geç
academia.sh

Ders 22 / 22

Güvenlik

Deponun yapılandırması bir güvenlik kararıdır: kimlik doğrulaması kapalı varsayılan kurulumda yabancıya açılan anahtar, bayt ve gizli bayt sayısının ölçülmesi, komut kısıtlamasının sunucu tarafı betikleme açık bırakıldığında kapattığı yıkıcı yüzeyi bütünüyle geri açtığının gösterilmesi, ağ yalıtımının yabancıyı yüzeyin dışına çıkarması ve şifrelemenin bedelinin bağlantı başına ek adım, çerçeve başına ek bayt ve bağlantı başına tampon olarak sayılıp doksan eş zamanlı bağlantıdan sonra tamponun verinin kendisini geçtiğinin hesaplanması.

İçindekiler

Bu kursun bütün ölçümleri deponun yalnız kendi istemcileriyle konuştuğunu varsaydı; şimdiye kadar sayılan her maliyet, komutu kimin gönderdiği sorulmadan ödendi. Bu ders o boşluğu kapatır ve kimlik mekaniğini değil deponun yapılandırmasını ele alır: kim bağlanabiliyor, bağlanan hangi komut sınıflarını çalıştırabiliyor ve bu kararların bellek bütçesindeki karşılığı ne.

Yapılandırma Bir Yüzeydir

Varsayılan kurulum sade tutulur: kimlik doğrulaması kapalı, bütün ağ arayüzlerinde dinleyen ve her komut sınıfını kabul eden bir süreç. Bu kurulumun ölçülebilir bir yüzeyi vardır ve ölçüsü anahtar sayısıyla bayttır.

Yüzeyi belirleyen üç karar birbirinin yerine geçmez. Kimlik doğrulaması kimin bağlanabildiğine, komut kısıtlaması bağlananın ne yapabildiğine, ağ yalıtımı ise bağlantı denemesinin depoya hiç ulaşıp ulaşmadığına karar verir. Dördüncü karar olan şifreleme yüzeyi daraltmaz; aktarımdaki veriyi okunmaz kılar ve tek maliyet kalemi odur.

Düzenek

Düzenek bir modeldir: gerçek depo, ağ ya da bağlantı kurulmaz, erişim bir sayıdır. Komut adları değil komut sınıfları sayılır; adım soyut bir gidiştir, ölçülmüş süre değildir.

BK17 — anahtar alanı katalog (3.000 × 240 bayt), oturum (8.000 × 120), ödünç (12.000 × 96), kuyruk (800 × 128) ve şube sayaçlarından (6 × 64) oluşur; oturum, ödünç ve kuyruk gizlidir. Gerekçe: bu üç alan okur kimliğine bağlı veri taşır, katalog ile sayaçlar taşımaz. BK18 — bağlantı başına şifreleme tamponu 32.768 bayt, çerçeve başına ek 29 bayt, bağlantı başına ek adım 3’tür (el sıkışma 2 + kimlik 1). Gerekçe: üç kalem üç ayrı ölçeğe bağlıdır — tampon bağlantı başına ayrılır, ek bayt her çerçevede yinelenir, el sıkışma yalnız bağlantı kurulurken ödenir. BK19 — sunucu tarafı betikleme açıkken çağıranın erişebildiği her adım betik içinden de yürütülebilir. Gerekçe: betik ayrı bir yetki alanı değildir.

// guvenlik/olc.mjs — acik yuzey ve yapilandirma bedeli SUREC ICI MODELDIR. Gercek depo, ag ya da
// baglanti kurulmaz; erisim bir sayidir. Komut ADLARI degil komut SINIFLARI sayilir. Adim soyut
// bir gidistir, olculmus sure degildir.
const ALAN = [                       // [ad, giris, giris bayti, gizli mi]
  ["katalog", 3000, 240, false], ["oturum", 8000, 120, true], ["odunc", 12000, 96, true],
  ["kuyruk", 800, 128, true], ["sayac", 6, 64, false]];
const SINIF = [                      // [ad, yikici mi, betik mi]
  ["okuma", false, false], ["yazma", false, false], ["silme", true, false],
  ["alan bosaltma", true, false], ["yapilandirma", true, false], ["betik", true, true]];
const TAMPON = 32768, CERCEVE = 29, ELSIKISMA = 2, KIMLIK_ADIM = 1;
const ROL = 4, ROL_BAYT = 128, IZIN_BAYT = 24;

const anahtar = ALAN.reduce((a, [, n]) => a + n, 0);
const bayt = ALAN.reduce((a, [, n, b]) => a + n * b, 0);
const gizli = ALAN.reduce((a, [, n, b, g]) => a + (g ? n * b : 0), 0);

// yapilandirma: [kimlik dogrulamasi, yikici siniflar acik, betik acik, ag yalitimi, sifreleme]
const AYAR = [
  ["varsayilan", false, true, true, false, false], ["kimlik", true, true, true, false, false],
  ["kisit+betik", true, false, true, false, false], ["kisit", true, false, false, false, false],
  ["yalitim", true, false, false, true, false], ["yalitim+sifreleme", true, false, false, true, true]];

function yuzey([, kimlik, yikici, betik, yalitim]) {
  const acik = SINIF.filter(([, y, b]) => (y ? yikici : true) && (b ? betik : true));
  // Yabanci: kimligi dogrulanmamis ag cagrisi. Yalitim varsa hic ulasamaz.
  const yabanciAcik = yalitim || kimlik ? 0 : 1;
  // Uygulama: kimligi dogrulanmis, kisitli rol. Betik acikken kapatilan siniflar geri acilir.
  const uygulamaYikici = yikici || betik ? bayt : 0;
  return { acik: acik.length, yabanciAnahtar: yabanciAcik * anahtar, yabanciBayt: yabanciAcik * bayt,
           yabanciGizli: yabanciAcik * gizli, uygulamaYikici };
}

const s = (x, n) => String(x).padStart(n);
const yuz = (x, n) => s((x * 100).toFixed(1) + "%", n);
console.log(`Anahtar alani: ${anahtar} anahtar, ${bayt} bayt; bunun ${gizli} bayti gizli`);
console.log("(oturum, odunc, kuyruk). Alti komut sinifi: okuma, yazma, silme, alan bosaltma,");
console.log("yapilandirma, betik. Yabanci = kimligi dogrulanmamis ag cagrisi.\n");
console.log("yapilandirma      | acik sinif | yabanci anahtar | yabanci bayt | gizli bayt | uygulamanin yikabildigi");
console.log("------------------|------------|-----------------|--------------|------------|------------------------");
for (const a of AYAR) {
  const r = yuzey(a);
  console.log(`${a[0].padEnd(17)} | ${s(r.acik + "/6", 10)} | ${s(r.yabanciAnahtar, 15)} | ` +
    `${s(r.yabanciBayt, 12)} | ${s(r.yabanciGizli, 10)} | ${s(r.uygulamaYikici, 18)} bayt`);
}

const ISTEK = 200000;
console.log(`\nAdim bedeli (${ISTEK} istek; el sikisma ${ELSIKISMA} + kimlik ${KIMLIK_ADIM} = 3 adim/baglanti):`);
console.log("baglanti basina istek | baglanti | ek adim | istek basina ek adim | cerceve ek bayti");
console.log("----------------------|----------|---------|----------------------|-----------------");
for (const k of [1, 10, 100, 1000]) {
  const b = Math.ceil(ISTEK / k), ek = b * (ELSIKISMA + KIMLIK_ADIM);
  console.log(`${s(k, 21)} | ${s(b, 8)} | ${s(ek, 7)} | ${s((ek / ISTEK).toFixed(3), 20)} | ` +
    `${s(ISTEK * 2 * CERCEVE, 11)} bayt`);
}

console.log("\nSifrelemenin BELLEK bedeli (baglanti basina 16 KiB okuma + 16 KiB yazma tamponu):");
console.log("es zamanli baglanti | tampon bayt | veri bayt | tampon / veri | rol+izin tablosu");
console.log("--------------------|-------------|-----------|---------------|-----------------");
for (const n of [8, 32, 128, 512]) {
  console.log(`${s(n, 19)} | ${s(n * TAMPON, 11)} | ${s(bayt, 9)} | ${yuz(n * TAMPON / bayt, 13)} | ` +
    `${s(ROL * ROL_BAYT + ROL * SINIF.length * IZIN_BAYT, 11)} bayt`);
}

const defter = ROL * ROL_BAYT + ROL * SINIF.length * IZIN_BAYT;
console.log("\nkosumdan bagimsiz nicelikler:");
console.log("  cerceve ek bayti  = istek x 2 x " + CERCEVE + " bayt; baglanti sayisindan bagimsiz");
console.log("  istek basina adim = 3 / (baglanti basina istek)");
console.log("  sifreleme tamponu = es zamanli baglanti x " + TAMPON + " bayt");
console.log("  rol+izin defteri  = " + ROL + "x" + ROL_BAYT + " + " + ROL + "x" + SINIF.length + "x" +
  IZIN_BAYT + " = " + defter + " bayt; baglantidan bagimsiz");
console.log("  tampon veriyi gecer: ceil(" + bayt + " / " + TAMPON + ") = " + Math.ceil(bayt / TAMPON) +
  " es zamanli baglanti");
Anahtar alani: 23806 anahtar, 2934784 bayt; bunun 2214400 bayti gizli
(oturum, odunc, kuyruk). Alti komut sinifi: okuma, yazma, silme, alan bosaltma,
yapilandirma, betik. Yabanci = kimligi dogrulanmamis ag cagrisi.

yapilandirma      | acik sinif | yabanci anahtar | yabanci bayt | gizli bayt | uygulamanin yikabildigi
------------------|------------|-----------------|--------------|------------|------------------------
varsayilan        |        6/6 |           23806 |      2934784 |    2214400 |            2934784 bayt
kimlik            |        6/6 |               0 |            0 |          0 |            2934784 bayt
kisit+betik       |        2/6 |               0 |            0 |          0 |            2934784 bayt
kisit             |        2/6 |               0 |            0 |          0 |                  0 bayt
yalitim           |        2/6 |               0 |            0 |          0 |                  0 bayt
yalitim+sifreleme |        2/6 |               0 |            0 |          0 |                  0 bayt

Adim bedeli (200000 istek; el sikisma 2 + kimlik 1 = 3 adim/baglanti):
baglanti basina istek | baglanti | ek adim | istek basina ek adim | cerceve ek bayti
----------------------|----------|---------|----------------------|-----------------
                    1 |   200000 |  600000 |                3.000 |    11600000 bayt
                   10 |    20000 |   60000 |                0.300 |    11600000 bayt
                  100 |     2000 |    6000 |                0.030 |    11600000 bayt
                 1000 |      200 |     600 |                0.003 |    11600000 bayt

Sifrelemenin BELLEK bedeli (baglanti basina 16 KiB okuma + 16 KiB yazma tamponu):
es zamanli baglanti | tampon bayt | veri bayt | tampon / veri | rol+izin tablosu
--------------------|-------------|-----------|---------------|-----------------
                  8 |      262144 |   2934784 |          8.9% |        1088 bayt
                 32 |     1048576 |   2934784 |         35.7% |        1088 bayt
                128 |     4194304 |   2934784 |        142.9% |        1088 bayt
                512 |    16777216 |   2934784 |        571.7% |        1088 bayt

kosumdan bagimsiz nicelikler:
  cerceve ek bayti  = istek x 2 x 29 bayt; baglanti sayisindan bagimsiz
  istek basina adim = 3 / (baglanti basina istek)
  sifreleme tamponu = es zamanli baglanti x 32768 bayt
  rol+izin defteri  = 4x128 + 4x6x24 = 1088 bayt; baglantidan bagimsiz
  tampon veriyi gecer: ceil(2934784 / 32768) = 90 es zamanli baglanti

Açık Yüzeyin Okunması

Varsayılan kurulumda yüzey veri kümesinin tamamıdır. İlk satır 23.806 anahtar ve 2.934.784 bayt gösteriyor; bunun 2.214.400 baytı hangi okurun neyi ödünç aldığı bilgisidir. Altı komut sınıfının altısı da açıktır: aynı çağrı bu baytları okumakla kalmaz, anahtar alanını boşaltabilir.

Kimlik doğrulaması yabancıyı çıkarır, uygulamayı sınırlamaz. İkinci satırda yabancı sütunları sıfıra iner ama son sütun değişmez: 2.934.784 bayt hâlâ yıkılabilir. Kimlik doğrulaması “kim” sorusunu yanıtlar, “ne yapabilir” sorusunu yanıtlamaz. Katalog güncelleyen toplu iş ile ödünç kaydı yazan uygulama aynı kimlikle bağlanıyorsa, birindeki hata bütün anahtar alanını götürür.

Komut kısıtlaması betikleme açıkken hiçbir şey kapatmaz. Üçüncü satır dersin asıl bulgusudur: açık sınıf 6’dan 2’ye inmiş, yıkıcı sınıflar kapatılmıştır, ama uygulamanın yıkabildiği bayt 2.934.784’te kalır. Sunucu tarafı betikleme çağıranın adımlarını yürütür; kapı kapatılmış, pencere açık bırakılmıştır. Dördüncü satırda betikleme de kısıtlandığında yıkıcı yüzey sıfırlanır.

Ağ yalıtımı bir sonraki katmandır, yerine geçen değil. Beşinci satır dördüncüden farklı bir sayı üretmiyor; yine de yalıtım, kimlik doğrulaması devre dışı kaldığında ilk satıra dönülmesini engeller. Altıncı satır da şifrelemenin yüzeyi hiç daraltmadığını gösteriyor.

Kimliğin Ucuzluğu, Şifrelemenin Pahalılığı

İkinci ve üçüncü tablolar faturayı kalem kalem yazıyor ve üç kalem üç ayrı ölçeğe bağlı.

Rol ve izin defteri pratik olarak bedavadır: 1.088 bayt, üstelik bağlantı sayısından bağımsızdır. Yüzeyi 2.934.784 bayttan sıfıra indiren karar, bellek bütçesinde binde birlik bir yer tutmaz.

El sıkışma bağlantı başınadır, bu yüzden bedeli yeniden kullanımla erir. Bağlantı başına tek istek düştüğünde 200.000 bağlantı ve 600.000 ek adım ödenir — istek başına 3 adım, işin kendisinden pahalı. Bağlantı başına bin istekte aynı kalem 600 adıma, istek başına 0,003’e iner. Şifrelemenin adım maliyeti bir şifreleme sorunu değil, bağlantı yönetimi sorunudur.

Çerçeve eki yeniden kullanımdan etkilenmez: 200.000 istek için 11.600.000 bayt, dört satırda da aynı.

Asıl bellek kalemi bağlantı tamponudur. Tampon 8 eş zamanlı bağlantıda verinin yüzde 8,9’u, 128 bağlantıda yüzde 142,9’u, 512 bağlantıda yüzde 571,7’sidir. Koşumdan bağımsız satır dönüm noktasını veriyor — 90 eş zamanlı bağlantıdan sonra şifreleme tamponları saklanan verinin kendisinden fazla yer tutar. Bellek içi bir depoda bu, tahliye politikasının ne zaman devreye gireceğini değiştiren bir sayıdır.

Özet

  • Varsayılan kurulumun yüzeyi veri kümesinin tamamıdır: 23.806 anahtar, 2.934.784 bayt (2.214.400’ü gizli) ve altı komut sınıfının altısı da açıktır.
  • Kimlik doğrulaması yabancının eriştiği baytı sıfırlar ama doğrulanmış çağrının yıkabildiği 2.934.784 baytı bırakır; iki karar ayrıdır.
  • Komut kısıtlaması betikleme açıkken yıkıcı yüzeyi hiç küçültmedi: açık sınıf 6’dan 2’ye indiği hâlde yıkılabilir bayt 2.934.784’te kaldı, betikleme kısıtlanınca sıfırlandı.
  • Rol ve izin defteri 1.088 bayttır ve bağlantı sayısından bağımsızdır: yüzeyi sıfırlayan karar bellekte yer tutmaz.
  • Şifrelemenin adım bedeli yeniden kullanımla erir (istek başına 3,000 → 0,003) ama çerçeve eki sabittir: 200.000 istek için 11.600.000 bayt.
  • Şifrelemenin bellek bedeli bağlantı başınadır; 90 bağlantıdan sonra tamponlar saklanan veriyi geçer, 512 bağlantıda oran yüzde 571,7’dir.

Kurs Kapanışı

Ders Tutulan bayt Satın alınan Kaybedilen
Anahtar–Değer Temelleri 20.000 giriş, 2.397.230 bayt (120 bayt/giriş) süre sonu zirveyi 262.936 bayta indirdi 16.951 fazladan yeniden giriş
Dizgiler ve Sayaçlar 200.000 sayaç, 15.545.901 bayt (sayı 77,7 bayt) sorgu 119.993 → 1 adım; atomik artırmada kayıp sıfır bayt başına 77,2 adım (kısmi sayaçta 6.410)
Listeler bağlı düğüm giriş başına 43,0 bayt (dizi 19,0) işlem 1.673 → 1 adım sıra sorgusu yine tarama (14.500 adım); kırpma pencereyi iki saate daraltır
Karma Yapılar 200.000 kayıt 91,2 MB (bütünsel 43,8 MB) günlük yazma 39,2 → 5,4 MB, okuma 105,8 → 9,3 MB kayıt başına 237 bayt üstveri
Kümeler ve Sıralı Kümeler 38.000 üye 2.052.056 bayt (liste 532.056) üyelik 28.464,2 → 1,0 adım sıra bilgisi; atlamalı listede 3.135.704 bayt fazla
Bit Eşlemler ve Olasılıksal Yapılar bit eşlem 250.001, kestirim 4.096 bayt tam kümeye göre 16 ve 1.024 kat az yer %2,53 yanlış olumlu; hangi okurun sayıldığı
Akışlar uzunluk sınırında 5.078, güvenli kırpmada 9.031 KiB okuma konumu 16 bayt; üç grubun defteri 48 bayt sınırlı kırpmada 38.920 ve 46.220 giriş kaçtı
Uzamsal Dizinler hücre kovası 5,09, sıralı küme 25,48 bayt/üye taranan aday 120.000 → 821,22 hücre kovasında tane ekleme anında sabitlenir
Sunucu Tarafı Betikleme betik önbelleği 642, kilit tablosu tepede 88.000 bayt her eşzamanlılıkta tam üç ödünç (istemcide 31,93) uzun betik 8.000 komutu kuyrukta bekletti
Anlık Görüntü Kalıcılığı dosya 717.260 bayt (bellekte 1.593.100) ortalama kayıp 10.001 → 501 yazma disk yazımı 2 → 30 MB; kopyalamada tepe 59.565 bayt
Ekleme Günlüğü Kalıcılığı yazma başına 39,7 bayt, dosya yazmayla doğrusal her yazmada eşzamanlamada kayıp sıfır 60.000 eşzamanlama; görüntünün 3,32 katı dosya
Kalıcılık Seçimi birlikte kullanım 4.229.117 bayt, 23 eşzamanlama kurtarma 55.000 → 32.330 adım, okunan bayt 1.247.842 yalnız görüntüyle 9.816 giriş eksik ya da eski
Bellek Sınırı ve Tahliye Politikaları 400.000 baytlık bütçe, üstveri payı %9,9–%24,7 rastgele 4.938, en az sık kullanılan 4.123 giriş dar bütçede 4,4 puan isabet; ölü giriş 709.241 bayt
Süre Sonu Yönetimi tembelde 4.027.669, etkin temizlemede 1.464.802 bayt ölü pay %73,6 → %27,4 erişim başına 0,774 giriş dokunuşu
Çoğaltma dört kopyada 2.343,8 KiB (tek düğüm 468,8) + tampon 7,5–60 KiB düğüm başına okuma 400 → 80 11.420 bayat okuma; gecikme 8’de oran %47,96
Otomatik Devralma sıcak yedek 937,5 KiB (soğuk 468,8) kesinti 17 → 5 tur, kayıp 760 → 80 kayıt devralma başına 40/80/160/320 kabul edilmiş yazma
Kümeleme etiketsiz 1.539,6, şube etiketiyle 2.899,0 KiB çok anahtarlı işlem %2,32 → %100 yuva 8.709 → 6, dengesizlik 1,108 → 3,006
İşlemler ve İyimser Kilitleme izleme üstverisi 768 bayt (sayaçlar 384) sınır aşımı 86 → 0 480 → 4.314 tik; blok 16’da 96.414 istemci-tik bekleme
Yayımla–Abone Ol kanal başına 49 bayt (kalıcı yapıda 36.365–143.243) 600 yayım 753 teslim kopyası, defter tutulmaz abonesiz 74 yayım yok oldu; yavaş abonede 696 yayım
Tipik Kullanım Senaryoları karma biçim 60.623 bayt (dizgi 46.115) bin güncellemede yazma 90.454 → 8.000 bayt 14.508 bayt fazla; sıralı küme 2.893,4 bayt/kullanıcı
Ölçüm ve Yavaş Komut Analizi yavaş komut günlüğü eşik 20’de 108 kayıt, 6.422 bayt en uzun bekleme 3.999 → 38, toplam 58.681 birim tarama 6.001 yerine 8.001 birim, 398 giriş görülmedi
Güvenlik rol+izin defteri 1.088 bayt; tampon 128 bağlantıda 4.194.304 yabancıya açık 2.934.784 bayt ve yıkıcı yüzey sıfırlandı bağlantı başına 3 adım, 11.600.000 bayt çerçeve eki

Yirmi iki dersin tamamı aynı kuralın uygulamasıdır: bellek bir bütçedir; her yapı bir şey satın alır ve bir şey kaybettirir. Tablonun ikinci sütununda hiç sıfır yoktur — kestirim yapan yapı bile 4.096 bayt ister. Üçüncüde de yoktur; en ucuz kazanç bile bir kesinliği, bir sırayı, bir pencereyi ya da bir garantiyi geri verir. Deponun hızlı olması bu kursun konusu değil varsayımıydı; konu o hızın neye mal olduğuydu.

Buraya kadarki bütün erişimler tek bir ortak varsayımı taşıdı: anahtar biliniyordu. En karmaşık ölçümde bile ilk adım bilinen bir anahtardı; uzamsal dizin bunu yalnız görünüşte esnetti, orada da koordinat bir anahtara çevrildi. Oysa kütüphane katalogunda en sık sorulan soru budur: okur kitabın kimliğini değil, adında geçen bir sözcüğü bilir. Metnin içinde geçen bir sözcükten belgeye gitmek bu kursta hiç ele alınmadı ve anahtar–değer erişimiyle ele alınamaz. M17/K07 Arama Motorları ve Metin Erişimi bu soruyla açılı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