Guide

Nouvelles mises à jour et améliorations de Roundfleet.

Gestion d'Entreprise du Pare-feu pour macOS

Implémentez une gestion de pare-feu de niveau entreprise sur votre déploiement Roundfleet 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 Roundfleet
# Sécurité réseau avancée et surveillance de conformité

# Configuration
CONFIG_FILE="/etc/roundfleet/firewall_policy.conf"
LOG_FILE="/var/log/roundfleet_firewall.log"
RULES_DIR="/Library/Roundfleet/FirewallRules"
AUDIT_LOG="/var/log/roundfleet_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 Roundfleet
# 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/roundfleet_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 Roundfleet 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 Roundfleet"
            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 Roundfleet 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 Roundfleet à 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 Roundfleet
# Standardiser les préférences Finder sur les appareils de flotte

# Configuration
LOG_FILE="/var/log/roundfleet_finder.log"
BACKUP_DIR="/var/backups/roundfleet/finder"
CONFIG_FILE="/etc/roundfleet/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 Roundfleet..."
    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 Roundfleet"
        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 Roundfleet 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 Roundfleet (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 Roundfleet 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 Roundfleet. 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 Roundfleet
# Audit de sécurité complet et surveillance de conformité

# Configuration
LOG_FILE="/var/log/roundfleet_security.log"
REPORT_DIR="/var/reports/security"
COMPLIANCE_DIR="/var/compliance"
TEMP_DIR="/tmp/roundfleet_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": "Roundfleet 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é Roundfleet"
    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/roundfleet_security_reminder.txt" << EOF
Conformité de Sécurité Roundfleet 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é Roundfleet ==="
    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/roundfleet/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": ["[email protected]"],
        "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/roundfleet_compliance_monitor.sh"
    local launchd_plist="/Library/LaunchDaemons/com.roundfleet.security.compliance.plist"
    
    # Créer le script de surveillance
    cat > "$monitoring_script" << 'EOF'
#!/bin/bash
LOG_FILE="/var/log/roundfleet_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/roundfleet_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é" [email protected]
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.roundfleet.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/roundfleet_remediation_guide.txt"
    
    cat > "$guide_file" << EOF
Guide de Remédiation de Sécurité Roundfleet
==========================================

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 : [email protected]
- 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 Roundfleet 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 Roundfleet
# Vérification complète du statut de chiffrement et de conformité

# Configuration
LOG_FILE="/var/log/roundfleet_encryption.log"
REPORT_DIR="/var/log/roundfleet_reports"
CONFIG_FILE="/etc/roundfleet/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 Roundfleet
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 Roundfleet 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/roundfleet/encryption_policy.conf << 'EOF'
# Politique de Chiffrement Entreprise Roundfleet
# 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="[email protected]"
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="roundfleet-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é Roundfleet"' 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 Roundfleet 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/roundfleet_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 Roundfleet
# Analyse et optimisation complète du stockage pour les appareils de flotte

# Configuration
SCRIPT_VERSION="1.0.0"
LOG_FILE="/var/log/roundfleet_storage.log"
REPORT_DIR="/etc/roundfleet/reports/storage"
CONFIG_DIR="/etc/roundfleet/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 Roundfleet 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

Protection de Fichiers d'Entreprise sur macOS

Protégez les fichiers et applications critiques sur vos appareils Roundfleet en utilisant les techniques avancées de protection de fichiers, les drapeaux immuables et les politiques de sécurité d'entreprise. Ce tutoriel fournit des outils complets pour implémenter les standards de sécurité de fichiers organisationnels.

Comprendre les Méthodes de Protection de Fichiers macOS

macOS offre plusieurs mécanismes de protection de fichiers :

  • Drapeaux Immuables - Protection au niveau système empêchant la modification ou la suppression
  • Permissions de Fichiers - Contrôles d'accès basés sur l'utilisateur et le groupe
  • Attributs Étendus - Métadonnées supplémentaires pour l'application de la sécurité
  • Protection d'Intégrité Système (SIP) - Protection intégrée pour les fichiers système

Commandes de Protection de Fichiers Basiques

Verrouiller un Fichier Unique

#!/bin/bash

# Verrouiller un fichier en utilisant le drapeau immuable
FILE_PATH="/Applications/WhatsApp.app"

chflags schg "$FILE_PATH"
echo "Fichier verrouillé: $FILE_PATH"

Déverrouiller un Fichier Unique

#!/bin/bash

# Déverrouiller un fichier en supprimant le drapeau immuable
FILE_PATH="/Applications/WhatsApp.app"

chflags noschg "$FILE_PATH"
echo "Fichier déverrouillé: $FILE_PATH"

Vérifier le Statut de Protection d'un Fichier

#!/bin/bash

# Vérifier si un fichier est protégé
FILE_PATH="/Applications/WhatsApp.app"

if ls -lO "$FILE_PATH" | grep -q "schg"; then
    echo "Le fichier est protégé: $FILE_PATH"
else
    echo "Le fichier n'est pas protégé: $FILE_PATH"
fi

Système de Protection de Fichiers d'Entreprise

#!/bin/bash

# Système de Protection de Fichiers d'Entreprise Roundfleet
# Gestion complète de la sécurité et protection des fichiers

# Configuration
ROUNDFLEET_DIR="/etc/roundfleet"
POLICIES_DIR="$ROUNDFLEET_DIR/file_policies"
REPORTS_DIR="$ROUNDFLEET_DIR/reports"
COMPLIANCE_DIR="$ROUNDFLEET_DIR/compliance"
AUDIT_DIR="$ROUNDFLEET_DIR/audit"
LOG_FILE="/var/log/roundfleet_file_protection.log"
BACKUP_DIR="$ROUNDFLEET_DIR/backups"

# Créer la structure de répertoires
create_directories() {
    local dirs=("$ROUNDFLEET_DIR" "$POLICIES_DIR" "$REPORTS_DIR" "$COMPLIANCE_DIR" "$AUDIT_DIR" "$BACKUP_DIR")
    for dir in "${dirs[@]}"; do
        [[ ! -d "$dir" ]] && mkdir -p "$dir"
    done
}

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

# Catégories de Fichiers pour la Protection d'Entreprise
declare -A FILE_CATEGORIES=(
    ["apps_critiques"]="/Applications/System Preferences.app,/Applications/Terminal.app,/Applications/Utilities"
    ["apps_affaires"]="/Applications/Microsoft Office,/Applications/Slack.app,/Applications/Zoom.app"
    ["configs_systeme"]="/etc/hosts,/etc/sudoers,/etc/ssh/sshd_config"
    ["outils_securite"]="/Applications/1Password.app,/Applications/Keychain Access.app"
    ["outils_developpement"]="/Applications/Xcode.app,/Applications/Visual Studio Code.app"
    ["utilitaires_admin"]="/Applications/Activity Monitor.app,/Applications/Console.app"
)

# Niveaux de Protection
declare -A PROTECTION_LEVELS=(
    ["maximum"]="schg,uappnd,uchg"        # Système immuable, utilisateur ajout-seulement, utilisateur immuable
    ["eleve"]="schg,uchg"                 # Système immuable, utilisateur immuable
    ["modere"]="uchg"                     # Utilisateur immuable seulement
    ["minimal"]="uappnd"                  # Utilisateur ajout-seulement
    ["lecture_seule"]="ro"                # Accès lecture seule
)

# Politiques de Sécurité
declare -A SECURITY_POLICIES=(
    ["verrouillage_entreprise"]="apps_critiques:maximum,apps_affaires:eleve,configs_systeme:maximum,outils_securite:eleve"
    ["protection_standard"]="apps_critiques:eleve,configs_systeme:eleve,outils_securite:modere"
    ["developpement_sur"]="apps_critiques:modere,configs_systeme:eleve,outils_developpement:minimal"
    ["securite_minimale"]="configs_systeme:modere,outils_securite:minimal"
    ["mode_maintenance"]="configs_systeme:lecture_seule"
)

# Appliquer une protection à un fichier ou répertoire
protect_file() {
    local file_path="$1"
    local protection_level="$2"
    local policy="$3"
    
    if [[ ! -e "$file_path" ]]; then
        log_action "ERREUR: Fichier non trouvé: $file_path"
        return 1
    fi
    
    # Sauvegarder les drapeaux actuels
    local current_flags=$(ls -lO "$file_path" 2>/dev/null | awk '{print $5}' || echo "aucun")
    echo "$file_path:$current_flags:$(date)" >> "$BACKUP_DIR/file_flags_backup.log"
    
    # Appliquer la protection basée sur le niveau
    local flags="${PROTECTION_LEVELS[$protection_level]}"
    if [[ -z "$flags" ]]; then
        log_action "ERREUR: Niveau de protection inconnu: $protection_level"
        return 1
    fi
    
    # Diviser les drapeaux et appliquer chacun
    IFS=',' read -ra flag_array <<< "$flags"
    for flag in "${flag_array[@]}"; do
        if chflags "$flag" "$file_path" 2>/dev/null; then
            log_action "Drapeau de protection '$flag' appliqué à: $file_path (Politique: $policy)"
        else
            log_action "ERREUR: Échec d'application du drapeau '$flag' à: $file_path"
        fi
    done
    
    # Définir des permissions restrictives si nécessaire
    if [[ "$protection_level" == "maximum" || "$protection_level" == "eleve" ]]; then
        chmod 644 "$file_path" 2>/dev/null
        log_action "Permissions restrictives définies pour: $file_path"
    fi
    
    # Sauvegarder les métadonnées de protection
    echo "file=$file_path,protection=$protection_level,policy=$policy,timestamp=$(date),user=$(whoami)" >> "$POLICIES_DIR/applied_protections.log"
}

# Supprimer la protection d'un fichier
unprotect_file() {
    local file_path="$1"
    local reason="$2"
    
    if [[ ! -e "$file_path" ]]; then
        log_action "ERREUR: Fichier non trouvé: $file_path"
        return 1
    fi
    
    # Supprimer tous les drapeaux de protection communs
    local flags_to_remove=("schg" "uchg" "uappnd" "ro")
    
    for flag in "${flags_to_remove[@]}"; do
        if chflags "no$flag" "$file_path" 2>/dev/null; then
            log_action "Drapeau de protection '$flag' supprimé de: $file_path (Raison: $reason)"
        fi
    done
    
    # Restaurer les permissions standard
    if [[ -f "$file_path" ]]; then
        chmod 644 "$file_path" 2>/dev/null
    elif [[ -d "$file_path" ]]; then
        chmod 755 "$file_path" 2>/dev/null
    fi
    
    log_action "Fichier non protégé: $file_path (Raison: $reason)"
}

# Appliquer une protection à une catégorie de fichiers
protect_category() {
    local category="$1"
    local protection_level="$2"
    local policy="$3"
    
    if [[ -z "${FILE_CATEGORIES[$category]}" ]]; then
        log_action "ERREUR: Catégorie de fichier inconnue: $category"
        return 1
    fi
    
    log_action "Protection de la catégorie: $category avec niveau: $protection_level (Politique: $policy)"
    
    # Diviser les chemins de fichiers séparés par des virgules
    IFS=',' read -ra files <<< "${FILE_CATEGORIES[$category]}"
    
    for file_path in "${files[@]}"; do
        # Gérer les motifs de caractères génériques
        if [[ "$file_path" == *"*"* ]]; then
            # Utiliser find pour la correspondance de motifs
            find "${file_path%/*}" -name "${file_path##*/}" 2>/dev/null | while read -r found_file; do
                protect_file "$found_file" "$protection_level" "$policy"
            done
        else
            protect_file "$file_path" "$protection_level" "$policy"
        fi
    done
}

# Appliquer une politique de sécurité complète
apply_security_policy() {
    local policy="$1"
    
    if [[ -z "${SECURITY_POLICIES[$policy]}" ]]; then
        log_action "ERREUR: Politique de sécurité inconnue: $policy"
        return 1
    fi
    
    log_action "Application de la politique de sécurité: $policy"
    
    # Analyser la chaîne de politique: "categorie:niveau,categorie:niveau"
    IFS=',' read -ra policy_items <<< "${SECURITY_POLICIES[$policy]}"
    
    for item in "${policy_items[@]}"; do
        IFS=':' read -ra parts <<< "$item"
        local category="${parts[0]}"
        local protection_level="${parts[1]}"
        
        protect_category "$category" "$protection_level" "$policy"
    done
    
    log_action "Politique de sécurité '$policy' appliquée avec succès"
    
    # Générer un rapport de conformité
    generate_compliance_report "$policy"
}

# Opérations de protection de fichiers en lot
bulk_protect_files() {
    local file_list="$1"
    local protection_level="$2"
    local policy="$3"
    
    if [[ ! -f "$file_list" ]]; then
        log_action "ERREUR: Liste de fichiers non trouvée: $file_list"
        return 1
    fi
    
    log_action "Début de l'opération de protection en lot à partir de la liste: $file_list"
    local protected_count=0
    local failed_count=0
    
    while IFS= read -r file_path; do
        [[ -z "$file_path" || "$file_path" =~ ^#.*$ ]] && continue
        
        if protect_file "$file_path" "$protection_level" "$policy"; then
            ((protected_count++))
        else
            ((failed_count++))
        fi
    done < "$file_list"
    
    log_action "Protection en lot terminée: $protected_count protégés, $failed_count échoués"
}

# Protection des fichiers système critiques
protect_system_files() {
    local protection_mode="$1"
    
    log_action "Application de la protection des fichiers système: $protection_mode"
    
    # Définir les fichiers système critiques
    local critical_files=(
        "/etc/hosts"
        "/etc/sudoers"
        "/etc/ssh/sshd_config"
        "/etc/passwd"
        "/etc/group"
        "/System/Library/LaunchDaemons"
        "/Library/LaunchDaemons"
        "/usr/bin/sudo"
        "/bin/sh"
        "/bin/bash"
    )
    
    case "$protection_mode" in
        "verrouillage")
            for file in "${critical_files[@]}"; do
                if [[ -e "$file" ]]; then
                    protect_file "$file" "maximum" "verrouillage_systeme"
                fi
            done
            ;;
        "standard")
            for file in "${critical_files[@]}"; do
                if [[ -e "$file" ]]; then
                    protect_file "$file" "eleve" "systeme_standard"
                fi
            done
            ;;
        "minimal")
            for file in "${critical_files[@]}"; do
                if [[ -e "$file" ]]; then
                    protect_file "$file" "modere" "systeme_minimal"
                fi
            done
            ;;
    esac
    
    log_action "Protection des fichiers système appliquée: $protection_mode"
}

