Guide

Nouvelles mises à jour et améliorations de Macfleet.

Surveillance Réseau d'Entreprise sur macOS

Surveillez et contrôlez l'activité réseau sur vos appareils MacFleet en utilisant les techniques avancées de surveillance réseau, l'analyse de bande passante et les contrôles de sécurité d'entreprise. Ce tutoriel fournit des outils complets pour implémenter la gestion réseau organisationnelle et les politiques de sécurité.

Comprendre la Surveillance Réseau macOS

macOS fournit plusieurs outils pour la surveillance de l'activité réseau :

  • lsof - Lister les fichiers ouverts et les connexions réseau
  • netstat - Afficher les connexions réseau et les tables de routage
  • nettop - Utilisation réseau en temps réel par processus
  • tcpdump - Capture et analyse de paquets
  • Little Snitch - Pare-feu au niveau application et moniteur réseau

Surveillance de Connexion Réseau Basique

Lister les Applications Connectées à Internet

#!/bin/bash

# Lister les processus uniques avec des connexions internet
lsof -nPi | cut -f 1 -d " " | uniq | tail -n +2

echo "Processus connectés à internet listés"

Connexions Réseau Détaillées

#!/bin/bash

# Afficher les informations détaillées de connexion réseau
echo "=== Connexions Réseau Actives ==="
lsof -nPi

echo -e "\n=== Statistiques Réseau ==="
netstat -an | head -20

Activité Réseau Spécifique par Processus

#!/bin/bash

# Surveiller l'activité réseau d'une application spécifique
APP_NAME="Chrome"

echo "Connexions réseau pour $APP_NAME:"
lsof -nPi | grep -i "$APP_NAME"

Système de Surveillance Réseau d'Entreprise

#!/bin/bash

# Système de Surveillance Réseau d'Entreprise MacFleet
# Surveillance complète de l'activité réseau et gestion de sécurité

# Configuration
MACFLEET_DIR="/etc/macfleet"
MONITORING_DIR="$MACFLEET_DIR/network_monitoring"
REPORTS_DIR="$MACFLEET_DIR/reports"
COMPLIANCE_DIR="$MACFLEET_DIR/compliance"
AUDIT_DIR="$MACFLEET_DIR/audit"
LOG_FILE="/var/log/macfleet_network_monitoring.log"
ALERTS_DIR="$MACFLEET_DIR/alerts"

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

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

# Catégories d'Applications pour la Surveillance Réseau
declare -A APP_CATEGORIES=(
    ["apps_affaires"]="Slack,Zoom,Microsoft Teams,Office 365,Salesforce"
    ["outils_developpement"]="Xcode,Visual Studio Code,Docker,Git,npm"
    ["navigateurs"]="Chrome,Firefox,Safari,Edge"
    ["communication"]="Mail,Messages,FaceTime,Skype"
    ["stockage_cloud"]="Dropbox,Google Drive,OneDrive,iCloud"
    ["divertissement"]="Spotify,Netflix,YouTube,Steam"
    ["outils_securite"]="1Password,Little Snitch,Wireshark"
    ["services_systeme"]="locationd,cloudd,nsurlsessiond,trustd"
)

# Politiques de Surveillance Réseau
declare -A MONITORING_POLICIES=(
    ["surveillance_stricte"]="apps_affaires:autorise,outils_developpement:autorise,navigateurs:surveille,communication:autorise,stockage_cloud:surveille,divertissement:bloque,outils_securite:autorise,services_systeme:autorise"
    ["surveillance_equilibree"]="apps_affaires:autorise,outils_developpement:autorise,navigateurs:autorise,communication:autorise,stockage_cloud:autorise,divertissement:surveille,outils_securite:autorise,services_systeme:autorise"
    ["surveillance_minimale"]="apps_affaires:autorise,outils_developpement:autorise,navigateurs:autorise,communication:autorise,stockage_cloud:autorise,divertissement:autorise,outils_securite:autorise,services_systeme:autorise"
    ["focus_developpement"]="apps_affaires:autorise,outils_developpement:priorite,navigateurs:autorise,communication:autorise,stockage_cloud:autorise,divertissement:bloque,outils_securite:autorise,services_systeme:autorise"
    ["verrouillage_securite"]="apps_affaires:surveille,outils_developpement:surveille,navigateurs:surveille,communication:surveille,stockage_cloud:bloque,divertissement:bloque,outils_securite:autorise,services_systeme:autorise"
)

# Seuils de Bande Passante (en MB/s)
declare -A BANDWIDTH_THRESHOLDS=(
    ["critique"]=100
    ["eleve"]=50
    ["modere"]=20
    ["faible"]=5
)

# Obtenir l'activité réseau complète
get_network_activity() {
    local monitoring_level="$1"
    local output_file="$MONITORING_DIR/network_activity_$(date +%Y%m%d_%H%M%S).json"
    
    log_action "Début de la surveillance d'activité réseau: $monitoring_level"
    
    # Obtenir les connexions réseau basiques
    local connections=$(lsof -nPi 2>/dev/null | tail -n +2)
    local unique_processes=$(echo "$connections" | cut -f 1 -d " " | sort | uniq)
    
    # Obtenir les informations détaillées des processus
    local detailed_info=""
    while IFS= read -r process; do
        [[ -z "$process" ]] && continue
        
        local pids=$(pgrep -f "$process" 2>/dev/null | head -5)
        for pid in $pids; do
            local cpu_usage=$(ps -p "$pid" -o %cpu= 2>/dev/null | tr -d ' ')
            local mem_usage=$(ps -p "$pid" -o %mem= 2>/dev/null | tr -d ' ')
            local process_connections=$(echo "$connections" | grep "^$process" | wc -l)
            
            if [[ -n "$cpu_usage" && -n "$mem_usage" ]]; then
                detailed_info="$detailed_info{\"process\":\"$process\",\"pid\":$pid,\"cpu\":$cpu_usage,\"memory\":$mem_usage,\"connections\":$process_connections},"
            fi
        done
    done <<< "$unique_processes"
    
    # Supprimer la virgule de fin et formater en JSON
    detailed_info="${detailed_info%,}"
    
    cat > "$output_file" << EOF
{
  "metadonnees_surveillance": {
    "horodatage": "$(date -u +%Y-%m-%dT%H:%M:%SZ)",
    "nom_hote": "$(hostname)",
    "niveau_surveillance": "$monitoring_level",
    "version_rapport": "1.0"
  },
  "activite_reseau": {
    "total_processus": $(echo "$unique_processes" | wc -l),
    "connexions_actives": $(echo "$connections" | wc -l),
    "processus": [$detailed_info]
  },
  "metriques_systeme": {
    "charge_moyenne": "$(uptime | awk -F'load average:' '{print $2}' | tr -d ' ')",
    "pression_memoire": "$(memory_pressure 2>/dev/null || echo 'inconnu')",
    "interfaces_reseau": $(networksetup -listallhardwareports | grep "Hardware Port" | wc -l)
  }
}
EOF
    
    log_action "Rapport d'activité réseau sauvegardé: $output_file"
    echo "$output_file"
}

# Analyser l'utilisation de bande passante
analyze_bandwidth_usage() {
    local monitoring_duration="$1"
    local analysis_file="$MONITORING_DIR/bandwidth_analysis_$(date +%Y%m%d_%H%M%S).txt"
    
    log_action "Début de l'analyse de bande passante pour $monitoring_duration secondes"
    
    # Utiliser nettop pour la surveillance de bande passante
    timeout "$monitoring_duration" nettop -P -t wifi -t ethernet -l 1 > "$analysis_file" 2>/dev/null &
    local nettop_pid=$!
    
    sleep "$monitoring_duration"
    
    # Tuer nettop s'il fonctionne encore
    kill "$nettop_pid" 2>/dev/null
    
    # Analyser les données de bande passante
    local high_bandwidth_processes=""
    if [[ -f "$analysis_file" ]]; then
        # Extraire les processus avec une utilisation élevée de bande passante
        while IFS= read -r line; do
            [[ "$line" =~ ^[[:space:]]*[0-9] ]] || continue
            
            local process_name=$(echo "$line" | awk '{print $2}')
            local bytes_in=$(echo "$line" | awk '{print $3}' | sed 's/[^0-9]//g')
            local bytes_out=$(echo "$line" | awk '{print $4}' | sed 's/[^0-9]//g')
            
            # Convertir en MB/s (estimation approximative)
            local total_mb=$(( (bytes_in + bytes_out) / 1024 / 1024 / monitoring_duration ))
            
            if [[ $total_mb -gt ${BANDWIDTH_THRESHOLDS["modere"]} ]]; then
                high_bandwidth_processes="$high_bandwidth_processes$process_name:${total_mb}MB/s,"
            fi
        done < "$analysis_file"
    fi
    
    log_action "Analyse de bande passante terminée. Processus à usage élevé: ${high_bandwidth_processes%,}"
    echo "${high_bandwidth_processes%,}"
}

# Détection de menaces de sécurité
detect_security_threats() {
    local scan_mode="$1"
    local threats_file="$MONITORING_DIR/security_threats_$(date +%Y%m%d_%H%M%S).json"
    
    log_action "Début de la détection de menaces de sécurité: $scan_mode"
    
    # Obtenir les connexions réseau
    local connections=$(lsof -nPi 2>/dev/null)
    
    # Motifs suspects
    local suspicious_ports=("22" "23" "3389" "5900" "6667" "6697" "1337" "31337")
    local suspicious_domains=("*.tor" "*.onion" "tempmail" "guerrillamail" "10minutemail")
    local suspicious_processes=("nc" "netcat" "telnet" "ssh" "tor")
    
    local threats_detected=""
    local threat_count=0
    
    # Vérifier les ports suspects
    for port in "${suspicious_ports[@]}"; do
        local port_connections=$(echo "$connections" | grep ":$port" | wc -l)
        if [[ $port_connections -gt 0 ]]; then
            threats_detected="$threats_detected{\"type\":\"port_suspect\",\"details\":\"Le port $port a $port_connections connexions\",\"severite\":\"moyenne\"},"
            ((threat_count++))
        fi
    done
    
    # Vérifier les processus suspects
    for process in "${suspicious_processes[@]}"; do
        if pgrep -f "$process" >/dev/null 2>&1; then
            threats_detected="$threats_detected{\"type\":\"processus_suspect\",\"details\":\"Le processus $process est en cours d'exécution\",\"severite\":\"elevee\"},"
            ((threat_count++))
        fi
    done
    
    # Vérifier les motifs de connexion inhabituels
    local unique_external_ips=$(echo "$connections" | grep -E ":[0-9]+->.*:[0-9]+" | awk -F'->' '{print $2}' | cut -d':' -f1 | sort | uniq | wc -l)
    if [[ $unique_external_ips -gt 50 ]]; then
        threats_detected="$threats_detected{\"type\":\"anomalie_connexion\",\"details\":\"Nombre inhabituel de connexions externes: $unique_external_ips\",\"severite\":\"moyenne\"},"
        ((threat_count++))
    fi
    
    # Supprimer la virgule de fin
    threats_detected="${threats_detected%,}"
    
    cat > "$threats_file" << EOF
{
  "scan_securite": {
    "horodatage": "$(date -u +%Y-%m-%dT%H:%M:%SZ)",
    "mode_scan": "$scan_mode",
    "menaces_detectees": $threat_count,
    "menaces": [$threats_detected]
  },
  "resume_reseau": {
    "total_connexions": $(echo "$connections" | wc -l),
    "processus_uniques": $(echo "$connections" | cut -f1 -d' ' | sort | uniq | wc -l),
    "connexions_externes": $unique_external_ips
  }
}
EOF
    
    if [[ $threat_count -gt 0 ]]; then
        log_action "ALERTE SÉCURITÉ: $threat_count menaces détectées. Rapport: $threats_file"
        
        # Créer une alerte
        echo "$(date -u +%Y-%m-%dT%H:%M:%SZ):MENACE_SECURITE:$threat_count menaces détectées" >> "$ALERTS_DIR/security_alerts.log"
    else
        log_action "Scan de sécurité terminé. Aucune menace détectée."
    fi
    
    echo "$threats_file"
}

