Guide

Nouvelles mises à jour et améliorations de Macfleet.

Protection de Fichiers d'Entreprise sur macOS

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

Comprendre les Méthodes de Protection de Fichiers macOS

macOS offre plusieurs mécanismes de protection de fichiers :

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

Commandes de Protection de Fichiers Basiques

Verrouiller un Fichier Unique

#!/bin/bash

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

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

Déverrouiller un Fichier Unique

#!/bin/bash

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

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

Vérifier le Statut de Protection d'un Fichier

#!/bin/bash

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

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

Système de Protection de Fichiers d'Entreprise

#!/bin/bash

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

# Configuration
MACFLEET_DIR="/etc/macfleet"
POLICIES_DIR="$MACFLEET_DIR/file_policies"
REPORTS_DIR="$MACFLEET_DIR/reports"
COMPLIANCE_DIR="$MACFLEET_DIR/compliance"
AUDIT_DIR="$MACFLEET_DIR/audit"
LOG_FILE="/var/log/macfleet_file_protection.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"
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Niveaux de Protection Expliqués

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

Cas d'Usage de Protection de Fichiers

Protéger les Applications Critiques

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

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

Protection de Configuration Système

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

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

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

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

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

Procédures d'Urgence

Déverrouillage Système Complet

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

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

Récupération de Fichiers

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

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

Considérations de Sécurité Importantes

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

Conformité et Audit

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

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

Tests et Validation

Avant le déploiement en entreprise :

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

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

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

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

Comprendre les Opérations d'Ouverture d'Entreprise

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

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

Opérations d'Ouverture de Base

Ouverture de Fichier Simple

#!/bin/bash

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

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

Ouverture de Fichier avec Application Spécifique

#!/bin/bash

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

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

Ouverture de Dossier

#!/bin/bash

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

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

Système de Gestion d'Ouverture d'Entreprise

#!/bin/bash

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

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

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

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

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

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

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

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

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

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

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

Commandes de Référence Rapide

Opérations de Fichier Unique

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

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

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

Opérations de Dossier

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

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

Exemples d'Intégration

Intégration JAMF Pro

#!/bin/bash

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

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

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

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

exit $?

Dépannage

Problèmes Courants et Solutions

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

Analyse des Journaux

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

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

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

Meilleures Pratiques

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

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

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

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

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

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

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

Opérations de Déplacement de Base

Déplacement de Fichier Simple

#!/bin/bash

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

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

Déplacement de Répertoire de Base

#!/bin/bash

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

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

Renommage de Fichier et Dossier

#!/bin/bash

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

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

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

#!/bin/bash

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

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

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

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

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

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

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

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

Commandes de Référence Rapide

Opérations de Fichier Unique

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

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

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

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

Opérations de Répertoire

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

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

Opérations de Renommage

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

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

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

Exemples d'Intégration

Intégration JAMF Pro

#!/bin/bash

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

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

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

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

exit $?

Dépannage

Problèmes Courants et Solutions

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

Meilleures Pratiques

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

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

Gestion des Permissions de Fichiers et Dossiers sur macOS

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

Comprendre le Système de Permissions macOS

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

Types de Permissions

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

Catégories d'Utilisateurs

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

Représentations des Permissions

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

Gestion Basique des Permissions

Afficher les Permissions de Fichier/Dossier

#!/bin/bash

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

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

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

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

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

Définir les Permissions avec la Notation Octale

#!/bin/bash

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

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

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

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

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

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

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

Définir les Permissions avec la Notation Symbolique

#!/bin/bash

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

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

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

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

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

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

Gestion de la Propriété

Changer le Propriétaire du Fichier/Dossier

#!/bin/bash

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

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

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

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

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

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

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

Changer le Groupe du Fichier/Dossier

#!/bin/bash

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

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

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

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

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

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

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

Gestion Récursive des Permissions

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

#!/bin/bash

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

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

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

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

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

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

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

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

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

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

Script de Gestion des Permissions d'Entreprise

#!/bin/bash

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

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

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

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

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

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

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

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

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

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

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

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

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

Scénarios de Permissions Courants

Stockage de Fichiers Sécurisé

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

Répertoire d'Équipe Partagé

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

Déploiement d'Applications

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

Guide de Référence des Permissions

Modèles de Permissions Courants

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

Référence des Commandes Rapides

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

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

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

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

Considérations de Sécurité

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

Dépannage

Erreurs de Permission Refusée

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

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

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

Problèmes de Propriété

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

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

Notes Importantes

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