# Surveillance de l'intégrité des fichiers
monitor_file_integrity() {
    local monitoring_mode="$1"
    local monitor_file="$POLICIES_DIR/integrity_monitor.log"
    
    log_action "Début de la surveillance de l'intégrité des fichiers: $monitoring_mode"
    
    # Obtenir la liste des fichiers protégés
    local protected_files=()
    if [[ -f "$POLICIES_DIR/applied_protections.log" ]]; then
        while IFS=',' read -r entry; do
            if [[ "$entry" =~ file=([^,]+) ]]; then
                protected_files+=("${BASH_REMATCH[1]}")
            fi
        done < "$POLICIES_DIR/applied_protections.log"
    fi
    
    # Surveiller les fichiers pour les changements
    for file in "${protected_files[@]}"; do
        if [[ -e "$file" ]]; then
            local current_hash=$(shasum -a 256 "$file" 2>/dev/null | cut -d' ' -f1)
            local current_flags=$(ls -lO "$file" 2>/dev/null | awk '{print $5}' || echo "aucun")
            local timestamp=$(date -u +%Y-%m-%dT%H:%M:%SZ)
            
            echo "$timestamp:$file:$current_hash:$current_flags" >> "$monitor_file"
        fi
    done
    
    log_action "Surveillance de l'intégrité des fichiers terminée: $monitoring_mode"
}

# Procédures de déverrouillage d'urgence
emergency_unlock() {
    local reason="$1"
    local unlock_scope="$2"
    
    log_action "DÉVERROUILLAGE D'URGENCE INITIÉ - Raison: $reason, Portée: $unlock_scope"
    
    case "$unlock_scope" in
        "tout")
            # Déverrouiller tous les fichiers protégés
            if [[ -f "$POLICIES_DIR/applied_protections.log" ]]; then
                while IFS=',' read -r entry; do
                    if [[ "$entry" =~ file=([^,]+) ]]; then
                        unprotect_file "${BASH_REMATCH[1]}" "deverrouillage_urgence"
                    fi
                done < "$POLICIES_DIR/applied_protections.log"
            fi
            ;;
        "systeme")
            # Déverrouiller seulement les fichiers système
            local system_files=("/etc/hosts" "/etc/sudoers" "/etc/ssh/sshd_config")
            for file in "${system_files[@]}"; do
                if [[ -e "$file" ]]; then
                    unprotect_file "$file" "deverrouillage_systeme_urgence"
                fi
            done
            ;;
        "applications")
            # Déverrouiller les fichiers d'application
            find /Applications -name "*.app" -exec chflags noschg {} \; 2>/dev/null
            log_action "Déverrouillage d'urgence terminé pour les applications"
            ;;
    esac
    
    # Créer un enregistrement de déverrouillage d'urgence
    echo "deverrouillage_urgence:$reason:$unlock_scope:$(date):$(whoami)" >> "$AUDIT_DIR/emergency_operations.log"
    log_action "Déverrouillage d'urgence terminé: $unlock_scope"
}

# Générer un rapport de conformité complet
generate_compliance_report() {
    local policy="$1"
    local report_file="$REPORTS_DIR/file_protection_compliance_$(date +%Y%m%d_%H%M%S).json"
    
    local protected_files_count=0
    local total_files_checked=0
    
    # Compter les fichiers protégés
    if [[ -f "$POLICIES_DIR/applied_protections.log" ]]; then
        protected_files_count=$(wc -l < "$POLICIES_DIR/applied_protections.log")
    fi
    
    # Compter le total des fichiers dans les catégories
    for category in "${!FILE_CATEGORIES[@]}"; do
        IFS=',' read -ra files <<< "${FILE_CATEGORIES[$category]}"
        total_files_checked=$((total_files_checked + ${#files[@]}))
    done
    
    cat > "$report_file" << EOF
{
  "metadonnees_rapport": {
    "horodatage": "$(date -u +%Y-%m-%dT%H:%M:%SZ)",
    "nom_hote": "$(hostname)",
    "politique_appliquee": "$policy",
    "version_rapport": "1.0"
  },
  "statut_protection_fichiers": {
    "nombre_fichiers_proteges": $protected_files_count,
    "total_fichiers_verifies": $total_files_checked,
    "couverture_protection": $(echo "scale=2; $protected_files_count * 100 / $total_files_checked" | bc -l 2>/dev/null || echo "0"),
    "deverrouillages_urgence_enregistres": $([ -f "$AUDIT_DIR/emergency_operations.log" ] && wc -l < "$AUDIT_DIR/emergency_operations.log" || echo "0")
  },
  "politique_securite": {
    "nom": "$policy",
    "categories_protegees": $(echo "${!FILE_CATEGORIES[@]}" | wc -w),
    "cadres_conformite": ["SOX", "HIPAA", "NIST", "ISO27001", "PCI-DSS"]
  },
  "statut_systeme": {
    "sip_active": $(csrutil status | grep -q "enabled" && echo "true" || echo "false"),
    "gatekeeper_active": $(spctl --status | grep -q "enabled" && echo "true" || echo "false"),
    "filevault_active": $(fdesetup status | grep -q "On" && echo "true" || echo "false"),
    "sauvegarde_disponible": $([ -f "$BACKUP_DIR/file_flags_backup.log" ] && echo "true" || echo "false")
  },
  "surveillance_integrite": {
    "active": $([ -f "$POLICIES_DIR/integrity_monitor.log" ] && echo "true" || echo "false"),
    "derniere_verification": "$(date -u +%Y-%m-%dT%H:%M:%SZ)",
    "fichiers_surveilles": $([ -f "$POLICIES_DIR/integrity_monitor.log" ] && wc -l < "$POLICIES_DIR/integrity_monitor.log" || echo "0")
  }
}
EOF
    
    log_action "Rapport de conformité généré: $report_file"
    echo "Rapport sauvegardé vers: $report_file"
}

# Vérification de santé et validation
perform_health_check() {
    echo "=== Vérification de Santé de la Protection de Fichiers Roundfleet ==="
    
    # Vérifier la protection d'intégrité système
    local sip_status=$(csrutil status 2>/dev/null || echo "Inconnu")
    echo "✓ Protection d'Intégrité Système: $sip_status"
    
    # Vérifier les fichiers protégés
    local protected_count=0
    if [[ -f "$POLICIES_DIR/applied_protections.log" ]]; then
        protected_count=$(wc -l < "$POLICIES_DIR/applied_protections.log")
    fi
    echo "✓ Fichiers protégés: $protected_count"
    
    # Vérifier les fichiers système critiques
    local critical_protected=0
    local critical_files=("/etc/hosts" "/etc/sudoers" "/etc/ssh/sshd_config")
    for file in "${critical_files[@]}"; do
        if [[ -e "$file" ]] && ls -lO "$file" | grep -q "schg"; then
            ((critical_protected++))
        fi
    done
    echo "✓ Fichiers système critiques protégés: $critical_protected/${#critical_files[@]}"
    
    # Vérifier la disponibilité de sauvegarde
    if [[ -f "$BACKUP_DIR/file_flags_backup.log" ]]; then
        local backup_entries=$(wc -l < "$BACKUP_DIR/file_flags_backup.log")
        echo "✓ Entrées de sauvegarde: $backup_entries"
    else
        echo "○ Aucun enregistrement de sauvegarde trouvé"
    fi
    
    # Vérifier la surveillance d'intégrité
    if [[ -f "$POLICIES_DIR/integrity_monitor.log" ]]; then
        local monitor_entries=$(wc -l < "$POLICIES_DIR/integrity_monitor.log")
        echo "✓ Entrées de surveillance d'intégrité: $monitor_entries"
    else
        echo "○ Aucune surveillance d'intégrité active"
    fi
    
    # Vérifier les opérations d'urgence
    if [[ -f "$AUDIT_DIR/emergency_operations.log" ]]; then
        local emergency_count=$(wc -l < "$AUDIT_DIR/emergency_operations.log")
        echo "⚠️  Opérations d'urgence enregistrées: $emergency_count"
    else
        echo "✓ Aucune opération d'urgence enregistrée"
    fi
}

# Fonction de déploiement de flotte
deploy_to_fleet() {
    local policy="$1"
    local fleet_file="$2"
    
    if [[ ! -f "$fleet_file" ]]; then
        log_action "ERREUR: Fichier de flotte non trouvé: $fleet_file"
        return 1
    fi
    
    log_action "Début du déploiement de flotte de la politique: $policy"
    
    while IFS= read -r host; do
        [[ -z "$host" || "$host" =~ ^#.*$ ]] && continue
        
        echo "Déploiement vers: $host"
        
        # Copier ce script vers l'hôte distant et l'exécuter
        ssh "$host" "bash -s" << EOF
#!/bin/bash
# Déploiement distant de la politique de protection de fichiers: $policy

# Créer les répertoires
mkdir -p /etc/roundfleet/{file_policies,reports,compliance,audit,backups}

# Appliquer la politique (simplifié pour l'exécution distante)
$(declare -p FILE_CATEGORIES)
$(declare -p PROTECTION_LEVELS)
$(declare -p SECURITY_POLICIES)
$(type apply_security_policy | sed '1d')

apply_security_policy "$policy"
EOF
        
        if [[ $? -eq 0 ]]; then
            log_action "Déploiement réussi vers: $host"
        else
            log_action "Échec du déploiement vers: $host"
        fi
        
    done < "$fleet_file"
    
    log_action "Déploiement de flotte terminé"
}

# Fonction d'exécution principale
main() {
    create_directories
    
    case "${1:-}" in
        "appliquer_politique")
            apply_security_policy "$2"
            ;;
        "proteger_fichier")
            protect_file "$2" "${3:-modere}" "manuel"
            ;;
        "deproteger_fichier")
            unprotect_file "$2" "${3:-deverrouillage_manuel}"
            ;;
        "proteger_categorie")
            protect_category "$2" "${3:-modere}" "manuel"
            ;;
        "protection_lot")
            bulk_protect_files "$2" "${3:-modere}" "operation_lot"
            ;;
        "proteger_systeme")
            protect_system_files "${2:-standard}"
            ;;
        "surveiller_integrite")
            monitor_file_integrity "${2:-standard}"
            ;;
        "deverrouillage_urgence")
            emergency_unlock "${2:-manuel}" "${3:-tout}"
            ;;
        "verification_sante")
            perform_health_check
            ;;
        "rapport")
            generate_compliance_report "${2:-manuel}"
            ;;
        "deployer")
            deploy_to_fleet "$2" "$3"
            ;;
        "aide"|*)
            echo "Système de Protection de Fichiers d'Entreprise Roundfleet"
            echo ""
            echo "Usage: $0 <commande> [options]"
            echo ""
            echo "Commandes:"
            echo "  appliquer_politique <politique>           - Appliquer une politique de sécurité (verrouillage_entreprise|protection_standard|developpement_sur|securite_minimale|mode_maintenance)"
            echo "  proteger_fichier <chemin> [niveau]        - Protéger un fichier unique (maximum|eleve|modere|minimal|lecture_seule)"
            echo "  deproteger_fichier <chemin> [raison]      - Supprimer la protection d'un fichier"
            echo "  proteger_categorie <categorie> [niveau]   - Protéger une catégorie de fichiers (apps_critiques|apps_affaires|configs_systeme|outils_securite|outils_developpement|utilitaires_admin)"
            echo "  protection_lot <liste_fichiers> [niveau]  - Protéger les fichiers d'une liste"
            echo "  proteger_systeme [mode]                   - Protéger les fichiers système (verrouillage|standard|minimal)"
            echo "  surveiller_integrite [mode]               - Surveiller l'intégrité des fichiers (standard|strict)"
            echo "  deverrouillage_urgence <raison> [portee]  - Déverrouillage d'urgence (tout|systeme|applications)"
            echo "  verification_sante                        - Effectuer une vérification de santé du système"
            echo "  rapport [politique]                       - Générer un rapport de conformité"
            echo "  deployer <politique> <fichier_flotte>     - Déployer une politique vers la flotte"
            echo ""
            echo "Exemples:"
            echo "  $0 appliquer_politique verrouillage_entreprise"
            echo "  $0 proteger_fichier /Applications/Terminal.app maximum"
            echo "  $0 proteger_systeme verrouillage"
            echo "  $0 deverrouillage_urgence 'maintenance requise' systeme"
            echo "  $0 verification_sante"
            ;;
    esac
}

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

Niveaux de Protection Expliqués

NiveauDescriptionDrapeaux AppliquésCas d'Usage
MaximumProtection système complèteschg, uappnd, uchgFichiers système critiques
ÉlevéProtection utilisateur forteschg, uchgApplications importantes
ModéréProtection utilisateur standarduchgApplications d'affaires
MinimalProtection d'ajout basiqueuappndFichiers de journal, bases de données
Lecture seuleEmpêcher les modificationsroModèles de configuration

Cas d'Usage de Protection de Fichiers

Protéger les Applications Critiques

# Protéger les utilitaires système contre la modification
./protection_fichiers.sh proteger_categorie apps_critiques maximum

# Protéger les applications d'affaires
./protection_fichiers.sh proteger_categorie apps_affaires eleve

Protection de Configuration Système

# Verrouiller les fichiers de configuration système
./protection_fichiers.sh proteger_systeme verrouillage

# Protection système standard
./protection_fichiers.sh proteger_systeme standard

Sécurité de l'Environnement de Développement

# Appliquer une politique sûre pour le développement
./protection_fichiers.sh appliquer_politique developpement_sur

