1
0
Fork 0
mirror of https://github.com/retspen/webvirtcloud synced 2026-11-09 03:36:48 +00:00
webvirtcloud/ROADMAP.md

126 lines
15 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# WebVirtCloud — Kapsamlı Kod İnceleme, Güvenlik Denetimi ve Yol Haritası (Roadmap)
Bu belge; **Antigravity** ve **Codex** tarafından gerçekleştirilen modül bazlı bağımsız güvenlik, güvenilirlik, mimari ve geliştirme denetimlerinin sentezini ve önceliklendirilmiş aksiyon planını içermektedir.
---
## 1. Yönetici Özeti ve Karşılaştırmalı Değerlendirme
WebVirtCloud kod tabanı; temel sanallaştırma orkestrasyonu için işlevsel bir temel sunmakla birlikte, özellikle **REST API yetkilendirme modelleri**, **konsol oturum doğrulama mekanizmaları**, **libvirt eşzamanlılığı (concurrency)** ve **veri bütünlüğü korumaları** açısından önemli güvenlik ve kararlılık riskleri barındırmaktadır.
### İnceleme Perspektifleri Karşılaştırması
| Kapsam | Antigravity Odak Noktaları | Codex Odak Noktaları | Birleşik Konsensus / Kritik Aksiyon |
|---|---|---|---|
| **API & Yetkilendirme** | `ComputeSerializer` düz metin parola sızıntısı; `ComputeViewSet` normal kullanıcılara açık; `instances` nested endpoint bilgi ifşası. | API viewset'lerinde genel RBAC ve tenant izolasyonu yokluğu; `FlavorViewSet` ve `StorageViewSet` denetimsiz erişimi. | **P0:** API viewset'leri derhal `IsAdminUser` ile sınırlandırılmalı, `password` alanı serileştirmeden çıkarılmalı. |
| **Konsol Güvenliği** | `novncd` token formatı (`host-uuid`) tahmini kolay, imzasız ve süresiz. | `novncd` oturum/kullanıcı denetimi yapmıyor; `socketiod` tek bir global process ve paylaşımlı PTY state kullanıyor. | **P0:** HMAC imzalı, kısa ömürlü, kullanıcı ve VM'e bağlı tek kullanımlık token (one-time grant) modeline geçilmeli. |
| **Arka Plan Servisleri** | Socket/SSH upload senaryolarında konteyner dosya sistemi izolasyonu. | `gstfsd` daemon'u `0.0.0.0:16510` üzerinde kimlik doğrulamasız dinliyor; VM root parolası/SSH key değiştirebiliyor. | **P0:** `gstfsd` devre dışı bırakılmalı veya loopback + mTLS / Unix domain socket altına alınmalı. |
| **İlk Kurulum / Auth** | Brute-force koruması yokluğu; open redirect riski (`next` parametresi). | Boş veritabanında otomatik `admin/admin` hesabı üretimi; `view_instances` izninin fiilen yetki aşımı sağlaması. | **P0:** Otomatik `admin/admin` kaldırılmalı; bootstrap token / env şifresi zorunlu kılınmalı. |
| **Veri Bütünlüğü & Senkronizasyon** | Senkron `refr(compute)` çağrılarının HTTP isteklerini bloklaması. | `refresh_instance_database` geçici libvirt kesintisinde DB'deki VM'yi silip `UserInstance` sahipliğini cascade yok ediyor. | **P1:** Silme yerine `last_seen_at` / `missing` durumu uygulanmalı; senkronizasyon arka plan kuyruğuna alınmalı. |
| **Libvirt & vrtManager** | Monolitik view fonksiyonları (30+ `request.POST` if-else dalı); hata yakalama zafiyetleri. | Snapshot sırasında `pflash` → `rom` dönüşümünde `finally` bloğu olmaması; XML injection yüzeyi (f-string XML). | **P1:** `lxml` builder kullanımı; snapshot geri alma ve hata yakalama state machine mimarisi. |
---
## 2. Modül Bazında Detaylı Değerlendirme
### 2.1. `accounts` (Kullanıcılar, İzinler ve Kimlik Doğrulama)
- **Güvenlik (P0):** `accounts/apps.py` boş veritabanında varsayılan `admin/admin` hesabı oluşturmaktadır. Bu hesap doğrudan yetki gaspına yol açar.
- **Güvenlik (P1):** `accounts/views.py` içindeki `redirect(next)` çağrıları URL whitelist doğrulaması (`url_has_allowed_host_and_scheme`) yapmadığından Açık Yönlendirme (Open Redirect) açığı barındırır.
- **Güvenilirlik (P1):** `UserSSHKey.keypublic` alanı `max_length=500` ile sınırlıdır; RSA-4096 anahtarları (~730 karakter) ve sertifikalı anahtarlar kesilmekte veya kaydedilememektedir (`TextField` olmalı). `on_delete=models.DO_NOTHING` yetim kayıt bırakmaktadır (`CASCADE` olmalı).
- **İyileştirme (P2):** Giriş denemeleri için brute-force / hız sınırlaması (Rate Limiting / `django-axes`) entegrasyonu.
### 2.2. `computes` (Hesaplama Düğümleri ve Libvirt Ana Makineleri)
- **Kritik Güvenlik (P0):** `ComputeViewSet` yalnızca `IsAuthenticated` izni gerektirmektedir. `ComputeSerializer` ise `password` alanını hem yazılabilir hem okunabilir döndürmektedir. Herhangi bir standart kullanıcı `GET /api/v1/computes/` ile hipervizör parolalarını ve SSH erişim bilgilerini düz metin olarak ele geçirebilir!
- **Güvenlik (P1):** Compute parolaları veritabanında düz metin saklanmaktadır. Şifrelenmiş depolama (Fernet / envelope encryption) zorunludur.
- **Güvenilirlik (P1):** `compute_graph`, `get_compute_disk_buses` ve `overview` endpoint'leri libvirt bağlantı hatalarını kontrollü yakalamamakta ve 500 hatası üretmektedir.
### 2.3. `instances` (Sanal Sunucu Yaşam Döngüsü)
- **Güvenlik (P0):** `InstanceViewSet` nested endpoint'i (`/api/v1/computes/{compute_pk}/instances/`) kullanıcı sahipliği filtrelemesi yapmadan tüm sunucuları ve UUID'leri döndürmektedir.
- **Güvenlik (P1):** `view_instances` izni salt okunur olarak tasarlanmasına rağmen, `instance` view fonksiyonlarında power on/off/force off, snapshot ve konfigürasyon değişikliklerine izin vermektedir.
- **Güvenilirlik (P1):** `refresh_instance_database` fonksiyonu libvirt'ten anlık yanıt alınamadığında DB kaydını silmekte, bu da `UserInstance` sahiplik ilişkilerini kalıcı olarak silmektedir.
- **İyileştirme (P2):** 1,959 satırlık monolitik `instances/views.py` dosyası ve 30'dan fazla `request.POST.get()` dalı; sınıf tabanlı modüler view'lara veya servis katmanına refactor edilmelidir.
### 2.4. `storages` (Depolama Havuzları ve Diskler)
- **Güvenlik (P1):** `handle_uploaded_file` fonksiyonundaki `target_temp.startswith(path)` kontrolü yetersizdir; `/var/lib/images-evil` gibi prefix bypass'larına açıktır (`Path.resolve().relative_to()` kullanılmalı).
- **Güvenlik (P1):** SFTP ile ISO yüklemesinde `paramiko.AutoAddPolicy()` kullanılarak SSH Man-in-the-Middle (Ortadaki Adam) saldırılarına açık bırakılmıştır.
- **Artı Değer (P2):** qcow2/raw dönüştürme ve boyutlandırma işlemleri senkron yürütülmektedir; uzun süren disk işlemleri asenkron iş kuyruğuna (Celery/Huey) taşınmalıdır.
### 2.5. `networks` & `interfaces` (Ağ ve Arayüz Yönetimi)
- **Güvenlik (P1):** `nwfilters/views.py` detay görünümünde `superuser_only` eksiktir; standart kullanıcı filtre XML'lerini okuyup değiştirebilmektedir.
- **Güvenilirlik (P1):** Ağ XML tanımlamaları f-string ile üretilmekte olup XML injection riskine açıktır.
### 2.6. `console` (noVNC ve Terminal Konsolları)
- **Kritik Güvenlik (P0):** `novncd` daemon'u token olarak yalnızca `<compute_id>-<uuid>` formatını doğrulamakta; kullanıcı kimliği, oturum geçerliliği veya zaman aşımı denetlememektedir. UUID'yi bilen herkes VNC masaüstüne doğrudan bağlanabilmektedir.
- **Kritik Güvenlik (P0):** `socketiod` tek bir global process değişkeni (`child_pid`, `fd`) kullanmakta; tüm kullanıcılara aynı terminal akışını broadcast etmekte ve karşılıklı komut girişine izin vermektedir.
### 2.7. `logs` & `appsettings` (Denetim Kayıtları ve Uygulama Ayarları)
- **Güvenlik (P1):** `appsettings/views.py` yalnızca `login_required` içermekte; standart bir kullanıcı global sistem ayarlarını ve SASS derleme dizinini değiştirebilmektedir.
- **İyileştirme (P2):** `Logs` modeli kaynak IP adresi, işlem sonucu (başarı/hata) ve korelasyon ID'si içermemektedir. `auto_now=True` yerine değişmez `auto_now_add=True` kullanılmalıdır.
### 2.8. `vrtManager` (Libvirt Soyutlama Katmanı)
- **Güvenilirlik (P1):** `wvmConnect.close()` metodu boştur; kopan libvirt soketleri yeniden bağlanırken eski proxy nesnelerindeki referanslar güncellenmemektedir.
- **Güvenilirlik (P1):** Snapshot işlemlerinde UEFI NVRAM / `pflash` geçici olarak `rom` yapılırken `finally` bloğu eksiktir; hata durumunda VM XML'i bozuk kalmaktadır.
---
## 3. Önceliklendirilmiş Uygulama Planı (Aksiyon Listesi)
### Faz 1: P0 — Acil Güvenlik Düzeltmeleri ve Codex İnceleme Sıkılaştırması (Tamamlandı ✅)
1. **API Yetkilendirme & Secret İzolasyonu:** [x]
- `ComputeViewSet`, `StorageViewSet`, `VolumeViewSet`, `NetworkViewSet`, `InterfaceViewSet`, `MigrateViewSet`, `CreateInstanceViewSet` sınıflarına `permission_classes = [IsSuperUser]` (`admin.permissions.IsSuperUser`) atanarak `is_staff` yetki aşımı tamamen önlendi; `FlavorViewSet` mutasyonları süper kullanıcılara sınırlandı.
- `@superuser_only` dekoratörüne `@wraps(function)` eklenerek fonksiyon meta verileri korundu.
- `ComputeSerializer` içindeki `password` alanına `write_only=True` verildi; GET yanıtlarında şifre ifşası tamamen engellendi.
- `InstanceViewSet.list` üzerinde `is_admin` harici kullanıcılar için compute üzerinde atanmış instance olup olmadığını kontrol eden ön denetim (`tenant pre-check`) eklendi; yetkisiz compute sorgulamalarında libvirt senkronizasyonunun gereksiz çalışması (DoS ve bilgi ifşası) engellendi.
2. **noVNC & Konsol Token Güvenliği:** [x]
- `django.core.signing.TimestampSigner` (salt: `console.novnc`, TTL: 120 saniye) ile imzalı, kullanıcı ve VM UUID eşleştirmeli token modeline geçildi.
- `novncd` ve `console/views.py` içinde imza doğrulama, 2 dakikalık süre aşımı kontrolü, `is_active` hesap denetimi ve kullanıcı sahiplik doğrulaması uygulandı.
- `novncd` içerisindeki `settings.DEBUG` imzasız fallback bypass'ı prodüksiyon ortamları için tamamen kaldırıldı; yalnızca birim test çalıştırmaları (`"test" in sys.argv`) ile sınırlandırıldı.
- Konsol hata loglarında token bilgisi maskelenerek log sızıntısı önlendi.
3. **Varsayılan Hesap ve Arka Plan Daemon Sıkılaştırması:** [x]
- `accounts/apps.py` içinde hardcoded `admin/admin` üretimi kaldırıldı; `ADMIN_PASSWORD` ortam değişkeni veya `secrets.token_urlsafe(16)` ile rastgele güçlü parola üretimi sağlandı (test modunda test ortamı uyumluluğu korundu).
- `conf/daemon/gstfsd` varsayılan olarak `127.0.0.1` (loopback) üzerine bağlandı ve ortam değişkeni (`GSTFSD_BIND_HOST`) ile yapılandırılabilir hale getirildi.
4. **Appsettings & NWFilter İzin Sıkılaştırması:** [x]
- `appsettings/views.py` ve `nwfilters/views.py` (`nwfilter` detay görünümü dahil) `@superuser_only` dekoratörüyle korunarak yetkisiz erişimler 403 Forbidden ile engellendi.
- Tüm güvenlik geliştirmeleri için kapsamlı testler (`computes/test_api_security.py`, `console/tests.py`, `appsettings/test_appsettings.py`, `nwfilters/tests.py`) yazılarak test paketi 135/135 test ile %100 yeşil hale getirildi.
### Faz 2: P1 — Güvenilirlik, Hata Yakalama ve Veri Bütünlüğü (1-2 Sprint)
1. **Kanonik UUID Reconciliation ve Veri Bütünlüğü:** [x]
- `refresh_instance_database` (`computes/utils.py`) ve `instances/utils.py:refr` kanonik UUID-temelli senkronizasyona geçirildi.
- Libvirt'in Single Source of Truth (SSOT) ilkesi korundu; `virsh` veya `virt-manager` ile silinen VM'ler temizlenirken, VM isim değişikliklerinde `UserInstance` kullanıcı izinleri ve yetkileri kaybolmadan korunur hale getirildi.
- Libvirt bağlantı kopmalarında veya soket hatalarında veritabanındaki tüm instance'ların silinmesi (`try...except libvirtError` ve `transaction.atomic()`) engellendi.
2. **Yetki ve CSRF Sıkılaştırması:** [x]
- `instances/views.py` içindeki tüm güç yönetimi aksiyonlarına (`poweron`, `powercycle`, `poweroff`, `force_off`, `suspend`, `resume`) `@require_POST` zorunluluğu getirildi ve inline CSRF tokenli form butonlarına dönüştürüldü (GET ile VM kapatma/açma açığı kapatıldı).
- Salt-okunur `view_instances` iznine sahip kullanıcıların VM kapatıp açması, disk ekleyip silmesi engellendi; `UserInstance.is_change` ve `UserInstance.is_delete` nesne bazlı yetki denetimi uygulandı.
- `set_root_pass` ve `add_public_key` içindeki IDOR (güvenlik zafiyeti) kapatılarak oturum açmış kullanıcı ile sınırlandı.
- API katmanında (`instances/api/viewsets.py`) `compute_pk` ve `instance` eşleşme doğrulaması eklendi.
3. **Açık Yönlendirme (Open Redirect) Engeli:** [x]
- `instances/views.py` (`get_safe_redirect`) ve `accounts/views.py` üzerinde Django `url_has_allowed_host_and_scheme` ile güvenli yönlendirme sağlandı, harici sitelere yönlendirme engellendi.
4. **SSH Anahtar Modeli ve Doğrulama İyileştirmesi:** [x]
- `UserSSHKey.keypublic` alanı `TextField(max_length=16384)` yapıldı (uzun RSA 4096 ve ED25519 anahtarlarının DB'de kesilmesi engellendi) ve `user` ilişkisine `CASCADE` tanımlandı.
- `validate_ssh_key` 2 parçalı (açıklamasız) ve 3 parçalı (açıklamalı) standart OpenSSH genel anahtarlarını destekleyecek şekilde güncellendi.
5. **Depolama & Yükleme (Upload) Güvenliği:** [x]
- `storages/views.py` (`handle_uploaded_file` ve `iso_upload`) içinde `os.path.basename` sterilizasyonu, `os.path.commonpath` yerel dizin jailing, SFTP `posixpath` sınır denetimi, null-byte/dot engeli uygulandı.
- Paramiko `AutoAddPolicy` yerine `WarningPolicy()` ve `load_system_host_keys()` getirilerek MITM riski düşürüldü; SFTP bağlantı ve dosya kaynakları `try...finally` bloklarıyla sızıntısız temizlendi.
6. **Snapshot & XML Güvenliği:** [x]
- `vrtManager/instance.py` içindeki `create_snapshot`, `create_external_snapshot` ve `snapshot_revert` fonksiyonları `try...finally` bloklarına alınarak libvirt domain loader XML'inin (`pflash`/`rom`) hata durumunda dahi bozulmadan eski haline getirilmesi (`recover_snapshot_xml`) garanti altına alındı.
- `vrtManager/network.py` ve `vrtManager/instance.py` içindeki `name`, `bridge`, `gateway`, `mac_duid` vb. dinamik parametreler `util.xml_escape` ile sterilize edildi; QoS parametreleri tamsayı (`int`) doğrulamasına alındı.
- 10 yeni test yazılarak proje genelinde test sayısı 159'a yükseltildi ve test paketi %100 yeşil hale getirildi.
### Faz 3: P2 — Mimari İyileştirme ve Django 5 Geçiş Hazırlığı (Orta Vade)
1. **Django 5.x Uyumluluğu:**
- `USE_L10N` ayarının kaldırılması.
- `django-login-required-middleware` yerine Django 5 yerel `LoginRequiredMiddleware` planlaması.
2. **OpenAPI / drf-spectacular Standardizasyonu:**
- Tüm viewset'lerin `@extend_schema` ile belgelenmesi, eksik serializer sınıflarının tanımlanması.
3. **Monolitik Görünümlerin Modülerleştirilmesi:**
- `instances/views.py` içerisindeki yaşam döngüsü aksiyonlarının (power, volume, snapshot, network) ayrıştırılması.
4. **Yapılandırılmış Denetim Günlüğü (Audit Log):**
- IP adresi, aktör, hedef nesne UUID'si ve işlem sonucunu içeren loglama modeli.
### Faz 4: P3 — Artı Değer ve İleri Seviye Özellikler (Uzun Vade)
1. **Modern Cloud-Init Desteği:**
- VM oluşturma sihirbazına kullanıcı verisi (user-data), ağ ayarları ve SSH key enjeksiyonu sağlayan NoCloud/ConfigDrive entegrasyonu.
2. **Gerçek Zamanlı Metrik Toplayıcı:**
- Libvirt üzerinden CPU, RAM (balloon), Disk I/O ve Network I/O sayaçlarını periyodik toplayan hafif metrik servisi (Prometheus uyumlu).
3. **Yedekleme ve Geri Yükleme Yönetimi:**
- Anlık görüntüden bağımsız, harici depolama (NFS/S3) hedeflerine zamanlanmış tam ve artımlı yedekleme yeteneği.