---
title: 'Sır Saklama Servisleri'
source: 'https://academia.sh/tr/kurslar/bulut-yonetisimi/sir-saklama-servisleri'
course: 'Bulut Yönetişimi, Güvenlik ve Maliyet'
language: tr
updated: '2026-08-17T18:06:55+00:00'
license: 'CC BY-SA 4.0'
---

# Sır Saklama Servisleri

Sır döndürmenin ölçüsü penceredir: eski ile yeni değerin birlikte geçerli olduğu süre taranır. Kısa pencere 44 istemciyi kaçırıyor, sıfır kaçıran pencere 3.624 dakika ve yılda 601.584 dakika eski sır bırakıyor. Yalnız başlangıçta okuyan 18 istemciyi düzeltmek pencereyi 227 dakikaya indiriyor; 41 sırrın 17'si hiç döndürülmemiş.

Beklemede ve aktarımda şifreleme kurulduğunda ikisi de aynı şeye dayanıyordu: bir anahtar ya da
kimlik bilgisi bir yerde duruyor ve servisler onu okuyor. O yer bir **sır saklama servisidir** ve
kiralanan her katman gibi bir karar devreder. Bu dersin ölçtüğü karar tek bir sayıda toplanır:
**döndürme penceresi.** Sır döndürüldüğünde eski değer bir anda geçersiz olmaz; bir süre eski ve
yeni değer birlikte kabul edilir, istemciler bu sürede yeni değeri alır. Pencere kapandığında eski
değer reddedilir ve o ana kadar yeni değeri okumamış her istemci kırılır.

Pencere iki yönde birden ölçülür ve iki yön ters işaretlidir. **Kısa pencere kaçırılan istemci
üretir**; uzun pencere eski sırrın geçerli kaldığı süreyi uzatır — sızmış bir değer o süre boyunca
çalışmaya devam eder. Sırların hangi yollardan sızdığı — kayıt satırları, ortam değişkenleri, yapı
çıktısı katmanları — daha önce tarandı ve burada tekrarlanmaz; buranın konusu döndürmenin kendisidir.

Ölçüm **bölgesel ölçüm ağı** üzerindedir, **kurgudur** ve `node` ile yazılmış bir **modeldir**.
Modelde **gerçek sır değeri yoktur**: yalnız sır adları, istemci sayıları ve zamanlar taşınır.

**BG13.** Sır saklama servisinde 41 sır vardır: üç ortam, beş servis, beş sır türü ve üç kuruluş
çapında sır.
**BG14.** Sırları okuyan 83 istemci örneği vardır. Okuma biçimi üç değerlidir: her istekte okur,
önbellekli okur (önbellek ömrü 240 dakika), yalnız başlangıçta okur (dağıtım aralığı 4.320 dakika).
**BG15.** Döndürme penceresi eski ve yeni sırrın birlikte geçerli olduğu süredir; pencere bitmeden
yeni değeri almamış istemci **kaçırılmış** sayılır ve kırılır.
**BG16.** Her istemci örneği dakikada 12 istek yapar (kurgu birim).
**BG17.** Döndürme dönemi 90 gündür (kurgu politika). Sırların bir kısmı otomatik, bir kısmı elle
döndürülür, bir kısmı hiç döndürülmemiştir.
**BG18.** Rastgelelik kendi yazılan doğrusal üreteçten gelir; tohum 20260415'tir ve çıktıda görünür.
Son 90 gündeki insan okumaları modelde sayılıdır.

## Pencereyi Taramak