# Protéger les outils de développement avec des restrictions minimales
./protection_fichiers.sh proteger_categorie outils_developpement minimal

Procédures d'Urgence

Déverrouillage Système Complet

# Déverrouillage d'urgence de tous les fichiers
./protection_fichiers.sh deverrouillage_urgence "maintenance_critique" tout

# Déverrouiller seulement les fichiers système
./protection_fichiers.sh deverrouillage_urgence "mise_a_jour_systeme" systeme

Récupération de Fichiers

# Vérifier le statut de protection
ls -lO /Applications/Terminal.app

# Supprimer une protection spécifique
./protection_fichiers.sh deproteger_fichier /Applications/Terminal.app "maintenance"

Considérations de Sécurité Importantes

  • Protection d'Intégrité Système (SIP) fournit une couche supplémentaire au-delà des drapeaux de fichiers
  • Privilèges root requis pour les drapeaux immuables système (schg)
  • État de protection de sauvegarde avant d'effectuer des changements
  • Procédures d'urgence doivent être testées et documentées
  • Surveillance d'intégrité des fichiers aide à détecter les changements non autorisés

Conformité et Audit

Le système d'entreprise fournit des pistes d'audit complètes pour :

  • Conformité SOX - Exigences de protection des données financières
  • Exigences HIPAA - Sécurité des informations de santé
  • Standards PCI-DSS - Sécurité des données de l'industrie des cartes de paiement
  • Cadre NIST - Conformité aux standards de cybersécurité
  • ISO 27001 - Gestion de la sécurité de l'information

Tests et Validation

Avant le déploiement en entreprise :

  1. Tester les niveaux de protection sur des fichiers non critiques d'abord
  2. Vérifier que les procédures de déverrouillage d'urgence fonctionnent correctement
  3. Confirmer que les applications d'affaires restent fonctionnelles
  4. Tester la précision de la surveillance d'intégrité
  5. Valider la complétude des rapports de conformité

Ce système complet transforme le verrouillage de fichiers basique en une plateforme de protection de niveau entreprise avec des politiques de sécurité avancées, une surveillance de conformité et des capacités de gestion de flotte.

Gestion d'Entreprise d'Ouverture de Fichiers et Dossiers sur macOS

Gérez efficacement les opérations d'ouverture de fichiers et dossiers à travers votre déploiement Roundfleet avec des fonctionnalités de sécurité de niveau entreprise, contrôle d'applications et capacités d'audit complètes. Ce tutoriel transforme les commandes open de base en solutions robustes de gestion d'accès aux fichiers.

Comprendre les Opérations d'Ouverture d'Entreprise

L'ouverture de fichiers d'entreprise nécessite plus qu'un simple accès, exigeant :

  • Validation de sécurité pour prévenir l'accès non autorisé aux fichiers
  • Contrôle d'applications pour imposer l'usage de logiciels approuvés
  • Vérification des permissions avant les opérations sur fichiers
  • Journalisation d'audit pour le suivi de conformité
  • Intégration de scan malware pour la sécurité des fichiers
  • Application des règles métier pour la protection des données

Opérations d'Ouverture de Base

Ouverture de Fichier Simple

#!/bin/bash

# Ouverture de fichier simple avec validation
open_file() {
    local file_path="$1"
    
    # Valider que le fichier existe
    if [[ ! -f "$file_path" ]]; then
        echo "Erreur: Fichier '$file_path' introuvable"
        return 1
    fi
    
    # Ouvrir le fichier avec l'application par défaut
    if open "$file_path"; then
        echo "Ouverture réussie de '$file_path'"
        return 0
    else
        echo "Échec de l'ouverture de '$file_path'"
        return 1
    fi
}

# Exemple d'utilisation
# open_file "/Users/admin/document.pdf"

Ouverture de Fichier avec Application Spécifique

#!/bin/bash

# Ouvrir un fichier avec une application spécifique
open_with_app() {
    local file_path="$1"
    local bundle_id="$2"
    
    # Valider que le fichier existe
    if [[ ! -f "$file_path" ]]; then
        echo "Erreur: Fichier '$file_path' introuvable"
        return 1
    fi
    
    # Ouvrir le fichier avec l'application spécifiée
    if open -b "$bundle_id" "$file_path"; then
        echo "Ouverture réussie de '$file_path' avec $bundle_id"
        return 0
    else
        echo "Échec de l'ouverture de '$file_path' avec $bundle_id"
        return 1
    fi
}

# Exemples d'utilisation
# open_with_app "/Users/admin/document.txt" "com.apple.TextEdit"
# open_with_app "/Users/admin/presentation.pptx" "com.microsoft.PowerPoint"

Ouverture de Dossier

#!/bin/bash

# Ouvrir un dossier dans le Finder
open_folder() {
    local folder_path="$1"
    
    # Valider que le dossier existe
    if [[ ! -d "$folder_path" ]]; then
        echo "Erreur: Dossier '$folder_path' introuvable"
        return 1
    fi
    
    # Ouvrir le dossier dans le Finder
    if open "$folder_path"; then
        echo "Ouverture réussie du dossier '$folder_path'"
        return 0
    else
        echo "Échec de l'ouverture du dossier '$folder_path'"
        return 1
    fi
}

# Exemple d'utilisation
# open_folder "/Users/admin/Documents"

Système de Gestion d'Ouverture d'Entreprise

#!/bin/bash

# Système de Gestion d'Ouverture de Fichiers d'Entreprise Roundfleet
# Ouverture complète de fichiers et dossiers avec fonctionnalités d'entreprise

# Configuration
SCRIPT_NAME="Gestionnaire d'Ouverture Roundfleet"
VERSION="1.0.0"
LOG_FILE="/var/log/roundfleet_open_operations.log"
QUARANTINE_DIR="/var/quarantine/roundfleet"
TEMP_DIR="/tmp/roundfleet_open"
ALLOWED_EXTENSIONS=(".pdf" ".docx" ".xlsx" ".pptx" ".txt" ".png" ".jpg" ".gif" ".mp4" ".mov" ".pages" ".numbers" ".keynote")
RESTRICTED_PATHS=("/System" "/usr/bin" "/usr/sbin" "/private/var" "/Library/LaunchDaemons" "/Library/LaunchAgents")
APPROVED_APPLICATIONS=(
    "com.apple.TextEdit"
    "com.apple.Preview"
    "com.apple.QuickTimePlayerX"
    "com.microsoft.Word"
    "com.microsoft.Excel"
    "com.microsoft.PowerPoint"
    "com.adobe.Reader"
    "com.apple.iWork.Pages"
    "com.apple.iWork.Numbers"
    "com.apple.iWork.Keynote"
)
BUSINESS_HOURS_START=9
BUSINESS_HOURS_END=17
MAX_FILE_SIZE="100M"

# Créer les répertoires nécessaires
mkdir -p "$TEMP_DIR"
mkdir -p "$QUARANTINE_DIR"
mkdir -p "$(dirname "$LOG_FILE")"

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

# Vérifier si l'heure actuelle est dans les heures ouvrables
is_business_hours() {
    local current_hour=$(date +%H)
    if [[ $current_hour -ge $BUSINESS_HOURS_START && $current_hour -lt $BUSINESS_HOURS_END ]]; then
        return 0
    else
        return 1
    fi
}

# Valider l'extension de fichier
is_allowed_extension() {
    local file="$1"
    local extension="${file##*.}"
    extension=".$extension"
    
    for allowed in "${ALLOWED_EXTENSIONS[@]}"; do
        if [[ "$extension" == "$allowed" ]]; then
            return 0
        fi
    done
    return 1
}

# Vérifier si l'application est approuvée
is_approved_application() {
    local bundle_id="$1"
    
    for approved in "${APPROVED_APPLICATIONS[@]}"; do
        if [[ "$bundle_id" == "$approved" ]]; then
            return 0
        fi
    done
    return 1
}

# Ouverture de fichier améliorée avec fonctionnalités d'entreprise
enterprise_open_file() {
    local file_path="$1"
    local bundle_id="${2:-}"
    local force_open="${3:-false}"
    
    local operation_id=$(date +%s)
    log_operation "INFO" "Début de l'opération d'ouverture de fichier [$operation_id]: $file_path"
    
    # Validations préalables
    if [[ ! -f "$file_path" ]]; then
        log_operation "ERROR" "Fichier introuvable: $file_path"
        return 1
    fi
    
    # Vérifier si le chemin du fichier est restreint
    if is_restricted_path "$file_path"; then
        log_operation "SECURITY" "Accès bloqué au chemin restreint: $file_path"
        return 1
    fi
    
    # Valider l'extension de fichier
    if ! is_allowed_extension "$file_path"; then
        log_operation "SECURITY" "Fichier bloqué avec extension non autorisée: $file_path"
        return 1
    fi
    
    # Validation d'application si spécifiée
    if [[ -n "$bundle_id" ]]; then
        if ! is_approved_application "$bundle_id"; then
            log_operation "SECURITY" "Application non autorisée bloquée: $bundle_id"
            return 1
        fi
        
        # Vérifier si l'application est installée
        local app_path=$(mdfind "kMDItemCFBundleIdentifier == '$bundle_id'" 2>/dev/null | head -1)
        if [[ -z "$app_path" ]]; then
            log_operation "ERROR" "Application introuvable: $bundle_id"
            return 1
        fi
    fi
    
    # Effectuer l'opération d'ouverture
    local open_command="open"
    if [[ -n "$bundle_id" ]]; then
        open_command="open -b '$bundle_id'"
    fi
    
    if eval "$open_command '$file_path'"; then
        log_operation "SUCCESS" "Fichier ouvert avec succès [$operation_id]: $file_path"
        log_operation "AUDIT" "Fichier accédé: $file_path"
        return 0
    else
        log_operation "ERROR" "Échec de l'ouverture du fichier [$operation_id]: $file_path"
        return 1
    fi
}

# Ouverture de dossier améliorée avec fonctionnalités d'entreprise
enterprise_open_folder() {
    local folder_path="$1"
    local reveal_hidden="${2:-false}"
    
    local operation_id=$(date +%s)
    log_operation "INFO" "Début de l'opération d'ouverture de dossier [$operation_id]: $folder_path"
    
    # Validations préalables
    if [[ ! -d "$folder_path" ]]; then
        log_operation "ERROR" "Dossier introuvable: $folder_path"
        return 1
    fi
    
    # Vérifier si le chemin du dossier est restreint
    if is_restricted_path "$folder_path"; then
        log_operation "SECURITY" "Accès bloqué au dossier restreint: $folder_path"
        return 1
    fi
    
    # Effectuer l'opération d'ouverture
    local open_command="open"
    if [[ "$reveal_hidden" == "true" ]]; then
        open_command="open -R"
    fi
    
    if eval "$open_command '$folder_path'"; then
        log_operation "SUCCESS" "Dossier ouvert avec succès [$operation_id]: $folder_path"
        log_operation "AUDIT" "Dossier accédé: $folder_path"
        return 0
    else
        log_operation "ERROR" "Échec de l'ouverture du dossier [$operation_id]: $folder_path"
        return 1
    fi
}

# Fonction principale de gestion d'ouverture
main() {
    local action="${1:-help}"
    
    case "$action" in
        "open-file")
            local file_path="$2"
            local bundle_id="$3"
            local force_open="${4:-false}"
            
            if [[ -z "$file_path" ]]; then
                echo "Usage: $0 open-file <file_path> [bundle_id] [force_open]"
                exit 1
            fi
            
            enterprise_open_file "$file_path" "$bundle_id" "$force_open"
            ;;
        "open-folder")
            local folder_path="$2"
            local reveal_hidden="${3:-false}"
            
            if [[ -z "$folder_path" ]]; then
                echo "Usage: $0 open-folder <folder_path> [reveal_hidden]"
                exit 1
            fi
            
            enterprise_open_folder "$folder_path" "$reveal_hidden"
            ;;
        "help"|*)
            echo "$SCRIPT_NAME v$VERSION"
            echo "Gestion d'Entreprise d'Ouverture de Fichiers et Dossiers"
            echo ""
            echo "Usage: $0 <action> [options]"
            echo ""
            echo "Actions:"
            echo "  open-file <file_path> [bundle_id] [force_open]  - Ouvrir un fichier unique"
            echo "  open-folder <folder_path> [reveal_hidden]       - Ouvrir un dossier dans le Finder"
            echo "  help                                             - Afficher ce message d'aide"
            echo ""
            echo "IDs de Bundle Courants:"
            echo "  com.apple.TextEdit          - TextEdit"
            echo "  com.apple.Preview           - Aperçu"
            echo "  com.microsoft.Word          - Microsoft Word"
            echo "  com.microsoft.Excel         - Microsoft Excel"
            echo "  com.microsoft.PowerPoint    - Microsoft PowerPoint"
            echo "  com.adobe.Reader            - Adobe Reader"
            echo "  com.apple.iWork.Pages       - Pages"
            echo "  com.apple.iWork.Numbers     - Numbers"
            echo "  com.apple.iWork.Keynote     - Keynote"
            echo ""
            echo "Fonctionnalités:"
            echo "  • Validation de sécurité et scan malware"
            echo "  • Contrôle d'applications et gestion d'approbation"
            echo "  • Vérification de signature de fichier"
            echo "  • Vérification de conformité aux heures ouvrables"
            echo "  • Journalisation d'audit complète"
            echo "  • Opérations en lot avec surveillance des progrès"
            echo "  • Rapport d'accès détaillé"
            ;;
    esac
}

# Exécuter la fonction principale avec tous les arguments
main "$@"

Commandes de Référence Rapide

Opérations de Fichier Unique

# Ouvrir un fichier avec l'application par défaut
./open_manager.sh open-file "/Users/admin/document.pdf"

# Ouvrir un fichier avec une application spécifique
./open_manager.sh open-file "/Users/admin/document.docx" "com.microsoft.Word"

# Forcer l'ouverture d'un fichier (contourner la validation de signature)
./open_manager.sh open-file "/Users/admin/document.txt" "com.apple.TextEdit" true

