Ders 13 / 16
Sır Yönetimi Sistemleri
Sırrın ekseni ömürdür: statik sırda sızıntı penceresi sonsuzdur, ömrü belli kimlik bilgisinde ömür kadardır. Ömür taranır, yenileme yükü ve depo kesintisine dayanma sayılır, merkezî deponun kendi erişim yüzeyi kalem kalem çıkarılır.
İçindekiler
Önceki dersin anahtarı iptal edilene kadar geçerliydi; ölçülemeyen tek kalem buydu. Uygulamaların taşıdığı kimlik bilgileri için de aynısı geçerlidir: veri deposu kimliği, kuyruk anahtarı ve posta geçidi belirteci kurulum günü yazılır ve ne zaman değişecekleri hiçbir yerde yazmaz. Sırların üretimde nasıl saklandığı M22/K01’de, dağıtım hattının sırlara nasıl eriştiği M22/K04’te ölçüldü; ikisi de burada tekrarlanmıyor. Buranın tek ekseni ömürdür — bir kimlik bilgisi ne kadar süre geçerli kalıyor ve sızarsa pencere ne kadar açık duruyor.
- ST13. Beş sır, altı servis ve üç ortam kurgusal bölgesel ölçüm ağına aittir. Gerçek sır
yazılmadı, adlar kurgusaldır; ölçülen şey
nodeile yazılan modeldir. - ST14. Dönem otuz gün, yani 43.200 dakika sayıldı.
- ST15. Depo kesintisinde örneklerin kalan ömrü, ömür aralığına eşit aralıklarla dağıtıldı; rastgelelik yok. Gerçekte dağılım yenileme zamanlamasına bağlıdır, sonucun yönü değişmez.
- ST16. Bir kimlik bilgisi ya geçerlidir ya değil. Kısmi yetki, yenileme başarısızlığında yeniden deneme ve önbelleğe alınmış oturum modellenmiyor.
- ST17. Sırrın içeriği, üretilme biçimi ve şifrelenmesi ölçülmüyor. Ölçülen tek şey ömür ve erişim kalemidir.
- ST18. Merkezî depo tek bir yer olarak modellendi. Çoğaltılmış bir depo kesinti kalemini düşürür, erişim kalemini düşürmez.
Statik Sır Düzeni
Model beş sırrı, sırlara ihtiyaç duyan altı servisi, üç ortamı ve statik düzende sırrın durduğu
yerleri tutuyor. Ömür listesi taranacak değerleri veriyor; null ömrü olmayan, yani statik sırrı
gösteriyor.
// sir.mjs — sir kumesi, erisim matrisi ve omur modeli; gercek sir yok, adlar kurgusaldir export const SIR = ['veri-deposu-kimligi', 'kuyruk-anahtari', 'posta-gecidi-belirteci', 'olcut-yazma-anahtari', 'arsiv-anahtari']; export const SERVIS = { // servis -> ihtiyac duydugu sirlar 'okuma-toplayici': ['veri-deposu-kimligi', 'kuyruk-anahtari'], 'dogrulayici': ['veri-deposu-kimligi', 'kuyruk-anahtari'], 'faturalama': ['veri-deposu-kimligi', 'posta-gecidi-belirteci'], 'is-emri': ['veri-deposu-kimligi', 'kuyruk-anahtari', 'posta-gecidi-belirteci'], 'gecelik-toplu-is': ['veri-deposu-kimligi', 'arsiv-anahtari'], 'olcut-toplayici': ['olcut-yazma-anahtari'], }; export const ORTAM = ['gelistirme', 'hazirlik', 'uretim']; export const ORNEK = Object.keys(SERVIS).flatMap((s) => ORTAM.map((o) => ({ servis: s, ortam: o }))); export const STATIK_YER = ['yapilandirma-deposu', 'ortam-degiskeni', 'yedek-goruntusu', 'gelistirici-dizustu']; export const DONEM_DK = 30 * 24 * 60; // otuz gunluk donem export const OMUR = [5, 15, 60, 480, 1440, null]; // dakika; null = statik, omur yok // Insan ve otomasyon ozneleri; hangi sirlara erisebildikleri. export const OZNE = { 'op-a': SIR, 'op-b': ['veri-deposu-kimligi', 'kuyruk-anahtari', 'arsiv-anahtari'], 'op-c': ['posta-gecidi-belirteci'], 'dagitim': SIR, 'gozlem': ['olcut-yazma-anahtari'], }; // Her sir dinamik uretilemez; ikinci alan gerekcedir. export const DINAMIK = { 'veri-deposu-kimligi': [true, 'depo hesabi istege gore acilip kapatilabilir'], 'kuyruk-anahtari': [true, 'kuyruk gecici yetki verebiliyor'], 'olcut-yazma-anahtari': [true, 'yazma yetkisi kisa sureli verilebilir'], 'posta-gecidi-belirteci': [false, 'dis tarafca veriliyor, bizde uretilemez'], 'arsiv-anahtari': [false, 'sifreleme anahtari; dondurulurse eski arsiv okunamaz'], }; export const ornekKalem = () => ORNEK.reduce((a, o) => a + SERVIS[o.servis].length, 0); export const ozneKalem = () => Object.values(OZNE).reduce((a, s) => a + s.length, 0); export const dondurmeEtkisi = (s) => ORNEK.filter((o) => SERVIS[o.servis].includes(s)).length; // Depo kesintisinde her ornegin kalan omru: aralik esit araliklarla bolundu, rastgelelik yok. export const kalanOmur = (omur, n = ORNEK.length) => Array.from({ length: n }, (_, i) => (omur * (i + 0.5)) / n);
// kosum1.mjs — statik sir duzeninde kalemler ve dondurme maliyeti sayilir import { SIR, SERVIS, ORTAM, ORNEK, STATIK_YER, ornekKalem, dondurmeEtkisi } from './sir.mjs'; for (const [ad, v, not = ''] of [ ['sir', SIR.length], ['servis x ortam = ornek', ORNEK.length, `${Object.keys(SERVIS).length} servis, ${ORTAM.length} ortam`], ['(ornek, sir) kalemi', ornekKalem()], ['sirrin durdugu ayri yer', STATIK_YER.length, STATIK_YER.join(', ')], ['sir kopyasi (sir x yer)', SIR.length * STATIK_YER.length], ['sirrin omru', 'yok', 'kurulumdan beri degismedi'], ]) console.log(`${ad.padEnd(26)}${String(v).padStart(4)} ${not}`.trimEnd()); console.log('\nbir sirri dondurmek kac ornegi yeniden baslatir:'); for (const s of SIR) console.log(` ${s.padEnd(24)} ${dondurmeEtkisi(s)}`);
sir 5 servis x ortam = ornek 18 6 servis, 3 ortam (ornek, sir) kalemi 36 sirrin durdugu ayri yer 4 yapilandirma-deposu, ortam-degiskeni, yedek-goruntusu, gelistirici-dizustu sir kopyasi (sir x yer) 20 sirrin omru yok kurulumdan beri degismedi bir sirri dondurmek kac ornegi yeniden baslatir: veri-deposu-kimligi 15 kuyruk-anahtari 9 posta-gecidi-belirteci 6 olcut-yazma-anahtari 3 arsiv-anahtari 3
Beş sır, on sekiz servis örneğine dağıldığında otuz altı (örnek, sır) kalemi ediyor. Bunun
üstüne sırrın dört ayrı yerde durması geliyor: yapılandırma deposunda, çalışan sürecin ortam
değişkeninde, yedek görüntüsünde ve geliştirici dizüstünde. Beş sır çarpı dört yer, yirmi kopya.
Bu yerlerin ikisi — yedek görüntüsü ve dizüstü — erişim kaydı tutmaz; oradan okunan bir sırrın
okunduğu hiçbir yerde görünmez.
Alt blok döndürmenin neden yapılmadığını sayıyla veriyor. Veri deposu kimliği on beş örnekte kullanılıyor; onu değiştirmek on beş örneği yeniden başlatmak demek ve bu on beş örnek üç ayrı ortama yayılmış durumda. Döndürmenin maliyeti tam olarak döndürmemenin nedenidir. Sonuç, tabloda “ömür: yok” satırıdır — sır kurulumdan beri aynıdır, dolayısıyla sızmışsa sızdığı günden beri geçerlidir. Sızıntı penceresi burada bir süre değil, bir durumdur: birileri fark edene kadar açık.
Ömür Taraması
// kosum2.mjs — omur taranir: sizinti penceresi, yenileme yuku ve depo kesintisine dayanma import { ORNEK, DONEM_DK, OMUR, kalanOmur } from './sir.mjs'; const d1 = (x) => (Math.round(x * 10) / 10).toFixed(1); console.log('omur sizinti penceresi donemde depo kesintisinde 30 dk kesintide'); console.log('(dk) (ort. dk) yenileme ilk dusme / hepsi(dk) calisamayan ornek'); for (const omur of OMUR) { if (omur === null) { console.log(`${'statik'.padEnd(9)} ${'sonsuz'.padEnd(18)} ${String(0).padEnd(11)} ` + `${'-'.padEnd(21)} 0`); continue; } const kalan = kalanOmur(omur); console.log(`${String(omur).padEnd(9)} ${d1(omur / 2).padEnd(18)} ` + `${String(ORNEK.length * Math.round(DONEM_DK / omur)).padEnd(11)} ` + `${`${d1(kalan[0])} / ${d1(kalan[kalan.length - 1])}`.padEnd(21)} ${kalan.filter((k) => k < 30).length}`); }
omur sizinti penceresi donemde depo kesintisinde 30 dk kesintide (dk) (ort. dk) yenileme ilk dusme / hepsi(dk) calisamayan ornek 5 2.5 155520 0.1 / 4.9 18 15 7.5 51840 0.4 / 14.6 18 60 30.0 12960 1.7 / 58.3 9 480 240.0 1620 13.3 / 466.7 1 1440 720.0 540 40.0 / 1400.0 0 statik sonsuz 0 - 0
Tablo tek bir kararın üç ayrı sonucunu yan yana koyuyor. Beş dakikalık ömürde sızıntı penceresi ortalama iki buçuk dakikaya iniyor — sızmış bir kimlik bilgisi neredeyse hiçbir işe yaramaz. Bedeli sağdaki iki sütunda: dönemde yüz elli beş bin beş yüz yirmi yenileme ve depoda kesinti başladığında ilk örneğin altı saniye içinde, hepsinin beş dakika içinde çalışamaz hâle gelmesi. Statik satırı tam tersidir: sıfır yenileme, kesintiden hiç etkilenmeme ve sonsuz pencere.
Aradaki satırlar kararın gerçekten alındığı yerdir. Altmış dakikalık ömürde pencere yarım saate iniyor, yenileme on iki bin dokuz yüz altmışa düşüyor, ama otuz dakikalık bir depo kesintisinde on sekiz örneğin dokuzu çalışamaz hâle geliyor. Sekiz saatlik ömürde aynı kesintide yalnız bir örnek düşüyor ve pencere dört saate çıkıyor. Yirmi dört saatlik ömürde kesinti hiçbir örneği düşürmüyor, pencere on iki saat.
Sağdan ikinci sütun bu tablonun asıl bulgusudur: ömür, deponun kabul edilebilir kesinti süresini belirliyor. Kesinti seçilen ömrün altında kaldığı sürece örneklerin çoğu ayakta kalır; kesinti ömrü aştığında hepsi düşer. Yani “sızıntı penceresini kısaltalım” kararı, farkında olunmadan “deponun kesintisiz çalışması gerekiyor” kararıdır. Beş dakikalık ömür seçildiğinde depo, on sekiz örneğin hepsi için beş dakikadan uzun süre kaybolamayan bir bağımlılıktır — ve bu, hiçbir sırrın taşımadığı yeni bir kullanılabilirlik kalemi getirir.
Ömrü Kısaltılamayan Sırlar
Ömür taraması bütün sırların ömrünün seçilebildiğini varsayıyor. Beş sırdan kaçının ömrü gerçekten seçilebilir, ayrı bir sayıdır.
// kosum4.mjs — her sir dinamik uretilemez; omur ekseninin disinda kalan kalemler sayilir import { SIR, SERVIS, ORNEK, DINAMIK, ornekKalem } from './sir.mjs'; console.log('sir dinamik gerekce'); for (const s of SIR) console.log(` ${s.padEnd(24)} ${(DINAMIK[s][0] ? 'evet' : 'hayir').padEnd(8)} ${DINAMIK[s][1]}`); const statik = (s) => !DINAMIK[s][0]; const kalem = ORNEK.reduce((a, o) => a + SERVIS[o.servis].filter(statik).length, 0); const ornek = ORNEK.filter((o) => SERVIS[o.servis].some(statik)); console.log(''); for (const [ad, v] of [ ['omru kisaltilabilen sir', `${SIR.filter((s) => !statik(s)).length} / ${SIR.length}`], ['statik kalmak zorunda olan sir', `${SIR.filter(statik).length} / ${SIR.length}`], ['statik kalan (ornek, sir) kalemi', `${kalem} / ${ornekKalem()}`], ['en az bir statik sir tasiyan ornek', `${ornek.length} / ${ORNEK.length}`], ['bu orneklerde sizinti penceresi', 'sonsuz'], ]) console.log(`${ad.padEnd(36)}${v}`); console.log(`\ntasiyan servisler: ${[...new Set(ornek.map((o) => o.servis))].join(', ')}`);
sir dinamik gerekce veri-deposu-kimligi evet depo hesabi istege gore acilip kapatilabilir kuyruk-anahtari evet kuyruk gecici yetki verebiliyor posta-gecidi-belirteci hayir dis tarafca veriliyor, bizde uretilemez olcut-yazma-anahtari evet yazma yetkisi kisa sureli verilebilir arsiv-anahtari hayir sifreleme anahtari; dondurulurse eski arsiv okunamaz omru kisaltilabilen sir 3 / 5 statik kalmak zorunda olan sir 2 / 5 statik kalan (ornek, sir) kalemi 9 / 36 en az bir statik sir tasiyan ornek 9 / 18 bu orneklerde sizinti penceresi sonsuz tasiyan servisler: faturalama, is-emri, gecelik-toplu-is
Üç sır için dinamik üretim mümkün: veri deposu hesabı istek üzerine açılıp kapatılabiliyor, kuyruk geçici yetki verebiliyor, ölçüt yazma yetkisi kısa süreli tanımlanabiliyor. İki sır için mümkün değil ve gerekçeleri farklı türden. Posta geçidi belirteci dış bir tarafça veriliyor; ömrünü belirleyen taraf biz değiliz, dolayısıyla ömür ekseninde yapılabilecek bir şey yok. Arşiv anahtarı ise bir şifreleme anahtarıdır; döndürüldüğünde eski arşiv okunamaz hâle gelir, yani ömrünü kısaltmak sırrın işlevini bozar.
Sayılar tarama tablosunun kapsamını daraltıyor. Otuz altı (örnek, sır) kaleminin dokuzu ömür
ekseninin dışında kalıyor ve on sekiz örneğin dokuzu — faturalama, iş emri ve gecelik toplu iş — en
az bir statik sır taşımaya devam ediyor. Bu dokuz örnek için önceki bölümün bütün sütunları
geçersizdir: sızıntı penceresi ömür kadar değil, sonsuzdur. Beş dakikalık ömür seçilse bile sistemin
yarısı statik sır taşır. Ömür ekseni gerçek bir eksendir ama her sırra uygulanamaz ve
uygulanamayanlar tam olarak dışarıya bakan iki sırdır: posta geçidine giden belirteç ve arşivi açan
anahtar.
Merkezî Deponun Kendi Yüzeyi
// kosum3.mjs — merkezi deponun kendi yuzeyi: kac ozne kac sirra erisebiliyor import { SIR, ORNEK, STATIK_YER, OZNE, ornekKalem, ozneKalem } from './sir.mjs'; console.log('ozne erisebildigi sir'); for (const [o, s] of Object.entries(OZNE)) console.log(` ${o.padEnd(10)} ${String(s.length).padEnd(3)} ${s.length === SIR.length ? '(hepsi)' : s.join(', ')}`); console.log(` ${'servis'.padEnd(10)} ${ornekKalem()} (${ORNEK.length} ornek, ortalama ${ornekKalem() / ORNEK.length} sir)`); const toplam = ozneKalem() + ornekKalem(); console.log(`\nolcu statik merkezi depo`); for (const [ad, a, b] of [ ['sirrin durdugu ayri yer', STATIK_YER.length, 1], ['sir kopyasi', SIR.length * STATIK_YER.length, SIR.length], ['butun sirlari tasiyan nokta', STATIK_YER.length, 1], ['(ozne, sir) kalemi', toplam, toplam], ['kaydi tutulan ve iptal edilebilen', 0, toplam], ['butun sirlara erisen ozne', Object.values(OZNE).filter((s) => s.length === SIR.length).length, Object.values(OZNE).filter((s) => s.length === SIR.length).length], ['depo dustugunde yenileyemeyen ornek', 0, ORNEK.length], ]) console.log(`${ad.padEnd(36)} ${String(a).padEnd(8)} ${b}`);
ozne erisebildigi sir op-a 5 (hepsi) op-b 3 veri-deposu-kimligi, kuyruk-anahtari, arsiv-anahtari op-c 1 posta-gecidi-belirteci dagitim 5 (hepsi) gozlem 1 olcut-yazma-anahtari servis 36 (18 ornek, ortalama 2 sir) olcu statik merkezi depo sirrin durdugu ayri yer 4 1 sir kopyasi 20 5 butun sirlari tasiyan nokta 4 1 (ozne, sir) kalemi 51 51 kaydi tutulan ve iptal edilebilen 0 51 butun sirlara erisen ozne 2 2 depo dustugunde yenileyemeyen ornek 0 18
Üst blok deponun kendi erişim yüzeyidir. Beş öznenin ikisi beş sırrın beşine birden erişebiliyor:
bir operatör ve dağıtım otomasyonu. Matris yazılmış, üç özne için gerçekten daraltılmış, ikisi için
hiç daraltılmamış. Servis örnekleri otuz altı kalem ekliyor ve ortalaması iki — servisler dar,
insanlar geniş. Toplam elli bir (özne, sır) kalemi var ve her biri, o özne ele geçirilirse açılan
bir sırdır.
Alt tablo iki düzeni yan yana koyuyor ve ilk üç satır merkezî deponun kazancıdır: sırrın durduğu yer
dörtten bire, kopya yirmiden beşe, bütün sırları taşıyan nokta dörtten bire iniyor. Dördüncü satır
ise kazanç değil: (özne, sır) kalemi elli birde kalıyor. Merkezî depo erişim sayısını azaltmıyor.
Statik düzende de aynı elli bir erişim vardı; farkı, hiçbirinin bir yerde yazılı olmamasıydı.
Beşinci satır bu dersin gerçek kazancıdır. Statik düzende kaydı tutulan ve iptal edilebilen erişim sıfırdı — yedek görüntüsünden okunan bir sır için ne kayıt vardı ne de tek tek geri alınabilirdi. Merkezî depoda elli bir erişimin elli biri hem kaydedilebilir hem iptal edilebilir. Merkezî deponun verdiği şey daha az erişim değil, sayılabilir ve geri alınabilir erişimdir.
Son satır bedeli tekrarlıyor: depo düştüğünde on sekiz örnek yenileyemez, statik düzende sıfır örnek etkilenirdi. Kapatılamayan kalem de burada duruyor — bütün sırları taşıyan tek nokta. Statik düzende bu noktadan dört tane vardı, merkezî depoda bir tane var. Dörtten bire inmek gerçek bir kazançtır, ama sıfır olmuyor ve o tek nokta artık hem bütün sırları hem bütün servislerin çalışabilirliğini taşıyor.
Özet
- Statik düzende 5 sır 18 örneğe dağılıp 36
(örnek, sır)kalemi ediyor ve 4 ayrı yerde toplam 20 kopya hâlinde duruyor; bu yerlerin ikisi erişim kaydı tutmuyor. Döndürme maliyeti döndürmemenin nedenidir: en çok paylaşılan sırrı değiştirmek 15 örneği yeniden başlatmayı gerektiriyor, bu yüzden sır kurulumdan beri aynı ve sızıntı penceresi bir süre değil bir durum — biri fark edene kadar açık. - Ömür taraması üç sonucu birlikte veriyor: 5 dakikalık ömürde pencere 2,5 dakika ama dönemde 155.520 yenileme ve kesintide 5 dakika içinde 18 örneğin hepsi düşüyor; statikte pencere sonsuz, yenileme 0 ve kesintinin hiç etkisi yok.
- Ömür, deponun kabul edilebilir kesinti süresini belirliyor: 60 dakikalık ömürde 30 dakikalık bir kesinti 18 örneğin 9’unu, 480 dakikalık ömürde 1’ini, 1440 dakikalık ömürde hiçbirini düşürüyor.
- Ömür ekseni her sırra uygulanamıyor: 5 sırdan 2’si statik kalmak zorunda (biri dış tarafça veriliyor, öteki şifreleme anahtarı) ve 36 kalemin 9’u, 18 örneğin 9’u ömür ekseninin dışında kalıp sonsuz pencereyi koruyor.
- Merkezî depo sırrın durduğu yeri 4’ten 1’e, kopyayı 20’den 5’e indiriyor ama
(özne, sır)kalemi 51’de kalıyor; 5 öznenin 2’si bütün sırlara erişiyor. Kazanç erişimin azalması değil, 0 olan kaydedilebilir ve iptal edilebilir erişimin 51 olmasıdır. - Kapatılamayan kalem, bütün sırları taşıyan tek noktadır: statik düzende 4 taneydi, merkezî depoda 1 tane — ama o tek nokta artık 18 örneğin çalışabilirliğini de taşıyor.
Sonraki Adım
Bu üç ders üç ayrı yoğunlaşma noktası bıraktı: dışarıya bakan yönetim düğümü, bütün erişimin geçtiği sıçrama sunucusu ve bütün sırları taşıyan depo. Üçünün de ortak bir özelliği var — üçü de yazılımdır ve üçünün de yazılımı eskiyor. Bir sertleştirme adımı, koştuğu kodun bilinen bir açığı kalmadığı sürece geçerlidir. Sonraki dersin sorusu bu yüzden yamalardır: bir düzeltme yayımlandığı anla makinelere uygulandığı an arasında kaç makine ne kadar süre açık kalıyor, yama penceresini daraltmak kaç yeniden başlatma ve kaç kesinti dakikası istiyor, otomatik uygulanan yama ile onaylanarak uygulanan yama arasındaki fark kaç gün ve kaç makine ediyor.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.