yeke.io · dokümanlar · enterprise

Yönetişim

Kurumsal değişiklik sürecinizi YEKE’ye taşıyın: çift onay, change-freeze, merkezî politikalar, terminal kaydı, Secret görünürlüğü ve uyum raporları. Bu rehber her özelliğin kurulumunu ve sınırlarını anlatır.

Altı kalem, altı bayrak — hepsi Enterprise: çift onay dual-approval, bakım penceresi change-freeze, merkezî politika policy-central, oturum kaydı session-recording, Secret görünürlüğü secret-display, uyum raporu compliance-reports. Secret görünürlüğü 23.09.2026'da fazını E3'ten E6'ya (Erişim ve Secret yönetimi) taşıdı; adı ve davranışı değişmedi.

Çift onay (4-göz)

Bir rol değil, bir politika eşleşmesi — varsayılan kapalı, tek-adminli bir kurulumu kilitlemez.

requireSecondApproval eşleşirse plan ikinci onay ister. Onaycı; aktif, plan sahibinden farklı ve cluster’da kimliği eşlenmiş olmalıdır. requiredApproverGroup varsa grup üyeliği de kontrol edilir. Uygun kullanıcılar her kontrolde yeniden hesaplanır. Politika alanları ve örnekler →

policies:
  - id: kurum.cift-onay
    match: 'step.action == "update" && step.target.resource == "deployments"'
    effect: require
    level: elevated
    requireSecondApproval: true
    requiredApproverGroup: "sre-onaycilar"
  • İkinci onaycı rıza verir, planı yine sahibi uygular. Aktör ≠ plan sahibi kapısı değişmeden durur — ikinci bir uygulayıcı yoktur. Rıza uçları: POST/ DELETE/GET /api/clusters/:clusterId/operations/:opId/consent.
  • Rıza planın GÜNCEL hash'ine bağlıdır. Plan tazelenip hash değişince yürürlükteki rıza düşer (kayıt silinmez, yalnız kapı saymaz) ve yeniden istenir.
  • Uygun onaycı yoksa kontrol apply anına bırakılmaz. Plan yine kurulur ve kartı bunu plan anında SECOND_APPROVAL_REQUIRED / NO_ELIGIBLE_APPROVER uyarısıyla söyler. TTL (30 dk) esnetilmez — bunun yerine mevcut bildirim hook’u ikinci bir insanı arar.
  • Lisans kaldırıldığında yapılandırılmış kural yürürlükte kalır, kesilen tek şey yeni kural tanımlamaktır — use kapısı hiç sorulmaz, yalnız configure sorulur.
  • Dosya modunda bu kapı açılıştadır. Core, yürürlüğe giren kuralları kaydeder. Lisansın kapsamadığı bir açılışta kayıtta olmayan ya da değiştirilmiş bir çift onay kuralı görürse açılmaz ve kuralın adını söyler. Kuralı dosyadan silmek her zaman serbesttir.
  • Geçiş: 0.64.0'dan önce dosya modunda çift onay kuralı kullanan bir kurulum, güncellemeden sonraki ilk açılışta kurallarını kayda alır ve lisanssız da açılmaya devam eder. Bu kayıt denetim izinde bir kez görünür.

Bakım penceresi — change-freeze

Takvim YEKE içinde tanımlanır, dışarıya bir hook açmaz.

Pencereleri freezes: altında tanımlayın. Dosya modunda YEKE_POLICY_DIR altında ayrı bir dosya, merkezî modda paketin freezes alanı kullanılır. Her pencere için timezone zorunludur.

freezes:
  - id: hafta-sonu
    description: "Hafta sonu değişiklik dondurması"
    timezone: Europe/Istanbul          # ZORUNLU
    weekly:
      - { from: "Fri 17:00", to: "Mon 09:00" }
    dates:
      - { from: "2026-12-29T00:00:00", to: "2027-01-02T09:00:00" }
    scope: { clusters: ["*"] }
  • Pencere içindeki bir apply bekler. 409 APPROVAL_HOOK_DENIED + params.source: "change-freeze" + params.windowEndsAt döner; plan kaydı mutasyonsuz kalır, TTL esnetilmez.
  • Delme (break-glass) yolu yoktur. v1'de yalnız "bekler" — yarım bir break-glass, freeze'in kendisinden kötü olurdu.
  • Lisans kaldırıldığında yapılandırılmış bir pencere yürürlükte kalır, kesilen tek şey yeni pencere tanımlamaktır.
  • Dosya modunda yeni ya da değiştirilmiş bir pencere, lisansın kapsamadığı bir açılışta core'u açtırmaz; çift onay kuralıyla aynı kayıt ve aynı geçiş kuralı geçerlidir. Yalnız açıklamanın (description) değişmesi yeni tanım sayılmaz.

