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_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.

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.

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: 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_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

Beş kalem üç 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.
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.
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.
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.