```js
// sir.mjs — sir saklama servisi, istemci envanteri ve dondurme penceresi taramasi. MODELDIR.
// Bolgesel olcum agi KURGUDUR. GERCEK SIR YOKTUR: yalniz sir ADLARI ve sayilar modellenir.
// Rastgelelik kendi yazilmis dogrusal uretecten gelir; tohum asagida gorunur.
export const TOHUM = 20260415;
export const uretec = (t) => { let s = t >>> 0;
  return () => (s = (s * 1664525 + 1013904223) >>> 0) / 4294967296; };

const ORTAM = ["gelistirme", "hazirlik", "uretim"];
const KATALOG = [
  ["toplayici", ["veritabani-parolasi", "alim-anahtari"]],
  ["dogrulayici", ["veritabani-parolasi", "imzalama-anahtari"]],
  ["faturalama", ["veritabani-parolasi", "dis-uc-jetonu", "imzalama-anahtari"]],
  ["isemri", ["veritabani-parolasi", "dis-uc-jetonu"]],
  ["arsivci", ["veritabani-parolasi", "bakim-kimligi"]],
];
export const SIR = [
  ...ORTAM.flatMap((o) => KATALOG.flatMap(([s, tl]) => tl.map((t) =>
    ({ ad: `${o}/${s}/${t}`, ortam: o, servis: s, tur: t })))),
  ...KATALOG.map(([s]) => ({ ad: `uretim/${s}/bakim-kimligi`, ortam: "uretim", servis: s,
    tur: "bakim-kimligi" })),
  ...["olcum-agi-bakim", "ikincil-bolge-kopya", "is-ortagi-besleme"].map((a) =>
    ({ ad: `kurulus/${a}`, ortam: "kurulus", servis: "paylasilan", tur: "dis-uc-jetonu" })),
];

// Istemci ornekleri: her sirri okuyan surecler. Okuma bicimi alis zamanini belirler.
const r = uretec(TOHUM);
export const ISTEMCI = [];
for (const s of SIR) {
  const n = 1 + Math.floor(r() * ({ uretim: 6, kurulus: 3, hazirlik: 2, gelistirme: 2 })[s.ortam]);
  for (let i = 0; i < n; i++) {
    const u = r();
    ISTEMCI.push({ sir: s.ad, ortam: s.ortam, faz: r(),
      bicim: u < 0.45 ? "onbellek" : u < 0.75 ? "her-istek" : "baslangic" });
  }
}
for (const s of SIR) {                                    // dondurme gecmisi ve insan okumasi
  s.otomatik = r() < 0.55;
  s.yas = 40 + Math.floor(r() * 860);                     // sirrin olusturulmasindan bu yana, gun
  s.son = s.otomatik ? Math.floor(r() * 90) : (r() < 0.45 ? Math.floor(r() * 420) : null);
  s.insan = Math.floor(r() * 4);                          // son 90 gunde insan okumasi sayisi
}

export const ISTEK_DK = 12;                               // istemci basina dakikadaki istek (kurgu)
export const PROFIL = {                                   // istemci tarafinin alis davranisi
  "bugunku hal": { onbellek: 240, dagitim: 4320, degisen: [] },
  "onbellek 60 dk": { onbellek: 60, dagitim: 4320, degisen: ["onbellek"] },
  "baslangic okurlari": { onbellek: 240, dagitim: 60, degisen: ["baslangic"] },
  "hepsi yeniden okur": { onbellek: 60, dagitim: 60, degisen: ["onbellek", "baslangic"] },
};
export const alis = (c, p) => c.bicim === "her-istek" ? 1
  : Math.ceil(c.faz * (c.bicim === "onbellek" ? p.onbellek : p.dagitim));
export const kaciran = (p, W) => ISTEMCI.filter((c) => alis(c, p) > W);
export const DONEM = 90, YIL = 365;                       // kurgu dondurme donemi, gun

const B = [13, 20, 15, 18, 20];
export const yz = (h) => h.map((v, j) => j ? String(v).padStart(B[j]) : String(v).padEnd(B[0]))
  .join("");

if (import.meta.url === `file://${process.argv[1]}`) {
  const bicimSay = (b) => ISTEMCI.filter((c) => c.bicim === b).length;
  console.log(`model (tohum ${TOHUM}): ${SIR.length} sir, ${ISTEMCI.length} istemci ornegi — ` +
    `${bicimSay("her-istek")} her istekte okur, ${bicimSay("onbellek")} onbellekli, ` +
    `${bicimSay("baslangic")} yalniz baslangicta okur`);
  const p = PROFIL["bugunku hal"];
  console.log(`\nbugunku hal: onbellek omru ${p.onbellek} dk, dagitim araligi ${p.dagitim} dk; ` +
    `en gec alis ${Math.max(...ISTEMCI.map((c) => alis(c, p)))} dk`);
  console.log("\n" + yz(["pencere(dk)", "kacirilan istemci", "etkilenen sir", "kirilan istek/dk",
    "yillik acik (dk)"]));
  const yillik = Math.round((YIL / DONEM) * SIR.length);   // yilda toplam dondurme sayisi
  for (const W of [0, 1, 30, 60, 120, 240, 720, 1440, 2880, 3624]) {
    const k = kaciran(p, W);
    console.log(yz([W, k.length, new Set(k.map((c) => c.sir)).size, k.length * ISTEK_DK,
      W * yillik]));
  }
}
```

```
model (tohum 20260415): 41 sir, 83 istemci ornegi — 27 her istekte okur, 38 onbellekli, 18 yalniz baslangicta okur