Merkezî politika paketi

Politika seti dosyadan değil imzalı bir paketten de yüklenebilir — ikisi aynı anda kaynak olamaz.

DeğişkenVarsayılanNe işe yarar
YEKE_POLICY_MODEfile Politika setinin kaynağı: file ya da central. Tanınmayan bir değer core'u açılışta durdurur. central Enterprise; lisanssız istenirse açılış durur, dosya modu lisanssız normal çalışır.
YEKE_POLICY_DIR— Dosya modunun politika dizini. YEKE_POLICY_MODE=central ile birlikte verilemez — ikisi birden verilirse core açık hatayla durur.
YEKE_POLICY_PACKAGE_PUBLIC_KEYS— Paketin imzasını doğrulayan Ed25519 anahtarları (virgülle ayrık PEM ya da base64'ü). central modda zorunlu. Lisans anahtarından VE air-gap yayın imzasından AYRIDIR — üç iddia, üç anahtar.

1) Anahtar çifti — kurumun kendisi üretir, YEKE'ye hiç gitmez

openssl genpkey -algorithm ed25519 -out policy-private.pem
openssl pkey -in policy-private.pem -pubout -out policy-public.pem

policy-private.pem kurumda kalır; policy-public.pem core'a YEKE_POLICY_PACKAGE_PUBLIC_KEYS ile verilir.

2) Paket gövdesi — signature alanı olmadan, version her yüklemede ARTAR

{
  "version": 3,
  "policies": [
    { "id": "prod-namespace-guard", "match": "...", "effect": "require" }
  ],
  "freezes": [
    {
      "id": "hafta-sonu",
      "description": "Hafta sonu değişiklik dondurması",
      "timezone": "Europe/Istanbul",
      "weekly": [{ "from": "Fri 17:00", "to": "Mon 09:00" }],
      "scope": { "clusters": ["*"] }
    }
  ]
}

3) İmzalama — kurumun kendi private key'iyle

pnpm --filter @yeke/core exec tsx tools/policy-package/sign.ts \
  --private-key policy-private.pem \
  --package paket.json \
  --out paket-imzali.json

Araç zaten imzalı bir gövdeyi (signature alanı dolu) girdi olarak reddeder. Çıktının son satırı parmak izini basar — yükledikten sonra GET /api/policy/packagein döndürdüğü fingerprintle karşılaştırılacak değer budur.

4) Yükleme — kimlik doğrulanmış bir admin oturumuyla

curl -X PUT https://yeke.ornek.com/api/policy/package \
  -H "Authorization: Bearer <admin oturumunun kendi jetonu>" \
  -H "Content-Type: application/json" \
  --data @paket-imzali.json
  • Yükleme anında yürürlüğe girer — core yeniden başlamaz — ama koşan bir planı etkilemez: plan kaydı sınıflandırıldığı politika sürümünü taşır (plan.policyVersion) ve apply o sürümle koşar.
  • Bozuk imzalı bir paket önceki sürümü düşürmez — reddedilir, önceki sürüm yürürlükte ve okunmaya devam eder.
  • Her değişiklik izlenir: policy.package_installed (kim, sürüm, politika sayısı, imza parmak izi, fark özeti); politikanın gövdesi ize yazılmaz.

Terminal oturum kaydı

Cluster başına opt-in, varsayılan kapalı — gizli kayıt yok.

