Guide

Nouvelles mises à jour et améliorations de Macfleet.

Avis important

Les exemples de code et scripts fournis dans ces tutoriels sont uniquement à des fins éducatives. Macfleet n'est pas responsable des problèmes, dommages ou vulnérabilités de sécurité qui pourraient survenir lors de l'utilisation, modification ou implémentation de ces exemples. Toujours vérifier et tester le code dans un environnement sécurisé avant de l'utiliser dans des systèmes de production.

Installer la dernière version de Firefox sur les appareils macOS

Ce guide complet démontre comment installer et gérer la dernière version de Firefox sur les appareils macOS pour le déploiement d'entreprise, les mises à jour automatiques et la gestion de configuration.

Aperçu

Firefox privilégie la confidentialité des utilisateurs, la sécurité et fournit de nombreuses options de personnalisation pour la navigation selon les préférences organisationnelles, ce qui le rend idéal pour l'utilisation en entreprise.

Avantages clés

  • Axé sur la confidentialité : Protection renforcée de la confidentialité et des données utilisateur
  • Sécurité : Mises à jour de sécurité régulières et protection de niveau entreprise
  • Personnalisation : Options de configuration étendues pour les politiques d'entreprise
  • Multiplateforme : Expérience cohérente sur différents systèmes d'exploitation
  • Open source : Développement transparent et audit de sécurité

Installation de base de Firefox

Script d'installation Firefox simple

#!/bin/bash

# Script d'installation basique de Firefox
# Utilisation : ./installer_firefox.sh

installer_firefox() {
    echo "Démarrage du processus d'installation de Firefox..."
    
    # Vérifier si Firefox est déjà installé
    if [ -d "/Applications/Firefox.app" ]; then
        echo "Firefox est déjà installé."
        exit 0
    fi
    
    # URL de téléchargement Firefox
    firefox_url="https://download.mozilla.org/?product=firefox-latest&os=osx&lang=fr"
    repertoire_telechargement="$HOME/Applications"
    
    # Créer le répertoire de téléchargement
    mkdir -p "$repertoire_telechargement"
    
    echo "Téléchargement de Firefox..."
    curl -L -o "$repertoire_telechargement/Firefox.dmg" "$firefox_url"
    
    echo "Montage de l'image disque Firefox..."
    hdiutil attach "$repertoire_telechargement/Firefox.dmg"
    
    echo "Installation de Firefox..."
    cp -r "/Volumes/Firefox/Firefox.app" "/Applications/"
    
    echo "Démontage de l'image disque Firefox..."
    hdiutil detach "/Volumes/Firefox"
    
    echo "Nettoyage..."
    rm "$repertoire_telechargement/Firefox.dmg"
    
    echo "Installation de Firefox terminée."
}

# Exécuter l'installation
installer_firefox

Installation Firefox avancée avec validation

#!/bin/bash

# Installation Firefox avancée avec validation et journalisation
# Utilisation : ./installation_firefox_avancee.sh

installation_firefox_avancee() {
    local fichier_log="/var/log/macfleet_firefox_install.log"
    local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
    local repertoire_telechargement="/tmp/macfleet_firefox"
    
    # Créer le répertoire de log
    mkdir -p /var/log
    mkdir -p "$repertoire_telechargement"
    
    echo "[$timestamp] Installation Firefox avancée démarrée" >> "$fichier_log"
    
    # Vérifier si s'exécute en tant que root
    if [ "$EUID" -ne 0 ]; then
        echo "Attention : Exécution en tant qu'utilisateur. Certaines fonctionnalités peuvent être limitées."
        echo "[$timestamp] Exécution en tant qu'utilisateur, pas root" >> "$fichier_log"
    fi
    
    # Vérifier l'installation Firefox existante
    verifier_firefox_existant
    
    # Télécharger et installer Firefox
    telecharger_firefox
    installer_application_firefox
    verifier_installation
    nettoyer_installation
    
    echo "[$timestamp] Installation Firefox avancée terminée" >> "$fichier_log"
}

verifier_firefox_existant() {
    echo "Vérification de l'installation Firefox existante..."
    
    if [ -d "/Applications/Firefox.app" ]; then
        local version_actuelle=$(defaults read /Applications/Firefox.app/Contents/Info.plist CFBundleShortVersionString 2>/dev/null || echo "Inconnue")
        
        echo "Firefox est déjà installé (Version : $version_actuelle)"
        echo "[$timestamp] Firefox déjà installé - Version : $version_actuelle" >> "$fichier_log"
        
        read -p "Voulez-vous mettre à jour vers la dernière version ? (o/N) : " choix_mise_a_jour
        if [ "$choix_mise_a_jour" != "o" ] && [ "$choix_mise_a_jour" != "O" ]; then
            echo "Installation annulée."
            exit 0
        fi
        
        echo "Poursuite avec la mise à jour de Firefox..."
    else
        echo "Aucune installation Firefox existante trouvée."
        echo "[$timestamp] Aucune installation Firefox existante trouvée" >> "$fichier_log"
    fi
}

telecharger_firefox() {
    echo "Téléchargement de la dernière version de Firefox..."
    
    local firefox_url="https://download.mozilla.org/?product=firefox-latest&os=osx&lang=fr"
    local firefox_dmg="$repertoire_telechargement/Firefox.dmg"
    
    # Vérifier la connectivité réseau
    if ! ping -c 1 download.mozilla.org >/dev/null 2>&1; then
        echo "Erreur : Pas de connectivité réseau vers les serveurs Mozilla"
        echo "[$timestamp] Échec de la vérification de connectivité réseau" >> "$fichier_log"
        exit 1
    fi
    
    # Télécharger Firefox avec barre de progression et gestion d'erreurs
    if curl -L --progress-bar -o "$firefox_dmg" "$firefox_url"; then
        echo "Téléchargement de Firefox terminé avec succès"
        echo "[$timestamp] Téléchargement de Firefox terminé" >> "$fichier_log"
    else
        echo "Erreur : Échec du téléchargement de Firefox"
        echo "[$timestamp] Échec du téléchargement de Firefox" >> "$fichier_log"
        exit 1
    fi
    
    # Vérifier le téléchargement
    if [ -f "$firefox_dmg" ]; then
        local taille_fichier=$(stat -f%z "$firefox_dmg" 2>/dev/null || echo "0")
        echo "Taille du fichier téléchargé : $taille_fichier octets"
        echo "[$timestamp] Taille du fichier téléchargé : $taille_fichier octets" >> "$fichier_log"
        
        if [ "$taille_fichier" -lt 50000000 ]; then  # Moins de 50MB indique un problème potentiel
            echo "Attention : Le fichier téléchargé semble trop petit. Problème de téléchargement possible."
            echo "[$timestamp] Avertissement taille du fichier téléchargé" >> "$fichier_log"
        fi
    else
        echo "Erreur : Fichier de téléchargement non trouvé"
        echo "[$timestamp] Fichier de téléchargement non trouvé" >> "$fichier_log"
        exit 1
    fi
}

installer_application_firefox() {
    echo "Installation de l'application Firefox..."
    
    local firefox_dmg="$repertoire_telechargement/Firefox.dmg"
    local point_montage="/tmp/firefox_mount"
    
    # Créer le point de montage
    mkdir -p "$point_montage"
    
    # Monter le fichier DMG
    if hdiutil attach "$firefox_dmg" -mountpoint "$point_montage" -quiet; then
        echo "Image disque Firefox montée avec succès"
        echo "[$timestamp] Image disque Firefox montée" >> "$fichier_log"
    else
        echo "Erreur : Échec du montage de l'image disque Firefox"
        echo "[$timestamp] Échec du montage de l'image disque Firefox" >> "$fichier_log"
        exit 1
    fi
    
    # Copier l'application Firefox
    if [ -d "$point_montage/Firefox.app" ]; then
        echo "Copie de l'application Firefox vers /Applications..."
        
        # Supprimer l'installation existante si présente
        if [ -d "/Applications/Firefox.app" ]; then
            rm -rf "/Applications/Firefox.app"
        fi
        
        # Copier la nouvelle application Firefox
        if cp -R "$point_montage/Firefox.app" "/Applications/"; then
            echo "Application Firefox copiée avec succès"
            echo "[$timestamp] Application Firefox copiée avec succès" >> "$fichier_log"
        else
            echo "Erreur : Échec de la copie de l'application Firefox"
            echo "[$timestamp] Échec de la copie de l'application Firefox" >> "$fichier_log"
            hdiutil detach "$point_montage" -quiet
            exit 1
        fi
    else
        echo "Erreur : Firefox.app non trouvé dans l'image disque"
        echo "[$timestamp] Firefox.app non trouvé dans l'image disque" >> "$fichier_log"
        hdiutil detach "$point_montage" -quiet
        exit 1
    fi
    
    # Démonter l'image disque
    if hdiutil detach "$point_montage" -quiet; then
        echo "Image disque Firefox démontée avec succès"
        echo "[$timestamp] Image disque Firefox démontée" >> "$fichier_log"
    else
        echo "Attention : Échec du démontage de l'image disque Firefox"
        echo "[$timestamp] Échec du démontage de l'image disque Firefox" >> "$fichier_log"
    fi
}

verifier_installation() {
    echo "Vérification de l'installation Firefox..."
    
    if [ -d "/Applications/Firefox.app" ]; then
        local version_installee=$(defaults read /Applications/Firefox.app/Contents/Info.plist CFBundleShortVersionString 2>/dev/null || echo "Inconnue")
        local bundle_id=$(defaults read /Applications/Firefox.app/Contents/Info.plist CFBundleIdentifier 2>/dev/null || echo "Inconnu")
        
        echo "Installation Firefox vérifiée :"
        echo "  Version : $version_installee"
        echo "  Bundle ID : $bundle_id"
        echo "  Emplacement : /Applications/Firefox.app"
        
        echo "[$timestamp] Installation Firefox vérifiée - Version : $version_installee" >> "$fichier_log"
        
        # Tester le lancement de Firefox (optionnel)
        echo "Test de lancement de Firefox..."
        if timeout 10 /Applications/Firefox.app/Contents/MacOS/firefox --version >/dev/null 2>&1; then
            echo "Test de lancement de Firefox réussi"
            echo "[$timestamp] Test de lancement de Firefox réussi" >> "$fichier_log"
        else
            echo "Attention : Test de lancement de Firefox échoué ou timeout"
            echo "[$timestamp] Test de lancement de Firefox échoué" >> "$fichier_log"
        fi
    else
        echo "Erreur : Vérification de l'installation Firefox échouée"
        echo "[$timestamp] Vérification de l'installation Firefox échouée" >> "$fichier_log"
        exit 1
    fi
}

nettoyer_installation() {
    echo "Nettoyage des fichiers d'installation..."
    
    if [ -d "$repertoire_telechargement" ]; then
        rm -rf "$repertoire_telechargement"
        echo "Fichiers d'installation nettoyés"
        echo "[$timestamp] Fichiers d'installation nettoyés" >> "$fichier_log"
    fi
}

# Exécuter l'installation avancée
installation_firefox_avancee

Gestion Firefox d'entreprise

Gestionnaire de déploiement Firefox d'entreprise

#!/bin/bash

# Gestionnaire de déploiement Firefox d'entreprise
# Utilisation : ./gestionnaire_firefox_entreprise.sh

gestionnaire_firefox_entreprise() {
    local fichier_config="/etc/macfleet/firefox_config.conf"
    local fichier_log="/var/log/macfleet_firefox_entreprise.log"
    local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
    
    # Vérifier si s'exécute en tant que root
    if [ "$EUID" -ne 0 ]; then
        echo "Erreur : Ce script doit être exécuté en tant que root pour le déploiement d'entreprise"
        exit 1
    fi
    
    # Créer le répertoire de configuration
    mkdir -p /etc/macfleet
    
    # Charger ou créer la configuration
    if [ -f "$fichier_config" ]; then
        source "$fichier_config"
    else
        creer_config_entreprise
        source "$fichier_config"
    fi
    
    echo "[$timestamp] Gestionnaire Firefox d'entreprise démarré" >> "$fichier_log"
    
    # Afficher le menu d'entreprise
    afficher_menu_entreprise
}

