Guide

Nouvelles mises à jour et améliorations de Macfleet.

Vérification de l'existence d'utilisateurs sur les appareils macOS

La gestion efficace des comptes utilisateur est essentielle pour maintenir le contrôle d'accès et la sécurité dans toute organisation. Lors de la gestion de plusieurs appareils macOS, les administrateurs ont besoin de méthodes fiables pour vérifier l'existence des comptes utilisateur à travers leur flotte. Ce guide fournit des scripts shell et des techniques pour vérifier efficacement la présence d'utilisateurs sur les appareils macOS.

La vérification des utilisateurs est particulièrement importante pour :

  • Les audits de sécurité et la conformité
  • La gestion du contrôle d'accès
  • Le provisionnement et déprovisionnement de comptes
  • Le dépannage des problèmes de connexion
  • La gestion de flotte et l'inventaire

Comprendre les comptes utilisateur sur macOS

macOS gère les comptes utilisateur à travers plusieurs mécanismes :

  • Comptes utilisateur locaux : Créés directement sur le Mac
  • Comptes réseau : Gérés via des services d'annuaire (Active Directory, LDAP)
  • Comptes Apple ID : Connectés aux services iCloud
  • Comptes de service : Comptes au niveau système pour des services spécifiques

Chaque compte utilisateur a des identifiants uniques incluant le nom d'utilisateur, l'ID utilisateur (UID), et les appartenances aux groupes qui peuvent être vérifiés programmatiquement.

Prérequis

Avant d'implémenter ces scripts, assurez-vous d'avoir :

  • Accès administrateur aux appareils Mac
  • Accès Terminal ou SSH
  • Compréhension de base du scripting bash
  • macOS 10.14 ou ultérieur (compatibilité script)

Vérification basique d'existence d'utilisateur

Le script fondamental pour vérifier si un utilisateur existe sur macOS :

#!/bin/bash

# Vérification basique d'existence d'utilisateur
if id -u "User" >/dev/null 2>&1; then
    echo "Oui, l'utilisateur existe."
else
    echo "Non, l'utilisateur n'existe pas."
fi

Comment fonctionne ce script :

  1. id -u "User" : La commande id avec l'option -u retourne l'ID utilisateur (UID) du nom d'utilisateur spécifié
  2. >/dev/null 2>&1 : Redirige la sortie standard et les messages d'erreur vers /dev/null pour les supprimer
  3. Vérification du statut de sortie : Si l'utilisateur existe, id retourne le statut de sortie 0 (succès), sinon il retourne non-zéro (échec)
  4. Exécution conditionnelle : L'instruction if exécute différents blocs basés sur le statut de sortie

Script de vérification d'utilisateur amélioré

Voici un script plus complet qui fournit des informations détaillées sur l'utilisateur :

#!/bin/bash

# Vérification d'utilisateur améliorée avec informations détaillées
USERNAME="$1"

if [ -z "$USERNAME" ]; then
    echo "Usage: $0 <nom_utilisateur>"
    echo "Exemple: $0 jean.dupont"
    exit 1
fi

echo "Vérification de l'utilisateur: $USERNAME"
echo "========================================"

if id -u "$USERNAME" >/dev/null 2>&1; then
    echo "✓ L'utilisateur existe"
    
    # Obtenir les détails de l'utilisateur
    USER_ID=$(id -u "$USERNAME")
    GROUP_ID=$(id -g "$USERNAME")
    USER_GROUPS=$(id -Gn "$USERNAME")
    HOME_DIR=$(eval echo ~$USERNAME)
    
    echo "ID utilisateur (UID): $USER_ID"
    echo "ID groupe principal (GID): $GROUP_ID"
    echo "Appartenance aux groupes: $USER_GROUPS"
    echo "Répertoire personnel: $HOME_DIR"
    
    # Vérifier si le répertoire personnel existe
    if [ -d "$HOME_DIR" ]; then
        echo "✓ Le répertoire personnel existe"
        echo "Taille du répertoire personnel: $(du -sh "$HOME_DIR" 2>/dev/null | cut -f1)"
    else
        echo "✗ Le répertoire personnel n'existe pas"
    fi
    
    # Vérifier si l'utilisateur est actuellement connecté
    if who | grep -q "^$USERNAME "; then
        echo "✓ L'utilisateur est actuellement connecté"
    else
        echo "- L'utilisateur n'est pas actuellement connecté"
    fi
    
else
    echo "✗ L'utilisateur n'existe pas"
    echo "Utilisateurs disponibles:"
    dscl . -list /Users | grep -v "^_" | head -10
fi

Vérification d'utilisateurs par lot

Pour vérifier plusieurs utilisateurs à la fois :

#!/bin/bash

# Script de vérification d'utilisateurs par lot
USERS=("jean.dupont" "marie.martin" "admin" "utilisateur.test")

echo "Rapport de vérification d'utilisateurs par lot"
echo "=============================================="
echo "Date: $(date)"
echo ""

for username in "${USERS[@]}"; do
    if id -u "$username" >/dev/null 2>&1; then
        user_id=$(id -u "$username")
        echo "✓ $username (UID: $user_id) - EXISTE"
    else
        echo "✗ $username - N'EXISTE PAS"
    fi
done

echo ""
echo "Vérification terminée."

Scripts de gestion d'utilisateurs avancés

Script pour lister tous les utilisateurs

#!/bin/bash

# Lister tous les utilisateurs du système
echo "Rapport des utilisateurs système"
echo "================================"
echo ""

echo "Utilisateurs réguliers (UID >= 500):"
echo "------------------------------------"
dscl . -list /Users UniqueID | awk '$2 >= 500 {print $1 " (UID: " $2 ")"}' | sort -n -k3

echo ""
echo "Utilisateurs système (UID < 500):"
echo "---------------------------------"
dscl . -list /Users UniqueID | awk '$2 < 500 {print $1 " (UID: " $2 ")"}' | sort -n -k3

echo ""
echo "Utilisateurs actuellement connectés:"
echo "-----------------------------------"
who | awk '{print $1}' | sort | uniq

Script pour vérifier le statut d'un compte utilisateur

#!/bin/bash

# Vérifier le statut complet d'un compte utilisateur
USERNAME="$1"

if [ -z "$USERNAME" ]; then
    echo "Usage: $0 <nom_utilisateur>"
    exit 1
fi

echo "Statut utilisateur complet: $USERNAME"
echo "====================================="

if id -u "$USERNAME" >/dev/null 2>&1; then
    echo "✓ Le compte utilisateur existe"
    
    # Vérifier si le compte est activé
    if dscl . -read /Users/$USERNAME AuthenticationAuthority 2>/dev/null | grep -q "DisabledUser"; then
        echo "✗ Le compte est DÉSACTIVÉ"
    else
        echo "✓ Le compte est ACTIVÉ"
    fi
    
    # Vérifier la politique de mot de passe
    pwpolicy -u "$USERNAME" -getaccountpolicies 2>/dev/null | grep -q "policyCategories" && echo "✓ Politique de mot de passe appliquée" || echo "- Aucune politique de mot de passe spécifique"
    
    # Vérifier les privilèges administrateur
    if groups "$USERNAME" | grep -q "admin"; then
        echo "⚠ L'utilisateur a des privilèges ADMINISTRATEUR"
    else
        echo "✓ L'utilisateur a des privilèges standard"
    fi
    
    # Vérifier la dernière connexion
    last -1 "$USERNAME" | head -1 | grep -q "wtmp begins" && echo "- Aucun historique de connexion trouvé" || echo "Dernière connexion: $(last -1 "$USERNAME" | head -1 | awk '{print $4, $5, $6, $7}')"
    
else
    echo "✗ Le compte utilisateur n'existe pas"
fi

Vérification d'utilisateurs à distance

Pour gérer plusieurs appareils Mac à distance :

#!/bin/bash

# Vérification d'utilisateurs à distance sur plusieurs Mac
HOSTS=(
    "mac1.local"
    "mac2.local"
    "mac3.local"
)

USERNAME="$1"

if [ -z "$USERNAME" ]; then
    echo "Usage: $0 <nom_utilisateur>"
    echo "Exemple: $0 jean.dupont"
    exit 1
fi

echo "Vérification d'utilisateur à distance: $USERNAME"
echo "==============================================="
echo ""

for host in "${HOSTS[@]}"; do
    echo "Vérification de $host..."
    
    if ping -c 1 -W 1000 "$host" >/dev/null 2>&1; then
        # Créer un script de vérification simple
        check_script="if id -u '$USERNAME' >/dev/null 2>&1; then echo 'EXISTS'; else echo 'NOT_FOUND'; fi"
        
        result=$(ssh -o ConnectTimeout=5 -o BatchMode=yes "$host" "$check_script" 2>/dev/null)
        
        if [ "$result" = "EXISTS" ]; then
            echo "  ✓ $host - L'utilisateur existe"
        elif [ "$result" = "NOT_FOUND" ]; then
            echo "  ✗ $host - Utilisateur non trouvé"
        else
            echo "  ⚠ $host - Impossible de vérifier (erreur SSH)"
        fi
    else
        echo "  ✗ $host - Hôte inaccessible"
    fi
done

Rapports automatisés

Créer des rapports automatisés pour la gestion des comptes utilisateur :

#!/bin/bash

# Rapport automatisé d'existence d'utilisateurs
REPORT_FILE="rapport_utilisateurs_$(date +%Y%m%d_%H%M%S).txt"
USERS_TO_CHECK=("admin" "invité" "support" "développeur")

{
    echo "Rapport d'existence d'utilisateurs"
    echo "=================================="
    echo "Généré: $(date)"
    echo "Nom d'hôte: $(hostname)"
    echo "Version macOS: $(sw_vers -productVersion)"
    echo ""
    
    echo "Résultats de vérification d'utilisateurs:"
    echo "-----------------------------------------"
    
    for user in "${USERS_TO_CHECK[@]}"; do
        if id -u "$user" >/dev/null 2>&1; then
            uid=$(id -u "$user")
            gid=$(id -g "$user")
            groups=$(id -Gn "$user")
            echo "✓ $user - EXISTE (UID: $uid, GID: $gid, Groupes: $groups)"
        else
            echo "✗ $user - NON TROUVÉ"
        fi
    done
    
    echo ""
    echo "Tous les utilisateurs locaux:"
    echo "----------------------------"
    dscl . -list /Users UniqueID | awk '$2 >= 500 {print $1 " (UID: " $2 ")"}' | sort -n -k3
    
} > "$REPORT_FILE"

echo "Rapport généré: $REPORT_FILE"

Bonnes pratiques

1. Gestion des erreurs

Incluez toujours une gestion d'erreurs appropriée dans vos scripts :

#!/bin/bash

# Vérification d'utilisateur robuste avec gestion d'erreurs
check_user() {
    local username="$1"
    
    if [ -z "$username" ]; then
        echo "ERREUR: Nom d'utilisateur non fourni" >&2
        return 1
    fi
    
    if id -u "$username" >/dev/null 2>&1; then
        echo "L'utilisateur '$username' existe"
        return 0
    else
        echo "L'utilisateur '$username' n'existe pas"
        return 1
    fi
}

# Utilisation
check_user "$1" || exit 1

2. Journalisation

Implémentez une journalisation complète :

#!/bin/bash

# Vérification d'utilisateur avec journalisation
LOG_FILE="/var/log/verification_utilisateurs.log"

log_message() {
    echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> "$LOG_FILE"
}

USERNAME="$1"
log_message "Début de la vérification d'utilisateur pour: $USERNAME"

if id -u "$USERNAME" >/dev/null 2>&1; then
    log_message "SUCCÈS: L'utilisateur $USERNAME existe"
    echo "L'utilisateur existe"
else
    log_message "INFO: L'utilisateur $USERNAME n'existe pas"
    echo "L'utilisateur n'existe pas"
fi

3. Considérations de sécurité

  • Exécutez les scripts avec les privilèges minimum requis
  • Validez les entrées pour prévenir les attaques par injection
  • Utilisez des méthodes sécurisées pour l'exécution à distance
  • Implémentez des pistes d'audit pour la conformité

Dépannage

Problèmes courants

  1. Permission refusée : Assurez-vous que le script a les permissions appropriées et est exécuté par un utilisateur avec des privilèges suffisants
  2. Commande non trouvée : Vérifiez que les commandes requises (id, dscl) sont disponibles
  3. Problèmes réseau : Pour la vérification à distance, assurez-vous que les clés SSH sont correctement configurées
  4. Problèmes de service d'annuaire : Vérifiez la connectivité aux contrôleurs de domaine pour les comptes réseau

Débogage

Ajoutez le débogage à vos scripts :

#!/bin/bash