Metadata olayları (kim, hangi pod, kaç bayt) her koşulda ve Community dâhil yazılır. Tam pty kaydı ayrı bir anahtarla açılır: PUT /api/clusters/:clusterId/exec-recording (admin + configure), cluster.exec_recording_changed denetim olayıyla izlenir.

  • Kayıt açıldığında terminal açılış satırında söylenir. Bu bir eksiklik değil bir tasarım kararı: kullanıcı oturumu başlatırken tam kaydın açık olduğunu görür.
  • Kayıt AES-256-GCM ile şifrelenir, ham çıktı tavanı oturum başına 32 MiB'dir — aşılınca truncated işaretlenir, oturum kesilmez.
  • İndirilen biçim asciinema v2 .casttir (GET /api/clusters/:clusterId/recordings, GET …/recordings/:id/cast, admin). Tarayıcıda satır içi oynatma yoktur, müşteri kendi oynatıcısını seçer. Her okuma stream.recording_read yazar.
  • Kendi saklama ayarı vardır: Sistem ayarları → Veri saklama → “Shell kayıtları” (varsayılan 30 gün) — bilinçli olarak ayrı bir kadran, operasyon saklama süresine bağlı değildir ve E2'nin arşiv düzlemine girmez.
  • Lisans kaldırıldığında yeni kayıt başlamaz, var olan kayıtlar okunabilir kalır — veri rehin alınmaz.
  • Politikayla zorunlu kılınabilir. Guardrail CEL bağlamı cluster kaydının duruşunu ve gerçekten aktif olup olmadığını görür; depoda kapalı bir şablon var (ops.recording-required) — "kaydı başlamayacak bir terminal oturumu açılamaz" diyen kuralı kendi ad alanınızda nasıl açacağınız Politikalar sayfasında.

Secret görünürlüğü

Tek ayar, üç kip — kısıtlı kipte owner dahil kimse YEKE üzerinden Secret değerini görmez.

Kipi kurulum sahibi Yönetim → Sistem → Sistem ayarları → Oturumlar ve erişim → “Secret değerleri”nde seçer; kimlikten bağımsızdır. Kubernetes yetkisi ve yetki grupları kimin hangi anahtara erişebileceğini belirlemeye devam eder — bu tavan, erişilebilen anahtarda GÖRÜNENİ değiştirir.

KipNe işe yarar
Tam (full, varsayılan) Değerler açık.
Maskeli (masked) Her çıkış yolunda değeri, eşit değerlerde aynı kalan bir işaretle değiştirir.
Gizli (hidden) İşareti de kaldırır, yalnız anahtar adları kalır.

Dağıtımda YEKE_SECRET_DISPLAY (full, masked ya da hidden) verilmişse alan arayüzde kilitli görünür; tanınmayan bir değer core'u açılışta durdurur.

  • Kör yazma. Kısıtlı kipte Secret ekranı "Değerleri göster"i çizmez; değer yerine maske çipi ve anahtar başına "Yeni değer" alanı sunar — eski değer hiç görülmeden yeni değer yazılır.
  • Her çıkış yolunda uygulanır. Okuma vekili (tarayıcı + kabuk), izleme akışı, kabuk yazma yankısı, plan/denetim kaydı ve GitOps'a yansıtma aynı kuraldan geçer; maske işaretinin (düz, base64 çözülmüş ya da JSON patch içi) geri yazılması her kipte reddedilir.
  • Yetki gruplarının anahtar kuralıyla birleşir, onun yerine geçmez. Etkin görünürlük bu tavan ile yetki grubunun anahtar kuralının daha kısıtlayıcı olanıdır — grup bir anahtarı "Görür" işaretlese bile tavan masked/hiddenken değer maskeli kalır.
  • Secret sürümleri geçmişinde de aynı tavan geçerlidir. Kısıtlı kipte diff ekranında değer maskeli kalır, "kör geri yükleme" yalnız hangi anahtarın değiştiğini bilerek yapılabilir.
  • Kısıtlı kipler lisans ister. Enterprise secret-display bayrağı yoksa Sistem ayarları Maskeli ve Gizli'yi kaydetmez; dağıtımdan verilen kısıtlı kip ise lisanssız ilk kurulumda core'u açtırmaz — sessizce full'a düşmek gizlenmek istenen değeri gösterirdi. Lisans sonradan kaldırılırsa core yine açılır — daha önce yürürlüğe girmiş kip ile ayarın daha sıkı olanı uygulanır, açılış logunda WARNING satırı ve arayüzde (Lisans sayfasında "Secret görünürlüğü" rozeti) uyarı görünür.
  • Sınır: bu bir YEKE üzerinden görüntüleme sınırıdır, Kubernetes sınırı değil. exec ile pod içinden okuma, değeri log'a ya da env'e basan bir iş yükü ve kümeye YEKE dışından erişim bu sınırın dışındadır.

Uyum raporu

Cluster × dönem değişiklik raporu — tek bir uçtan, tek bir şablonla.