bugunku hal: onbellek omru 240 dk, dagitim araligi 4320 dk; en gec alis 3624 dk

pencere(dk)     kacirilan istemci  etkilenen sir  kirilan istek/dk    yillik acik (dk)
0                              83             40               996                   0
1                              56             34               672                 166
30                             53             32               636                4980
60                             44             30               528                9960
120                            38             29               456               19920
240                            18             17               216               39840
720                            14             14               168              119520
1440                           10             10               120              239040
2880                            3              3                36              478080
3624                            0              0                 0              601584
```

Tablonun iki ucu kararı çerçeveliyor. Üstte pencere sıfırdır: eski değer aynı anda reddedilir, 83
istemci örneğinin **hepsi** kaçırır ve dakikada 996 istek düşer. Altta pencere 3.624 dakikadır —
altmış saat — ve hiçbir istemci kaçırmaz. İkisinin arası bir seçim değil, bir takas eğrisidir.

Ortadaki satırlar takasın şeklini gösteriyor. Bir saatlik pencere 44 istemciyi kaçırıyor: 30 sırrı
etkiliyor ve dakikada 528 isteği kesiyor. Dört saat (240 dakika) kaçıranı 18'e düşürüyor, çünkü
önbellek ömrü 240 dakikadır ve o sınırda bütün önbellekli istemciler değeri yenilemiş oluyor.
Kalan 18, yalnız başlangıçta okuyan istemcilerdir ve onlar dört saatte değil, ancak bir sonraki
dağıtımda okur. Bir günlük pencere bile 10'unu kaçırıyor.

Son sütun ters yöndeki bedeli sayıyor. 41 sır 90 günlük dönemle yılda 166 kez döndürülüyor; her
döndürmede pencere boyunca eski değer geçerli kalıyor. Sıfır kaçıran pencerede yıllık toplam
**601.584 dakika** eder — 417 güne denk, yani yılın her anında ortalama 1,14 sır eski değeriyle de
çalışıyor demektir. Sızmış bir sır, sızıntının fark edilmesinden bağımsız olarak o süre boyunca
kabul edilir. Bir saatlik pencerede aynı toplam 9.960 dakikaya, altmışta bire iner.

İki sayı da kabul edilebilir değildir: 44 kırık istemci de, yılda 417 gün açık kalan eski sır da.
Pencere tek başına ayarlanacak bir düğme değildir; **istemci tarafı değişmeden hiçbir pencere
değeri iyi değildir.**

## İstemci Tarafı ve Hiç Döndürülmeyen Sırlar

```js
// dondurme.mjs — otomatik dondurmenin istemci tarafi, dondurulmemis sirlar ve okuma yuzeyi.
import { SIR, ISTEMCI, PROFIL, alis, kaciran, ISTEK_DK, DONEM } from "./sir.mjs";

const gen = (B) => (h) => h.map((v, j) => j ? String(v).padStart(B[j]) : String(v).padEnd(B[0]))
  .join("");
const yp = gen([21, 10, 14, 18, 14, 16]);
const ortanca = (l) => l.length ? [...l].sort((a, b) => a - b)[Math.floor(l.length / 2)] : 0;

console.log(yp(["profil", "degisen", "pencere(dk)", "yillik acik (dk)", "60 dk kacan",
  "60 dk istek/dk"]));
for (const [ad, p] of Object.entries(PROFIL)) {
  const enGec = Math.max(...ISTEMCI.map((c) => alis(c, p)));
  const degisen = ISTEMCI.filter((c) => p.degisen.includes(c.bicim)).length;
  const k60 = kaciran(p, 60).length;
  console.log(yp([ad, degisen, enGec, enGec * Math.round((365 / DONEM) * SIR.length), k60,
    k60 * ISTEK_DK]));
}