# Activer le débogage
set -x

# Votre script ici
USERNAME="$1"
echo "Debug: Vérification de l'utilisateur $USERNAME"

if id -u "$USERNAME" >/dev/null 2>&1; then
    echo "Debug: L'utilisateur existe"
else
    echo "Debug: L'utilisateur n'existe pas"
fi

Notes de compatibilité

  • macOS 10.14 et ultérieur : Compatibilité complète des scripts
  • Versions antérieures : Certaines commandes dscl peuvent avoir une syntaxe différente
  • Comptes réseau : Peuvent nécessiter une configuration supplémentaire pour les services d'annuaire
  • Comptes gérés : Considérez les politiques de gestion des appareils mobiles (MDM)

Conclusion

La vérification de l'existence d'utilisateurs sur les appareils macOS est un aspect fondamental de l'administration système et de la gestion de la sécurité. Les scripts fournis dans ce guide offrent diverses approches, des vérifications d'existence simples aux audits d'utilisateurs complets.

La vérification régulière des utilisateurs aide à maintenir la sécurité, assure la conformité et fournit des informations précieuses sur le paysage utilisateur de votre flotte Mac. Implémentez ces scripts dans le cadre de vos routines de maintenance régulières pour garder votre environnement macOS sécurisé et bien géré.

N'oubliez pas de tester tous les scripts dans un environnement contrôlé avant de les déployer sur votre flotte, et maintenez toujours des procédures appropriées de sauvegarde et de récupération lors de modifications système.

Vérifier la Signature de Code d'App sur macOS

Apprenez à vérifier les signatures de code des applications sur Mac pour s'assurer de l'authenticité et détecter les altérations. Ceci est essentiel pour l'audit de sécurité et la conformité en environnement d'entreprise.

Vérification Basique de Signature de Code

Afficher les informations détaillées de signature de code pour une application :

#!/bin/bash

# Vérification basique de signature de code
APP_PATH="/Applications/Safari.app"

echo "Vérification signature de code pour : $APP_PATH"
codesign -dv --verbose=4 "$APP_PATH"

Vérification Rapide de Validité

Vérifier si une application est valide et respecte les exigences de signature :

#!/bin/bash

# Vérification rapide de validité
APP_PATH="/Applications/Calendar.app"

echo "Validation : $APP_PATH"
codesign -v --verbose "$APP_PATH"

if [ $? -eq 0 ]; then
    echo "✓ Application est valide et correctement signée"
else
    echo "✗ Signature d'application invalide ou altérée"
fi

Analyseur de Signature de Code Avancé

Script avec analyse complète de signature et gestion d'erreur :

#!/bin/bash

# Fonction pour vérifier la signature de code
check_code_signature() {
    local app_path="$1"
    
    if [[ ! -d "$app_path" ]]; then
        echo "Erreur : Application non trouvée à $app_path"
        return 1
    fi
    
    echo "=== Analyse de Signature de Code ==="
    echo "Application : $app_path"
    echo "Date : $(date)"
    echo "===================================="
    
    # Informations détaillées de signature
    echo "📋 Info Signature Détaillée :"
    codesign -dv --verbose=4 "$app_path" 2>&1
    
    echo ""
    echo "🔍 Vérification de Validation :"
    
    # Vérification de validité
    if codesign -v --verbose "$app_path" 2>&1; then
        echo "✅ Statut : VALIDE - Application correctement signée"
        return 0
    else
        echo "❌ Statut : INVALIDE - Signature d'application compromise"
        return 1
    fi
}

# Exemple d'utilisation
APP_PATH="${1:-/Applications/Safari.app}"
check_code_signature "$APP_PATH"

Scanner de Sécurité Multi-Applications

Scanner plusieurs applications pour l'intégrité des signatures :

#!/bin/bash

# Applications à scanner
APPS_TO_SCAN=(
    "/Applications/Safari.app"
    "/Applications/Calendar.app"
    "/Applications/Mail.app"
    "/System/Applications/Calculator.app"
    "/System/Applications/TextEdit.app"
)

# Fonction pour scanner une seule app
scan_app() {
    local app_path="$1"
    local app_name=$(basename "$app_path" .app)
    
    echo -n "Scan $app_name... "
    
    if [[ ! -d "$app_path" ]]; then
        echo "❓ NON TROUVÉE"
        return 1
    fi
    
    if codesign -v "$app_path" 2>/dev/null; then
        echo "✅ VALIDE"
        return 0
    else
        echo "❌ INVALIDE"
        
        # Afficher détails pour signatures invalides
        echo "   Détails :"
        codesign -v --verbose "$app_path" 2>&1 | sed 's/^/   /'
        return 1
    fi
}

# Rapport de scan de sécurité
echo "=== Rapport de Scan Sécurité MacFleet ==="
echo "Généré : $(date)"
echo "Appareil : $(hostname)"
echo "==========================================="

valid_count=0
invalid_count=0
missing_count=0

for app_path in "${APPS_TO_SCAN[@]}"; do
    if scan_app "$app_path"; then
        ((valid_count++))
    elif [[ ! -d "$app_path" ]]; then
        ((missing_count++))
    else
        ((invalid_count++))
    fi
done

echo "==========================================="
echo "📊 Résumé :"
echo "   Signatures valides : $valid_count"
echo "   Signatures invalides : $invalid_count"
echo "   Applications manquantes : $missing_count"

if [[ $invalid_count -gt 0 ]]; then
    echo ""
    echo "⚠️  ATTENTION : $invalid_count application(s) ont des signatures invalides"
    echo "   Recommande d'enquêter sur les applications potentiellement altérées"
fi

Audit de Signature de Code Entreprise

Script d'audit complet pour environnements d'entreprise :

#!/bin/bash

# Fonction pour obtenir les détails de signature
get_signature_details() {
    local app_path="$1"
    
    # Obtenir l'autorité de signature
    local authority=$(codesign -dv "$app_path" 2>&1 | grep "Authority=" | head -1 | cut -d'=' -f2)
    
    # Obtenir le type de hash
    local hash_type=$(codesign -dv "$app_path" 2>&1 | grep "Hash type=" | cut -d'=' -f2)
    
    # Obtenir l'horodatage
    local timestamp=$(codesign -dv "$app_path" 2>&1 | grep "Timestamp=" | cut -d'=' -f2)
    
    echo "Autorité : ${authority:-Inconnue}"
    echo "Type Hash : ${hash_type:-Inconnu}"
    echo "Horodatage : ${timestamp:-Aucun}"
}

# Fonction pour audit entreprise
enterprise_audit() {
    local app_path="$1"
    local app_name=$(basename "$app_path" .app)
    
    echo "🔐 Audit : $app_name"
    echo "Chemin : $app_path"
    
    if [[ ! -d "$app_path" ]]; then
        echo "Statut : ❓ APPLICATION NON TROUVÉE"
        return 1
    fi
    
    # Effectuer validation
    if codesign -v "$app_path" 2>/dev/null; then
        echo "Statut : ✅ SIGNATURE VALIDE"
        get_signature_details "$app_path"
    else
        echo "Statut : ❌ SIGNATURE INVALIDE"
        echo "Risque Sécurité : ÉLEVÉ"
        
        # Afficher erreur détaillée
        echo "Détails Erreur :"
        codesign -v --verbose "$app_path" 2>&1 | sed 's/^/  /'
        
        # Vérifier fichiers ajoutés
        echo "Vérification modifications non autorisées..."
        codesign -v --verbose "$app_path" 2>&1 | grep "file added" | sed 's/^/  🚨 /'
    fi
    
    echo "─────────────────────────────────────"
}

# Exécution audit entreprise
echo "🏢 Audit Sécurité Entreprise MacFleet"
echo "====================================="

# Auditer applications système critiques
CRITICAL_APPS=(
    "/Applications/Safari.app"
    "/System/Applications/Finder.app"
    "/Applications/Calendar.app"
    "/Applications/Mail.app"
)

for app in "${CRITICAL_APPS[@]}"; do
    enterprise_audit "$app"
done

echo "Audit terminé : $(date)"

Utilisation avec MacFleet

  1. Spécifiez le chemin de l'application dans le script
  2. Choisissez entre analyse détaillée ou validation rapide
  3. Déployez via l'exécution de script distant MacFleet
  4. Consultez les résultats dans l'historique des actions pour conformité sécurité

Chemins d'Applications Communs

ApplicationChemin
Safari/Applications/Safari.app
Finder/System/Applications/Finder.app
Calendar/Applications/Calendar.app
Mail/Applications/Mail.app
Calculator/System/Applications/Calculator.app

Interprétation des Résultats

Signature Valide : Application authentique et non modifiée

/Applications/Safari.app: valid on disk
/Applications/Safari.app: satisfies its Designated Requirement

Signature Invalide : Application a été altérée

/Applications/Safari.app: a sealed resource is missing or invalid
file added: /Applications/Safari.app/Contents/maliciousfile.sh

Considérations de Sécurité

  • Audits réguliers : Planifiez des vérifications périodiques de signatures pour applications critiques
  • Enquêter anomalies : Toute signature invalide nécessite enquête immédiate
  • Quarantaine apps suspectes : Isolez applications avec signatures compromises
  • Documenter découvertes : Maintenez pistes d'audit pour conformité

Dépannage

Permission refusée : Assurez-vous que le script a l'accès système de fichiers nécessaire Application non trouvée : Vérifiez le chemin correct de l'application Commande non trouvée : codesign est disponible sur tous les systèmes macOS


Note : Les signatures invalides indiquent des risques de sécurité potentiels. Enquêtez et remédiez immédiatement toute application avec signatures compromises.

Distribution et Gestion des Certificats sur macOS

Distribuez et gérez efficacement les certificats de sécurité sur vos appareils MacFleet en utilisant des outils de ligne de commande automatisés. Ce tutoriel couvre le déploiement de certificats, la validation, la gestion de confiance et l'intégration CA d'entreprise.

Comprendre la Gestion des Certificats macOS

macOS utilise plusieurs magasins de certificats et politiques de confiance :

  • Trousseau Système - Certificats de confiance à l'échelle du système
  • Trousseau de Connexion - Certificats spécifiques à l'utilisateur
  • Paramètres de Confiance - Politiques de confiance et règles de validation des certificats
  • Autorité de Certificat - Certificats CA racine et intermédiaires

Distribution Basique de Certificats

Télécharger et Installer un Certificat

#!/bin/bash

# Installation basique de certificat depuis une URL
CERT_URL="https://votre-domaine.com/certificates/company-ca.crt"
CERT_NAME="company-ca.crt"

# Télécharger le certificat
curl -O "$CERT_URL"

# Ajouter au trousseau système avec confiance
sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain "/Users/$CERT_NAME"

echo "Certificat installé avec succès"

Installer un Certificat Local

#!/bin/bash

# Installer un certificat depuis un fichier local
CERT_PATH="/path/to/certificate.crt"

if [[ -f "$CERT_PATH" ]]; then
    sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain "$CERT_PATH"
    echo "Certificat local installé avec succès"
else
    echo "Fichier de certificat non trouvé : $CERT_PATH"
    exit 1
fi

Script de Gestion de Certificats d'Entreprise

#!/bin/bash

# Distribution et Gestion de Certificats MacFleet
# Déployer, valider et gérer les certificats sur les appareils d'entreprise

# Configuration
LOG_FILE="/var/log/macfleet_certificates.log"
BACKUP_DIR="/var/backups/certificates"
CERT_STORE_DIR="/Library/Keychains"
TEMP_DIR="/tmp/macfleet_certs"

# Configuration des sources de certificats
declare -A CERTIFICATE_SOURCES=(
    ["company-root-ca"]="https://pki.company.com/certs/root-ca.crt"
    ["company-intermediate-ca"]="https://pki.company.com/certs/intermediate-ca.crt"
    ["company-ssl-ca"]="https://pki.company.com/certs/ssl-ca.crt"
)

# 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 "$BACKUP_DIR" "$TEMP_DIR"; do
        if [[ ! -d "$dir" ]]; then
            mkdir -p "$dir"
            log_action "Répertoire créé : $dir"
        fi
    done
}

