Guide

Nouvelles mises à jour et améliorations de Macfleet.

Gestion d'Entreprise du Pare-feu pour macOS

Implémentez une gestion de pare-feu de niveau entreprise sur votre déploiement MacFleet avec des politiques de sécurité automatisées, une protection réseau avancée, une détection de menaces et une surveillance de conformité complète. Ce tutoriel fournit des solutions pour maintenir une sécurité réseau robuste tout en assurant la conformité réglementaire et l'efficacité opérationnelle.

Comprendre la Gestion du Pare-feu macOS

macOS fournit plusieurs outils et mécanismes de gestion de pare-feu :

  • Pare-feu d'Application - Pare-feu intégré qui bloque les connexions entrantes
  • socketfilterfw - Outil en ligne de commande pour la configuration du pare-feu
  • pfctl - Utilitaire de contrôle de filtre de paquets (filtrage avancé)
  • Préférences Système - Interface de gestion du pare-feu via GUI
  • Profils de Configuration - Déploiement de politiques de pare-feu via MDM

Opérations de Pare-feu de Base

Activer le Pare-feu

#!/bin/bash

# Activer le pare-feu macOS
sudo defaults write /Library/Preferences/com.apple.alf globalstate -int 1

Désactiver le Pare-feu

#!/bin/bash

# Désactiver le pare-feu macOS
sudo defaults write /Library/Preferences/com.apple.alf globalstate -int 0

Vérifier l'État du Pare-feu

#!/bin/bash

# Vérifier l'état du pare-feu
/usr/libexec/ApplicationFirewall/socketfilterfw --getglobalstate

Système de Gestion de Pare-feu Entreprise

Outil de Gestion de Pare-feu Complet

#!/bin/bash

# Outil de Gestion de Pare-feu Entreprise MacFleet
# Sécurité réseau avancée et surveillance de conformité

# Configuration
CONFIG_FILE="/etc/macfleet/firewall_policy.conf"
LOG_FILE="/var/log/macfleet_firewall.log"
RULES_DIR="/Library/MacFleet/FirewallRules"
AUDIT_LOG="/var/log/macfleet_firewall_audit.log"

# Créer les répertoires
mkdir -p "$(dirname "$CONFIG_FILE")" "$(dirname "$LOG_FILE")" "$RULES_DIR" "$(dirname "$AUDIT_LOG")"

# Politique de pare-feu par défaut
cat > "$CONFIG_FILE" 2>/dev/null << 'EOF' || true
# Politique de Gestion de Pare-feu Entreprise MacFleet
# Version : 2.0

# Paramètres d'Application du Pare-feu
ENFORCE_FIREWALL_ENABLED=true
AUTO_ENABLE_ON_VIOLATION=true
BLOCK_ALL_INCOMING_DEFAULT=true
ALLOW_SIGNED_APPS=true
STEALTH_MODE_ENABLED=true

# Contrôle d'Application
WHITELIST_SYSTEM_APPS=true
REQUIRE_APP_SIGNATURES=true
BLOCK_UNSIGNED_APPS=true
LOG_ALL_CONNECTIONS=true
AUTO_BLOCK_SUSPICIOUS_APPS=true

# Politiques de Sécurité Réseau
BLOCK_PRIVATE_NETWORKS=false
ALLOW_APPLE_SERVICES=true
BLOCK_P2P_CONNECTIONS=true
MONITOR_OUTBOUND_CONNECTIONS=true
RATE_LIMIT_CONNECTIONS=true

# Fonctionnalités de Sécurité Avancées
INTRUSION_DETECTION=true
THREAT_INTELLIGENCE_ENABLED=true
GEO_BLOCKING_ENABLED=false
DLP_INSPECTION=true
MALWARE_DETECTION=true

# Conformité et Surveillance
COMPLIANCE_MONITORING=true
SECURITY_BASELINE_ENFORCEMENT=true
AUTOMATED_REPORTING=true
REAL_TIME_ALERTS=true
INCIDENT_RESPONSE=true

# Modèles de Politiques
DEFAULT_SECURITY_PROFILE="corporate_high"
ALLOWED_PORTS="22,53,80,443,993,995"
BLOCKED_COUNTRIES=""
WHITELIST_DOMAINS="*.apple.com,*.icloud.com"

# Paramètres de Maintenance
AUTO_UPDATE_RULES=true
BACKUP_CONFIGURATIONS=true
LOG_RETENTION_DAYS=90
PERFORMANCE_MONITORING=true
EOF

# Charger la configuration
source "$CONFIG_FILE" 2>/dev/null || true

# Fonction de journalisation
log_action() {
    echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" | tee -a "$LOG_FILE"
}

# Fonction de journalisation d'audit
audit_log() {
    local action="$1"
    local result="$2"
    local details="$3"
    echo "$(date '+%Y-%m-%d %H:%M:%S') - ACTION:$action RESULT:$result DETAILS:$details USER:$(whoami)" >> "$AUDIT_LOG"
}

# Obtenir l'état actuel du pare-feu
get_firewall_status() {
    echo "=== État Actuel du Pare-feu ==="
    
    # Vérifier l'état global du pare-feu
    local global_state
    global_state=$(/usr/libexec/ApplicationFirewall/socketfilterfw --getglobalstate 2>/dev/null | grep -o "enabled\|disabled")
    
    echo "État Global du Pare-feu : $global_state"
    
    # Vérifier le mode furtif
    local stealth_mode
    stealth_mode=$(/usr/libexec/ApplicationFirewall/socketfilterfw --getstealthmode 2>/dev/null | grep -o "enabled\|disabled")
    
    echo "Mode Furtif : $stealth_mode"
    
    # Vérifier l'état de journalisation
    local logging_state
    logging_state=$(/usr/libexec/ApplicationFirewall/socketfilterfw --getloggingmode 2>/dev/null | grep -o "enabled\|disabled")
    
    echo "Journalisation : $logging_state"
    
    # Vérifier le mode bloquer tout
    local block_all
    block_all=$(/usr/libexec/ApplicationFirewall/socketfilterfw --getblockall 2>/dev/null | grep -o "enabled\|disabled")
    
    echo "Bloquer Toutes les Connexions Entrantes : $block_all"
    
    # Vérifier les applications autorisées
    echo -e "\nApplications Autorisées :"
    /usr/libexec/ApplicationFirewall/socketfilterfw --listapps 2>/dev/null | grep "ALF" | head -10
    
    return 0
}

# Activer le pare-feu avec paramètres d'entreprise
enterprise_firewall_enable() {
    local security_profile="${1:-$DEFAULT_SECURITY_PROFILE}"
    
    echo "=== Activation du Pare-feu Entreprise ==="
    echo "Profil de Sécurité : $security_profile"
    
    # Activer le pare-feu global
    log_action "Activation du pare-feu global"
    if sudo defaults write /Library/Preferences/com.apple.alf globalstate -int 1; then
        echo "✅ Pare-feu global activé"
        audit_log "FIREWALL_ENABLE" "SUCCESS" "Pare-feu global activé"
    else
        echo "❌ Échec de l'activation du pare-feu global"
        audit_log "FIREWALL_ENABLE" "FAILED" "Échec de l'activation du pare-feu global"
        return 1
    fi
    
    # Configurer selon le profil de sécurité
    case "$security_profile" in
        "corporate_high")
            configure_high_security_profile
            ;;
        "corporate_standard")
            configure_standard_security_profile
            ;;
        "developer")
            configure_developer_profile
            ;;
        "kiosk")
            configure_kiosk_profile
            ;;
        *)
            echo "Profil de sécurité inconnu, utilisation de la configuration standard"
            configure_standard_security_profile
            ;;
    esac
    
    # Activer le mode furtif si requis
    if [[ "$STEALTH_MODE_ENABLED" == "true" ]]; then
        enable_stealth_mode
    fi
    
    # Activer la journalisation si requise
    if [[ "$LOG_ALL_CONNECTIONS" == "true" ]]; then
        enable_firewall_logging
    fi
    
    # Appliquer les règles d'application
    configure_application_rules
    
    echo "✅ Configuration du pare-feu d'entreprise terminée"
    log_action "Pare-feu d'entreprise activé avec le profil : $security_profile"
    
    return 0
}

# Configurer le profil de haute sécurité
configure_high_security_profile() {
    echo "=== Configuration du Profil de Haute Sécurité ==="
    
    # Bloquer toutes les connexions entrantes par défaut
    sudo /usr/libexec/ApplicationFirewall/socketfilterfw --setblockall on 2>/dev/null
    
    # Activer le mode furtif
    sudo /usr/libexec/ApplicationFirewall/socketfilterfw --setstealthmode on 2>/dev/null
    
    # Désactiver l'autorisation automatique pour les applications signées
    sudo /usr/libexec/ApplicationFirewall/socketfilterfw --setallowsigned off 2>/dev/null
    
    # Bloquer toutes les applications non signées
    sudo /usr/libexec/ApplicationFirewall/socketfilterfw --setallowsignedapp off 2>/dev/null
    
    echo "Profil de haute sécurité configuré"
    log_action "Profil de pare-feu haute sécurité appliqué"
}

# Configurer le profil de sécurité standard
configure_standard_security_profile() {
    echo "=== Configuration du Profil de Sécurité Standard ==="
    
    # Autoriser les connexions entrantes essentielles
    sudo /usr/libexec/ApplicationFirewall/socketfilterfw --setblockall off 2>/dev/null
    
    # Activer le mode furtif
    sudo /usr/libexec/ApplicationFirewall/socketfilterfw --setstealthmode on 2>/dev/null
    
    # Autoriser les applications signées
    if [[ "$ALLOW_SIGNED_APPS" == "true" ]]; then
        sudo /usr/libexec/ApplicationFirewall/socketfilterfw --setallowsigned on 2>/dev/null
    fi
    
    echo "Profil de sécurité standard configuré"
    log_action "Profil de pare-feu sécurité standard appliqué"
}

# Configurer le profil développeur
configure_developer_profile() {
    echo "=== Configuration du Profil Développeur ==="
    
    # Paramètres plus permissifs pour le développement
    sudo /usr/libexec/ApplicationFirewall/socketfilterfw --setblockall off 2>/dev/null
    sudo /usr/libexec/ApplicationFirewall/socketfilterfw --setstealthmode off 2>/dev/null
    sudo /usr/libexec/ApplicationFirewall/socketfilterfw --setallowsigned on 2>/dev/null
    sudo /usr/libexec/ApplicationFirewall/socketfilterfw --setallowsignedapp on 2>/dev/null
    
    # Ajouter des outils de développement courants
    local dev_apps=(
        "/Applications/Xcode.app"
        "/Applications/Visual Studio Code.app"
        "/Applications/Docker.app"
        "/usr/bin/ssh"
        "/usr/bin/python3"
    )
    
    for app in "${dev_apps[@]}"; do
        if [[ -e "$app" ]]; then
            sudo /usr/libexec/ApplicationFirewall/socketfilterfw --add "$app" 2>/dev/null
            sudo /usr/libexec/ApplicationFirewall/socketfilterfw --unblock "$app" 2>/dev/null
        fi
    done
    
    echo "Profil développeur configuré"
    log_action "Profil de pare-feu développeur appliqué"
}

# Configurer le profil kiosque
configure_kiosk_profile() {
    echo "=== Configuration du Profil Kiosque ==="
    
    # Sécurité maximale pour les appareils kiosque
    sudo /usr/libexec/ApplicationFirewall/socketfilterfw --setblockall on 2>/dev/null
    sudo /usr/libexec/ApplicationFirewall/socketfilterfw --setstealthmode on 2>/dev/null
    sudo /usr/libexec/ApplicationFirewall/socketfilterfw --setallowsigned off 2>/dev/null
    sudo /usr/libexec/ApplicationFirewall/socketfilterfw --setallowsignedapp off 2>/dev/null
    
    # Autoriser seulement les applications système essentielles
    local kiosk_apps=(
        "/System/Library/CoreServices/Finder.app"
        "/Applications/Safari.app"
    )
    
    for app in "${kiosk_apps[@]}"; do
        if [[ -e "$app" ]]; then
            sudo /usr/libexec/ApplicationFirewall/socketfilterfw --add "$app" 2>/dev/null
            sudo /usr/libexec/ApplicationFirewall/socketfilterfw --unblock "$app" 2>/dev/null
        fi
    done
    
    echo "Profil kiosque configuré"
    log_action "Profil de pare-feu kiosque appliqué"
}

# Activer le mode furtif
enable_stealth_mode() {
    echo "=== Activation du Mode Furtif ==="
    
    if sudo /usr/libexec/ApplicationFirewall/socketfilterfw --setstealthmode on 2>/dev/null; then
        echo "✅ Mode furtif activé"
        log_action "Mode furtif activé"
        audit_log "STEALTH_MODE" "ENABLED" "Appareil caché des scans réseau"
    else
        echo "❌ Échec de l'activation du mode furtif"
        log_action "ÉCHEC : Activation du mode furtif"
    fi
}

# Activer la journalisation du pare-feu
enable_firewall_logging() {
    echo "=== Activation de la Journalisation du Pare-feu ==="
    
    if sudo /usr/libexec/ApplicationFirewall/socketfilterfw --setloggingmode on 2>/dev/null; then
        echo "✅ Journalisation du pare-feu activée"
        log_action "Journalisation du pare-feu activée"
        audit_log "LOGGING" "ENABLED" "Tous les événements du pare-feu seront journalisés"
    else
        echo "❌ Échec de l'activation de la journalisation du pare-feu"
        log_action "ÉCHEC : Activation de la journalisation du pare-feu"
    fi
}

# Configurer les règles d'application
configure_application_rules() {
    echo "=== Configuration des Règles d'Application ==="
    
    # Applications système essentielles
    local essential_apps=(
        "/System/Library/CoreServices/Software Update.app"
        "/usr/sbin/sshd"
        "/usr/bin/ssh"
        "/Applications/App Store.app"
    )
    
    # Ajouter et autoriser les applications essentielles
    for app in "${essential_apps[@]}"; do
        if [[ -e "$app" ]]; then
            sudo /usr/libexec/ApplicationFirewall/socketfilterfw --add "$app" 2>/dev/null
            sudo /usr/libexec/ApplicationFirewall/socketfilterfw --unblock "$app" 2>/dev/null
            echo "✅ Autorisé : $(basename "$app")"
        fi
    done
    
    # Bloquer les applications problématiques connues
    local blocked_apps=(
        "/Applications/BitTorrent.app"
        "/Applications/P2P Client.app"
    )
    
    for app in "${blocked_apps[@]}"; do
        if [[ -e "$app" ]]; then
            sudo /usr/libexec/ApplicationFirewall/socketfilterfw --add "$app" 2>/dev/null
            sudo /usr/libexec/ApplicationFirewall/socketfilterfw --block "$app" 2>/dev/null
            echo "🚫 Bloqué : $(basename "$app")"
        fi
    done
    
    log_action "Règles de pare-feu d'application configurées"
}

# Désactiver le pare-feu (avec vérifications de sécurité)
enterprise_firewall_disable() {
    local force="${1:-false}"
    local reason="$2"
    
    echo "=== Désactivation du Pare-feu Entreprise ==="
    
    if [[ "$force" != "true" ]]; then
        echo "⚠️  AVERTISSEMENT : Désactiver le pare-feu réduira la sécurité"
        echo "Utilisez le paramètre 'force' pour contourner cet avertissement"
        
        if [[ -z "$reason" ]]; then
            echo "❌ Raison requise pour l'opération de désactivation du pare-feu"
            return 1
        fi
    fi
    
    # Journaliser l'action de désactivation
    log_action "AVERTISSEMENT DE SÉCURITÉ : Pare-feu en cours de désactivation - Raison : ${reason:-Contournement manuel}"
    audit_log "FIREWALL_DISABLE" "INITIATED" "Raison : ${reason:-Contournement manuel}"
    
    # Désactiver le pare-feu global
    if sudo defaults write /Library/Preferences/com.apple.alf globalstate -int 0; then
        echo "✅ Pare-feu global désactivé"
        audit_log "FIREWALL_DISABLE" "SUCCESS" "Pare-feu global désactivé"
        
        # Programmer la réactivation si temporaire
        if [[ "$reason" == *"temporaire"* || "$reason" == *"maintenance"* ]]; then
            schedule_firewall_renable
        fi
        
        return 0
    else
        echo "❌ Échec de la désactivation du pare-feu global"
        audit_log "FIREWALL_DISABLE" "FAILED" "Échec de la désactivation du pare-feu global"
        return 1
    fi
}