creer_config_entreprise() {
    cat > "/etc/macfleet/firefox_config.conf" << 'EOF'
# Configuration Firefox d'entreprise MacFleet

# Paramètres de l'organisation
NOM_ORGANISATION="Organisation MacFleet"
CONTACT_IT="support@macfleet.com"

# Paramètres d'installation Firefox
LANGUE_FIREFOX="fr"
CANAL_FIREFOX="release"  # release, beta, nightly
MISE_A_JOUR_AUTO_ACTIVEE="true"
INSTALLATION_SILENCIEUSE="true"

# Politiques d'entreprise
ACTIVER_POLITIQUES_ENTREPRISE="true"
DESACTIVER_TELEMETRIE="true"
DESACTIVER_ETUDES="true"
BLOQUER_ABOUT_CONFIG="false"
URL_PAGE_ACCUEIL="https://www.macfleet.com"

# Paramètres de sécurité
ACTIVER_POLITIQUES_SECURITE="true"
BLOQUER_TELECHARGEMENTS_DANGEREUX="true"
ACTIVER_NAVIGATION_SECURISEE="true"
DESACTIVER_OUTILS_DEVELOPPEUR="false"

# Journalisation et surveillance
ACTIVER_JOURNALISATION_DETAILLEE="true"
RETENTION_LOGS_JOURS="30"
ENVOYER_RAPPORTS_DEPLOIEMENT="true"
EOF
    
    echo "Configuration d'entreprise créée à /etc/macfleet/firefox_config.conf"
}

afficher_menu_entreprise() {
    while true; do
        clear
        echo "======================================="
        echo "Gestionnaire Firefox d'entreprise MacFleet"
        echo "======================================="
        echo ""
        echo "Organisation : $NOM_ORGANISATION"
        echo "Contact : $CONTACT_IT"
        echo ""
        echo "Actions disponibles :"
        echo "1. Installer/Mettre à jour Firefox"
        echo "2. Configurer les politiques d'entreprise"
        echo "3. Vérifier le statut Firefox"
        echo "4. Générer un rapport de déploiement"
        echo "5. Voir la configuration"
        echo "6. Quitter"
        echo ""
        read -p "Sélectionnez une option (1-6) : " choix
        
        case $choix in
            1)
                installer_mettre_a_jour_firefox
                ;;
            2)
                configurer_politiques_entreprise
                ;;
            3)
                verifier_statut_firefox
                ;;
            4)
                generer_rapport_deploiement
                ;;
            5)
                voir_configuration
                ;;
            6)
                echo "Fermeture du gestionnaire Firefox d'entreprise."
                exit 0
                ;;
            *)
                echo "Option invalide. Veuillez réessayer."
                ;;
        esac
        
        echo ""
        read -p "Appuyez sur Entrée pour continuer..."
    done
}

installer_mettre_a_jour_firefox() {
    echo "======================================="
    echo "Installer/Mettre à jour Firefox"
    echo "======================================="
    
    local version_actuelle=""
    if [ -d "/Applications/Firefox.app" ]; then
        version_actuelle=$(defaults read /Applications/Firefox.app/Contents/Info.plist CFBundleShortVersionString 2>/dev/null || echo "Inconnue")
        echo "Version actuelle de Firefox : $version_actuelle"
    else
        echo "Firefox n'est pas actuellement installé"
    fi
    
    echo ""
    echo "Options d'installation :"
    echo "1. Installer/Mettre à jour vers la dernière version stable"
    echo "2. Installer/Mettre à jour vers la dernière version beta"
    echo "3. Annuler"
    echo ""
    read -p "Sélectionnez l'option d'installation (1-3) : " choix_installation
    
    case $choix_installation in
        1)
            installer_version_firefox "release"
            ;;
        2)
            installer_version_firefox "beta"
            ;;
        3)
            echo "Installation annulée."
            ;;
        *)
            echo "Option invalide."
            ;;
    esac
}

installer_version_firefox() {
    local canal="$1"
    local repertoire_telechargement="/tmp/macfleet_firefox_entreprise"
    
    echo "Installation de Firefox version $canal..."
    
    # Créer le répertoire de téléchargement
    mkdir -p "$repertoire_telechargement"
    
    # Déterminer l'URL de téléchargement basée sur le canal
    local firefox_url
    case $canal in
        "release")
            firefox_url="https://download.mozilla.org/?product=firefox-latest&os=osx&lang=$LANGUE_FIREFOX"
            ;;
        "beta")
            firefox_url="https://download.mozilla.org/?product=firefox-beta-latest&os=osx&lang=$LANGUE_FIREFOX"
            ;;
        *)
            echo "Erreur : Canal Firefox invalide"
            return 1
            ;;
    esac
    
    echo "Téléchargement de Firefox $canal..."
    local firefox_dmg="$repertoire_telechargement/Firefox-$canal.dmg"
    
    if curl -L --progress-bar -o "$firefox_dmg" "$firefox_url"; then
        echo "Téléchargement terminé avec succès"
        echo "[$timestamp] Téléchargement Firefox $canal terminé" >> "$fichier_log"
    else
        echo "Erreur : Échec du téléchargement"
        echo "[$timestamp] Échec du téléchargement Firefox $canal" >> "$fichier_log"
        return 1
    fi
    
    # Installer Firefox
    echo "Installation de Firefox..."
    local point_montage="/tmp/firefox_${canal}_mount"
    mkdir -p "$point_montage"
    
    if hdiutil attach "$firefox_dmg" -mountpoint "$point_montage" -quiet; then
        # Supprimer l'installation existante
        if [ -d "/Applications/Firefox.app" ]; then
            rm -rf "/Applications/Firefox.app"
        fi
        
        # Copier la nouvelle installation
        if cp -R "$point_montage/Firefox.app" "/Applications/"; then
            echo "Firefox $canal installé avec succès"
            echo "[$timestamp] Firefox $canal installé avec succès" >> "$fichier_log"
            
            # Appliquer les politiques d'entreprise si activées
            if [ "$ACTIVER_POLITIQUES_ENTREPRISE" = "true" ]; then
                appliquer_politiques_entreprise
            fi
        else
            echo "Erreur : Échec de l'installation"
            echo "[$timestamp] Échec de l'installation Firefox $canal" >> "$fichier_log"
        fi
        
        hdiutil detach "$point_montage" -quiet
    else
        echo "Erreur : Échec du montage de l'image disque"
        echo "[$timestamp] Échec du montage de l'image disque Firefox $canal" >> "$fichier_log"
    fi
    
    # Nettoyage
    rm -rf "$repertoire_telechargement"
}

configurer_politiques_entreprise() {
    echo "======================================="
    echo "Configurer les politiques d'entreprise"
    echo "======================================="
    
    local repertoire_politiques="/Applications/Firefox.app/Contents/Resources/distribution"
    local fichier_politiques="$repertoire_politiques/policies.json"
    
    echo "Création de la configuration des politiques d'entreprise..."
    
    # Créer le répertoire de distribution
    mkdir -p "$repertoire_politiques"
    
    # Générer policies.json
    cat > "$fichier_politiques" << EOF
{
  "policies": {
    "DisableTelemetry": $DESACTIVER_TELEMETRIE,
    "DisableFirefoxStudies": $DESACTIVER_ETUDES,
    "BlockAboutConfig": $BLOQUER_ABOUT_CONFIG,
    "Homepage": {
      "URL": "$URL_PAGE_ACCUEIL",
      "Locked": true
    },
    "DisableSystemAddonUpdate": true,
    "DisableAppUpdate": $([ "$MISE_A_JOUR_AUTO_ACTIVEE" = "true" ] && echo "false" || echo "true"),
    "NoDefaultBookmarks": true,
    "OfferToSaveLogins": false,
    "PasswordManagerEnabled": false,
    "DisableDeveloperTools": $DESACTIVER_OUTILS_DEVELOPPEUR,
    "DisablePrivateBrowsing": false,
    "DisableProfileImport": true,
    "DisableFeedbackCommands": true,
    "DisableFirefoxAccounts": false,
    "DisableForgetButton": true,
    "DisablePocket": true,
    "DisableSetDesktopBackground": true,
    "DisplayBookmarksToolbar": false,
    "DontCheckDefaultBrowser": true,
    "EnableTrackingProtection": {
      "Value": true,
      "Locked": true
    }
  }
}
EOF
    
    echo "Configuration des politiques d'entreprise créée"
    echo "[$timestamp] Politiques d'entreprise configurées" >> "$fichier_log"
    
    # Définir les permissions appropriées
    chmod 644 "$fichier_politiques"
    
    echo "Politiques d'entreprise appliquées à l'installation Firefox"
}

appliquer_politiques_entreprise() {
    echo "Application des politiques d'entreprise..."
    configurer_politiques_entreprise
}

verifier_statut_firefox() {
    echo "======================================="
    echo "Rapport de statut Firefox"
    echo "======================================="
    
    local nom_appareil=$(scutil --get ComputerName)
    local version_os=$(sw_vers -productVersion)
    
    echo "Appareil : $nom_appareil"
    echo "Version macOS : $version_os"
    echo "Horodatage : $(date)"
    echo ""
    
    if [ -d "/Applications/Firefox.app" ]; then
        local version_firefox=$(defaults read /Applications/Firefox.app/Contents/Info.plist CFBundleShortVersionString 2>/dev/null || echo "Inconnue")
        local bundle_id=$(defaults read /Applications/Firefox.app/Contents/Info.plist CFBundleIdentifier 2>/dev/null || echo "Inconnu")
        
        echo "Statut Firefox : INSTALLÉ"
        echo "Version : $version_firefox"
        echo "Bundle ID : $bundle_id"
        echo "Chemin d'installation : /Applications/Firefox.app"
        
        # Vérifier si Firefox est en cours d'exécution
        if pgrep -x "firefox" >/dev/null; then
            echo "Statut du processus : EN COURS D'EXÉCUTION"
        else
            echo "Statut du processus : NON EN COURS D'EXÉCUTION"
        fi
        
        # Vérifier les politiques d'entreprise
        local fichier_politiques="/Applications/Firefox.app/Contents/Resources/distribution/policies.json"
        if [ -f "$fichier_politiques" ]; then
            echo "Politiques d'entreprise : CONFIGURÉES"
        else
            echo "Politiques d'entreprise : NON CONFIGURÉES"
        fi
        
    else
        echo "Statut Firefox : NON INSTALLÉ"
    fi
}

generer_rapport_deploiement() {
    echo "======================================="
    echo "Générer un rapport de déploiement"
    echo "======================================="
    
    local fichier_rapport="/tmp/firefox_rapport_deploiement_$(date +%Y%m%d_%H%M%S).txt"
    
    cat > "$fichier_rapport" << EOF
Rapport de déploiement Firefox MacFleet
Généré : $(date)
Organisation : $NOM_ORGANISATION

Informations sur l'appareil :
  Nom de l'ordinateur : $(scutil --get ComputerName)
  Version macOS : $(sw_vers -productVersion)
  Modèle matériel : $(system_profiler SPHardwareDataType | grep "Model Name" | cut -d: -f2 | xargs)

Installation Firefox :
EOF
    
    if [ -d "/Applications/Firefox.app" ]; then
        local version_firefox=$(defaults read /Applications/Firefox.app/Contents/Info.plist CFBundleShortVersionString 2>/dev/null || echo "Inconnue")
        
        echo "  Statut : Installé" >> "$fichier_rapport"
        echo "  Version : $version_firefox" >> "$fichier_rapport"
        echo "  Date d'installation : $(stat -f "%Sm" /Applications/Firefox.app)" >> "$fichier_rapport"
        
        # Vérifier les politiques d'entreprise
        local fichier_politiques="/Applications/Firefox.app/Contents/Resources/distribution/policies.json"
        if [ -f "$fichier_politiques" ]; then
            echo "  Politiques d'entreprise : Configurées" >> "$fichier_rapport"
        else
            echo "  Politiques d'entreprise : Non configurées" >> "$fichier_rapport"
        fi
    else
        echo "  Statut : Non installé" >> "$fichier_rapport"
    fi
    
    cat >> "$fichier_rapport" << EOF

Configuration :
  Langue : $LANGUE_FIREFOX
  Canal : $CANAL_FIREFOX
  Mise à jour automatique : $MISE_A_JOUR_AUTO_ACTIVEE
  Politiques d'entreprise : $ACTIVER_POLITIQUES_ENTREPRISE

Contact : $CONTACT_IT
EOF
    
    echo "Rapport de déploiement généré : $fichier_rapport"
}