# Valider le fichier certificat
validate_certificate() {
    local cert_file="$1"
    local cert_name="$2"
    
    log_action "Validation du certificat : $cert_name"
    
    # Vérifier si le fichier existe et est lisible
    if [[ ! -f "$cert_file" || ! -r "$cert_file" ]]; then
        log_action "ERREUR : Fichier de certificat non accessible : $cert_file"
        return 1
    fi
    
    # Valider le format du certificat avec openssl
    if ! openssl x509 -in "$cert_file" -text -noout >/dev/null 2>&1; then
        log_action "ERREUR : Format de certificat invalide : $cert_name"
        return 1
    fi
    
    # Extraire les informations du certificat
    local subject
    local issuer
    local expiry
    subject=$(openssl x509 -in "$cert_file" -subject -noout | sed 's/subject=//')
    issuer=$(openssl x509 -in "$cert_file" -issuer -noout | sed 's/issuer=//')
    expiry=$(openssl x509 -in "$cert_file" -enddate -noout | sed 's/notAfter=//')
    
    log_action "Détails du Certificat :"
    log_action "  Sujet : $subject"
    log_action "  Émetteur : $issuer"
    log_action "  Expire : $expiry"
    
    # Vérifier si le certificat est expiré
    if ! openssl x509 -in "$cert_file" -checkend 0 >/dev/null 2>&1; then
        log_action "ATTENTION : Le certificat est expiré : $cert_name"
        return 2
    fi
    
    # Vérifier si le certificat expire dans 30 jours
    if ! openssl x509 -in "$cert_file" -checkend 2592000 >/dev/null 2>&1; then
        log_action "ATTENTION : Le certificat expire dans 30 jours : $cert_name"
    fi
    
    log_action "Validation du certificat réussie : $cert_name"
    return 0
}

# Télécharger un certificat depuis une URL
download_certificate() {
    local cert_name="$1"
    local cert_url="$2"
    local cert_file="$TEMP_DIR/$cert_name.crt"
    
    log_action "Téléchargement du certificat : $cert_name depuis $cert_url"
    
    # Télécharger avec validation
    if curl -s -f -L --connect-timeout 30 --max-time 120 -o "$cert_file" "$cert_url"; then
        log_action "Certificat téléchargé avec succès : $cert_name"
        echo "$cert_file"
        return 0
    else
        log_action "ERREUR : Échec du téléchargement du certificat : $cert_name"
        return 1
    fi
}

# Sauvegarder les certificats existants
backup_certificates() {
    local backup_timestamp
    backup_timestamp=$(date '+%Y%m%d_%H%M%S')
    local backup_file="$BACKUP_DIR/keychain_backup_$backup_timestamp.tar.gz"
    
    log_action "Création de la sauvegarde des certificats : $backup_file"
    
    if tar -czf "$backup_file" -C /Library/Keychains . 2>/dev/null; then
        log_action "Sauvegarde créée avec succès : $backup_file"
        return 0
    else
        log_action "ERREUR : Échec de la création de la sauvegarde"
        return 1
    fi
}

# Installer un certificat dans le trousseau système
install_certificate() {
    local cert_file="$1"
    local cert_name="$2"
    local trust_policy="${3:-trustRoot}"
    
    log_action "Installation du certificat : $cert_name avec la politique de confiance : $trust_policy"
    
    # Vérifier si le certificat existe déjà
    if security find-certificate -c "$cert_name" /Library/Keychains/System.keychain >/dev/null 2>&1; then
        log_action "Le certificat existe déjà dans le trousseau système : $cert_name"
        
        # Optionnellement supprimer le certificat existant
        read -p "Le certificat existe déjà. Remplacer ? (y/N): " -n 1 -r
        echo
        if [[ $REPLY =~ ^[Yy]$ ]]; then
            remove_certificate "$cert_name"
        else
            return 0
        fi
    fi
    
    # Installer le certificat
    if sudo security add-trusted-cert -d -r "$trust_policy" -k /Library/Keychains/System.keychain "$cert_file"; then
        log_action "Certificat installé avec succès : $cert_name"
        
        # Vérifier l'installation
        if security find-certificate -c "$cert_name" /Library/Keychains/System.keychain >/dev/null 2>&1; then
            log_action "Vérification du certificat réussie : $cert_name"
            return 0
        else
            log_action "ERREUR : Échec de la vérification du certificat : $cert_name"
            return 1
        fi
    else
        log_action "ERREUR : Échec de l'installation du certificat : $cert_name"
        return 1
    fi
}

# Supprimer un certificat du trousseau système
remove_certificate() {
    local cert_name="$1"
    
    log_action "Suppression du certificat : $cert_name"
    
    if sudo security delete-certificate -c "$cert_name" /Library/Keychains/System.keychain 2>/dev/null; then
        log_action "Certificat supprimé avec succès : $cert_name"
        return 0
    else
        log_action "Certificat non trouvé ou suppression échouée : $cert_name"
        return 1
    fi
}

# Configurer la base de données d'autorisation
configure_authorization() {
    log_action "Configuration de la base de données d'autorisation pour la gestion des certificats"
    
    cat > "$TEMP_DIR/auth_config.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>allow-root</key>
    <true/>
    <key>authenticate-user</key>
    <true/>
    <key>class</key>
    <string>user</string>
    <key>comment</key>
    <string>Vérifié par le framework Admin lors de modifications de certaines Préférences Système.</string>
    <key>group</key>
    <string>admin</string>
    <key>session-owner</key>
    <false/>
    <key>shared</key>
    <true/>
</dict>
</plist>
EOF

    if sudo /usr/bin/security authorizationdb write system.preferences < "$TEMP_DIR/auth_config.plist"; then
        log_action "Base de données d'autorisation configurée avec succès"
        return 0
    else
        log_action "ERREUR : Échec de la configuration de la base de données d'autorisation"
        return 1
    fi
}

# Lister les certificats installés
list_certificates() {
    log_action "Liste des certificats installés dans le trousseau système"
    
    echo "=== Certificats du Trousseau Système ==="
    security find-certificate -a -p /Library/Keychains/System.keychain | \
    openssl x509 -text -noout | \
    grep -E "(Subject:|Issuer:|Not After)" | \
    sed 's/^[[:space:]]*//'
    
    echo -e "\n=== Résumé des Certificats ==="
    local cert_count
    cert_count=$(security find-certificate -a /Library/Keychains/System.keychain | grep -c "keychain:")
    echo "Total des certificats dans le trousseau système : $cert_count"
}

# Générer un rapport de certificats
generate_certificate_report() {
    local report_file="$BACKUP_DIR/certificate_report_$(date '+%Y%m%d_%H%M%S').json"
    
    log_action "Génération du rapport de certificats : $report_file"
    
    {
        echo "{"
        echo "  \"report_date\": \"$(date -Iseconds)\","
        echo "  \"hostname\": \"$(hostname)\","
        echo "  \"system_info\": {"
        echo "    \"os_version\": \"$(sw_vers -productVersion)\","
        echo "    \"build_version\": \"$(sw_vers -buildVersion)\""
        echo "  },"
        echo "  \"certificates\": ["
        
        local first=true
        while IFS= read -r cert_hash; do
            if [[ "$first" == true ]]; then
                first=false
            else
                echo ","
            fi
            
            local cert_info
            cert_info=$(security find-certificate -a -Z /Library/Keychains/System.keychain | \
                       awk -v hash="$cert_hash" '
                       /^SHA-1 hash:/ { if ($3 == hash) found=1; next }
                       found && /^[[:space:]]*"/ { print; found=0 }')
            
            echo "    {"
            echo "      \"hash\": \"$cert_hash\","
            echo "      \"subject\": $cert_info"
            echo -n "    }"
        done < <(security find-certificate -a -Z /Library/Keychains/System.keychain | \
                 grep "SHA-1 hash:" | awk '{print $3}')
        
        echo ""
        echo "  ],"
        echo "  \"trust_settings\": $(security trust-settings-export -d /tmp/trust_settings.plist && plutil -convert json -o - /tmp/trust_settings.plist 2>/dev/null || echo 'null')"
        echo "}"
    } > "$report_file"
    
    log_action "Rapport de certificats généré : $report_file"
    echo "$report_file"
}

# Déployer plusieurs certificats
deploy_certificate_bundle() {
    log_action "=== Début du déploiement du bundle de certificats ==="
    
    local success_count=0
    local total_count=0
    local failed_certs=()
    
    for cert_name in "${!CERTIFICATE_SOURCES[@]}"; do
        total_count=$((total_count + 1))
        local cert_url="${CERTIFICATE_SOURCES[$cert_name]}"
        
        log_action "Traitement du certificat : $cert_name"
        
        # Télécharger le certificat
        local cert_file
        if cert_file=$(download_certificate "$cert_name" "$cert_url"); then
            
            # Valider le certificat
            if validate_certificate "$cert_file" "$cert_name"; then
                
                # Installer le certificat
                if install_certificate "$cert_file" "$cert_name"; then
                    success_count=$((success_count + 1))
                    log_action "Certificat déployé avec succès : $cert_name"
                else
                    failed_certs+=("$cert_name")
                fi
            else
                failed_certs+=("$cert_name")
            fi
            
            # Nettoyer le fichier temporaire
            rm -f "$cert_file"
        else
            failed_certs+=("$cert_name")
        fi
    done
    
    log_action "=== Résumé du déploiement de certificats ==="
    log_action "Total des certificats : $total_count"
    log_action "Déployés avec succès : $success_count"
    log_action "Déploiements échoués : ${#failed_certs[@]}"
    
    if [[ ${#failed_certs[@]} -gt 0 ]]; then
        log_action "Certificats échoués : ${failed_certs[*]}"
    fi
    
    return $((total_count - success_count))
}

# Fonction d'exécution principale
main() {
    local action="${1:-deploy}"
    
    log_action "=== Démarrage de la Gestion des Certificats MacFleet ==="
    log_action "Action : $action"
    log_action "Nom d'hôte : $(hostname)"
    log_action "Utilisateur : $(whoami)"
    
    # Configuration
    setup_directories
    
    case "$action" in
        "deploy")
            backup_certificates
            configure_authorization
            deploy_certificate_bundle
            list_certificates
            generate_certificate_report
            ;;
        "list")
            list_certificates
            ;;
        "report")
            generate_certificate_report
            ;;
        "backup")
            backup_certificates
            ;;
        "remove")
            if [[ -n "$2" ]]; then
                remove_certificate "$2"
            else
                echo "Usage : $0 remove <nom_certificat>"
                exit 1
            fi
            ;;
        *)
            echo "Usage : $0 {deploy|list|report|backup|remove}"
            echo "  deploy  - Déployer tous les certificats configurés"
            echo "  list    - Lister les certificats installés"
            echo "  report  - Générer un rapport de certificats"
            echo "  backup  - Sauvegarder les certificats actuels"
            echo "  remove  - Supprimer un certificat spécifique"
            exit 1
            ;;
    esac
    
    # Nettoyage
    rm -rf "$TEMP_DIR"
    
    log_action "=== Gestion des certificats terminée ==="
}

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

Politiques de Confiance des Certificats

macOS prend en charge différentes politiques de confiance pour les certificats :

Politique de ConfianceDescriptionCas d'Usage
trustRootCertificat racine de confianceCertificats CA racine
trustAsRootFaire confiance comme racine sans contraintes d'usageCertificats CA d'entreprise
denyRefuser explicitement la confianceCertificats révoqués ou blacklistés
unspecifiedUtiliser la confiance par défaut du systèmeLaisser le système déterminer la confiance

Validation et Sécurité des Certificats

Vérifier la Chaîne de Certificats

#!/bin/bash

# Vérifier la chaîne de certificats et la validation
verify_certificate_chain() {
    local cert_file="$1"
    local ca_bundle="/etc/ssl/cert.pem"
    
    echo "Vérification de la chaîne de certificats..."
    
    # Vérification basique du certificat
    if openssl verify -CAfile "$ca_bundle" "$cert_file"; then
        echo "✅ La chaîne de certificats est valide"
    else
        echo "❌ Échec de la vérification de la chaîne de certificats"
        return 1
    fi
    
    # Vérifier les objectifs du certificat
    echo "Objectifs du certificat :"
    openssl x509 -in "$cert_file" -purpose -noout
    
    # Extraire l'usage des clés
    echo "Usage des clés :"
    openssl x509 -in "$cert_file" -text -noout | grep -A 5 "X509v3 Key Usage"
    
    return 0
}

Analyse de Sécurité des Certificats

#!/bin/bash