# Programmer la réactivation du pare-feu
schedule_firewall_renable() {
    local renable_minutes="${1:-60}"  # Défaut 1 heure
    
    echo "🕒 Le pare-feu sera automatiquement réactivé dans $renable_minutes minutes"
    
    # Créer une tâche en arrière-plan pour réactiver le pare-feu
    (
        sleep $((renable_minutes * 60))
        log_action "Réactivation automatique du pare-feu après la fenêtre de maintenance"
        enterprise_firewall_enable "corporate_standard"
    ) &
    
    local job_pid=$!
    echo "$job_pid" > "/tmp/macfleet_firewall_renable.pid"
    log_action "Réactivation du pare-feu programmée pour $renable_minutes minutes (PID : $job_pid)"
}

# Vérifier la conformité du pare-feu
check_firewall_compliance() {
    echo "=== Vérification de Conformité du Pare-feu ==="
    
    local compliance_issues=()
    local compliance_score=100
    
    # Vérifier si le pare-feu est activé
    local firewall_state
    firewall_state=$(/usr/libexec/ApplicationFirewall/socketfilterfw --getglobalstate 2>/dev/null | grep -o "enabled\|disabled")
    
    if [[ "$firewall_state" != "enabled" ]]; then
        compliance_issues+=("Pare-feu non activé")
        compliance_score=$((compliance_score - 30))
    fi
    
    # Vérifier le mode furtif
    if [[ "$STEALTH_MODE_ENABLED" == "true" ]]; then
        local stealth_state
        stealth_state=$(/usr/libexec/ApplicationFirewall/socketfilterfw --getstealthmode 2>/dev/null | grep -o "enabled\|disabled")
        
        if [[ "$stealth_state" != "enabled" ]]; then
            compliance_issues+=("Mode furtif non activé")
            compliance_score=$((compliance_score - 15))
        fi
    fi
    
    # Vérifier la journalisation
    if [[ "$LOG_ALL_CONNECTIONS" == "true" ]]; then
        local logging_state
        logging_state=$(/usr/libexec/ApplicationFirewall/socketfilterfw --getloggingmode 2>/dev/null | grep -o "enabled\|disabled")
        
        if [[ "$logging_state" != "enabled" ]]; then
            compliance_issues+=("Journalisation du pare-feu non activée")
            compliance_score=$((compliance_score - 10))
        fi
    fi
    
    # Vérifier les applications non autorisées
    local unauthorized_apps
    unauthorized_apps=$(/usr/libexec/ApplicationFirewall/socketfilterfw --listapps 2>/dev/null | grep -i "torrent\|p2p\|limewire" | wc -l)
    
    if [[ $unauthorized_apps -gt 0 ]]; then
        compliance_issues+=("Applications non autorisées détectées : $unauthorized_apps")
        compliance_score=$((compliance_score - 20))
    fi
    
    # Rapporter l'état de conformité
    echo "Score de Conformité : $compliance_score/100"
    
    if [[ ${#compliance_issues[@]} -eq 0 ]]; then
        echo "✅ La configuration du pare-feu est conforme"
        audit_log "COMPLIANCE_CHECK" "PASSED" "Score : $compliance_score/100"
        return 0
    else
        echo "❌ Problèmes de conformité trouvés :"
        printf '  - %s\n' "${compliance_issues[@]}"
        audit_log "COMPLIANCE_CHECK" "FAILED" "Problèmes : ${#compliance_issues[@]} Score : $compliance_score/100"
        
        # Auto-remédiation si activée
        if [[ "$AUTO_ENABLE_ON_VIOLATION" == "true" ]]; then
            echo "🔧 Auto-remédiation activée, correction des problèmes..."
            enterprise_firewall_enable "$DEFAULT_SECURITY_PROFILE"
        fi
        
        return 1
    fi
}

# Surveiller les événements du pare-feu
monitor_firewall_events() {
    echo "=== Démarrage de la Surveillance des Événements du Pare-feu ==="
    
    local log_file="/var/log/appfirewall.log"
    
    if [[ ! -f "$log_file" ]]; then
        echo "⚠️  Fichier de journal du pare-feu non trouvé. Activation de la journalisation..."
        enable_firewall_logging
        sleep 2
    fi
    
    echo "Surveillance des événements du pare-feu... Appuyez sur Ctrl+C pour arrêter"
    
    # Surveiller le journal du pare-feu en temps réel
    tail -f "$log_file" 2>/dev/null | while read -r line; do
        if echo "$line" | grep -q "Deny\|Block"; then
            local app_name
            app_name=$(echo "$line" | awk '{print $8}' | cut -d'(' -f1)
            local action
            action=$(echo "$line" | awk '{print $6}')
            
            echo "🚫 $(date '+%H:%M:%S') - BLOQUÉ : $app_name ($action)"
            
            # Journaliser l'événement de sécurité
            log_action "ÉVÉNEMENT DE SÉCURITÉ : $action - Application : $app_name"
            audit_log "FIREWALL_BLOCK" "DETECTED" "App : $app_name Action : $action"
            
            # Vérifier les menaces potentielles
            if echo "$app_name" | grep -i -E "(torrent|p2p|hack|crack|keygen)"; then
                echo "🚨 ALERTE DE SÉCURITÉ : Application potentiellement malveillante bloquée : $app_name"
                log_action "ALERTE DE SÉCURITÉ : Application malveillante bloquée - $app_name"
            fi
        fi
    done
}

# Générer un rapport de sécurité du pare-feu
generate_firewall_report() {
    local report_file="$RULES_DIR/firewall_report_$(date +%Y%m%d_%H%M%S).json"
    
    echo "=== Génération du Rapport de Sécurité du Pare-feu ==="
    
    # Obtenir l'état actuel du pare-feu
    local firewall_enabled="false"
    local stealth_enabled="false"
    local logging_enabled="false"
    local block_all_enabled="false"
    
    if /usr/libexec/ApplicationFirewall/socketfilterfw --getglobalstate 2>/dev/null | grep -q "enabled"; then
        firewall_enabled="true"
    fi
    
    if /usr/libexec/ApplicationFirewall/socketfilterfw --getstealthmode 2>/dev/null | grep -q "enabled"; then
        stealth_enabled="true"
    fi
    
    if /usr/libexec/ApplicationFirewall/socketfilterfw --getloggingmode 2>/dev/null | grep -q "enabled"; then
        logging_enabled="true"
    fi
    
    if /usr/libexec/ApplicationFirewall/socketfilterfw --getblockall 2>/dev/null | grep -q "enabled"; then
        block_all_enabled="true"
    fi
    
    # Compter les applications autorisées/bloquées
    local total_apps=0
    local allowed_apps=0
    local blocked_apps=0
    
    if command -v /usr/libexec/ApplicationFirewall/socketfilterfw >/dev/null; then
        total_apps=$(/usr/libexec/ApplicationFirewall/socketfilterfw --listapps 2>/dev/null | grep -c "ALF" || echo 0)
        allowed_apps=$(/usr/libexec/ApplicationFirewall/socketfilterfw --listapps 2>/dev/null | grep -c "ALLOW" || echo 0)
        blocked_apps=$(/usr/libexec/ApplicationFirewall/socketfilterfw --listapps 2>/dev/null | grep -c "BLOCK" || echo 0)
    fi
    
    # Analyser les événements de sécurité récents
    local security_events=0
    local blocked_connections=0
    
    if [[ -f "/var/log/appfirewall.log" ]]; then
        security_events=$(grep -c "$(date '+%Y-%m-%d')" "/var/log/appfirewall.log" 2>/dev/null || echo 0)
        blocked_connections=$(grep -c "Deny\|Block" "/var/log/appfirewall.log" 2>/dev/null || echo 0)
    fi
    
    # Créer le rapport JSON
    cat > "$report_file" << EOF
{
  "type_rapport": "securite_pare_feu",
  "horodatage": "$(date -u +%Y-%m-%dT%H:%M:%SZ)",
  "infos_appareil": {
    "nom_hote": "$(hostname)",
    "version_os": "$(sw_vers -productVersion)",
    "numero_serie": "$(system_profiler SPHardwareDataType | grep "Serial Number" | awk -F: '{print $2}' | xargs)"
  },
  "statut_pare_feu": {
    "pare_feu_global_active": $firewall_enabled,
    "mode_furtif_active": $stealth_enabled,
    "journalisation_activee": $logging_enabled,
    "bloquer_toutes_entrees": $block_all_enabled
  },
  "regles_application": {
    "applications_totales": $total_apps,
    "applications_autorisees": $allowed_apps,
    "applications_bloquees": $blocked_apps
  },
  "evenements_securite": {
    "evenements_totaux_aujourdhui": $security_events,
    "connexions_bloquees": $blocked_connections,
    "dernier_evenement": "$(tail -1 /var/log/appfirewall.log 2>/dev/null | awk '{print $1 " " $2 " " $3}' || echo 'N/A')"
  },
  "statut_conformite": {
    "conforme_politique": $(check_firewall_compliance >/dev/null 2>&1 && echo true || echo false),
    "profil_securite": "$DEFAULT_SECURITY_PROFILE",
    "auto_remediation": $AUTO_ENABLE_ON_VIOLATION
  },
  "recommandations": [
    $([ "$firewall_enabled" != "true" ] && echo '"Activer le pare-feu global",' || echo "")
    $([ "$stealth_enabled" != "true" ] && echo '"Activer le mode furtif",' || echo "")
    $([ "$logging_enabled" != "true" ] && echo '"Activer la journalisation du pare-feu",' || echo "")
    "Révision régulière des règles de pare-feu"
  ]
}
EOF
    
    echo "Rapport de sécurité du pare-feu sauvegardé dans : $report_file"
    log_action "Rapport de sécurité du pare-feu généré : $report_file"
}

# Fonction principale avec gestion d'arguments
main() {
    log_action "=== Outil de Gestion de Pare-feu MacFleet Démarré ==="
    
    case "${1:-status}" in
        "enable")
            enterprise_firewall_enable "$2"
            ;;
        "disable")
            enterprise_firewall_disable "$2" "$3"
            ;;
        "status")
            get_firewall_status
            ;;
        "compliance")
            check_firewall_compliance
            ;;
        "monitor")
            monitor_firewall_events
            ;;
        "report")
            generate_firewall_report
            ;;
        "stealth")
            enable_stealth_mode
            ;;
        "logging")
            enable_firewall_logging
            ;;
        "profile")
            enterprise_firewall_enable "$2"
            ;;
        *)
            echo "Outil de Gestion de Pare-feu Entreprise MacFleet"
            echo "Usage : $0 [commande] [options]"
            echo ""
            echo "Commandes :"
            echo "  enable [profil]               - Activer le pare-feu avec profil de sécurité"
            echo "  disable [force] [raison]      - Désactiver le pare-feu (nécessite une raison)"
            echo "  status                        - Afficher l'état actuel du pare-feu"
            echo "  compliance                    - Vérifier la conformité du pare-feu"
            echo "  monitor                       - Surveiller les événements du pare-feu en temps réel"
            echo "  report                        - Générer un rapport de sécurité"
            echo "  stealth                       - Activer le mode furtif"
            echo "  logging                       - Activer la journalisation du pare-feu"
            echo "  profile [nom]                 - Appliquer un profil de sécurité spécifique"
            echo ""
            echo "Profils de Sécurité :"
            echo "  corporate_high                - Sécurité maximale pour environnements sensibles"
            echo "  corporate_standard            - Sécurité d'entreprise standard (défaut)"
            echo "  developer                     - Paramètres adaptés au développement"
            echo "  kiosk                         - Sécurité pour accès kiosque/public"
            ;;
    esac
    
    log_action "=== Opération de gestion du pare-feu terminée ==="
}

# Exécuter la fonction principale
main "$@"

## Gestion Avancée du Pare-feu

### Moteur de Règles de Pare-feu Personnalisées