const hic = SIR.filter((s) => s.son === null);
const oto = SIR.filter((s) => s.otomatik);
const elle = SIR.filter((s) => s.son !== null && !s.otomatik);
const ys = gen([24, 8, 14, 12, 20]);
console.log("\n" + ys(["dondurme sinifi", "sir", "en gec (gun)", "ortanca", "doneme kalan/asan"]));
const satir = (ad, l, alan) => {
  const v = l.map((s) => s[alan]);
  const enGec = Math.max(...v, 0);
  console.log(ys([ad, l.length, enGec, ortanca(v),
    enGec <= DONEM ? `${DONEM - enGec} gun kaldi` : `${enGec - DONEM} gun asildi`]));
};
satir("otomatik dondurulen", oto, "son");
satir("elle dondurulen", elle, "son");
satir("hic dondurulmemis", hic, "yas");
for (const s of [...hic].sort((a, b) => b.yas - a.yas).slice(0, 4))
  console.log(`  ${s.ad.padEnd(38)} ${String(s.yas).padStart(4)} gun, ` +
    `${ISTEMCI.filter((c) => c.sir === s.ad).length} istemci, ` +
    `son 90 gunde ${s.insan} insan okumasi`);

const insanli = SIR.filter((s) => s.insan > 0);
const kesisim = insanli.filter((s) => s.son === null);
console.log(`\nokuma yuzeyi: ${insanli.length}/${SIR.length} sir son 90 gunde bir insan tarafindan ` +
  `okundu (${SIR.reduce((a, s) => a + s.insan, 0)} okuma, hepsi denetim kaydinda)`);
console.log(`bunlarin ${kesisim.length} tanesi hic dondurulmemis sirdir; ` +
  `bu ${kesisim.length} sirri ${ISTEMCI.filter((c) => kesisim.some((s) => s.ad === c.sir)).length} ` +
  `istemci ornegi okuyor`);
const enGenis = SIR.map((s) => [s.ad, ISTEMCI.filter((c) => c.sir === s.ad).length])
  .sort((a, b) => b[1] - a[1])[0];
console.log(`en genis sir: ${enGenis[0]} — ${enGenis[1]} istemci ornegi; ` +
  `dondurulunce bu ${enGenis[1]} ornegin hepsi yeni degeri almak zorunda`);
```

```
profil                  degisen   pencere(dk)  yillik acik (dk)   60 dk kacan  60 dk istek/dk
bugunku hal                   0          3624            601584            44             528
onbellek 60 dk               38          3624            601584            18             216
baslangic okurlari           18           227             37682            26             312
hepsi yeniden okur           56            57              9462             0               0

dondurme sinifi              sir  en gec (gun)     ortanca   doneme kalan/asan
otomatik dondurulen           16            88          64         2 gun kaldi
elle dondurulen                8           371         209      281 gun asildi
hic dondurulmemis             17           826         442      736 gun asildi
  uretim/isemri/bakim-kimligi             826 gun, 5 istemci, son 90 gunde 1 insan okumasi
  hazirlik/arsivci/bakim-kimligi          789 gun, 1 istemci, son 90 gunde 1 insan okumasi
  kurulus/is-ortagi-besleme               760 gun, 1 istemci, son 90 gunde 0 insan okumasi
  uretim/dogrulayici/imzalama-anahtari    748 gun, 6 istemci, son 90 gunde 2 insan okumasi