# Analyse de sécurité des certificats installés
security_scan_certificates() {
    echo "=== Analyse de Sécurité des Certificats ==="
    
    # Trouver les certificats faibles (signatures MD5 ou SHA1)
    echo "Vérification des algorithmes de signature faibles..."
    security find-certificate -a -p /Library/Keychains/System.keychain | \
    while read -r cert_pem; do
        if [[ "$cert_pem" =~ ^-----BEGIN ]]; then
            local sig_algo
            sig_algo=$(echo "$cert_pem" | openssl x509 -text -noout | grep "Signature Algorithm" | head -1)
            
            if [[ "$sig_algo" =~ (md5|sha1) ]]; then
                local subject
                subject=$(echo "$cert_pem" | openssl x509 -subject -noout)
                echo "⚠️  Signature faible trouvée : $subject - $sig_algo"
            fi
        fi
    done
    
    # Trouver les certificats expirants
    echo -e "\nVérification des certificats expirants..."
    security find-certificate -a -p /Library/Keychains/System.keychain | \
    while read -r cert_pem; do
        if [[ "$cert_pem" =~ ^-----BEGIN ]]; then
            if ! echo "$cert_pem" | openssl x509 -checkend 2592000 >/dev/null 2>&1; then
                local subject
                local expiry
                subject=$(echo "$cert_pem" | openssl x509 -subject -noout)
                expiry=$(echo "$cert_pem" | openssl x509 -enddate -noout)
                echo "⚠️  Certificat expirant : $subject - $expiry"
            fi
        fi
    done
    
    echo "Analyse de sécurité terminée"
}

Renouvellement Automatique de Certificats

#!/bin/bash

# Script de renouvellement automatique de certificats
setup_certificate_renewal() {
    local renewal_script="/usr/local/bin/macfleet_cert_renewal.sh"
    local launchd_plist="/Library/LaunchDaemons/com.macfleet.cert.renewal.plist"
    
    # Créer le script de renouvellement
    cat > "$renewal_script" << 'EOF'
#!/bin/bash
LOG_FILE="/var/log/macfleet_cert_renewal.log"
exec > >(tee -a "$LOG_FILE") 2>&1

echo "$(date): Démarrage du renouvellement automatique de certificats"

# Ajoutez votre logique de renouvellement de certificats ici
# Cela pourrait inclure :
# - Vérifier les dates d'expiration des certificats
# - Télécharger de nouveaux certificats depuis votre PKI
# - Remplacer les certificats expirés
# - Envoyer des alertes pour les renouvellements à venir

echo "$(date): Renouvellement de certificats terminé"
EOF

    chmod +x "$renewal_script"
    
    # Créer le LaunchDaemon pour l'exécution programmée
    cat > "$launchd_plist" << EOF
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.macfleet.cert.renewal</string>
    <key>ProgramArguments</key>
    <array>
        <string>$renewal_script</string>
    </array>
    <key>StartCalendarInterval</key>
    <array>
        <dict>
            <key>Hour</key>
            <integer>2</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 "Automatisation du renouvellement de certificats configurée"
    echo "Script : $renewal_script"
    echo "Planification : Quotidien à 2h00"
}

Intégration d'Entreprise

Services de Certificats Active Directory

#!/bin/bash

# Intégration avec Microsoft ADCS
deploy_adcs_certificates() {
    local adcs_server="$1"
    local cert_template="$2"
    
    echo "Déploiement des certificats depuis ADCS : $adcs_server"
    
    # Demander un certificat depuis ADCS
    # Cela utiliserait typiquement certreq ou des outils similaires
    # L'implémentation dépend de votre configuration ADCS
    
    echo "L'intégration ADCS nécessite une configuration supplémentaire"
    echo "Veuillez consulter votre administrateur PKI"
}

SCEP (Simple Certificate Enrollment Protocol)

#!/bin/bash

# Inscription de certificat SCEP
enroll_scep_certificate() {
    local scep_url="$1"
    local challenge_password="$2"
    
    echo "Inscription de certificat via SCEP : $scep_url"
    
    # Générer une clé privée
    openssl genrsa -out device.key 2048
    
    # Créer une demande de certificat
    openssl req -new -key device.key -out device.csr -subj "/CN=$(hostname)"
    
    # Note : L'inscription SCEP nécessite des outils supplémentaires comme sscep
    echo "L'inscription SCEP nécessite sscep ou des outils similaires"
    echo "Veuillez installer le client SCEP approprié"
}

Meilleures Pratiques

🔐 Considérations de Sécurité

  • Validez les certificats avant l'installation
  • Utilisez des politiques de confiance fortes appropriées à l'objectif du certificat
  • Surveillez les dates d'expiration des certificats régulièrement
  • Implémentez l'épinglage de certificats pour les applications critiques

📋 Directives de Gestion

  • Sauvegardez les certificats avant de faire des changements
  • Documentez les objectifs et propriétaires des certificats
  • Utilisez l'automatisation pour les déploiements à grande échelle
  • Surveillez l'usage et la validité des certificats

🔍 Dépannage

  • Vérifiez le format du certificat si l'installation échoue
  • Vérifiez la connectivité réseau pour les téléchargements
  • Examinez les politiques de confiance si les certificats ne sont pas approuvés
  • Consultez les journaux système pour des informations d'erreur détaillées

Notes Importantes

  • Privilèges administrateur requis pour les modifications du trousseau système
  • Validation des certificats essentielle pour la conformité de sécurité
  • Sauvegardez les certificats existants avant les opérations en lot
  • Testez le déploiement de certificats sur un sous-ensemble d'appareils d'abord
  • Surveillez l'expiration des certificats pour éviter les interruptions de service

Gestion et Nettoyage du Cache sur macOS

Gérez et nettoyez différents types de cache sur vos appareils MacFleet à l'aide d'outils en ligne de commande. Ce tutoriel couvre le cache système, le cache de navigateur, le cache d'applications et les politiques de gestion de cache à l'échelle de l'entreprise pour une performance et une gestion de stockage optimales.

Comprendre le Système de Cache macOS

macOS maintient plusieurs types de cache pour améliorer les performances du système et des applications :

Types de Cache

  • Cache Système - Journaux, rapports de diagnostic, fichiers temporaires système
  • Cache Utilisateur - Fichiers temporaires et données spécifiques aux applications
  • Cache Navigateur - Données de navigation web, cookies, stockage de session
  • Cache Applications - Données mises en cache et préférences spécifiques aux applications
  • Cache Police - Fichiers de cache de polices système et utilisateur

Emplacements de Cache

  • Système : /var/log/, /Library/Caches/, /System/Library/Caches/
  • Utilisateur : ~/Library/Caches/, ~/Library/Application Support/
  • Navigateur : Répertoires spécifiques aux navigateurs dans la bibliothèque utilisateur
  • Téléchargements : ~/Library/Preferences/com.apple.LaunchServices.QuarantineEventsV*

Gestion du Cache Système

Nettoyer le Cache Système

#!/bin/bash

# Nettoyer les fichiers de cache système
echo "🧹 Nettoyage du cache système..."

# Nettoyer les journaux système (avec limite de taille pour la sécurité)
echo "Nettoyage des journaux système..."
sudo find /var/log -name "*.log" -type f -size +100M -delete 2>/dev/null
sudo find /var/log -name "*.out" -type f -size +50M -delete 2>/dev/null