voir_configuration() {
    echo "======================================="
    echo "Configuration actuelle"
    echo "======================================="
    
    if [ -f "/etc/macfleet/firefox_config.conf" ]; then
        cat "/etc/macfleet/firefox_config.conf"
    else
        echo "Aucun fichier de configuration trouvé."
    fi
}

# Exécuter le gestionnaire d'entreprise
gestionnaire_firefox_entreprise

Système de mise à jour automatisé

Mise à jour automatique de Firefox

#!/bin/bash

# Système de mise à jour automatique de Firefox
# Utilisation : ./mise_a_jour_firefox_automatique.sh

mise_a_jour_firefox_automatique() {
    local fichier_config="/etc/macfleet/firefox_mise_a_jour_auto.conf"
    local fichier_log="/var/log/macfleet_firefox_mises_a_jour.log"
    local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
    
    # Vérifier si s'exécute en tant que root
    if [ "$EUID" -ne 0 ]; then
        echo "Erreur : Ce script doit être exécuté en tant que root"
        exit 1
    fi
    
    # Créer la configuration si elle n'existe pas
    if [ ! -f "$fichier_config" ]; then
        creer_config_mise_a_jour
    fi
    
    source "$fichier_config"
    
    echo "[$timestamp] Mise à jour automatique de Firefox démarrée" >> "$fichier_log"
    
    # Vérifier si les mises à jour sont activées
    if [ "$ACTIVER_MISES_A_JOUR_AUTO" = "true" ]; then
        verifier_et_mettre_a_jour_firefox
    else
        echo "Les mises à jour automatiques sont désactivées"
        echo "[$timestamp] Les mises à jour automatiques sont désactivées" >> "$fichier_log"
    fi
}

creer_config_mise_a_jour() {
    mkdir -p /etc/macfleet
    
    cat > "/etc/macfleet/firefox_mise_a_jour_auto.conf" << 'EOF'
# Configuration de mise à jour automatique Firefox MacFleet

# Paramètres de mise à jour
ACTIVER_MISES_A_JOUR_AUTO="true"
CANAL_MISE_A_JOUR="release"
INTERVALLE_VERIFICATION="quotidien"
HEURE_MISE_A_JOUR="02:00"

# Paramètres de sécurité
SAUVEGARDER_PROFILS="true"
RETENTION_SAUVEGARDE_JOURS="7"
NECESSITER_CONSENTEMENT_UTILISATEUR="false"
IGNORER_SI_EN_COURS="true"

# Paramètres de notification
ENVOYER_NOTIFICATIONS="true"
EMAIL_NOTIFICATION="admin@macfleet.com"
NOTIFIER_SUCCES="true"
NOTIFIER_ECHEC="true"

# Paramètres d'entreprise
MAINTENIR_POLITIQUES="true"
PRESERVER_PERSONNALISATIONS="true"
VERIFIER_INSTALLATION="true"
EOF
    
    echo "Configuration de mise à jour automatique créée à /etc/macfleet/firefox_mise_a_jour_auto.conf"
}

verifier_et_mettre_a_jour_firefox() {
    echo "[$timestamp] Vérification des mises à jour Firefox" >> "$fichier_log"
    
    # Vérifier si Firefox est installé
    if [ ! -d "/Applications/Firefox.app" ]; then
        echo "Firefox n'est pas installé. Installation de la dernière version..."
        installer_firefox_derniere_version
        return
    fi
    
    # Obtenir la version actuelle
    local version_actuelle=$(defaults read /Applications/Firefox.app/Contents/Info.plist CFBundleShortVersionString 2>/dev/null || echo "Inconnue")
    
    # Vérifier si Firefox est en cours d'exécution et ignorer si configuré
    if [ "$IGNORER_SI_EN_COURS" = "true" ] && pgrep -x "firefox" >/dev/null; then
        echo "Firefox est actuellement en cours d'exécution. Mise à jour ignorée."
        echo "[$timestamp] Firefox en cours d'exécution - mise à jour ignorée" >> "$fichier_log"
        return
    fi
    
    # Créer une sauvegarde si activé
    if [ "$SAUVEGARDER_PROFILS" = "true" ]; then
        sauvegarder_profils_firefox
    fi
    
    # Télécharger et vérifier la dernière version
    local repertoire_telechargement="/tmp/macfleet_firefox_mise_a_jour"
    mkdir -p "$repertoire_telechargement"
    
    local firefox_url="https://download.mozilla.org/?product=firefox-latest&os=osx&lang=fr"
    local firefox_dmg="$repertoire_telechargement/Firefox-derniere.dmg"
    
    echo "Téléchargement de la dernière version de Firefox pour comparaison..."
    if curl -L -s -o "$firefox_dmg" "$firefox_url"; then
        # Monter et vérifier la version
        local point_montage="/tmp/firefox_mise_a_jour_mount"
        mkdir -p "$point_montage"
        
        if hdiutil attach "$firefox_dmg" -mountpoint "$point_montage" -quiet; then
            local derniere_version=$(defaults read "$point_montage/Firefox.app/Contents/Info.plist" CFBundleShortVersionString 2>/dev/null || echo "Inconnue")
            
            echo "Version actuelle : $version_actuelle"
            echo "Dernière version : $derniere_version"
            
            if [ "$version_actuelle" != "$derniere_version" ]; then
                echo "Mise à jour disponible. Mise à jour de Firefox..."
                echo "[$timestamp] Mise à jour disponible - Actuelle : $version_actuelle, Dernière : $derniere_version" >> "$fichier_log"
                
                # Effectuer la mise à jour
                mettre_a_jour_installation_firefox "$point_montage"
                
                # Vérifier la mise à jour
                if verifier_mise_a_jour_firefox "$derniere_version"; then
                    echo "Firefox mis à jour avec succès vers la version $derniere_version"
                    echo "[$timestamp] Firefox mis à jour avec succès vers la version $derniere_version" >> "$fichier_log"
                    
                    if [ "$ENVOYER_NOTIFICATIONS" = "true" ] && [ "$NOTIFIER_SUCCES" = "true" ]; then
                        envoyer_notification_mise_a_jour "succes" "$version_actuelle" "$derniere_version"
                    fi
                else
                    echo "Échec de la vérification de la mise à jour Firefox"
                    echo "[$timestamp] Échec de la vérification de la mise à jour Firefox" >> "$fichier_log"
                    
                    if [ "$ENVOYER_NOTIFICATIONS" = "true" ] && [ "$NOTIFIER_ECHEC" = "true" ]; then
                        envoyer_notification_mise_a_jour "echec" "$version_actuelle" "$derniere_version"
                    fi
                fi
            else
                echo "Firefox est déjà à jour (version $version_actuelle)"
                echo "[$timestamp] Firefox est déjà à jour (version $version_actuelle)" >> "$fichier_log"
            fi
            
            hdiutil detach "$point_montage" -quiet
        else
            echo "Échec du montage de l'image disque Firefox"
            echo "[$timestamp] Échec du montage de l'image disque Firefox pour vérification de mise à jour" >> "$fichier_log"
        fi
    else
        echo "Échec du téléchargement de Firefox pour vérification de version"
        echo "[$timestamp] Échec du téléchargement de Firefox pour vérification de version" >> "$fichier_log"
    fi
    
    # Nettoyage
    rm -rf "$repertoire_telechargement"
}

installer_firefox_derniere_version() {
    echo "Installation de la dernière version de Firefox..."
    
    local repertoire_telechargement="/tmp/macfleet_firefox_installation"
    mkdir -p "$repertoire_telechargement"
    
    local firefox_url="https://download.mozilla.org/?product=firefox-latest&os=osx&lang=fr"
    local firefox_dmg="$repertoire_telechargement/Firefox.dmg"
    
    if curl -L --progress-bar -o "$firefox_dmg" "$firefox_url"; then
        local point_montage="/tmp/firefox_installation_mount"
        mkdir -p "$point_montage"
        
        if hdiutil attach "$firefox_dmg" -mountpoint "$point_montage" -quiet; then
            if cp -R "$point_montage/Firefox.app" "/Applications/"; then
                local version_installee=$(defaults read /Applications/Firefox.app/Contents/Info.plist CFBundleShortVersionString 2>/dev/null || echo "Inconnue")
                echo "Firefox installé avec succès (version $version_installee)"
                echo "[$timestamp] Firefox installé avec succès (version $version_installee)" >> "$fichier_log"
                
                # Appliquer les politiques d'entreprise si nécessaire
                if [ "$MAINTENIR_POLITIQUES" = "true" ]; then
                    appliquer_politiques_entreprise
                fi
            else
                echo "Échec de l'installation de Firefox"
                echo "[$timestamp] Échec de l'installation de Firefox" >> "$fichier_log"
            fi
            
            hdiutil detach "$point_montage" -quiet
        else
            echo "Échec du montage de l'image disque Firefox"
            echo "[$timestamp] Échec du montage de l'image disque Firefox pour installation" >> "$fichier_log"
        fi
    else
        echo "Échec du téléchargement de Firefox"
        echo "[$timestamp] Échec du téléchargement de Firefox pour installation" >> "$fichier_log"
    fi
    
    rm -rf "$repertoire_telechargement"
}

mettre_a_jour_installation_firefox() {
    local point_montage="$1"
    
    echo "Mise à jour de l'installation Firefox..."
    
    # Supprimer l'ancienne installation
    if [ -d "/Applications/Firefox.app" ]; then
        rm -rf "/Applications/Firefox.app"
    fi
    
    # Installer la nouvelle version
    if cp -R "$point_montage/Firefox.app" "/Applications/"; then
        echo "Application Firefox mise à jour avec succès"
        
        # Restaurer les politiques d'entreprise si activé
        if [ "$MAINTENIR_POLITIQUES" = "true" ]; then
            appliquer_politiques_entreprise
        fi
        
        return 0
    else
        echo "Échec de la mise à jour de l'application Firefox"
        return 1
    fi
}

verifier_mise_a_jour_firefox() {
    local version_attendue="$1"
    
    if [ -d "/Applications/Firefox.app" ]; then
        local version_reelle=$(defaults read /Applications/Firefox.app/Contents/Info.plist CFBundleShortVersionString 2>/dev/null || echo "Inconnue")
        
        if [ "$version_reelle" = "$version_attendue" ]; then
            return 0
        else
            echo "Discordance de version - Attendue : $version_attendue, Réelle : $version_reelle"
            return 1
        fi
    else
        echo "Application Firefox non trouvée après mise à jour"
        return 1
    fi
}

sauvegarder_profils_firefox() {
    echo "Création d'une sauvegarde des profils Firefox..."
    
    local repertoire_profils="$HOME/Library/Application Support/Firefox"
    local repertoire_sauvegarde="/var/backups/macfleet/firefox_profils"
    local timestamp_sauvegarde=$(date +%Y%m%d_%H%M%S)
    
    mkdir -p "$repertoire_sauvegarde"
    
    if [ -d "$repertoire_profils" ]; then
        if tar -czf "$repertoire_sauvegarde/firefox_profils_sauvegarde_$timestamp_sauvegarde.tar.gz" -C "$HOME/Library/Application Support" "Firefox"; then
            echo "Profils Firefox sauvegardés avec succès"
            echo "[$timestamp] Profils Firefox sauvegardés" >> "$fichier_log"
            
            # Nettoyer les anciennes sauvegardes
            find "$repertoire_sauvegarde" -name "firefox_profils_sauvegarde_*.tar.gz" -mtime +$RETENTION_SAUVEGARDE_JOURS -delete
        else
            echo "Échec de la sauvegarde des profils Firefox"
            echo "[$timestamp] Échec de la sauvegarde des profils Firefox" >> "$fichier_log"
        fi
    else
        echo "Répertoire des profils Firefox non trouvé"
    fi
}

envoyer_notification_mise_a_jour() {
    local statut="$1"
    local ancienne_version="$2"
    local nouvelle_version="$3"
    
    local titre_notification="Mise à jour Firefox MacFleet"
    local message_notification
    
    case $statut in
        "succes")
            message_notification="Firefox mis à jour avec succès de $ancienne_version vers $nouvelle_version"
            ;;
        "echec")
            message_notification="Échec de la mise à jour Firefox - tentative de mise à jour de $ancienne_version vers $nouvelle_version"
            ;;
        *)
            message_notification="Statut de mise à jour Firefox : $statut"
            ;;
    esac
    
    # Utiliser osascript pour afficher la notification
    osascript -e "display notification \"$message_notification\" with title \"$titre_notification\""
    
    echo "[$timestamp] Notification de mise à jour envoyée - Statut : $statut" >> "$fichier_log"
}