# Appliquer une politique de surveillance réseau
apply_monitoring_policy() {
    local policy="$1"
    
    if [[ -z "${MONITORING_POLICIES[$policy]}" ]]; then
        log_action "ERREUR: Politique de surveillance inconnue: $policy"
        return 1
    fi
    
    log_action "Application de la politique de surveillance réseau: $policy"
    
    # Analyser la chaîne de politique
    IFS=',' read -ra policy_items <<< "${MONITORING_POLICIES[$policy]}"
    
    local policy_config="$MONITORING_DIR/active_policy.conf"
    echo "# Politique de Surveillance Réseau MacFleet: $policy" > "$policy_config"
    echo "# Appliquée: $(date)" >> "$policy_config"
    echo "" >> "$policy_config"
    
    for item in "${policy_items[@]}"; do
        IFS=':' read -ra parts <<< "$item"
        local category="${parts[0]}"
        local action="${parts[1]}"
        
        echo "$category=$action" >> "$policy_config"
        
        case "$action" in
            "bloque")
                log_action "Configuration des blocages pour la catégorie: $category"
                # Dans une implémentation réelle, cela configurerait les règles de pare-feu
                ;;
            "surveille")
                log_action "Surveillance renforcée pour la catégorie: $category"
                ;;
            "priorite")
                log_action "Bande passante prioritaire pour la catégorie: $category"
                ;;
            "autorise")
                log_action "Accès standard pour la catégorie: $category"
                ;;
        esac
    done
    
    log_action "Politique de surveillance réseau '$policy' appliquée avec succès"
    
    # Générer un rapport de conformité de politique
    generate_compliance_report "$policy"
}

# Surveillance réseau en temps réel
start_realtime_monitoring() {
    local monitoring_interval="$1"
    local alert_threshold="$2"
    
    log_action "Début de la surveillance réseau temps réel (intervalle: ${monitoring_interval}s, seuil: $alert_threshold connexions)"
    
    local monitor_file="$MONITORING_DIR/realtime_monitor.log"
    
    while true; do
        local current_connections=$(lsof -nPi 2>/dev/null | wc -l)
        local unique_processes=$(lsof -nPi 2>/dev/null | cut -f1 -d' ' | sort | uniq | wc -l)
        local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
        
        echo "$timestamp:$current_connections:$unique_processes" >> "$monitor_file"
        
        # Vérifier le seuil d'alerte
        if [[ $current_connections -gt $alert_threshold ]]; then
            log_action "ALERTE: Activité réseau élevée détectée - $current_connections connexions"
            echo "$(date -u +%Y-%m-%dT%H:%M:%SZ):ACTIVITE_ELEVEE:$current_connections connexions" >> "$ALERTS_DIR/activity_alerts.log"
        fi
        
        sleep "$monitoring_interval"
    done
}

# Contrôle d'accès réseau
control_network_access() {
    local action="$1"
    local target="$2"
    local reason="$3"
    
    log_action "Contrôle d'accès réseau: $action pour $target (Raison: $reason)"
    
    case "$action" in
        "bloquer_processus")
            # Tuer les processus connectés au réseau
            local pids=$(pgrep -f "$target" 2>/dev/null)
            for pid in $pids; do
                if kill -TERM "$pid" 2>/dev/null; then
                    log_action "Processus terminé: $target (PID: $pid)"
                fi
            done
            ;;
        "bloquer_domaine")
            # Ajouter au fichier hosts pour blocage
            if ! grep -q "127.0.0.1 $target" /etc/hosts; then
                echo "127.0.0.1 $target" >> /etc/hosts
                log_action "Domaine bloqué: $target"
            fi
            ;;
        "debloquer_domaine")
            # Supprimer du fichier hosts
            sed -i "" "/127.0.0.1 $target/d" /etc/hosts
            log_action "Domaine débloqué: $target"
            ;;
        "limiter_bande_passante")
            # Cela nécessiterait une intégration avec des outils de shaping de trafic
            log_action "Limitation de bande passante demandée pour: $target (Non implémenté - nécessite pfctl ou similaire)"
            ;;
    esac
    
    # Enregistrer l'action dans le journal d'audit
    echo "$(date -u +%Y-%m-%dT%H:%M:%SZ):$action:$target:$reason:$(whoami)" >> "$AUDIT_DIR/network_control_actions.log"
}

# Générer un rapport de conformité complet
generate_compliance_report() {
    local policy="$1"
    local report_file="$REPORTS_DIR/network_monitoring_compliance_$(date +%Y%m%d_%H%M%S).json"
    
    # Obtenir l'activité réseau actuelle
    local active_connections=$(lsof -nPi 2>/dev/null | wc -l)
    local unique_processes=$(lsof -nPi 2>/dev/null | cut -f1 -d' ' | sort | uniq | wc -l)
    
    # Compter les alertes
    local security_alerts=0
    local activity_alerts=0
    
    if [[ -f "$ALERTS_DIR/security_alerts.log" ]]; then
        security_alerts=$(wc -l < "$ALERTS_DIR/security_alerts.log")
    fi
    
    if [[ -f "$ALERTS_DIR/activity_alerts.log" ]]; then
        activity_alerts=$(wc -l < "$ALERTS_DIR/activity_alerts.log")
    fi
    
    cat > "$report_file" << EOF
{
  "metadonnees_rapport": {
    "horodatage": "$(date -u +%Y-%m-%dT%H:%M:%SZ)",
    "nom_hote": "$(hostname)",
    "politique_appliquee": "$policy",
    "version_rapport": "1.0"
  },
  "statut_surveillance_reseau": {
    "connexions_actives": $active_connections,
    "processus_surveilles": $unique_processes,
    "alertes_securite": $security_alerts,
    "alertes_activite": $activity_alerts,
    "surveillance_active": $([ -f "$MONITORING_DIR/realtime_monitor.log" ] && echo "true" || echo "false")
  },
  "politique_securite": {
    "nom": "$policy",
    "categories_surveillees": $(echo "${!APP_CATEGORIES[@]}" | wc -w),
    "cadres_conformite": ["SOX", "HIPAA", "NIST", "ISO27001", "PCI-DSS"]
  },
  "sante_reseau": {
    "surveillance_bande_passante": $(command -v nettop >/dev/null && echo "true" || echo "false"),
    "pare_feu_actif": $(pfctl -s info 2>/dev/null | grep -q "Status: Enabled" && echo "true" || echo "false"),
    "filtrage_dns": $(networksetup -getdnsservers Wi-Fi | grep -q "208.67" && echo "true" || echo "false"),
    "vpn_detecte": $(ifconfig | grep -q "utun" && echo "true" || echo "false")
  },
  "metriques_conformite": {
    "violations_politique": 0,
    "tentatives_exfiltration_donnees": 0,
    "connexions_non_autorisees": $security_alerts,
    "violations_bande_passante": 0
  }
}
EOF
    
    log_action "Rapport de conformité surveillance réseau généré: $report_file"
    echo "Rapport sauvegardé vers: $report_file"
}

# Vérification de santé et validation système
perform_health_check() {
    echo "=== Vérification de Santé Surveillance Réseau MacFleet ==="
    
    # Vérifier les outils de surveillance réseau
    local tools=("lsof" "netstat" "nettop" "networksetup")
    for tool in "${tools[@]}"; do
        if command -v "$tool" >/dev/null 2>&1; then
            echo "✓ $tool: Disponible"
        else
            echo "✗ $tool: Manquant"
        fi
    done
    
    # Vérifier les connexions actives
    local connections=$(lsof -nPi 2>/dev/null | wc -l)
    echo "✓ Connexions réseau actives: $connections"
    
    # Vérifier les fichiers de surveillance
    if [[ -f "$MONITORING_DIR/active_policy.conf" ]]; then
        local active_policy=$(grep -v "^#" "$MONITORING_DIR/active_policy.conf" | head -1)
        echo "✓ Politique de surveillance active: $active_policy"
    else
        echo "○ Aucune politique de surveillance active"
    fi
    
    # Vérifier les alertes
    local total_alerts=0
    if [[ -f "$ALERTS_DIR/security_alerts.log" ]]; then
        local security_count=$(wc -l < "$ALERTS_DIR/security_alerts.log")
        total_alerts=$((total_alerts + security_count))
    fi
    
    if [[ -f "$ALERTS_DIR/activity_alerts.log" ]]; then
        local activity_count=$(wc -l < "$ALERTS_DIR/activity_alerts.log")
        total_alerts=$((total_alerts + activity_count))
    fi
    
    if [[ $total_alerts -gt 0 ]]; then
        echo "⚠️  Total alertes: $total_alerts"
    else
        echo "✓ Aucune alerte active"
    fi
    
    # Vérifier la santé réseau système
    local network_interfaces=$(networksetup -listallhardwareports | grep "Hardware Port" | wc -l)
    echo "✓ Interfaces réseau: $network_interfaces"
    
    # Vérifier la configuration DNS
    local dns_servers=$(networksetup -getdnsservers Wi-Fi 2>/dev/null | head -1)
    echo "✓ Serveur DNS: $dns_servers"
}

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

# Créer les répertoires
mkdir -p /etc/macfleet/{network_monitoring,reports,compliance,audit,alerts}

# Appliquer la politique (simplifié pour l'exécution distante)
$(declare -p APP_CATEGORIES)
$(declare -p MONITORING_POLICIES)
$(type apply_monitoring_policy | sed '1d')

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

# Fonction d'exécution principale
main() {
    create_directories
    
    case "${1:-}" in
        "surveiller_activite")
            get_network_activity "${2:-standard}"
            ;;
        "analyser_bande_passante")
            analyze_bandwidth_usage "${2:-30}"
            ;;
        "detecter_menaces")
            detect_security_threats "${2:-standard}"
            ;;
        "appliquer_politique")
            apply_monitoring_policy "$2"
            ;;
        "surveillance_temps_reel")
            start_realtime_monitoring "${2:-10}" "${3:-100}"
            ;;
        "controler_acces")
            control_network_access "$2" "$3" "${4:-manuel}"
            ;;
        "verification_sante")
            perform_health_check
            ;;
        "rapport")
            generate_compliance_report "${2:-manuel}"
            ;;
        "deployer")
            deploy_to_fleet "$2" "$3"
            ;;
        "aide"|*)
            echo "Système de Surveillance Réseau d'Entreprise MacFleet"
            echo ""
            echo "Usage: $0 <commande> [options]"
            echo ""
            echo "Commandes:"
            echo "  surveiller_activite [niveau]              - Surveiller l'activité réseau (standard|detaille|securite)"
            echo "  analyser_bande_passante [duree]           - Analyser l'utilisation de bande passante pour durée en secondes"
            echo "  detecter_menaces [mode]                   - Détecter les menaces de sécurité (standard|strict|paranoiaque)"
            echo "  appliquer_politique <politique>           - Appliquer une politique de surveillance (surveillance_stricte|surveillance_equilibree|surveillance_minimale|focus_developpement|verrouillage_securite)"
            echo "  surveillance_temps_reel [intervalle] [seuil] - Démarrer la surveillance temps réel"
            echo "  controler_acces <action> <cible> [raison] - Contrôler l'accès réseau (bloquer_processus|bloquer_domaine|debloquer_domaine|limiter_bande_passante)"
            echo "  verification_sante                        - Effectuer une vérification de santé système"
            echo "  rapport [politique]                       - Générer un rapport de conformité"
            echo "  deployer <politique> <fichier_flotte>     - Déployer une politique vers la flotte"
            echo ""
            echo "Exemples:"
            echo "  $0 surveiller_activite detaille"
            echo "  $0 analyser_bande_passante 60"
            echo "  $0 detecter_menaces strict"
            echo "  $0 appliquer_politique surveillance_stricte"
            echo "  $0 controler_acces bloquer_domaine site-malveillant.com"
            echo "  $0 verification_sante"
            ;;
    esac
}

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