```bash
#!/bin/bash

# Gestion avancée des règles de pare-feu
manage_custom_rules() {
    local action="$1"
    local rule_name="$2"
    local rule_definition="$3"
    
    echo "=== Gestion des Règles de Pare-feu Personnalisées ==="
    
    local rules_file="$RULES_DIR/custom_rules.conf"
    
    case "$action" in
        "add")
            if [[ -z "$rule_name" || -z "$rule_definition" ]]; then
                echo "❌ Nom de règle et définition requis"
                return 1
            fi
            
            # Ajouter la règle à la configuration
            echo "$rule_name:$rule_definition" >> "$rules_file"
            echo "✅ Règle personnalisée '$rule_name' ajoutée"
            log_action "Règle de pare-feu personnalisée ajoutée : $rule_name"
            
            # Appliquer la règle immédiatement
            apply_custom_rule "$rule_definition"
            ;;
        "remove")
            if [[ -f "$rules_file" && -n "$rule_name" ]]; then
                grep -v "^$rule_name:" "$rules_file" > "$rules_file.tmp"
                mv "$rules_file.tmp" "$rules_file"
                echo "✅ Règle personnalisée '$rule_name' supprimée"
                log_action "Règle de pare-feu personnalisée supprimée : $rule_name"
            else
                echo "❌ Règle '$rule_name' non trouvée"
            fi
            ;;
        "list")
            if [[ -f "$rules_file" ]]; then
                echo "Règles de pare-feu personnalisées :"
                cat "$rules_file" | while IFS=':' read -r name definition; do
                    echo "  $name : $definition"
                done
            else
                echo "Aucune règle personnalisée configurée"
            fi
            ;;
        "apply")
            apply_all_custom_rules
            ;;
        *)
            echo "Usage : manage_custom_rules [add|remove|list|apply] [nom_règle] [définition]"
            ;;
    esac
}

# Appliquer une règle de pare-feu personnalisée
apply_custom_rule() {
    local rule_definition="$1"
    
    # Analyser la définition de règle et appliquer la commande de pare-feu appropriée
    if echo "$rule_definition" | grep -q "block_app:"; then
        local app_path
        app_path=$(echo "$rule_definition" | cut -d':' -f2)
        sudo /usr/libexec/ApplicationFirewall/socketfilterfw --add "$app_path" 2>/dev/null
        sudo /usr/libexec/ApplicationFirewall/socketfilterfw --block "$app_path" 2>/dev/null
        echo "Règle de blocage appliquée pour : $app_path"
    elif echo "$rule_definition" | grep -q "allow_app:"; then
        local app_path
        app_path=$(echo "$rule_definition" | cut -d':' -f2)
        sudo /usr/libexec/ApplicationFirewall/socketfilterfw --add "$app_path" 2>/dev/null
        sudo /usr/libexec/ApplicationFirewall/socketfilterfw --unblock "$app_path" 2>/dev/null
        echo "Règle d'autorisation appliquée pour : $app_path"
    fi
}

# Appliquer toutes les règles personnalisées
apply_all_custom_rules() {
    local rules_file="$RULES_DIR/custom_rules.conf"
    
    if [[ -f "$rules_file" ]]; then
        echo "Application de toutes les règles de pare-feu personnalisées..."
        while IFS=':' read -r name definition; do
            if [[ -n "$name" && -n "$definition" ]]; then
                apply_custom_rule "$definition"
            fi
        done < "$rules_file"
        echo "✅ Toutes les règles personnalisées appliquées"
    else
        echo "Aucune règle personnalisée à appliquer"
    fi
}

# Exemples de règles personnalisées
create_example_rules() {
    manage_custom_rules "add" "block_bittorrent" "block_app:/Applications/BitTorrent.app"
    manage_custom_rules "add" "allow_docker" "allow_app:/Applications/Docker.app"
    manage_custom_rules "add" "allow_ssh" "allow_app:/usr/bin/ssh"
}

create_example_rules

Notes de Configuration Importantes

Architecture du Pare-feu macOS

  • Pare-feu d'Application - Contrôle les connexions entrantes par application
  • Framework de Filtre de Socket - Filtrage de paquets de bas niveau
  • Framework d'Extension Réseau - Filtrage de contenu moderne
  • Protection de l'Intégrité Système - Protège la configuration du pare-feu
  • Contrôles de Confidentialité - Consentement utilisateur pour l'accès réseau

Points d'Intégration Entreprise

  • Profils de Configuration MDM - Déployer les politiques de pare-feu de manière centralisée
  • Intégration SIEM - Transférer les journaux de sécurité vers les systèmes de surveillance
  • Cadres de Conformité - Support pour SOC 2, ISO 27001, NIST
  • Réponse aux Incidents - Détection et réponse automatisées aux menaces

Bonnes Pratiques pour l'Entreprise

  1. Approche de Sécurité en Couches

    • Combiner le pare-feu d'application avec la segmentation réseau
    • Implémenter la détection et réponse de point de terminaison (EDR)
    • Utiliser le contrôle d'accès réseau (NAC)
    • Déployer des systèmes de détection d'intrusion (IDS)
  2. Gestion des Politiques

    • Définir des lignes de base de sécurité claires
    • Examiner et mettre à jour régulièrement les règles de pare-feu
    • Implémenter des processus de gestion des changements
    • Tester régulièrement les politiques de sécurité
  3. Surveillance et Réponse

    • Activer la journalisation complète
    • Surveiller les changements de configuration
    • Implémenter la détection automatisée des menaces
    • Établir des procédures de réponse aux incidents
  4. Conformité et Audit

    • Générer régulièrement des rapports de conformité
    • Maintenir des pistes d'audit
    • Documenter les exceptions de sécurité
    • Conduire des évaluations de sécurité périodiques

Dépannage des Problèmes Courants

  • Erreurs de permissions - S'assurer des privilèges administrateur pour les modifications du pare-feu
  • Connectivité d'application - Examiner les règles de pare-feu pour les applications bloquées
  • Impact sur les performances - Surveiller l'utilisation CPU avec la journalisation extensive activée
  • Conflits de configuration - Vérifier les profils MDM conflictuels
  • Croissance des fichiers de journal - Implémenter la rotation et l'archivage des journaux

N'oubliez pas de tester minutieusement les configurations de pare-feu dans un environnement contrôlé avant le déploiement sur l'ensemble de votre MacFleet pour assurer la continuité des activités tout en maintenant la sécurité.

Gestion de la Personnalisation du Finder sur macOS

Personnalisez et gérez les préférences du Finder sur vos appareils MacFleet à l'aide d'outils en ligne de commande. Ce tutoriel couvre les options d'affichage du bureau, les paramètres de visibilité des fichiers, la personnalisation de l'interface et la gestion de configuration Finder à l'échelle de l'entreprise.

Comprendre la Personnalisation du Finder macOS

Le Finder est le gestionnaire de fichiers par défaut de macOS, et son comportement peut être largement personnalisé à l'aide de la commande defaults. Les domaines clés de personnalisation incluent :

  • Affichage du Bureau - Contrôler ce qui apparaît sur le bureau
  • Visibilité des Fichiers - Afficher/masquer les fichiers et extensions
  • Éléments d'Interface - Barres d'état, affichage des chemins et avertissements
  • Comportement de Tri - Comment les fichiers et dossiers sont organisés

Gestion de l'Affichage du Bureau

Afficher les Disques Durs sur le Bureau

#!/bin/bash

# Activer l'affichage des disques durs sur le bureau
echo "🖥️ Activation de l'affichage des disques durs sur le bureau..."

defaults write com.apple.finder ShowHardDrivesOnDesktop -bool true
killall Finder

if [ $? -eq 0 ]; then
    echo "✅ Les disques durs apparaîtront maintenant sur le bureau"
else
    echo "❌ Échec de la mise à jour du paramètre d'affichage des disques durs"
    exit 1
fi

Afficher les Disques Externes sur le Bureau

#!/bin/bash

# Activer l'affichage des disques externes sur le bureau
echo "💾 Activation de l'affichage des disques externes sur le bureau..."

defaults write com.apple.finder ShowExternalHardDrivesOnDesktop -bool true
killall Finder

if [ $? -eq 0 ]; then
    echo "✅ Les disques externes apparaîtront maintenant sur le bureau"
else
    echo "❌ Échec de la mise à jour du paramètre d'affichage des disques externes"
    exit 1
fi

Afficher les Supports Amovibles sur le Bureau

#!/bin/bash

# Activer l'affichage des supports amovibles sur le bureau
echo "💿 Activation de l'affichage des supports amovibles sur le bureau..."

defaults write com.apple.finder ShowRemovableMediaOnDesktop -bool true
killall Finder

if [ $? -eq 0 ]; then
    echo "✅ Les supports amovibles (CD, DVD, iPod) apparaîtront maintenant sur le bureau"
else
    echo "❌ Échec de la mise à jour du paramètre d'affichage des supports amovibles"
    exit 1
fi

Configuration de la Visibilité des Fichiers

Afficher Toutes les Extensions de Fichiers

#!/bin/bash

# Activer l'affichage de toutes les extensions de fichiers
echo "📄 Activation de l'affichage de toutes les extensions de fichiers..."

defaults write NSGlobalDomain AppleShowAllExtensions -bool true
killall Finder

if [ $? -eq 0 ]; then
    echo "✅ Toutes les extensions de fichiers seront maintenant visibles"
    echo "ℹ️  Les fichiers comme 'document.txt' et 'app.app' afficheront leurs extensions"
else
    echo "❌ Échec de la mise à jour du paramètre d'affichage des extensions"
    exit 1
fi

Afficher les Fichiers Cachés

#!/bin/bash

# Activer l'affichage des fichiers cachés
echo "👁️ Activation de l'affichage des fichiers cachés..."

defaults write com.apple.finder AppleShowAllFiles -bool true
killall Finder

if [ $? -eq 0 ]; then
    echo "✅ Les fichiers cachés seront maintenant visibles dans le Finder"
    echo "⚠️  Attention : Les fichiers cachés contiennent des données système - modifiez avec précaution"
else
    echo "❌ Échec de la mise à jour du paramètre d'affichage des fichiers cachés"
    exit 1
fi

Paramètres d'Amélioration de l'Interface

Activer la Barre d'État

#!/bin/bash

# Activer la barre d'état du Finder
echo "📊 Activation de la barre d'état du Finder..."

defaults write com.apple.finder ShowStatusBar -bool true
killall Finder

if [ $? -eq 0 ]; then
    echo "✅ Barre d'état activée - affiche le nombre d'éléments et l'espace disponible"
else
    echo "❌ Échec de l'activation de la barre d'état"
    exit 1
fi

Afficher le Chemin Complet dans la Barre de Titre

#!/bin/bash

# Activer l'affichage du chemin complet dans la barre de titre
echo "🛤️ Activation de l'affichage du chemin complet dans la barre de titre..."

defaults write com.apple.finder _FXShowPosixPathInTitle -bool true
killall Finder

if [ $? -eq 0 ]; then
    echo "✅ Les chemins complets des fichiers apparaîtront maintenant dans la barre de titre du Finder"
else
    echo "❌ Échec de l'activation de l'affichage du chemin dans la barre de titre"
    exit 1
fi

Maintenir les Dossiers en Haut lors du Tri

#!/bin/bash

# Activer le tri dossiers-en-premier
echo "📁 Activation du tri dossiers-en-premier..."

defaults write com.apple.finder _FXSortFoldersFirst -bool true
killall Finder

if [ $? -eq 0 ]; then
    echo "✅ Les dossiers apparaîtront maintenant avant les fichiers lors du tri par nom"
else
    echo "❌ Échec de la mise à jour de la préférence de tri des dossiers"
    exit 1
fi

Paramètres de Sécurité et d'Avertissement

Activer l'Avertissement de Changement d'Extension

#!/bin/bash

# Activer l'avertissement avant modification d'extension de fichier
echo "⚠️ Activation de l'avertissement de changement d'extension de fichier..."

defaults write com.apple.finder FXEnableExtensionChangeWarning -bool true
killall Finder

if [ $? -eq 0 ]; then
    echo "✅ Une boîte de dialogue d'avertissement apparaîtra avant de changer les extensions de fichiers"
else
    echo "❌ Échec de l'activation de l'avertissement de changement d'extension"
    exit 1
fi

Activer l'Avertissement de Suppression iCloud Drive

#!/bin/bash

# Activer l'avertissement avant suppression d'éléments d'iCloud Drive
echo "☁️ Activation de l'avertissement de suppression iCloud Drive..."

defaults write com.apple.finder FXEnableRemoveFromICloudDriveWarning -bool true
killall Finder

if [ $? -eq 0 ]; then
    echo "✅ Une boîte de dialogue d'avertissement apparaîtra avant de supprimer des éléments d'iCloud Drive"
else
    echo "❌ Échec de l'activation de l'avertissement de suppression iCloud Drive"
    exit 1
fi

Développer les Volets de la Fenêtre d'Informations

#!/bin/bash

# Configurer les volets de la fenêtre d'informations pour être développés par défaut
echo "🔍 Configuration des volets de la fenêtre d'informations..."

defaults write com.apple.finder FXInfoPanesExpanded -dict \
    General -bool true \
    OpenWith -bool true \
    Privileges -bool true

killall Finder

if [ $? -eq 0 ]; then
    echo "✅ Les volets Général, Ouvrir avec et Privilèges seront développés par défaut"
else
    echo "❌ Échec de la configuration des volets de la fenêtre d'informations"
    exit 1
fi

Script de Configuration Finder d'Entreprise

#!/bin/bash

# Outil de Personnalisation Finder MacFleet
# Standardiser les préférences Finder sur les appareils de flotte

# Configuration
LOG_FILE="/var/log/macfleet_finder.log"
BACKUP_DIR="/var/backups/macfleet/finder"
CONFIG_FILE="/etc/macfleet/finder_config.plist"

# Fonction de journalisation
log_action() {
    echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" | tee -a "$LOG_FILE"
}

# Créer le répertoire de sauvegarde
setup_directories() {
    if [[ ! -d "$BACKUP_DIR" ]]; then
        mkdir -p "$BACKUP_DIR"
        log_action "Répertoire de sauvegarde créé : $BACKUP_DIR"
    fi
    
    if [[ ! -d "$(dirname "$CONFIG_FILE")" ]]; then
        mkdir -p "$(dirname "$CONFIG_FILE")"
        log_action "Répertoire de configuration créé"
    fi
}

# Sauvegarder les préférences Finder actuelles
backup_current_settings() {
    local backup_file="$BACKUP_DIR/finder_backup_$(date +%Y%m%d_%H%M%S).plist"
    
    echo "📦 Création d'une sauvegarde des paramètres Finder actuels..."
    
    # Exporter les préférences Finder actuelles
    defaults export com.apple.finder "$backup_file" 2>/dev/null
    
    if [ $? -eq 0 ]; then
        echo "✅ Sauvegarde créée : $backup_file"
        log_action "Sauvegarde créée : $backup_file"
    else
        echo "⚠️  Attention : Impossible de créer la sauvegarde"
        log_action "Attention : Échec de la création de sauvegarde"
    fi
}

# Appliquer la configuration Finder d'entreprise
apply_finder_configuration() {
    echo "🔧 Application de la configuration Finder MacFleet..."
    log_action "Début du déploiement de configuration Finder"
    
    # Paramètres d'affichage du bureau
    echo "Configuration des options d'affichage du bureau..."
    defaults write com.apple.finder ShowHardDrivesOnDesktop -bool true
    defaults write com.apple.finder ShowExternalHardDrivesOnDesktop -bool true
    defaults write com.apple.finder ShowRemovableMediaOnDesktop -bool true
    
    # Paramètres de visibilité des fichiers
    echo "Configuration des options de visibilité des fichiers..."
    defaults write NSGlobalDomain AppleShowAllExtensions -bool true
    defaults write com.apple.finder _FXSortFoldersFirst -bool true
    
    # Améliorations de l'interface
    echo "Configuration des éléments d'interface..."
    defaults write com.apple.finder ShowStatusBar -bool true
    defaults write com.apple.finder _FXShowPosixPathInTitle -bool true
    
    # Avertissements de sécurité
    echo "Configuration des avertissements de sécurité..."
    defaults write com.apple.finder FXEnableExtensionChangeWarning -bool true
    defaults write com.apple.finder FXEnableRemoveFromICloudDriveWarning -bool true
    
    # Configuration de la fenêtre d'informations
    echo "Configuration des volets de la fenêtre d'informations..."
    defaults write com.apple.finder FXInfoPanesExpanded -dict \
        General -bool true \
        OpenWith -bool true \
        Privileges -bool true
    
    # Redémarrer le Finder pour appliquer les changements
    echo "Redémarrage du Finder pour appliquer les changements..."
    killall Finder
    
    if [ $? -eq 0 ]; then
        echo "✅ Configuration Finder appliquée avec succès"
        log_action "Déploiement de configuration Finder terminé avec succès"
    else
        echo "❌ Échec du redémarrage du Finder"
        log_action "Erreur : Échec du redémarrage du Finder"
        return 1
    fi
}

# Vérifier le déploiement de configuration
verify_configuration() {
    echo "🔍 Vérification de la configuration Finder..."
    
    local verification_passed=true
    
    # Vérifier les paramètres d'affichage du bureau
    if [[ "$(defaults read com.apple.finder ShowHardDrivesOnDesktop 2>/dev/null)" == "1" ]]; then
        echo "✅ Disques durs sur le bureau : Activé"
    else
        echo "❌ Disques durs sur le bureau : Échec"
        verification_passed=false
    fi
    
    if [[ "$(defaults read com.apple.finder ShowExternalHardDrivesOnDesktop 2>/dev/null)" == "1" ]]; then
        echo "✅ Disques externes sur le bureau : Activé"
    else
        echo "❌ Disques externes sur le bureau : Échec"
        verification_passed=false
    fi
    
    # Vérifier la visibilité des fichiers
    if [[ "$(defaults read NSGlobalDomain AppleShowAllExtensions 2>/dev/null)" == "1" ]]; then
        echo "✅ Afficher toutes les extensions : Activé"
    else
        echo "❌ Afficher toutes les extensions : Échec"
        verification_passed=false
    fi
    
    # Vérifier les éléments d'interface
    if [[ "$(defaults read com.apple.finder ShowStatusBar 2>/dev/null)" == "1" ]]; then
        echo "✅ Barre d'état : Activée"
    else
        echo "❌ Barre d'état : Échec"
        verification_passed=false
    fi
    
    if $verification_passed; then
        echo "✅ Toutes les configurations Finder vérifiées avec succès"
        log_action "Vérification de configuration réussie"
        return 0
    else
        echo "❌ Certaines configurations ont échoué à la vérification"
        log_action "Échec de la vérification de configuration"
        return 1
    fi
}

# Générer un rapport de configuration
generate_report() {
    local report_file="/tmp/finder_config_report_$(date +%Y%m%d_%H%M%S).txt"
    
    {
        echo "Rapport de Configuration Finder MacFleet"
        echo "Généré : $(date)"
        echo "Nom d'hôte : $(hostname)"
        echo "Utilisateur : $(whoami)"
        echo "======================================"
        echo ""
        
        echo "Paramètres d'Affichage du Bureau :"
        echo "Disques durs sur le bureau : $(defaults read com.apple.finder ShowHardDrivesOnDesktop 2>/dev/null || echo 'Non défini')"
        echo "Disques externes sur le bureau : $(defaults read com.apple.finder ShowExternalHardDrivesOnDesktop 2>/dev/null || echo 'Non défini')"
        echo "Supports amovibles sur le bureau : $(defaults read com.apple.finder ShowRemovableMediaOnDesktop 2>/dev/null || echo 'Non défini')"
        echo ""
        
        echo "Paramètres de Visibilité des Fichiers :"
        echo "Afficher toutes les extensions : $(defaults read NSGlobalDomain AppleShowAllExtensions 2>/dev/null || echo 'Non défini')"
        echo "Afficher les fichiers cachés : $(defaults read com.apple.finder AppleShowAllFiles 2>/dev/null || echo 'Non défini')"
        echo "Dossiers en premier : $(defaults read com.apple.finder _FXSortFoldersFirst 2>/dev/null || echo 'Non défini')"
        echo ""
        
        echo "Paramètres d'Interface :"
        echo "Barre d'état : $(defaults read com.apple.finder ShowStatusBar 2>/dev/null || echo 'Non définie')"
        echo "Chemin dans le titre : $(defaults read com.apple.finder _FXShowPosixPathInTitle 2>/dev/null || echo 'Non défini')"
        echo ""
        
        echo "Paramètres de Sécurité :"
        echo "Avertissement changement extension : $(defaults read com.apple.finder FXEnableExtensionChangeWarning 2>/dev/null || echo 'Non défini')"
        echo "Avertissement suppression iCloud : $(defaults read com.apple.finder FXEnableRemoveFromICloudDriveWarning 2>/dev/null || echo 'Non défini')"
        
    } > "$report_file"
    
    echo "📊 Rapport de configuration sauvegardé dans : $report_file"
    log_action "Rapport de configuration généré : $report_file"
}

# Restaurer à partir d'une sauvegarde
restore_from_backup() {
    local backup_file="$1"
    
    if [[ ! -f "$backup_file" ]]; then
        echo "❌ Fichier de sauvegarde introuvable : $backup_file"
        return 1
    fi
    
    echo "🔄 Restauration des paramètres Finder à partir de la sauvegarde..."
    
    # Importer la sauvegarde
    defaults import com.apple.finder "$backup_file"
    
    if [ $? -eq 0 ]; then
        echo "✅ Paramètres restaurés à partir de la sauvegarde"
        killall Finder
        log_action "Paramètres restaurés à partir de la sauvegarde : $backup_file"
    else
        echo "❌ Échec de la restauration à partir de la sauvegarde"
        log_action "Erreur : Échec de la restauration à partir de la sauvegarde : $backup_file"
        return 1
    fi
}

# Réinitialiser aux valeurs par défaut
reset_to_defaults() {
    echo "🔄 Réinitialisation du Finder aux paramètres par défaut..."
    
    # Supprimer les paramètres personnalisés
    defaults delete com.apple.finder ShowHardDrivesOnDesktop 2>/dev/null
    defaults delete com.apple.finder ShowExternalHardDrivesOnDesktop 2>/dev/null
    defaults delete com.apple.finder ShowRemovableMediaOnDesktop 2>/dev/null
    defaults delete NSGlobalDomain AppleShowAllExtensions 2>/dev/null
    defaults delete com.apple.finder AppleShowAllFiles 2>/dev/null
    defaults delete com.apple.finder ShowStatusBar 2>/dev/null
    defaults delete com.apple.finder _FXShowPosixPathInTitle 2>/dev/null
    defaults delete com.apple.finder _FXSortFoldersFirst 2>/dev/null
    defaults delete com.apple.finder FXEnableExtensionChangeWarning 2>/dev/null
    defaults delete com.apple.finder FXEnableRemoveFromICloudDriveWarning 2>/dev/null
    defaults delete com.apple.finder FXInfoPanesExpanded 2>/dev/null
    
    killall Finder
    
    echo "✅ Finder réinitialisé aux paramètres par défaut"
    log_action "Finder réinitialisé aux paramètres par défaut"
}

# Fonction d'exécution principale
main() {
    local action="${1:-deploy}"
    
    log_action "=== Personnalisation Finder MacFleet Démarrée ==="
    
    setup_directories
    
    case "$action" in
        "deploy")
            backup_current_settings
            apply_finder_configuration
            verify_configuration
            generate_report
            ;;
        "verify")
            verify_configuration
            ;;
        "report")
            generate_report
            ;;
        "restore")
            if [[ -n "$2" ]]; then
                restore_from_backup "$2"
            else
                echo "❌ Veuillez spécifier le chemin du fichier de sauvegarde"
                echo "Utilisation : $0 restore /chemin/vers/sauvegarde.plist"
                exit 1
            fi
            ;;
        "reset")
            backup_current_settings
            reset_to_defaults
            ;;
        *)
            echo "Utilisation : $0 [deploy|verify|report|restore|reset]"
            echo ""
            echo "Commandes :"
            echo "  deploy  - Appliquer la configuration Finder MacFleet (par défaut)"
            echo "  verify  - Vérifier la configuration actuelle"
            echo "  report  - Générer un rapport de configuration"
            echo "  restore - Restaurer à partir d'un fichier de sauvegarde"
            echo "  reset   - Réinitialiser aux paramètres par défaut"
            exit 1
            ;;
    esac
    
    log_action "=== Personnalisation Finder MacFleet Terminée ==="
}

# Exécuter la fonction principale
main "$@"

Référence de Configuration

ParamètreCommandeDescription
Disques durs sur le bureauShowHardDrivesOnDesktopAfficher les disques internes sur le bureau
Disques externes sur le bureauShowExternalHardDrivesOnDesktopAfficher les disques externes sur le bureau
Supports amovibles sur le bureauShowRemovableMediaOnDesktopAfficher CD, DVD, iPod sur le bureau
Afficher toutes les extensionsAppleShowAllExtensionsAfficher les extensions pour tous les fichiers
Afficher les fichiers cachésAppleShowAllFilesAfficher les fichiers système normalement cachés
Barre d'étatShowStatusBarAfficher le nombre d'éléments et l'espace disque
Chemin dans le titre_FXShowPosixPathInTitleAfficher le chemin complet dans le titre
Dossiers en premier_FXSortFoldersFirstTrier les dossiers avant les fichiers
Avertissement extensionFXEnableExtensionChangeWarningAvertir avant changement d'extensions
Avertissement iCloudFXEnableRemoveFromICloudDriveWarningAvertir avant suppression iCloud

Commandes de Référence Rapide

Activer Tous les Éléments du Bureau

# Afficher tous les éléments du bureau
defaults write com.apple.finder ShowHardDrivesOnDesktop -bool true
defaults write com.apple.finder ShowExternalHardDrivesOnDesktop -bool true
defaults write com.apple.finder ShowRemovableMediaOnDesktop -bool true
killall Finder

Activer la Visibilité Complète

# Visibilité maximale des fichiers
defaults write NSGlobalDomain AppleShowAllExtensions -bool true
defaults write com.apple.finder AppleShowAllFiles -bool true
defaults write com.apple.finder ShowStatusBar -bool true
killall Finder

Activer Tous les Avertissements de Sécurité

# Activer tous les avertissements de sécurité
defaults write com.apple.finder FXEnableExtensionChangeWarning -bool true
defaults write com.apple.finder FXEnableRemoveFromICloudDriveWarning -bool true
killall Finder

Dépannage

Le Finder ne Redémarre Pas

# Forcer le redémarrage du Finder
sudo pkill -f Finder
sleep 2
open /System/Library/CoreServices/Finder.app

Les Paramètres ne s'Appliquent Pas

# Vider le cache du Finder et redémarrer
sudo rm -rf ~/Library/Caches/com.apple.finder
killall Finder

Vérifier que les Paramètres sont Appliqués

# Vérifier un paramètre spécifique
defaults read com.apple.finder ShowStatusBar

# Lister tous les paramètres du Finder
defaults read com.apple.finder

Considérations de Sécurité

  • Les fichiers cachés contiennent des données système - modifiez avec précaution
  • Les extensions de fichiers aident à identifier les types de fichiers - considérez les implications de sécurité
  • Les éléments du bureau peuvent encombrer l'interface dans les environnements partagés
  • Testez les changements sur des appareils individuels avant le déploiement de flotte
  • Créez des sauvegardes avant d'appliquer les changements de configuration

Notes Importantes

  • Les changements nécessitent un redémarrage du Finder pour prendre effet
  • Certains paramètres s'appliquent à l'échelle du système (NSGlobalDomain)
  • Les paramètres spécifiques à l'utilisateur n'affectent pas les autres comptes
  • Des privilèges administrateur peuvent être requis pour le déploiement à l'échelle du système
  • Sauvegardez les paramètres actuels avant d'apporter des modifications pour une restauration facile

Gestion de Sécurité et Conformité Find My Mac

Assurez la conformité de sécurité d'entreprise en surveillant et gérant le statut Find My Mac sur vos appareils MacFleet. Ce tutoriel couvre l'audit de sécurité, la vérification Apple ID, les rapports de conformité automatisés, et l'application des politiques de sécurité d'entreprise.

Comprendre la Sécurité Find My Mac

Find My Mac est le service intégré de localisation et de sécurité d'Apple qui fournit :

  • Suivi de Localisation d'Appareil - Services de localisation en temps réel pour les appareils perdus ou volés
  • Verrouillage et Effacement à Distance - Sécuriser les données de l'appareil à distance
  • Verrou d'Activation - Empêche la réactivation non autorisée de l'appareil
  • Intégration de Sécurité - Fonctionne avec les services Apple ID et iCloud

Vérification Basique du Statut Find My Mac

Vérification Simple du Statut

#!/bin/bash

# Vérification basique du statut Find My Mac
fmmToken=$(/usr/sbin/nvram -x -p | /usr/bin/grep fmm-mobileme-token-FMM)

if [ -z "$fmmToken" ]; then
    echo "Find My Mac est désactivé"
else
    echo "Find My Mac est activé"
fi

Vérification Améliorée du Statut avec Détails

#!/bin/bash

# Vérification améliorée de Find My Mac
check_find_my_mac_basic() {
    echo "=== Vérification du Statut Find My Mac ==="
    
    # Vérifier le token Find My Mac
    local fmm_token
    fmm_token=$(/usr/sbin/nvram -x -p | /usr/bin/grep fmm-mobileme-token-FMM 2>/dev/null)
    
    if [ -z "$fmm_token" ]; then
        echo "❌ Find My Mac : DÉSACTIVÉ"
        return 1
    else
        echo "✅ Find My Mac : ACTIVÉ"
        
        # Extraire des détails supplémentaires si disponibles
        echo "Token trouvé dans NVRAM"
        return 0
    fi
}

# Exécuter la vérification
check_find_my_mac_basic

Script de Gestion de Sécurité d'Entreprise

#!/bin/bash

# Gestion de Sécurité Find My Mac MacFleet
# Audit de sécurité complet et surveillance de conformité

# Configuration
LOG_FILE="/var/log/macfleet_security.log"
REPORT_DIR="/var/reports/security"
COMPLIANCE_DIR="/var/compliance"
TEMP_DIR="/tmp/macfleet_security"

# Configuration des politiques de sécurité
REQUIRE_FIND_MY_MAC=true
REQUIRE_APPLE_ID=true
REQUIRE_ACTIVATION_LOCK=true
MAX_OFFLINE_DAYS=30

# Fonction de journalisation
log_action() {
    echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" | tee -a "$LOG_FILE"
}

# Créer les répertoires nécessaires
setup_directories() {
    for dir in "$REPORT_DIR" "$COMPLIANCE_DIR" "$TEMP_DIR"; do
        if [[ ! -d "$dir" ]]; then
            mkdir -p "$dir"
            log_action "Répertoire créé : $dir"
        fi
    done
}

# Vérifier le statut Find My Mac avec analyse détaillée
check_find_my_mac_status() {
    log_action "Vérification du statut Find My Mac"
    
    local status_report="$TEMP_DIR/fmm_status.json"
    
    # Initialiser l'objet de statut
    cat > "$status_report" << EOF
{
    "timestamp": "$(date -Iseconds)",
    "hostname": "$(hostname)",
    "find_my_mac": {
        "enabled": false,
        "token_present": false,
        "activation_lock": false,
        "apple_id_signed_in": false
    },
    "compliance": {
        "status": "non_compliant",
        "issues": []
    }
}
EOF

    # Vérifier le token Find My Mac dans NVRAM
    local fmm_token
    fmm_token=$(/usr/sbin/nvram -x -p | /usr/bin/grep fmm-mobileme-token-FMM 2>/dev/null)
    
    if [[ -n "$fmm_token" ]]; then
        log_action "✅ Token Find My Mac trouvé dans NVRAM"
        
        # Mettre à jour le statut JSON
        /usr/bin/python3 -c "
import json
with open('$status_report', 'r') as f:
    data = json.load(f)
data['find_my_mac']['enabled'] = True
data['find_my_mac']['token_present'] = True
with open('$status_report', 'w') as f:
    json.dump(data, f, indent=2)
"
        echo "enabled"
    else
        log_action "❌ Find My Mac non activé - aucun token trouvé"
        
        # Ajouter un problème de conformité
        /usr/bin/python3 -c "
import json
with open('$status_report', 'r') as f:
    data = json.load(f)
data['compliance']['issues'].append('Find My Mac non activé')
with open('$status_report', 'w') as f:
    json.dump(data, f, indent=2)
"
        echo "disabled"
    fi
}

# Vérifier le statut de connexion Apple ID
check_apple_id_status() {
    log_action "Vérification du statut de connexion Apple ID"
    
    # Vérifier si l'utilisateur est connecté à iCloud
    local icloud_account
    icloud_account=$(defaults read MobileMeAccounts Accounts 2>/dev/null | grep -c AccountID || echo "0")
    
    if [[ "$icloud_account" -gt 0 ]]; then
        log_action "✅ Apple ID connecté à iCloud"
        
        # Obtenir les détails Apple ID (masqués pour la confidentialité)
        local apple_id_info
        apple_id_info=$(defaults read MobileMeAccounts Accounts 2>/dev/null | grep AccountID | head -1 | sed 's/.*= "\(.*\)";/\1/' | sed 's/\(.*@\)\(.*\)/\1***/g')
        log_action "Apple ID : $apple_id_info"
        
        return 0
    else
        log_action "❌ Aucun Apple ID connecté"
        return 1
    fi
}

# Vérifier l'intégrité du système et les paramètres de sécurité
check_system_security() {
    log_action "Exécution de l'audit de sécurité système"
    
    local security_report="$TEMP_DIR/security_audit.json"
    
    cat > "$security_report" << EOF
{
    "timestamp": "$(date -Iseconds)",
    "hostname": "$(hostname)",
    "security_audit": {
        "sip_status": "unknown",
        "gatekeeper_status": "unknown",
        "filevault_status": "unknown",
        "firewall_status": "unknown",
        "secure_boot": "unknown"
    }
}
EOF

    # Vérifier System Integrity Protection (SIP)
    local sip_status
    sip_status=$(csrutil status 2>/dev/null | grep -i enabled && echo "enabled" || echo "disabled")
    log_action "Statut SIP : $sip_status"
    
    # Vérifier Gatekeeper
    local gatekeeper_status
    gatekeeper_status=$(spctl --status 2>/dev/null | grep -i enabled && echo "enabled" || echo "disabled")
    log_action "Statut Gatekeeper : $gatekeeper_status"
    
    # Vérifier FileVault
    local filevault_status
    filevault_status=$(fdesetup status 2>/dev/null | grep -i "on" && echo "enabled" || echo "disabled")
    log_action "Statut FileVault : $filevault_status"
    
    # Vérifier le Pare-feu
    local firewall_status
    firewall_status=$(/usr/libexec/ApplicationFirewall/socketfilterfw --getglobalstate 2>/dev/null | grep -i enabled && echo "enabled" || echo "disabled")
    log_action "Statut Pare-feu : $firewall_status"
    
    # Mettre à jour le rapport de sécurité
    /usr/bin/python3 -c "
import json
with open('$security_report', 'r') as f:
    data = json.load(f)
data['security_audit']['sip_status'] = '$sip_status'
data['security_audit']['gatekeeper_status'] = '$gatekeeper_status'
data['security_audit']['filevault_status'] = '$filevault_status'
data['security_audit']['firewall_status'] = '$firewall_status'
with open('$security_report', 'w') as f:
    json.dump(data, f, indent=2)
"

    echo "$security_report"
}

# Vérifier le statut du verrou d'activation
check_activation_lock() {
    log_action "Vérification du statut du verrou d'activation"
    
    # Vérifier si l'appareil a le verrou d'activation activé
    # Cela nécessite de vérifier avec les serveurs Apple ou l'inscription MDM
    local activation_lock_status="unknown"
    
    # Pour les appareils d'entreprise, vérifier l'inscription MDM
    if profiles -P 2>/dev/null | grep -q "com.apple.mdm"; then
        log_action "✅ Appareil inscrit en MDM"
        activation_lock_status="mdm_managed"
    else
        log_action "⚠️  Appareil non inscrit en MDM"
        activation_lock_status="not_managed"
    fi
    
    # Vérifier l'inscription DEP/ABM
    if profiles -e 2>/dev/null | grep -q "DEP"; then
        log_action "✅ Appareil inscrit DEP/ABM"
        activation_lock_status="dep_enrolled"
    fi
    
    echo "$activation_lock_status"
}

# Générer un rapport de sécurité complet
generate_security_report() {
    local report_timestamp
    report_timestamp=$(date '+%Y%m%d_%H%M%S')
    local report_file="$REPORT_DIR/security_report_$report_timestamp.json"
    
    log_action "Génération du rapport de sécurité complet : $report_file"
    
    # Obtenir les informations système
    local os_version
    local serial_number
    local hardware_uuid
    os_version=$(sw_vers -productVersion)
    serial_number=$(system_profiler SPHardwareDataType | grep "Serial Number" | awk '{print $4}')
    hardware_uuid=$(system_profiler SPHardwareDataType | grep "Hardware UUID" | awk '{print $3}')
    
    # Compiler le rapport complet
    cat > "$report_file" << EOF
{
    "report_metadata": {
        "timestamp": "$(date -Iseconds)",
        "report_version": "1.0",
        "generator": "MacFleet Security Audit"
    },
    "device_info": {
        "hostname": "$(hostname)",
        "serial_number": "$serial_number",
        "hardware_uuid": "$hardware_uuid",
        "os_version": "$os_version",
        "model": "$(system_profiler SPHardwareDataType | grep "Model Name" | awk -F': ' '{print $2}')"
    },
    "security_status": {
        "find_my_mac": {
            "enabled": $(check_find_my_mac_status >/dev/null && echo "true" || echo "false"),
            "compliance": $([ "$REQUIRE_FIND_MY_MAC" = true ] && check_find_my_mac_status >/dev/null && echo "true" || echo "false")
        },
        "apple_id": {
            "signed_in": $(check_apple_id_status >/dev/null && echo "true" || echo "false"),
            "compliance": $([ "$REQUIRE_APPLE_ID" = true ] && check_apple_id_status >/dev/null && echo "true" || echo "false")
        },
        "activation_lock": {
            "status": "$(check_activation_lock)",
            "compliance": $([ "$REQUIRE_ACTIVATION_LOCK" = true ] && echo "true" || echo "false")
        }
    },
    "compliance_summary": {
        "overall_status": "$(calculate_compliance_status)",
        "required_actions": $(generate_required_actions),
        "risk_level": "$(calculate_risk_level)"
    }
}
EOF

    log_action "Rapport de sécurité généré : $report_file"
    echo "$report_file"
}

# Calculer le statut de conformité global
calculate_compliance_status() {
    local fmm_status
    local apple_id_status
    local issues=0
    
    fmm_status=$(check_find_my_mac_status)
    if [[ "$REQUIRE_FIND_MY_MAC" = true && "$fmm_status" != "enabled" ]]; then
        ((issues++))
    fi
    
    if ! check_apple_id_status >/dev/null 2>&1; then
        if [[ "$REQUIRE_APPLE_ID" = true ]]; then
            ((issues++))
        fi
    fi
    
    if [[ $issues -eq 0 ]]; then
        echo "compliant"
    elif [[ $issues -le 2 ]]; then
        echo "partially_compliant"
    else
        echo "non_compliant"
    fi
}

# Générer les actions requises pour la conformité
generate_required_actions() {
    local actions=()
    
    if [[ "$REQUIRE_FIND_MY_MAC" = true ]] && [[ "$(check_find_my_mac_status)" != "enabled" ]]; then
        actions+=("\"Activer Find My Mac dans les Préférences Système\"")
    fi
    
    if [[ "$REQUIRE_APPLE_ID" = true ]] && ! check_apple_id_status >/dev/null 2>&1; then
        actions+=("\"Se connecter avec Apple ID dans les Préférences Système\"")
    fi
    
    if [[ ${#actions[@]} -eq 0 ]]; then
        echo "[]"
    else
        printf "[%s]" "$(IFS=,; echo "${actions[*]}")"
    fi
}

# Calculer le niveau de risque basé sur le statut de sécurité
calculate_risk_level() {
    local risk_score=0
    
    # Find My Mac désactivé ajoute du risque
    if [[ "$(check_find_my_mac_status)" != "enabled" ]]; then
        ((risk_score += 3))
    fi
    
    # Absence d'Apple ID ajoute du risque
    if ! check_apple_id_status >/dev/null 2>&1; then
        ((risk_score += 2))
    fi
    
    # Problèmes de sécurité système ajoutent du risque
    if [[ "$(csrutil status 2>/dev/null | grep -i disabled)" ]]; then
        ((risk_score += 2))
    fi
    
    if [[ $risk_score -le 1 ]]; then
        echo "low"
    elif [[ $risk_score -le 4 ]]; then
        echo "medium"
    else
        echo "high"
    fi
}

# Actions de remédiation pour les problèmes courants
remediate_security_issues() {
    log_action "Démarrage du processus de remédiation automatisé"
    
    local remediation_report="$TEMP_DIR/remediation_$(date '+%Y%m%d_%H%M%S').json"
    
    cat > "$remediation_report" << EOF
{
    "timestamp": "$(date -Iseconds)",
    "hostname": "$(hostname)",
    "remediation_actions": []
}
EOF

    # Vérifier si Find My Mac peut être activé par programmation
    if [[ "$(check_find_my_mac_status)" != "enabled" ]]; then
        log_action "⚠️  Find My Mac est désactivé - intervention manuelle requise"
        log_action "   L'utilisateur doit activer Find My Mac dans Préférences Système > Apple ID > Localiser"
        
        # Ajouter au rapport de remédiation
        /usr/bin/python3 -c "
import json
with open('$remediation_report', 'r') as f:
    data = json.load(f)
data['remediation_actions'].append({
    'issue': 'Find My Mac désactivé',
    'action': 'intervention_manuelle_requise',
    'instructions': 'Activer Find My Mac dans Préférences Système > Apple ID > Localiser'
})
with open('$remediation_report', 'w') as f:
    json.dump(data, f, indent=2)
"
    fi
    
    # Générer une notification utilisateur si nécessaire
    if [[ "$(calculate_compliance_status)" != "compliant" ]]; then
        create_user_notification
    fi
    
    echo "$remediation_report"
}

# Créer une notification utilisateur pour la conformité de sécurité
create_user_notification() {
    log_action "Création d'une notification utilisateur pour la conformité de sécurité"
    
    local notification_title="Conformité de Sécurité MacFleet"
    local notification_message="Votre appareil nécessite des mises à jour de configuration de sécurité. Veuillez contacter le support IT."
    
    # Utiliser AppleScript pour afficher la notification
    osascript -e "display notification \"$notification_message\" with title \"$notification_title\""
    
    # Créer un fichier de rappel persistant
    cat > "/tmp/macfleet_security_reminder.txt" << EOF
Conformité de Sécurité MacFleet Requise

Votre appareil nécessite l'activation des fonctionnalités de sécurité suivantes :
- Find My Mac
- Connexion Apple ID
- Verrou d'Activation

Veuillez contacter le support IT pour assistance.
Généré : $(date)
EOF
}

# Surveiller le statut Find My Mac dans le temps
monitor_security_status() {
    log_action "Démarrage de la surveillance de sécurité continue"
    
    local monitoring_interval=3600  # 1 heure
    local monitoring_log="$LOG_FILE.monitoring"
    
    while true; do
        {
            echo "=== Vérification du Statut de Sécurité - $(date) ==="
            echo "Find My Mac : $(check_find_my_mac_status)"
            echo "Apple ID : $(check_apple_id_status >/dev/null && echo "connecté" || echo "non_connecté")"
            echo "Conformité : $(calculate_compliance_status)"
            echo "Niveau de Risque : $(calculate_risk_level)"
            echo "----------------------------------------"
        } >> "$monitoring_log"
        
        sleep "$monitoring_interval"
    done
}

# Évaluation de sécurité à l'échelle de la flotte
fleet_security_assessment() {
    log_action "Exécution de l'évaluation de sécurité à l'échelle de la flotte"
    
    local fleet_report="$REPORT_DIR/fleet_security_$(date '+%Y%m%d_%H%M%S').json"
    
    # Cela s'intégrerait typiquement avec MDM ou gestion de configuration
    # Pour démonstration, nous montrerons l'évaluation de l'appareil actuel
    
    cat > "$fleet_report" << EOF
{
    "assessment_timestamp": "$(date -Iseconds)",
    "fleet_summary": {
        "total_devices": 1,
        "compliant_devices": $([ "$(calculate_compliance_status)" = "compliant" ] && echo "1" || echo "0"),
        "non_compliant_devices": $([ "$(calculate_compliance_status)" != "compliant" ] && echo "1" || echo "0")
    },
    "devices": [
        $(generate_security_report | tail -n +2 | head -n -1)
    ],
    "recommendations": [
        "Implémenter l'activation automatisée de Find My Mac via MDM",
        "Imposer la connexion Apple ID via l'inscription d'appareil",
        "Audit de conformité de sécurité régulier",
        "Éducation des utilisateurs sur les fonctionnalités de sécurité"
    ]
}
EOF

    log_action "Évaluation de sécurité de flotte terminée : $fleet_report"
    echo "$fleet_report"
}

# Fonction d'exécution principale
main() {
    local action="${1:-check}"
    
    log_action "=== Démarrage de la Gestion de Sécurité MacFleet ==="
    log_action "Action : $action"
    log_action "Nom d'hôte : $(hostname)"
    log_action "Utilisateur : $(whoami)"
    
    # Configuration
    setup_directories
    
    case "$action" in
        "check")
            echo "=== Vérification de Sécurité Find My Mac ==="
            echo "Statut Find My Mac : $(check_find_my_mac_status)"
            echo "Statut Apple ID : $(check_apple_id_status >/dev/null && echo "connecté" || echo "non_connecté")"
            echo "Verrou d'Activation : $(check_activation_lock)"
            echo "Statut de Conformité : $(calculate_compliance_status)"
            echo "Niveau de Risque : $(calculate_risk_level)"
            ;;
        "audit")
            echo "Exécution de l'audit de sécurité complet..."
            security_report=$(generate_security_report)
            echo "Audit de sécurité terminé : $security_report"
            ;;
        "remediate")
            echo "Démarrage du processus de remédiation..."
            remediation_report=$(remediate_security_issues)
            echo "Remédiation terminée : $remediation_report"
            ;;
        "monitor")
            echo "Démarrage de la surveillance continue..."
            monitor_security_status
            ;;
        "fleet")
            echo "Exécution de l'évaluation à l'échelle de la flotte..."
            fleet_report=$(fleet_security_assessment)
            echo "Évaluation de flotte terminée : $fleet_report"
            ;;
        *)
            echo "Usage : $0 {check|audit|remediate|monitor|fleet}"
            echo "  check     - Vérification rapide du statut de sécurité"
            echo "  audit     - Audit de sécurité complet"
            echo "  remediate - Actions de remédiation automatisées"
            echo "  monitor   - Surveillance de sécurité continue"
            echo "  fleet     - Évaluation de sécurité à l'échelle de la flotte"
            exit 1
            ;;
    esac
    
    # Nettoyage
    rm -rf "$TEMP_DIR"
    
    log_action "=== Gestion de sécurité terminée ==="
}

# Exécuter la fonction principale
main "$@"

Intégration Apple ID et iCloud

Vérifier le Statut de Connexion Apple ID

#!/bin/bash

# Vérification complète de l'Apple ID
check_apple_id_comprehensive() {
    echo "=== Vérification du Statut Apple ID ==="
    
    # Vérifier les comptes iCloud
    local icloud_accounts
    icloud_accounts=$(defaults read MobileMeAccounts Accounts 2>/dev/null | grep -c AccountID || echo "0")
    
    if [[ "$icloud_accounts" -gt 0 ]]; then
        echo "✅ Apple ID connecté ($icloud_accounts compte(s))"
        
        # Obtenir les détails du compte (respectueux de la confidentialité)
        defaults read MobileMeAccounts Accounts 2>/dev/null | grep AccountID | while read -r line; do
            local account_id
            account_id=$(echo "$line" | sed 's/.*= "\(.*\)";/\1/' | sed 's/\(.*@\)\(.*\)/\1***/g')
            echo "   Compte : $account_id"
        done
        
        # Vérifier les services iCloud
        echo "Services iCloud :"
        defaults read MobileMeAccounts Accounts 2>/dev/null | grep -E "(BookmarksSyncEnabled|ContactsSyncEnabled|MailSyncEnabled)" | while read -r service; do
            echo "   $service"
        done
        
        return 0
    else
        echo "❌ Aucun Apple ID connecté"
        return 1
    fi
}

Vérifier le Statut des Services iCloud

#!/bin/bash

# Vérifier les services iCloud spécifiques
check_icloud_services() {
    echo "=== Statut des Services iCloud ==="
    
    # Vérifier Find My Mac spécifiquement
    local fmf_token
    fmf_token=$(defaults read MobileMeAccounts Accounts 2>/dev/null | grep -i findmyfriends || echo "")
    
    if [[ -n "$fmf_token" ]]; then
        echo "✅ Service Find My Friends/Family actif"
    else
        echo "⚠️  Service Find My Friends/Family non configuré"
    fi
    
    # Vérifier d'autres services critiques
    local services=(
        "BookmarksSyncEnabled:Signets Safari"
        "ContactsSyncEnabled:Contacts"
        "CalendarSyncEnabled:Calendrier"
        "KeychainSyncEnabled:Trousseau"
    )
    
    for service in "${services[@]}"; do
        local key="${service%%:*}"
        local name="${service##*:}"
        local status
        status=$(defaults read MobileMeAccounts Accounts 2>/dev/null | grep "$key" | head -1 | grep -o "[01]" || echo "0")
        
        if [[ "$status" = "1" ]]; then
            echo "✅ Synchronisation $name activée"
        else
            echo "❌ Synchronisation $name désactivée"
        fi
    done
}

Politiques de Sécurité d'Entreprise

Définir les Exigences de Sécurité

#!/bin/bash

# Configuration des politiques de sécurité d'entreprise
apply_security_policies() {
    echo "=== Application des Politiques de Sécurité d'Entreprise ==="
    
    local policy_file="/etc/macfleet/security_policies.json"
    
    # Créer la configuration des politiques de sécurité
    mkdir -p "$(dirname "$policy_file")"
    cat > "$policy_file" << 'EOF'
{
    "security_policies": {
        "find_my_mac": {
            "required": true,
            "enforcement": "advisory",
            "grace_period_days": 7
        },
        "apple_id": {
            "required": true,
            "corporate_domain_only": false,
            "enforcement": "mandatory"
        },
        "activation_lock": {
            "required": true,
            "mdm_managed": true
        },
        "system_security": {
            "sip_required": true,
            "gatekeeper_required": true,
            "filevault_required": true,
            "firewall_required": true
        }
    },
    "compliance_reporting": {
        "frequency": "daily",
        "recipients": ["security@company.com"],
        "escalation_threshold": "medium"
    }
}
EOF

    echo "Politiques de sécurité configurées : $policy_file"
}

Surveillance de Conformité

#!/bin/bash

# Surveillance de conformité automatisée
setup_compliance_monitoring() {
    local monitoring_script="/usr/local/bin/macfleet_compliance_monitor.sh"
    local launchd_plist="/Library/LaunchDaemons/com.macfleet.security.compliance.plist"
    
    # Créer le script de surveillance
    cat > "$monitoring_script" << 'EOF'
#!/bin/bash
LOG_FILE="/var/log/macfleet_compliance.log"
exec > >(tee -a "$LOG_FILE") 2>&1

echo "$(date): Démarrage de la vérification de conformité de sécurité"

# Exécuter l'audit de sécurité
/usr/local/bin/macfleet_security_manager.sh audit

# Vérifier la non-conformité
COMPLIANCE_STATUS=$(calculate_compliance_status)
if [[ "$COMPLIANCE_STATUS" != "compliant" ]]; then
    echo "$(date): Non-conformité détectée - $COMPLIANCE_STATUS"
    
    # Envoyer une alerte (implémenter selon votre système de notification)
    echo "L'appareil $(hostname) est non-conforme" | mail -s "Alerte de Conformité de Sécurité" security@company.com
fi

echo "$(date): Vérification de conformité terminée"
EOF

    chmod +x "$monitoring_script"
    
    # Créer le LaunchDaemon pour les vérifications de conformité programmées
    cat > "$launchd_plist" << EOF
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.macfleet.security.compliance</string>
    <key>ProgramArguments</key>
    <array>
        <string>$monitoring_script</string>
    </array>
    <key>StartCalendarInterval</key>
    <array>
        <dict>
            <key>Hour</key>
            <integer>9</integer>
            <key>Minute</key>
            <integer>0</integer>
        </dict>
        <dict>
            <key>Hour</key>
            <integer>17</integer>
            <key>Minute</key>
            <integer>0</integer>
        </dict>
    </array>
    <key>RunAtLoad</key>
    <false/>
</dict>
</plist>
EOF

    # Charger le LaunchDaemon
    sudo launchctl load "$launchd_plist"
    
    echo "Surveillance de conformité configurée"
    echo "Script : $monitoring_script"
    echo "Planification : Quotidien à 9h00 et 17h00"
}

Indicateurs de Statut de Sécurité

Comprendre les Tokens NVRAM

Le statut Find My Mac est stocké dans les tokens NVRAM (Non-Volatile Random Access Memory) :

TokenDescriptionIndique
fmm-mobileme-token-FMMToken principal Find My MacLe service est actif et configuré
fmm-computer-nameNom d'appareil pour Find MyIdentification de l'appareil dans le réseau Find My
fmm-mobileme-token-FMFToken Find My FriendsServices de partage de localisation

Interpréter les États de Sécurité

ÉtatFind My MacApple IDConformitéAction Requise
Entièrement Conforme✅ Activé✅ Connecté✅ ConformeAucune
Partiellement Conforme✅ Activé❌ Non Connecté⚠️ PartielleSe connecter à Apple ID
Non-Conforme❌ Désactivé❌ Non Connecté❌ Non-ConformeActiver Find My Mac et se connecter
État Inconnu❓ Impossible de Détecter❓ Impossible de Détecter❓ InconnuVérification manuelle requise

Dépannage des Problèmes Courants

Find My Mac Ne S'Active Pas

#!/bin/bash

# Dépanner les problèmes Find My Mac
troubleshoot_find_my_mac() {
    echo "=== Dépannage Find My Mac ==="
    
    # Vérifier les prérequis
    echo "Vérification des prérequis..."
    
    # 1. Vérifier la connectivité internet
    if ping -c 1 apple.com >/dev/null 2>&1; then
        echo "✅ Connectivité internet : OK"
    else
        echo "❌ Connectivité internet : ÉCHEC"
        echo "   - Vérifiez la connexion réseau"
        echo "   - Vérifiez les paramètres DNS"
    fi
    
    # 2. Vérifier la connexion Apple ID
    if check_apple_id_status >/dev/null 2>&1; then
        echo "✅ Connexion Apple ID : OK"
    else
        echo "❌ Connexion Apple ID : REQUISE"
        echo "   - Se connecter à Apple ID dans Préférences Système"
        echo "   - Activer les services iCloud"
    fi
    
    # 3. Vérifier les services iCloud
    local icloud_enabled
    icloud_enabled=$(defaults read MobileMeAccounts Accounts 2>/dev/null | grep -c "Enabled.*1" || echo "0")
    
    if [[ "$icloud_enabled" -gt 0 ]]; then
        echo "✅ Services iCloud : ACTIVÉS"
    else
        echo "❌ Services iCloud : DÉSACTIVÉS"
        echo "   - Activer iCloud dans Préférences Système"
        echo "   - S'assurer que Find My Mac est coché"
    fi
    
    # 4. Vérifier les exigences système
    local os_version
    os_version=$(sw_vers -productVersion)
    
    if [[ "$(echo "$os_version" | cut -d. -f1)" -ge 10 ]] && [[ "$(echo "$os_version" | cut -d. -f2)" -ge 11 ]]; then
        echo "✅ Version macOS : SUPPORTÉE ($os_version)"
    else
        echo "❌ Version macOS : NON SUPPORTÉE ($os_version)"
        echo "   - Find My Mac nécessite macOS 10.11 ou ultérieur"
    fi
}

Étapes de Remédiation Manuelle

#!/bin/bash

# Générer un guide de remédiation manuelle
generate_remediation_guide() {
    local guide_file="/tmp/macfleet_remediation_guide.txt"
    
    cat > "$guide_file" << EOF
Guide de Remédiation de Sécurité MacFleet
==========================================

Appareil : $(hostname)
Date : $(date)

Actions Requises :
EOF

    if [[ "$(check_find_my_mac_status)" != "enabled" ]]; then
        cat >> "$guide_file" << EOF

1. Activer Find My Mac :
   - Ouvrez Préférences Système
   - Cliquez sur Apple ID (ou iCloud sur les anciens systèmes)
   - Connectez-vous avec votre Apple ID si pas déjà connecté
   - Cliquez sur "Localiser" dans la barre latérale
   - Cochez "Find My Mac"
   - Cochez "Activer la recherche hors ligne" (si disponible)
   - Cliquez sur "Autoriser" quand demandé pour l'accès à la localisation

EOF
    fi
    
    if ! check_apple_id_status >/dev/null 2>&1; then
        cat >> "$guide_file" << EOF

2. Se connecter à Apple ID :
   - Ouvrez Préférences Système
   - Cliquez sur Apple ID en haut
   - Entrez votre Apple ID et mot de passe
   - Complétez l'authentification à deux facteurs si demandée
   - Activez les services iCloud selon les besoins

EOF
    fi
    
    cat >> "$guide_file" << EOF

Pour assistance, contactez le Support IT :
- Email : support@company.com
- Téléphone : +1-555-0123
- Système de Tickets : https://support.company.com

EOF

    echo "Guide de remédiation créé : $guide_file"
    open "$guide_file"
}

Meilleures Pratiques

🔐 Directives de Sécurité

  • Activez Find My Mac sur tous les appareils d'entreprise
  • Exigez la connexion Apple ID pour la responsabilité des appareils
  • Surveillez le statut de conformité régulièrement
  • Implémentez des alertes automatisées pour la non-conformité

📋 Recommandations de Gestion

  • Utilisez l'inscription MDM pour le verrou d'activation d'entreprise
  • Audits de sécurité réguliers sur la flotte d'appareils
  • Éducation des utilisateurs sur l'importance des fonctionnalités de sécurité
  • Surveillance et rapports de conformité automatisés

🔍 Stratégie de Surveillance

  • Vérifications de conformité quotidiennes pendant les heures de bureau
  • Alertes immédiates pour les violations de sécurité
  • Analyse des tendances des métriques de conformité
  • Révision régulière des politiques et mises à jour

Notes Importantes

  • Find My Mac nécessite macOS 10.11 ou ultérieur pour une fonctionnalité complète
  • La connexion Apple ID est obligatoire pour le fonctionnement de Find My Mac
  • Connectivité réseau requise pour la configuration initiale et le fonctionnement continu
  • Considérations de confidentialité doivent être documentées pour l'usage d'entreprise
  • Testez les procédures de remédiation avant le déploiement d'entreprise

Gestion du Chiffrement FileVault Entreprise sur macOS

Gérez le chiffrement de disque FileVault sur votre déploiement MacFleet avec une surveillance complète, des rapports de conformité et une gestion automatisée du chiffrement. Ce tutoriel fournit des solutions de niveau entreprise pour maintenir la sécurité des données grâce au chiffrement de disque.

Comprendre le Chiffrement FileVault

FileVault est la technologie de chiffrement de disque complet d'Apple qui protège les données au repos sur les appareils macOS :

  • Chiffrement de disque complet - Chiffre l'intégralité du disque de démarrage
  • Algorithme de chiffrement XTS-AES-128 avec clé 256 bits
  • Accélération matérielle sur les appareils Mac supportés
  • Gestion des clés de récupération pour le déploiement d'entreprise
  • Exigences de conformité pour les normes de protection des données

Surveillance Basique du Statut de Chiffrement

Vérifier le Statut FileVault

#!/bin/bash

# Vérifier le statut actuel du chiffrement FileVault
sudo fdesetup status

echo "Vérification du statut FileVault terminée"

Vérifier l'État du Chiffrement

#!/bin/bash

# Obtenir des informations détaillées sur le chiffrement
echo "=== Statut FileVault ==="
status=$(sudo fdesetup status)
echo "$status"

# Analyser le statut pour l'automatisation
if echo "$status" | grep -q "FileVault is On"; then
    echo "✅ Chiffrement : ACTIVÉ"
    exit 0
elif echo "$status" | grep -q "FileVault is Off"; then
    echo "❌ Chiffrement : DÉSACTIVÉ"
    exit 1
else
    echo "⚠️ Chiffrement : ÉTAT INCONNU"
    exit 2
fi

Surveillance de la Progression du Chiffrement

macOS 10.11 et 10.12 (Core Storage)

#!/bin/bash

# Surveiller la progression chiffrement/déchiffrement pour les anciennes versions macOS
echo "=== Progression du Chiffrement Core Storage ==="
progress=$(diskutil cs list | grep "Conversion Progress")

if [[ -n "$progress" ]]; then
    echo "Chiffrement en cours :"
    echo "$progress"
else
    echo "Aucune opération de chiffrement/déchiffrement en cours"
fi

macOS 10.13+ (APFS)

#!/bin/bash

# Surveiller la progression du chiffrement pour APFS (macOS 10.13+)
echo "=== Progression du Chiffrement APFS ==="

# Vérifier la progression du chiffrement
enc_progress=$(diskutil apfs list | grep "Encryption Progress")
if [[ -n "$enc_progress" ]]; then
    echo "Chiffrement en cours :"
    echo "$enc_progress"
fi

# Vérifier la progression du déchiffrement
dec_progress=$(diskutil apfs list | grep "Decryption Progress")
if [[ -n "$dec_progress" ]]; then
    echo "Déchiffrement en cours :"
    echo "$dec_progress"
fi

if [[ -z "$enc_progress" && -z "$dec_progress" ]]; then
    echo "Aucune opération de chiffrement/déchiffrement en cours"
fi

Moniteur de Progression Universel

#!/bin/bash

# Moniteur de progression de chiffrement universel
check_encryption_progress() {
    local macos_version
    macos_version=$(sw_vers -productVersion | cut -d. -f1-2)
    
    echo "=== Moniteur de Progression du Chiffrement ==="
    echo "Version macOS : $macos_version"
    
    case "$macos_version" in
        "10.11"|"10.12")
            echo "Utilisation de la surveillance Core Storage..."
            diskutil cs list | grep "Conversion Progress" || echo "Aucune progression détectée"
            ;;
        *)
            echo "Utilisation de la surveillance APFS..."
            local enc_progress dec_progress
            enc_progress=$(diskutil apfs list | grep "Encryption Progress")
            dec_progress=$(diskutil apfs list | grep "Decryption Progress")
            
            if [[ -n "$enc_progress" ]]; then
                echo "Chiffrement : $enc_progress"
            elif [[ -n "$dec_progress" ]]; then
                echo "Déchiffrement : $dec_progress"
            else
                echo "Aucune opération de chiffrement/déchiffrement en cours"
            fi
            ;;
    esac
}

check_encryption_progress

Gestion d'Entreprise Avancée

Audit Complet du Chiffrement

#!/bin/bash

# Outil d'Audit FileVault Entreprise MacFleet
# Vérification complète du statut de chiffrement et de conformité

# Configuration
LOG_FILE="/var/log/macfleet_encryption.log"
REPORT_DIR="/var/log/macfleet_reports"
CONFIG_FILE="/etc/macfleet/encryption_policy.conf"

# Créer les répertoires s'ils n'existent pas
mkdir -p "$(dirname "$LOG_FILE")" "$REPORT_DIR" "$(dirname "$CONFIG_FILE")"

# Configuration par défaut
cat > "$CONFIG_FILE" 2>/dev/null << 'EOF' || true
# Configuration de la Politique de Chiffrement MacFleet
REQUIRE_FILEVAULT=true
ALERT_ON_DISABLED=true
MONITOR_PROGRESS=true
COMPLIANCE_REPORTING=true
AUTO_REMEDIATION=false
NOTIFICATION_EMAIL=""
EOF

# Charger la configuration
source "$CONFIG_FILE" 2>/dev/null || true

# Fonction de journalisation
log_action() {
    echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" | tee -a "$LOG_FILE"
}

# Obtenir les informations système
get_system_info() {
    echo "=== Informations Système ==="
    echo "Nom d'hôte : $(hostname)"
    echo "Version macOS : $(sw_vers -productVersion)"
    echo "Build : $(sw_vers -buildVersion)"
    echo "Matériel : $(system_profiler SPHardwareDataType | grep "Model Name" | awk -F: '{print $2}' | xargs)"
    echo "Numéro de série : $(system_profiler SPHardwareDataType | grep "Serial Number" | awk -F: '{print $2}' | xargs)"
    echo "Date d'audit : $(date)"
    echo ""
}

# Vérifier le statut FileVault
check_filevault_status() {
    echo "=== Analyse du Statut FileVault ==="
    
    local status
    status=$(sudo fdesetup status 2>/dev/null)
    
    if echo "$status" | grep -q "FileVault is On"; then
        echo "✅ Statut FileVault : ACTIVÉ"
        log_action "Le chiffrement FileVault est correctement activé"
        
        # Obtenir les utilisateurs activés
        local enabled_users
        enabled_users=$(sudo fdesetup list 2>/dev/null)
        if [[ -n "$enabled_users" ]]; then
            echo "Utilisateurs activés :"
            echo "$enabled_users"
        fi
        
        return 0
    elif echo "$status" | grep -q "FileVault is Off"; then
        echo "❌ Statut FileVault : DÉSACTIVÉ"
        log_action "ALERTE SÉCURITÉ : Le chiffrement FileVault est désactivé"
        
        if [[ "$ALERT_ON_DISABLED" == "true" ]]; then
            echo "⚠️  VIOLATION DE CONFORMITÉ : Chiffrement requis par la politique"
        fi
        
        return 1
    else
        echo "⚠️  Statut FileVault : INCONNU"
        log_action "AVERTISSEMENT : Impossible de déterminer le statut FileVault"
        return 2
    fi
}

# Vérifier la progression du chiffrement
check_encryption_progress() {
    echo "=== Progression du Chiffrement ==="
    
    local macos_version
    macos_version=$(sw_vers -productVersion | cut -d. -f1-2)
    
    case "$macos_version" in
        "10.11"|"10.12")
            local cs_progress
            cs_progress=$(diskutil cs list | grep "Conversion Progress")
            if [[ -n "$cs_progress" ]]; then
                echo "Progression Core Storage : $cs_progress"
                log_action "Chiffrement/Déchiffrement en cours : $cs_progress"
            else
                echo "Aucune conversion Core Storage en cours"
            fi
            ;;
        *)
            local enc_progress dec_progress
            enc_progress=$(diskutil apfs list | grep "Encryption Progress")
            dec_progress=$(diskutil apfs list | grep "Decryption Progress")
            
            if [[ -n "$enc_progress" ]]; then
                echo "Progression Chiffrement APFS : $enc_progress"
                log_action "Chiffrement APFS en cours : $enc_progress"
            elif [[ -n "$dec_progress" ]]; then
                echo "Progression Déchiffrement APFS : $dec_progress"
                log_action "Déchiffrement APFS en cours : $dec_progress"
            else
                echo "Aucun chiffrement/déchiffrement APFS en cours"
            fi
            ;;
    esac
}

# Vérifier les informations du disque
check_disk_info() {
    echo "=== Informations Disque ==="
    
    # Informations du disque de démarrage
    local boot_disk
    boot_disk=$(diskutil info / | grep "Device Node" | awk '{print $3}')
    echo "Disque de démarrage : $boot_disk"
    
    # Taille et utilisation du disque
    echo "Utilisation du disque :"
    df -h /
    
    # Informations APFS (macOS 10.13+)
    if command -v diskutil >/dev/null && diskutil apfs list >/dev/null 2>&1; then
        echo -e "\nInformations Conteneur APFS :"
        diskutil apfs list | grep -E "(Container|Volume|Encryption)"
    fi
}

# Générer un rapport de conformité
generate_compliance_report() {
    local report_file="$REPORT_DIR/encryption_compliance_$(date +%Y%m%d_%H%M%S).json"
    
    echo "=== Génération du Rapport de Conformité ==="
    
    # Obtenir le statut FileVault
    local filevault_enabled=false
    local status_detail=""
    
    if sudo fdesetup status 2>/dev/null | grep -q "FileVault is On"; then
        filevault_enabled=true
        status_detail="activé"
    else
        status_detail="désactivé"
    fi
    
    # Créer le rapport JSON
    cat > "$report_file" << EOF
{
  "type_rapport": "conformite_chiffrement",
  "horodatage": "$(date -u +%Y-%m-%dT%H:%M:%SZ)",
  "nom_hote": "$(hostname)",
  "numero_serie": "$(system_profiler SPHardwareDataType | grep "Serial Number" | awk -F: '{print $2}' | xargs)",
  "version_macos": "$(sw_vers -productVersion)",
  "chiffrement": {
    "filevault_active": $filevault_enabled,
    "detail_statut": "$status_detail",
    "statut_conformite": "$([ "$filevault_enabled" == "true" ] && echo "conforme" || echo "non_conforme")",
    "politique_requise": $REQUIRE_FILEVAULT
  },
  "infos_disque": {
    "disque_demarrage": "$(diskutil info / | grep "Device Node" | awk '{print $3}')",
    "systeme_fichiers": "$(diskutil info / | grep "File System" | awk -F: '{print $2}' | xargs)"
  },
  "details_audit": {
    "date_audit": "$(date)",
    "version_politique": "1.0",
    "remediation_requise": $([ "$filevault_enabled" != "true" ] && echo "true" || echo "false")
  }
}
EOF
    
    echo "Rapport de conformité sauvegardé dans : $report_file"
    log_action "Rapport de conformité généré : $report_file"
}

# Actions de remédiation
perform_remediation() {
    echo "=== Remédiation Automatisée ==="
    
    if [[ "$AUTO_REMEDIATION" != "true" ]]; then
        echo "Remédiation automatique désactivée dans la politique"
        return 0
    fi
    
    # Vérifier si FileVault est désactivé
    if ! sudo fdesetup status 2>/dev/null | grep -q "FileVault is On"; then
        echo "⚠️  FileVault est désactivé - remédiation requise"
        log_action "REMÉDIATION : Le chiffrement FileVault est désactivé"
        
        echo "Étapes de remédiation manuelle :"
        echo "1. Ouvrir Préférences Système > Sécurité et confidentialité"
        echo "2. Cliquer sur l'onglet FileVault"
        echo "3. Cliquer sur Activer FileVault"
        echo "4. Suivre l'assistant de configuration"
        echo ""
        echo "Ou utiliser la MDM pour imposer la politique de chiffrement FileVault"
        
        # Créer un ticket de remédiation (placeholder)
        echo "Création d'un ticket de remédiation pour l'appareil : $(hostname)"
    fi
}

# Fonction d'audit principale
main() {
    log_action "=== Audit FileVault MacFleet Démarré ==="
    
    get_system_info
    check_filevault_status
    local filevault_status=$?
    
    echo ""
    check_encryption_progress
    echo ""
    check_disk_info
    echo ""
    
    if [[ "$COMPLIANCE_REPORTING" == "true" ]]; then
        generate_compliance_report
        echo ""
    fi
    
    if [[ $filevault_status -ne 0 ]]; then
        perform_remediation
    fi
    
    log_action "=== Audit FileVault terminé avec le statut : $filevault_status ==="
    return $filevault_status
}

# Exécuter la fonction principale
main "$@"

Gestion des Politiques d'Entreprise

Modèle de Configuration de Politique

#!/bin/bash

# Créer une politique de chiffrement complète
cat > /etc/macfleet/encryption_policy.conf << 'EOF'
# Politique de Chiffrement Entreprise MacFleet
# Version : 2.0

# Exigences de Base
REQUIRE_FILEVAULT=true
ENFORCE_IMMEDIATE_ENCRYPTION=true
ALLOW_PERSONAL_RECOVERY_KEY=false
REQUIRE_INSTITUTIONAL_RECOVERY_KEY=true

# Configuration de Surveillance
ALERT_ON_DISABLED=true
MONITOR_PROGRESS=true
PROGRESS_CHECK_INTERVAL=3600  # secondes
COMPLIANCE_REPORTING=true
AUDIT_FREQUENCY=86400  # quotidien

# Paramètres de Remédiation
AUTO_REMEDIATION=false
ESCALATION_THRESHOLD=72  # heures
NOTIFICATION_EMAIL="securite@entreprise.com"
HELP_DESK_CONTACT="+33-1-55-00-12-34"

# Politiques de Sécurité
MIN_RECOVERY_KEY_LENGTH=24
RECOVERY_KEY_ROTATION_DAYS=90
ENCRYPTION_ALGORITHM="XTS-AES-128"

# Normes de Conformité
COMPLIANCE_FRAMEWORKS="SOC2,HIPAA,PCI-DSS"
DATA_CLASSIFICATION_REQUIRED=true
AUDIT_TRAIL_RETENTION_DAYS=2555  # 7 ans
EOF

echo "Politique de chiffrement d'entreprise configurée"

Gestion des Clés de Récupération

#!/bin/bash

# Gestion des clés de récupération d'entreprise
manage_recovery_keys() {
    echo "=== Gestion des Clés de Récupération ==="
    
    # Vérifier si la clé de récupération institutionnelle est définie
    local has_institutional_key=false
    if sudo fdesetup list 2>/dev/null | grep -q "institutional"; then
        has_institutional_key=true
        echo "✅ Clé de récupération institutionnelle configurée"
    else
        echo "❌ Aucune clé de récupération institutionnelle trouvée"
    fi
    
    # Valider la clé de récupération
    if [[ "$has_institutional_key" == "true" ]]; then
        echo "Validation de la clé de récupération :"
        sudo fdesetup validaterecovery 2>/dev/null && echo "✅ Clé de récupération valide" || echo "❌ Clé de récupération invalide"
    fi
    
    # Dépôt de la clé de récupération (intégration MDM)
    echo "Statut de dépôt de la clé de récupération :"
    if system_profiler SPConfigurationProfileDataType | grep -q "FDERecoveryKeyEscrow"; then
        echo "✅ Clé de récupération déposée dans la MDM"
    else
        echo "⚠️  Clé de récupération non déposée"
    fi
}

manage_recovery_keys

Surveillance et Alertes

Script de Surveillance Continue

#!/bin/bash

# Démon de surveillance FileVault continue
DAEMON_NAME="macfleet-encryption-monitor"
PID_FILE="/var/run/${DAEMON_NAME}.pid"
CHECK_INTERVAL=300  # 5 minutes

# Fonctions du démon
start_monitoring() {
    if [[ -f "$PID_FILE" ]]; then
        echo "Démon de surveillance déjà en cours d'exécution (PID : $(cat "$PID_FILE"))"
        return 1
    fi
    
    echo "Démarrage du démon de surveillance FileVault..."
    
    # Boucle de surveillance en arrière-plan
    (
        while true; do
            # Vérification rapide du statut
            if ! sudo fdesetup status 2>/dev/null | grep -q "FileVault is On"; then
                logger -t "$DAEMON_NAME" "ALERTE : Chiffrement FileVault désactivé sur $(hostname)"
                
                # Envoyer une notification (personnaliser pour votre environnement)
                osascript -e 'display notification "Le chiffrement FileVault est désactivé !" with title "Alerte Sécurité MacFleet"' 2>/dev/null || true
            fi
            
            sleep "$CHECK_INTERVAL"
        done
    ) &
    
    echo $! > "$PID_FILE"
    echo "Démon de surveillance démarré (PID : $!)"
}

stop_monitoring() {
    if [[ -f "$PID_FILE" ]]; then
        local pid
        pid=$(cat "$PID_FILE")
        kill "$pid" 2>/dev/null
        rm -f "$PID_FILE"
        echo "Démon de surveillance arrêté"
    else
        echo "Démon de surveillance non en cours d'exécution"
    fi
}

# Exécuter selon l'argument
case "${1:-start}" in
    start)
        start_monitoring
        ;;
    stop)
        stop_monitoring
        ;;
    restart)
        stop_monitoring
        sleep 2
        start_monitoring
        ;;
    status)
        if [[ -f "$PID_FILE" ]]; then
            echo "Démon de surveillance en cours d'exécution (PID : $(cat "$PID_FILE"))"
        else
            echo "Démon de surveillance non en cours d'exécution"
        fi
        ;;
    *)
        echo "Usage : $0 {start|stop|restart|status}"
        exit 1
        ;;
esac

Notes de Sécurité Importantes

Bonnes Pratiques FileVault

  • Activer avant le déploiement - Chiffrer les appareils avant le déploiement utilisateur
  • Dépôt des clés de récupération - Utiliser la MDM pour la gestion centralisée des clés
  • Rotation régulière des clés - Faire tourner périodiquement les clés de récupération institutionnelles
  • Surveiller la conformité - Surveillance continue des violations de politique
  • Tester les procédures de récupération - Tester régulièrement les processus de récupération de clés

Considérations d'Entreprise

  • Impact sur les performances - Minimal sur le matériel Mac moderne avec T2/Apple Silicon
  • Temps de chiffrement initial - Peut prendre plusieurs heures pour les gros disques
  • Planification de récupération - Assurer la disponibilité des clés de récupération pour le support
  • Formation des utilisateurs - Éduquer les utilisateurs sur les avantages du chiffrement et la récupération
  • Rapports de conformité - Audits réguliers pour les exigences réglementaires

Considérations Apple Silicon

  • Accélération matérielle - Performance de chiffrement optimisée
  • Secure Enclave - Protection renforcée des clés
  • Limitations de surveillance de progression - Certains outils de surveillance peuvent ne pas fonctionner
  • Sécurité de démarrage - Fonctionnalités de sécurité supplémentaires au-delà de FileVault

N'oubliez pas de tester ces scripts de manière approfondie dans votre environnement avant de les déployer sur les appareils de production.

Analyse de Taille de Fichiers et Gestion de Stockage sur macOS

Maîtrisez l'analyse de taille de fichiers et la gestion du stockage sur vos appareils MacFleet en utilisant des outils puissants d'analyse d'utilisation du disque. Ce tutoriel couvre les requêtes de taille de base, l'analyse de stockage, la surveillance de l'utilisation du disque et les techniques d'optimisation de stockage avancées pour une gestion efficace du stockage de flotte.

Comprendre l'Analyse de Stockage macOS

macOS fournit plusieurs outils en ligne de commande pour l'analyse de stockage :

  • du - Analyse de l'utilisation du disque pour les fichiers et répertoires
  • df - Utilisation de l'espace disque du système de fichiers
  • ls - Listage de fichiers avec informations de taille
  • find - Recherche de fichiers par critères de taille
  • stat - Informations détaillées sur les fichiers incluant la taille

Opérations de Base pour la Taille de Fichiers et Dossiers

Trouver la Taille d'un Fichier

#!/bin/bash

# Obtenir la taille d'un fichier spécifique
FILE_PATH="/Users/stefan/Desktop/Document.txt"

echo "Taille du fichier pour : $FILE_PATH"
du -h "$FILE_PATH"

echo "Analyse de taille de fichier terminée"

Trouver la Taille d'un Dossier

#!/bin/bash

# Obtenir la taille d'un dossier
FOLDER_PATH="/Users/stefan/Desktop/Wallpapers"

echo "Taille du dossier pour : $FOLDER_PATH"
du -h "$FOLDER_PATH"

echo "Analyse de taille de dossier terminée"

Informations de Taille Détaillées

#!/bin/bash

# Obtenir des informations de taille détaillées avec options
analyze_size() {
    local target_path="$1"
    
    if [[ ! -e "$target_path" ]]; then
        echo "Erreur : Chemin non trouvé : $target_path"
        return 1
    fi
    
    echo "=== Analyse de Taille pour : $target_path ==="
    
    # Taille de base
    echo "Taille totale :"
    du -h "$target_path"
    
    # Taille avec tous les fichiers listés
    echo -e "\nDétail complet :"
    du -ah "$target_path" | head -20
    
    # Total général avec résumé
    echo -e "\nRésumé avec total :"
    du -ch "$target_path"
}

# Utilisation
analyze_size "/Users/stefan/Desktop/Document.txt"

Analyse de Stockage Avancée

Répartition de Taille de Répertoires

#!/bin/bash

# Analyser les tailles de répertoires avec tri
directory_analysis() {
    local base_path="$1"
    local max_depth="${2:-1}"
    
    echo "=== Analyse de Taille de Répertoires : $base_path ==="
    
    # Tailles de répertoires de niveau supérieur, triées par taille
    echo "Plus gros répertoires :"
    du -h -d "$max_depth" "$base_path" 2>/dev/null | sort -hr | head -20
    
    # Nombre d'éléments
    echo -e "\nNombre d'éléments :"
    echo "Fichiers : $(find "$base_path" -type f 2>/dev/null | wc -l)"
    echo "Répertoires : $(find "$base_path" -type d 2>/dev/null | wc -l)"
    
    # Analyse des types de fichiers
    echo -e "\nDistribution des types de fichiers :"
    find "$base_path" -type f 2>/dev/null | grep '\.' | rev | cut -d. -f1 | rev | sort | uniq -c | sort -nr | head -10
}

# Utilisation
directory_analysis "/Users" 2

Détection de Gros Fichiers

#!/bin/bash

# Trouver les gros fichiers dans un répertoire
find_large_files() {
    local search_path="$1"
    local min_size="${2:-100M}"
    
    echo "=== Analyse de Gros Fichiers (>$min_size) dans : $search_path ==="
    
    # Trouver les gros fichiers
    echo "Gros fichiers trouvés :"
    find "$search_path" -type f -size +"$min_size" -exec ls -lh {} \; 2>/dev/null | sort -k5 -hr
    
    # Nombre et taille totale
    local large_files_count=$(find "$search_path" -type f -size +"$min_size" 2>/dev/null | wc -l)
    echo -e "\nTotal de gros fichiers : $large_files_count"
    
    if [[ $large_files_count -gt 0 ]]; then
        echo "Taille totale des gros fichiers :"
        find "$search_path" -type f -size +"$min_size" -exec du -ch {} + 2>/dev/null | tail -1
    fi
}

# Utilisation
find_large_files "/Users" "50M"

Utilisation de Stockage par Type de Fichier

#!/bin/bash

# Analyser l'utilisation de stockage par extension de fichier
storage_by_type() {
    local search_path="$1"
    
    echo "=== Utilisation de Stockage par Type de Fichier : $search_path ==="
    
    # Créer un fichier temporaire pour l'analyse
    local temp_file="/tmp/file_analysis_$$"
    
    # Obtenir tous les fichiers avec extensions et leurs tailles
    find "$search_path" -type f -name "*.*" -exec sh -c '
        for file; do
            ext=$(echo "$file" | rev | cut -d. -f1 | rev | tr "[:upper:]" "[:lower:]")
            size=$(stat -f%z "$file" 2>/dev/null || echo 0)
            echo "$ext $size"
        done
    ' _ {} + > "$temp_file"
    
    # Résumer par extension
    echo "Principaux types de fichiers par taille totale :"
    awk '{
        ext_size[$1] += $2
        ext_count[$1]++
    } END {
        for (ext in ext_size) {
            printf "%-10s %15s %10d fichiers\n", ext, ext_size[ext], ext_count[ext]
        }
    }' "$temp_file" | sort -k2 -nr | head -15 | \
    while read ext size count; do
        # Convertir les octets en format lisible
        if [[ $size -gt 1073741824 ]]; then
            printf "%-10s %10.2f GB %10d fichiers\n" "$ext" $(echo "scale=2; $size/1073741824" | bc) "$count"
        elif [[ $size -gt 1048576 ]]; then
            printf "%-10s %10.2f MB %10d fichiers\n" "$ext" $(echo "scale=2; $size/1048576" | bc) "$count"
        else
            printf "%-10s %10.2f KB %10d fichiers\n" "$ext" $(echo "scale=2; $size/1024" | bc) "$count"
        fi
    done
    
    # Nettoyage
    rm -f "$temp_file"
}

# Utilisation
storage_by_type "/Users"

Surveillance de l'Espace Disque

Utilisation du Disque Système

#!/bin/bash

# Rapport complet d'utilisation du disque
system_disk_report() {
    echo "=== Rapport d'Utilisation du Disque Système ==="
    
    # Utilisation du système de fichiers
    echo "Utilisation du Système de Fichiers :"
    df -h
    
    echo -e "\nUtilisation du disque par point de montage :"
    df -h | awk 'NR>1 {print $5 " " $1}' | while read output; do
        usage=$(echo $output | awk '{print $1}' | cut -d'%' -f1)
        partition=$(echo $output | awk '{print $2}')
        if [[ $usage -ge 80 ]]; then
            echo "⚠️  $partition : ${usage}% (AVERTISSEMENT)"
        elif [[ $usage -ge 90 ]]; then
            echo "🚨 $partition : ${usage}% (CRITIQUE)"
        else
            echo "✅ $partition : ${usage}%"
        fi
    done
    
    # Principaux répertoires par taille
    echo -e "\nPrincipaux répertoires par taille :"
    du -h / 2>/dev/null | sort -hr | head -10
}

# Exécuter le rapport système
system_disk_report

Analyse des Tendances de Stockage

#!/bin/bash

# Surveiller les tendances de stockage dans le temps
storage_trend_monitor() {
    local target_path="$1"
    local log_file="/var/log/macfleet_storage_trends.log"
    
    echo "=== Surveillance des Tendances de Stockage : $target_path ==="
    
    # Horodatage et taille actuels
    local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
    local current_size=$(du -sk "$target_path" 2>/dev/null | cut -f1)
    
    # Enregistrer la mesure actuelle
    echo "$timestamp,$target_path,$current_size" >> "$log_file"
    
    # Afficher les tendances récentes si le log existe
    if [[ -f "$log_file" ]]; then
        echo "Tendances de stockage récentes (10 dernières mesures) :"
        echo "Horodatage              | Chemin            | Taille (KB)  | Changement"
        echo "------------------------|-------------------|--------------|------------"
        
        tail -10 "$log_file" | while IFS=',' read -r time path size; do
            # Calculer le changement par rapport à la mesure précédente
            printf "%-23s | %-17s | %12s | \n" "$time" "$(basename "$path")" "$size"
        done
        
        # Calculer le taux de croissance
        local first_size=$(head -1 "$log_file" | cut -d',' -f3)
        local growth=$((current_size - first_size))
        local growth_percent=$(echo "scale=2; ($growth * 100) / $first_size" | bc 2>/dev/null || echo "0")
        
        echo -e "\nCroissance depuis la première mesure : ${growth} KB (${growth_percent}%)"
    fi
}

# Utilisation
storage_trend_monitor "/Users"

Système de Gestion de Stockage d'Entreprise

#!/bin/bash

# Outil de Gestion de Stockage MacFleet
# Analyse et optimisation complète du stockage pour les appareils de flotte

# Configuration
SCRIPT_VERSION="1.0.0"
LOG_FILE="/var/log/macfleet_storage.log"
REPORT_DIR="/etc/macfleet/reports/storage"
CONFIG_DIR="/etc/macfleet/storage"
ALERT_DIR="$CONFIG_DIR/alerts"

# Créer les répertoires s'ils n'existent pas
mkdir -p "$REPORT_DIR" "$CONFIG_DIR" "$ALERT_DIR"

# Catégories de stockage pour l'analyse
declare -A STORAGE_CATEGORIES=(
    ["system_critical"]="/System,/Library,/usr,/bin,/sbin"
    ["user_data"]="/Users,/home"
    ["applications"]="/Applications"
    ["caches"]="/Library/Caches,/Users/*/Library/Caches"
    ["logs"]="/var/log,/Library/Logs,/Users/*/Library/Logs"
    ["downloads"]="/Users/*/Downloads"
    ["documents"]="/Users/*/Documents,/Users/*/Desktop"
    ["media"]="/Users/*/Movies,/Users/*/Music,/Users/*/Pictures"
    ["temporary"]="/tmp,/var/tmp,/Users/*/Library/Application Support/*/Cache"
    ["development"]="/usr/local,/opt,/Users/*/Development"
)

# Seuils et politiques de stockage
declare -A STORAGE_POLICIES=(
    ["space_warning"]="80,85,90,95"
    ["large_file_threshold"]="100M,500M,1G,5G"
    ["old_file_threshold"]="30,90,180,365"
    ["cache_cleanup_age"]="7,14,30,60"
    ["temp_cleanup_age"]="1,3,7,14"
    ["log_retention_days"]="30,60,90,180"
)

# Fonction de journalisation
log_action() {
    local message="$1"
    local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
    echo "[$timestamp] $message" | tee -a "$LOG_FILE"
}

# Moteur d'analyse de stockage avancé
analyze_storage_comprehensive() {
    local target_path="$1"
    local analysis_level="${2:-standard}"
    local category="${3:-general}"
    
    log_action "Début de l'analyse complète de stockage : $target_path (Niveau : $analysis_level)"
    
    if [[ ! -e "$target_path" ]]; then
        log_action "ERREUR : Le chemin cible n'existe pas : $target_path"
        return 1
    fi
    
    local report_file="$REPORT_DIR/storage_analysis_$(echo "$target_path" | tr '/' '_')_$(date +%Y%m%d_%H%M%S).json"
    
    # Initialiser le rapport
    cat > "$report_file" << EOF
{
    "analysis_info": {
        "target_path": "$target_path",
        "analysis_level": "$analysis_level",
        "category": "$category",
        "timestamp": "$(date -u +%Y-%m-%dT%H:%M:%SZ)",
        "hostname": "$(hostname)",
        "script_version": "$SCRIPT_VERSION"
    },
    "storage_metrics": {},
    "file_analysis": {},
    "recommendations": [],
    "alerts": []
}
EOF
    
    # Métriques de stockage de base
    local total_size_kb=$(du -sk "$target_path" 2>/dev/null | cut -f1)
    local total_files=$(find "$target_path" -type f 2>/dev/null | wc -l)
    local total_dirs=$(find "$target_path" -type d 2>/dev/null | wc -l)
    local largest_file_size=$(find "$target_path" -type f -exec stat -f%z {} \; 2>/dev/null | sort -nr | head -1)
    
    # Mettre à jour le rapport avec les métriques de base
    jq --argjson total_size_kb "$total_size_kb" \
       --argjson total_files "$total_files" \
       --argjson total_dirs "$((total_dirs - 1))" \
       --argjson largest_file "$largest_file_size" \
       '.storage_metrics = {
           "total_size_kb": $total_size_kb,
           "total_size_mb": ($total_size_kb / 1024),
           "total_size_gb": ($total_size_kb / 1048576),
           "total_files": $total_files,
           "total_directories": $total_dirs,
           "largest_file_bytes": $largest_file,
           "average_file_size": (if $total_files > 0 then ($total_size_kb * 1024 / $total_files) else 0 end)
       }' "$report_file" > "${report_file}.tmp" && mv "${report_file}.tmp" "$report_file"
    
    # Effectuer l'analyse selon le niveau
    case "$analysis_level" in
        "quick")
            perform_quick_storage_analysis "$target_path" "$report_file"
            ;;
        "standard")
            perform_standard_storage_analysis "$target_path" "$report_file"
            ;;
        "comprehensive")
            perform_comprehensive_storage_analysis "$target_path" "$report_file"
            ;;
        "optimization")
            perform_optimization_analysis "$target_path" "$report_file"
            ;;
        "security")
            perform_security_storage_analysis "$target_path" "$report_file"
            ;;
    esac
    
    log_action "Analyse de stockage terminée : $report_file"
    echo "$report_file"
}

# Fonction d'exécution principale
main() {
    local action="${1:-analyze}"
    local target="${2:-/Users}"
    local level="${3:-standard}"
    local options="${4:-}"
    
    log_action "=== Gestion de Stockage MacFleet Démarrée ==="
    log_action "Action : $action, Cible : $target, Niveau : $level"
    
    case "$action" in
        "analyze")
            analyze_storage_comprehensive "$target" "$level"
            ;;
        "size")
            echo "Taille de fichier/dossier :"
            du -h "$target"
            ;;
        "fleet")
            manage_fleet_storage "$level" "$target" "$options"
            ;;
        "report")
            generate_fleet_storage_report
            ;;
        "help")
            echo "Usage : $0 [action] [cible] [niveau] [options]"
            echo "Actions :"
            echo "  analyze <chemin> [niveau] - Analyse complète de stockage"
            echo "  size <chemin> - Vérification simple de taille"
            echo "  fleet <action> [motif] [seuil] - Gestion de flotte"
            echo "  report - Générer un rapport de stockage de flotte"
            echo "  help - Afficher cette aide"
            echo ""
            echo "Niveaux d'analyse : quick, standard, comprehensive, optimization, security"
            echo "Actions de flotte : audit, cleanup, monitor, report"
            ;;
        *)
            log_action "ERREUR : Action inconnue : $action"
            exit 1
            ;;
    esac
    
    log_action "=== Gestion de stockage terminée ==="
}

# Exécuter la fonction principale
main "$@"

Tâches Courantes d'Analyse de Stockage

Comparaison de Répertoires

#!/bin/bash

# Comparer les tailles de plusieurs répertoires
compare_directories() {
    local directories=("$@")
    
    echo "=== Comparaison de Taille de Répertoires ==="
    printf "%-40s %15s %15s\n" "Répertoire" "Taille" "Fichiers"
    echo "--------------------------------------------------------------------------------"
    
    for dir in "${directories[@]}"; do
        if [[ -d "$dir" ]]; then
            local size=$(du -sh "$dir" 2>/dev/null | cut -f1)
            local files=$(find "$dir" -type f 2>/dev/null | wc -l)
            printf "%-40s %15s %15d\n" "$dir" "$size" "$files"
        else
            printf "%-40s %15s %15s\n" "$dir" "N/A" "N/A"
        fi
    done
}

# Utilisation
compare_directories "/Users/stefan/Documents" "/Users/stefan/Downloads" "/Users/stefan/Desktop"

Suivi de Croissance de Stockage

#!/bin/bash

# Suivre la croissance de stockage dans le temps
track_storage_growth() {
    local target_path="$1"
    local log_file="/var/log/storage_growth.csv"
    
    # Créer l'en-tête si le fichier n'existe pas
    if [[ ! -f "$log_file" ]]; then
        echo "timestamp,path,size_kb,files,directories" > "$log_file"
    fi
    
    # Obtenir les métriques actuelles
    local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
    local size_kb=$(du -sk "$target_path" 2>/dev/null | cut -f1)
    local files=$(find "$target_path" -type f 2>/dev/null | wc -l)
    local dirs=$(find "$target_path" -type d 2>/dev/null | wc -l)
    
    # Enregistrer la mesure actuelle
    echo "$timestamp,$target_path,$size_kb,$files,$dirs" >> "$log_file"
    
    echo "Croissance de stockage enregistrée pour : $target_path"
    echo "Taille actuelle : $(echo "scale=2; $size_kb/1024" | bc) MB"
    echo "Fichiers : $files, Répertoires : $dirs"
}

# Utilisation
track_storage_growth "/Users/stefan"

Recommandations de Nettoyage

#!/bin/bash

# Générer des recommandations de nettoyage
generate_cleanup_recommendations() {
    local target_path="$1"
    
    echo "=== Recommandations de Nettoyage pour : $target_path ==="
    
    # Anciens téléchargements
    local old_downloads=$(find "$target_path" -path "*/Downloads/*" -type f -mtime +30 2>/dev/null | wc -l)
    if [[ $old_downloads -gt 0 ]]; then
        echo "📁 Trouvé $old_downloads fichiers dans Téléchargements de plus de 30 jours"
    fi
    
    # Gros fichiers de cache
    local cache_size=$(find "$target_path" -path "*/Cache*" -type f -size +10M 2>/dev/null | wc -l)
    if [[ $cache_size -gt 0 ]]; then
        echo "🗂️  Trouvé $cache_size gros fichiers de cache (>10MB)"
    fi
    
    # Fichiers dupliqués
    local duplicates=$(find "$target_path" -type f -exec md5 {} \; 2>/dev/null | sort | uniq -d -w 32 | wc -l)
    if [[ $duplicates -gt 0 ]]; then
        echo "📄 Trouvé approximativement $duplicates fichiers dupliqués"
    fi
    
    # Répertoires vides
    local empty_dirs=$(find "$target_path" -type d -empty 2>/dev/null | wc -l)
    if [[ $empty_dirs -gt 0 ]]; then
        echo "📂 Trouvé $empty_dirs répertoires vides"
    fi
    
    # Fichiers de log
    local large_logs=$(find "$target_path" -name "*.log" -size +50M 2>/dev/null | wc -l)
    if [[ $large_logs -gt 0 ]]; then
        echo "📋 Trouvé $large_logs gros fichiers de log (>50MB)"
    fi
    
    echo -e "\n💡 Considérez exécuter des opérations de nettoyage pour ces éléments"
}

# Utilisation
generate_cleanup_recommendations "/Users"

Notes Importantes

  • Chemins de fichiers avec espaces - Utilisez des guillemets ou échappez les caractères : du -h "/chemin/avec espaces"
  • Exigences de permissions - Certains répertoires nécessitent un accès administrateur
  • Impact sur les performances - Les analyses de gros répertoires peuvent être gourmandes en ressources
  • Surveillance régulière - Configurez une surveillance automatisée du stockage pour la gestion de flotte
  • Sauvegarde avant nettoyage - Sauvegardez toujours les données importantes avant les opérations de nettoyage
  • Testez les scripts sur des répertoires d'exemple avant le déploiement à l'échelle de la flotte