Gérer le chiffrement FileVault sur macOS
FileVault offre un chiffrement complet du disque pour les appareils macOS, protégeant les données sensibles même si l'appareil est perdu ou volé. Ce tutoriel montre comment automatiser la gestion de FileVault sur votre MacFleet en utilisant des scripts en ligne de commande.
Comprendre FileVault
FileVault chiffre l'ensemble du disque de démarrage en utilisant le chiffrement XTS-AES-128 avec une clé de 256 bits. Les avantages clés incluent :
- Protection des données - Chiffre toutes les données sur le disque de démarrage
- Conformité - Répond aux exigences de sécurité d'entreprise
- Performance - Chiffrement accéléré par le matériel sur les Mac modernes
- Récupération - Plusieurs options de récupération disponibles
Commandes FileVault de base
Vérifier le statut de FileVault
#!/bin/bash
# Vérifier le statut actuel de FileVault
fdesetup status
# Obtenir des informations détaillées sur le chiffrement
diskutil apfs listCryptoUsers /
Activer FileVault
#!/bin/bash
# Commande de base pour activer FileVault
sudo fdesetup enable --user "username" --password "password"
# Activer avec un trousseau spécifique
sudo fdesetup enable --user "username" --password "password" --keychain /Library/Keychains/System.keychain
Désactiver FileVault
#!/bin/bash
# Commande de base pour désactiver FileVault
sudo fdesetup disable --user "username" --password "password"
Script de gestion FileVault d'entreprise
Script complet pour gérer FileVault sur votre MacFleet :
#!/bin/bash
# Script de gestion FileVault pour MacFleet
# Compatible avec macOS 10.14+
# Configuration
LOG_FILE="/var/log/filevault_management.log"
KEYCHAIN_PATH="/Library/Keychains/System.keychain"
# Fonction pour journaliser les messages
log_message() {
echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" | tee -a "$LOG_FILE"
}
# Fonction pour obtenir l'utilisateur actuel
get_current_user() {
stat -f "%Su" /dev/console
}
# Fonction pour vérifier si l'utilisateur a un token sécurisé
check_secure_token() {
local username="$1"
if sysadminctl -secureTokenStatus "$username" 2>/dev/null | grep -q "ENABLED"; then
return 0
else
return 1
fi
}
# Fonction pour vérifier le statut de FileVault
check_filevault_status() {
local status
status=$(fdesetup status)
if echo "$status" | grep -q "FileVault is On"; then
echo "enabled"
elif echo "$status" | grep -q "FileVault is Off"; then
echo "disabled"
elif echo "$status" | grep -q "Encryption in progress"; then
echo "encrypting"
elif echo "$status" | grep -q "Decryption in progress"; then
echo "decrypting"
else
echo "unknown"
fi
}
# Fonction pour obtenir le progrès du chiffrement
get_encryption_progress() {
fdesetup status | grep -o '[0-9]\+%' | head -1
}
# Fonction pour valider les identifiants utilisateur
validate_user_credentials() {
local username="$1"
local password="$2"
# Vérifier si l'utilisateur existe
if ! id "$username" &>/dev/null; then
log_message "✗ L'utilisateur n'existe pas : $username"
return 1
fi
# Vérifier si l'utilisateur a des privilèges admin
if ! dsmemberutil checkmembership -U "$username" -G admin &>/dev/null; then
log_message "✗ L'utilisateur n'est pas un administrateur : $username"
return 1
fi
# Vérifier si l'utilisateur a un token sécurisé
if ! check_secure_token "$username"; then
log_message "✗ L'utilisateur n'a pas de token sécurisé : $username"
return 1
fi
# Vérifier le mot de passe (vérification de base)
if [[ -z "$password" ]]; then
log_message "✗ Le mot de passe ne peut pas être vide pour l'utilisateur : $username"
return 1
fi
log_message "✓ Identifiants utilisateur validés : $username"
return 0
}
# Fonction pour activer FileVault
enable_filevault() {
local username="$1"
local password="$2"
local force_enable="$3"
log_message "Début de l'activation de FileVault pour l'utilisateur : $username"
# Vérifier le statut actuel
local current_status
current_status=$(check_filevault_status)
case "$current_status" in
"enabled")
log_message "! FileVault est déjà activé"
if [[ "$force_enable" != "true" ]]; then
return 0
fi
;;
"encrypting")
log_message "! Le chiffrement FileVault est déjà en cours"
local progress
progress=$(get_encryption_progress)
log_message " Progrès du chiffrement : ${progress:-Inconnu}"
return 0
;;
"decrypting")
log_message "✗ Impossible d'activer FileVault pendant qu'un déchiffrement est en cours"
return 1
;;
esac
# Valider les identifiants utilisateur
if ! validate_user_credentials "$username" "$password"; then
return 1
fi
# Activer FileVault
log_message "Activation de FileVault..."
if fdesetup enable -user "$username" -password "$password" -keychain "$KEYCHAIN_PATH" 2>/dev/null; then
log_message "✓ Commande d'activation de FileVault exécutée avec succès"
# Attendre un moment et vérifier le statut
sleep 5
local new_status
new_status=$(check_filevault_status)
case "$new_status" in
"enabled")
log_message "✓ FileVault est maintenant activé"
;;
"encrypting")
local progress
progress=$(get_encryption_progress)
log_message "✓ Chiffrement FileVault démarré (${progress:-0%})"
;;
*)
log_message "! Statut FileVault incertain : $new_status"
;;
esac
return 0
else
log_message "✗ Échec de l'activation de FileVault"
return 1
fi
}
# Fonction pour désactiver FileVault
disable_filevault() {
local username="$1"
local password="$2"
local force_disable="$3"
log_message "Début de la désactivation de FileVault pour l'utilisateur : $username"
# Vérifier le statut actuel
local current_status
current_status=$(check_filevault_status)
case "$current_status" in
"disabled")
log_message "! FileVault est déjà désactivé"
if [[ "$force_disable" != "true" ]]; then
return 0
fi
;;
"decrypting")
log_message "! Le déchiffrement FileVault est déjà en cours"
local progress
progress=$(get_encryption_progress)
log_message " Progrès du déchiffrement : ${progress:-Inconnu}"
return 0
;;
"encrypting")
log_message "✗ Impossible de désactiver FileVault pendant qu'un chiffrement est en cours"
return 1
;;
esac
# Valider les identifiants utilisateur
if ! validate_user_credentials "$username" "$password"; then
return 1
fi
# Désactiver FileVault
log_message "Désactivation de FileVault..."
if fdesetup disable -user "$username" -password "$password" 2>/dev/null; then
log_message "✓ Commande de désactivation de FileVault exécutée avec succès"
# Attendre un moment et vérifier le statut
sleep 5
local new_status
new_status=$(check_filevault_status)
case "$new_status" in
"disabled")
log_message "✓ FileVault est maintenant désactivé"
;;
"decrypting")
local progress
progress=$(get_encryption_progress)
log_message "✓ Déchiffrement FileVault démarré (${progress:-0%})"
;;
*)
log_message "! Statut FileVault incertain : $new_status"
;;
esac
return 0
else
log_message "✗ Échec de la désactivation de FileVault"
return 1
fi
}
# Fonction pour obtenir les informations système
get_system_info() {
log_message "=== Informations système ==="
log_message "Nom d'hôte : $(hostname)"
log_message "Version macOS : $(sw_vers -productVersion)"
log_message "Utilisateur actuel : $(get_current_user)"
log_message "Statut FileVault : $(check_filevault_status)"
# Obtenir les utilisateurs FileVault
local fv_users
fv_users=$(fdesetup list 2>/dev/null)
if [[ -n "$fv_users" ]]; then
log_message "Utilisateurs avec FileVault activé :"
echo "$fv_users" | while read -r line; do
log_message " $line"
done
fi
}
# Fonction pour afficher l'usage
usage() {
echo "Usage : $0 {enable|disable|status} [options]"
echo ""
echo "Commandes :"
echo " enable Activer FileVault"
echo " disable Désactiver FileVault"
echo " status Vérifier le statut de FileVault"
echo ""
echo "Options :"
echo " -u, --user USERNAME Spécifier le nom d'utilisateur"
echo " -p, --password PASSWORD Spécifier le mot de passe"
echo " -f, --force Forcer l'opération même si déjà dans l'état désiré"
echo " -h, --help Afficher ce message d'aide"
echo ""
echo "Exemples :"
echo " $0 enable -u admin -p password123"
echo " $0 disable -u admin -p password123 -f"
echo " $0 status"
}
# Fonction principale
main() {
local command="$1"
local username=""
local password=""
local force="false"
# Analyser les arguments
shift
while [[ $# -gt 0 ]]; do
case $1 in
-u|--user)
username="$2"
shift 2
;;
-p|--password)
password="$2"
shift 2
;;
-f|--force)
force="true"
shift
;;
-h|--help)
usage
exit 0
;;
*)
echo "Option inconnue : $1"
usage
exit 1
;;
esac
done
# Exécuter la commande
case "$command" in
"enable")
if [[ -z "$username" ]] || [[ -z "$password" ]]; then
echo "Erreur : Nom d'utilisateur et mot de passe requis pour la commande enable"
usage
exit 1
fi
log_message "=== Début de l'opération d'activation de FileVault ==="
get_system_info
if enable_filevault "$username" "$password" "$force"; then
log_message "=== Opération d'activation de FileVault terminée avec succès ==="
exit 0
else
log_message "=== Échec de l'opération d'activation de FileVault ==="
exit 1
fi
;;
"disable")
if [[ -z "$username" ]] || [[ -z "$password" ]]; then
echo "Erreur : Nom d'utilisateur et mot de passe requis pour la commande disable"
usage
exit 1
fi
log_message "=== Début de l'opération de désactivation de FileVault ==="
get_system_info
if disable_filevault "$username" "$password" "$force"; then
log_message "=== Opération de désactivation de FileVault terminée avec succès ==="
exit 0
else
log_message "=== Échec de l'opération de désactivation de FileVault ==="
exit 1
fi
;;
"status")
get_system_info
exit 0
;;
*)
echo "Erreur : Commande invalide : $command"
usage
exit 1
;;
esac
}
# Exécuter la fonction principale
main "$@"
Scripts FileVault rapides
Script d'activation simple
#!/bin/bash
USERNAME="admin"
PASSWORD="votre_mot_de_passe_ici"
if fdesetup enable -user "$USERNAME" -password "$PASSWORD"; then
echo "FileVault activé avec succès"
else
echo "Échec de l'activation de FileVault"
exit 1
fi
Vérification simple du statut
#!/bin/bash
STATUS=$(fdesetup status)
echo "Statut FileVault : $STATUS"
if echo "$STATUS" | grep -q "FileVault is On"; then
echo "✓ FileVault est activé"
exit 0
elif echo "$STATUS" | grep -q "FileVault is Off"; then
echo "✗ FileVault est désactivé"
exit 1
else
echo "! Statut FileVault incertain"
exit 2
fi
Gestion des clés de récupération
Générer une clé de récupération personnelle
#!/bin/bash
# Activer FileVault avec clé de récupération personnelle
sudo fdesetup enable -user "$USERNAME" -password "$PASSWORD" -outputplist > /tmp/filevault_key.plist
# Extraire la clé de récupération
RECOVERY_KEY=$(grep -A1 "RecoveryKey" /tmp/filevault_key.plist | tail -1 | sed 's/.*<string>\(.*\)<\/string>.*/\1/')
echo "Clé de récupération : $RECOVERY_KEY"
# Stocker la clé de récupération en sécurité
echo "$RECOVERY_KEY" | sudo tee /var/root/filevault_recovery_key.txt
sudo chmod 600 /var/root/filevault_recovery_key.txt
# Nettoyer
rm -f /tmp/filevault_key.plist
Activer la clé de récupération institutionnelle
#!/bin/bash
# Créer une clé de récupération institutionnelle
CERT_PATH="/path/to/institutional_certificate.cer"
if [[ -f "$CERT_PATH" ]]; then
sudo fdesetup enable -user "$USERNAME" -password "$PASSWORD" -certificate "$CERT_PATH"
echo "FileVault activé avec clé de récupération institutionnelle"
else
echo "Certificat institutionnel non trouvé : $CERT_PATH"
exit 1
fi
Dépannage des problèmes courants
Corriger les problèmes de token sécurisé
#!/bin/bash
USERNAME="admin"
# Accorder un token sécurisé à l'utilisateur
sudo sysadminctl -secureTokenOn "$USERNAME" -password -
# Vérifier le token sécurisé
if sysadminctl -secureTokenStatus "$USERNAME" | grep -q "ENABLED"; then
echo "✓ Token sécurisé activé pour $USERNAME"
else
echo "✗ Échec de l'activation du token sécurisé pour $USERNAME"
fi
Gérer l'erreur de mot de passe vide
#!/bin/bash
USERNAME="admin"
# Vérifier si l'utilisateur a un mot de passe défini
if dscl . -read "/Users/$USERNAME" AuthenticationAuthority | grep -q "No such key"; then
echo "L'utilisateur $USERNAME n'a pas de mot de passe défini"
echo "Définition du mot de passe..."
sudo dscl . -passwd "/Users/$USERNAME" "" "nouveau_mot_de_passe_ici"
fi
Surveillance et rapports
Rapport de statut FileVault
#!/bin/bash
# Générer un rapport de statut FileVault
REPORT_FILE="/tmp/filevault_report.txt"
{
echo "=== Rapport de statut FileVault ==="
echo "Généré : $(date)"
echo "Nom d'hôte : $(hostname)"
echo ""
echo "=== Statut FileVault ==="
fdesetup status
echo ""
echo "=== Utilisateurs activés ==="
fdesetup list
echo ""
echo "=== Statut du token sécurisé ==="
for user in $(dscl . -list /Users | grep -v '^_'); do
if [[ "$user" != "daemon" ]] && [[ "$user" != "nobody" ]]; then
token_status=$(sysadminctl -secureTokenStatus "$user" 2>/dev/null | grep -o "ENABLED\|DISABLED")
echo "Utilisateur : $user - Token : ${token_status:-INCONNU}"
fi
done
} > "$REPORT_FILE"
echo "Rapport généré : $REPORT_FILE"
Solutions aux erreurs courantes
Erreur | Cause | Solution |
---|---|---|
"Blank password" | L'utilisateur n'a pas de mot de passe | Définir un mot de passe avec dscl . -passwd |
"Master keychain found" | Ambiguïté du trousseau | Ajouter le paramètre -keychain |
"Secure token required" | L'utilisateur n'a pas de token sécurisé | Accorder un token avec sysadminctl |
"Already encrypted" | FileVault déjà activé | Utiliser -force ou vérifier le statut d'abord |
"Encryption in progress" | Opération concurrente | Attendre la fin |
Bonnes pratiques de sécurité
- Utiliser des mots de passe forts pour les comptes avec FileVault activé
- Stocker les clés de récupération en sécurité dans la gestion des clés d'entreprise
- Tester les scripts sur des appareils isolés avant le déploiement en flotte
- Surveiller le progrès du chiffrement pour assurer la completion
- Sauvegarder les clés de récupération avant de faire des modifications
- Valider les permissions utilisateur avant de tenter des opérations
Considérations de performance
- Le chiffrement initial peut prendre plusieurs heures
- Les performances du système peuvent être impactées pendant le chiffrement
- Planifier les opérations pendant les fenêtres de maintenance
- Surveiller l'espace disque (le chiffrement nécessite de l'espace libre)
- Considérer les différences de performance SSD vs HDD
Notes importantes
- FileVault nécessite des privilèges administrateur et des tokens sécurisés
- Les clés de récupération sont essentielles pour la récupération des données
- Le chiffrement/déchiffrement ne peut pas être interrompu en sécurité
- Tester tous les scripts minutieusement avant l'utilisation en production
- Toujours avoir un plan de récupération de sauvegarde