okuma yuzeyi: 34/41 sir son 90 gunde bir insan tarafindan okundu (68 okuma, hepsi denetim kaydinda)
bunlarin 15 tanesi hic dondurulmemis sirdir; bu 15 sirri 34 istemci ornegi okuyor
en genis sir: uretim/toplayici/veritabani-parolasi — 6 istemci ornegi; dondurulunce bu 6 ornegin hepsi yeni degeri almak zorunda
```

Profil tablosu bu dersin en ters sonucunu veriyor. Önbellek ömrünü 240 dakikadan 60'a çekmek **38
istemciye dokunur ve pencereyi hiç kısaltmaz**: sıfır kaçıran pencere 3.624 dakikada kalır, yıllık
açık süre 601.584 dakikada kalır. Kazandığı tek şey bir saatlik pencerede kaçıranın 44'ten 18'e
inmesidir. Sebep açıktır: bağlayıcı kısıt önbellek değil, **yalnız başlangıçta okuyan 18
istemcidir**; onlar önbellek ömrünü hiç dinlemez.

Üçüncü satır bunu doğruluyor. Yalnız o 18 istemciyi yeniden okur hale getirmek — yarısından az
dokunuşla — pencereyi 3.624 dakikadan **227 dakikaya**, yıllık açık süreyi 601.584'ten 37.682
dakikaya indirir: on altıda bir. Dördüncü satır ikisini birleştirir: 56 istemci değişir, pencere 57
dakikaya iner, yıllık açık süre 9.462 dakika olur ve bir saatlik pencerede kaçıran **sıfırdır**.
Otomatik döndürmenin istemci tarafında gerektirdiği şey budur — sırrı yeniden okuma yeteneği
birinci, önbellek ömrü ikincidir. Yeniden okuma yoksa döndürme her seferinde bir dağıtım bekler.

Değişikliğin kendisi de bir kalemdir ve tabloda ilk sütunda duruyor. Yeniden okuma yeteneği eklemek
18 istemcide kod değişikliği ister; önbellek ömrünü kısaltmak 38 istemcide yapılandırma değişikliği.
İkisi birden 56 örnek eder ve o 56 örneğin her biri ayrı bir dağıtım kalemidir. Sıralama bu yüzden
önemlidir: 18 istemcilik iş, 38 istemcilik işten on altı kat fazla kazandırıyor ve tek başına
yapıldığında pencereyi dört saatin altına indiriyor. Hiçbir şey yapılmazsa döndürme dönemi işlemez —
17 sırrın hiç döndürülmemiş olmasının teknik karşılığı da budur.

Alt tablo aynı sorunun envanter yüzüdür. 41 sırrın 16'sı otomatik döndürülüyor ve en gecikmişine 90
günlük döneme **2 gün kalmış**. 8 sır elle döndürülüyor ve en gecikmişi dönemi 281 gün aşmış.
Geriye kalan **17 sır hiç döndürülmemiş** — envanterin yüzde kırkı — ve en yaşlısı 826 günlük. Bunu
ölçmek için ayrı bir tarama gerekmedi: son döndürme alanı boş olan kayıtlar sayıldı.

Son üç satır sırayı belirliyor. 41 sırrın 34'ü son 90 günde en az bir kez bir insan tarafından
okundu — toplam 68 okuma ve hepsi denetim kaydında duruyor. Bu 34 sırrın **15'i hiç döndürülmemiş
sırlardır** ve o 15 sırrı 34 istemci örneği okuyor. Kesişim döndürme sırasını verir: insan eli
değmiş ve hiç döndürülmemiş sır, envanterin geri kalanından önce gelir. En geniş sır üretim
toplayıcısının veritabanı parolasıdır; 6 istemci örneği okuyor ve döndürüldüğünde altısının da yeni
değeri alması gerekir — pencere kararı tam olarak bu altı örnek için verilir.

## Özet

- Döndürme penceresi iki yönde ölçüldü: sıfır pencerede 83 istemcinin hepsi kaçırıyor, 3.624
  dakikalık pencerede hiçbiri kaçırmıyor; bir saatlik pencerede 44 istemci ve dakikada 528 istek.
- Uzun pencerenin bedeli sayıldı: 41 sır yılda 166 kez döndürülüyor ve 3.624 dakikalık pencere
  yılda 601.584 dakika eski sır bırakıyor; bir saatlik pencerede aynı toplam 9.960 dakikadır.
- Önbellek ömrünü dörtte bire indirmek 38 istemciye dokunuyor ve sıfır kaçıran pencereyi hiç
  kısaltmıyor; bağlayıcı kısıt yalnız başlangıçta okuyan 18 istemcidir.
- O 18 istemciyi yeniden okur hale getirmek pencereyi 227 dakikaya, ikisi birden 57 dakikaya
  indiriyor; ikinci durumda bir saatlik pencerede kaçıran sıfırdır.
- 41 sırrın 16'sı otomatik döndürülüyor (döneme 2 gün kaldı), 8'i elle (281 gün aşıldı) ve **17'si
  hiç döndürülmemiş**; en yaşlısı 826 günlük.
- Son 90 günde 34 sır bir insan tarafından okundu (68 okuma, hepsi kayıtta) ve bunların 15'i hiç
  döndürülmemiş sırlardır; döndürme sırası bu kesişimden çıkar.

## Sonraki Adım

Şifreleme kuruldu, sırlar döndürülebilir hale geldi ve her ölçümde aynı cümle geçti: "hepsi denetim
kaydında". O cümle şimdiye kadar sınanmadı. Bir sonraki ders kaydın kendisini ölçer: bir olay
kümesi denetim günlüğüne düşürülür ve **kaç soru yanıtlanabiliyor** sayılır — kim, ne zaman, hangi
kaynak, hangi kimlikten. Kaydın kapsamadığı işlem türü adıyla yazılır, kaydı kimin silebildiği
sayılır ve saklama süresiyle maliyet birlikte taranır.
