İçeriğe geç
academia.sh

Ders 05 / 12

Anahtar ve Sır Yönetimi

Anahtar sahipliğinin yayılma yarıçapına etkisi üç kipte koşturulur: sağlayıcı anahtarında sızan kimlik 16 kalem okur, müşteri yönetilen anahtarda yine 16, müşteri tutulan anahtarda 11. Tek bir anahtar iznini zincirin dışına almak yönetilen kipte 16'yı 6'ya, tutulan kipte 11'i 3'e indirir ve günde 1 meşru işlemi durdurur. Sır deposu okunduğunda yürüyüşe 4 kimlik ekleniyor.

İçindekiler

Önceki derste açık bir dosyanın içeriği okunabilir sayıldı. Kayıtlar diskte şifreliydi, ama okuma izni olan özne için bu bir engel olmadı — çözme, okuma isteğinin bir parçası olarak sağlayıcı tarafında yapıldı. Sorulmayan soru şudur: çözme anahtarı kimde duruyorsa yarıçap değişir mi.

Bu ders yalnız onu ölçer. Bulut Yönetişimi, Güvenlik ve Maliyet kursu beklemede ve aktarımda şifrelemeyi, zarf şifrelemesini ve döndürme penceresini ölçtü; burada şifreleme mekaniğinin hiçbiri tekrarlanmaz. Ölçülen tek şey anahtar sahipliğinin okunabilen kalem sayısına etkisidir. İkinci yarıda sır deposu ele alınıyor ve bu dersin ikinci bulgusu çıkıyor: sır deposu yürüyüşte bir kalem değil, bir kenar kaynağıdır.

  • BG23. Üç sahiplik kipi vardır. saglayici: anahtar sağlayıcının elindedir ve çözme, okuma isteğinin parçası olarak yapılır. yonetilen: anahtar müşterinindir ve anahtar yönetimi servisinde durur; çözme için ayrı bir anahtar kullanma izni gerekir. tutulan: anahtar kiralanan altyapının dışındadır ve sızan bir bulut kimliği ona ulaşamaz.
  • BG24. Anahtar kullanma izni erişim izninden ayrı bir kümedir. Bir kimlik bir kaleme erişebilirken onun anahtarını kullanamayabilir.
  • BG25. Her kalem en güçlü hangi kipi desteklediğini yazar. Sunucu tarafında çözen bir yönetilen hizmet tutulan kipini destekleyemez; bu bir model kararıdır ve hizmet türünden gelir.
  • BG26. Sır deposu okunabildiğinde içindeki her sır bir kimlik olur ve yürüyüş oradan devam eder. Sırların içeriği modellenmez, yalnız hangi kimliğe karşılık geldikleri sayılır.
  • BG27. Yürüyüş bir sabit noktaya kadar koşar: kimlik kümesi büyüdükçe anahtar izni ve okunan kalem büyür, okunan kalem büyüdükçe kimlik kümesi büyür.

Üç Kip, Üç Sayı

// bulut/anahtar.mjs — anahtar sahipliginin yaricapa etkisi MODELIDIR. Sifreleme mekanigi, zarf
// sifrelemesi ve donderme penceresi bu derste yoktur; yalniz okunabilen kalem sayilir.

const ERISIM = {
  'hesap-toplayici': 'olcum-deposu olcum-kuyrugu',
  'hesap-dogrulayici': 'olcum-deposu olcum-kuyrugu ham-arsiv',
  'hesap-portal': 'abone-veritabani portal-varlik-deposu is-emri-kuyrugu',
  'hesap-rapor': 'rapor-deposu fatura-cikti-deposu gunluk-deposu',
  'rol-fatura': 'fatura-veritabani fatura-cikti-deposu posta-cikisi abone-veritabani',
  'rol-arsiv': 'ham-arsiv yedek-deposu',
  'rol-yedek': 'yedek-deposu fatura-veritabani abone-veritabani olcum-deposu',
  'rol-dagitim': 'dagitim-yapilandirmasi sablon-deposu ornek-yonetimi',
  'rol-gunluk': 'gunluk-deposu denetim-gunlugu',
  'rol-yonetim': 'ornek-yonetimi anahtar-yonetimi sir-deposu',
};
const USTLENME = [['hesap-toplayici', 'rol-arsiv'], ['hesap-dogrulayici', 'rol-arsiv'],
  ['rol-arsiv', 'rol-yedek'], ['rol-yedek', 'rol-yonetim'], ['hesap-portal', 'rol-fatura'],
  ['rol-fatura', 'rol-gunluk'], ['hesap-rapor', 'rol-gunluk'], ['rol-dagitim', 'rol-yonetim']];