appliquer_politiques_entreprise() {
    echo "Application des politiques d'entreprise..."
    # Cela appellerait la fonction de configuration des politiques d'entreprise
}

# Exécuter la mise à jour automatique
mise_a_jour_firefox_automatique

Dépannage et bonnes pratiques

Problèmes courants et solutions

  1. Connectivité réseau : S'assurer d'une connexion internet stable pour les téléchargements
  2. Permissions : Exécuter les scripts d'installation avec les privilèges appropriés
  3. Espace disque : Vérifier l'espace disque suffisant avant l'installation
  4. Processus existants : Vérifier les processus Firefox en cours avant les mises à jour
  5. Politiques d'entreprise : Valider les configurations de politiques après déploiement

Bonnes pratiques

  • Tester les déploiements : Toujours tester dans des environnements contrôlés d'abord
  • Sauvegarder les profils : Créer des sauvegardes avant les mises à jour majeures
  • Surveiller les installations : Utiliser la journalisation et la surveillance pour les déploiements d'entreprise
  • Contrôle de version : Suivre les versions de Firefox dans votre flotte
  • Mises à jour de sécurité : Prioriser les mises à jour et correctifs de sécurité

Conclusion

Le déploiement et la gestion de Firefox sur macOS nécessitent une planification et une exécution minutieuses. Ces scripts fournissent des solutions complètes pour installer, mettre à jour et gérer Firefox à travers les flottes Mac. Des installations de base à l'automatisation de niveau entreprise, ces outils assurent des déploiements Firefox cohérents et sécurisés tout en maintenant les politiques organisationnelles et les préférences utilisateur.

Guide

Nouvelles mises à jour et améliorations de Macfleet.

Gestion de Réseau Wi-Fi sur macOS

Déployez et gérez des configurations réseau Wi-Fi complètes sur vos appareils MacFleet. Ce tutoriel couvre la gestion de politiques réseau, configurations de sécurité, paramètres proxy, gestion DNS et stratégies de déploiement de niveau entreprise.

Comprendre la Gestion Réseau macOS

macOS fournit des outils de ligne de commande puissants pour la gestion réseau :

  • networksetup - Outil principal pour la configuration réseau
  • airport - Scan et gestion Wi-Fi avancés
  • scutil - Utilitaire de configuration système pour les paramètres réseau
  • Profils réseau - Gestion réseau basée sur les politiques d'entreprise

Opérations Wi-Fi Basiques

Activer/Désactiver l'Interface Wi-Fi

#!/bin/bash

# Activer l'interface Wi-Fi
enable_wifi() {
    echo "Activation de l'interface Wi-Fi..."
    networksetup -setairportpower en0 on
    
    if [[ $? -eq 0 ]]; then
        echo "✅ Interface Wi-Fi activée avec succès"
        return 0
    else
        echo "❌ Échec de l'activation de l'interface Wi-Fi"
        return 1
    fi
}

# Désactiver l'interface Wi-Fi
disable_wifi() {
    echo "⚠️  Désactivation de l'interface Wi-Fi..."
    echo "Assurez-vous que l'appareil a une connectivité alternative (Ethernet, etc.)"
    
    networksetup -setairportpower en0 off
    
    if [[ $? -eq 0 ]]; then
        echo "✅ Interface Wi-Fi désactivée avec succès"
        return 0
    else
        echo "❌ Échec de la désactivation de l'interface Wi-Fi"
        return 1
    fi
}

# Utilisation
enable_wifi

Activer/Désactiver le Service Wi-Fi

#!/bin/bash

# Activer le service Wi-Fi
turn_wifi_on() {
    echo "Activation du service Wi-Fi..."
    networksetup -setnetworkserviceenabled Wi-Fi on
    
    if [[ $? -eq 0 ]]; then
        echo "✅ Service Wi-Fi activé"
        return 0
    else
        echo "❌ Échec de l'activation du service Wi-Fi"
        return 1
    fi
}

# Vérifier le statut du service Wi-Fi
check_wifi_service() {
    echo "Vérification du statut du service Wi-Fi..."
    local status
    status=$(networksetup -getnetworkserviceenabled Wi-Fi)
    
    echo "Statut du service Wi-Fi : $status"
    return 0
}

# Utilisation
check_wifi_service
turn_wifi_on

Informations Réseau Wi-Fi

Obtenir les Informations Réseau Actuelles

#!/bin/bash

# Obtenir le SSID du réseau Wi-Fi actuel
get_current_network() {
    echo "=== Réseau Wi-Fi Actuel ==="
    local network_info
    network_info=$(networksetup -getairportnetwork en0)
    
    if [[ "$network_info" == *"not associated"* ]]; then
        echo "❌ Non connecté à un réseau Wi-Fi"
        return 1
    else
        echo "📶 $network_info"
        return 0
    fi
}

# Obtenir des informations Wi-Fi complètes
get_wifi_info() {
    echo "=== Informations Réseau Wi-Fi ==="
    networksetup -getinfo Wi-Fi
    
    echo -e "\n=== Détails de l'Interface Wi-Fi ==="
    ifconfig en0 | grep -E "(inet |ether |status)"
    
    echo -e "\n=== Qualité Wi-Fi ==="
    /System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -I
}

# Scanner les réseaux disponibles
scan_networks() {
    echo "=== Réseaux Wi-Fi Disponibles ==="
    /System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -s
}

# Utilisation
get_current_network
echo ""
get_wifi_info

Système de Gestion Wi-Fi d'Entreprise

#!/bin/bash

# Système de Gestion Wi-Fi d'Entreprise MacFleet
# Configuration Wi-Fi centralisée et gestion de politiques pour appareils de flotte

# Configuration
LOG_FILE="/var/log/macfleet_wifi.log"
CONFIG_DIR="/etc/macfleet/wifi"
PROFILES_DIR="$CONFIG_DIR/profiles"
BACKUP_DIR="/var/backups/network_configs"

# Modèles de profils réseau
declare -A NETWORK_PROFILES=(
    ["entreprise"]="security=WPA2Enterprise,proxy=auto,dns=entreprise"
    ["invite"]="security=WPA2Personal,proxy=none,dns=public"
    ["securise"]="security=WPA2Enterprise,proxy=obligatoire,dns=securise"
    ["developpement"]="security=WPA2Personal,proxy=bypass,dns=dev"
    ["public"]="security=none,proxy=auto,dns=public"
)

# Configurations serveurs DNS
declare -A DNS_CONFIGS=(
    ["entreprise"]="10.0.1.1 10.0.1.2"
    ["public"]="8.8.8.8 8.8.4.4"
    ["securise"]="1.1.1.1 1.0.0.1"
    ["dev"]="192.168.1.1 8.8.8.8"
)

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

# Configurer les serveurs DNS
configure_dns() {
    local dns_profile="$1"
    local custom_dns="$2"
    
    log_action "Configuration des serveurs DNS : $dns_profile"
    
    local dns_servers
    if [[ -n "$custom_dns" ]]; then
        dns_servers="$custom_dns"
    else
        dns_servers="${DNS_CONFIGS[$dns_profile]}"
    fi
    
    if [[ -z "$dns_servers" ]]; then
        log_action "❌ Profil DNS inconnu ou configuration vide : $dns_profile"
        return 1
    fi
    
    # Configurer les serveurs DNS
    if networksetup -setdnsservers Wi-Fi $dns_servers; then
        log_action "✅ Serveurs DNS configurés : $dns_servers"
        
        # Vérifier la configuration
        local current_dns
        current_dns=$(networksetup -getdnsservers Wi-Fi)
        log_action "Serveurs DNS actuels : $current_dns"
        
        return 0
    else
        log_action "❌ Échec de la configuration des serveurs DNS"
        return 1
    fi
}

# Configurer les domaines de recherche
configure_search_domains() {
    local domains="$*"
    
    if [[ -z "$domains" ]]; then
        log_action "Effacement des domaines de recherche"
        networksetup -setsearchdomains Wi-Fi "Empty"
    else
        log_action "Configuration des domaines de recherche : $domains"
        networksetup -setsearchdomains Wi-Fi $domains
    fi
    
    if [[ $? -eq 0 ]]; then
        log_action "✅ Domaines de recherche configurés avec succès"
        return 0
    else
        log_action "❌ Échec de la configuration des domaines de recherche"
        return 1
    fi
}

# Configurer le proxy web
configure_web_proxy() {
    local proxy_type="$1"
    local proxy_config="$2"
    
    log_action "Configuration du proxy web : $proxy_type"
    
    case "$proxy_type" in
        "none")
            # Désactiver tous les proxies
            networksetup -setwebproxystate Wi-Fi off
            networksetup -setsecurewebproxystate Wi-Fi off
            networksetup -setautoproxystate Wi-Fi off
            log_action "✅ Tous les proxies désactivés"
            ;;
        "web")
            local proxy_server proxy_port auth_required username password
            IFS=':' read -ra PROXY_PARTS <<< "$proxy_config"
            proxy_server="${PROXY_PARTS[0]}"
            proxy_port="${PROXY_PARTS[1]}"
            auth_required="${PROXY_PARTS[2]}"
            username="${PROXY_PARTS[3]:-}"
            password="${PROXY_PARTS[4]:-}"
            
            if [[ "$auth_required" == "authenticated" && -n "$username" && -n "$password" ]]; then
                networksetup -setwebproxy Wi-Fi "$proxy_server" "$proxy_port" on "$username" "$password"
            else
                networksetup -setwebproxy Wi-Fi "$proxy_server" "$proxy_port" off
            fi
            
            networksetup -setwebproxystate Wi-Fi on
            log_action "✅ Proxy web configuré : $proxy_server:$proxy_port"
            ;;
        "auto")
            networksetup -setautoproxyurl Wi-Fi "$proxy_config"
            networksetup -setautoproxystate Wi-Fi on
            log_action "✅ Proxy automatique configuré : $proxy_config"
            ;;
        *)
            log_action "❌ Type de proxy inconnu : $proxy_type"
            return 1
            ;;
    esac
    
    return 0
}

# Sauvegarder la configuration réseau actuelle
backup_network_config() {
    local backup_timestamp
    backup_timestamp=$(date '+%Y%m%d_%H%M%S')
    local backup_file="$BACKUP_DIR/network_config_$backup_timestamp.tar.gz"
    
    log_action "Création de la sauvegarde de configuration réseau : $backup_file"
    
    # Créer un répertoire de sauvegarde temporaire
    local temp_backup="/tmp/network_backup_$$"
    mkdir -p "$temp_backup"
    
    # Exporter les paramètres actuels
    {
        echo "# Statut du Service Wi-Fi"
        networksetup -getnetworkserviceenabled Wi-Fi
        
        echo -e "\n# Statut d'Alimentation Wi-Fi"
        networksetup -getairportpower en0
        
        echo -e "\n# Réseau Actuel"
        networksetup -getairportnetwork en0
        
        echo -e "\n# Informations Réseau"
        networksetup -getinfo Wi-Fi
        
        echo -e "\n# Serveurs DNS"
        networksetup -getdnsservers Wi-Fi
        
        echo -e "\n# Domaines de Recherche"
        networksetup -getsearchdomains Wi-Fi
        
        echo -e "\n# Proxy Web"
        networksetup -getwebproxy Wi-Fi
        
    } > "$temp_backup/current_config.txt"
    
    # Créer une sauvegarde compressée
    if tar -czf "$backup_file" -C "$(dirname "$temp_backup")" "$(basename "$temp_backup")" 2>/dev/null; then
        log_action "✅ Sauvegarde réseau créée : $backup_file"
        rm -rf "$temp_backup"
        echo "$backup_file"
        return 0
    else
        log_action "❌ Échec de la sauvegarde réseau"
        rm -rf "$temp_backup"
        return 1
    fi
}

