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_APPROVERuyarı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 —
usekapısı hiç sorulmaz, yalnızconfiguresorulur. - 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
applybekler.409 APPROVAL_HOOK_DENIED+params.source: "change-freeze"+params.windowEndsAtdö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şken | Varsayılan | Ne işe yarar |
|---|---|---|
YEKE_POLICY_MODE | file |
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) veapplyo 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
truncatediş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 okumastream.recording_readyazar. - 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.
| Kip | Ne 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-displaybayrağı 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 — sessizcefull'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ış logundaWARNINGsatı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_FORMATalır. Alternatif biçimndjsondır. - Dönem tavanı 366 gündür (bir artık yılın tamamı);
from >= to400 INVALID_PERIODile 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-toolile 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_LOCKEDalı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.
| Kalem | Bayrak | Lisans yoksa |
|---|---|---|
| Çift onay | dual-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 penceresi | change-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 paketi | policy-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 raporu | compliance-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 >= 1diyor 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
.castindirmesi.