// Kimligin anahtar kullanma izni: erisim izninden ayri bir kumedir.
export const ANAHTAR_IZNI = {
  'hesap-toplayici': 'k-olcum', 'hesap-dogrulayici': 'k-olcum', 'hesap-portal': 'k-abone',
  'hesap-rapor': 'k-fatura k-gunluk', 'rol-fatura': 'k-fatura k-abone', 'rol-arsiv': 'k-olcum',
  'rol-yedek': 'k-yedek', 'rol-dagitim': 'k-sir', 'rol-gunluk': 'k-gunluk',
  'rol-yonetim': 'k-sir',
};
// Kalem: sifreli mi, hangi anahtarla, en guclu destekledigi sahiplik kipi.
// Kipler: saglayici < yonetilen < tutulan. Yonetilen anahtar anahtar yonetimi servisinde durur,
// tutulan anahtar kiralanan altyapinin disindadir ve sizan kimlik ona ulasamaz.
export const KIP = ['saglayici', 'yonetilen', 'tutulan'];
export const KALEM = `
  olcum-deposu           k-olcum   tutulan
  ham-arsiv              k-olcum   tutulan
  yedek-deposu           k-yedek   tutulan
  fatura-cikti-deposu    k-fatura  tutulan
  rapor-deposu           k-fatura  tutulan
  dagitim-yapilandirmasi k-sir     tutulan
  abone-veritabani       k-abone   yonetilen
  fatura-veritabani      k-fatura  yonetilen
  gunluk-deposu          k-gunluk  yonetilen
  sir-deposu             k-sir     yonetilen
  denetim-gunlugu        k-gunluk  saglayici
  olcum-kuyrugu          -         -
  portal-varlik-deposu   -         -
  is-emri-kuyrugu        -         -
  posta-cikisi           -         -
  anahtar-yonetimi       -         -
  ornek-yonetimi         -         -
  sablon-deposu          -         -`
  .trim().split('\n').map((s) => {
    const [ad, anahtar, destek] = s.trim().split(/\s+/);
    return { ad, anahtar: anahtar === '-' ? null : anahtar, destek };
  });
export const bul = (ad) => KALEM.find((k) => k.ad === ad);
// Sir deposu okunursa icindeki sirlar birer kimliktir; yuruyus oradan devam eder.
export const SIRLAR = ['hesap-portal', 'rol-fatura', 'hesap-rapor'];

// Gunde kac mesru islem hangi anahtari kullaniyor: [kimlik, anahtar, gunde kullanim]
export const MESRU_ANAHTAR = [['hesap-toplayici', 'k-olcum', 1440],
  ['hesap-dogrulayici', 'k-olcum', 720], ['hesap-portal', 'k-abone', 3100],
  ['hesap-rapor', 'k-fatura', 40], ['hesap-rapor', 'k-gunluk', 12],
  ['rol-fatura', 'k-fatura', 260], ['rol-fatura', 'k-abone', 260],
  ['rol-arsiv', 'k-olcum', 96], ['rol-yedek', 'k-yedek', 4],
  ['rol-dagitim', 'k-sir', 6], ['rol-gunluk', 'k-gunluk', 88], ['rol-yonetim', 'k-sir', 1]];