# Nettoyer les caches système
echo "Nettoyage des caches système..."
sudo rm -rf /Library/Caches/* 2>/dev/null
sudo rm -rf /System/Library/Caches/* 2>/dev/null

# Nettoyer les fichiers temporaires
echo "Nettoyage des fichiers temporaires..."
sudo rm -rf /tmp/* 2>/dev/null
sudo rm -rf /var/tmp/* 2>/dev/null

echo "✅ Cache système nettoyé avec succès"

Nettoyer le Cache Utilisateur

#!/bin/bash

# Nettoyer les fichiers de cache de l'utilisateur actuel
USER=$(whoami)
echo "🗂️ Nettoyage du cache utilisateur pour : $USER"

# Nettoyer les caches utilisateur
echo "Nettoyage des caches utilisateur..."
rm -rf ~/Library/Caches/* 2>/dev/null

# Nettoyer les journaux utilisateur
echo "Nettoyage des journaux utilisateur..."
rm -rf ~/Library/Logs/* 2>/dev/null

# Nettoyer les miniatures QuickLook
echo "Nettoyage des miniatures QuickLook..."
rm -rf ~/Library/Caches/com.apple.QuickLook.thumbnailcache/* 2>/dev/null

# Nettoyer le cache Spotlight
echo "Nettoyage du cache Spotlight..."
sudo mdutil -E / 2>/dev/null

echo "✅ Cache utilisateur nettoyé avec succès"

Gestion du Cache de Navigateur

Nettoyer le Cache Safari

#!/bin/bash

# Nettoyer le cache du navigateur Safari
echo "🌐 Nettoyage du cache Safari..."

# Vérifier si Safari est en cours d'exécution
if pgrep -x "Safari" > /dev/null; then
    echo "⚠️ Safari est en cours d'exécution. Veuillez fermer Safari d'abord."
    read -p "Appuyez sur Entrée pour continuer après avoir fermé Safari..."
fi

# Nettoyer les fichiers de cache Safari
rm -rf ~/Library/Caches/com.apple.Safari/* 2>/dev/null
rm -rf ~/Library/Safari/LocalStorage/* 2>/dev/null
rm -rf ~/Library/Safari/Databases/* 2>/dev/null
rm -rf ~/Library/Safari/WebpageIcons.db 2>/dev/null

# Nettoyer l'historique des téléchargements Safari
sqlite3 ~/Library/Safari/Downloads.plist "DELETE FROM Downloads;" 2>/dev/null

echo "✅ Cache Safari nettoyé avec succès"

Nettoyer le Cache Chrome

#!/bin/bash

# Nettoyer le cache du navigateur Google Chrome
echo "🔍 Nettoyage du cache Google Chrome..."

# Vérifier si Chrome est installé
if [[ ! -d ~/Library/Application\ Support/Google/Chrome ]]; then
    echo "ℹ️ Google Chrome non trouvé sur ce système"
    exit 0
fi

# Vérifier si Chrome est en cours d'exécution
if pgrep -x "Google Chrome" > /dev/null; then
    echo "⚠️ Chrome est en cours d'exécution. Veuillez fermer Chrome d'abord."
    read -p "Appuyez sur Entrée pour continuer après avoir fermé Chrome..."
fi

# Nettoyer les fichiers de cache Chrome
rm -rf ~/Library/Application\ Support/Google/Chrome/*/Cache/* 2>/dev/null
rm -rf ~/Library/Application\ Support/Google/Chrome/*/GPUCache/* 2>/dev/null
rm -rf ~/Library/Application\ Support/Google/Chrome/*/*.ldb 2>/dev/null
rm -rf ~/Library/Application\ Support/Google/Chrome/*/*.log 2>/dev/null
rm -rf ~/Library/Application\ Support/Google/Chrome/*/Extension\ State/* 2>/dev/null
rm -rf ~/Library/Application\ Support/Google/Chrome/*/Session\ Storage/* 2>/dev/null
rm -rf ~/Library/Application\ Support/Google/Chrome/*/Current\ Session 2>/dev/null
rm -rf ~/Library/Application\ Support/Google/Chrome/*/Storage/ext/* 2>/dev/null

echo "✅ Cache Chrome nettoyé avec succès"

Nettoyer le Cache Firefox

#!/bin/bash

# Nettoyer le cache du navigateur Mozilla Firefox
echo "🦊 Nettoyage du cache Firefox..."

# Vérifier si Firefox est installé
if [[ ! -d ~/Library/Application\ Support/Firefox ]]; then
    echo "ℹ️ Firefox non trouvé sur ce système"
    exit 0
fi

# Vérifier si Firefox est en cours d'exécution
if pgrep -x "firefox" > /dev/null; then
    echo "⚠️ Firefox est en cours d'exécution. Veuillez fermer Firefox d'abord."
    read -p "Appuyez sur Entrée pour continuer après avoir fermé Firefox..."
fi

# Trouver les répertoires de profil Firefox
for profile in ~/Library/Application\ Support/Firefox/Profiles/*; do
    if [[ -d "$profile" ]]; then
        echo "Nettoyage du profil Firefox : $(basename "$profile")"
        rm -rf "$profile/cache2"/* 2>/dev/null
        rm -rf "$profile/thumbnails"/* 2>/dev/null
        rm -rf "$profile/cookies.sqlite-wal" 2>/dev/null
        rm -rf "$profile/webappsstore.sqlite" 2>/dev/null
    fi
done

echo "✅ Cache Firefox nettoyé avec succès"

Nettoyer le Cache Opera

#!/bin/bash

# Nettoyer le cache du navigateur Opera
echo "🎭 Nettoyage du cache Opera..."

# Vérifier si Opera est installé
if [[ ! -d ~/Library/Application\ Support/com.operasoftware.Opera ]]; then
    echo "ℹ️ Opera non trouvé sur ce système"
    exit 0
fi

# Vérifier si Opera est en cours d'exécution
if pgrep -x "Opera" > /dev/null; then
    echo "⚠️ Opera est en cours d'exécution. Veuillez fermer Opera d'abord."
    read -p "Appuyez sur Entrée pour continuer après avoir fermé Opera..."
fi

# Nettoyer les fichiers de cache Opera
rm -rf ~/Library/Application\ Support/com.operasoftware.Opera/Cache/* 2>/dev/null
rm -rf ~/Library/Application\ Support/com.operasoftware.Opera/GPUCache/* 2>/dev/null
rm -rf ~/Library/Application\ Support/com.operasoftware.Opera/Session\ Storage/* 2>/dev/null

echo "✅ Cache Opera nettoyé avec succès"

Gestion du Cache d'Applications

Nettoyer les Caches d'Applications

#!/bin/bash

# Nettoyer les caches spécifiques aux applications
echo "📱 Nettoyage des caches d'applications..."

# Nettoyer les caches d'applications dans Containers
echo "Nettoyage des caches d'applications conteneurisées..."
for container in ~/Library/Containers/*; do
    if [[ -d "$container/Data/Library/Caches" ]]; then
        app_name=$(basename "$container")
        echo "Nettoyage du cache pour : $app_name"
        rm -rf "$container/Data/Library/Caches"/* 2>/dev/null
    fi
done

# Nettoyer le cache Adobe
if [[ -d ~/Library/Caches/Adobe ]]; then
    echo "Nettoyage du cache Adobe..."
    rm -rf ~/Library/Caches/Adobe/* 2>/dev/null
fi

# Nettoyer le cache Microsoft Office
if [[ -d ~/Library/Caches/Microsoft ]]; then
    echo "Nettoyage du cache Microsoft Office..."
    rm -rf ~/Library/Caches/Microsoft/* 2>/dev/null
fi

# Nettoyer le cache Xcode
if [[ -d ~/Library/Developer/Xcode/DerivedData ]]; then
    echo "Nettoyage des données dérivées Xcode..."
    rm -rf ~/Library/Developer/Xcode/DerivedData/* 2>/dev/null
fi

echo "✅ Caches d'applications nettoyés avec succès"

Nettoyer l'Historique des Téléchargements

#!/bin/bash

# Nettoyer l'historique des téléchargements et la base de données de quarantaine
echo "📥 Nettoyage de l'historique des téléchargements..."

# Nettoyer les événements de quarantaine (historique des téléchargements)
sqlite3 ~/Library/Preferences/com.apple.LaunchServices.QuarantineEventsV* \
    'DELETE FROM LSQuarantineEvent' 2>/dev/null

# Nettoyer les éléments récents
rm -rf ~/Library/Application\ Support/com.apple.sharedfilelist/com.apple.LSSharedFileList.RecentDocuments.sfl* 2>/dev/null
rm -rf ~/Library/Application\ Support/com.apple.sharedfilelist/com.apple.LSSharedFileList.RecentApplications.sfl* 2>/dev/null

echo "✅ Historique des téléchargements nettoyé avec succès"

Nettoyer l'Historique du Terminal

#!/bin/bash

# Nettoyer l'historique des commandes du terminal
echo "💻 Nettoyage de l'historique du terminal..."

# Nettoyer l'historique bash
rm -rf ~/.bash_sessions/* 2>/dev/null
rm -rf ~/.bash_history 2>/dev/null

# Nettoyer l'historique zsh
rm -rf ~/.zsh_sessions/* 2>/dev/null
rm -rf ~/.zsh_history 2>/dev/null

# Nettoyer d'autres historiques de shell
rm -rf ~/.history 2>/dev/null
rm -rf ~/.sh_history 2>/dev/null

echo "✅ Historique du terminal nettoyé avec succès"

Script de Gestion de Cache d'Entreprise

#!/bin/bash

# Outil de Gestion de Cache MacFleet
# Gestion complète du cache pour les environnements d'entreprise

# Configuration
LOG_FILE="/var/log/macfleet_cache.log"
BACKUP_DIR="/var/backups/macfleet/cache"
REPORT_DIR="/var/reports/macfleet/cache"
CONFIG_FILE="/etc/macfleet/cache_policy.conf"

# Paramètres de politique de cache
ENABLE_SYSTEM_CACHE_CLEAR=true
ENABLE_BROWSER_CACHE_CLEAR=true
ENABLE_APP_CACHE_CLEAR=true
ENABLE_DOWNLOAD_HISTORY_CLEAR=false
ENABLE_TERMINAL_HISTORY_CLEAR=false
CACHE_SIZE_THRESHOLD_MB=1000
CACHE_AGE_DAYS=30

# 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 "$CONFIG_FILE")"; do
        if [[ ! -d "$dir" ]]; then
            sudo mkdir -p "$dir"
            log_action "Répertoire créé : $dir"
        fi
    done
}

# Calculer la taille du cache
calculate_cache_size() {
    local path="$1"
    if [[ -d "$path" ]]; then
        du -sm "$path" 2>/dev/null | awk '{print $1}'
    else
        echo "0"
    fi
}

# Générer un rapport de cache
generate_cache_report() {
    local report_file="$REPORT_DIR/rapport_cache_$(date +%Y%m%d_%H%M%S).txt"
    
    echo "📊 Génération du rapport d'analyse de cache..."
    
    {
        echo "Rapport d'Analyse de Cache MacFleet"
        echo "Généré : $(date)"
        echo "Nom d'hôte : $(hostname)"
        echo "Utilisateur : $(whoami)"
        echo "================================="
        echo ""
        
        echo "=== Analyse du Cache Système ==="
        echo "Taille des journaux système : $(calculate_cache_size /var/log) MB"
        echo "Taille du cache système : $(calculate_cache_size /Library/Caches) MB"
        echo "Taille des fichiers temporaires : $(calculate_cache_size /tmp) MB"
        echo ""
        
        echo "=== Analyse du Cache Utilisateur ==="
        echo "Taille du cache utilisateur : $(calculate_cache_size ~/Library/Caches) MB"
        echo "Taille des journaux utilisateur : $(calculate_cache_size ~/Library/Logs) MB"
        echo "Taille du cache QuickLook : $(calculate_cache_size ~/Library/Caches/com.apple.QuickLook.thumbnailcache) MB"
        echo ""
        
        echo "=== Analyse du Cache de Navigateur ==="
        if [[ -d ~/Library/Caches/com.apple.Safari ]]; then
            echo "Taille du cache Safari : $(calculate_cache_size ~/Library/Caches/com.apple.Safari) MB"
        fi
        if [[ -d ~/Library/Application\ Support/Google/Chrome ]]; then
            echo "Taille du cache Chrome : $(calculate_cache_size ~/Library/Application\ Support/Google/Chrome) MB"
        fi
        if [[ -d ~/Library/Application\ Support/Firefox ]]; then
            echo "Taille du cache Firefox : $(calculate_cache_size ~/Library/Application\ Support/Firefox) MB"
        fi
        if [[ -d ~/Library/Application\ Support/com.operasoftware.Opera ]]; then
            echo "Taille du cache Opera : $(calculate_cache_size ~/Library/Application\ Support/com.operasoftware.Opera) MB"
        fi
        echo ""
        
        echo "=== Analyse du Cache d'Applications ==="
        local total_app_cache=0
        for container in ~/Library/Containers/*; do
            if [[ -d "$container/Data/Library/Caches" ]]; then
                local size=$(calculate_cache_size "$container/Data/Library/Caches")
                if [[ $size -gt 10 ]]; then  # Signaler seulement si > 10MB
                    echo "$(basename "$container") : ${size} MB"
                    total_app_cache=$((total_app_cache + size))
                fi
            fi
        done
        echo "Total cache d'applications : ${total_app_cache} MB"
        echo ""
        
        echo "=== Résumé d'Utilisation du Disque ==="
        echo "Espace disque disponible : $(df -h / | awk 'NR==2{print $4}')"
        echo "Estimation totale du cache : $(($(calculate_cache_size ~/Library/Caches) + total_app_cache)) MB"
        
    } > "$report_file"
    
    echo "📊 Rapport sauvegardé dans : $report_file"
    log_action "Rapport de cache généré : $report_file"
}

# Nettoyage sélectif du cache basé sur la politique
clear_cache_selective() {
    echo "🧹 Début du nettoyage sélectif du cache basé sur la politique d'entreprise..."
    log_action "Début du nettoyage sélectif du cache"
    
    local total_cleared=0
    
    # Nettoyage du cache système
    if [[ "$ENABLE_SYSTEM_CACHE_CLEAR" == "true" ]]; then
        echo "Nettoyage du cache système..."
        local before_size=$(calculate_cache_size /Library/Caches)
        
        # Nettoyer seulement les anciens fichiers de cache
        find /Library/Caches -type f -mtime +$CACHE_AGE_DAYS -delete 2>/dev/null
        sudo find /var/log -name "*.log" -type f -mtime +$CACHE_AGE_DAYS -size +100M -delete 2>/dev/null
        
        local after_size=$(calculate_cache_size /Library/Caches)
        local cleared=$((before_size - after_size))
        total_cleared=$((total_cleared + cleared))
        
        log_action "Cache système nettoyé : ${cleared} MB"
    fi
    
    # Nettoyage du cache utilisateur
    echo "Nettoyage du cache utilisateur..."
    local before_size=$(calculate_cache_size ~/Library/Caches)
    
    # Nettoyer seulement les anciens fichiers de cache
    find ~/Library/Caches -type f -mtime +$CACHE_AGE_DAYS -delete 2>/dev/null
    find ~/Library/Logs -type f -mtime +$CACHE_AGE_DAYS -delete 2>/dev/null
    
    local after_size=$(calculate_cache_size ~/Library/Caches)
    local cleared=$((before_size - after_size))
    total_cleared=$((total_cleared + cleared))
    
    log_action "Cache utilisateur nettoyé : ${cleared} MB"
    
    # Nettoyage du cache de navigateur
    if [[ "$ENABLE_BROWSER_CACHE_CLEAR" == "true" ]]; then
        echo "Nettoyage des caches de navigateur..."
        clear_browser_caches
        log_action "Caches de navigateur nettoyés"
    fi
    
    # Nettoyage du cache d'applications
    if [[ "$ENABLE_APP_CACHE_CLEAR" == "true" ]]; then
        echo "Nettoyage des caches d'applications..."
        clear_application_caches
        log_action "Caches d'applications nettoyés"
    fi
    
    # Nettoyage de l'historique des téléchargements
    if [[ "$ENABLE_DOWNLOAD_HISTORY_CLEAR" == "true" ]]; then
        echo "Nettoyage de l'historique des téléchargements..."
        sqlite3 ~/Library/Preferences/com.apple.LaunchServices.QuarantineEventsV* \
            'DELETE FROM LSQuarantineEvent WHERE LSQuarantineTimeStamp < datetime("now", "-30 days")' 2>/dev/null
        log_action "Historique des téléchargements nettoyé"
    fi
    
    # Nettoyage de l'historique du terminal
    if [[ "$ENABLE_TERMINAL_HISTORY_CLEAR" == "true" ]]; then
        echo "Nettoyage de l'historique du terminal..."
        rm -rf ~/.bash_sessions/* 2>/dev/null
        rm -rf ~/.zsh_sessions/* 2>/dev/null
        log_action "Historique du terminal nettoyé"
    fi
    
    echo "✅ Nettoyage du cache terminé. Total nettoyé : ${total_cleared} MB"
    log_action "Nettoyage du cache terminé : ${total_cleared} MB nettoyés"
}

# Fonction de nettoyage des caches de navigateur
clear_browser_caches() {
    # Safari
    if [[ -d ~/Library/Caches/com.apple.Safari ]]; then
        rm -rf ~/Library/Caches/com.apple.Safari/* 2>/dev/null
    fi
    
    # Chrome
    if [[ -d ~/Library/Application\ Support/Google/Chrome ]]; then
        find ~/Library/Application\ Support/Google/Chrome -name "Cache" -type d -exec rm -rf {}/* \; 2>/dev/null
        find ~/Library/Application\ Support/Google/Chrome -name "GPUCache" -type d -exec rm -rf {}/* \; 2>/dev/null
    fi
    
    # Firefox
    for profile in ~/Library/Application\ Support/Firefox/Profiles/*; do
        if [[ -d "$profile/cache2" ]]; then
            rm -rf "$profile/cache2"/* 2>/dev/null
        fi
    done
    
    # Opera
    if [[ -d ~/Library/Application\ Support/com.operasoftware.Opera ]]; then
        rm -rf ~/Library/Application\ Support/com.operasoftware.Opera/Cache/* 2>/dev/null
    fi
}

# Fonction d'exécution principale
main() {
    local action="${1:-aide}"
    local target="${2:-}"
    
    log_action "=== Gestion de Cache MacFleet Démarrée ==="
    
    setup_directories
    
    case "$action" in
        "analyser"|"rapport")
            generate_cache_report
            ;;
        "nettoyer")
            clear_cache_selective
            ;;
        "systeme")
            echo "🧹 Nettoyage du cache système uniquement..."
            sudo rm -rf /Library/Caches/* 2>/dev/null
            sudo find /var/log -name "*.log" -type f -size +100M -delete 2>/dev/null
            ;;
        "utilisateur")
            echo "🗂️ Nettoyage du cache utilisateur uniquement..."
            rm -rf ~/Library/Caches/* 2>/dev/null
            rm -rf ~/Library/Logs/* 2>/dev/null
            ;;
        "navigateur")
            echo "🌐 Nettoyage du cache de navigateur uniquement..."
            clear_browser_caches
            ;;
        "aide"|*)
            echo "Outil de Gestion de Cache MacFleet"
            echo "Utilisation : $0 [action] [options]"
            echo ""
            echo "Actions :"
            echo "  analyser          - Générer un rapport d'analyse de cache"
            echo "  nettoyer          - Nettoyer le cache basé sur la politique d'entreprise"
            echo "  systeme           - Nettoyer le cache système uniquement"
            echo "  utilisateur       - Nettoyer le cache utilisateur uniquement"
            echo "  navigateur        - Nettoyer le cache de navigateur uniquement"
            echo "  aide              - Afficher ce message d'aide"
            ;;
    esac
    
    log_action "=== Gestion de Cache MacFleet Terminée ==="
}

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

Meilleures Pratiques de Gestion de Cache

Directives de Nettoyage de Cache Sécurisé

Type de CacheNiveau de SécuritéRecommandation
Cache SystèmeRisque ÉlevéNettoyer sélectivement, éviter les fichiers système critiques
Cache UtilisateurRisque MoyenSûr à nettoyer, peut réinitialiser les préférences
Cache NavigateurRisque FaibleSûr à nettoyer, va retélécharger le contenu web
Cache ApplicationsRisque MoyenVérifier les exigences spécifiques aux applications
Historique TéléchargementsRisque FaibleConsidérer les implications de confidentialité

Évaluation de l'Impact sur les Performances

# Mesurer l'impact du nettoyage de cache
echo "=== Avant le Nettoyage de Cache ==="
echo "Espace disponible : $(df -h / | awk 'NR==2{print $4}')"
echo "Taille du cache : $(du -sh ~/Library/Caches | awk '{print $1}')"

# Effectuer le nettoyage de cache
# ... commandes de nettoyage de cache ...

echo "=== Après le Nettoyage de Cache ==="
echo "Espace disponible : $(df -h / | awk 'NR==2{print $4}')"
echo "Espace récupéré : [différence calculée]"

Considérations de Sécurité

  • Prévention de Perte de Données - Toujours sauvegarder les données importantes avant de nettoyer les caches
  • Impact sur les Applications - Certaines applications peuvent avoir besoin de reconstruire les caches après nettoyage
  • Impact sur les Performances - Les performances initiales peuvent être plus lentes jusqu'à ce que les caches se reconstruisent
  • Implications de Confidentialité - Le nettoyage du cache de navigateur supprime les mots de passe sauvegardés et paramètres
  • Stabilité du Système - Éviter de nettoyer les caches système critiques sans tests appropriés

Dépannage

Échecs de Nettoyage de Cache

# Vérifier les fichiers verrouillés
lsof | grep "Library/Caches"

# Forcer la fermeture des applications utilisant le cache
sudo pkill -f "nom_application"

# Vérifier les permissions
ls -la ~/Library/Caches/

Espace Disque Non Libéré

# Forcer la mise à jour du système de fichiers
sync

# Vérifier les fichiers cachés
ls -la ~/Library/Caches/

# Vérifier la suppression effective
du -sh ~/Library/Caches/

Notes Importantes

  • Sauvegarder les Données Importantes avant d'exécuter les scripts de nettoyage de cache
  • Fermer les Applications avant de nettoyer leurs caches spécifiques
  • Tester les Scripts sur des appareils individuels avant le déploiement de flotte
  • Surveiller les Performances après le nettoyage de cache pour tout problème
  • Planifier un Nettoyage Régulier pour maintenir des performances optimales
  • Documenter les Politiques pour la conformité et l'audit

Gestion des Données de Navigateur et Conformité Confidentialité sur macOS

Implémentez une gestion complète des données de navigateur et la conformité de confidentialité sur vos appareils MacFleet. Ce tutoriel couvre l'effacement des données multi-navigateurs, l'application des politiques de confidentialité, la gestion de la rétention des données et les flux de travail de conformité automatisés pour les environnements d'entreprise.

Comprendre la Gestion des Données de Navigateur

Les données de navigateur englobent divers types d'informations utilisateur :

  • Historique de navigation - Enregistrements de visite de sites web et horodatages
  • Cookies et stockage local - Données de session et préférences utilisateur
  • Fichiers cache - Contenu web temporaire et ressources
  • Historique de téléchargement - Enregistrements de téléchargement de fichiers et métadonnées
  • Données de formulaire et mots de passe - Informations de saisie automatique et identifiants
  • Extensions et paramètres - Configuration du navigateur et modules complémentaires

Effacement Basique de l'Historique de Navigateur

Effacer l'Historique Google Chrome

#!/bin/bash

# Effacer l'historique de navigation Google Chrome
clear_chrome_history() {
    echo "=== Effacement de l'Historique Google Chrome ==="
    
    # Obtenir l'utilisateur connecté
    local logged_user
    logged_user=$(stat -f%Su /dev/console 2>/dev/null)
    
    if [[ -z "$logged_user" || "$logged_user" == "root" ]]; then
        echo "❌ Aucune session utilisateur active trouvée"
        return 1
    fi
    
    echo "👤 Utilisateur cible: $logged_user"
    
    # Chemin du profil Chrome
    local chrome_profile="/Users/$logged_user/Library/Application Support/Google/Chrome/Default"
    
    # Vérifier si Chrome est installé et le profil existe
    if [[ ! -d "$chrome_profile" ]]; then
        echo "⚠️  Profil Chrome non trouvé pour l'utilisateur: $logged_user"
        return 1
    fi
    
    # Tuer les processus Chrome s'ils sont en cours d'exécution
    pkill -f "Google Chrome" 2>/dev/null
    sleep 2
    
    # Effacer le fichier d'historique
    if sudo -u "$logged_user" rm -f "$chrome_profile/History" 2>/dev/null; then
        echo "✅ Historique Chrome effacé pour l'utilisateur: $logged_user"
    else
        echo "❌ Échec de l'effacement de l'historique Chrome"
        return 1
    fi
    
    return 0
}

# Exécuter la fonction
clear_chrome_history

Effacer l'Historique Firefox

#!/bin/bash

# Effacer l'historique de navigation Firefox
clear_firefox_history() {
    echo "=== Effacement de l'Historique Firefox ==="
    
    # Obtenir l'utilisateur connecté
    local logged_user
    logged_user=$(stat -f%Su /dev/console 2>/dev/null)
    
    if [[ -z "$logged_user" || "$logged_user" == "root" ]]; then
        echo "❌ Aucune session utilisateur active trouvée"
        return 1
    fi
    
    echo "👤 Utilisateur cible: $logged_user"
    
    # Chemin des profils Firefox
    local firefox_profiles="/Users/$logged_user/Library/Application Support/Firefox/Profiles"
    
    # Vérifier si les profils Firefox existent
    if [[ ! -d "$firefox_profiles" ]]; then
        echo "⚠️  Profils Firefox non trouvés pour l'utilisateur: $logged_user"
        return 1
    fi
    
    # Tuer les processus Firefox s'ils sont en cours d'exécution
    pkill -f "firefox" 2>/dev/null
    sleep 2
    
    # Effacer l'historique de tous les profils Firefox
    local profiles_cleared=0
    for profile_dir in "$firefox_profiles"/*; do
        if [[ -d "$profile_dir" ]]; then
            # Supprimer places.sqlite (contient l'historique)
            if sudo -u "$logged_user" rm -f "$profile_dir/places.sqlite" 2>/dev/null; then
                profiles_cleared=$((profiles_cleared + 1))
                echo "✅ Historique effacé pour le profil: $(basename "$profile_dir")"
            fi
        fi
    done
    
    if [[ $profiles_cleared -gt 0 ]]; then
        echo "✅ Historique Firefox effacé de $profiles_cleared profil(s)"
        return 0
    else
        echo "❌ Échec de l'effacement de l'historique Firefox"
        return 1
    fi
}

# Exécuter la fonction
clear_firefox_history

Système de Gestion des Données de Navigateur d'Entreprise

#!/bin/bash

# Système de Gestion des Données de Navigateur d'Entreprise MacFleet
# Conformité de confidentialité complète, gestion du cycle de vie des données et support multi-navigateurs

# Configuration
LOG_FILE="/var/log/macfleet_browser_data.log"
CONFIG_DIR="/etc/macfleet/browser_management"
POLICIES_DIR="$CONFIG_DIR/policies"
REPORTS_DIR="$CONFIG_DIR/reports"
COMPLIANCE_DIR="$CONFIG_DIR/compliance"
BACKUP_DIR="/var/backups/browser_configs"

# Navigateurs supportés et leurs emplacements de données
declare -A BROWSER_PATHS=(
    ["chrome"]="/Library/Application Support/Google/Chrome"
    ["firefox"]="/Library/Application Support/Firefox"
    ["safari"]="/Library/Safari"
    ["edge"]="/Library/Application Support/Microsoft Edge"
    ["opera"]="/Library/Application Support/com.operasoftware.Opera"
    ["brave"]="/Library/Application Support/BraveSoftware/Brave-Browser"
    ["vivaldi"]="/Library/Application Support/Vivaldi"
)

# Types de données de navigateur et fichiers correspondants
declare -A DATA_TYPES=(
    ["history"]="History,places.sqlite,History.db"
    ["cookies"]="Cookies,cookies.sqlite,Cookies.binarycookies"
    ["cache"]="Cache,cache2,WebKit/NetworkCache"
    ["downloads"]="Downloads,downloads.sqlite"
    ["passwords"]="Login Data,key4.db,logins.json"
    ["bookmarks"]="Bookmarks,bookmarks.sqlite,Bookmarks.plist"
    ["extensions"]="Extensions,extensions.sqlite,Extensions"
    ["settings"]="Preferences,prefs.js,com.apple.Safari.plist"
)

# Modèles de politique de confidentialité
declare -A PRIVACY_POLICIES=(
    ["strict"]="clear_all_daily,no_persistent_cookies,history_retention_1day"
    ["moderate"]="clear_history_weekly,selective_cookies,history_retention_7days"
    ["lenient"]="clear_cache_monthly,allow_cookies,history_retention_30days"
    ["compliance"]="audit_all,encrypt_data,gdpr_compliance,history_retention_legal"
    ["education"]="clear_daily_schedule,safe_browsing,limited_downloads"
    ["healthcare"]="hipaa_compliant,no_data_retention,audit_all_access"
    ["finance"]="sox_compliant,encrypted_storage,detailed_audit"
)

# Cadres de conformité
declare -A COMPLIANCE_FRAMEWORKS=(
    ["gdpr"]="right_to_erasure,data_minimization,consent_required,audit_trails"
    ["hipaa"]="phi_protection,access_controls,audit_logs,encryption_required"
    ["sox"]="financial_data_protection,retention_policies,access_monitoring"
    ["coppa"]="child_privacy_protection,parental_consent,data_deletion"
    ["ccpa"]="california_privacy_rights,data_transparency,deletion_rights"
)

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

# Configuration des répertoires
setup_directories() {
    for dir in "$CONFIG_DIR" "$POLICIES_DIR" "$REPORTS_DIR" "$COMPLIANCE_DIR" "$BACKUP_DIR"; do
        if [[ ! -d "$dir" ]]; then
            mkdir -p "$dir"
            log_action "Répertoire créé: $dir"
        fi
    done
}

# Obtenir tous les utilisateurs avec des données de navigateur
get_browser_users() {
    local users=()
    
    # Obtenir tous les utilisateurs avec UID >= 500 (utilisateurs réguliers)
    while IFS= read -r user; do
        local user_home
        user_home=$(dscl . read "/Users/$user" NFSHomeDirectory 2>/dev/null | awk '{print $2}')
        
        if [[ -n "$user_home" && -d "$user_home" ]]; then
            # Vérifier si l'utilisateur a des données de navigateur
            for browser in "${!BROWSER_PATHS[@]}"; do
                local browser_path="$user_home${BROWSER_PATHS[$browser]}"
                if [[ -d "$browser_path" ]]; then
                    users+=("$user")
                    break
                fi
            done
        fi
    done < <(dscl . list /Users UniqueID | awk '$2 >= 500 {print $1}')
    
    printf '%s\n' "${users[@]}"
}

# Détecter les navigateurs installés pour un utilisateur
detect_user_browsers() {
    local username="$1"
    local user_home
    user_home=$(dscl . read "/Users/$username" NFSHomeDirectory 2>/dev/null | awk '{print $2}')
    
    if [[ -z "$user_home" ]]; then
        return 1
    fi
    
    local installed_browsers=()
    
    for browser in "${!BROWSER_PATHS[@]}"; do
        local browser_path="$user_home${BROWSER_PATHS[$browser]}"
        if [[ -d "$browser_path" ]]; then
            installed_browsers+=("$browser")
        fi
    done
    
    printf '%s\n' "${installed_browsers[@]}"
}

# Effacer un type spécifique de données de navigateur
clear_browser_data() {
    local username="$1"
    local browser="$2"
    local data_type="$3"
    local backup="${4:-false}"
    
    log_action "Effacement $data_type de $browser pour l'utilisateur: $username"
    
    local user_home
    user_home=$(dscl . read "/Users/$username" NFSHomeDirectory 2>/dev/null | awk '{print $2}')
    
    if [[ -z "$user_home" ]]; then
        log_action "❌ Utilisateur non trouvé: $username"
        return 1
    fi
    
    local browser_path="$user_home${BROWSER_PATHS[$browser]}"
    
    if [[ ! -d "$browser_path" ]]; then
        log_action "⚠️  Navigateur $browser non trouvé pour l'utilisateur: $username"
        return 1
    fi
    
    # Tuer les processus du navigateur
    case "$browser" in
        "chrome")
            pkill -f "Google Chrome" 2>/dev/null
            ;;
        "firefox")
            pkill -f "firefox" 2>/dev/null
            ;;
        "safari")
            pkill -f "Safari" 2>/dev/null
            ;;
        "edge")
            pkill -f "Microsoft Edge" 2>/dev/null
            ;;
        *)
            pkill -f "$browser" 2>/dev/null
            ;;
    esac
    
    sleep 2
    
    # Obtenir les fichiers de données pour ce type
    local data_files="${DATA_TYPES[$data_type]}"
    IFS=',' read -ra FILES <<< "$data_files"
    
    local cleared_count=0
    
    for file_pattern in "${FILES[@]}"; do
        # Trouver et traiter les fichiers correspondants
        while IFS= read -r -d '' file; do
            if [[ -f "$file" || -d "$file" ]]; then
                # Sauvegarder si demandé
                if [[ "$backup" == "true" ]]; then
                    backup_browser_data "$username" "$browser" "$file"
                fi
                
                # Effacer les données
                if sudo -u "$username" rm -rf "$file" 2>/dev/null; then
                    cleared_count=$((cleared_count + 1))
                    log_action "✅ Effacé: $file"
                else
                    log_action "❌ Échec de l'effacement: $file"
                fi
            fi
        done < <(find "$browser_path" -name "$file_pattern" -print0 2>/dev/null)
    done
    
    log_action "$cleared_count fichiers de données effacés pour $data_type dans $browser"
    return 0
}

# Audit complet des données de navigateur
audit_browser_data() {
    log_action "Démarrage de l'audit complet des données de navigateur"
    
    local audit_report="$REPORTS_DIR/browser_audit_$(date '+%Y%m%d_%H%M%S').json"
    
    cat > "$audit_report" << EOF
{
    "audit_metadata": {
        "timestamp": "$(date -Iseconds)",
        "hostname": "$(hostname)",
        "os_version": "$(sw_vers -productVersion)",
        "generator": "MacFleet Browser Data Manager"
    },
    "user_browser_data": [
EOF

    local first=true
    local total_users=0
    local users_with_data=0
    
    # Auditer chaque utilisateur
    for user in $(get_browser_users); do
        total_users=$((total_users + 1))
        users_with_data=$((users_with_data + 1))
        
        if [[ "$first" == true ]]; then
            first=false
        else
            echo "," >> "$audit_report"
        fi
        
        local user_home
        user_home=$(dscl . read "/Users/$user" NFSHomeDirectory 2>/dev/null | awk '{print $2}')
        
        local user_browsers
        user_browsers=$(detect_user_browsers "$user")
        
        # Analyser les données pour chaque navigateur
        local browser_data="["
        local browser_first=true
        
        for browser in $user_browsers; do
            if [[ "$browser_first" == true ]]; then
                browser_first=false
            else
                browser_data+=","
            fi
            
            local data_analysis
            data_analysis=$(analyze_browser_data "$user" "$browser")
            
            browser_data+="{\"browser\": \"$browser\", \"data\": $data_analysis}"
        done
        
        browser_data+="]"
        
        cat >> "$audit_report" << EOF
        {
            "username": "$user",
            "user_home": "$user_home",
            "browsers": $browser_data,
            "last_login": "$(last -1 "$user" | head -1 | awk '{print $4, $5, $6, $7}' || echo 'Jamais')",
            "privacy_risk_score": $(calculate_privacy_risk "$user")
        }
EOF
        
        log_action "Utilisateur audité: $user"
    done
    
    cat >> "$audit_report" << EOF
    ],
    "summary": {
        "total_users": $total_users,
        "users_with_browser_data": $users_with_data,
        "supported_browsers": $(echo "${!BROWSER_PATHS[@]}" | tr ' ' '\n' | jq -R . | jq -s .),
        "data_types_monitored": $(echo "${!DATA_TYPES[@]}" | tr ' ' '\n' | jq -R . | jq -s .)
    }
}
EOF

    log_action "✅ Audit des données de navigateur terminé: $audit_report"
    echo "$audit_report"
}

# Analyser les données de navigateur pour un utilisateur et navigateur spécifiques
analyze_browser_data() {
    local username="$1"
    local browser="$2"
    
    local user_home
    user_home=$(dscl . read "/Users/$username" NFSHomeDirectory 2>/dev/null | awk '{print $2}')
    local browser_path="$user_home${BROWSER_PATHS[$browser]}"
    
    local data_summary="{"
    local type_first=true
    
    for data_type in "${!DATA_TYPES[@]}"; do
        if [[ "$type_first" == true ]]; then
            type_first=false
        else
            data_summary+=","
        fi
        
        local file_count=0
        local total_size=0
        
        local data_files="${DATA_TYPES[$data_type]}"
        IFS=',' read -ra FILES <<< "$data_files"
        
        for file_pattern in "${FILES[@]}"; do
            while IFS= read -r -d '' file; do
                if [[ -f "$file" ]]; then
                    file_count=$((file_count + 1))
                    local size
                    size=$(stat -f%z "$file" 2>/dev/null || echo 0)
                    total_size=$((total_size + size))
                elif [[ -d "$file" ]]; then
                    file_count=$((file_count + 1))
                    local size
                    size=$(du -sk "$file" 2>/dev/null | awk '{print $1*1024}' || echo 0)
                    total_size=$((total_size + size))
                fi
            done < <(find "$browser_path" -name "$file_pattern" -print0 2>/dev/null)
        done
        
        data_summary+="\"$data_type\": {\"file_count\": $file_count, \"total_size_bytes\": $total_size}"
    done
    
    data_summary+="}"
    echo "$data_summary"
}

# Calculer le score de risque de confidentialité pour un utilisateur
calculate_privacy_risk() {
    local username="$1"
    local risk_score=0
    
    # Analyser la rétention des données et les risques de confidentialité
    local user_browsers
    user_browsers=$(detect_user_browsers "$username")
    
    for browser in $user_browsers; do
        local data_analysis
        data_analysis=$(analyze_browser_data "$username" "$browser")
        
        # Calcul simple du risque basé sur le volume de données
        local history_size
        history_size=$(echo "$data_analysis" | jq -r '.history.total_size_bytes // 0')
        
        if [[ $history_size -gt 10485760 ]]; then  # > 10MB
            risk_score=$((risk_score + 3))
        elif [[ $history_size -gt 1048576 ]]; then  # > 1MB
            risk_score=$((risk_score + 2))
        elif [[ $history_size -gt 0 ]]; then
            risk_score=$((risk_score + 1))
        fi
    done
    
    # Plafonner à 10
    if [[ $risk_score -gt 10 ]]; then
        risk_score=10
    fi
    
    echo "$risk_score"
}

# Appliquer une politique de confidentialité aux utilisateurs
apply_privacy_policy() {
    local policy_name="$1"
    local target_users="$2"
    
    log_action "Application de la politique de confidentialité: $policy_name"
    
    local policy_config="${PRIVACY_POLICIES[$policy_name]}"
    if [[ -z "$policy_config" ]]; then
        log_action "❌ Politique de confidentialité inconnue: $policy_name"
        return 1
    fi
    
    # Obtenir les utilisateurs cibles
    local users=()
    if [[ -n "$target_users" ]]; then
        IFS=',' read -ra users <<< "$target_users"
    else
        while IFS= read -r user; do
            users+=("$user")
        done < <(get_browser_users)
    fi
    
    # Analyser la configuration de la politique
    IFS=',' read -ra POLICY_RULES <<< "$policy_config"
    
    for user in "${users[@]}"; do
        log_action "Application de la politique '$policy_name' à l'utilisateur: $user"
        
        for rule in "${POLICY_RULES[@]}"; do
            case "$rule" in
                "clear_all_daily")
                    schedule_daily_cleanup "$user" "all"
                    ;;
                "clear_history_weekly")
                    schedule_weekly_cleanup "$user" "history"
                    ;;
                "clear_cache_monthly")
                    schedule_monthly_cleanup "$user" "cache"
                    ;;
                "no_persistent_cookies")
                    clear_browser_data "$user" "all" "cookies"
                    ;;
                "audit_all")
                    enable_comprehensive_audit "$user"
                    ;;
                "gdpr_compliance")
                    configure_gdpr_compliance "$user"
                    ;;
                "hipaa_compliant")
                    configure_hipaa_compliance "$user"
                    ;;
            esac
        done
        
        log_action "✅ Politique appliquée à l'utilisateur: $user"
    done
    
    return 0
}

# Programmer un nettoyage automatisé
schedule_daily_cleanup() {
    local username="$1"
    local data_type="$2"
    
    log_action "Programmation du nettoyage quotidien pour l'utilisateur: $username, données: $data_type"
    
    # Créer un LaunchAgent pour l'utilisateur
    local launch_agent_path="/Users/$username/Library/LaunchAgents/com.macfleet.browser-cleanup.plist"
    
    cat > "$launch_agent_path" << EOF
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.macfleet.browser-cleanup</string>
    <key>ProgramArguments</key>
    <array>
        <string>/usr/local/bin/macfleet-browser-cleanup</string>
        <string>--user</string>
        <string>$username</string>
        <string>--data-type</string>
        <string>$data_type</string>
    </array>
    <key>StartCalendarInterval</key>
    <dict>
        <key>Hour</key>
        <integer>2</integer>
        <key>Minute</key>
        <integer>0</integer>
    </dict>
    <key>RunAtLoad</key>
    <false/>
</dict>
</plist>
EOF
    
    chown "$username:staff" "$launch_agent_path"
    log_action "✅ Nettoyage quotidien programmé pour l'utilisateur: $username"
}

# Générer un rapport de conformité
generate_compliance_report() {
    local framework="$1"
    
    log_action "Génération du rapport de conformité pour le cadre: $framework"
    
    local compliance_report="$COMPLIANCE_DIR/compliance_${framework}_$(date '+%Y%m%d_%H%M%S').json"
    
    cat > "$compliance_report" << EOF
{
    "compliance_metadata": {
        "timestamp": "$(date -Iseconds)",
        "framework": "$framework",
        "hostname": "$(hostname)",
        "generator": "MacFleet Browser Compliance Manager"
    },
    "compliance_assessment": {
        "framework_requirements": $(get_framework_requirements "$framework"),
        "current_status": $(assess_compliance_status "$framework"),
        "recommendations": $(generate_compliance_recommendations "$framework"),
        "risk_assessment": $(calculate_compliance_risk "$framework")
    },
    "user_compliance": [
EOF

    local first=true
    
    # Évaluer la conformité pour chaque utilisateur
    for user in $(get_browser_users); do
        if [[ "$first" == true ]]; then
            first=false
        else
            echo "," >> "$compliance_report"
        fi
        
        local user_compliance
        user_compliance=$(assess_user_compliance "$user" "$framework")
        
        cat >> "$compliance_report" << EOF
        {
            "username": "$user",
            "compliance_status": $user_compliance
        }
EOF
    done
    
    cat >> "$compliance_report" << EOF
    ]
}
EOF

    log_action "✅ Rapport de conformité généré: $compliance_report"
    echo "$compliance_report"
}

# Obtenir les exigences du cadre
get_framework_requirements() {
    local framework="$1"
    
    case "$framework" in
        "gdpr")
            echo '{"data_minimization": true, "right_to_erasure": true, "consent_required": true, "audit_trails": true}'
            ;;
        "hipaa")
            echo '{"phi_protection": true, "access_controls": true, "audit_logs": true, "encryption_required": true}'
            ;;
        "sox")
            echo '{"financial_data_protection": true, "retention_policies": true, "access_monitoring": true}'
            ;;
        "coppa")
            echo '{"child_privacy_protection": true, "parental_consent": true, "data_deletion": true}'
            ;;
        *)
            echo '{"general_privacy": true, "basic_audit": true}'
            ;;
    esac
}

# Évaluer le statut de conformité
assess_compliance_status() {
    local framework="$1"
    
    local compliance_score=0
    local total_checks=0
    
    # Vérifier les contrôles de confidentialité de base
    total_checks=$((total_checks + 1))
    if [[ -f "$POLICIES_DIR/privacy_policy.conf" ]]; then
        compliance_score=$((compliance_score + 1))
    fi
    
    # Vérifier la journalisation d'audit
    total_checks=$((total_checks + 1))
    if [[ -f "$LOG_FILE" ]]; then
        compliance_score=$((compliance_score + 1))
    fi
    
    # Vérifications spécifiques au cadre
    case "$framework" in
        "gdpr")
            total_checks=$((total_checks + 2))
            # Vérifier les politiques de rétention des données
            if [[ -f "$POLICIES_DIR/data_retention.conf" ]]; then
                compliance_score=$((compliance_score + 1))
            fi
            # Vérifier la gestion du consentement
            if [[ -f "$POLICIES_DIR/consent_management.conf" ]]; then
                compliance_score=$((compliance_score + 1))
            fi
            ;;
        "hipaa")
            total_checks=$((total_checks + 1))
            # Vérifier le chiffrement
            if system_profiler SPStorageDataType | grep -q "Encrypted: Yes"; then
                compliance_score=$((compliance_score + 1))
            fi
            ;;
    esac
    
    local compliance_percentage
    compliance_percentage=$(awk "BEGIN {printf \"%.0f\", ($compliance_score/$total_checks)*100}")
    
    echo "{\"score\": $compliance_score, \"total_checks\": $total_checks, \"percentage\": $compliance_percentage, \"status\": \"$([ $compliance_percentage -ge 80 ] && echo 'conforme' || echo 'non_conforme')\"}"
}

# Évaluer la conformité utilisateur
assess_user_compliance() {
    local username="$1"
    local framework="$2"
    
    local privacy_risk
    privacy_risk=$(calculate_privacy_risk "$username")
    
    local compliance_status="conforme"
    if [[ $privacy_risk -gt 7 ]]; then
        compliance_status="risque_eleve"
    elif [[ $privacy_risk -gt 4 ]]; then
        compliance_status="risque_moyen"
    fi
    
    echo "{\"privacy_risk_score\": $privacy_risk, \"status\": \"$compliance_status\"}"
}

# Sauvegarder les données du navigateur avant effacement
backup_browser_data() {
    local username="$1"
    local browser="$2"
    local data_path="$3"
    
    local timestamp
    timestamp=$(date '+%Y%m%d_%H%M%S')
    local backup_file="$BACKUP_DIR/browser_backup_${username}_${browser}_${timestamp}.tar.gz"
    
    if tar -czf "$backup_file" -C "$(dirname "$data_path")" "$(basename "$data_path")" 2>/dev/null; then
        log_action "✅ Données du navigateur sauvegardées: $backup_file"
        echo "$backup_file"
    else
        log_action "❌ Échec de la sauvegarde des données du navigateur: $data_path"
        return 1
    fi
}

# Fonction d'exécution principale
main() {
    local action="${1:-audit}"
    local parameter="$2"
    local additional_param="$3"
    local extra_param="$4"
    
    log_action "=== Gestion des Données de Navigateur MacFleet Démarrée ==="
    log_action "Action: $action"
    log_action "Paramètre: ${parameter:-N/A}"
    
    setup_directories
    
    case "$action" in
        "clear")
            if [[ -z "$parameter" || -z "$additional_param" ]]; then
                echo "Usage: $0 clear <navigateur> <type_donnees> [nom_utilisateur] [sauvegarde]"
                echo "Navigateurs: ${!BROWSER_PATHS[*]}"
                echo "Types de données: ${!DATA_TYPES[*]}"
                exit 1
            fi
            local target_user="${extra_param:-$(stat -f%Su /dev/console 2>/dev/null)}"
            clear_browser_data "$target_user" "$parameter" "$additional_param" "${5:-false}"
            ;;
        "audit")
            audit_browser_data
            ;;
        "policy")
            if [[ -z "$parameter" ]]; then
                echo "Politiques de confidentialité disponibles:"
                for policy in "${!PRIVACY_POLICIES[@]}"; do
                    echo "  - $policy: ${PRIVACY_POLICIES[$policy]}"
                done
                echo ""
                echo "Usage: $0 policy <nom_politique> [utilisateurs_cibles]"
                exit 1
            fi
            apply_privacy_policy "$parameter" "$additional_param"
            ;;
        "compliance")
            if [[ -z "$parameter" ]]; then
                echo "Cadres de conformité disponibles:"
                for framework in "${!COMPLIANCE_FRAMEWORKS[@]}"; do
                    echo "  - $framework: ${COMPLIANCE_FRAMEWORKS[$framework]}"
                done
                echo ""
                echo "Usage: $0 compliance <cadre>"
                exit 1
            fi
            generate_compliance_report "$parameter"
            ;;
        "detect")
            local target_user="${parameter:-$(stat -f%Su /dev/console 2>/dev/null)}"
            echo "Navigateurs détectés pour l'utilisateur '$target_user':"
            detect_user_browsers "$target_user"
            ;;
        *)
            echo "Usage: $0 {clear|audit|policy|compliance|detect}"
            echo "  clear       - Effacer des données spécifiques du navigateur"
            echo "  audit       - Générer un audit complet des données du navigateur"
            echo "  policy      - Appliquer une politique de confidentialité aux utilisateurs"
            echo "  compliance  - Générer un rapport de conformité"
            echo "  detect      - Détecter les navigateurs installés pour l'utilisateur"
            exit 1
            ;;
    esac
    
    log_action "=== Gestion des données du navigateur terminée ==="
}

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

Fonctionnalités Avancées de Gestion de Navigateur

Analyse Multi-Navigateurs

#!/bin/bash

# Analyse complète des données multi-navigateurs
analyze_all_browsers() {
    echo "=== Analyse des Données Multi-Navigateurs ==="
    
    local analysis_report="$REPORTS_DIR/browser_analysis_$(date '+%Y%m%d_%H%M%S').json"
    
    cat > "$analysis_report" << EOF
{
    "analysis_metadata": {
        "timestamp": "$(date -Iseconds)",
        "hostname": "$(hostname)"
    },
    "browser_usage_analysis": {
EOF

    local browser_first=true
    
    # Analyser chaque navigateur supporté
    for browser in "${!BROWSER_PATHS[@]}"; do
        if [[ "$browser_first" == true ]]; then
            browser_first=false
        else
            echo "," >> "$analysis_report"
        fi
        
        local users_with_browser=0
        local total_data_size=0
        
        # Compter les utilisateurs et la taille des données pour ce navigateur
        for user in $(get_browser_users); do
            local user_browsers
            user_browsers=$(detect_user_browsers "$user")
            
            if echo "$user_browsers" | grep -q "^$browser$"; then
                users_with_browser=$((users_with_browser + 1))
                
                local browser_data
                browser_data=$(analyze_browser_data "$user" "$browser")
                
                # Additionner les tailles de données
                for data_type in "${!DATA_TYPES[@]}"; do
                    local size
                    size=$(echo "$browser_data" | jq -r ".$data_type.total_size_bytes // 0")
                    total_data_size=$((total_data_size + size))
                done
            fi
        done
        
        cat >> "$analysis_report" << EOF
        "$browser": {
            "users_count": $users_with_browser,
            "total_data_size_bytes": $total_data_size,
            "average_data_per_user": $(( users_with_browser > 0 ? total_data_size / users_with_browser : 0 ))
        }
EOF
    done
    
    cat >> "$analysis_report" << EOF
    }
}
EOF

    echo "📊 Analyse du navigateur terminée: $analysis_report"
}

Nettoyage Automatisé de Confidentialité

#!/bin/bash

# Nettoyage automatisé de confidentialité basé sur l'âge des données et la politique
automated_privacy_cleanup() {
    local retention_days="${1:-7}"
    local dry_run="${2:-false}"
    
    echo "=== Nettoyage Automatisé de Confidentialité ==="
    echo "Période de rétention: $retention_days jours"
    echo "Exécution à sec: $dry_run"
    
    local cleanup_report="$REPORTS_DIR/privacy_cleanup_$(date '+%Y%m%d_%H%M%S').json"
    
    cat > "$cleanup_report" << EOF
{
    "cleanup_metadata": {
        "timestamp": "$(date -Iseconds)",
        "retention_days": $retention_days,
        "dry_run": $dry_run
    },
    "cleanup_results": [
EOF

    local first=true
    local total_cleaned=0
    
    # Traiter chaque utilisateur
    for user in $(get_browser_users); do
        local user_home
        user_home=$(dscl . read "/Users/$user" NFSHomeDirectory 2>/dev/null | awk '{print $2}')
        
        for browser in $(detect_user_browsers "$user"); do
            local browser_path="$user_home${BROWSER_PATHS[$browser]}"
            
            # Trouver les anciens fichiers de données
            while IFS= read -r -d '' file; do
                local file_age_days
                file_age_days=$(( ($(date +%s) - $(stat -f%m "$file")) / 86400 ))
                
                if [[ $file_age_days -gt $retention_days ]]; then
                    if [[ "$first" == true ]]; then
                        first=false
                    else
                        echo "," >> "$cleanup_report"
                    fi
                    
                    cat >> "$cleanup_report" << EOF
        {
            "user": "$user",
            "browser": "$browser",
            "file": "$file",
            "age_days": $file_age_days,
            "action": "$([ "$dry_run" == "true" ] && echo "serait_supprime" || echo "supprime")"
        }
EOF
                    
                    if [[ "$dry_run" != "true" ]]; then
                        if sudo -u "$user" rm -rf "$file" 2>/dev/null; then
                            total_cleaned=$((total_cleaned + 1))
                        fi
                    fi
                fi
            done < <(find "$browser_path" -type f -print0 2>/dev/null)
        done
    done
    
    cat >> "$cleanup_report" << EOF
    ],
    "summary": {
        "total_files_processed": $total_cleaned
    }
}
EOF

    echo "🧹 Nettoyage de confidentialité terminé: $cleanup_report"
}

Meilleures Pratiques

🔒 Confidentialité et Sécurité

  • Principes de minimisation des données avec politiques de nettoyage automatisées
  • Gestion du consentement pour la collecte et le traitement des données
  • Standards de chiffrement pour les données sensibles du navigateur
  • Contrôles d'accès avec permissions de gestion des données basées sur les rôles

📋 Gestion de la Conformité

  • Support multi-cadres (RGPD, HIPAA, SOX, COPPA, CCPA)
  • Évaluation automatisée de conformité avec audit régulier
  • Politiques de rétention des données alignées avec les exigences légales
  • Pistes d'audit avec journalisation et rapports complets

🔧 Opérations d'Entreprise

  • Déploiement à l'échelle de la flotte des politiques de confidentialité et gestion des données
  • Opérations de nettoyage programmées avec périodes de rétention personnalisables
  • Capacités de sauvegarde et récupération pour les configurations de navigateur
  • Support d'intégration avec les systèmes de sécurité et conformité existants

🚀 Expérience Utilisateur

  • Opérations non-disruptives avec gestion des processus du navigateur
  • Effacement sélectif des données préservant les préférences importantes de l'utilisateur
  • Rapports transparents sur les activités de gestion des données
  • Application flexible des politiques basée sur les rôles et exigences des utilisateurs

Notes Importantes

  • Compatibilité des navigateurs varie selon les différentes applications et versions
  • Sauvegarde des données utilisateur recommandée avant l'implémentation de politiques de nettoyage agressives
  • Impact sur les performances minimal lorsque les opérations sont programmées en heures creuses
  • Exigences de conformité légale varient selon la juridiction et l'industrie
  • Notification utilisateur peut être requise pour certaines activités de gestion des données
  • Révision régulière des politiques nécessaire pour s'adapter aux réglementations de confidentialité changeantes