Fix permission errors to allow saving machine learning models

Correct ownership of the models directory to allow the ML training process to save generated models.

Replit-Commit-Author: Agent
Replit-Commit-Session-Id: 7a657272-55ba-4a79-9a2e-f1ed9bc7a528
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Event-Id: 51de2a29-c1c5-4d67-b236-7a1824b5b0d1
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/449cf7c4-c97a-45ae-8234-e5c5b8d6a84f/7a657272-55ba-4a79-9a2e-f1ed9bc7a528/jFtLBWL
This commit is contained in:
marco370 2025-11-25 17:40:13 +00:00
parent 42541724cf
commit c4546f843f

View File

@ -0,0 +1,66 @@
tail -f /var/log/ids/ml_backend.log
[HYBRID] Mode: Hybrid (IF + Ensemble)
[ML] ✓ Hybrid detector models loaded and ready
 Starting IDS API on http://0.0.0.0:8000
 Docs available at http://0.0.0.0:8000/docs
INFO: 127.0.0.1:45342 - "GET /stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:49754 - "GET /stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:50634 - "GET /stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:39232 - "GET /stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:35736 - "GET /stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:37462 - "GET /stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:59676 - "GET /stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:34256 - "GET /health HTTP/1.1" 200 OK
INFO: 127.0.0.1:34256 - "GET /services/status HTTP/1.1" 200 OK
INFO: 127.0.0.1:34256 - "GET /stats HTTP/1.1" 200 OK
INFO: 127.0.0.1:34264 - "POST /train HTTP/1.1" 200 OK
[TRAIN] Inizio training...
INFO: 127.0.0.1:34264 - "GET /stats HTTP/1.1" 200 OK
[TRAIN] Trovati 100000 log per training
[TRAIN] Addestramento modello...
[TRAIN] Using Hybrid ML Detector
[HYBRID] Training hybrid model on 100000 logs...
INFO: 127.0.0.1:41612 - "GET /stats HTTP/1.1" 200 OK
Traceback (most recent call last):
File "/opt/ids/python_ml/main.py", line 201, in do_training
result = ml_detector.train_unsupervised(df)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/opt/ids/python_ml/ml_hybrid_detector.py", line 467, in train_unsupervised
self.save_models()
File "/opt/ids/python_ml/ml_hybrid_detector.py", line 658, in save_models
joblib.dump(self.ensemble_classifier, self.model_dir / "ensemble_classifier_latest.pkl")
File "/opt/ids/python_ml/venv/lib64/python3.11/site-packages/joblib/numpy_pickle.py", line 552, in dump
with open(filename, 'wb') as f:
^^^^^^^^^^^^^^^^^^^^
PermissionError: [Errno 13] Permission denied: 'models/ensemble_classifier_latest.pkl'
[HYBRID] Extracted features for 1430 unique IPs
[HYBRID] Pre-training Isolation Forest for feature selection...
[HYBRID] Generated 43 pseudo-anomalies from pre-training IF
[HYBRID] Feature selection: 25 → 18 features
[HYBRID] Selected features: total_packets, total_bytes, conn_count, avg_packet_size, bytes_per_second... (+13 more)
[HYBRID] Normalizing features...
[HYBRID] Training Extended Isolation Forest (contamination=0.03)...
[HYBRID] Generating pseudo-labels from Isolation Forest...
[HYBRID] Pseudo-labels: 43 anomalies, 1387 normal
[HYBRID] Training ensemble classifier (DT + RF + XGBoost)...
[HYBRID] Class distribution OK: [0 1] (counts: [1387 43])
[HYBRID] Ensemble .fit() completed successfully
[HYBRID] ✅ Ensemble verified: produces 2 class probabilities
[HYBRID] Ensemble training completed and verified!
[TRAIN ERROR] ❌ Errore durante training: [Errno 13] Permission denied: 'models/ensemble_classifier_latest.pkl'
INFO: 127.0.0.1:45694 - "GET /stats HTTP/1.1" 200 OK
^C
(venv) [root@ids python_ml]# ls models/
ensemble_classifier_20251124_185541.pkl feature_names.json feature_selector_latest.pkl isolation_forest_20251125_183830.pkl scaler_20251124_192122.pkl
ensemble_classifier_20251124_185920.pkl feature_selector_20251124_185541.pkl isolation_forest.joblib isolation_forest_latest.pkl scaler_20251125_090356.pkl
ensemble_classifier_20251124_192109.pkl feature_selector_20251124_185920.pkl isolation_forest_20251124_185541.pkl metadata_20251124_185541.json scaler_20251125_092703.pkl
ensemble_classifier_20251124_192122.pkl feature_selector_20251124_192109.pkl isolation_forest_20251124_185920.pkl metadata_20251124_185920.json scaler_20251125_120016.pkl
ensemble_classifier_20251125_090356.pkl feature_selector_20251124_192122.pkl isolation_forest_20251124_192109.pkl metadata_20251124_192109.json scaler_20251125_181945.pkl
ensemble_classifier_20251125_092703.pkl feature_selector_20251125_090356.pkl isolation_forest_20251124_192122.pkl metadata_20251124_192122.json scaler_20251125_182742.pkl
ensemble_classifier_20251125_120016.pkl feature_selector_20251125_092703.pkl isolation_forest_20251125_090356.pkl metadata_20251125_092703.json scaler_20251125_183049.pkl
ensemble_classifier_20251125_181945.pkl feature_selector_20251125_120016.pkl isolation_forest_20251125_092703.pkl metadata_latest.json scaler_20251125_183830.pkl
ensemble_classifier_20251125_182742.pkl feature_selector_20251125_181945.pkl isolation_forest_20251125_120016.pkl scaler.joblib scaler_latest.pkl
ensemble_classifier_20251125_183049.pkl feature_selector_20251125_182742.pkl isolation_forest_20251125_181945.pkl scaler_20251124_185541.pkl
ensemble_classifier_20251125_183830.pkl feature_selector_20251125_183049.pkl isolation_forest_20251125_182742.pkl scaler_20251124_185920.pkl
ensemble_classifier_latest.pkl feature_selector_20251125_183830.pkl isolation_forest_20251125_183049.pkl scaler_20251124_192109.pkl
(venv) [root@ids python_ml]#