Catégories de Surveillance Réseau

Le système d'entreprise surveille les applications dans différentes catégories :

CatégorieApplicationsNiveau de Surveillance
Apps AffairesSlack, Zoom, Microsoft Teams, Office 365Surveillance standard
Outils DéveloppementXcode, Visual Studio Code, Docker, GitJournalisation renforcée
NavigateursChrome, Firefox, Safari, EdgeAnalyse de trafic
CommunicationMail, Messages, FaceTime, SkypeScan de sécurité
Stockage CloudDropbox, Google Drive, OneDriveSurveillance transfert données
DivertissementSpotify, Netflix, YouTube, SteamLimitation bande passante
Outils Sécurité1Password, Little Snitch, WiresharkAccès prioritaire
Services Systèmelocationd, cloudd, nsurlsessiondSurveillance santé système

Analyse Réseau Avancée

Surveillance Bande Passante Temps Réel

# Surveiller l'utilisation de bande passante pendant 60 secondes
./surveillance_reseau.sh analyser_bande_passante 60

# Vérifier les processus à haute bande passante
nettop -P -t wifi -l 1 | head -20

Détection de Menaces de Sécurité

# Exécuter un scan de menaces de sécurité
./surveillance_reseau.sh detecter_menaces strict

# Vérifier les connexions suspectes
lsof -nPi | grep -E ":(22|23|3389|5900|6667)"

Analyse de Connexions

# Analyse détaillée des connexions
lsof -nPi | awk '{print $1, $8, $9}' | sort | uniq -c | sort -nr

# Surveiller une application spécifique
lsof -nPi | grep -i "chrome"

Implémentation de Politiques

Appliquer une Politique de Surveillance d'Entreprise

# Surveillance stricte pour environnements sécurisés
./surveillance_reseau.sh appliquer_politique surveillance_stricte

# Surveillance équilibrée pour usage général
./surveillance_reseau.sh appliquer_politique surveillance_equilibree

# Surveillance axée développement
./surveillance_reseau.sh appliquer_politique focus_developpement

Contrôle d'Accès Réseau

# Bloquer un processus suspect
./surveillance_reseau.sh controler_acces bloquer_processus "app_suspecte" "violation_securite"

# Bloquer un domaine malveillant
./surveillance_reseau.sh controler_acces bloquer_domaine "site-malveillant.com" "menace_detectee"

# Débloquer un domaine après vérification
./surveillance_reseau.sh controler_acces debloquer_domaine "exemple.com" "faux_positif"

Fonctionnalités d'Entreprise

Réponse Automatisée aux Menaces

Le système peut automatiquement répondre aux menaces :

  • Bloquer les processus suspects
  • Mettre en quarantaine les connexions réseau
  • Alerter les équipes de sécurité
  • Générer des rapports d'incidents

Gestion de Bande Passante

Surveiller et contrôler l'utilisation de bande passante :

  • Identifier les applications consommatrices de bande passante
  • Implémenter des règles de qualité de service (QoS)
  • Générer des rapports d'utilisation
  • Alerter sur la consommation excessive

Surveillance de Conformité

Suivre l'activité réseau pour la conformité :

  • Journaliser toutes les connexions réseau
  • Surveiller les volumes de transfert de données
  • Détecter les violations de politique
  • Générer des rapports d'audit

Considérations de Sécurité Importantes

  • La surveillance temps réel nécessite des ressources système appropriées
  • L'analyse réseau doit respecter les politiques de confidentialité des utilisateurs
  • La détection de menaces peut générer des faux positifs nécessitant validation
  • Les contrôles d'accès doivent inclure des procédures de contournement d'urgence
  • La journalisation d'audit doit être protégée contre l'accès non autorisé

Conformité et Rapports

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

  • Conformité SOX - Contrôles d'accès réseau données financières
  • Exigences HIPAA - Surveillance transmission informations santé
  • Standards PCI-DSS - Sécurité réseau industrie cartes paiement
  • Cadre NIST - Standards surveillance réseau cybersécurité
  • ISO 27001 - Gestion réseau sécurité information

Tests et Validation

Avant le déploiement en entreprise :

  1. Tester la précision de surveillance avec des activités réseau connues
  2. Vérifier l'efficacité de détection de menaces et les taux de faux positifs
  3. Confirmer que l'application de politiques fonctionne comme prévu
  4. Tester les procédures d'urgence et mécanismes de contournement
  5. Valider la complétude et précision des rapports de conformité

Ce système complet transforme la surveillance réseau basique en une plateforme de sécurité et gestion de niveau entreprise avec détection avancée de menaces, application de politiques et capacités de déploiement de flotte.

Récupérer les Informations Réseau sur macOS

Collectez des informations réseau détaillées de vos appareils MacFleet en utilisant des outils en ligne de commande. Ce tutoriel couvre la découverte d'adresses MAC, la configuration IP, la surveillance des ports et les diagnostics réseau pour une gestion complète de flotte.

Comprendre les Informations Réseau macOS

macOS fournit plusieurs utilitaires en ligne de commande pour la collecte d'informations réseau :

  • networksetup - Gestion des ports matériels et configuration réseau
  • ifconfig - Configuration et statut des interfaces réseau
  • netstat - Connexions réseau et informations de ports
  • arp - Gestion de la table du protocole de résolution d'adresse
  • ipconfig - Configuration des adresses IP et DHCP

Récupérer les Adresses MAC

Lister Tous les Ports Matériels

#!/bin/bash

# Afficher tous les ports matériels réseau et leurs adresses MAC
networksetup -listallhardwareports

echo "Informations des ports matériels récupérées avec succès"

Obtenir l'Adresse MAC d'une Interface Spécifique

#!/bin/bash

# Obtenir l'adresse MAC pour une interface spécifique (Wi-Fi)
echo "Adresse MAC de l'Interface Wi-Fi (en0) :"
networksetup -getmacaddress en0

echo -e "\nAdresse MAC de l'Interface Ethernet (en1) :"
networksetup -getmacaddress en1

echo -e "\nAdresse MAC du Pont Thunderbolt (bridge0) :"
networksetup -getmacaddress bridge0 2>/dev/null || echo "Pont Thunderbolt non disponible"

Rapport Complet d'Adresses MAC

#!/bin/bash

# Générer un rapport détaillé d'adresses MAC
echo "=== Rapport Matériel Réseau MacFleet ==="
echo "Appareil : $(hostname)"
echo "Date : $(date)"
echo "========================================="

# Obtenir tous les ports matériels
echo -e "\n📡 Inventaire Matériel Réseau :"
networksetup -listallhardwareports

echo -e "\n🔍 Détails des Interfaces Principales :"
echo "Wi-Fi (en0) : $(networksetup -getmacaddress en0 | awk '{print $3}')"
echo "Ethernet (en1) : $(networksetup -getmacaddress en1 | awk '{print $3}' 2>/dev/null || echo 'Non disponible')"

# Vérifier les interfaces supplémentaires
echo -e "\n🌐 Interfaces Supplémentaires :"
for i in {2..5}; do
    mac_addr=$(networksetup -getmacaddress en$i 2>/dev/null | awk '{print $3}')
    if [[ -n "$mac_addr" && "$mac_addr" != "not" ]]; then
        echo "en$i : $mac_addr"
    fi
done

Découvrir les Adresses IP

Récupération Basique d'Adresses IP

#!/bin/bash

# Obtenir l'adresse IP pour l'interface Wi-Fi
WIFI_IP=$(ipconfig getifaddr en0 2>/dev/null)
ETHERNET_IP=$(ipconfig getifaddr en1 2>/dev/null)

echo "Adresses IP Réseau :"
echo "Wi-Fi (en0) : ${WIFI_IP:-Non connecté}"
echo "Ethernet (en1) : ${ETHERNET_IP:-Non connecté}"

Configuration IP Complète

#!/bin/bash

# Rapport détaillé de configuration IP
echo "=== Rapport de Configuration IP MacFleet ==="
echo "Appareil : $(hostname)"
echo "Horodatage : $(date)"
echo "========================================"

# Interfaces réseau actives
echo -e "\n🌐 Interfaces Réseau Actives :"
for interface in en0 en1 en2 en3; do
    ip_addr=$(ipconfig getifaddr $interface 2>/dev/null)
    if [[ -n "$ip_addr" ]]; then
        echo "$interface : $ip_addr"
        
        # Obtenir des détails supplémentaires pour les interfaces actives
        subnet_mask=$(ipconfig getoption $interface subnet_mask 2>/dev/null)
        router=$(ipconfig getoption $interface router 2>/dev/null)
        dns_servers=$(ipconfig getoption $interface domain_name_server 2>/dev/null)
        
        echo "  Sous-réseau : ${subnet_mask:-N/A}"
        echo "  Passerelle : ${router:-N/A}"
        echo "  DNS : ${dns_servers:-N/A}"
        echo ""
    fi
done

# Adresse IP publique
echo "🌍 Adresse IP Externe :"
curl -s ifconfig.me 2>/dev/null || echo "Impossible de récupérer l'IP externe"

Statut des Interfaces Réseau

#!/bin/bash

# Surveiller le statut des interfaces réseau
echo "=== Surveillance du Statut des Interfaces Réseau ==="

# Obtenir les statistiques d'interface
echo -e "\n📊 Statistiques des Interfaces :"
ifconfig | grep -E "(en[0-9]:|inet |status:|media:)" | while read line; do
    echo "$line"
done

echo -e "\n🔄 Informations de Bail DHCP :"
for interface in en0 en1; do
    lease_info=$(ipconfig getpacket $interface 2>/dev/null)
    if [[ -n "$lease_info" ]]; then
        echo "Interface $interface :"
        echo "$lease_info" | grep -E "(lease_time|server_identifier|domain_name)"
        echo ""
    fi
done

Analyser la Configuration Réseau

Vue d'Ensemble Réseau Complète

#!/bin/bash

# Analyse complète de la configuration réseau
echo "=== Vue d'Ensemble Réseau Complète ==="
ifconfig

echo -e "\n🔍 Résumé Réseau :"
ifconfig | grep -E "^[a-z]" | while read line; do
    interface=$(echo $line | cut -d: -f1)
    status=$(ifconfig $interface | grep "status:" | cut -d' ' -f2-)
    echo "$interface : ${status:-actif}"
done

Services Réseau et DNS

#!/bin/bash

# Configuration des services réseau et DNS
echo "=== Configuration des Services Réseau ==="

echo "🌐 Configuration DNS :"
echo "Serveurs DNS Système :"
scutil --dns | grep "nameserver" | head -5

echo -e "\n📡 Services Réseau :"
networksetup -listallnetworkservices

echo -e "\n🔍 Détails du Service Réseau Actif :"
active_service=$(networksetup -listallnetworkservices | grep -v "asterisk" | head -2 | tail -1)
if [[ -n "$active_service" ]]; then
    echo "Service : $active_service"
    networksetup -getinfo "$active_service"
fi

Informations de Sous-réseau et Routage

#!/bin/bash

# Informations de masque de sous-réseau et routage
echo "=== Informations de Routage et Sous-réseau ==="

echo "🛣️  Table de Routage :"
netstat -rn | head -10

