1
0
Fork 0
mirror of https://github.com/retspen/webvirtcloud synced 2026-11-08 19:26:48 +00:00

chore: keep roadmap local and untracked

This commit is contained in:
catborise 2026-09-28 15:10:33 +03:00
parent 2441b21c0c
commit a3a6961155
2 changed files with 1 additions and 126 deletions

1
.gitignore vendored
View file

@ -18,4 +18,5 @@ htmlcov
*.log
templates/webvirtcloud.code-workspace
DEPENDENCY_UPGRADE_PLAN.md
ROADMAP.md
.agents

View file

@ -1,126 +0,0 @@
# 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.