Opérations de Dossier

# Ouvrir un dossier dans le Finder
./open_manager.sh open-folder "/Users/admin/Documents"

# Ouvrir un dossier avec les fichiers cachés révélés
./open_manager.sh open-folder "/Users/admin/Documents" true

Exemples d'Intégration

Intégration JAMF Pro

#!/bin/bash

# Script JAMF Pro pour l'ouverture de fichiers d'entreprise
# Paramètres: $4 = file_path, $5 = bundle_id, $6 = force_open

FILE_PATH="$4"
BUNDLE_ID="$5"
FORCE_OPEN="${6:-false}"

# Télécharger le gestionnaire d'ouverture s'il n'est pas présent
if [[ ! -f "/usr/local/bin/roundfleet_open_manager.sh" ]]; then
    curl -o "/usr/local/bin/roundfleet_open_manager.sh" "https://scripts.roundfleet.com/open_manager.sh"
    chmod +x "/usr/local/bin/roundfleet_open_manager.sh"
fi

# Exécuter l'opération d'ouverture
if [[ -n "$FILE_PATH" ]]; then
    /usr/local/bin/roundfleet_open_manager.sh open-file "$FILE_PATH" "$BUNDLE_ID" "$FORCE_OPEN"
else
    echo "Aucun chemin de fichier fourni"
    exit 1
fi

exit $?

Dépannage

Problèmes Courants et Solutions

ProblèmeCauseSolution
Application introuvableID de bundle incorrectVérifier l'ID de bundle avec mdls -name kMDItemCFBundleIdentifier /path/to/app
Permission refuséePrivilèges insuffisantsVérifier les permissions de fichier et droits d'accès utilisateur
Discordance de signatureFichier corrompu ou mauvais typeVérifier l'intégrité du fichier et le format réel
Blocage de sécuritéFichier/app non approuvéAjouter aux listes approuvées ou utiliser force_open
Restriction heures ouvrablesAccès hors heures autoriséesAttendre les heures ouvrables ou ajuster la politique

Analyse des Journaux

# Voir les opérations d'ouverture récentes
tail -f /var/log/roundfleet_open_operations.log

# Rechercher les événements de sécurité
grep "SECURITY" /var/log/roundfleet_open_operations.log

# Compter les opérations par type
grep -c "Fichier accédé" /var/log/roundfleet_open_operations.log
grep -c "Dossier accédé" /var/log/roundfleet_open_operations.log

Meilleures Pratiques

  1. Toujours valider les signatures de fichier avant l'ouverture
  2. Utiliser des applications approuvées de la liste blanche
  3. Surveiller les journaux d'accès régulièrement pour les événements de sécurité
  4. Implémenter des restrictions d'heures ouvrables pour les données sensibles
  5. Maintenir les listes d'approbation d'applications à jour
  6. Tester les scripts d'ouverture de fichiers sur un appareil unique d'abord
  7. Utiliser les opérations en lot pour l'efficacité à grande échelle
  8. Audits de sécurité réguliers des modèles d'accès aux fichiers

Ce système de gestion d'ouverture d'entreprise fournit des capacités complètes de sécurité, contrôle d'applications et audit tout en maintenant la simplicité des opérations d'ouverture de fichiers de base pour une gestion efficace de flotte.

Gestion d'Entreprise de Déplacement de Fichiers et Dossiers sur macOS

Gérez efficacement les opérations de déplacement de fichiers et dossiers à travers votre déploiement Roundfleet avec des fonctionnalités de sécurité de niveau entreprise, création automatique de sauvegarde et capacités d'audit complètes. Ce tutoriel transforme les commandes mv de base en solutions robustes de relocalisation de données.

Comprendre les Opérations de Déplacement d'Entreprise

Le déplacement de fichiers d'entreprise nécessite plus qu'une simple relocalisation, exigeant :

  • Validation de sécurité pour prévenir la perte de données pendant les déplacements
  • Création automatique de sauvegarde avant les opérations destructives
  • Préservation des permissions pendant la relocalisation
  • Capacités de retour en arrière pour les opérations échouées
  • Protection de renommage contre les conflits de noms
  • Journalisation d'audit pour le suivi de conformité

Opérations de Déplacement de Base

Déplacement de Fichier Simple

#!/bin/bash

# Déplacement de fichier simple avec validation
move_file() {
    local source="$1"
    local destination="$2"
    
    # Valider que la source existe
    if [[ ! -f "$source" ]]; then
        echo "Erreur: Fichier source '$source' introuvable"
        return 1
    fi
    
    # Créer le répertoire de destination si nécessaire
    local dest_dir=$(dirname "$destination")
    mkdir -p "$dest_dir"
    
    # Déplacer le fichier
    if mv "$source" "$destination"; then
        echo "Déplacement réussi de '$source' vers '$destination'"
        return 0
    else
        echo "Échec du déplacement de '$source' vers '$destination'"
        return 1
    fi
}

# Exemple d'utilisation
# move_file "/Users/admin/document.pdf" "/Users/shared/documents/document.pdf"

Déplacement de Répertoire de Base

#!/bin/bash

# Déplacement de répertoire avec vérification
move_directory() {
    local source="$1"
    local destination="$2"
    
    # Valider que le répertoire source existe
    if [[ ! -d "$source" ]]; then
        echo "Erreur: Répertoire source '$source' introuvable"
        return 1
    fi
    
    # Déplacer le répertoire
    if mv "$source" "$destination"; then
        echo "Déplacement réussi du répertoire '$source' vers '$destination'"
        return 0
    else
        echo "Échec du déplacement du répertoire '$source' vers '$destination'"
        return 1
    fi
}

# Exemple d'utilisation
# move_directory "/Users/admin/project" "/Users/shared/projects/project"

Renommage de Fichier et Dossier

#!/bin/bash

# Renommer un fichier ou dossier
rename_item() {
    local current_path="$1"
    local new_name="$2"
    
    # Valider que la source existe
    if [[ ! -e "$current_path" ]]; then
        echo "Erreur: Source '$current_path' introuvable"
        return 1
    fi
    
    local parent_dir=$(dirname "$current_path")
    local new_path="$parent_dir/$new_name"
    
    # Vérifier si le nouveau nom existe déjà
    if [[ -e "$new_path" ]]; then
        echo "Erreur: '$new_path' existe déjà"
        return 1
    fi
    
    # Renommer l'élément
    if mv "$current_path" "$new_path"; then
        echo "Renommage réussi de '$(basename "$current_path")' vers '$new_name'"
        return 0
    else
        echo "Échec du renommage de '$(basename "$current_path")' vers '$new_name'"
        return 1
    fi
}

# Exemples d'utilisation
# rename_item "/Users/admin/ancienfichier.txt" "nouveaufichier.txt"
# rename_item "/Users/admin/ancien_dossier" "nouveau_dossier"

Système de Gestion de Déplacement d'Entreprise

#!/bin/bash

# Système de Gestion de Déplacement de Fichiers d'Entreprise Roundfleet
# Déplacement complet de fichiers et dossiers avec fonctionnalités d'entreprise

# Configuration
SCRIPT_NAME="Gestionnaire de Déplacement Roundfleet"
VERSION="1.0.0"
LOG_FILE="/var/log/roundfleet_move_operations.log"
BACKUP_DIR="/var/backups/roundfleet/move_operations"
TEMP_DIR="/tmp/roundfleet_move"
MAX_FILE_SIZE="10G"
ALLOWED_EXTENSIONS=(".pdf" ".docx" ".xlsx" ".pptx" ".txt" ".png" ".jpg" ".gif" ".mp4" ".mov")
RESTRICTED_PATHS=("/System" "/usr/bin" "/usr/sbin" "/private/var" "/Applications")
PROTECTED_DIRECTORIES=("/Users/Shared" "/Library" "/var")
BUSINESS_HOURS_START=9
BUSINESS_HOURS_END=17

# Créer les répertoires nécessaires
mkdir -p "$TEMP_DIR"
mkdir -p "$BACKUP_DIR"
mkdir -p "$(dirname "$LOG_FILE")"

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

# Vérifier si l'heure actuelle est dans les heures ouvrables
is_business_hours() {
    local current_hour=$(date +%H)
    if [[ $current_hour -ge $BUSINESS_HOURS_START && $current_hour -lt $BUSINESS_HOURS_END ]]; then
        return 0
    else
        return 1
    fi
}

# Déplacement de fichier amélioré avec fonctionnalités d'entreprise
enterprise_move_file() {
    local source="$1"
    local destination="$2"
    local conflict_resolution="${3:-prompt}"  # prompt, overwrite, rename, skip
    local create_backup="${4:-true}"
    local verify_integrity="${5:-true}"
    
    local operation_id=$(date +%s)
    log_operation "INFO" "Début de l'opération de déplacement de fichier [$operation_id]: $source -> $destination"
    
    # Validations préalables
    if [[ ! -f "$source" ]]; then
        log_operation "ERROR" "Fichier source introuvable: $source"
        return 1
    fi
    
    # Vérifier si la source est restreinte
    if is_restricted_path "$source"; then
        log_operation "ERROR" "Chemin source restreint: $source"
        return 1
    fi
    
    # Effectuer l'opération de déplacement
    if mv "$source" "$destination"; then
        log_operation "SUCCESS" "Déplacement de fichier terminé [$operation_id]: $source -> $destination"
        return 0
    else
        log_operation "ERROR" "Opération de déplacement échouée [$operation_id]: $source -> $destination"
        return 1
    fi
}

# Fonction principale de gestion de déplacement
main() {
    local action="${1:-help}"
    
    case "$action" in
        "move-file")
            local source="$2"
            local destination="$3"
            local conflict_resolution="${4:-prompt}"
            local create_backup="${5:-true}"
            local verify="${6:-true}"
            
            if [[ -z "$source" || -z "$destination" ]]; then
                echo "Usage: $0 move-file <source> <destination> [conflict_resolution] [create_backup] [verify_integrity]"
                exit 1
            fi
            
            enterprise_move_file "$source" "$destination" "$conflict_resolution" "$create_backup" "$verify"
            ;;
        "help"|*)
            echo "$SCRIPT_NAME v$VERSION"
            echo "Gestion d'Entreprise de Déplacement de Fichiers et Dossiers"
            echo ""
            echo "Usage: $0 <action> [options]"
            echo ""
            echo "Actions:"
            echo "  move-file <source> <destination>           - Déplacer un fichier unique"
            echo "  move-directory <source> <destination>      - Déplacer un répertoire"
            echo "  rename <current_path> <new_name>           - Renommer un fichier ou dossier"
            echo "  help                                        - Afficher ce message d'aide"
            echo ""
            echo "Options de Résolution de Conflits:"
            echo "  prompt     - Arrêter et demander la résolution (défaut)"
            echo "  overwrite  - Écraser les éléments existants"
            echo "  rename     - Renommer automatiquement avec suffixe compteur"
            echo "  skip       - Ignorer les opérations en conflit"
            echo ""
            echo "Fonctionnalités:"
            echo "  • Validation de sécurité et création automatique de sauvegarde"
            echo "  • Résolution de conflits avec stratégies multiples"
            echo "  • Vérification de conformité aux heures ouvrables"
            echo "  • Journalisation d'audit complète"
            echo "  • Vérification d'intégrité"
            echo "  • Opérations en lot avec surveillance des progrès"
            echo "  • Nettoyage automatique des sauvegardes"
            ;;
    esac
}

# Exécuter la fonction principale avec tous les arguments
main "$@"

Commandes de Référence Rapide

Opérations de Fichier Unique

# Déplacer un fichier avec toutes les fonctionnalités d'entreprise
./move_manager.sh move-file "/Users/admin/document.pdf" "/Users/shared/documents/document.pdf"

# Déplacer un fichier avec résolution de conflit par écrasement
./move_manager.sh move-file "/source/file.txt" "/destination/file.txt" overwrite

# Déplacer un fichier avec renommage automatique en cas de conflit
./move_manager.sh move-file "/source/file.txt" "/destination/file.txt" rename

# Déplacer un fichier sans création de sauvegarde
./move_manager.sh move-file "/source/file.txt" "/destination/file.txt" prompt false

Opérations de Répertoire

# Déplacer un répertoire avec tout son contenu
./move_manager.sh move-directory "/Users/admin/project" "/Users/shared/projects/project"

# Déplacer un répertoire avec renommage en cas de conflit
./move_manager.sh move-directory "/source/folder" "/destination/folder" rename

Opérations de Renommage

# Renommer un fichier
./move_manager.sh rename "/Users/admin/ancienfichier.txt" "nouveaufichier.txt"

# Renommer un répertoire
./move_manager.sh rename "/Users/admin/ancien_dossier" "nouveau_dossier"

# Renommer sans sauvegarde
./move_manager.sh rename "/path/to/item" "nouveau_nom" false

Exemples d'Intégration

Intégration JAMF Pro

#!/bin/bash

# Script JAMF Pro pour les déplacements de fichiers d'entreprise
# Paramètres: $4 = operation_type, $5 = source_path, $6 = destination_path, $7 = conflict_resolution

OPERATION_TYPE="$4"
SOURCE_PATH="$5"
DESTINATION_PATH="$6"
CONFLICT_RESOLUTION="${7:-rename}"

# Télécharger le gestionnaire de déplacement s'il n'est pas présent
if [[ ! -f "/usr/local/bin/roundfleet_move_manager.sh" ]]; then
    curl -o "/usr/local/bin/roundfleet_move_manager.sh" "https://scripts.roundfleet.com/move_manager.sh"
    chmod +x "/usr/local/bin/roundfleet_move_manager.sh"
fi

# Exécuter l'opération de déplacement
case "$OPERATION_TYPE" in
    "file")
        /usr/local/bin/roundfleet_move_manager.sh move-file "$SOURCE_PATH" "$DESTINATION_PATH" "$CONFLICT_RESOLUTION"
        ;;
    "directory")
        /usr/local/bin/roundfleet_move_manager.sh move-directory "$SOURCE_PATH" "$DESTINATION_PATH" "$CONFLICT_RESOLUTION"
        ;;
    "rename")
        /usr/local/bin/roundfleet_move_manager.sh rename "$SOURCE_PATH" "$DESTINATION_PATH"
        ;;
    *)
        echo "Type d'opération invalide: $OPERATION_TYPE"
        exit 1
        ;;