echo -e "\n🔍 Détails de Sous-réseau d'Interface :"
for interface in en0 en1; do
    ip_addr=$(ipconfig getifaddr $interface 2>/dev/null)
    if [[ -n "$ip_addr" ]]; then
        subnet_mask=$(ipconfig getoption $interface subnet_mask 2>/dev/null)
        echo "$interface : $ip_addr/${subnet_mask:-inconnu}"
    fi
done

Surveiller les Informations de Ports

Connexions TCP Actives

#!/bin/bash

# Afficher les connexions TCP actives
echo "=== Connexions TCP Actives ==="
netstat -ap TCP

echo -e "\n📊 Résumé des Connexions :"
echo "Total connexions : $(netstat -ap TCP | grep -c ESTABLISHED)"
echo "Ports en écoute : $(netstat -ap TCP | grep -c LISTEN)"
echo "Connexions time-wait : $(netstat -ap TCP | grep -c TIME_WAIT)"

Analyse des Ports en Écoute

#!/bin/bash

# Analyser les ports en écoute
echo "=== Analyse des Ports en Écoute ==="

echo "🔍 Tous les Ports en Écoute :"
netstat -a | grep -i "LISTEN"

echo -e "\n📋 Résumé des Ports en Écoute :"
netstat -a | grep -i "LISTEN" | awk '{print $4}' | cut -d. -f2 | sort -n | uniq -c | sort -nr

echo -e "\n🔒 Ports Pertinents pour la Sécurité :"
netstat -a | grep -i "LISTEN" | grep -E ":(22|80|443|993|995|587|25|53|21|23) "

Script de Surveillance des Ports

#!/bin/bash

# Surveillance complète des ports
LOG_FILE="/var/log/macfleet_ports.log"

monitor_ports() {
    local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
    
    {
        echo "=== Rapport de Surveillance des Ports ==="
        echo "Horodatage : $timestamp"
        echo "Appareil : $(hostname)"
        echo "================================"
        
        echo -e "\n🔍 Ports en Écoute Actuels :"
        netstat -a | grep -i "LISTEN" | head -20
        
        echo -e "\n📊 Statistiques de Connexion :"
        echo "ESTABLISHED : $(netstat -ap TCP | grep -c ESTABLISHED)"
        echo "LISTEN : $(netstat -ap TCP | grep -c LISTEN)"
        echo "TIME_WAIT : $(netstat -ap TCP | grep -c TIME_WAIT)"
        echo "CLOSE_WAIT : $(netstat -ap TCP | grep -c CLOSE_WAIT)"
        
        echo -e "\n🚨 Connexions Suspectes :"
        netstat -ap TCP | grep -E ":(6667|6697|8080|9050|4444|31337)" || echo "Aucune détectée"
        
    } | tee -a "$LOG_FILE"
}

# Exécuter la surveillance
monitor_ports

Afficher la Table ARP

Informations ARP Basiques

#!/bin/bash

# Afficher la table du protocole de résolution d'adresse
arp -a

echo "Table ARP récupérée avec succès"

Analyse Détaillée ARP

#!/bin/bash

# Analyse complète de la table ARP
echo "=== Analyse de la Table ARP ==="
echo "Appareil : $(hostname)"
echo "Date : $(date)"
echo "=========================="

echo -e "\n🔍 Table ARP Complète :"
arp -a

echo -e "\n📊 Statistiques ARP :"
total_entries=$(arp -a | wc -l)
incomplete_entries=$(arp -a | grep -c "incomplete")
complete_entries=$((total_entries - incomplete_entries))

echo "Total entrées ARP : $total_entries"
echo "Entrées complètes : $complete_entries"
echo "Entrées incomplètes : $incomplete_entries"

echo -e "\n🌐 Voisins Réseau :"
arp -a | head -10 | while read line; do
    hostname=$(echo $line | cut -d' ' -f1)
    ip=$(echo $line | cut -d'(' -f2 | cut -d')' -f1)
    mac=$(echo $line | cut -d' ' -f4)
    echo "$ip -> $mac ($hostname)"
done

Vérification de Sécurité ARP

#!/bin/bash

# Analyse de sécurité de la table ARP
echo "=== Analyse de Sécurité ARP ==="

# Vérifier les adresses MAC dupliquées (potentiel ARP spoofing)
echo "🔒 Vérification des Adresses MAC Dupliquées :"
arp -a | awk '{print $4}' | sort | uniq -d | while read mac; do
    if [[ -n "$mac" ]]; then
        echo "⚠️  MAC dupliquée détectée : $mac"
        arp -a | grep "$mac"
    fi
done

# Vérifier les modèles suspects
echo -e "\n🚨 Alertes de Sécurité :"
suspicious_count=$(arp -a | grep -c "incomplete")
if [[ $suspicious_count -gt 10 ]]; then
    echo "⚠️  Nombre élevé d'entrées ARP incomplètes : $suspicious_count"
fi

# Analyse des fournisseurs réseau
echo -e "\n🏢 Analyse des Fournisseurs Réseau :"
arp -a | grep -E "([0-9a-f]{2}:){5}[0-9a-f]{2}" | awk '{print $4}' | cut -d: -f1-3 | sort | uniq -c | sort -nr | head -5

Script de Surveillance Réseau d'Entreprise

#!/bin/bash

# Suite de Surveillance Réseau d'Entreprise MacFleet
LOG_FILE="/var/log/macfleet_network.log"
REPORT_FILE="/tmp/network_report_$(date +%Y%m%d_%H%M%S).txt"

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

# Générer un rapport réseau complet
generate_network_report() {
    {
        echo "Rapport d'Évaluation Réseau MacFleet"
        echo "Généré : $(date)"
        echo "Appareil : $(hostname)"
        echo "Utilisateur : $(whoami)"
        echo "Version OS : $(sw_vers -productVersion)"
        echo "=========================================="
        echo ""
        
        # Inventaire matériel
        echo "🔧 Matériel Réseau :"
        networksetup -listallhardwareports
        echo ""
        
        # Configuration IP
        echo "🌐 Configuration IP :"
        for interface in en0 en1 en2; do
            ip_addr=$(ipconfig getifaddr $interface 2>/dev/null)
            if [[ -n "$ip_addr" ]]; then
                echo "$interface : $ip_addr"
                mac_addr=$(networksetup -getmacaddress $interface | awk '{print $3}')
                echo "  MAC : $mac_addr"
                
                subnet=$(ipconfig getoption $interface subnet_mask 2>/dev/null)
                router=$(ipconfig getoption $interface router 2>/dev/null)
                echo "  Sous-réseau : ${subnet:-N/A}"
                echo "  Passerelle : ${router:-N/A}"
                echo ""
            fi
        done
        
        # Services réseau
        echo "📡 Services Réseau :"
        networksetup -listallnetworkservices | grep -v "asterisk"
        echo ""
        
        # Configuration DNS
        echo "🔍 Configuration DNS :"
        scutil --dns | grep "nameserver" | head -3
        echo ""
        
        # Évaluation de sécurité
        echo "🔒 Évaluation de Sécurité :"
        listening_ports=$(netstat -a | grep -c "LISTEN")
        established_connections=$(netstat -ap TCP | grep -c ESTABLISHED)
        echo "Ports en écoute : $listening_ports"
        echo "Connexions actives : $established_connections"
        
        # Vérifier les ports de sécurité courants
        security_ports=$(netstat -a | grep -i "LISTEN" | grep -E ":(22|80|443|993|995)" | wc -l)
        echo "Ports pertinents pour la sécurité : $security_ports"
        
        echo ""
        echo "Rapport terminé à : $(date)"
        
    } > "$REPORT_FILE"
    
    echo "📊 Rapport réseau généré : $REPORT_FILE"
}

# Test de connectivité réseau
test_connectivity() {
    echo "=== Test de Connectivité Réseau ==="
    
    # Test de résolution DNS
    if nslookup google.com > /dev/null 2>&1; then
        echo "✅ Résolution DNS : Fonctionnelle"
    else
        echo "❌ Résolution DNS : Échec"
    fi
    
    # Test de connectivité internet
    if ping -c 1 8.8.8.8 > /dev/null 2>&1; then
        echo "✅ Connectivité internet : Fonctionnelle"
    else
        echo "❌ Connectivité internet : Échec"
    fi
    
    # Test de passerelle locale
    gateway=$(route -n get default | grep gateway | awk '{print $2}')
    if [[ -n "$gateway" ]] && ping -c 1 "$gateway" > /dev/null 2>&1; then
        echo "✅ Connectivité passerelle : Fonctionnelle ($gateway)"
    else
        echo "❌ Connectivité passerelle : Échec"
    fi
}

# Exécution principale
main() {
    log_action "=== Surveillance Réseau MacFleet Démarrée ==="
    
    generate_network_report
    echo ""
    test_connectivity
    
    log_action "Surveillance réseau terminée. Rapport : $REPORT_FILE"
}

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

Référence des Informations Réseau

Interfaces Réseau Courantes

InterfaceDescriptionUsage Courant
en0Interface réseau principaleConnexion Wi-Fi
en1Interface secondaireConnexion Ethernet
en2-en5Interfaces supplémentairesAdaptateurs USB, Thunderbolt
lo0Interface de bouclageCommunication système locale
bridge0Pont ThunderboltConnexions appareil-à-appareil
utun0-utun3Interfaces tunnelConnexions VPN

Référence Rapide des Commandes Réseau

# Obtenir l'IP d'interface
ipconfig getifaddr en0

# Obtenir la configuration d'interface
ipconfig getoption en0 subnet_mask
ipconfig getoption en0 router
ipconfig getoption en0 domain_name_server

# Matériel réseau
networksetup -listallhardwareports
networksetup -getmacaddress en0

# Statut d'interface
ifconfig en0
ifconfig -a

# Connexions réseau
netstat -rn          # Table de routage
netstat -i           # Statistiques d'interface
netstat -ap TCP      # Connexions TCP

# Opérations ARP
arp -a               # Afficher la table ARP
arp -d hostname      # Supprimer l'entrée ARP

Diagnostics Réseau Avancés

Test de Performance Réseau

#!/bin/bash

# Diagnostics de performance réseau
echo "=== Diagnostics de Performance Réseau ==="

# Statistiques d'interface
echo "📊 Statistiques d'Interface :"
netstat -i

# Surveillance de bande passante
echo -e "\n🚀 Activité Réseau (10 secondes) :"
if command -v nettop >/dev/null 2>&1; then
    timeout 10 nettop -l 1 -J bytes_in,bytes_out -P
else
    echo "nettop non disponible, utilisation de netstat"
    netstat -i
fi

# Test de latence
echo -e "\n⏱️  Tests de Latence :"
echo "DNS Google (8.8.8.8) :"
ping -c 3 8.8.8.8 | tail -1

echo "DNS Cloudflare (1.1.1.1) :"
ping -c 3 1.1.1.1 | tail -1

Informations Réseau Sans Fil

#!/bin/bash

# Informations détaillées du réseau sans fil
echo "=== Analyse du Réseau Sans Fil ==="

# Informations Wi-Fi actuelles
current_wifi=$(networksetup -getairportnetwork en0)
echo "Wi-Fi actuel : $current_wifi"

# Statut d'alimentation Wi-Fi
wifi_power=$(networksetup -getairportpower en0)
echo "Alimentation Wi-Fi : $wifi_power"

# Réseaux disponibles (nécessite des privilèges admin)
echo -e "\n📡 Réseaux Disponibles :"
if [[ $EUID -eq 0 ]]; then
    airport -s 2>/dev/null || echo "Utilitaire Airport non disponible"
else
    echo "Privilèges admin requis pour le scan réseau"
fi

# Détails de l'interface Wi-Fi
echo -e "\n🔍 Détails de l'Interface Wi-Fi :"
ifconfig en0 | grep -E "(inet|ether|status)"

