mirror of
https://github.com/retspen/webvirtcloud
synced 2026-11-08 11:16:47 +00:00
15 KiB
15 KiB
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.pyboş veritabanında varsayılanadmin/adminhesabı oluşturmaktadır. Bu hesap doğrudan yetki gaspına yol açar. - Güvenlik (P1):
accounts/views.pyiçindekiredirect(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.keypublicalanımax_length=500ile sınırlıdır; RSA-4096 anahtarları (~730 karakter) ve sertifikalı anahtarlar kesilmekte veya kaydedilememektedir (TextFieldolmalı).on_delete=models.DO_NOTHINGyetim kayıt bırakmaktadır (CASCADEolmalı). - İ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):
ComputeViewSetyalnızcaIsAuthenticatedizni gerektirmektedir.ComputeSerializerisepasswordalanı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_busesveoverviewendpoint'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):
InstanceViewSetnested 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_instancesizni salt okunur olarak tasarlanmasına rağmen,instanceview fonksiyonlarında power on/off/force off, snapshot ve konfigürasyon değişikliklerine izin vermektedir. - Güvenilirlik (P1):
refresh_instance_databasefonksiyonu libvirt'ten anlık yanıt alınamadığında DB kaydını silmekte, bu daUserInstancesahiplik ilişkilerini kalıcı olarak silmektedir. - İyileştirme (P2): 1,959 satırlık monolitik
instances/views.pydosyası ve 30'dan fazlarequest.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_filefonksiyonundakitarget_temp.startswith(path)kontrolü yetersizdir;/var/lib/images-evilgibi 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.pydetay görünümündesuperuser_onlyeksiktir; 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):
novncddaemon'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):
socketiodtek 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.pyyalnızcalogin_requirediçermekte; standart bir kullanıcı global sistem ayarlarını ve SASS derleme dizinini değiştirebilmektedir. - İyileştirme (P2):
Logsmodeli kaynak IP adresi, işlem sonucu (başarı/hata) ve korelasyon ID'si içermemektedir.auto_now=Trueyerine değişmezauto_now_add=Truekullanı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 /
pflashgeçici olarakromyapılırkenfinallybloğ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ı ✅)
- API Yetkilendirme & Secret İzolasyonu: [x]
ComputeViewSet,StorageViewSet,VolumeViewSet,NetworkViewSet,InterfaceViewSet,MigrateViewSet,CreateInstanceViewSetsınıflarınapermission_classes = [IsSuperUser](admin.permissions.IsSuperUser) atanarakis_staffyetki aşımı tamamen önlendi;FlavorViewSetmutasyonları süper kullanıcılara sınırlandı.@superuser_onlydekoratörüne@wraps(function)eklenerek fonksiyon meta verileri korundu.ComputeSerializeriçindekipasswordalanınawrite_only=Trueverildi; GET yanıtlarında şifre ifşası tamamen engellendi.InstanceViewSet.listüzerindeis_adminharici 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.
- 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.novncdveconsole/views.pyiçinde imza doğrulama, 2 dakikalık süre aşımı kontrolü,is_activehesap denetimi ve kullanıcı sahiplik doğrulaması uygulandı.novncdiçerisindekisettings.DEBUGimzası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.
- Varsayılan Hesap ve Arka Plan Daemon Sıkılaştırması: [x]
accounts/apps.pyiçinde hardcodedadmin/adminüretimi kaldırıldı;ADMIN_PASSWORDortam değişkeni veyasecrets.token_urlsafe(16)ile rastgele güçlü parola üretimi sağlandı (test modunda test ortamı uyumluluğu korundu).conf/daemon/gstfsdvarsayılan olarak127.0.0.1(loopback) üzerine bağlandı ve ortam değişkeni (GSTFSD_BIND_HOST) ile yapılandırılabilir hale getirildi.
- Appsettings & NWFilter İzin Sıkılaştırması: [x]
appsettings/views.pyvenwfilters/views.py(nwfilterdetay görünümü dahil)@superuser_onlydekoratö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)
- Kanonik UUID Reconciliation ve Veri Bütünlüğü: [x]
refresh_instance_database(computes/utils.py) veinstances/utils.py:refrkanonik UUID-temelli senkronizasyona geçirildi.- Libvirt'in Single Source of Truth (SSOT) ilkesi korundu;
virshveyavirt-managerile silinen VM'ler temizlenirken, VM isim değişikliklerindeUserInstancekullanı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 libvirtErrorvetransaction.atomic()) engellendi.
- Yetki ve CSRF Sıkılaştırması: [x]
instances/views.pyiçindeki tüm güç yönetimi aksiyonlarına (poweron,powercycle,poweroff,force_off,suspend,resume)@require_POSTzorunluluğ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_instancesiznine sahip kullanıcıların VM kapatıp açması, disk ekleyip silmesi engellendi;UserInstance.is_changeveUserInstance.is_deletenesne bazlı yetki denetimi uygulandı. set_root_passveadd_public_keyiçindeki IDOR (güvenlik zafiyeti) kapatılarak oturum açmış kullanıcı ile sınırlandı.- API katmanında (
instances/api/viewsets.py)compute_pkveinstanceeşleşme doğrulaması eklendi.
- Açık Yönlendirme (Open Redirect) Engeli: [x]
instances/views.py(get_safe_redirect) veaccounts/views.pyüzerinde Djangourl_has_allowed_host_and_schemeile güvenli yönlendirme sağlandı, harici sitelere yönlendirme engellendi.
- SSH Anahtar Modeli ve Doğrulama İyileştirmesi: [x]
UserSSHKey.keypublicalanıTextField(max_length=16384)yapıldı (uzun RSA 4096 ve ED25519 anahtarlarının DB'de kesilmesi engellendi) veuserilişkisineCASCADEtanımlandı.validate_ssh_key2 parçalı (açıklamasız) ve 3 parçalı (açıklamalı) standart OpenSSH genel anahtarlarını destekleyecek şekilde güncellendi.
- Depolama & Yükleme (Upload) Güvenliği: [x]
storages/views.py(handle_uploaded_fileveiso_upload) içindeos.path.basenamesterilizasyonu,os.path.commonpathyerel dizin jailing, SFTPposixpathsınır denetimi, null-byte/dot engeli uygulandı.- Paramiko
AutoAddPolicyyerineWarningPolicy()veload_system_host_keys()getirilerek MITM riski düşürüldü; SFTP bağlantı ve dosya kaynaklarıtry...finallybloklarıyla sızıntısız temizlendi.
- Snapshot & XML Güvenliği: [x]
vrtManager/instance.pyiçindekicreate_snapshot,create_external_snapshotvesnapshot_revertfonksiyonlarıtry...finallyblokları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.pyvevrtManager/instance.pyiçindekiname,bridge,gateway,mac_duidvb. dinamik parametrelerutil.xml_escapeile 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)
- Django 5.x Uyumluluğu:
USE_L10Nayarının kaldırılması.django-login-required-middlewareyerine Django 5 yerelLoginRequiredMiddlewareplanlaması.
- OpenAPI / drf-spectacular Standardizasyonu:
- Tüm viewset'lerin
@extend_schemaile belgelenmesi, eksik serializer sınıflarının tanımlanması.
- Tüm viewset'lerin
- Monolitik Görünümlerin Modülerleştirilmesi:
instances/views.pyiçerisindeki yaşam döngüsü aksiyonlarının (power, volume, snapshot, network) ayrıştırılması.
- 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)
- 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.
- 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).
- 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.