// Sizan kimlikten okunabilen kalem: sabit nokta. Sir deposu okunursa kimlik kumesi buyur.
export function okunan(hedef, cikarilan = new Set()) {
  const kimlik = new Set(['hesap-toplayici']);
  const kapat = () => {                            // ustlenme kapanisi
    let n = -1;
    while (kimlik.size !== n) {
      n = kimlik.size;
      for (const k of [...kimlik]) for (const [a, b] of USTLENME) if (a === k) kimlik.add(b);
    }
  };
  let onceki = -1, kalem = new Set(), izin = new Set();
  while (kimlik.size !== onceki) {
    onceki = kimlik.size;
    kapat();
    izin = new Set([...kimlik].flatMap((k) => ANAHTAR_IZNI[k].split(' '))
      .filter((a) => !cikarilan.has(a)));
    kalem = new Set([...kimlik].flatMap((k) => ERISIM[k].split(' ')).filter((r) => {
      const x = bul(r);
      if (x.anahtar === null) return true;                       // sifresiz kalem
      const kip = KIP.indexOf(hedef) < KIP.indexOf(x.destek) ? hedef : x.destek;
      return kip === 'saglayici' || (kip === 'yonetilen' && izin.has(x.anahtar));
    }));
    if (kalem.has('sir-deposu')) for (const s of SIRLAR) kimlik.add(s);
  }
  return { kimlik, kalem, izin };
}
// bulut/kosum1.mjs — uc sahiplik kipinde sizan kimligin okuyabildigi kalem
import { KALEM, KIP, bul, okunan } from './anahtar.mjs';

const yaz = (g, ...s) => console.log(s.map((v, i) =>
  g[i] < 0 ? String(v).padEnd(-g[i]) : String(v).padStart(g[i])).join(''));
const A = [-23, -10, -11, 12, 12, 10];
yaz(A, 'kalem', 'anahtar', 'destek', ...KIP);
const R = Object.fromEntries(KIP.map((k) => [k, okunan(k)]));
const gorulen = [...new Set(KIP.flatMap((k) => [...R[k].kalem]))].sort();
for (const r of gorulen.filter((x) => bul(x).anahtar))
  yaz(A, r, bul(r).anahtar, bul(r).destek, ...KIP.map((k) => R[k].kalem.has(r) ? 'okunur' : '-'));
yaz(A, `+ ${gorulen.filter((x) => !bul(x).anahtar).length} sifresiz kalem`, '', '',
  ...KIP.map(() => 'okunur'));
yaz(A, 'okunan kalem', '', '', ...KIP.map((k) => R[k].kalem.size));
console.log(`\nyuruyuse giren kimlik: ` + KIP.map((k) => `${k} ${R[k].kimlik.size}`).join(', '));
console.log('sizan kimligin zincirinden gelen anahtar izni: ' +
  [...R.tutulan.izin].sort().join(', '));
console.log(`sifresiz kalem ${KALEM.filter((k) => k.anahtar === null).length}/${KALEM.length}`);
kalem                  anahtar   destek        saglayici   yonetilen   tutulan
abone-veritabani       k-abone   yonetilen        okunur      okunur    okunur
denetim-gunlugu        k-gunluk  saglayici        okunur      okunur    okunur
fatura-cikti-deposu    k-fatura  tutulan          okunur      okunur         -
fatura-veritabani      k-fatura  yonetilen        okunur      okunur    okunur
gunluk-deposu          k-gunluk  yonetilen        okunur      okunur    okunur
ham-arsiv              k-olcum   tutulan          okunur      okunur         -
olcum-deposu           k-olcum   tutulan          okunur      okunur         -
rapor-deposu           k-fatura  tutulan          okunur      okunur         -
sir-deposu             k-sir     yonetilen        okunur      okunur    okunur
yedek-deposu           k-yedek   tutulan          okunur      okunur         -
+ 6 sifresiz kalem                                okunur      okunur    okunur
okunan kalem                                          16          16        11

yuruyuse giren kimlik: saglayici 8, yonetilen 8, tutulan 8
sizan kimligin zincirinden gelen anahtar izni: k-abone, k-fatura, k-gunluk, k-olcum, k-sir, k-yedek
sifresiz kalem 7/18

İlk iki sütun aynıdır: on altı. Anahtar müşteriye geçtiğinde okunabilen kalem sayısı hiç değişmiyor. Nedeni son satırdan bir öncekidir — sızan kimliğin zinciri altı anahtar izninin hepsini taşıyor. Sahiplik kipi çözmeyi bir izne bağlar; o izin de aynı zincirin üzerindeyse bağlama işe yaramaz.

