Gestion d'Entreprise des Proxies sur macOS
Configurez et gérez les paramètres de proxy d'entreprise sur vos appareils MacFleet en utilisant des commandes networksetup avancées. Ce tutoriel couvre tous les types de proxy incluant web, web sécurisé, streaming, Gopher et SOCKS firewall avec des capacités de gestion de niveau entreprise.
Comprendre la Gestion des Proxies macOS
macOS fournit une configuration de proxy complète via l'utilitaire en ligne de commande networksetup
, supportant :
- Proxy Web (HTTP) - Routage du trafic HTTP standard
- Proxy Web Sécurisé (HTTPS) - Trafic HTTPS chiffré avec sécurité de bout en bout
- Proxy Streaming - Optimisation du contenu multimédia (déprécié dans macOS 13.0+)
- Proxy Gopher - Support du protocole Gopher hérité (déprécié dans macOS 13.0+)
- Proxy Firewall SOCKS - Protocole générique supportant la plupart des applications
Configuration du Proxy Web
Configuration de Base du Proxy Web
#!/bin/bash
# Configurer le proxy web HTTP
NETWORK_SERVICE="Wi-Fi"
PROXY_SERVER="proxy.entreprise.com"
PROXY_PORT="8080"
AUTHENTICATED="on"
USERNAME="utilisateurproxy"
PASSWORD="motdepasseproxy"
# Définir la configuration du proxy web
networksetup -setwebproxy "$NETWORK_SERVICE" "$PROXY_SERVER" "$PROXY_PORT" "$AUTHENTICATED" "$USERNAME" "$PASSWORD"
# Activer le proxy web
networksetup -setwebproxystate "$NETWORK_SERVICE" on
echo "Proxy web configuré avec succès pour $NETWORK_SERVICE"
Gestion Avancée du Proxy Web
#!/bin/bash
# Système de Configuration de Proxy Web d'Entreprise
NETWORK_SERVICE="Wi-Fi"
CONFIG_FILE="/etc/macfleet/proxy_config.conf"
LOG_FILE="/var/log/macfleet_proxy.log"
# Fonction de journalisation
log_action() {
echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" | tee -a "$LOG_FILE"
}
# Charger la configuration proxy depuis un fichier
load_proxy_config() {
if [[ -f "$CONFIG_FILE" ]]; then
source "$CONFIG_FILE"
log_action "Configuration proxy chargée depuis $CONFIG_FILE"
else
echo "Fichier de configuration non trouvé : $CONFIG_FILE"
exit 1
fi
}
# Configurer le proxy web avec validation
configure_web_proxy() {
local server="$1"
local port="$2"
local auth="$3"
local username="$4"
local password="$5"
# Valider l'existence du service réseau
if ! networksetup -listallnetworkservices | grep -q "^$NETWORK_SERVICE$"; then
log_action "ERREUR : Service réseau '$NETWORK_SERVICE' non trouvé"
return 1
fi
# Tester la connectivité proxy
if ! nc -z "$server" "$port" 2>/dev/null; then
log_action "ATTENTION : Impossible d'atteindre le serveur proxy $server:$port"
fi
# Configurer le proxy
if networksetup -setwebproxy "$NETWORK_SERVICE" "$server" "$port" "$auth" "$username" "$password"; then
networksetup -setwebproxystate "$NETWORK_SERVICE" on
log_action "Proxy web configuré : $server:$port (Auth : $auth)"
return 0
else
log_action "ERREUR : Échec de la configuration du proxy web"
return 1
fi
}
# Vérifier la configuration proxy
verify_proxy_config() {
local proxy_info
proxy_info=$(networksetup -getwebproxy "$NETWORK_SERVICE")
echo "Configuration Actuelle du Proxy Web :"
echo "$proxy_info"
if echo "$proxy_info" | grep -q "Enabled: Yes"; then
log_action "Vérification du proxy web réussie"
return 0
else
log_action "Vérification du proxy web échouée"
return 1
fi
}
# Exécution principale
main() {
log_action "Démarrage de la configuration du proxy web"
# Exemple de configuration (remplacer par les vraies valeurs)
configure_web_proxy "proxy.entreprise.com" "8080" "on" "utilisateurproxy" "motdepasseproxy"
# Vérifier la configuration
verify_proxy_config
log_action "Configuration du proxy web terminée"
}
# Exécuter si le script est lancé directement
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
main "$@"
fi
Proxy Web Sécurisé (HTTPS)
Configuration de Base du Proxy HTTPS
#!/bin/bash
# Configurer le proxy web sécurisé HTTPS
networksetup -setsecurewebproxy "Wi-Fi" "proxy-securise.entreprise.com" "8443" on "utilisateursecurise" "motdepassesecurise"
networksetup -setsecurewebproxystate "Wi-Fi" on
echo "Proxy web sécurisé configuré avec succès"
Gestion d'Entreprise du Proxy HTTPS
#!/bin/bash
# Configuration du Proxy Web Sécurisé d'Entreprise
configure_secure_proxy() {
local network_service="$1"
local proxy_server="$2"
local proxy_port="$3"
local username="$4"
local password="$5"
echo "Configuration du proxy web sécurisé pour $network_service..."
# Valider la connectivité SSL/TLS
if openssl s_client -connect "$proxy_server:$proxy_port" -verify_return_error < /dev/null 2>/dev/null; then
echo "✅ Connectivité SSL vérifiée pour $proxy_server:$proxy_port"
else
echo "⚠️ ATTENTION : Problèmes de connectivité SSL détectés"
fi
# Configurer le proxy sécurisé
if networksetup -setsecurewebproxy "$network_service" "$proxy_server" "$proxy_port" on "$username" "$password"; then
networksetup -setsecurewebproxystate "$network_service" on
echo "✅ Proxy web sécurisé configuré avec succès"
# Vérifier la configuration
echo "Détails de configuration :"
networksetup -getsecurewebproxy "$network_service"
return 0
else
echo "❌ Échec de la configuration du proxy web sécurisé"
return 1
fi
}
# Validation des certificats pour les proxies sécurisés
validate_proxy_certificate() {
local proxy_server="$1"
local proxy_port="$2"
echo "Validation du certificat proxy..."
local cert_info
cert_info=$(openssl s_client -connect "$proxy_server:$proxy_port" -servername "$proxy_server" < /dev/null 2>/dev/null | openssl x509 -text -noout)
if [[ -n "$cert_info" ]]; then
echo "Validation du certificat réussie"
echo "Sujet du certificat : $(echo "$cert_info" | grep "Subject:" | head -1)"
echo "Émetteur du certificat : $(echo "$cert_info" | grep "Issuer:" | head -1)"
return 0
else
echo "Validation du certificat échouée"
return 1
fi
}
# Exemple d'utilisation
configure_secure_proxy "Wi-Fi" "proxy-securise.entreprise.com" "8443" "utilisateursecurise" "motdepassesecurise"
validate_proxy_certificate "proxy-securise.entreprise.com" "8443"
Proxy Firewall SOCKS
Configuration de Base du Proxy SOCKS
#!/bin/bash
# Configurer le proxy firewall SOCKS
networksetup -setsocksfirewallproxy "Wi-Fi" "proxy-socks.entreprise.com" "1080" on "utilisateursocks" "motdepassesocks"
networksetup -setsocksfirewallproxystate "Wi-Fi" on
echo "Proxy firewall SOCKS configuré avec succès"
Gestion Avancée du Proxy SOCKS
#!/bin/bash
# Système de Configuration de Proxy SOCKS d'Entreprise
setup_socks_proxy() {
local network_service="$1"
local socks_server="$2"
local socks_port="$3"
local auth_required="$4"
local username="$5"
local password="$6"
echo "Configuration du proxy SOCKS : $socks_server:$socks_port"
# Tester la connectivité SOCKS
if command -v nc >/dev/null 2>&1; then
if nc -z "$socks_server" "$socks_port" 2>/dev/null; then
echo "✅ Connectivité proxy SOCKS vérifiée"
else
echo "⚠️ ATTENTION : Impossible d'atteindre le proxy SOCKS"
fi
fi
# Configurer le proxy SOCKS
if networksetup -setsocksfirewallproxy "$network_service" "$socks_server" "$socks_port" "$auth_required" "$username" "$password"; then
networksetup -setsocksfirewallproxystate "$network_service" on
echo "✅ Proxy firewall SOCKS configuré"
# Vérifier la configuration
echo "Détails du proxy SOCKS :"
networksetup -getsocksfirewallproxy "$network_service"
return 0
else
echo "❌ Échec de la configuration du proxy SOCKS"
return 1
fi
}
# Tester la fonctionnalité du proxy SOCKS
test_socks_proxy() {
local test_url="http://httpbin.org/ip"
echo "Test de la fonctionnalité du proxy SOCKS..."
# Test avec curl via le proxy SOCKS
if command -v curl >/dev/null 2>&1; then
local proxy_response
proxy_response=$(curl -s --socks5 "proxy-socks.entreprise.com:1080" "$test_url" 2>/dev/null)
if [[ -n "$proxy_response" ]]; then
echo "✅ Test du proxy SOCKS réussi"
echo "Réponse : $proxy_response"
else
echo "❌ Test du proxy SOCKS échoué"
fi
else
echo "curl non disponible pour les tests"
fi
}
# Utilisation
setup_socks_proxy "Wi-Fi" "proxy-socks.entreprise.com" "1080" "on" "utilisateursocks" "motdepassesocks"
test_socks_proxy
Support des Proxies Hérités (macOS < 13.0)
Configuration du Proxy Streaming
#!/bin/bash
# Configurer le proxy streaming (déprécié dans macOS 13.0+)
check_macos_version() {
local version
version=$(sw_vers -productVersion)
local major_version
major_version=$(echo "$version" | cut -d. -f1)
if [[ "$major_version" -ge 13 ]]; then
echo "⚠️ Proxy streaming non supporté sur macOS 13.0+"
return 1
fi
return 0
}
configure_streaming_proxy() {
if check_macos_version; then
networksetup -setstreamingproxy "Wi-Fi" "proxy-stream.entreprise.com" "8080" on "utilisateurstream" "motdepassestream"
networksetup -setstreamingproxystate "Wi-Fi" on
echo "✅ Proxy streaming configuré"
else
echo "❌ Proxy streaming non disponible sur cette version de macOS"
fi
}
configure_gopher_proxy() {
if check_macos_version; then
networksetup -setgopherproxy "Wi-Fi" "proxy-gopher.entreprise.com" "70" on "utilisateurgopher" "motdepassegopher"
networksetup -setgopherproxystate "Wi-Fi" on
echo "✅ Proxy Gopher configuré"
else
echo "❌ Proxy Gopher non disponible sur cette version de macOS"
fi
}
# Exécuter la configuration des proxies hérités
configure_streaming_proxy
configure_gopher_proxy
Système de Gestion de Proxy d'Entreprise
#!/bin/bash
# Système de Gestion de Proxy d'Entreprise MacFleet
# Configuration et surveillance complètes des proxies
# Configuration
PROXY_CONFIG_DIR="/etc/macfleet/proxy"
LOG_FILE="/var/log/macfleet_proxy.log"
BACKUP_DIR="/var/backups/macfleet/proxy"
API_ENDPOINT="https://api.macfleet.com/v1/proxy"
# Créer la structure des répertoires
setup_directories() {
mkdir -p "$PROXY_CONFIG_DIR" "$BACKUP_DIR"
touch "$LOG_FILE"
}
# Fonction de journalisation
log_action() {
echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" | tee -a "$LOG_FILE"
}
# Obtenir tous les services réseau
get_network_services() {
networksetup -listallnetworkservices | grep -v "^An asterisk"
}
# Sauvegarder les paramètres proxy actuels
backup_proxy_settings() {
local backup_file="$BACKUP_DIR/proxy_backup_$(date +%Y%m%d_%H%M%S).json"
echo "{" > "$backup_file"
echo " \"timestamp\": \"$(date -u +%Y-%m-%dT%H:%M:%SZ)\"," >> "$backup_file"
echo " \"hostname\": \"$(hostname)\"," >> "$backup_file"
echo " \"network_services\": {" >> "$backup_file"
local first=true
while IFS= read -r service; do
if [[ "$first" == "false" ]]; then
echo "," >> "$backup_file"
fi
first=false
echo " \"$service\": {" >> "$backup_file"
echo " \"web_proxy\": $(networksetup -getwebproxy "$service" | python3 -c "import sys,json; print(json.dumps(sys.stdin.read()))")" >> "$backup_file"
echo " \"secure_web_proxy\": $(networksetup -getsecurewebproxy "$service" | python3 -c "import sys,json; print(json.dumps(sys.stdin.read()))")" >> "$backup_file"
echo " \"socks_proxy\": $(networksetup -getsocksfirewallproxy "$service" | python3 -c "import sys,json; print(json.dumps(sys.stdin.read()))")" >> "$backup_file"
echo " }" >> "$backup_file"
done < <(get_network_services)
echo " }" >> "$backup_file"
echo "}" >> "$backup_file"
log_action "Paramètres proxy sauvegardés dans : $backup_file"
}
# Configurer le proxy depuis une configuration JSON
configure_from_json() {
local config_file="$1"
if [[ ! -f "$config_file" ]]; then
log_action "ERREUR : Fichier de configuration non trouvé : $config_file"
return 1
fi
log_action "Application de la configuration proxy depuis : $config_file"
# Analyser JSON et appliquer les paramètres avec jq ou python
if command -v jq >/dev/null 2>&1; then
# Utiliser jq pour l'analyse JSON
local networks
networks=$(jq -r '.networks | keys[]' "$config_file")
while IFS= read -r network; do
local web_proxy
web_proxy=$(jq -r ".networks[\"$network\"].web_proxy" "$config_file")
if [[ "$web_proxy" != "null" ]]; then
local server port auth username password
server=$(echo "$web_proxy" | jq -r '.server')
port=$(echo "$web_proxy" | jq -r '.port')
auth=$(echo "$web_proxy" | jq -r '.authentication')
username=$(echo "$web_proxy" | jq -r '.username')
password=$(echo "$web_proxy" | jq -r '.password')
networksetup -setwebproxy "$network" "$server" "$port" "$auth" "$username" "$password"
networksetup -setwebproxystate "$network" on
log_action "Proxy web configuré pour $network : $server:$port"
fi
done <<< "$networks"
else
log_action "ERREUR : jq non disponible pour l'analyse JSON"
return 1
fi
}
# Surveiller la connectivité proxy
monitor_proxy_connectivity() {
log_action "Démarrage de la surveillance de connectivité proxy"
while IFS= read -r service; do
local web_proxy_info
web_proxy_info=$(networksetup -getwebproxy "$service")
if echo "$web_proxy_info" | grep -q "Enabled: Yes"; then
local server port
server=$(echo "$web_proxy_info" | grep "Server:" | awk '{print $2}')
port=$(echo "$web_proxy_info" | grep "Port:" | awk '{print $2}')
if nc -z "$server" "$port" 2>/dev/null; then
log_action "✅ Connectivité proxy OK : $service ($server:$port)"
else
log_action "❌ Connectivité proxy ÉCHOUÉE : $service ($server:$port)"
fi
fi
done < <(get_network_services)
}
# Effacer tous les paramètres proxy
clear_all_proxies() {
log_action "Effacement de tous les paramètres proxy"
while IFS= read -r service; do
# Désactiver tous les types de proxy
networksetup -setwebproxystate "$service" off
networksetup -setsecurewebproxystate "$service" off
networksetup -setsocksfirewallproxystate "$service" off
# Pour les versions plus anciennes de macOS
networksetup -setstreamingproxystate "$service" off 2>/dev/null || true
networksetup -setgopherproxystate "$service" off 2>/dev/null || true
log_action "Proxies effacés pour : $service"
done < <(get_network_services)
}
# Générer un rapport de statut proxy
generate_proxy_report() {
local report_file="$PROXY_CONFIG_DIR/proxy_report_$(date +%Y%m%d_%H%M%S).txt"
{
echo "Rapport de Statut Proxy MacFleet"
echo "Généré : $(date)"
echo "Nom d'hôte : $(hostname)"
echo "=================================="
echo ""
while IFS= read -r service; do
echo "Service Réseau : $service"
echo "--------------------------------"
echo "Proxy Web :"
networksetup -getwebproxy "$service" | sed 's/^/ /'
echo ""
echo "Proxy Web Sécurisé :"
networksetup -getsecurewebproxy "$service" | sed 's/^/ /'
echo ""
echo "Proxy Firewall SOCKS :"
networksetup -getsocksfirewallproxy "$service" | sed 's/^/ /'
echo ""
echo "=================================="
echo ""
done < <(get_network_services)
} > "$report_file"
echo "Rapport proxy généré : $report_file"
log_action "Rapport de statut proxy généré : $report_file"
}
# Fonction principale
main() {
local action="${1:-status}"
setup_directories
log_action "Gestion Proxy MacFleet démarrée avec l'action : $action"
case "$action" in
"backup")
backup_proxy_settings
;;
"configure")
configure_from_json "$2"
;;
"monitor")
monitor_proxy_connectivity
;;
"clear")
backup_proxy_settings
clear_all_proxies
;;
"report")
generate_proxy_report
;;
"status"|*)
generate_proxy_report
monitor_proxy_connectivity
;;
esac
log_action "Gestion Proxy MacFleet terminée"
}
# Exécuter la fonction principale avec tous les arguments
main "$@"
Modèles de Configuration Proxy
Modèle de Proxy Web d'Entreprise
# /etc/macfleet/proxy/proxy_web_entreprise.conf
PROXY_TYPE="web"
NETWORK_SERVICE="Wi-Fi"
PROXY_SERVER="proxy.entreprise.com"
PROXY_PORT="8080"
AUTHENTICATION="on"
USERNAME="nom_utilisateur_employe"
PASSWORD="motdepasse_employe"
AUTO_CONFIG_URL=""
BYPASS_LIST="*.entreprise.com,localhost,127.0.0.1"
Modèle d'Entreprise Sécurisé
# /etc/macfleet/proxy/entreprise_securise.conf
PROXY_TYPE="secure_web"
NETWORK_SERVICE="Wi-Fi"
PROXY_SERVER="proxy-securise.entreprise.com"
PROXY_PORT="8443"
AUTHENTICATION="on"
USERNAME="utilisateur_securise"
PASSWORD="motdepasse_securise"
SSL_VERIFICATION="enabled"
CERTIFICATE_PINNING="enabled"
Modèle de Proxy SOCKS
# /etc/macfleet/proxy/proxy_socks.conf
PROXY_TYPE="socks"
NETWORK_SERVICE="Wi-Fi"
PROXY_SERVER="socks.entreprise.com"
PROXY_PORT="1080"
AUTHENTICATION="on"
USERNAME="utilisateur_socks"
PASSWORD="motdepasse_socks"
SOCKS_VERSION="5"
Considérations de Sécurité
Sécurité d'Authentification Proxy
#!/bin/bash
# Gestion sécurisée des identifiants proxy
encrypt_credentials() {
local username="$1"
local password="$2"
local keychain="MacFleet-Proxy"
# Stocker les identifiants dans le trousseau
security add-generic-password -a "$username" -s "proxy-credentials" -w "$password" -T "" "$keychain" 2>/dev/null
if [[ $? -eq 0 ]]; then
echo "✅ Identifiants stockés de façon sécurisée dans le trousseau"
else
echo "❌ Échec du stockage des identifiants dans le trousseau"
fi
}
# Récupérer les identifiants depuis le trousseau
decrypt_credentials() {
local username="$1"
local keychain="MacFleet-Proxy"
local password
password=$(security find-generic-password -a "$username" -s "proxy-credentials" -w "$keychain" 2>/dev/null)
if [[ -n "$password" ]]; then
echo "$password"
else
echo "ERREUR : Impossible de récupérer le mot de passe pour $username"
return 1
fi
}
Notes de Configuration Importantes
Noms des Services Réseau
- Les noms de service sont sensibles à la casse
- Utilisez des guillemets pour les noms avec espaces :
"Wi-Fi"
- Services communs :
"Wi-Fi"
,"Ethernet"
,"USB 10/100/1000 LAN"
Authentification Proxy
- Définir
authenticated
à"on"
pour activer l'authentification - Définir
authenticated
à"off"
pour désactiver l'authentification - Les identifiants seront demandés si l'authentification est activée mais non fournie
Compatibilité des Versions macOS
- Proxy Streaming : Déprécié dans macOS 13.0+
- Proxy Gopher : Déprécié dans macOS 13.0+
- Web/Web Sécurisé/SOCKS : Disponible sur toutes les versions macOS supportées
Gestion des Erreurs
- Les configurations proxy existantes montreront des erreurs lors de la reconfiguration
- Utiliser
networksetup -setproxystate
pour désactiver avant de reconfigurer - Tester la connectivité avant d'appliquer aux appareils de la flotte
Meilleures Pratiques
- Toujours sauvegarder les paramètres actuels avant les changements
- Tester la connectivité après la configuration proxy
- Utiliser un stockage sécurisé pour les identifiants proxy
- Surveiller la santé des proxies en continu
- Valider les certificats pour les proxies HTTPS
- Documenter les configurations pour la conformité
- Implémenter la journalisation pour les pistes d'audit
- Tester sur des appareils individuels avant le déploiement de flotte
N'oubliez pas de valider tous les scripts sur des appareils de test avant de les déployer sur votre environnement MacFleet, et assurez-vous que les serveurs proxy sont accessibles et correctement configurés pour votre infrastructure réseau.