esac

exit $?

Dépannage

Problèmes Courants et Solutions

ProblèmeCauseSolution
Permission refuséePrivilèges insuffisantsExécuter avec sudo ou vérifier les permissions
Lien entre périphériquesDéplacement entre systèmes de fichiersUtiliser copie + suppression au lieu de mv
Fichier en cours d'utilisationApplication a le fichier ouvertFermer l'application ou utiliser l'option force
Conflit de nomsLa destination existeUtiliser une stratégie de résolution de conflits
Délai d'expirationGros répertoire/disque lentDiviser en opérations plus petites

Meilleures Pratiques

  1. Toujours tester sur un appareil unique avant le déploiement en flotte
  2. Utiliser la création de sauvegarde pour les opérations critiques
  3. Surveiller l'espace disque avant les grosses opérations de déplacement
  4. Choisir la résolution de conflit appropriée pour votre cas d'usage
  5. Nettoyage régulier des sauvegardes pour gérer l'usage du disque
  6. Réviser les journaux régulièrement pour les opérations échouées
  7. Utiliser les restrictions d'heures ouvrables pour les déplacements consommant des ressources
  8. Implémenter des conventions de nommage appropriées pour éviter les conflits

Ce système de gestion de déplacement d'entreprise fournit des fonctionnalités complètes de sécurité, sauvegarde et récupération tout en maintenant la simplicité et l'efficacité des opérations de déplacement de base pour une gestion efficace de flotte.

Gestion des Permissions de Fichiers et Dossiers sur macOS

Gérez les permissions de fichiers et dossiers sur vos appareils Roundfleet à l'aide d'outils en ligne de commande. Ce tutoriel couvre les modèles de permissions, la gestion de propriété, l'implémentation de contrôles d'accès et le déploiement de politiques de permissions à l'échelle de l'entreprise.

Comprendre le Système de Permissions macOS

macOS utilise un système de permissions basé sur Unix avec trois types de permissions et trois catégories d'utilisateurs :

Types de Permissions

  • Lecture (r) - Voir le contenu des fichiers ou lister le contenu des répertoires
  • Écriture (w) - Modifier le contenu des fichiers ou créer/supprimer des fichiers dans le répertoire
  • Exécution (x) - Exécuter un fichier comme programme ou accéder au répertoire

Catégories d'Utilisateurs

  • Propriétaire (u) - L'utilisateur qui a créé le fichier/dossier
  • Groupe (g) - Les utilisateurs appartenant au groupe du fichier
  • Autres (o) - Tous les autres utilisateurs du système

Représentations des Permissions

LectureÉcritureExécutionOctalSymbolique
✗✗✗0---
✗✗✓1--x
✗✓✗2-w-
✗✓✓3-wx
✓✗✗4r--
✓✗✓5r-x
✓✓✗6rw-
✓✓✓7rwx

Gestion Basique des Permissions

Afficher les Permissions de Fichier/Dossier

#!/bin/bash

# Afficher les permissions pour un fichier ou dossier spécifique
TARGET_PATH="$1"

if [[ -z "$TARGET_PATH" ]]; then
    echo "❌ Veuillez spécifier un chemin de fichier ou dossier"
    echo "Utilisation : $0 /chemin/vers/fichier/ou/dossier"
    exit 1
fi

if [[ ! -e "$TARGET_PATH" ]]; then
    echo "❌ Le chemin n'existe pas : $TARGET_PATH"
    exit 1
fi

echo "📋 Détails des permissions pour : $TARGET_PATH"
ls -la "$TARGET_PATH"

echo ""
echo "📊 Répartition détaillée des permissions :"
ls -la "$TARGET_PATH" | while read -r line; do
    if [[ "$line" != total* ]]; then
        echo "Sortie complète : $line"
        
        # Extraire la chaîne de permissions
        perms=$(echo "$line" | awk '{print $1}')
        if [[ ${#perms} -eq 10 ]]; then
            echo "Type de fichier : ${perms:0:1}"
            echo "Permissions propriétaire : ${perms:1:3}"
            echo "Permissions groupe : ${perms:4:3}"
            echo "Permissions autres : ${perms:7:3}"
        fi
    fi
done

Définir les Permissions avec la Notation Octale

#!/bin/bash

# Définir les permissions avec la notation octale (ex. 755, 644)
TARGET_PATH="$1"
PERMISSION="$2"

if [[ -z "$TARGET_PATH" || -z "$PERMISSION" ]]; then
    echo "❌ Veuillez spécifier le chemin et la permission"
    echo "Utilisation : $0 /chemin/vers/fichier 755"
    echo "Permissions courantes :"
    echo "  755 - rwxr-xr-x (propriétaire : complet, groupe/autres : lecture+exécution)"
    echo "  644 - rw-r--r-- (propriétaire : lecture+écriture, groupe/autres : lecture seule)"
    echo "  600 - rw------- (propriétaire : lecture+écriture, groupe/autres : aucun accès)"
    exit 1
fi

if [[ ! -e "$TARGET_PATH" ]]; then
    echo "❌ Le chemin n'existe pas : $TARGET_PATH"
    exit 1
fi

# Valider le format de permission
if [[ ! "$PERMISSION" =~ ^[0-7]{3}$ ]]; then
    echo "❌ Format de permission invalide. Utilisez 3 chiffres octaux (ex. 755)"
    exit 1
fi

echo "🔧 Définition des permissions $PERMISSION sur : $TARGET_PATH"

# Afficher les permissions actuelles
echo "Permissions actuelles :"
ls -la "$TARGET_PATH"

# Appliquer les nouvelles permissions
if chmod "$PERMISSION" "$TARGET_PATH"; then
    echo "✅ Permissions mises à jour avec succès"
    
    echo "Nouvelles permissions :"
    ls -la "$TARGET_PATH"
else
    echo "❌ Échec de la définition des permissions"
    exit 1
fi

Définir les Permissions avec la Notation Symbolique

#!/bin/bash

# Définir les permissions avec la notation symbolique (ex. u=rwx,g=rx,o=r)
TARGET_PATH="$1"
PERMISSION="$2"

if [[ -z "$TARGET_PATH" || -z "$PERMISSION" ]]; then
    echo "❌ Veuillez spécifier le chemin et la permission"
    echo "Utilisation : $0 /chemin/vers/fichier 'u=rwx,g=rx,o=r'"
    echo "Exemples de notation symbolique :"
    echo "  u=rwx,g=rx,o=rx  - Propriétaire : complet, Groupe/Autres : lecture+exécution"
    echo "  u=rw,g=r,o=r     - Propriétaire : lecture+écriture, Groupe/Autres : lecture seule"
    echo "  u=rw,g=,o=       - Propriétaire : lecture+écriture, Groupe/Autres : aucun accès"
    exit 1
fi

if [[ ! -e "$TARGET_PATH" ]]; then
    echo "❌ Le chemin n'existe pas : $TARGET_PATH"
    exit 1
fi

echo "🔧 Définition des permissions '$PERMISSION' sur : $TARGET_PATH"

# Afficher les permissions actuelles
echo "Permissions actuelles :"
ls -la "$TARGET_PATH"

# Appliquer les nouvelles permissions
if chmod "$PERMISSION" "$TARGET_PATH"; then
    echo "✅ Permissions mises à jour avec succès"
    
    echo "Nouvelles permissions :"
    ls -la "$TARGET_PATH"
else
    echo "❌ Échec de la définition des permissions"
    exit 1
fi

Gestion de la Propriété

Changer le Propriétaire du Fichier/Dossier

#!/bin/bash

# Changer la propriété d'un fichier ou dossier
TARGET_PATH="$1"
NEW_OWNER="$2"

if [[ -z "$TARGET_PATH" || -z "$NEW_OWNER" ]]; then
    echo "❌ Veuillez spécifier le chemin et le nouveau propriétaire"
    echo "Utilisation : $0 /chemin/vers/fichier nom_utilisateur"
    exit 1
fi

if [[ ! -e "$TARGET_PATH" ]]; then
    echo "❌ Le chemin n'existe pas : $TARGET_PATH"
    exit 1
fi

# Vérifier que l'utilisateur existe
if ! id "$NEW_OWNER" &>/dev/null; then
    echo "❌ L'utilisateur n'existe pas : $NEW_OWNER"
    echo "Utilisateurs disponibles :"
    dscl . list /Users | grep -v "^_"
    exit 1
fi

echo "👤 Changement du propriétaire de '$TARGET_PATH' vers : $NEW_OWNER"

# Afficher la propriété actuelle
echo "Propriété actuelle :"
ls -la "$TARGET_PATH"

# Changer la propriété
if sudo chown "$NEW_OWNER" "$TARGET_PATH"; then
    echo "✅ Propriété changée avec succès"
    
    echo "Nouvelle propriété :"
    ls -la "$TARGET_PATH"
else
    echo "❌ Échec du changement de propriété"
    exit 1
fi

Changer le Groupe du Fichier/Dossier

#!/bin/bash

# Changer la propriété de groupe d'un fichier ou dossier
TARGET_PATH="$1"
NEW_GROUP="$2"

if [[ -z "$TARGET_PATH" || -z "$NEW_GROUP" ]]; then
    echo "❌ Veuillez spécifier le chemin et le nouveau groupe"
    echo "Utilisation : $0 /chemin/vers/fichier nom_groupe"
    echo "Groupes courants : admin, staff, wheel, everyone"
    exit 1
fi

if [[ ! -e "$TARGET_PATH" ]]; then
    echo "❌ Le chemin n'existe pas : $TARGET_PATH"
    exit 1
fi

# Vérifier que le groupe existe
if ! dscl . read /Groups/"$NEW_GROUP" &>/dev/null; then
    echo "❌ Le groupe n'existe pas : $NEW_GROUP"
    echo "Groupes disponibles :"
    dscl . list /Groups | grep -v "^_"
    exit 1
fi

echo "👥 Changement du groupe de '$TARGET_PATH' vers : $NEW_GROUP"

# Afficher la propriété actuelle
echo "Propriété actuelle :"
ls -la "$TARGET_PATH"

# Changer la propriété de groupe
if sudo chgrp "$NEW_GROUP" "$TARGET_PATH"; then
    echo "✅ Propriété de groupe changée avec succès"
    
    echo "Nouvelle propriété :"
    ls -la "$TARGET_PATH"
else
    echo "❌ Échec du changement de propriété de groupe"
    exit 1
fi

Gestion Récursive des Permissions

Définir les Permissions de Manière Récursive

#!/bin/bash

# Définir les permissions de manière récursive sur un répertoire et tout son contenu
TARGET_DIR="$1"
DIR_PERMISSION="$2"
FILE_PERMISSION="$3"

if [[ -z "$TARGET_DIR" || -z "$DIR_PERMISSION" || -z "$FILE_PERMISSION" ]]; then
    echo "❌ Veuillez spécifier le chemin du répertoire et les permissions"
    echo "Utilisation : $0 /chemin/vers/répertoire 755 644"
    echo "Ceci définira les répertoires à 755 et les fichiers à 644"
    exit 1
fi

if [[ ! -d "$TARGET_DIR" ]]; then
    echo "❌ Le répertoire n'existe pas : $TARGET_DIR"
    exit 1
fi

echo "🔄 Définition des permissions récursives sur : $TARGET_DIR"
echo "Les répertoires seront définis à : $DIR_PERMISSION"
echo "Les fichiers seront définis à : $FILE_PERMISSION"

# Compter les éléments à traiter
dir_count=$(find "$TARGET_DIR" -type d | wc -l)
file_count=$(find "$TARGET_DIR" -type f | wc -l)

echo "Trouvé $dir_count répertoires et $file_count fichiers à traiter"

read -p "Continuer ? (y/N) : " -n 1 -r
echo
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
    echo "Opération annulée"
    exit 0
fi

# Définir les permissions sur les répertoires
echo "🗂️ Définition des permissions de répertoire..."
if find "$TARGET_DIR" -type d -exec chmod "$DIR_PERMISSION" {} \;; then
    echo "✅ Permissions de répertoire définies avec succès"
else
    echo "❌ Échec de la définition des permissions de répertoire"
    exit 1
fi

# Définir les permissions sur les fichiers
echo "📄 Définition des permissions de fichier..."
if find "$TARGET_DIR" -type f -exec chmod "$FILE_PERMISSION" {} \;; then
    echo "✅ Permissions de fichier définies avec succès"
else
    echo "❌ Échec de la définition des permissions de fichier"
    exit 1
fi

echo "✅ Mise à jour récursive des permissions terminée"

Script de Gestion des Permissions d'Entreprise

#!/bin/bash

# Outil de Gestion des Permissions Roundfleet
# Gestion complète des permissions de fichiers et dossiers pour les environnements d'entreprise

# Configuration
LOG_FILE="/var/log/roundfleet_permissions.log"
BACKUP_DIR="/var/backups/roundfleet/permissions"
POLICY_FILE="/etc/roundfleet/permission_policies.conf"
REPORT_DIR="/var/reports/roundfleet/permissions"

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

# Configurer les répertoires
setup_directories() {
    for dir in "$BACKUP_DIR" "$REPORT_DIR" "$(dirname "$POLICY_FILE")"; do
        if [[ ! -d "$dir" ]]; then
            sudo mkdir -p "$dir"
            log_action "Répertoire créé : $dir"
        fi
    done
}

# Créer une sauvegarde des permissions
create_permission_backup() {
    local target_path="$1"
    local backup_file="$BACKUP_DIR/permissions_$(basename "$target_path")_$(date +%Y%m%d_%H%M%S).txt"
    
    echo "📦 Création d'une sauvegarde des permissions pour : $target_path"
    
    if [[ -d "$target_path" ]]; then
        # Sauvegarder les permissions de répertoire de manière récursive
        find "$target_path" -exec ls -la {} \; > "$backup_file" 2>/dev/null
    else
        # Sauvegarder les permissions d'un seul fichier
        ls -la "$target_path" > "$backup_file" 2>/dev/null
    fi
    
    if [[ $? -eq 0 ]]; then
        echo "✅ Sauvegarde créée : $backup_file"
        log_action "Sauvegarde des permissions créée : $backup_file"
    else
        echo "⚠️ Attention : Impossible de créer la sauvegarde"
        log_action "Attention : Échec de la création de sauvegarde pour $target_path"
    fi
}

# Appliquer une politique de permissions d'entreprise
apply_enterprise_policy() {
    local policy_name="$1"
    
    echo "🏢 Application de la politique de permissions d'entreprise : $policy_name"
    log_action "Début de l'application de politique d'entreprise : $policy_name"
    
    case "$policy_name" in
        "documents_securises")
            apply_secure_documents_policy
            ;;
        "espace_partage")
            apply_shared_workspace_policy
            ;;
        "deploiement_applications")
            apply_application_deployment_policy
            ;;
        "durcissement_systeme")
            apply_system_hardening_policy
            ;;
        *)
            echo "❌ Politique inconnue : $policy_name"
            return 1
            ;;
    esac
}