Üçüncü sütun on bir veriyor. Düşen beş kalem tutulan kipini destekleyen kalemlerdir: ölçüm deposu, ham arşiv, yedek deposu, fatura çıktı deposu ve rapor deposu. Kalan altısı destekleyemez, çünkü çözme sunucu tarafında yapılan yönetilen hizmetlerdir.

İkinci satırdan bir öncesi de dikkat çeker. Yürüyüşe giren kimlik sayısı üç kipte de sekizdir — oysa erişim grafiğinin kendisi dört kimlikle biterdi. Aradaki dört kimlik sır deposundan gelir ve sır deposu üç kipte de okunabilir.

Sahiplik Tek Başına Yetmiyor

Sahiplik kipi ile anahtar kullanma izni iki ayrı kaldıraçtır. İkisi ayrı ayrı ve birlikte koşturuluyor.

// bulut/kosum2.mjs — sahiplik kipi ile anahtar izninin birlikte etkisi; her ikisinin bedeli
import { KALEM, KIP, MESRU_ANAHTAR, SIRLAR, okunan } from './anahtar.mjs';

const yaz = (g, ...s) => console.log(s.map((v, i) =>
  g[i] < 0 ? String(v).padEnd(-g[i]) : String(v).padStart(g[i])).join(''));
const A = [-12, 16, 15, 13, 12];
yaz(A, 'sahiplik', 'k-sir zincirde', 'k-sir disinda', 'yuruyen', 'yuruyen');
yaz(A, 'kipi', 'okunan kalem', 'okunan kalem', 'kimlik', 'kimlik');
for (const k of KIP) {
  const a = okunan(k), b = okunan(k, new Set(['k-sir']));
  yaz(A, k, a.kalem.size, b.kalem.size, a.kimlik.size, b.kimlik.size);
}
const sirIs = MESRU_ANAHTAR.filter(([k, a]) => a === 'k-sir' && k === 'rol-yonetim')
  .reduce((x, [, , n]) => x + n, 0);
console.log(`\nk-sir iznini zincirdeki rolden almanin bedeli: gunde ${sirIs} mesru islem`);
console.log(`sir deposundaki sir sayisi ${SIRLAR.length}; okunursa yuruyuse giren ek kimlik ` +
  `${okunan('saglayici').kimlik.size - 4}`);
const sifreli = KALEM.filter((k) => k.anahtar);
const desteksiz = sifreli.filter((k) => k.destek !== 'tutulan');
console.log(`\ntutulan kipini ${sifreli.length} sifreli kalemin ${desteksiz.length}'i ` +
  'desteklemiyor:');
console.log('  ' + desteksiz.map((k) => k.ad).join(', '));
const dis = MESRU_ANAHTAR.filter(([, a]) =>
  sifreli.some((k) => k.anahtar === a && k.destek === 'tutulan'));
console.log(`disaridan anahtar teslimi gereken (is yuku, anahtar) cifti ${dis.length}; ` +
  `gunde ${dis.reduce((x, [, , n]) => x + n, 0)} islem bu yoldan geciyor`);
sahiplik      k-sir zincirde  k-sir disinda      yuruyen     yuruyen
kipi            okunan kalem   okunan kalem       kimlik      kimlik
saglayici                 16             16            8           8
yonetilen                 16              6            8           4
tutulan                   11              3            8           4

k-sir iznini zincirdeki rolden almanin bedeli: gunde 1 mesru islem
sir deposundaki sir sayisi 3; okunursa yuruyuse giren ek kimlik 4

tutulan kipini 11 sifreli kalemin 5'i desteklemiyor:
  abone-veritabani, fatura-veritabani, gunluk-deposu, sir-deposu, denetim-gunlugu
disaridan anahtar teslimi gereken (is yuku, anahtar) cifti 8; gunde 2567 islem bu yoldan geciyor