# Diagnostics réseau
network_diagnostics() {
    echo "=== Diagnostics Réseau MacFleet ==="
    echo "Horodatage : $(date)"
    echo "Nom d'hôte : $(hostname)"
    echo "======================================="
    
    # Statut de l'interface Wi-Fi
    echo -e "\n🔍 Statut de l'Interface Wi-Fi :"
    local wifi_power
    wifi_power=$(networksetup -getairportpower en0)
    echo "Alimentation : $wifi_power"
    
    local wifi_service
    wifi_service=$(networksetup -getnetworkserviceenabled Wi-Fi)
    echo "Service : $wifi_service"
    
    # Connexion actuelle
    echo -e "\n📶 Connexion Actuelle :"
    networksetup -getairportnetwork en0
    
    # Configuration réseau
    echo -e "\n⚙️  Configuration Réseau :"
    networksetup -getinfo Wi-Fi
    
    # Paramètres DNS
    echo -e "\n🌐 Paramètres DNS :"
    networksetup -getdnsservers Wi-Fi
    
    # Test de connectivité
    echo -e "\n🌍 Test de Connectivité :"
    if ping -c 3 8.8.8.8 >/dev/null 2>&1; then
        echo "✅ Connectivité Internet : Disponible"
    else
        echo "❌ Connectivité Internet : Échec"
    fi
    
    if ping -c 3 apple.com >/dev/null 2>&1; then
        echo "✅ Résolution DNS : Fonctionne"
    else
        echo "❌ Résolution DNS : Échec"
    fi
}

# Fonction d'exécution principale
main() {
    local action="${1:-status}"
    local profile_name="$2"
    local additional_param="$3"
    
    log_action "=== Démarrage de la Gestion Wi-Fi MacFleet ==="
    log_action "Action : $action"
    log_action "Profil : ${profile_name:-N/A}"
    
    case "$action" in
        "status")
            network_diagnostics
            ;;
        "dns")
            if [[ -z "$profile_name" ]]; then
                echo "Profils DNS disponibles : ${!DNS_CONFIGS[*]}"
                echo "Usage : $0 dns <nom_profil|serveurs_personnalisés>"
                exit 1
            fi
            configure_dns "$profile_name" "$additional_param"
            ;;
        "proxy")
            if [[ -z "$profile_name" ]]; then
                echo "Usage : $0 proxy <none|web|auto> [config]"
                exit 1
            fi
            configure_web_proxy "$profile_name" "$additional_param"
            ;;
        "backup")
            backup_network_config
            ;;
        *)
            echo "Usage : $0 {status|dns|proxy|backup}"
            echo "  status  - Afficher le statut et diagnostics réseau"
            echo "  dns     - Configurer les serveurs DNS"
            echo "  proxy   - Configurer les paramètres proxy"
            echo "  backup  - Sauvegarder la configuration réseau actuelle"
            exit 1
            ;;
    esac
    
    log_action "=== Gestion Wi-Fi terminée ==="
}

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

Configuration Réseau Avancée

Gestion de Profils Wi-Fi d'Entreprise

#!/bin/bash

# Créer un profil réseau personnalisé
create_network_profile() {
    local profile_name="$1"
    local ssid="$2"
    local security_type="$3"
    local proxy_config="$4"
    local dns_config="$5"
    
    local profile_file="$PROFILES_DIR/${profile_name}.json"
    
    cat > "$profile_file" << EOF
{
    "profile_name": "$profile_name",
    "created_date": "$(date -Iseconds)",
    "wifi_settings": {
        "ssid": "$ssid",
        "security_type": "$security_type",
        "auto_connect": true,
        "priority": 100
    },
    "proxy_settings": {
        "type": "$proxy_config",
        "bypass_domains": ["*.local", "localhost"]
    },
    "dns_settings": {
        "servers": "$dns_config",
        "search_domains": ["company.com", "local"]
    }
}
EOF

    echo "Profil réseau créé : $profile_file"
}

Surveillance de Qualité Réseau

#!/bin/bash

# Surveiller la qualité et performance réseau
monitor_network_quality() {
    local duration="${1:-60}"  # durée de surveillance en secondes
    local interval="${2:-5}"   # intervalle de vérification en secondes
    
    echo "=== Surveillance de Qualité Réseau ==="
    echo "Durée : ${duration}s, Intervalle : ${interval}s"
    
    local start_time end_time
    start_time=$(date +%s)
    end_time=$((start_time + duration))
    
    while [[ $(date +%s) -lt $end_time ]]; do
        local timestamp signal_strength tx_rate
        timestamp=$(date '+%H:%M:%S')
        
        # Obtenir les métriques Wi-Fi
        local airport_info
        airport_info=$(/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -I)
        
        signal_strength=$(echo "$airport_info" | grep 'RSSI:' | awk '{print $2}')
        tx_rate=$(echo "$airport_info" | grep 'lastTxRate:' | awk '{print $2}')
        
        # Tester la vitesse de connectivité
        local ping_time
        ping_time=$(ping -c 1 8.8.8.8 2>/dev/null | grep 'time=' | awk -F'time=' '{print $2}' | awk '{print $1}')
        
        printf "%s | Signal: %sdBm | Vitesse: %sMbps | Ping: %s\n" \
               "$timestamp" "$signal_strength" "$tx_rate" "${ping_time:-timeout}"
        
        sleep "$interval"
    done
}

Sécurité et Conformité

Audit de Sécurité Réseau

#!/bin/bash

# Audit complet de sécurité réseau
network_security_audit() {
    echo "=== Audit de Sécurité Réseau ==="
    log_action "Démarrage de l'audit de sécurité réseau"
    
    # Vérifier le chiffrement Wi-Fi
    local wifi_encryption
    wifi_encryption=$(networksetup -getairportnetwork en0 | grep -o 'WPA\\|WEP\\|None' || echo 'Inconnu')
    echo "Chiffrement Wi-Fi : $wifi_encryption"
    
    # Vérifier le statut du proxy
    local proxy_enabled
    proxy_enabled=$(networksetup -getwebproxystate Wi-Fi)
    echo "Proxy activé : $proxy_enabled"
    
    # Vérifier les serveurs DNS
    local dns_servers
    dns_servers=$(networksetup -getdnsservers Wi-Fi)
    echo "Serveurs DNS : $dns_servers"
    
    # Recommandations de sécurité
    echo -e "\n=== Recommandations de Sécurité ==="
    
    if [[ "$wifi_encryption" == "None" ]]; then
        echo "⚠️  Évitez les réseaux non chiffrés"
    fi
    
    if echo "$dns_servers" | grep -q "There aren't any DNS Servers"; then
        echo "⚠️  Configurez des serveurs DNS sécurisés"
    fi
    
    log_action "✅ Audit de sécurité terminé"
}

Application de Politiques de Conformité

#!/bin/bash

# Appliquer les politiques de conformité d'entreprise
enforce_compliance_policy() {
    local policy_name="$1"
    
    log_action "Application de la politique de conformité : $policy_name"
    
    case "$policy_name" in
        "entreprise")
            # Politique d'entreprise : DNS sécurisé, proxy obligatoire
            configure_dns "entreprise"
            configure_web_proxy "web" "proxy.company.com:8080:authenticated"
            ;;
        "education")
            # Politique éducation : DNS sûr, proxy de filtrage de contenu
            configure_dns "public"
            configure_web_proxy "auto" "http://filter.school.edu/proxy.pac"
            ;;
        "sante")
            # Politique santé : paramètres conformes HIPAA
            configure_dns "securise"
            configure_web_proxy "web" "secure-proxy.hospital.org:8080:authenticated"
            ;;
        *)
            log_action "❌ Politique de conformité inconnue : $policy_name"
            return 1
            ;;
    esac
    
    log_action "✅ Politique de conformité appliquée : $policy_name"
    return 0
}

Dépannage Réseau

Réparation Réseau Automatisée

#!/bin/bash

# Dépannage et réparation réseau automatisés
network_repair() {
    local repair_level="${1:-basic}"
    
    log_action "Démarrage de la réparation réseau : $repair_level"
    
    echo "=== Réparation Réseau MacFleet ==="
    
    # Test de connectivité de base
    echo "🔍 Test de connectivité de base..."
    if ping -c 3 8.8.8.8 >/dev/null 2>&1; then
        echo "✅ Connectivité Internet : OK"
    else
        echo "❌ Connectivité Internet : ÉCHEC"
        
        case "$repair_level" in
            "basic")
                echo "🔧 Tentative de réparation de base..."
                # Redémarrer Wi-Fi
                networksetup -setairportpower en0 off
                sleep 3
                networksetup -setairportpower en0 on
                sleep 5
                ;;
            "avance")
                echo "🔧 Tentative de réparation avancée..."
                # Réinitialisation réseau complète
                configure_dns "public"
                configure_web_proxy "none"
                networksetup -setairportpower en0 off
                sleep 3
                networksetup -setairportpower en0 on
                sleep 10
                ;;
        esac
        
        # Re-tester après réparation
        echo "🔄 Nouveau test de connectivité..."
        if ping -c 3 8.8.8.8 >/dev/null 2>&1; then
            echo "✅ Réparation réussie"
            log_action "Réparation réseau réussie : $repair_level"
        else
            echo "❌ Réparation échouée - escalader vers intervention manuelle"
            log_action "Réparation réseau échouée : $repair_level"
        fi
    fi
}

Meilleures Pratiques

🚀 Optimisation des Performances

  • Surveillez la qualité réseau régulièrement et basculez vers les réseaux optimaux
  • Configurez des tailles MTU appropriées pour votre environnement réseau
  • Utilisez la mise en cache DNS locale pour améliorer les vitesses de résolution
  • Optimisez les paramètres proxy pour votre cas d'usage spécifique

🔐 Directives de Sécurité

  • Utilisez toujours des réseaux chiffrés (WPA2/WPA3) dans les environnements d'entreprise
  • Configurez des serveurs DNS sécurisés pour prévenir l'empoisonnement DNS
  • Implémentez des politiques proxy pour le filtrage de contenu et la sécurité
  • Audits de sécurité réguliers pour identifier les vulnérabilités réseau

📋 Meilleures Pratiques de Gestion

  • Configuration basée sur les profils pour différents groupes d'utilisateurs et emplacements
  • Application de politiques centralisées sur tous les appareils de flotte
  • Sauvegarde régulière des configurations réseau avant les changements
  • Surveillance et alertes automatisées pour les problèmes de connectivité

🔍 Conseils de Dépannage

  • Utilisez les diagnostics réseau pour identifier les problèmes de configuration
  • Surveillez la force du signal et les métriques de qualité réseau
  • Testez la connectivité vers plusieurs points de terminaison pour une validation complète
  • Documentez les changements réseau pour les pistes d'audit et le dépannage

Notes Importantes

  • Les changements réseau prennent effet immédiatement mais peuvent nécessiter une reconnexion
  • Les identifiants d'authentification proxy doivent être gérés de manière sécurisée
  • Les changements DNS peuvent nécessiter un vidage du cache pour prendre effet
  • Certains réseaux d'entreprise nécessitent des certificats spécifiques pour l'authentification
  • Toujours sauvegarder les configurations avant de faire des changements significatifs

Contrôle Wi-Fi d'Entreprise sur macOS

Contrôlez et gérez les paramètres Wi-Fi sur vos appareils MacFleet en utilisant des outils de ligne de commande avancés et des politiques sans fil centralisées. Ce tutoriel couvre la gestion de l'alimentation Wi-Fi, le contrôle des connexions, l'application de la sécurité et la gestion de réseau sans fil de niveau entreprise avec des capacités complètes de surveillance et de conformité.

Comprendre la Gestion Wi-Fi macOS

macOS fournit plusieurs outils de ligne de commande pour la gestion Wi-Fi :

  • networksetup - Outil principal pour la configuration et le contrôle réseau
  • airport - Utilitaire de gestion d'interface sans fil de bas niveau
  • ifconfig - Outil de configuration d'interface réseau
  • Préférences Système - Équivalent GUI pour les paramètres sans fil

Le contrôle Wi-Fi d'entreprise nécessite une attention particulière aux politiques de sécurité, à la gestion de l'alimentation et aux exigences de conformité.

Commandes de Contrôle Wi-Fi de Base

Désactiver le Wi-Fi

#!/bin/bash

# Commande de base pour désactiver le Wi-Fi
turn_off_wifi_basic() {
    # Obtenir le nom de l'interface airport
    local AIRPORT=$(networksetup -listallhardwareports | grep -A 1 Wi-Fi | grep Device | awk '{print $2}')
    
    if [[ -n "$AIRPORT" ]]; then
        networksetup -setairportpower "$AIRPORT" off
        
        if [[ $? -eq 0 ]]; then
            echo "✅ Wi-Fi désactivé avec succès"
            return 0
        else
            echo "❌ Échec de la désactivation du Wi-Fi"
            return 1
        fi
    else
        echo "❌ Interface Wi-Fi non trouvée"
        return 1
    fi
}

# Exemple d'utilisation
turn_off_wifi_basic