# Politique de documents sécurisés
apply_secure_documents_policy() {
    echo "🔒 Application de la politique de permissions de documents sécurisés..."
    
    local secure_dirs=(
        "/Users/Shared/DocumentsSecurises"
        "/opt/roundfleet/confidentiel"
        "/var/secure"
    )
    
    for dir in "${secure_dirs[@]}"; do
        if [[ -d "$dir" ]]; then
            echo "Sécurisation du répertoire : $dir"
            
            # Créer une sauvegarde
            create_permission_backup "$dir"
            
            # Appliquer les permissions sécurisées (propriétaire : complet, groupe : lecture, autres : aucun)
            sudo find "$dir" -type d -exec chmod 750 {} \;
            sudo find "$dir" -type f -exec chmod 640 {} \;
            
            # Définir la propriété de groupe admin
            sudo chgrp -R admin "$dir"
            
            log_action "Permissions sécurisées appliquées à : $dir"
        fi
    done
}

# Politique d'espace de travail partagé
apply_shared_workspace_policy() {
    echo "👥 Application de la politique de permissions d'espace de travail partagé..."
    
    local shared_dirs=(
        "/Users/Shared/TravailEquipe"
        "/opt/roundfleet/partage"
        "/var/shared"
    )
    
    for dir in "${shared_dirs[@]}"; do
        if [[ -d "$dir" ]]; then
            echo "Configuration du répertoire partagé : $dir"
            
            # Créer une sauvegarde
            create_permission_backup "$dir"
            
            # Appliquer les permissions partagées (propriétaire : complet, groupe : complet, autres : lecture)
            sudo find "$dir" -type d -exec chmod 775 {} \;
            sudo find "$dir" -type f -exec chmod 664 {} \;
            
            # Définir la propriété de groupe staff
            sudo chgrp -R staff "$dir"
            
            log_action "Permissions partagées appliquées à : $dir"
        fi
    done
}

# Politique de déploiement d'applications
apply_application_deployment_policy() {
    echo "📱 Application de la politique de permissions de déploiement d'applications..."
    
    local app_dirs=(
        "/Applications"
        "/opt/roundfleet/applications"
        "/usr/local/bin"
    )
    
    for dir in "${app_dirs[@]}"; do
        if [[ -d "$dir" ]]; then
            echo "Sécurisation du répertoire d'applications : $dir"
            
            # Créer une sauvegarde
            create_permission_backup "$dir"
            
            # Appliquer les permissions d'applications (propriétaire : complet, groupe/autres : lecture+exécution)
            sudo find "$dir" -type d -exec chmod 755 {} \;
            sudo find "$dir" -type f -name "*.app" -exec chmod 755 {} \;
            sudo find "$dir" -type f ! -name "*.app" -exec chmod 644 {} \;
            
            # Définir la propriété admin
            sudo chown -R root:admin "$dir"
            
            log_action "Permissions d'applications appliquées à : $dir"
        fi
    done
}

# Politique de durcissement système
apply_system_hardening_policy() {
    echo "🛡️ Application de la politique de permissions de durcissement système..."
    
    local system_dirs=(
        "/etc"
        "/var/log"
        "/usr/bin"
        "/usr/sbin"
    )
    
    for dir in "${system_dirs[@]}"; do
        if [[ -d "$dir" ]]; then
            echo "Durcissement du répertoire système : $dir"
            
            # Créer une sauvegarde
            create_permission_backup "$dir"
            
            # Appliquer les permissions restrictives
            case "$dir" in
                "/etc")
                    sudo find "$dir" -type f -exec chmod 644 {} \;
                    sudo find "$dir" -type d -exec chmod 755 {} \;
                    ;;
                "/var/log")
                    sudo find "$dir" -type f -exec chmod 640 {} \;
                    sudo find "$dir" -type d -exec chmod 750 {} \;
                    ;;
                "/usr/bin"|"/usr/sbin")
                    sudo find "$dir" -type f -exec chmod 755 {} \;
                    sudo find "$dir" -type d -exec chmod 755 {} \;
                    ;;
            esac
            
            # Assurer la propriété root
            sudo chown -R root:wheel "$dir"
            
            log_action "Durcissement système appliqué à : $dir"
        fi
    done
}

# Auditer la conformité des permissions
audit_permissions() {
    local target_path="$1"
    local audit_file="$REPORT_DIR/audit_permissions_$(date +%Y%m%d_%H%M%S).txt"
    
    echo "🔍 Audit des permissions pour : $target_path"
    
    {
        echo "Rapport d'Audit des Permissions Roundfleet"
        echo "Généré : $(date)"
        echo "Cible : $target_path"
        echo "Hôte : $(hostname)"
        echo "=================================="
        echo ""
        
        if [[ -d "$target_path" ]]; then
            echo "=== Structure de Répertoire et Permissions ==="
            find "$target_path" -exec ls -la {} \; 2>/dev/null
            echo ""
            
            echo "=== Résumé des Permissions ==="
            echo "Total d'éléments : $(find "$target_path" | wc -l)"
            echo "Répertoires : $(find "$target_path" -type d | wc -l)"
            echo "Fichiers : $(find "$target_path" -type f | wc -l)"
            echo ""
            
            echo "=== Fichiers Accessibles en Écriture Globale (Risque de Sécurité) ==="
            find "$target_path" -type f -perm -002 -ls 2>/dev/null || echo "Aucun trouvé"
            echo ""
            
            echo "=== Fichiers SUID/SGID ==="
            find "$target_path" -type f \( -perm -4000 -o -perm -2000 \) -ls 2>/dev/null || echo "Aucun trouvé"
            echo ""
            
            echo "=== Fichiers sans Propriétaire/Groupe ==="
            find "$target_path" -nouser -o -nogroup 2>/dev/null || echo "Aucun trouvé"
            
        else
            echo "=== Permissions de Fichier Unique ==="
            ls -la "$target_path"
        fi
        
    } > "$audit_file"
    
    echo "📊 Rapport d'audit sauvegardé dans : $audit_file"
    log_action "Audit des permissions terminé : $audit_file"
}

# Fonction d'exécution principale
main() {
    local action="${1:-help}"
    local target="${2:-}"
    local permission="${3:-}"
    
    log_action "=== Gestion des Permissions Roundfleet Démarrée ==="
    
    setup_directories
    
    case "$action" in
        "voir")
            if [[ -n "$target" ]]; then
                audit_permissions "$target"
            else
                echo "❌ Veuillez spécifier le chemin cible"
                echo "Utilisation : $0 voir /chemin/vers/cible"
            fi
            ;;
        "definir")
            if [[ -n "$target" && -n "$permission" ]]; then
                create_permission_backup "$target"
                chmod "$permission" "$target"
                log_action "Permissions $permission définies sur $target"
            else
                echo "❌ Veuillez spécifier la cible et la permission"
                echo "Utilisation : $0 definir /chemin/vers/cible 755"
            fi
            ;;
        "politique")
            if [[ -n "$target" ]]; then
                apply_enterprise_policy "$target"
            else
                echo "❌ Veuillez spécifier le nom de la politique"
                echo "Politiques disponibles : documents_securises, espace_partage, deploiement_applications, durcissement_systeme"
            fi
            ;;
        "audit")
            if [[ -n "$target" ]]; then
                audit_permissions "$target"
            else
                audit_permissions "/Users"
            fi
            ;;
        "rapport")
            generate_permission_report
            ;;
        "aide"|*)
            echo "Outil de Gestion des Permissions Roundfleet"
            echo "Utilisation : $0 [action] [cible] [permission]"
            echo ""
            echo "Actions :"
            echo "  voir [chemin]       - Voir les permissions pour le chemin"
            echo "  definir [chemin] [perm] - Définir les permissions (ex. 755)"
            echo "  politique [nom]     - Appliquer une politique de permissions d'entreprise"
            echo "  audit [chemin]      - Auditer les permissions et la sécurité"
            echo "  rapport             - Générer un rapport complet"
            echo "  aide                - Afficher ce message d'aide"
            echo ""
            echo "Politiques d'Entreprise :"
            echo "  documents_securises     - Appliquer les permissions de documents sécurisés"
            echo "  espace_partage          - Configurer les permissions d'espace de travail partagé"
            echo "  deploiement_applications - Définir les permissions de répertoire d'applications"
            echo "  durcissement_systeme    - Appliquer le durcissement de sécurité système"
            ;;
    esac
    
    log_action "=== Gestion des Permissions Roundfleet Terminée ==="
}

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

Scénarios de Permissions Courants

Stockage de Fichiers Sécurisé

# Créer un répertoire sécurisé avec accès restreint
sudo mkdir -p /opt/roundfleet/securise
sudo chmod 700 /opt/roundfleet/securise
sudo chown root:admin /opt/roundfleet/securise

Répertoire d'Équipe Partagé

# Créer un répertoire partagé pour la collaboration d'équipe
sudo mkdir -p /Users/Shared/ProjetEquipe
sudo chmod 775 /Users/Shared/ProjetEquipe
sudo chgrp staff /Users/Shared/ProjetEquipe

Déploiement d'Applications

# Définir les permissions standard d'application
sudo chmod 755 /Applications/MonApp.app
sudo chown root:admin /Applications/MonApp.app

Guide de Référence des Permissions

Modèles de Permissions Courants

Cas d'UsageOctalSymboliqueDescription
Fichier privé600rw-------Propriétaire lecture/écriture uniquement
Fichier partagé644rw-r--r--Propriétaire écriture, autres lecture
Exécutable755rwxr-xr-xPropriétaire complet, autres lecture/exécution
Répertoire sécurisé700rwx------Accès propriétaire uniquement
Répertoire partagé755rwxr-xr-xPropriétaire complet, autres lecture/liste
Répertoire d'équipe775rwxrwxr-xPropriétaire/groupe complet, autres lecture

Référence des Commandes Rapides

# Voir les permissions
ls -la nomfichier
stat -f "%A %N" nomfichier

# Définir les permissions
chmod 755 nomfichier              # Notation octale
chmod u=rwx,g=rx,o=rx nomfichier  # Notation symbolique

# Changer la propriété
chown utilisateur:groupe nomfichier # Changer utilisateur et groupe
chown utilisateur nomfichier        # Changer utilisateur uniquement
chgrp groupe nomfichier             # Changer groupe uniquement

# Opérations récursives
chmod -R 755 repertoire/                # Appliquer à tout le contenu
chown -R utilisateur:groupe repertoire/ # Changer propriété récursivement

Considérations de Sécurité

  • Principe du Moindre Privilège - Accorder les permissions minimales nécessaires
  • Audits Réguliers - Surveiller les changements de permissions et la conformité
  • Sauvegarde Avant Changements - Toujours créer des sauvegardes avant modifications
  • Fichiers Accessibles en Écriture Globale - Éviter ou contrôler soigneusement les permissions d'écriture globale
  • Fichiers SUID/SGID - Surveiller et limiter les fichiers à permissions spéciales
  • Protection des Répertoires Système - Maintenir des permissions strictes sur les répertoires système

Dépannage

Erreurs de Permission Refusée

# Vérifier les permissions actuelles
ls -la /chemin/vers/fichier

# Vérifier si vous avez accès sudo
sudo -l

# Corriger les problèmes de permissions courants
sudo chmod +r /chemin/vers/fichier    # Ajouter permission de lecture
sudo chmod +x /chemin/vers/fichier    # Ajouter permission d'exécution

Problèmes de Propriété

# Vérifier la propriété actuelle
ls -la /chemin/vers/fichier

# Corriger la propriété
sudo chown $(whoami) /chemin/vers/fichier    # Faire de l'utilisateur actuel le propriétaire
sudo chgrp staff /chemin/vers/fichier        # Définir au groupe staff

Notes Importantes

  • Privilèges administrateur peuvent être requis pour les fichiers système
  • Sauvegarder les permissions avant d'apporter des modifications pour une restauration facile
  • Tester les changements sur des appareils individuels avant le déploiement de flotte
  • Documenter les politiques de permissions pour la conformité et l'audit
  • Surveiller la sécurité avec des audits de permissions réguliers

Gestion du Chiffrement de Fichiers sur macOS

Sécurisez les données sensibles sur vos appareils Roundfleet en utilisant des techniques avancées de chiffrement et déchiffrement de fichiers. Ce tutoriel couvre les méthodes de chiffrement OpenSSL, la gestion des clés d'entreprise, les politiques de sécurité, et la surveillance de conformité pour une protection complète des données.

Comprendre le Chiffrement de Fichiers sur macOS

Le chiffrement de fichiers protège les données sensibles en les convertissant en un format illisible qui ne peut être accessible qu'avec la clé de déchiffrement correcte. Bien que macOS offre FileVault pour le chiffrement complet du disque, le chiffrement sélectif de fichiers fournit un contrôle granulaire sur des documents et fichiers de données spécifiques.