Tablo altı hücrelidir ve üçü karar taşır. Sağlayıcı satırında iki sütun aynıdır: on altı ve on altı. Anahtar izniyle oynamak sağlayıcı anahtarında hiçbir şey değiştirmez, çünkü çözme için izin sorulmaz — okuma izni düz metin demektir.

Yönetilen satırı bu dersin en keskin karşılaştırmasını verir. Anahtar müşteriye geçirildiğinde tek başına yarıçap on altıda kalır. Aynı kipte tek bir anahtar izni — sır deposunun anahtarı — sızan kimliğin zincirinden çıkarıldığında yarıçap altıya iner. Aynı sahiplik kipi, aynı grafik, iki buçuk kattan fazla fark. Sahiplik yarıçabı düşürmez; sahibin izni kime verdiği düşürür.

Tutulan satırı da aynı yönde okunur: on birden üçe. Ama on bir ile on altı arasındaki fark beş kalemdir ve bedeli ağırdır — beş şifreli kalem bu kipi hiç desteklemez ve sekiz (iş yükü, anahtar) çifti dışarıdan anahtar teslimi gerektirir; günde iki bin beş yüz altmış yedi işlem o yoldan geçer. Tek bir izni kaldırmanın bedeli ise günde bir meşru işlemdir.

Altı Anahtar Tek Tek

Sır deposunun anahtarı örnek olarak seçildi. Altı anahtarın hepsi aynı ölçüden geçirilirse seçimin neden bu olduğu görülür.

// bulut/kosum3.mjs — tek tek anahtar izinleri: hangisini zincirden almak yaricabi ne kadar dusurur
import { ANAHTAR_IZNI, MESRU_ANAHTAR, okunan } from './anahtar.mjs';

const ANAHTAR = [...new Set(Object.values(ANAHTAR_IZNI).flatMap((s) => s.split(' ')))].sort();
const yaz = (g, ...s) => console.log(s.map((v, i) =>
  g[i] < 0 ? String(v).padEnd(-g[i]) : String(v).padStart(g[i])).join(''));
const A = [-10, 11, 11, 12, 13];
const taban = okunan('yonetilen').kalem.size;
yaz(A, 'anahtar', 'yonetilen', 'tutulan', 'yaricap', 'duran islem');
yaz(A, 'zincirden', 'kipinde', 'kipinde', 'dususu', 'gunde');
for (const a of ANAHTAR) {
  const c = new Set([a]);
  yaz(A, a, okunan('yonetilen', c).kalem.size, okunan('tutulan', c).kalem.size,
    taban - okunan('yonetilen', c).kalem.size,
    MESRU_ANAHTAR.filter(([, x]) => x === a).reduce((s, [, , n]) => s + n, 0));
}
const hepsi = new Set(ANAHTAR);
console.log(`\nhepsi cikarilirsa: yonetilen ${okunan('yonetilen', hepsi).kalem.size}, ` +
  `tutulan ${okunan('tutulan', hepsi).kalem.size}; ` +
  `gunde ${MESRU_ANAHTAR.reduce((s, [, , n]) => s + n, 0)} islem durur`);
anahtar     yonetilen    tutulan     yaricap  duran islem
zincirden     kipinde    kipinde      dususu        gunde
k-abone            15         10           1         3360
k-fatura           13         10           3          300
k-gunluk           15         10           1          100
k-olcum            14         11           2         2256
k-sir               6          3          10            7
k-yedek            15         11           1            4

hepsi cikarilirsa: yonetilen 3, tutulan 3; gunde 6027 islem durur

Beş anahtarın yarıçap düşüşü bir ile üç arasındadır; altıncısı ondur. k-abone günde üç bin üç yüz altmış işlem taşır ve kaldırılırsa yarıçabı tek bir kalem düşürür. k-sir günde yedi işlem taşır ve yarıçabı on kalem düşürür. Kalem başına bedel oranı arasında üç bin katın üzerinde fark vardır.

Bu tablodaki yedi rakamı bir önceki bölümün bir rakamıyla karıştırmamak gerekir: burada izin bütün kimliklerden çıkarılıyor ve dağıtım rolünün günde altı işlemi de duruyor. Sızan kimliğin zincirinde olan tek rolden almak yeterlidir ve bedeli günde bir işlemdir.