Notes Importantes

  • Noms d'interface peuvent varier entre les versions macOS et le matériel
  • Privilèges administrateur requis pour certaines opérations réseau
  • Implications de sécurité - Surveiller régulièrement les ports ouverts et connexions
  • Impact sur les performances - Les scripts de surveillance réseau peuvent affecter les performances système
  • Considérations de confidentialité - Les tables ARP contiennent des informations sur les voisins réseau

Dépannage

Problèmes Réseau Courants

Pas d'Adresse IP :

# Renouveler le bail DHCP
sudo ipconfig set en0 DHCP

Problèmes de Résolution DNS :

# Vider le cache DNS
sudo dscacheutil -flushcache

Interface Non Responsive :

# Réinitialiser l'interface réseau
sudo ifconfig en0 down
sudo ifconfig en0 up

N'oubliez pas de tester ces scripts sur des appareils individuels avant de les déployer dans votre environnement MacFleet.

Personnalisation de la Barre de Menu et Gestion des Icônes sur macOS

Personnalisez l'apparence de la barre de menu et gérez les icônes système sur vos appareils MacFleet. Ce tutoriel couvre le contrôle de visibilité des icônes, l'optimisation de l'interface utilisateur et la gestion de barre de menu d'entreprise pour une expérience utilisateur améliorée et une cohérence organisationnelle.

Comprendre la Gestion de la Barre de Menu

La barre de menu macOS contient divers indicateurs système et icônes d'accès rapide :

  • Indicateurs réseau - Statut VPN, Wi-Fi, Bluetooth
  • Moniteurs système - Batterie, volume, date/heure
  • Icônes d'applications - Indicateurs de statut d'applications tierces
  • Contrôles utilisateur - Spotlight, Centre de Contrôle, Siri
  • Outils d'entreprise - Agents MDM, logiciels de sécurité

Gestion Basique des Icônes VPN

Masquer l'Icône VPN de la Barre de Menu

#!/bin/bash

# Masquer l'icône VPN de la barre de menu
hide_vpn_icon() {
    echo "=== Masquage de l'Icône VPN de la Barre de Menu ==="
    
    # Obtenir l'utilisateur actuel
    local currentUser
    currentUser=$(echo "show State:/Users/ConsoleUser" | scutil | awk '/Name :/ { print $3 }')
    
    if [[ "$currentUser" == "loginwindow" || -z "$currentUser" ]]; then
        echo "❌ Aucune session utilisateur active trouvée"
        return 1
    fi
    
    echo "👤 Utilisateur actuel : $currentUser"
    
    # Fonction pour exécuter des commandes en tant qu'utilisateur actuel
    runAsUser() {
        local currentUserID
        currentUserID=$(id -u "$currentUser")
        if [[ "$currentUser" != "loginwindow" ]]; then
            /bin/launchctl asuser "$currentUserID" sudo -u "$currentUser" "$@"
        fi
    }
    
    # Supprimer l'extra de menu VPN
    if runAsUser /usr/libexec/PlistBuddy -c 'delete menuExtras: "/System/Library/CoreServices/Menu Extras/VPN.menu"' "/Users/$currentUser/Library/Preferences/com.apple.systemuiserver.plist" 2>/dev/null; then
        echo "✅ Entrée menu VPN supprimée"
    else
        echo "⚠️  Entrée menu VPN non trouvée ou déjà supprimée"
    fi
    
    # Redémarrer les services système pour appliquer les changements
    runAsUser /usr/bin/killall cfprefsd 2>/dev/null
    runAsUser /usr/bin/killall SystemUIServer 2>/dev/null
    
    echo "🔄 Interface système actualisée"
    echo "✅ Icône VPN masquée de la barre de menu"
}

# Exécuter la fonction
hide_vpn_icon

Afficher l'Icône VPN dans la Barre de Menu

#!/bin/bash

# Afficher l'icône VPN dans la barre de menu
show_vpn_icon() {
    echo "=== Ajout de l'Icône VPN à la Barre de Menu ==="
    
    local currentUser
    currentUser=$(echo "show State:/Users/ConsoleUser" | scutil | awk '/Name :/ { print $3 }')
    
    if [[ "$currentUser" == "loginwindow" || -z "$currentUser" ]]; then
        echo "❌ Aucune session utilisateur active trouvée"
        return 1
    fi
    
    echo "👤 Utilisateur actuel : $currentUser"
    
    runAsUser() {
        local currentUserID
        currentUserID=$(id -u "$currentUser")
        if [[ "$currentUser" != "loginwindow" ]]; then
            /bin/launchctl asuser "$currentUserID" sudo -u "$currentUser" "$@"
        fi
    }
    
    # Ajouter l'extra de menu VPN
    local vpn_path="/System/Library/CoreServices/Menu Extras/VPN.menu"
    if runAsUser /usr/libexec/PlistBuddy -c "add menuExtras: string '$vpn_path'" "/Users/$currentUser/Library/Preferences/com.apple.systemuiserver.plist" 2>/dev/null; then
        echo "✅ Entrée menu VPN ajoutée"
    else
        echo "⚠️  Entrée menu VPN existe déjà"
    fi
    
    # Redémarrer les services système
    runAsUser /usr/bin/killall cfprefsd 2>/dev/null
    runAsUser /usr/bin/killall SystemUIServer 2>/dev/null
    
    echo "✅ Icône VPN affichée dans la barre de menu"
}

# Exécuter la fonction
show_vpn_icon

Système de Gestion de Barre de Menu d'Entreprise

#!/bin/bash

# Système de Gestion de Barre de Menu d'Entreprise MacFleet
# Personnalisation d'interface complète, optimisation de l'expérience utilisateur et déploiement de flotte

# Configuration
LOG_FILE="/var/log/macfleet_menubar.log"
CONFIG_DIR="/etc/macfleet/interface"
PROFILES_DIR="$CONFIG_DIR/profiles"
BACKUP_DIR="/var/backups/menubar_configs"
REPORTS_DIR="$CONFIG_DIR/reports"

# Extras de menu disponibles
declare -A MENU_EXTRAS=(
    ["vpn"]="/System/Library/CoreServices/Menu Extras/VPN.menu"
    ["wifi"]="/System/Library/CoreServices/Menu Extras/AirPort.menu"
    ["bluetooth"]="/System/Library/CoreServices/Menu Extras/Bluetooth.menu"
    ["volume"]="/System/Library/CoreServices/Menu Extras/Volume.menu"
    ["batterie"]="/System/Library/CoreServices/Menu Extras/Battery.menu"
    ["horloge"]="/System/Library/CoreServices/Menu Extras/Clock.menu"
    ["ecrans"]="/System/Library/CoreServices/Menu Extras/Displays.menu"
    ["timemachine"]="/System/Library/CoreServices/Menu Extras/TimeMachine.menu"
    ["saisie-texte"]="/System/Library/CoreServices/Menu Extras/TextInput.menu"
    ["script"]="/System/Library/CoreServices/Menu Extras/Script Menu.menu"
)

# Configurations de profils
declare -A MENU_PROFILES=(
    ["minimal"]="horloge,batterie,wifi"
    ["standard"]="horloge,batterie,wifi,volume,bluetooth"
    ["complet"]="horloge,batterie,wifi,volume,bluetooth,ecrans,vpn"
    ["entreprise"]="horloge,batterie,wifi,vpn,timemachine"
    ["education"]="horloge,batterie,wifi,volume,saisie-texte"
    ["kiosque"]="horloge,batterie"
    ["developpeur"]="horloge,batterie,wifi,volume,bluetooth,ecrans,script"
    ["securise"]="horloge,batterie,wifi"
)

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

# Obtenir l'utilisateur actuel
get_current_user() {
    local user
    user=$(echo "show State:/Users/ConsoleUser" | scutil | awk '/Name :/ { print $3 }')
    
    if [[ "$user" == "loginwindow" || -z "$user" ]]; then
        return 1
    fi
    
    echo "$user"
    return 0
}

# Exécuter une commande en tant qu'utilisateur actuel
run_as_user() {
    local user="$1"
    shift
    
    local userID
    userID=$(id -u "$user" 2>/dev/null) || return 1
    
    /bin/launchctl asuser "$userID" sudo -u "$user" "$@"
}

# Obtenir la configuration actuelle de la barre de menu
get_current_menubar_config() {
    local user="$1"
    local plist_path="/Users/$user/Library/Preferences/com.apple.systemuiserver.plist"
    
    if [[ ! -f "$plist_path" ]]; then
        echo "[]"
        return 1
    fi
    
    # Extraire les extras de menu actuels
    local menu_extras
    menu_extras=$(run_as_user "$user" /usr/libexec/PlistBuddy -c "print menuExtras:" "$plist_path" 2>/dev/null | grep -E "\.menu$" | sed 's/^[ ]*//' || echo "")
    
    if [[ -z "$menu_extras" ]]; then
        echo "[]"
    else
        echo "$menu_extras" | jq -R -s 'split("\n") | map(select(length > 0))'
    fi
}

# Appliquer un profil de barre de menu
apply_menubar_profile() {
    local profile_name="$1"
    local target_user="$2"
    
    log_action "Application du profil de barre de menu : $profile_name"
    
    # Obtenir la configuration du profil
    local profile_config="${MENU_PROFILES[$profile_name]}"
    if [[ -z "$profile_config" ]]; then
        log_action "❌ Profil inconnu : $profile_name"
        return 1
    fi
    
    # Obtenir les utilisateurs cibles
    local users=()
    if [[ -n "$target_user" ]]; then
        users=("$target_user")
    else
        # Obtenir tous les utilisateurs avec UID >= 500
        while IFS= read -r user; do
            users+=("$user")
        done < <(dscl . list /Users UniqueID | awk '$2 >= 500 {print $1}')
    fi
    
    # Appliquer le profil à chaque utilisateur
    for user in "${users[@]}"; do
        log_action "Configuration de la barre de menu pour l'utilisateur : $user"
        
        local plist_path="/Users/$user/Library/Preferences/com.apple.systemuiserver.plist"
        
        # Sauvegarder la configuration actuelle
        backup_user_menubar_config "$user"
        
        # Effacer les extras de menu existants
        run_as_user "$user" /usr/libexec/PlistBuddy -c "delete menuExtras:" "$plist_path" 2>/dev/null || true
        run_as_user "$user" /usr/libexec/PlistBuddy -c "add menuExtras: array" "$plist_path" 2>/dev/null
        
        # Ajouter les éléments du profil
        IFS=',' read -ra ITEMS <<< "$profile_config"
        local index=0
        
        for item in "${ITEMS[@]}"; do
            local menu_path="${MENU_EXTRAS[$item]}"
            if [[ -n "$menu_path" && -f "$menu_path" ]]; then
                run_as_user "$user" /usr/libexec/PlistBuddy -c "add menuExtras:$index string '$menu_path'" "$plist_path" 2>/dev/null
                log_action "Élément de menu ajouté : $item pour l'utilisateur : $user"
                ((index++))
            else
                log_action "⚠️  Élément de menu non trouvé : $item"
            fi
        done
        
        # Redémarrer les services UI
        run_as_user "$user" /usr/bin/killall cfprefsd 2>/dev/null
        run_as_user "$user" /usr/bin/killall SystemUIServer 2>/dev/null
        
        log_action "✅ Profil '$profile_name' appliqué à l'utilisateur : $user"
    done
    
    return 0
}

# Sauvegarder la configuration de barre de menu utilisateur
backup_user_menubar_config() {
    local user="$1"
    local timestamp
    timestamp=$(date '+%Y%m%d_%H%M%S')
    
    local plist_path="/Users/$user/Library/Preferences/com.apple.systemuiserver.plist"
    local backup_file="$BACKUP_DIR/menubar_${user}_${timestamp}.plist"
    
    if [[ -f "$plist_path" ]]; then
        cp "$plist_path" "$backup_file" 2>/dev/null
        log_action "Configuration barre de menu sauvegardée pour $user : $backup_file"
        echo "$backup_file"
    fi
}