Méthodes de Chiffrement Clés

  • DES (Data Encryption Standard) - Chiffrement hérité pour protection basique
  • AES-256-CBC - Standard de Chiffrement Avancé avec clés 256-bit
  • AES-256-GCM - AES avec Mode Galois/Counter pour chiffrement authentifié
  • ChaCha20-Poly1305 - Chiffrement de flux moderne avec authentification
  • RSA - Chiffrement à clé publique pour échange de clés et signatures numériques

Chiffrement de Fichier Basique

Chiffrement de Fichier Simple

#!/bin/bash

# Chiffrement de fichier basique utilisant OpenSSL
INPUT_FILE="/chemin/vers/original.txt"
OUTPUT_FILE="/chemin/vers/chiffre.txt"
PASSWORD="votre_mot_de_passe_securise"

openssl des -in "$INPUT_FILE" -out "$OUTPUT_FILE" -k "$PASSWORD"

echo "Fichier chiffré avec succès : $OUTPUT_FILE"

Chiffrement de Fichier Amélioré

#!/bin/bash

# Chiffrement de fichier amélioré avec validation
encrypt_file() {
    local input_file="$1"
    local output_file="$2"
    local password="$3"
    local algorithm="${4:-aes-256-cbc}"
    
    # Valider les paramètres d'entrée
    if [[ -z "$input_file" ]] || [[ -z "$output_file" ]] || [[ -z "$password" ]]; then
        echo "❌ Erreur : Paramètres requis manquants"
        echo "Usage : encrypt_file <fichier_entree> <fichier_sortie> <mot_de_passe> [algorithme]"
        return 1
    fi
    
    # Vérifier si le fichier d'entrée existe
    if [[ ! -f "$input_file" ]]; then
        echo "❌ Erreur : Le fichier d'entrée n'existe pas : $input_file"
        return 1
    fi
    
    # Créer le répertoire de sortie s'il n'existe pas
    local output_dir
    output_dir=$(dirname "$output_file")
    mkdir -p "$output_dir"
    
    echo "🔒 Chiffrement du fichier avec $algorithm..."
    echo "  Entrée : $input_file"
    echo "  Sortie : $output_file"
    
    # Effectuer le chiffrement
    if openssl "$algorithm" -in "$input_file" -out "$output_file" -k "$password" 2>/dev/null; then
        echo "✅ Fichier chiffré avec succès"
        
        # Vérifier que le fichier chiffré a été créé
        if [[ -f "$output_file" ]]; then
            local file_size
            file_size=$(stat -f%z "$output_file" 2>/dev/null || echo "0")
            echo "  Taille du fichier chiffré : ${file_size} octets"
        fi
        
        return 0
    else
        echo "❌ Échec du chiffrement"
        return 1
    fi
}

# Exemples d'usage
encrypt_file "/Users/jean/Documents/sensible.txt" "/Users/jean/Chiffre/sensible.enc" "monmotdepasse123" "aes-256-cbc"

Chiffrement AES-256 Fort

#!/bin/bash

# Chiffrement AES-256-CBC avancé avec sel
encrypt_file_aes256() {
    local input_file="$1"
    local output_file="$2"
    local password="$3"
    
    echo "🔐 Exécution du chiffrement AES-256-CBC..."
    
    # Utiliser AES-256-CBC avec sel pour sécurité renforcée
    if openssl aes-256-cbc -salt -in "$input_file" -out "$output_file" -k "$password"; then
        echo "✅ Chiffrement AES-256 terminé"
        
        # Générer le hachage du fichier pour vérification d'intégrité
        local hash
        hash=$(shasum -a 256 "$output_file" | cut -d' ' -f1)
        echo "  Hachage du fichier (SHA-256) : $hash"
        
        # Sauvegarder le hachage pour vérification
        echo "$hash" > "${output_file}.sha256"
        echo "  Hachage sauvegardé dans : ${output_file}.sha256"
        
        return 0
    else
        echo "❌ Échec du chiffrement AES-256"
        return 1
    fi
}

# Exemple d'usage
encrypt_file_aes256 "/chemin/vers/document.pdf" "/chemin/vers/document.pdf.enc" "mot_de_passe_fort_123!"

Déchiffrement de Fichier

Déchiffrement de Fichier Basique

#!/bin/bash

# Déchiffrement de fichier basique utilisant OpenSSL
INPUT_FILE="/chemin/vers/chiffre.txt"
OUTPUT_FILE="/chemin/vers/dechiffre.txt"
PASSWORD="votre_mot_de_passe_securise"

openssl des -d -in "$INPUT_FILE" -out "$OUTPUT_FILE" -k "$PASSWORD"

echo "Fichier déchiffré avec succès : $OUTPUT_FILE"

Déchiffrement de Fichier Avancé

#!/bin/bash

# Déchiffrement de fichier avancé avec vérification
decrypt_file() {
    local input_file="$1"
    local output_file="$2"
    local password="$3"
    local algorithm="${4:-aes-256-cbc}"
    
    # Valider les paramètres
    if [[ -z "$input_file" ]] || [[ -z "$output_file" ]] || [[ -z "$password" ]]; then
        echo "❌ Erreur : Paramètres requis manquants"
        echo "Usage : decrypt_file <fichier_entree> <fichier_sortie> <mot_de_passe> [algorithme]"
        return 1
    fi
    
    # Vérifier si le fichier chiffré existe
    if [[ ! -f "$input_file" ]]; then
        echo "❌ Erreur : Le fichier chiffré n'existe pas : $input_file"
        return 1
    fi
    
    echo "🔓 Déchiffrement du fichier avec $algorithm..."
    echo "  Entrée : $input_file"
    echo "  Sortie : $output_file"
    
    # Créer le répertoire de sortie
    local output_dir
    output_dir=$(dirname "$output_file")
    mkdir -p "$output_dir"
    
    # Effectuer le déchiffrement
    if openssl "$algorithm" -d -in "$input_file" -out "$output_file" -k "$password" 2>/dev/null; then
        echo "✅ Fichier déchiffré avec succès"
        
        # Vérifier le hachage si disponible
        verify_file_integrity "$input_file" "$output_file"
        
        return 0
    else
        echo "❌ Échec du déchiffrement - mot de passe incorrect ou fichier corrompu"
        return 1
    fi
}

# Vérifier l'intégrité du fichier
verify_file_integrity() {
    local encrypted_file="$1"
    local decrypted_file="$2"
    local hash_file="${encrypted_file}.sha256"
    
    if [[ -f "$hash_file" ]]; then
        echo "🔍 Vérification de l'intégrité du fichier..."
        local stored_hash expected_hash
        stored_hash=$(cat "$hash_file")
        
        # Pour la vérification, nous avons besoin du hachage du fichier original (ceci est un exemple simplifié)
        if [[ -f "$decrypted_file" ]]; then
            echo "  Vérification d'intégrité du fichier terminée"
        fi
    fi
}

# Exemple d'usage
decrypt_file "/chemin/vers/document.pdf.enc" "/chemin/vers/document_recupere.pdf" "mot_de_passe_fort_123!" "aes-256-cbc"

Opérations de Fichiers par Lots

Chiffrer Plusieurs Fichiers

#!/bin/bash

# Chiffrement par lots de plusieurs fichiers
batch_encrypt() {
    local source_dir="$1"
    local encrypted_dir="$2"
    local password="$3"
    local file_pattern="${4:-*}"
    
    echo "📁 Démarrage du chiffrement par lots..."
    echo "  Source : $source_dir"
    echo "  Cible : $encrypted_dir"
    echo "  Motif : $file_pattern"
    
    # Créer le répertoire chiffré
    mkdir -p "$encrypted_dir"
    
    local count=0
    local success=0
    
    # Traiter les fichiers correspondant au motif
    while IFS= read -r -d '' file; do
        if [[ -f "$file" ]]; then
            local relative_path
            relative_path=$(realpath --relative-to="$source_dir" "$file")
            local encrypted_file="$encrypted_dir/${relative_path}.enc"
            
            # Créer les sous-répertoires si nécessaire
            mkdir -p "$(dirname "$encrypted_file")"
            
            echo "  Traitement : $relative_path"
            
            if openssl aes-256-cbc -salt -in "$file" -out "$encrypted_file" -k "$password" 2>/dev/null; then
                ((success++))
                echo "    ✅ Chiffré"
            else
                echo "    ❌ Échec"
            fi
            
            ((count++))
        fi
    done < <(find "$source_dir" -name "$file_pattern" -type f -print0)
    
    echo "🎉 Chiffrement par lots terminé : $success/$count fichiers chiffrés"
}

# Exemple d'usage
batch_encrypt "/Users/jean/Documents" "/Users/jean/Chiffre" "mot_de_passe_lot123" "*.txt"

Déchiffrer Plusieurs Fichiers

#!/bin/bash

# Déchiffrement par lots de plusieurs fichiers
batch_decrypt() {
    local encrypted_dir="$1"
    local output_dir="$2"
    local password="$3"
    
    echo "📂 Démarrage du déchiffrement par lots..."
    echo "  Source : $encrypted_dir"
    echo "  Cible : $output_dir"
    
    # Créer le répertoire de sortie
    mkdir -p "$output_dir"
    
    local count=0
    local success=0
    
    # Traiter les fichiers .enc
    while IFS= read -r -d '' file; do
        if [[ -f "$file" && "$file" == *.enc ]]; then
            local relative_path
            relative_path=$(realpath --relative-to="$encrypted_dir" "$file")
            # Supprimer l'extension .enc
            local decrypted_file="$output_dir/${relative_path%.enc}"
            
            # Créer les sous-répertoires si nécessaire
            mkdir -p "$(dirname "$decrypted_file")"
            
            echo "  Traitement : $relative_path"
            
            if openssl aes-256-cbc -d -in "$file" -out "$decrypted_file" -k "$password" 2>/dev/null; then
                ((success++))
                echo "    ✅ Déchiffré"
            else
                echo "    ❌ Échec"
            fi
            
            ((count++))
        fi
    done < <(find "$encrypted_dir" -name "*.enc" -type f -print0)
    
    echo "🎉 Déchiffrement par lots terminé : $success/$count fichiers déchiffrés"
}

# Exemple d'usage
batch_decrypt "/Users/jean/Chiffre" "/Users/jean/Dechiffre" "mot_de_passe_lot123"

Script de Gestion de Chiffrement d'Entreprise

#!/bin/bash

# Système de Gestion de Chiffrement de Fichiers Roundfleet
# Gestion complète de chiffrement/déchiffrement pour environnements d'entreprise

# Configuration
LOG_FILE="/var/log/roundfleet_encryption.log"
CONFIG_FILE="/etc/roundfleet/encryption_policy.conf"
KEY_STORE="/var/lib/roundfleet/keys"
AUDIT_LOG="/var/log/roundfleet_encryption_audit.log"

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

# Journalisation d'audit
audit_log() {
    echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> "$AUDIT_LOG"
}

# Configurer l'environnement
setup_environment() {
    sudo mkdir -p "$(dirname "$LOG_FILE")" 2>/dev/null
    sudo mkdir -p "$(dirname "$CONFIG_FILE")" 2>/dev/null
    sudo mkdir -p "$KEY_STORE" 2>/dev/null
    sudo chmod 700 "$KEY_STORE" 2>/dev/null
}

# Charger la configuration
load_config() {
    if [[ -f "$CONFIG_FILE" ]]; then
        source "$CONFIG_FILE"
        log_action "Configuration chargée depuis $CONFIG_FILE"
    else
        # Configuration par défaut
        DEFAULT_ALGORITHM="aes-256-cbc"
        REQUIRE_STRONG_PASSWORDS=true
        MIN_PASSWORD_LENGTH=12
        ENCRYPTION_ENABLED=true
        AUTO_BACKUP_KEYS=true
        COMPLIANCE_MODE="HIPAA"  # HIPAA, PCI-DSS, GDPR
        
        log_action "Utilisation de la configuration de chiffrement par défaut"
    fi
}

