İçeriğe geç
academia.sh

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 node ile 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.

Aramak için yazmaya başlayın.

↑↓ Esc gezin · aç · kapat