Rapor bir türevdir: yeni tablo ya da olay yazmaz. Kaynakları denetim izi, yönetici onayları (admin_actions) ve — dönem arşive düşmüşse — E2'nin arşividir. Tek uç: GET /api/clusters/:clusterId/reports/change?from=&to=&format=&lang= (admin); ekrandan indirmek için /admin/reports.

  • Biçim yokluğu html'ye düşer (tek dosya, air-gap kurulumda da açılır), yazım hatası 400 INVALID_FORMAT alır. Alternatif biçim ndjsondır.
  • Dönem tavanı 366 gündür (bir artık yılın tamamı); from >= to 400 INVALID_PERIOD ile reddedilir.
  • Rapor kendi bütünlüğünü taşır: kapsadığı olay aralığının kanonik hash zincirinin baş/son değerini ve olay sayısını içerir, mevcut verify-tool ile doğrulanabilir — yani rapor bir iddia değil bir kanıt olur.
  • Kapsam beyanı: tek şablon ürün olarak sabittir ("cluster × dönem değişiklik raporu") — rapor şablonu editörü ya da kullanıcı tanımlı rapor yoktur. Terminal oturum kaydı için beyan artık sayı verir: dönemde açılan oturum, kaçının kaydı başladı, kaçı kayıt kapalıyken açıldı.
  • Lisans yoksa rapor ucu 403 LICENSE_FEATURE_LOCKED alır; ham iz okuması (GET /api/audit) ve NDJSON dışa aktarımı (SIEM) etkilenmez.
pnpm --filter @yeke/core exec tsx tools/audit-export/verify.ts \
  --input yeke-change-report.ndjson --format ndjson

Rapor NDJSON'u imzasızdır — --pubkey gerekmez; araç yine de zincirin baş/son değerlerini ve olay sayısını sınar.

Lisans yoksa

Altı kalem dört farklı sınıfta — tek bir "403" hiçbirini doğru anlatmaz.

KalemBayrakLisans yoksa
Çift onaydual-approval use kapısı hiç sorulmaz; yapılandırılmış kural yürürlükte kalır, kesilen tek şey yeni kural tanımlamaktır. Dosya modunda yeni ya da değiştirilmiş kural core'u açtırmaz.
Bakım penceresichange-freeze use kapısı hiç sorulmaz; yapılandırılmış pencere yürürlükte kalır, kesilen tek şey yeni pencere tanımlamaktır. Dosya modunda yeni ya da değiştirilmiş pencere core'u açtırmaz.
Merkezî politika paketipolicy-central central modu istendiyse açılış durur; istenmediyse dosya modu (varsayılan) normal çalışır ve bit değişmeden kalır.
Terminal oturum kaydısession-recording Yeni kayıt başlamaz; var olan kayıtlar okunabilir kalır — veri rehin alınmaz.
Secret görünürlüğüsecret-display
(faz E6)
Kısıtlı kip bu kurulumda daha önce hiç yürürlüğe girmemişse açılış durur. Daha önce yürürlüğe girmişse core açılır: önceki kip ile ayarın daha sıkı olanı uygulanır, uyarı yazılır.
Uyum raporucompliance-reports Rapor ucu 403 LICENSE_FEATURE_LOCKED; ham iz okuması ve NDJSON dışa aktarımı etkilenmez.

Rehin değil: yapılandırılmış bir kuralı silmek her zaman mümkündür — politika dosyasından/paketten kaldırmak configure kapısının konusu değil, kaynağın kendisinin konusudur ve operatör her koşulda erişebilir.

Sınırlar

Desteklenmeyen durumlar ve bilinen sınırlamalar.

  • Çift onayda quorum (N>2 onaycı) yok. Şema çoklu satırı bedelsiz destekliyor ama kapı bugün count >= 1 diyor ve arayüzde bir ayar yok.
  • Break-glass / freeze delme yolu yok. Kendi turunu bekliyor: kim delebilir, hangi kayıtla, kime bildirilir, geri dönüşü ne — yarım bir break-glass, freeze'in kendisinden kötü olurdu.
  • Rapor şablonu bugün TEK: "cluster × dönem değişiklik raporu". Şablon editörü ya da kullanıcı tanımlı rapor yok.
  • Tarayıcıda satır içi kayıt oynatma yok, yalnız .cast indirmesi.

İkinci insanı ürün arar

Çift onay bekleyen bir plan ya da freeze penceresi, mevcut bildirim kancasının kuyruğuna düşer — yeni bir mekanizma değil, var olanın yeni bir tetikleyicisi.