# Configuration de barre de menu personnalisée
configure_custom_menubar() {
    local items_string="$1"
    local target_user="$2"
    
    log_action "Application de la configuration de barre de menu personnalisée : $items_string"
    
    local users=()
    if [[ -n "$target_user" ]]; then
        users=("$target_user")
    else
        while IFS= read -r user; do
            users+=("$user")
        done < <(dscl . list /Users UniqueID | awk '$2 >= 500 {print $1}')
    fi
    
    # Analyser les éléments
    IFS=',' read -ra ITEMS <<< "$items_string"
    
    for user in "${users[@]}"; do
        local plist_path="/Users/$user/Library/Preferences/com.apple.systemuiserver.plist"
        
        # Sauvegarder et effacer
        backup_user_menubar_config "$user"
        run_as_user "$user" /usr/libexec/PlistBuddy -c "delete menuExtras:" "$plist_path" 2>/dev/null || true
        run_as_user "$user" /usr/libexec/PlistBuddy -c "add menuExtras: array" "$plist_path" 2>/dev/null
        
        # Ajouter les éléments personnalisés
        local index=0
        for item in "${ITEMS[@]}"; do
            # Supprimer les espaces
            item=$(echo "$item" | sed 's/^[ \t]*//;s/[ \t]*$//')
            
            local menu_path="${MENU_EXTRAS[$item]}"
            if [[ -n "$menu_path" && -f "$menu_path" ]]; then
                run_as_user "$user" /usr/libexec/PlistBuddy -c "add menuExtras:$index string '$menu_path'" "$plist_path" 2>/dev/null
                ((index++))
            fi
        done
        
        # Appliquer les changements
        run_as_user "$user" /usr/bin/killall cfprefsd 2>/dev/null
        run_as_user "$user" /usr/bin/killall SystemUIServer 2>/dev/null
        
        log_action "✅ Configuration personnalisée appliquée à l'utilisateur : $user"
    done
}

# Générer un rapport d'audit de barre de menu
generate_menubar_audit() {
    log_action "Génération du rapport d'audit de barre de menu"
    
    local report_file="$REPORTS_DIR/menubar_audit_$(date '+%Y%m%d_%H%M%S').json"
    
    cat > "$report_file" << EOF
{
    "audit_metadata": {
        "timestamp": "$(date -Iseconds)",
        "hostname": "$(hostname)",
        "os_version": "$(sw_vers -productVersion)",
        "generator": "MacFleet Menu Bar Manager"
    },
    "user_configurations": [
EOF

    local first=true
    local total_users=0
    
    # Auditer chaque utilisateur
    for user in $(dscl . list /Users UniqueID | awk '$2 >= 500 {print $1}'); do
        total_users=$((total_users + 1))
        
        if [[ "$first" == true ]]; then
            first=false
        else
            echo "," >> "$report_file"
        fi
        
        local current_config
        current_config=$(get_current_menubar_config "$user")
        
        local last_login
        last_login=$(last -1 "$user" | head -1 | awk '{print $4, $5, $6, $7}' || echo 'Jamais')
        
        cat >> "$report_file" << EOF
        {
            "username": "$user",
            "current_menu_items": $current_config,
            "item_count": $(echo "$current_config" | jq 'length'),
            "last_login": "$last_login",
            "config_file_exists": $([ -f "/Users/$user/Library/Preferences/com.apple.systemuiserver.plist" ] && echo "true" || echo "false")
        }
EOF
        
        log_action "Utilisateur audité : $user"
    done
    
    cat >> "$report_file" << EOF
    ],
    "summary": {
        "total_users": $total_users,
        "available_menu_items": $(echo "${!MENU_EXTRAS[@]}" | tr ' ' '\n' | jq -R . | jq -s .),
        "available_profiles": $(echo "${!MENU_PROFILES[@]}" | tr ' ' '\n' | jq -R . | jq -s .)
    }
}
EOF

    log_action "✅ Audit de barre de menu terminé : $report_file"
    echo "$report_file"
}

# Restaurer la configuration de barre de menu depuis une sauvegarde
restore_menubar_config() {
    local backup_file="$1"
    local target_user="$2"
    
    if [[ ! -f "$backup_file" ]]; then
        log_action "❌ Fichier de sauvegarde non trouvé : $backup_file"
        return 1
    fi
    
    log_action "Restauration de la configuration de barre de menu depuis : $backup_file"
    
    local users=()
    if [[ -n "$target_user" ]]; then
        users=("$target_user")
    else
        # Extraire le nom d'utilisateur du nom de fichier de sauvegarde
        local extracted_user
        extracted_user=$(basename "$backup_file" | sed 's/menubar_\(.*\)_[0-9]*_[0-9]*.plist/\1/')
        if [[ -n "$extracted_user" ]]; then
            users=("$extracted_user")
        fi
    fi
    
    for user in "${users[@]}"; do
        local plist_path="/Users/$user/Library/Preferences/com.apple.systemuiserver.plist"
        
        # Créer une sauvegarde actuelle avant la restauration
        backup_user_menubar_config "$user"
        
        # Restaurer la configuration
        if cp "$backup_file" "$plist_path" 2>/dev/null; then
            chown "$user:staff" "$plist_path" 2>/dev/null
            
            # Appliquer les changements
            run_as_user "$user" /usr/bin/killall cfprefsd 2>/dev/null
            run_as_user "$user" /usr/bin/killall SystemUIServer 2>/dev/null
            
            log_action "✅ Configuration restaurée pour l'utilisateur : $user"
        else
            log_action "❌ Échec de la restauration de configuration pour l'utilisateur : $user"
            return 1
        fi
    done
    
    return 0
}

# Surveiller les changements de barre de menu
monitor_menubar_changes() {
    local duration="${1:-3600}"  # 1 heure par défaut
    local check_interval="${2:-60}"  # 1 minute par défaut
    
    log_action "Démarrage de la surveillance de barre de menu pour ${duration} secondes"
    
    local monitoring_report="$REPORTS_DIR/menubar_monitoring_$(date '+%Y%m%d_%H%M%S').json"
    local baseline_file="/tmp/menubar_baseline.json"
    
    # Créer une ligne de base
    generate_menubar_audit > "$baseline_file"
    
    cat > "$monitoring_report" << EOF
{
    "monitoring_metadata": {
        "start_time": "$(date -Iseconds)",
        "duration_seconds": $duration,
        "check_interval_seconds": $check_interval,
        "hostname": "$(hostname)"
    },
    "changes_detected": [
EOF

    local start_time end_time
    start_time=$(date +%s)
    end_time=$((start_time + duration))
    
    local first=true
    while [[ $(date +%s) -lt $end_time ]]; do
        sleep "$check_interval"
        
        # Vérifier les changements
        local current_state="/tmp/menubar_current.json"
        generate_menubar_audit > "$current_state"
        
        if ! diff "$baseline_file" "$current_state" >/dev/null 2>&1; then
            if [[ "$first" == true ]]; then
                first=false
            else
                echo "," >> "$monitoring_report"
            fi
            
            cat >> "$monitoring_report" << EOF
        {
            "timestamp": "$(date -Iseconds)",
            "change_type": "menu_bar_configuration_change",
            "details": "Changements détectés dans la configuration de barre de menu"
        }
EOF
            
            log_action "⚠️  Changements de configuration de barre de menu détectés"
            cp "$current_state" "$baseline_file"
        fi
        
        rm -f "$current_state"
    done
    
    cat >> "$monitoring_report" << EOF
    ],
    "end_time": "$(date -Iseconds)"
}
EOF

    log_action "✅ Surveillance de barre de menu terminée : $monitoring_report"
    rm -f "$baseline_file"
    echo "$monitoring_report"
}

