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 | Écriture | Exécution | Octal | Symbolique |
---|---|---|---|---|
✗ | ✗ | ✗ | 0 | --- |
✗ | ✗ | ✓ | 1 | --x |
✗ | ✓ | ✗ | 2 | -w- |
✗ | ✓ | ✓ | 3 | -wx |
✓ | ✗ | ✗ | 4 | r-- |
✓ | ✗ | ✓ | 5 | r-x |
✓ | ✓ | ✗ | 6 | rw- |
✓ | ✓ | ✓ | 7 | rwx |
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'Usage | Octal | Symbolique | Description |
---|---|---|---|
Fichier privé | 600 | rw------- | Propriétaire lecture/écriture uniquement |
Fichier partagé | 644 | rw-r--r-- | Propriétaire écriture, autres lecture |
Exécutable | 755 | rwxr-xr-x | Propriétaire complet, autres lecture/exécution |
Répertoire sécurisé | 700 | rwx------ | Accès propriétaire uniquement |
Répertoire partagé | 755 | rwxr-xr-x | Propriétaire complet, autres lecture/liste |
Répertoire d'équipe | 775 | rwxrwxr-x | Proprié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