Activer le Wi-Fi

#!/bin/bash

# Activer le Wi-Fi avec vérification
turn_on_wifi() {
    local interface_name="$1"
    
    # Détection automatique de l'interface si non fournie
    if [[ -z "$interface_name" ]]; then
        interface_name=$(networksetup -listallhardwareports | grep -A 1 Wi-Fi | grep Device | awk '{print $2}')
    fi
    
    if [[ -z "$interface_name" ]]; then
        echo "❌ Interface Wi-Fi non trouvée"
        return 1
    fi
    
    echo "Activation de l'interface Wi-Fi : $interface_name"
    networksetup -setairportpower "$interface_name" on
    
    # Attendre que l'interface soit active
    sleep 3
    
    # Vérifier que le Wi-Fi est activé
    local wifi_status
    wifi_status=$(networksetup -getairportpower "$interface_name" | grep "On")
    
    if [[ -n "$wifi_status" ]]; then
        echo "✅ Wi-Fi activé avec succès"
        return 0
    else
        echo "❌ Échec de l'activation du Wi-Fi"
        return 1
    fi
}

# Exemple d'utilisation
# turn_on_wifi "en0"

Vérifier le Statut Wi-Fi

#!/bin/bash

# Vérifier le statut Wi-Fi actuel avec informations détaillées
check_wifi_status() {
    echo "=== Rapport de Statut Wi-Fi ==="
    echo "Généré : $(date)"
    echo "==============================="
    echo ""
    
    # Obtenir toutes les interfaces Wi-Fi
    local wifi_interfaces
    wifi_interfaces=$(networksetup -listallhardwareports | grep -A 1 Wi-Fi | grep Device | awk '{print $2}')
    
    if [[ -z "$wifi_interfaces" ]]; then
        echo "❌ Aucune interface Wi-Fi trouvée"
        return 1
    fi
    
    for interface in $wifi_interfaces; do
        echo "Interface : $interface"
        echo "-----------------"
        
        # Statut d'alimentation
        local power_status
        power_status=$(networksetup -getairportpower "$interface")
        echo "Statut d'Alimentation : $power_status"
        
        # Statut de connexion
        if echo "$power_status" | grep -q "On"; then
            # Obtenir le réseau actuel
            local current_network
            current_network=$(networksetup -getairportnetwork "$interface" | cut -d' ' -f4-)
            echo "Réseau Actuel : $current_network"
            
            # Obtenir l'adresse IP si connecté
            local ip_address
            ip_address=$(ifconfig "$interface" | grep "inet " | awk '{print $2}')
            if [[ -n "$ip_address" ]]; then
                echo "Adresse IP : $ip_address"
            else
                echo "Adresse IP : Non assignée"
            fi
            
            # Force du signal (si disponible)
            if command -v airport >/dev/null 2>&1; then
                local signal_info
                signal_info=$(airport -I | grep "agrCtlRSSI" | awk '{print $2}')
                if [[ -n "$signal_info" ]]; then
                    echo "Force du Signal : $signal_info dBm"
                fi
            fi
        else
            echo "Wi-Fi désactivé"
        fi
        
        echo ""
    done
}

# Exécuter la vérification de statut
check_wifi_status

Système de Contrôle Wi-Fi d'Entreprise

#!/bin/bash

# Système de Contrôle Wi-Fi d'Entreprise MacFleet
# Gestion sans fil complète, application de sécurité et surveillance de conformité

# Configuration
LOG_FILE="/var/log/macfleet_wifi_control.log"
CONFIG_FILE="/etc/macfleet/wifi_config.conf"
BACKUP_DIR="/var/backups/macfleet/wifi"
POLICY_DIR="/etc/macfleet/wifi_policies"

# Créer la structure de répertoires
setup_directories() {
    mkdir -p "$(dirname "$LOG_FILE")" "$BACKUP_DIR" "$POLICY_DIR" "$(dirname "$CONFIG_FILE")"
    touch "$LOG_FILE"
    
    # Définir les permissions appropriées
    chmod 755 "$BACKUP_DIR" "$POLICY_DIR"
}

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

# Application de politique Wi-Fi d'entreprise
enforce_wifi_policy() {
    local policy_name="$1"
    local policy_file="$POLICY_DIR/${policy_name}.policy"
    
    if [[ ! -f "$policy_file" ]]; then
        log_action "ERREUR : Politique Wi-Fi non trouvée : $policy_name"
        return 1
    fi
    
    log_action "Application de la politique Wi-Fi : $policy_name"
    
    # Charger la configuration de politique
    source "$policy_file"
    
    # Obtenir l'interface Wi-Fi
    local wifi_interface
    wifi_interface=$(networksetup -listallhardwareports | grep -A 1 Wi-Fi | grep Device | awk '{print $2}')
    
    if [[ -z "$wifi_interface" ]]; then
        log_action "ERREUR : Aucune interface Wi-Fi trouvée"
        return 1
    fi
    
    # Appliquer les paramètres de politique
    case "${WIFI_POLICY_ACTION:-disable}" in
        "disable")
            networksetup -setairportpower "$wifi_interface" off
            log_action "Wi-Fi désactivé selon la politique : $policy_name"
            ;;
        "enable")
            networksetup -setairportpower "$wifi_interface" on
            log_action "Wi-Fi activé selon la politique : $policy_name"
            ;;
        "scheduled")
            apply_scheduled_wifi_policy "$wifi_interface" "$policy_name"
            ;;
        "conditional")
            apply_conditional_wifi_policy "$wifi_interface" "$policy_name"
            ;;
        *)
            log_action "ERREUR : Action de politique inconnue : ${WIFI_POLICY_ACTION}"
            return 1
            ;;
    esac
    
    return 0
}

# Contrôle Wi-Fi programmé
apply_scheduled_wifi_policy() {
    local interface="$1"
    local policy_name="$2"
    local current_hour=$(date +%H)
    local current_day=$(date +%u)  # 1=Lundi, 7=Dimanche
    
    log_action "Application de la politique Wi-Fi programmée : $policy_name"
    
    # Charger le planning depuis la politique
    local enable_hours="${WIFI_ENABLE_HOURS:-09-17}"
    local enable_days="${WIFI_ENABLE_DAYS:-1-5}"
    
    # Analyser la plage horaire
    local start_hour end_hour
    start_hour=$(echo "$enable_hours" | cut -d'-' -f1)
    end_hour=$(echo "$enable_hours" | cut -d'-' -f2)
    
    # Analyser la plage de jours
    local start_day end_day
    start_day=$(echo "$enable_days" | cut -d'-' -f1)
    end_day=$(echo "$enable_days" | cut -d'-' -f2)
    
    # Vérifier si l'heure actuelle est dans la fenêtre autorisée
    local time_allowed=false
    local day_allowed=false
    
    if [[ "$current_hour" -ge "$start_hour" && "$current_hour" -lt "$end_hour" ]]; then
        time_allowed=true
    fi
    
    if [[ "$current_day" -ge "$start_day" && "$current_day" -le "$end_day" ]]; then
        day_allowed=true
    fi
    
    if [[ "$time_allowed" == "true" && "$day_allowed" == "true" ]]; then
        networksetup -setairportpower "$interface" on
        log_action "Wi-Fi activé - dans les heures programmées"
    else
        networksetup -setairportpower "$interface" off
        log_action "Wi-Fi désactivé - hors des heures programmées"
    fi
}

# Contrôle Wi-Fi conditionnel
apply_conditional_wifi_policy() {
    local interface="$1"
    local policy_name="$2"
    
    log_action "Application de la politique Wi-Fi conditionnelle : $policy_name"
    
    # Vérifier le niveau de batterie
    local battery_level
    battery_level=$(pmset -g batt | grep -o '[0-9]*%' | tr -d '%')
    
    # Vérifier la source d'alimentation
    local power_source
    power_source=$(pmset -g ps | head -1 | grep -o "'.*'" | tr -d "'")
    
    # Vérifier la connexion ethernet
    local ethernet_connected=false
    local ethernet_interfaces
    ethernet_interfaces=$(networksetup -listallhardwareports | grep -A 1 Ethernet | grep Device | awk '{print $2}')
    
    for eth_interface in $ethernet_interfaces; do
        local eth_status
        eth_status=$(ifconfig "$eth_interface" 2>/dev/null | grep "status: active")
        if [[ -n "$eth_status" ]]; then
            ethernet_connected=true
            break
        fi
    done
    
    # Appliquer la logique conditionnelle
    local should_enable_wifi=true
    
    # Désactiver le Wi-Fi si ethernet est connecté et la politique l'exige
    if [[ "$ethernet_connected" == "true" && "${DISABLE_WIFI_WITH_ETHERNET:-false}" == "true" ]]; then
        should_enable_wifi=false
        log_action "Wi-Fi désactivé - Connexion Ethernet détectée"
    fi
    
    # Désactiver le Wi-Fi si la batterie est faible et la politique l'exige
    if [[ -n "$battery_level" && "$battery_level" -lt "${MIN_BATTERY_FOR_WIFI:-20}" ]]; then
        should_enable_wifi=false
        log_action "Wi-Fi désactivé - Niveau de batterie faible : $battery_level%"
    fi
    
    # Activer/désactiver le Wi-Fi selon les conditions
    if [[ "$should_enable_wifi" == "true" ]]; then
        networksetup -setairportpower "$interface" on
        log_action "Wi-Fi activé - Conditions remplies"
    else
        networksetup -setairportpower "$interface" off
        log_action "Wi-Fi désactivé - Conditions non remplies"
    fi
}

# Vérification de conformité de sécurité
check_wifi_security_compliance() {
    log_action "Exécution de la vérification de conformité de sécurité Wi-Fi"
    
    local compliance_issues=()
    local wifi_interface
    wifi_interface=$(networksetup -listallhardwareports | grep -A 1 Wi-Fi | grep Device | awk '{print $2}')
    
    if [[ -z "$wifi_interface" ]]; then
        log_action "ERREUR : Aucune interface Wi-Fi trouvée pour la vérification de conformité"
        return 1
    fi
    
    # Vérifier si le Wi-Fi est activé quand il devrait être désactivé
    local power_status
    power_status=$(networksetup -getairportpower "$wifi_interface")
    
    if echo "$power_status" | grep -q "On"; then
        # Wi-Fi activé, vérifier la sécurité du réseau actuel
        local current_network
        current_network=$(networksetup -getairportnetwork "$wifi_interface" | cut -d' ' -f4-)
        
        if [[ "$current_network" != "You are not associated with an AirPort network." ]]; then
            log_action "Connecté au réseau : $current_network"
            
            # Vérifier si le réseau est dans la liste approuvée
            local approved_networks_file="$POLICY_DIR/approved_networks.list"
            if [[ -f "$approved_networks_file" ]]; then
                if ! grep -q "^$current_network$" "$approved_networks_file"; then
                    compliance_issues+=("Connecté à un réseau non approuvé : $current_network")
                fi
            fi
            
            # Vérifier les réseaux ouverts
            if command -v airport >/dev/null 2>&1; then
                local network_security
                network_security=$(airport -I | grep "Security")
                if echo "$network_security" | grep -q "none"; then
                    compliance_issues+=("Connecté à un réseau ouvert/non sécurisé")
                fi
            fi
        fi
    fi
    
    # Générer le rapport de conformité
    if [[ ${#compliance_issues[@]} -eq 0 ]]; then
        log_action "✅ Vérification de conformité de sécurité Wi-Fi réussie"
        return 0
    else
        log_action "❌ Violations de conformité de sécurité Wi-Fi trouvées :"
        for issue in "${compliance_issues[@]}"; do
            log_action "  - $issue"
        done
        return 1
    fi
}

# Fonction de gestion principale
main() {
    local action="${1:-status}"
    local parameter1="$2"
    local parameter2="$3"
    
    setup_directories
    log_action "Contrôle Wi-Fi MacFleet démarré avec l'action : $action"
    
    case "$action" in
        "disable"|"off")
            turn_off_wifi_basic
            ;;
        "enable"|"on")
            turn_on_wifi "$parameter1"
            ;;
        "status")
            check_wifi_status
            ;;
        "policy")
            enforce_wifi_policy "$parameter1"
            ;;
        "compliance")
            check_wifi_security_compliance
            ;;
        *)
            check_wifi_status
            ;;
    esac
    
    log_action "Contrôle Wi-Fi MacFleet terminé avec l'action : $action"
}

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

Modèles de Politiques Wi-Fi

