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ı ve uyum raporları. Bu rehber her özelliğin kurulumunu ve sınırlarını anlatır.
Beş kalem, beş bayrak — hepsi Enterprise: çift onay
dual-approval, bakım penceresi change-freeze, merkezî politika
policy-central, oturum kaydı session-recording, uyum raporu
compliance-reports.
Ç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.
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.
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:
YEKE_EXEC_RECORDING_RETENTION_DAYS(varsayılan 30 gün) — bilinçli olarak ayrı bir kadran, operasyon saklama süresine (YEKE_OPS_RETENTION_DAYS) 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.
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
Beş kalem üç 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. |
| 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. |
| 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. |
| 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.