# Valider la force du mot de passe
validate_password() {
    local password="$1"
    
    if [[ "$REQUIRE_STRONG_PASSWORDS" != "true" ]]; then
        return 0
    fi
    
    # Vérifier la longueur minimale
    if [[ ${#password} -lt $MIN_PASSWORD_LENGTH ]]; then
        echo "❌ Mot de passe trop court (minimum $MIN_PASSWORD_LENGTH caractères)"
        return 1
    fi
    
    # Vérifier la complexité
    local has_upper has_lower has_digit has_special
    has_upper=$(echo "$password" | grep -c '[A-Z]')
    has_lower=$(echo "$password" | grep -c '[a-z]')
    has_digit=$(echo "$password" | grep -c '[0-9]')
    has_special=$(echo "$password" | grep -c '[^A-Za-z0-9]')
    
    if [[ $has_upper -eq 0 ]] || [[ $has_lower -eq 0 ]] || [[ $has_digit -eq 0 ]] || [[ $has_special -eq 0 ]]; then
        echo "❌ Le mot de passe doit contenir majuscule, minuscule, chiffre et caractère spécial"
        return 1
    fi
    
    return 0
}

# Générer une clé sécurisée
generate_secure_key() {
    local key_name="$1"
    local key_file="$KEY_STORE/${key_name}.key"
    
    # Générer une clé aléatoire de 256 bits
    openssl rand -base64 32 > "$key_file"
    chmod 600 "$key_file"
    
    log_action "Clé sécurisée générée : $key_name"
    audit_log "CLE_GENEREE : $key_name par $(whoami)"
    
    echo "$key_file"
}

# Chiffrer un fichier avec fonctionnalités d'entreprise
enterprise_encrypt() {
    local input_file="$1"
    local output_file="$2"
    local key_name="$3"
    local algorithm="${4:-$DEFAULT_ALGORITHM}"
    
    if [[ "$ENCRYPTION_ENABLED" != "true" ]]; then
        echo "❌ Le chiffrement est désactivé par la politique"
        return 1
    fi
    
    # Valider le fichier d'entrée
    if [[ ! -f "$input_file" ]]; then
        echo "❌ Fichier d'entrée non trouvé : $input_file"
        return 1
    fi
    
    # Obtenir ou générer la clé
    local key_file="$KEY_STORE/${key_name}.key"
    if [[ ! -f "$key_file" ]]; then
        echo "🔑 Génération d'une nouvelle clé de chiffrement : $key_name"
        generate_secure_key "$key_name"
    fi
    
    local password
    password=$(cat "$key_file")
    
    echo "🔒 Démarrage du chiffrement d'entreprise..."
    echo "  Algorithme : $algorithm"
    echo "  Entrée : $input_file"
    echo "  Sortie : $output_file"
    echo "  Clé : $key_name"
    
    # Créer le fichier de métadonnées
    local metadata_file="${output_file}.meta"
    cat > "$metadata_file" << EOF
{
    "algorithm": "$algorithm",
    "key_name": "$key_name",
    "encrypted_by": "$(whoami)",
    "timestamp": "$(date -u +%Y-%m-%dT%H:%M:%SZ)",
    "hostname": "$(hostname)",
    "compliance_mode": "$COMPLIANCE_MODE",
    "file_size": $(stat -f%z "$input_file"),
    "original_name": "$(basename "$input_file")"
}
EOF
    
    # Effectuer le chiffrement
    if openssl "$algorithm" -salt -in "$input_file" -out "$output_file" -pass file:"$key_file"; then
        # Générer le hachage d'intégrité
        local hash
        hash=$(shasum -a 256 "$output_file" | cut -d' ' -f1)
        echo "  \"integrity_hash\": \"$hash\"" >> "$metadata_file"
        
        log_action "Fichier chiffré : $input_file -> $output_file (clé : $key_name)"
        audit_log "CHIFFREMENT : $input_file -> $output_file par $(whoami) utilisant $key_name"
        
        echo "✅ Chiffrement d'entreprise terminé"
        echo "  Métadonnées : $metadata_file"
        
        # Sauvegarder la clé si activé
        if [[ "$AUTO_BACKUP_KEYS" == "true" ]]; then
            backup_key "$key_name"
        fi
        
        return 0
    else
        echo "❌ Échec du chiffrement"
        log_action "Échec du chiffrement : $input_file"
        return 1
    fi
}

# Déchiffrer un fichier avec fonctionnalités d'entreprise
enterprise_decrypt() {
    local input_file="$1"
    local output_file="$2"
    local key_name="$3"
    
    # Vérifier si le fichier chiffré existe
    if [[ ! -f "$input_file" ]]; then
        echo "❌ Fichier chiffré non trouvé : $input_file"
        return 1
    fi
    
    # Charger les métadonnées
    local metadata_file="${input_file}.meta"
    if [[ ! -f "$metadata_file" ]]; then
        echo "⚠️  Fichier de métadonnées non trouvé, utilisation de l'algorithme par défaut"
        local algorithm="$DEFAULT_ALGORITHM"
    else
        local algorithm
        algorithm=$(grep '"algorithm"' "$metadata_file" | cut -d'"' -f4)
        echo "📋 Métadonnées chargées : algorithm=$algorithm"
    fi
    
    # Obtenir la clé
    local key_file="$KEY_STORE/${key_name}.key"
    if [[ ! -f "$key_file" ]]; then
        echo "❌ Clé de déchiffrement non trouvée : $key_name"
        return 1
    fi
    
    echo "🔓 Démarrage du déchiffrement d'entreprise..."
    echo "  Algorithme : $algorithm"
    echo "  Entrée : $input_file"
    echo "  Sortie : $output_file"
    echo "  Clé : $key_name"
    
    # Effectuer le déchiffrement
    if openssl "$algorithm" -d -in "$input_file" -out "$output_file" -pass file:"$key_file"; then
        # Vérifier l'intégrité si le hachage est disponible
        if [[ -f "$metadata_file" ]]; then
            verify_integrity "$input_file" "$metadata_file"
        fi
        
        log_action "Fichier déchiffré : $input_file -> $output_file (clé : $key_name)"
        audit_log "DECHIFFREMENT : $input_file -> $output_file par $(whoami) utilisant $key_name"
        
        echo "✅ Déchiffrement d'entreprise terminé"
        return 0
    else
        echo "❌ Échec du déchiffrement"
        log_action "Échec du déchiffrement : $input_file"
        audit_log "ECHEC_DECHIFFREMENT : $input_file par $(whoami)"
        return 1
    fi
}

# Vérifier l'intégrité du fichier
verify_integrity() {
    local encrypted_file="$1"
    local metadata_file="$2"
    
    if [[ -f "$metadata_file" ]]; then
        local stored_hash current_hash
        stored_hash=$(grep '"integrity_hash"' "$metadata_file" | cut -d'"' -f4)
        current_hash=$(shasum -a 256 "$encrypted_file" | cut -d' ' -f1)
        
        if [[ "$stored_hash" == "$current_hash" ]]; then
            echo "✅ Intégrité du fichier vérifiée"
        else
            echo "⚠️  Échec de la vérification d'intégrité - le fichier peut être corrompu"
            log_action "Échec de la vérification d'intégrité : $encrypted_file"
        fi
    fi
}

# Sauvegarder la clé de chiffrement
backup_key() {
    local key_name="$1"
    local key_file="$KEY_STORE/${key_name}.key"
    local backup_dir="$KEY_STORE/backups"
    
    mkdir -p "$backup_dir"
    
    local backup_file="$backup_dir/${key_name}_$(date +%Y%m%d_%H%M%S).key"
    cp "$key_file" "$backup_file"
    
    log_action "Clé sauvegardée : $key_name -> $backup_file"
}

# Générer un rapport de chiffrement
generate_encryption_report() {
    local report_file="/tmp/roundfleet_encryption_report_$(date +%Y%m%d_%H%M%S).txt"
    
    {
        echo "Rapport de Gestion de Chiffrement Roundfleet"
        echo "=========================================="
        echo "Généré : $(date)"
        echo "Nom d'hôte : $(hostname)"
        echo "Mode de Conformité : $COMPLIANCE_MODE"
        echo ""
        
        echo "Configuration :"
        echo "  Algorithme par Défaut : $DEFAULT_ALGORITHM"
        echo "  Mots de Passe Forts : $REQUIRE_STRONG_PASSWORDS"
        echo "  Longueur Min Mot de Passe : $MIN_PASSWORD_LENGTH"
        echo "  Chiffrement Activé : $ENCRYPTION_ENABLED"
        echo ""
        
        echo "Clés Disponibles :"
        if ls "$KEY_STORE"/*.key >/dev/null 2>&1; then
            for key_file in "$KEY_STORE"/*.key; do
                local key_name
                key_name=$(basename "$key_file" .key)
                echo "  $key_name ($(stat -f%Sm "$key_file"))"
            done
        else
            echo "  Aucune clé trouvée"
        fi
        echo ""
        
        echo "Activité de Chiffrement Récente :"
        if [[ -f "$AUDIT_LOG" ]]; then
            tail -10 "$AUDIT_LOG"
        else
            echo "  Aucune activité enregistrée"
        fi
        
    } > "$report_file"
    
    echo "📄 Rapport de chiffrement généré : $report_file"
    log_action "Rapport généré : $report_file"
}

# Fonction principale
main() {
    case "${1:-status}" in
        "encrypt")
            setup_environment
            load_config
            log_action "=== Demande de Chiffrement de Fichier ==="
            enterprise_encrypt "$2" "$3" "$4" "$5"
            ;;
        "decrypt")
            setup_environment
            load_config
            log_action "=== Demande de Déchiffrement de Fichier ==="
            enterprise_decrypt "$2" "$3" "$4"
            ;;
        "generate-key")
            setup_environment
            load_config
            log_action "=== Demande de Génération de Clé ==="
            generate_secure_key "$2"
            ;;
        "report")
            setup_environment
            load_config
            generate_encryption_report
            ;;
        "list-algorithms")
            echo "📋 Algorithmes de chiffrement disponibles :"
            openssl list-cipher-commands | tr ' ' '\n' | sort
            ;;
        "status"|*)
            setup_environment
            load_config
            echo "📊 Statut de Chiffrement Roundfleet :"
            echo "==================================="
            echo "Chiffrement Activé : $ENCRYPTION_ENABLED"
            echo "Algorithme par Défaut : $DEFAULT_ALGORITHM"
            echo "Mode de Conformité : $COMPLIANCE_MODE"
            echo "Magasin de Clés : $KEY_STORE"
            
            if ls "$KEY_STORE"/*.key >/dev/null 2>&1; then
                echo "Clés Disponibles : $(ls "$KEY_STORE"/*.key | wc -l)"
            else
                echo "Clés Disponibles : 0"
            fi
            ;;
    esac
}

# Exécuter la fonction principale avec les paramètres
main "$@"

Référence des Algorithmes de Chiffrement

Comparaison Rapide

AlgorithmeTaille de CléSécuritéPerformanceCas d'Usage
DES56-bitFaibleRapideSystèmes hérités uniquement
AES-128-CBC128-bitBonneRapideUsage général
AES-256-CBC256-bitExcellenteMoyenneHaute sécurité
AES-256-GCM256-bitExcellenteMoyenneChiffrement authentifié
ChaCha20256-bitExcellenteRapideAlternative moderne

Lister les Algorithmes Disponibles

# Afficher tous les algorithmes de chiffrement disponibles
openssl list-cipher-commands

# Algorithmes sécurisés communs
openssl enc -ciphers | grep -E "(aes|chacha)"

Meilleures Pratiques de Sécurité

Gestion des Mots de Passe

#!/bin/bash

# Générer un mot de passe sécurisé
generate_secure_password() {
    local length="${1:-16}"
    
    # Générer un mot de passe avec caractères mixtes
    openssl rand -base64 "$length" | tr -d "=+/" | cut -c1-"$length"
}

# Exemple : Générer un mot de passe de 20 caractères
secure_password=$(generate_secure_password 20)
echo "Mot de passe généré : $secure_password"

Rotation des Clés

#!/bin/bash

# Rotation des clés de chiffrement
rotate_encryption_key() {
    local old_key="$1"
    local new_key="$2"
    local files_dir="$3"
    
    echo "🔄 Rotation de la clé de chiffrement : $old_key -> $new_key"
    
    # Générer une nouvelle clé
    generate_secure_key "$new_key"
    
    # Re-chiffrer les fichiers avec la nouvelle clé
    while IFS= read -r -d '' file; do
        if [[ "$file" == *.enc ]]; then
            local temp_file="/tmp/temp_decrypt_$$"
            
            # Déchiffrer avec l'ancienne clé
            if enterprise_decrypt "$file" "$temp_file" "$old_key"; then
                # Re-chiffrer avec la nouvelle clé
                if enterprise_encrypt "$temp_file" "$file" "$new_key"; then
                    echo "  ✅ Clé rotée : $(basename "$file")"
                fi
            fi
            
            # Nettoyer
            rm -f "$temp_file"
        fi
    done < <(find "$files_dir" -name "*.enc" -type f -print0)
    
    echo "🎉 Rotation de clé terminée"
}

Dépannage

Problèmes Courants

  1. Le chiffrement échoue avec "bad decrypt"

    • Vérifier que l'algorithme correct est utilisé
    • Vérifier l'intégrité du fichier de mot de passe/clé
    • S'assurer d'un espace disque suffisant
  2. Erreurs de permission refusée

    • Vérifier les permissions des fichiers
    • Vérifier les droits d'accès au magasin de clés
    • Exécuter avec les privilèges utilisateur appropriés
  3. Fichiers chiffrés corrompus

    • Vérifier les hachages d'intégrité des fichiers
    • Vérifier les erreurs de disque
    • Restaurer depuis les sauvegardes si disponibles

Commandes de Vérification

# Tester le cycle de chiffrement/déchiffrement
test_encryption() {
    local test_file="/tmp/test_encrypt.txt"
    local encrypted_file="/tmp/test_encrypt.enc"
    local decrypted_file="/tmp/test_decrypt.txt"
    
    # Créer un fichier de test
    echo "Ceci est un fichier de test pour le chiffrement" > "$test_file"
    
    # Chiffrer
    openssl aes-256-cbc -in "$test_file" -out "$encrypted_file" -k "motdepassetest"
    
    # Déchiffrer
    openssl aes-256-cbc -d -in "$encrypted_file" -out "$decrypted_file" -k "motdepassetest"
    
    # Comparer
    if diff "$test_file" "$decrypted_file" >/dev/null; then
        echo "✅ Test de chiffrement/déchiffrement réussi"
    else
        echo "❌ Test de chiffrement/déchiffrement échoué"
    fi
    
    # Nettoyer
    rm -f "$test_file" "$encrypted_file" "$decrypted_file"
}

Notes Importantes

  • Sélection d'algorithme : Utiliser AES-256-CBC ou plus fort pour les données sensibles
  • Sécurité des mots de passe : Implémenter des politiques de mots de passe forts pour usage d'entreprise
  • Gestion des clés : Stocker et sauvegarder de manière sécurisée les clés de chiffrement
  • Conformité : S'assurer que les méthodes de chiffrement répondent aux exigences réglementaires
  • Performance : Considérer la taille des fichiers et les ressources système lors du choix des algorithmes
  • Stratégie de sauvegarde : Toujours maintenir des sauvegardes sécurisées des clés de chiffrement

Déploiement d'Entreprise

Pour le déploiement d'entreprise, considérer :

  1. Définition de politique - Établir des standards et procédures de chiffrement
  2. Gestion des clés - Implémenter un stockage et une rotation sécurisés des clés
  3. Surveillance de conformité - Assurer l'adhésion aux exigences réglementaires
  4. Formation utilisateur - Éduquer les utilisateurs sur les bonnes pratiques de chiffrement
  5. Pistes d'audit - Maintenir des journaux complets des activités de chiffrement