Configuration de Politique Wi-Fi d'Entreprise

# /etc/macfleet/wifi_policies/corporate_standard.policy
# Politique Wi-Fi d'Entreprise MacFleet

# Action de politique : disable, enable, scheduled, conditional
WIFI_POLICY_ACTION="conditional"

# Paramètres programmés (pour action scheduled)
WIFI_ENABLE_HOURS="08-18"    # 8h à 18h
WIFI_ENABLE_DAYS="1-5"       # Lundi au vendredi

# Paramètres conditionnels
DISABLE_WIFI_WITH_ETHERNET="true"
MIN_BATTERY_FOR_WIFI="15"

# Paramètres de sécurité
REQUIRE_WPA2_MINIMUM="true"
BLOCK_OPEN_NETWORKS="true"
AUTO_CONNECT_CORPORATE_ONLY="true"

# Gestion de l'alimentation
POWER_OPTIMIZATION_LEVEL="balanced"
AUTO_DISABLE_IDLE="true"
IDLE_TIMEOUT_MINUTES="30"

Politique Wi-Fi Axée Sécurité

# /etc/macfleet/wifi_policies/high_security.policy
# Politique Wi-Fi Haute Sécurité MacFleet

WIFI_POLICY_ACTION="conditional"

# Exigences de sécurité
REQUIRE_WPA3_MINIMUM="true"
BLOCK_OPEN_NETWORKS="true"
BLOCK_WEP_NETWORKS="true"
APPROVED_NETWORKS_ONLY="true"

# Désactivation conditionnelle
DISABLE_WIFI_WITH_ETHERNET="true"
DISABLE_WIFI_IN_SECURE_AREAS="true"
MIN_BATTERY_FOR_WIFI="25"

# Surveillance
ENABLE_CONNECTION_LOGGING="true"
ALERT_ON_UNAPPROVED_NETWORKS="true"
SCAN_INTERVAL_MINUTES="5"

Fonctions de Sécurité et Conformité

Gestion de Liste Blanche de Réseaux

#!/bin/bash

# Gérer les réseaux Wi-Fi approuvés
manage_network_whitelist() {
    local action="$1"
    local network_name="$2"
    local whitelist_file="$POLICY_DIR/approved_networks.list"
    
    case "$action" in
        "add")
            if [[ -z "$network_name" ]]; then
                echo "ERREUR : Nom de réseau requis"
                return 1
            fi
            
            # Ajouter le réseau à la liste blanche
            if ! grep -q "^$network_name$" "$whitelist_file" 2>/dev/null; then
                echo "$network_name" >> "$whitelist_file"
                log_action "Réseau ajouté à la liste blanche : $network_name"
            else
                log_action "Réseau déjà dans la liste blanche : $network_name"
            fi
            ;;
        "remove")
            if [[ -z "$network_name" ]]; then
                echo "ERREUR : Nom de réseau requis"
                return 1
            fi
            
            # Supprimer le réseau de la liste blanche
            if [[ -f "$whitelist_file" ]]; then
                grep -v "^$network_name$" "$whitelist_file" > "${whitelist_file}.tmp"
                mv "${whitelist_file}.tmp" "$whitelist_file"
                log_action "Réseau supprimé de la liste blanche : $network_name"
            fi
            ;;
        "list")
            echo "=== Liste Blanche des Réseaux Approuvés ==="
            if [[ -f "$whitelist_file" ]]; then
                cat "$whitelist_file"
            else
                echo "Aucun réseau approuvé configuré"
            fi
            ;;
        *)
            echo "ERREUR : Action de liste blanche invalide : $action"
            return 1
            ;;
    esac
}

# Exemple d'utilisation
# manage_network_whitelist "add" "WiFiEntreprise"
# manage_network_whitelist "list"

Notes Techniques Importantes

Référence des Commandes NetworkSetup

  • networksetup -setairportpower <device> on|off : Activer/désactiver le Wi-Fi
  • networksetup -getairportpower <device> : Vérifier le statut d'alimentation Wi-Fi
  • networksetup -getairportnetwork <device> : Obtenir le réseau Wi-Fi actuel
  • networksetup -listpreferredwirelessnetworks <device> : Lister les réseaux sauvegardés

Considérations de Sécurité

  1. Privilèges Administrateur : Beaucoup de commandes réseau nécessitent un accès admin
  2. Isolation Réseau : Assurer une segmentation réseau appropriée
  3. Gestion des Profils : Auditer et nettoyer régulièrement les profils réseau sauvegardés
  4. Protection Réseau Ouvert : Bloquer les connexions aux réseaux non sécurisés
  5. Surveillance de Conformité : Implémenter une vérification continue de conformité de sécurité

Meilleures Pratiques de Gestion de l'Alimentation

  1. Optimisation Batterie : Désactiver le Wi-Fi quand la batterie est critique
  2. Priorité Ethernet : Préférer les connexions filaires quand disponibles
  3. Contrôle Programmé : Implémenter des politiques Wi-Fi basées sur l'heure
  4. Gestion Inactivité : Désactiver le Wi-Fi pendant les périodes d'inactivité prolongées
  5. Surveillance des Ressources : Suivre les modèles de consommation d'énergie

Cas d'Usage d'Entreprise

  1. Environnements Sécurisés : Liste blanche stricte des réseaux et conformité
  2. Déploiements Économes en Énergie : Optimisation batterie pour travailleurs mobiles
  3. Opérations Programmées : Contrôle Wi-Fi basé sur l'heure pour différentes équipes
  4. Exigences de Conformité : Pistes d'audit et surveillance de sécurité
  5. Standardisation de Flotte : Politiques Wi-Fi cohérentes sur tous les appareils

N'oubliez pas de tester tous les scripts sur des appareils individuels avant de les déployer sur votre environnement MacFleet, et d'assurer la conformité avec les politiques de sécurité d'entreprise lors de l'implémentation de systèmes de contrôle Wi-Fi d'entreprise.

Contrôle d'Accès aux Sites Web d'Entreprise sur macOS

Contrôlez l'accès aux sites web sur vos appareils MacFleet en utilisant la gestion avancée du fichier hosts, le filtrage DNS et les contrôles de politique d'entreprise. Ce tutoriel fournit des outils complets pour implémenter les politiques d'accès web organisationnelles.

Comprendre les Méthodes de Contrôle d'Accès aux Sites Web

macOS offre plusieurs approches pour contrôler l'accès aux sites web :

  • Gestion du Fichier Hosts - Redirection DNS locale pour des domaines spécifiques
  • Configuration DNS - Filtrage au niveau réseau via des serveurs DNS personnalisés
  • Paramètres Proxy Système - Routage du trafic via des proxys de filtrage
  • Règles de Pare-feu - Blocage d'adresses IP et de plages de ports spécifiques

Blocage de Sites Web Basique

Bloquer un Site Web Unique

#!/bin/bash

# Bloquer l'accès à un site web spécifique
WEBSITE="www.facebook.com"

# Ajouter une entrée au fichier hosts
echo "127.0.0.1 $WEBSITE" >> /etc/hosts
echo "127.0.0.1 facebook.com" >> /etc/hosts

echo "Accès bloqué à $WEBSITE"

Bloquer Plusieurs Sites Web

#!/bin/bash

# Bloquer plusieurs sites web à la fois
BLOCKED_SITES=(
    "www.facebook.com"
    "facebook.com" 
    "m.facebook.com"
    "www.twitter.com"
    "twitter.com"
    "www.instagram.com"
    "instagram.com"
)

for site in "${BLOCKED_SITES[@]}"; do
    echo "127.0.0.1 $site" >> /etc/hosts
    echo "Bloqué: $site"
done

echo "Blocage de sites web terminé"

Déblocage de Sites Web Basique

Débloquer un Site Web Unique

#!/bin/bash

# Supprimer un site web du fichier hosts
WEBSITE="www.facebook.com"

/usr/bin/sed -i "" "/127.0.0.1 $WEBSITE/d" /etc/hosts
/usr/bin/sed -i "" "/127.0.0.1 facebook.com/d" /etc/hosts

echo "Accès débloqué à $WEBSITE"

Débloquer Tous les Sites Web

#!/bin/bash

# Supprimer toutes les entrées de blocage du fichier hosts
/usr/bin/sed -i "" '/^127.0.0.1.*[^localhost]/d' /etc/hosts

echo "Tous les blocages de sites web supprimés"

Système de Contrôle d'Accès Web d'Entreprise

#!/bin/bash

# Contrôle d'Accès Web d'Entreprise MacFleet
# Système complet de filtrage web et de gestion de politiques

# Configuration
MACFLEET_DIR="/etc/macfleet"
POLICIES_DIR="$MACFLEET_DIR/web_policies"
REPORTS_DIR="$MACFLEET_DIR/reports"
COMPLIANCE_DIR="$MACFLEET_DIR/compliance"
AUDIT_DIR="$MACFLEET_DIR/audit"
LOG_FILE="/var/log/macfleet_web_access.log"
BACKUP_DIR="$MACFLEET_DIR/backups"

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

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

# Sauvegarder le fichier hosts
backup_hosts() {
    local backup_file="$BACKUP_DIR/hosts_backup_$(date +%Y%m%d_%H%M%S)"
    cp /etc/hosts "$backup_file"
    log_action "Fichier hosts sauvegardé vers: $backup_file"
}

# Catégories de Sites Web pour le Filtrage d'Entreprise
declare -A WEBSITE_CATEGORIES=(
    ["reseaux_sociaux"]="facebook.com,twitter.com,instagram.com,linkedin.com,snapchat.com,tiktok.com,pinterest.com"
    ["divertissement"]="youtube.com,netflix.com,hulu.com,twitch.tv,spotify.com,reddit.com"
    ["jeux"]="steam.com,epic.com,roblox.com,minecraft.net,ea.com,ubisoft.com"
    ["shopping"]="amazon.com,ebay.com,etsy.com,shopify.com,aliexpress.com"
    ["actualites"]="cnn.com,bbc.com,reuters.com,bloomberg.com,wsj.com"
    ["contenu_adulte"]="example.com"
    ["malveillant"]="malware.com,phishing-site.com,trojan-host.com"
)

# Politiques de Sécurité
declare -A SECURITY_POLICIES=(
    ["securite_elevee"]="reseaux_sociaux,divertissement,jeux,shopping,contenu_adulte,malveillant"
    ["securite_moderee"]="contenu_adulte,malveillant,jeux"
    ["securite_minimale"]="contenu_adulte,malveillant"
    ["equipe_developpement"]="malveillant"
    ["acces_executif"]="malveillant"
)

# Bloquer des sites web par catégorie
block_category() {
    local category="$1"
    local policy="$2"
    
    if [[ -z "${WEBSITE_CATEGORIES[$category]}" ]]; then
        log_action "ERREUR: Catégorie inconnue: $category"
        return 1
    fi
    
    log_action "Blocage de la catégorie: $category (Politique: $policy)"
    
    # Diviser les domaines séparés par des virgules
    IFS=',' read -ra domains <<< "${WEBSITE_CATEGORIES[$category]}"
    
    for domain in "${domains[@]}"; do
        # Ajouter plusieurs variations
        echo "127.0.0.1 $domain" >> /etc/hosts
        echo "127.0.0.1 www.$domain" >> /etc/hosts
        echo "127.0.0.1 m.$domain" >> /etc/hosts
        echo "127.0.0.1 mobile.$domain" >> /etc/hosts
        
        log_action "Domaine bloqué: $domain"
    done
    
    # Sauvegarder les métadonnées de politique
    echo "category=$category,policy=$policy,timestamp=$(date),user=$(whoami)" >> "$POLICIES_DIR/applied_blocks.log"
}

# Appliquer une politique de sécurité
apply_security_policy() {
    local policy="$1"
    
    if [[ -z "${SECURITY_POLICIES[$policy]}" ]]; then
        log_action "ERREUR: Politique de sécurité inconnue: $policy"
        return 1
    fi
    
    log_action "Application de la politique de sécurité: $policy"
    backup_hosts
    
    # Effacer les blocages existants
    /usr/bin/sed -i "" '/^127.0.0.1.*[^localhost]/d' /etc/hosts
    
    # Appliquer les catégories pour cette politique
    IFS=',' read -ra categories <<< "${SECURITY_POLICIES[$policy]}"
    
    for category in "${categories[@]}"; do
        block_category "$category" "$policy"
    done
    
    # Vider le cache DNS
    dscacheutil -flushcache
    killall -HUP mDNSResponder
    
    log_action "Politique de sécurité '$policy' appliquée avec succès"
    
    # Générer un rapport de conformité
    generate_compliance_report "$policy"
}