Son satır sınırı çiziyor: bütün anahtar izinleri çıkarılırsa yarıçap üçe iner ve günde altı bin yirmi yedi işlem durur. Yani yarıçabı ondan üçe indirmenin yolu bütün izinleri kaldırmak değildir; altıdan birini kaldırmak farkın büyük bölümünü verir.

Sır Deposu Bir Kalem Değil

Sağdaki iki sütun neden bu kadar büyük bir fark çıktığını söylüyor. k-sir zincirdeyken yürüyüşe sekiz kimlik giriyor; çıkarıldığında dört. Sır deposu okunduğunda içindeki üç sır üç kimliğe karşılık geliyor ve üstlenme kapanışıyla birlikte dört yeni kimlik yürüyüşe katılıyor.

Bu, sır deposunun grafikteki yerini değiştirir. Öteki kalemler yürüyüşün sonudur: okunur ve orada biter. Sır deposu okunduğunda yürüyüşün yeni kenarları doğar — yani sır deposu bir kalem değil, bir kenar kaynağıdır. Yarıçap ölçümünde ona bir kalem olarak bakmak sayıyı on altı yerine dokuz gösterir.

Aynı nedenle ölçüm bir sabit nokta hesabıdır. Kimlik kümesi büyüdükçe anahtar izni büyür, anahtar izni büyüdükçe okunan kalem büyür, okunan kalemde sır deposu varsa kimlik kümesi yeniden büyür. Döngü ancak yeni kimlik gelmediğinde durur. Tek bir geçişte hesaplanan yarıçap bu modelde eksik çıkar.

Önceki dersin bulgusuyla birleştirildiğinde sıra netleşir: bir yapılandırma dosyasında duran kimlik referansı yarıçabı beş kalem büyütüyordu, sır deposunun okunabilmesi yedi kalem büyütüyor. İkisi de küçük kalemlerdir ve ikisinin de zararı kendi içeriğinde değil, açtıkları kenarlardadır.

Özet

  • Anahtar sahipliği tek başına yarıçabı düşürmüyor: sağlayıcı anahtarında 16, müşteri yönetilen anahtarda yine 16 kalem okunuyor. Sızan kimliğin zinciri altı anahtar izninin hepsini taşıyor.
  • Müşteri tutulan anahtar 16’yı 11’e indirir; düşen beş kalem bu kipi destekleyen kalemlerdir. 11 şifreli kalemin 5’i sunucu tarafında çözdüğü için bu kipi hiç desteklemez.
  • Tek bir anahtar iznini zincirin dışına almak yönetilen kipte 16’yı 6’ya, tutulan kipte 11’i 3’e indirir. Aynı sahiplik kipinde iki buçuk kattan fazla fark; bedeli günde 1 meşru işlemdir.
  • Tutulan kipin bedeli ağırdır: 8 (iş yükü, anahtar) çifti dışarıdan anahtar teslimi ister ve günde 2.567 işlem o yoldan geçer.
  • Sır deposu yürüyüşte bir kalem değil bir kenar kaynağıdır: okunduğunda 3 sır 3 kimliğe karşılık gelir ve kapanışla birlikte yürüyüşe 4 kimlik girer, kimlik sayısı 4’ten 8’e çıkar.
  • Ölçüm bir sabit nokta hesabıdır; tek geçişte hesaplanan yarıçap bu modelde 9 çıkar, sabit noktada 16.

Sonraki Adım

Beş ders boyunca yanlış kalemler tek tek bulundu: aşırı geniş bir güven listesi, kapatılmamış bir genel uç, nesne düzeyinde unutulmuş bir izin, zincirin üzerinde duran bir anahtar izni. Hepsi çalışan sistemde bulundu ve her biri bulunduğunda çoktan yerindeydi. Sorulmayan soru şudur: bunların kaçı sisteme konmadan önce, şablonda görülebilirdi. Sonraki ders şablon kümesini bir kural setinden geçiriyor ve dağıtımdan önce yakalanan kalemi ancak koşarken görülebilen kalemden ayırı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