# Fonction d'exécution principale
main() {
    local action="${1:-audit}"
    local parameter="$2"
    local additional_param="$3"
    
    log_action "=== Démarrage de la Gestion de Barre de Menu MacFleet ==="
    log_action "Action : $action"
    log_action "Paramètre : ${parameter:-N/A}"
    
    setup_directories
    
    case "$action" in
        "profile")
            if [[ -z "$parameter" ]]; then
                echo "Profils de barre de menu disponibles :"
                for profile in "${!MENU_PROFILES[@]}"; do
                    echo "  - $profile : ${MENU_PROFILES[$profile]}"
                done
                echo ""
                echo "Usage : $0 profile <nom_profil> [nom_utilisateur]"
                exit 1
            fi
            apply_menubar_profile "$parameter" "$additional_param"
            ;;
        "custom")
            if [[ -z "$parameter" ]]; then
                echo "Éléments de menu disponibles :"
                for item in "${!MENU_EXTRAS[@]}"; do
                    echo "  - $item"
                done
                echo ""
                echo "Usage : $0 custom <item1,item2,item3> [nom_utilisateur]"
                echo "Exemple : $0 custom horloge,batterie,wifi,vpn john.doe"
                exit 1
            fi
            configure_custom_menubar "$parameter" "$additional_param"
            ;;
        "audit")
            generate_menubar_audit
            ;;
        "monitor")
            monitor_menubar_changes "$parameter" "$additional_param"
            ;;
        "restore")
            if [[ -z "$parameter" ]]; then
                echo "Usage : $0 restore <fichier_sauvegarde> [nom_utilisateur]"
                echo "Sauvegardes disponibles :"
                ls -la "$BACKUP_DIR"/*.plist 2>/dev/null || echo "Aucune sauvegarde trouvée"
                exit 1
            fi
            restore_menubar_config "$parameter" "$additional_param"
            ;;
        "hide-vpn")
            local user
            if user=$(get_current_user); then
                hide_vpn_icon
            else
                echo "❌ Aucune session utilisateur active"
                exit 1
            fi
            ;;
        "show-vpn")
            local user
            if user=$(get_current_user); then
                show_vpn_icon
            else
                echo "❌ Aucune session utilisateur active"
                exit 1
            fi
            ;;
        *)
            echo "Usage : $0 {profile|custom|audit|monitor|restore|hide-vpn|show-vpn}"
            echo "  profile     - Appliquer un profil de barre de menu prédéfini"
            echo "  custom      - Appliquer une configuration de barre de menu personnalisée"
            echo "  audit       - Générer un rapport d'audit de barre de menu"
            echo "  monitor     - Surveiller les changements de barre de menu dans le temps"
            echo "  restore     - Restaurer depuis une sauvegarde"
            echo "  hide-vpn    - Masquer l'icône VPN de la barre de menu"
            echo "  show-vpn    - Afficher l'icône VPN dans la barre de menu"
            exit 1
            ;;
    esac
    
    log_action "=== Gestion de barre de menu terminée ==="
}

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

Exemples de Profils de Barre de Menu

Configuration de Profil d'Entreprise

#!/bin/bash

# Appliquer le profil de barre de menu d'entreprise sur tous les appareils
deploy_corporate_profile() {
    echo "=== Déploiement de Barre de Menu d'Entreprise ==="
    
    # Profil d'entreprise : horloge, batterie, wifi, vpn, timemachine
    local corporate_items="horloge,batterie,wifi,vpn,timemachine"
    
    # Obtenir tous les utilisateurs
    for user in $(dscl . list /Users UniqueID | awk '$2 >= 500 {print $1}'); do
        echo "Configuration du profil d'entreprise pour : $user"
        
        # Appliquer la configuration
        configure_custom_menubar "$corporate_items" "$user"
        
        # Vérifier l'application
        sleep 2
        local current_config
        current_config=$(get_current_menubar_config "$user")
        echo "Configuration appliquée : $current_config"
    done
    
    echo "✅ Profil d'entreprise déployé pour tous les utilisateurs"
}

Configuration Mode Kiosque

#!/bin/bash

# Barre de menu minimale pour les environnements kiosque
setup_kiosk_menubar() {
    echo "=== Configuration de Barre de Menu Kiosque ==="
    
    # Éléments minimaux : horloge et batterie seulement
    local kiosk_items="horloge,batterie"
    
    local target_user="$1"
    if [[ -z "$target_user" ]]; then
        echo "Usage : setup_kiosk_menubar <nom_utilisateur>"
        return 1
    fi
    
    configure_custom_menubar "$kiosk_items" "$target_user"
    
    echo "✅ Barre de menu kiosque configurée pour : $target_user"
}

Fonctionnalités Avancées de Barre de Menu

Commutation Dynamique de Profils

#!/bin/bash

# Basculer entre différents profils selon les conditions
smart_profile_switching() {
    local user="$1"
    
    echo "=== Commutation Intelligente de Profils ==="
    
    # Détecter l'environnement
    if pgrep -f "VPN" >/dev/null; then
        echo "VPN détecté - application du profil d'entreprise"
        apply_menubar_profile "entreprise" "$user"
    elif [[ $(pmset -g batt | grep -c "Battery") -gt 0 ]]; then
        echo "Alimentation batterie détectée - application du profil minimal"
        apply_menubar_profile "minimal" "$user"
    else
        echo "Environnement standard - application du profil complet"
        apply_menubar_profile "complet" "$user"
    fi
}

Vérification de Santé de Barre de Menu

#!/bin/bash

# Vérifier l'intégrité de la configuration de barre de menu
menubar_health_check() {
    echo "=== Vérification de Santé de Barre de Menu ==="
    
    local issues_found=0
    
    for user in $(dscl . list /Users UniqueID | awk '$2 >= 500 {print $1}'); do
        local plist_path="/Users/$user/Library/Preferences/com.apple.systemuiserver.plist"
        
        if [[ ! -f "$plist_path" ]]; then
            echo "⚠️  Fichier de configuration manquant pour l'utilisateur : $user"
            issues_found=$((issues_found + 1))
            continue
        fi
        
        # Vérifier si SystemUIServer fonctionne
        if ! pgrep -u "$(id -u "$user")" SystemUIServer >/dev/null; then
            echo "⚠️  SystemUIServer ne fonctionne pas pour l'utilisateur : $user"
            issues_found=$((issues_found + 1))
        fi
        
        # Valider le format plist
        if ! plutil -lint "$plist_path" >/dev/null 2>&1; then
            echo "❌ Fichier plist corrompu pour l'utilisateur : $user"
            issues_found=$((issues_found + 1))
        fi
    done
    
    if [[ $issues_found -eq 0 ]]; then
        echo "✅ Toutes les configurations de barre de menu sont saines"
    else
        echo "⚠️  Trouvé $issues_found problèmes nécessitant une attention"
    fi
    
    return $issues_found
}

Meilleures Pratiques

🎯 Optimisation de l'Expérience Utilisateur

  • Image de marque cohérente sur tous les appareils avec des dispositions de barre de menu standardisées
  • Configurations basées sur les profils pour différents rôles utilisateur et environnements
  • Configurations kiosque minimales pour les appareils publics ou à usage restreint
  • Commutation dynamique basée sur l'état d'alimentation ou les conditions réseau

🔧 Gestion d'Entreprise

  • Déploiement centralisé des configurations de barre de menu sur les flottes d'appareils
  • Capacités de sauvegarde et restauration pour la gestion de configuration
  • Rapports d'audit pour la vérification de conformité et de standardisation
  • Surveillance des changements avec détection automatisée et alertes

🔐 Considérations de Sécurité

  • Supprimer les indicateurs sensibles des appareils publics
  • Masquer le statut VPN dans les environnements où les informations réseau doivent être privées
  • Standardiser les affichages d'entreprise pour éviter les fuites d'information
  • Surveiller les changements non autorisés des configurations de barre de menu

📊 Surveillance et Maintenance

  • Vérifications de santé régulières pour assurer l'intégrité de la configuration
  • Application automatisée de profils pour maintenir la cohérence
  • Détection de changements avec capacités de retour en arrière
  • Collection de commentaires d'expérience utilisateur et optimisation

Notes Importantes

  • macOS 12+ requis pour une compatibilité optimale avec les extras de menu modernes
  • Session utilisateur active requise pour les modifications de barre de menu
  • Redémarrage système peut être nécessaire pour que certains changements prennent pleinement effet
  • Tester minutieusement avant de déployer en environnements de production
  • Sauvegarder les configurations avant d'apporter des changements pour permettre un retour facile

Gérer les panneaux de réglages système sur macOS

Contrôlez quels panneaux de réglages système les utilisateurs peuvent accéder sur macOS Ventura et versions ultérieures. Ce tutoriel montre comment désactiver ou masquer des panneaux de préférences spécifiques pour maintenir la sécurité et empêcher les modifications de configuration non désirées sur votre MacFleet.

Comprendre Réglages Système vs Préférences Système

macOS Ventura (13.0+) a remplacé "Préférences Système" par "Réglages Système". L'approche de gestion diffère entre les versions :

  • macOS 13.0+ : Utilisez DisabledSystemSettings et des identifiants de bundle se terminant par .extension
  • macOS 12.x et antérieures : Utilisez DisabledPreferencePanes avec des identifiants de bundle différents

Désactiver les panneaux de réglages système

Script de désactivation de base

#!/bin/bash

# Désactiver un panneau de réglages système spécifique
defaults write "/Library/Preferences/com.apple.systempreferences" DisabledSystemSettings -array "com.apple.Battery-Settings.extension"

echo "Panneau de réglages système désactivé avec succès"

Désactiver plusieurs panneaux

#!/bin/bash

# Désactiver plusieurs panneaux de réglages système
defaults write "/Library/Preferences/com.apple.systempreferences" DisabledSystemSettings -array \
    "com.apple.BluetoothSettings" \
    "com.apple.Network-Settings.extension" \
    "com.apple.Battery-Settings.extension"

echo "Plusieurs panneaux de réglages système désactivés"

Identifiants de bundle des réglages système

Nom du panneauIdentifiant de bundle
Accessibilitécom.apple.Accessibility-Settings.extension
AirDrop et Handoffcom.apple.AirDrop-Handoff-Settings.extension
Identifiant Applecom.apple.systempreferences.AppleIDSettings
Batteriecom.apple.Battery-Settings.extension
Bluetoothcom.apple.BluetoothSettings
Centre de contrôlecom.apple.ControlCenter-Settings.extension
Date et heurecom.apple.Date-Time-Settings.extension
Bureau et Dockcom.apple.Desktop-Settings.extension
Moniteurscom.apple.Displays-Settings.extension
Extensionscom.apple.ExtensionsPreferences
Concentrationcom.apple.Focus-Settings.extension
Game Centercom.apple.Game-Center-Settings.extension
Comptes Internetcom.apple.Internet-Accounts-Settings.extension
Claviercom.apple.Keyboard-Settings.extension
Langue et régioncom.apple.Localization-Settings.extension
Écran de verrouillagecom.apple.Lock-Screen-Settings.extension
Ouverture de sessioncom.apple.LoginItems-Settings.extension
Réseaucom.apple.Network-Settings.extension
Notificationscom.apple.Notifications-Settings.extension
Mots de passecom.apple.Passwords-Settings.extension
Imprimantes et scannerscom.apple.Print-Scan-Settings.extension
Temps d'écrancom.apple.Screen-Time-Settings.extension
Économiseur d'écrancom.apple.ScreenSaver-Settings.extension
Partagecom.apple.Sharing-Settings.extension
Siri et Spotlightcom.apple.Siri-Settings.extension
Mise à jour logiciellecom.apple.Software-Update-Settings.extension
Soncom.apple.Sound-Settings.extension
Disque de démarragecom.apple.Startup-Disk-Settings.extension
Stockagecom.apple.settings.Storage
Time Machinecom.apple.Time-Machine-Settings.extension
Touch ID et mot de passecom.apple.Touch-ID-Settings.extension
Trackpadcom.apple.Trackpad-Settings.extension
Transfert ou réinitialisationcom.apple.Transfer-Reset-Settings.extension
Utilisateurs et groupescom.apple.Users-Groups-Settings.extension
Portefeuille et Apple Paycom.apple.WalletSettingsExtension
Fond d'écrancom.apple.Wallpaper-Settings.extension
Wi-Ficom.apple.wifi-settings-extension

Ouvrir les panneaux de réglages système à distance

Ouvrir un panneau spécifique

#!/bin/bash

# Ouvrir le panneau des réglages réseau
open "x-apple.systempreferences:com.apple.Network-Settings.extension"

echo "Panneau des réglages réseau ouvert"

Ouverture conditionnelle de panneau

#!/bin/bash

PANEL_ID="com.apple.Battery-Settings.extension"

# Vérifier si le panneau n'est pas désactivé avant de l'ouvrir
if ! defaults read "/Library/Preferences/com.apple.systempreferences" DisabledSystemSettings 2>/dev/null | grep -q "$PANEL_ID"; then
    open "x-apple.systempreferences:$PANEL_ID"
    echo "Panneau des réglages de batterie ouvert"
else
    echo "Panneau des réglages de batterie désactivé"
fi

Réactiver les panneaux désactivés

Réactiver tous les panneaux

#!/bin/bash

# Supprimer toutes les restrictions des réglages système
defaults delete "/Library/Preferences/com.apple.systempreferences" DisabledSystemSettings

echo "Tous les panneaux de réglages système réactivés"

Réactiver des panneaux spécifiques

#!/bin/bash

# Obtenir les panneaux actuellement désactivés
CURRENT_DISABLED=$(defaults read "/Library/Preferences/com.apple.systempreferences" DisabledSystemSettings 2>/dev/null)

# Supprimer un panneau spécifique de la liste des désactivés (nécessite une logique personnalisée)
# Cet exemple montre le concept - implémentez selon vos besoins
defaults write "/Library/Preferences/com.apple.systempreferences" DisabledSystemSettings -array \
    "com.apple.BluetoothSettings"
    # Ajoutez les autres panneaux que vous voulez garder désactivés

echo "Panneaux de réglages système spécifiques réactivés"

Script de gestion d'entreprise

#!/bin/bash

# Gestion des réglages système d'entreprise
# Restreint l'accès aux panneaux de configuration sensibles

RESTRICTED_PANELS=(
    "com.apple.Network-Settings.extension"
    "com.apple.BluetoothSettings"
    "com.apple.Security-Privacy-Settings.extension"
    "com.apple.Software-Update-Settings.extension"
    "com.apple.Users-Groups-Settings.extension"
)

# Appliquer les restrictions
defaults write "/Library/Preferences/com.apple.systempreferences" DisabledSystemSettings -array "${RESTRICTED_PANELS[@]}"

# Vérifier les restrictions
echo "Panneaux de réglages système désactivés :"
defaults read "/Library/Preferences/com.apple.systempreferences" DisabledSystemSettings 2>/dev/null || echo "Aucun panneau actuellement désactivé"

# Enregistrer l'action
logger "MacFleet: Panneaux de réglages système restreints le $(date)"

Dépannage

Vérifier les restrictions actuelles

# Voir les panneaux actuellement désactivés
defaults read "/Library/Preferences/com.apple.systempreferences" DisabledSystemSettings

# Vérifier si un panneau spécifique est désactivé
if defaults read "/Library/Preferences/com.apple.systempreferences" DisabledSystemSettings 2>/dev/null | grep -q "com.apple.Battery-Settings.extension"; then
    echo "Le panneau batterie est désactivé"
else
    echo "Le panneau batterie est accessible"
fi

Supprimer toutes les restrictions

# Réinitialisation d'urgence - réactiver tous les panneaux
sudo defaults delete "/Library/Preferences/com.apple.systempreferences" DisabledSystemSettings
sudo killall cfprefsd

Cas d'utilisation courants

ScénarioPanneaux recommandés à désactiver
Postes partagésUtilisateurs et groupes, Mise à jour logicielle, Réseau
Appareils BYODIdentifiant Apple, Transfert ou réinitialisation, Utilisateurs et groupes
Mode kiosqueTous sauf les panneaux essentiels au fonctionnement
Laboratoires éducatifsRéseau, Mise à jour logicielle, Touch ID et mot de passe
Sécurité d'entrepriseMise à jour logicielle, Transfert ou réinitialisation, Partage

Notes importantes

  • Compatibilité macOS : Ces scripts fonctionnent uniquement sur macOS 13.0 (Ventura) et versions ultérieures
  • Expérience utilisateur : Les panneaux désactivés apparaissent grisés mais restent visibles
  • Redémarrage système : Les modifications prennent effet immédiatement sans redémarrage
  • Persistance : Les paramètres persistent entre les sessions utilisateur et les redémarrages système

Pour les appareils fonctionnant sous macOS 12.x et antérieures, utilisez l'approche de gestion des préférences système héritée avec des identifiants de bundle différents.

Gérer les processus en cours d'exécution sur macOS

Surveillez et contrôlez les processus en cours d'exécution sur vos appareils MacFleet en utilisant des outils en ligne de commande. Ce tutoriel couvre la surveillance du CPU, l'analyse de la mémoire, la liste des processus et la terminaison de processus pour une gestion système efficace.

Comprendre la gestion des processus macOS

macOS fournit plusieurs outils en ligne de commande pour la gestion des processus :

  • top - Affichage en temps réel des processus en cours et de l'utilisation système
  • ps - Instantané des processus actuels
  • kill - Terminer des processus par PID
  • Moniteur d'activité - Équivalent GUI pour la surveillance visuelle

Afficher l'utilisation du CPU

Utilisation basique du CPU

#!/bin/bash

# Afficher l'utilisation actuelle du CPU
top -l 1 -s 0 | grep "CPU usage"

echo "Utilisation du CPU récupérée avec succès"

Analyse détaillée du CPU

#!/bin/bash

# Obtenir des informations complètes sur le CPU
echo "=== Analyse d'utilisation du CPU ==="
echo "Utilisation actuelle du CPU :"
top -l 1 -s 0 | grep "CPU usage"

echo -e "\nProcessus consommant le plus de CPU :"
top -l 1 -s 0 | head -20 | tail -10

echo -e "\nMoyenne de charge :"
uptime

Afficher l'état de la mémoire

Informations basiques de la mémoire

#!/bin/bash

# Afficher l'utilisation de la mémoire
top -l 1 -s 0 | grep PhysMem

echo "État de la mémoire récupéré avec succès"

Analyse complète de la mémoire

#!/bin/bash

# Rapport détaillé de la mémoire
echo "=== Analyse de l'état de la mémoire ==="
echo "Utilisation de la mémoire physique :"
top -l 1 -s 0 | grep PhysMem

echo -e "\nStatistiques de la mémoire virtuelle :"
vm_stat

echo -e "\nPression mémoire :"
memory_pressure

Lister les processus en cours d'exécution

Voir tous les processus

#!/bin/bash

# Lister tous les processus en cours d'exécution
ps aux

echo "Liste des processus générée avec succès"

Liste limitée de processus

#!/bin/bash

# Afficher les 10 premiers processus
echo "Top 10 des processus en cours :"
ps aux | head -11

# Afficher un nombre spécifique de processus (remplacer 15 par le nombre désiré)
echo -e "\nTop 15 des processus :"
ps aux | head -16

Vues filtrées des processus

#!/bin/bash

# Afficher seulement les processus utilisateur
echo "Processus utilisateur :"
ps aux | grep -v "^root"

echo -e "\nProcessus système :"
ps aux | grep "^root" | head -10

echo -e "\nProcessus utilisant le plus de CPU :"
ps aux --sort=-%cpu | head -10

echo -e "\nProcessus utilisant le plus de mémoire :"
ps aux --sort=-%mem | head -10

Terminaison de processus

Tuer un processus par PID

#!/bin/bash

# Tuer un processus spécifique (remplacer PID par l'ID de processus réel)
PID="1234"

if kill -9 "$PID" 2>/dev/null; then
    echo "Processus $PID terminé avec succès"
else
    echo "Échec de la terminaison du processus $PID ou processus introuvable"
fi

Tuer un processus par nom

#!/bin/bash

# Tuer un processus par nom d'application
APP_NAME="Safari"

if pkill -f "$APP_NAME"; then
    echo "Processus $APP_NAME terminés avec succès"
else
    echo "Aucun processus $APP_NAME trouvé ou échec de la terminaison"
fi

Terminaison sécurisée de processus

#!/bin/bash

# Terminer gracieusement un processus avec confirmation
terminate_process() {
    local pid="$1"
    local process_name
    
    # Obtenir le nom du processus
    process_name=$(ps -p "$pid" -o comm= 2>/dev/null)
    
    if [[ -z "$process_name" ]]; then
        echo "Processus $pid introuvable"
        return 1
    fi
    
    echo "Processus trouvé : $process_name (PID: $pid)"
    
    # Essayer d'abord une terminaison gracieuse
    if kill -TERM "$pid" 2>/dev/null; then
        echo "Signal de terminaison envoyé à $process_name"
        sleep 3
        
        # Vérifier si le processus existe encore
        if kill -0 "$pid" 2>/dev/null; then
            echo "Processus encore actif, forcer la terminaison..."
            kill -9 "$pid" 2>/dev/null
        fi
        
        echo "Processus $process_name terminé"
        return 0
    else
        echo "Échec de la terminaison du processus $process_name"
        return 1
    fi
}

# Exemple d'utilisation (remplacer par le PID réel)
# terminate_process 1234

Script de gestion de processus d'entreprise

#!/bin/bash

# Outil de gestion des processus MacFleet
# Surveiller et gérer les processus sur les appareils de la flotte

# Configuration
LOG_FILE="/var/log/macfleet_processes.log"
ALERT_CPU_THRESHOLD=80
ALERT_MEMORY_THRESHOLD=80

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

# Obtenir les statistiques système
get_system_stats() {
    echo "=== Statistiques système ==="
    
    # Utilisation CPU
    local cpu_info
    cpu_info=$(top -l 1 -s 0 | grep "CPU usage")
    echo "CPU : $cpu_info"
    
    # Utilisation mémoire
    local mem_info
    mem_info=$(top -l 1 -s 0 | grep PhysMem)
    echo "Mémoire : $mem_info"
    
    # Moyenne de charge
    echo "Charge : $(uptime | awk -F'load average:' '{print $2}')"
    
    # Top processus
    echo -e "\nTop 5 des consommateurs CPU :"
    ps aux --sort=-%cpu | head -6 | tail -5
    
    echo -e "\nTop 5 des consommateurs mémoire :"
    ps aux --sort=-%mem | head -6 | tail -5
}

# Vérifier la santé du système
check_system_health() {
    echo "=== Vérification de la santé du système ==="
    
    # Vérifier les processus haute utilisation CPU
    local high_cpu_procs
    high_cpu_procs=$(ps aux | awk -v threshold="$ALERT_CPU_THRESHOLD" '$3 > threshold {print $2, $11, $3"%"}')
    
    if [[ -n "$high_cpu_procs" ]]; then
        echo "⚠️  Processus haute utilisation CPU :"
        echo "$high_cpu_procs"
        log_action "Alerte CPU élevé : $high_cpu_procs"
    fi
    
    # Vérifier les processus haute utilisation mémoire
    local high_mem_procs
    high_mem_procs=$(ps aux | awk -v threshold="$ALERT_MEMORY_THRESHOLD" '$4 > threshold {print $2, $11, $4"%"}')
    
    if [[ -n "$high_mem_procs" ]]; then
        echo "⚠️  Processus haute utilisation mémoire :"
        echo "$high_mem_procs"
        log_action "Alerte mémoire élevée : $high_mem_procs"
    fi
}

# Tuer les processus incontrôlés
kill_runaway_processes() {
    echo "=== Détection de processus incontrôlés ==="
    
    # Trouver les processus utilisant un CPU excessif (>90% pendant >5 minutes)
    local runaway_pids
    runaway_pids=$(ps aux | awk '$3 > 90 {print $2}')
    
    for pid in $runaway_pids; do
        local process_name
        process_name=$(ps -p "$pid" -o comm= 2>/dev/null)
        
        if [[ -n "$process_name" ]]; then
            echo "Processus incontrôlé trouvé : $process_name (PID: $pid)"
            
            # Ignorer les processus système critiques
            if [[ "$process_name" =~ ^(kernel|launchd|WindowServer)$ ]]; then
                echo "Ignorer le processus système critique : $process_name"
                continue
            fi
            
            log_action "Terminaison du processus incontrôlé : $process_name (PID: $pid)"
            kill -TERM "$pid"
        fi
    done
}

# Fonction principale de surveillance
main() {
    log_action "=== Surveillance des processus MacFleet démarrée ==="
    
    get_system_stats
    echo ""
    check_system_health
    echo ""
    
    # Optionnellement tuer les processus incontrôlés (décommenter pour activer)
    # kill_runaway_processes
    
    log_action "=== Surveillance des processus terminée ==="
}

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

Détails des informations de processus

Lors de l'utilisation de ps aux, chaque colonne fournit des informations spécifiques :

ColonneDescription
USERUtilisateur exécutant le processus (processus système ou utilisateur)
PIDID du processus (identifiant unique)
%CPUPourcentage d'utilisation CPU
%MEMPourcentage d'utilisation mémoire
VSZTaille de la mémoire virtuelle en KB
RSSUtilisation de la mémoire physique en KB
TTTerminal associé au processus
STATÉtat du processus (R=en cours, S=endormi, Z=zombie)
STARTEDDate/heure de démarrage du processus
TIMETemps CPU consommé
COMMANDCommande utilisée pour démarrer le processus

Tâches courantes de gestion de processus

Trouver un processus par nom

# Trouver les processus Safari
ps aux | grep -i safari

# Trouver tous les processus contenant "mail"
ps aux | grep -i mail | grep -v grep

Surveiller un processus en temps réel

# Surveiller un processus spécifique
watch -n 1 'ps aux | grep -i safari'

# Surveiller les ressources système en continu
top -s 1 -n 10

Générer un rapport de processus

#!/bin/bash

# Créer un rapport complet des processus
REPORT_FILE="process_report_$(date +%Y%m%d_%H%M%S).txt"

{
    echo "Rapport de processus MacFleet"
    echo "Généré : $(date)"
    echo "Nom d'hôte : $(hostname)"
    echo "=========================="
    echo ""
    
    echo "Aperçu système :"
    top -l 1 -s 0 | grep -E "(CPU usage|PhysMem)"
    echo ""
    
    echo "Top 20 processus :"
    ps aux | head -21
    echo ""
    
    echo "Nombre de processus par utilisateur :"
    ps aux | awk '{print $1}' | sort | uniq -c | sort -nr
    
} > "$REPORT_FILE"

echo "Rapport de processus sauvegardé dans : $REPORT_FILE"

Notes importantes

  • Les ID de processus (PID) changent lorsque les processus redémarrent
  • Les processus système nécessitent des privilèges admin pour être terminés
  • Force kill (kill -9) doit être utilisé en dernier recours
  • Surveiller l'utilisation des ressources avant de terminer des processus
  • Tester les scripts sur des appareils individuels avant le déploiement en flotte