# Filtrage DNS avancé
configure_dns_filtering() {
    local filter_level="$1"
    
    log_action "Configuration du filtrage DNS: $filter_level"
    
    case "$filter_level" in
        "entreprise")
            # Utiliser des serveurs DNS d'entreprise avec filtrage
            networksetup -setdnsservers "Wi-Fi" 208.67.222.222 208.67.220.220
            networksetup -setdnsservers "Ethernet" 208.67.222.222 208.67.220.220
            ;;
        "securite_familiale")
            # Utiliser un DNS sécurisé pour la famille
            networksetup -setdnsservers "Wi-Fi" 208.67.222.123 208.67.220.123
            networksetup -setdnsservers "Ethernet" 208.67.222.123 208.67.220.123
            ;;
        "securise")
            # Utiliser un DNS axé sur la sécurité
            networksetup -setdnsservers "Wi-Fi" 1.1.1.2 1.0.0.2
            networksetup -setdnsservers "Ethernet" 1.1.1.2 1.0.0.2
            ;;
        "defaut")
            # Réinitialiser au DNS automatique
            networksetup -setdnsservers "Wi-Fi" "Empty"
            networksetup -setdnsservers "Ethernet" "Empty"
            ;;
    esac
    
    log_action "Filtrage DNS configuré: $filter_level"
}

# Gestion de liste blanche pour les sites d'affaires essentiels
manage_whitelist() {
    local action="$1"
    local domain="$2"
    local whitelist_file="$POLICIES_DIR/business_whitelist.txt"
    
    case "$action" in
        "ajouter")
            if ! grep -q "^$domain$" "$whitelist_file" 2>/dev/null; then
                echo "$domain" >> "$whitelist_file"
                # Supprimer du fichier hosts si bloqué
                /usr/bin/sed -i "" "/127.0.0.1.*$domain/d" /etc/hosts
                log_action "Ajouté à la liste blanche: $domain"
            else
                log_action "Domaine déjà en liste blanche: $domain"
            fi
            ;;
        "supprimer")
            if [[ -f "$whitelist_file" ]]; then
                /usr/bin/sed -i "" "/^$domain$/d" "$whitelist_file"
                log_action "Supprimé de la liste blanche: $domain"
            fi
            ;;
        "lister")
            if [[ -f "$whitelist_file" ]]; then
                echo "Liste Blanche d'Affaires:"
                cat "$whitelist_file"
            else
                echo "Aucune liste blanche trouvée"
            fi
            ;;
    esac
}

# Mode d'accès d'urgence
emergency_access() {
    local action="$1"
    local emergency_file="$POLICIES_DIR/emergency_mode.flag"
    
    case "$action" in
        "activer")
            # Sauvegarder les hosts actuels et effacer tous les blocages
            backup_hosts
            cp /etc/hosts "$BACKUP_DIR/hosts_before_emergency"
            /usr/bin/sed -i "" '/^127.0.0.1.*[^localhost]/d' /etc/hosts
            touch "$emergency_file"
            echo "emergency_enabled=$(date)" > "$emergency_file"
            log_action "ACCÈS D'URGENCE ACTIVÉ - Tous les blocages de sites web supprimés"
            ;;
        "desactiver")
            if [[ -f "$emergency_file" ]]; then
                rm "$emergency_file"
                # Restaurer la configuration précédente si disponible
                if [[ -f "$BACKUP_DIR/hosts_before_emergency" ]]; then
                    cp "$BACKUP_DIR/hosts_before_emergency" /etc/hosts
                    log_action "Accès d'urgence désactivé - Configuration précédente restaurée"
                else
                    log_action "Accès d'urgence désactivé - Reconfiguration manuelle requise"
                fi
            else
                log_action "L'accès d'urgence n'est pas actuellement activé"
            fi
            ;;
        "statut")
            if [[ -f "$emergency_file" ]]; then
                echo "Accès d'urgence: ACTIVÉ"
                cat "$emergency_file"
            else
                echo "Accès d'urgence: DÉSACTIVÉ"
            fi
            ;;
    esac
}

# Générer un rapport de conformité complet
generate_compliance_report() {
    local policy="$1"
    local report_file="$REPORTS_DIR/web_access_compliance_$(date +%Y%m%d_%H%M%S).json"
    
    local blocked_domains=$(grep -c "^127.0.0.1" /etc/hosts 2>/dev/null || echo "0")
    local whitelist_count=0
    [[ -f "$POLICIES_DIR/business_whitelist.txt" ]] && whitelist_count=$(wc -l < "$POLICIES_DIR/business_whitelist.txt")
    
    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"
  },
  "controle_acces_web": {
    "nombre_domaines_bloques": $blocked_domains,
    "nombre_domaines_liste_blanche": $whitelist_count,
    "filtrage_dns_actif": $(networksetup -getdnsservers Wi-Fi | grep -q "208.67" && echo "true" || echo "false"),
    "mode_urgence": $([ -f "$POLICIES_DIR/emergency_mode.flag" ] && echo "true" || echo "false")
  },
  "politique_securite": {
    "nom": "$policy",
    "categories_bloquees": "$(echo "${SECURITY_POLICIES[$policy]}" | tr ',' ' ')",
    "cadres_conformite": ["SOX", "HIPAA", "NIST", "ISO27001"]
  },
  "statut_systeme": {
    "taille_fichier_hosts": $(wc -l < /etc/hosts),
    "derniere_vidange_dns": "$(date -u +%Y-%m-%dT%H:%M:%SZ)",
    "sauvegarde_disponible": $([ -d "$BACKUP_DIR" ] && [ "$(ls -1 "$BACKUP_DIR"/hosts_backup_* 2>/dev/null | wc -l)" -gt 0 ] && echo "true" || echo "false")
  }
}
EOF
    
    log_action "Rapport de conformité généré: $report_file"
    echo "Rapport sauvegardé vers: $report_file"
}

# Vérification de santé et validation
perform_health_check() {
    echo "=== Vérification de Santé du Contrôle d'Accès Web MacFleet ==="
    
    # Vérifier l'intégrité du fichier hosts
    if [[ -f "/etc/hosts" ]]; then
        echo "✓ Le fichier hosts existe"
        local hosts_size=$(wc -l < /etc/hosts)
        echo "  - Lignes: $hosts_size"
    else
        echo "✗ Fichier hosts manquant"
    fi
    
    # Vérifier les domaines bloqués
    local blocked_count=$(grep -c "^127.0.0.1" /etc/hosts 2>/dev/null || echo "0")
    echo "✓ Domaines bloqués: $blocked_count"
    
    # Vérifier la configuration DNS
    local dns_servers=$(networksetup -getdnsservers Wi-Fi)
    echo "✓ Serveurs DNS: $dns_servers"
    
    # Vérifier la liste blanche
    if [[ -f "$POLICIES_DIR/business_whitelist.txt" ]]; then
        local whitelist_count=$(wc -l < "$POLICIES_DIR/business_whitelist.txt")
        echo "✓ Domaines en liste blanche: $whitelist_count"
    else
        echo "○ Aucune liste blanche configurée"
    fi
    
    # Vérifier le mode d'urgence
    if [[ -f "$POLICIES_DIR/emergency_mode.flag" ]]; then
        echo "⚠️  Mode d'urgence: ACTIF"
    else
        echo "✓ Mode d'urgence: INACTIF"
    fi
    
    # Vérifier l'activité récente
    if [[ -f "$LOG_FILE" ]]; then
        local recent_entries=$(tail -5 "$LOG_FILE" | wc -l)
        echo "✓ Entrées de journal récentes: $recent_entries"
    fi
}

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

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

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

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

# Fonction d'exécution principale
main() {
    create_directories
    
    case "${1:-}" in
        "appliquer_politique")
            apply_security_policy "$2"
            ;;
        "bloquer_categorie")
            backup_hosts
            block_category "$2" "manuel"
            ;;
        "configurer_dns")
            configure_dns_filtering "$2"
            ;;
        "liste_blanche")
            manage_whitelist "$2" "$3"
            ;;
        "urgence")
            emergency_access "$2"
            ;;
        "verification_sante")
            perform_health_check
            ;;
        "rapport")
            generate_compliance_report "${2:-manuel}"
            ;;
        "deployer")
            deploy_to_fleet "$2" "$3"
            ;;
        "aide"|*)
            echo "Système de Contrôle d'Accès Web MacFleet"
            echo ""
            echo "Usage: $0 <commande> [options]"
            echo ""
            echo "Commandes:"
            echo "  appliquer_politique <politique>     - Appliquer une politique de sécurité (securite_elevee|securite_moderee|securite_minimale|equipe_developpement|acces_executif)"
            echo "  bloquer_categorie <categorie>       - Bloquer une catégorie de sites web (reseaux_sociaux|divertissement|jeux|shopping|actualites|contenu_adulte|malveillant)"
            echo "  configurer_dns <niveau>             - Configurer le filtrage DNS (entreprise|securite_familiale|securise|defaut)"
            echo "  liste_blanche <action> <domaine>    - Gérer la liste blanche (ajouter|supprimer|lister)"
            echo "  urgence <action>                    - Contrôle d'accès d'urgence (activer|desactiver|statut)"
            echo "  verification_sante                  - Effectuer une vérification de santé du système"
            echo "  rapport [politique]                 - Générer un rapport de conformité"
            echo "  deployer <politique> <fichier_flotte> - Déployer une politique vers la flotte"
            echo ""
            echo "Exemples:"
            echo "  $0 appliquer_politique securite_elevee"
            echo "  $0 liste_blanche ajouter salesforce.com"
            echo "  $0 urgence activer"
            echo "  $0 verification_sante"
            ;;
    esac
}

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

## Heures d'Affaires et Contrôles Conviviaux

### Contrôle d'Accès Basé sur l'Heure

```bash
#!/bin/bash

# Appliquer différentes politiques selon les heures d'affaires
apply_time_based_policy() {
    local current_hour=$(date +%H)
    local day_of_week=$(date +%u)
    
    # Heures d'affaires: Lundi-Vendredi 9h - 18h
    if [[ $day_of_week -le 5 ]] && [[ $current_hour -ge 9 ]] && [[ $current_hour -lt 18 ]]; then
        echo "Heures d'affaires détectées - application de la politique stricte"
        apply_security_policy "securite_elevee"
    else
        echo "En dehors des heures d'affaires - application de la politique assouplie"
        apply_security_policy "securite_moderee"
    fi
}

Système de Notification Utilisateur

#!/bin/bash

# Notifier l'utilisateur des changements d'accès aux sites web
notify_user() {
    local message="$1"
    local title="Accès Web MacFleet"
    
    # Utiliser osascript pour la notification utilisateur
    osascript -e "display notification \"$message\" with title \"$title\" sound name \"Glass\""
    
    # Aussi enregistrer dans le système
    log_action "Notification utilisateur: $message"
}

# Exemple d'utilisation
notify_user "Politique d'accès aux sites web mise à jour en mode Haute Sécurité"

Considérations de Sécurité Importantes

  • Les permissions du fichier hosts doivent être restreintes pour empêcher les modifications non autorisées
  • Le filtrage DNS fournit une protection au niveau réseau au-delà du fichier hosts local
  • Les procédures d'accès d'urgence doivent être documentées et testées
  • Les sauvegardes régulières du fichier hosts et de la configuration sont essentielles
  • La journalisation d'audit aide à suivre les changements de politique et la conformité

Conformité et Rapports

Le système d'entreprise génère des rapports complets pour :

  • Conformité SOX - Contrôles d'accès web des services financiers
  • Exigences HIPAA - Politiques de protection des données de santé
  • Cadre NIST - Alignement sur les normes de cybersécurité
  • ISO 27001 - Gestion de la sécurité de l'information

Tests et Validation

Avant le déploiement en production :

  1. Tester les commandes individuelles sur des systèmes isolés
  2. Vérifier la résolution DNS après application des politiques
  3. Confirmer que les applications d'affaires restent accessibles
  4. Tester les procédures d'urgence et la restauration
  5. Valider la précision des rapports de conformité

Ce système complet transforme le blocage de sites web basique en une plateforme de contrôle d'accès de niveau entreprise avec gestion avancée de politiques, rapports de conformité et capacités de déploiement de flotte.