Gestion d'Entreprise de l'Historique de Connexion sur macOS
Surveillez et analysez l'activité de connexion des utilisateurs sur vos appareils MacFleet en utilisant des outils en ligne de commande avancés. Ce tutoriel couvre le suivi de l'historique de connexion, l'analyse des sessions utilisateur, l'audit de sécurité, et la surveillance de conformité de niveau entreprise avec des capacités de rapport complètes.
Comprendre la Gestion de l'Historique de Connexion macOS
macOS fournit plusieurs outils puissants pour traquer l'activité de connexion des utilisateurs :
who
- Affiche les utilisateurs actuellement connectés et un bref historique de connexionlast
- Affiche l'historique de connexion détaillé avec les informations de sessiondscl
- Utilitaire en ligne de commande des Services d'Annuaire pour la gestion des utilisateursw
- Informations étendues d'activité utilisateur avec la charge systèmefinger
- Informations utilisateur et détails de connexion (si disponible)
Ces outils accèdent aux journaux système et aux bases de données utilisateur pour fournir des capacités de suivi de connexion complètes.
Commandes de Base de l'Historique de Connexion
Historique de Connexion Bref avec who
#!/bin/bash
# Afficher l'historique de connexion bref
get_brief_login_history() {
echo "=== Historique de Connexion Bref ==="
who
echo ""
# Alternative avec horodatages
echo "=== Sessions Utilisateur Actuelles ==="
who -u
}
# Exécuter la vérification de connexion de base
get_brief_login_history
Historique de Connexion Détaillé avec last
#!/bin/bash
# Afficher l'historique de connexion détaillé
get_detailed_login_history() {
echo "=== Historique de Connexion Détaillé ==="
last
echo ""
# Afficher les 10 dernières entrées de connexion
echo "=== 10 Dernières Sessions de Connexion ==="
last -10
echo ""
# Afficher l'historique de connexion d'aujourd'hui
echo "=== Sessions de Connexion d'Aujourd'hui ==="
last -t "$(date '+%Y%m%d%H%M%S')"
}
# Exécuter la vérification de connexion détaillée
get_detailed_login_history
Vérifier l'Historique de Connexion d'un Utilisateur Spécifique
#!/bin/bash
# Obtenir l'heure de dernière connexion pour un utilisateur spécifique
check_user_login() {
local username="$1"
if [[ -z "$username" ]]; then
echo "Usage : check_user_login <nom_utilisateur>"
return 1
fi
echo "=== Dernière Connexion pour l'Utilisateur : $username ==="
last -1 "$username"
echo ""
# Informations utilisateur supplémentaires
echo "=== Informations du Compte Utilisateur ==="
dscl . -read "/Users/$username" RealName 2>/dev/null || echo "Utilisateur non trouvé"
dscl . -read "/Users/$username" UniqueID 2>/dev/null || echo "UID non disponible"
}
# Exemple d'utilisation
# check_user_login "jean.dupont"
Analyse Avancée de l'Historique de Connexion
Analyse Complète des Sessions Utilisateur
#!/bin/bash
# Analyse avancée de l'historique de connexion avec insights de sécurité
analyze_login_patterns() {
echo "=== Analyse Complète de Connexion ==="
echo "Généré : $(date)"
echo "Nom d'hôte : $(hostname)"
echo "=================================="
echo ""
# Sessions actives actuelles
echo "1. SESSIONS UTILISATEUR ACTIVES :"
echo "--------------------------------"
who -u | while IFS= read -r line; do
echo " $line"
done
echo ""
# Activité de connexion récente (dernières 24 heures)
echo "2. ACTIVITÉ DE CONNEXION RÉCENTE (24 heures) :"
echo "----------------------------------------------"
local yesterday
yesterday=$(date -v-1d '+%Y%m%d%H%M%S' 2>/dev/null || date -d 'yesterday' '+%Y%m%d%H%M%S' 2>/dev/null)
if [[ -n "$yesterday" ]]; then
last -t "$yesterday" | head -20
else
last -20
fi
echo ""
# Tentatives de connexion échouées (si disponible dans les journaux)
echo "3. TENTATIVES DE CONNEXION ÉCHOUÉES :"
echo "------------------------------------"
grep "authentication failure" /var/log/system.log 2>/dev/null | tail -10 || echo "Aucun échec récent trouvé"
echo ""
# Analyse de fréquence de connexion
echo "4. FRÉQUENCE DE CONNEXION PAR UTILISATEUR :"
echo "------------------------------------------"
last | grep -v "wtmp begins" | awk '{print $1}' | sort | uniq -c | sort -nr | head -10
echo ""
# Analyse des connexions distantes vs locales
echo "5. ANALYSE SOURCE DE CONNEXION :"
echo "-------------------------------"
echo "Connexions console :"
last | grep -c "console" || echo "0"
echo "Connexions distantes :"
last | grep -v "console" | grep -v "wtmp begins" | wc -l | tr -d ' '
}
# Exécuter l'analyse complète
analyze_login_patterns
Découverte des Comptes Utilisateur
#!/bin/bash
# Lister tous les utilisateurs et leur statut de connexion
discover_users() {
echo "=== Découverte des Comptes Utilisateur ==="
echo ""
# Tous les utilisateurs des services d'annuaire
echo "1. TOUS LES UTILISATEURS SYSTÈME :"
echo "---------------------------------"
dscl . list /Users | grep -v "^_" | grep -v "^root" | grep -v "^daemon" | grep -v "^nobody"
echo ""
# Utilisateurs avec UID >= 500 (typiquement utilisateurs réguliers)
echo "2. COMPTES UTILISATEUR RÉGULIERS :"
echo "---------------------------------"
dscl . list /Users UniqueID | awk '$2 >= 500 {print $1, "(UID: " $2 ")"}'
echo ""
# Utilisateurs avec activité de connexion récente
echo "3. UTILISATEURS AVEC ACTIVITÉ DE CONNEXION RÉCENTE :"
echo "---------------------------------------------------"
last | awk '{print $1}' | sort | uniq | grep -v "wtmp" | grep -v "^$" | head -10
echo ""
# Répertoires personnels
echo "4. RÉPERTOIRES PERSONNELS UTILISATEUR :"
echo "---------------------------------------"
ls -la /Users/ | grep -v "^total" | grep -v "Shared" | awk '{print $9, $3, $4}' | grep -v "^$"
}
# Exécuter la découverte des utilisateurs
discover_users
Système de Gestion de l'Historique de Connexion d'Entreprise
#!/bin/bash
# Système de Gestion de l'Historique de Connexion d'Entreprise MacFleet
# Surveillance complète de l'activité utilisateur et audit de sécurité
# Configuration
LOG_FILE="/var/log/macfleet_login_history.log"
REPORT_DIR="/var/reports/macfleet/login_history"
CONFIG_FILE="/etc/macfleet/login_monitoring.conf"
ALERT_THRESHOLD_FAILED_LOGINS=5
ALERT_THRESHOLD_UNUSUAL_HOURS=22 # Alerte pour connexions après 22h
# Créer la structure des répertoires
setup_directories() {
mkdir -p "$(dirname "$LOG_FILE")" "$REPORT_DIR" "$(dirname "$CONFIG_FILE")"
touch "$LOG_FILE"
}
# Fonction de journalisation
log_action() {
echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" | tee -a "$LOG_FILE"
}
# Générer un rapport de connexion complet
generate_login_report() {
local report_file="$REPORT_DIR/login_report_$(date +%Y%m%d_%H%M%S).json"
log_action "Génération du rapport d'historique de connexion complet : $report_file"
{
echo "{"
echo " \"report_type\": \"login_history\","
echo " \"timestamp\": \"$(date -u +%Y-%m-%dT%H:%M:%SZ)\","
echo " \"hostname\": \"$(hostname)\","
echo " \"system_info\": {"
echo " \"macos_version\": \"$(sw_vers -productVersion)\","
echo " \"uptime\": \"$(uptime | awk -F'up ' '{print $2}' | awk -F', ' '{print $1}')\","
echo " \"current_users\": $(who | wc -l | tr -d ' ')"
echo " },"
# Sessions actives
echo " \"active_sessions\": ["
local first_session=true
who -u | while IFS= read -r line; do
if [[ "$first_session" == "false" ]]; then
echo ","
fi
first_session=false
local user terminal login_time pid
user=$(echo "$line" | awk '{print $1}')
terminal=$(echo "$line" | awk '{print $2}')
login_time=$(echo "$line" | awk '{print $3, $4}')
pid=$(echo "$line" | awk '{print $6}')
echo " {"
echo " \"user\": \"$user\","
echo " \"terminal\": \"$terminal\","
echo " \"login_time\": \"$login_time\","
echo " \"pid\": \"$pid\""
echo -n " }"
done
echo ""
echo " ],"
# Historique de connexion récent
echo " \"recent_logins\": ["
local first_login=true
last -20 | grep -v "wtmp begins" | while IFS= read -r line; do
if [[ -n "$line" ]]; then
if [[ "$first_login" == "false" ]]; then
echo ","
fi
first_login=false
local user terminal source login_date login_time logout_info
user=$(echo "$line" | awk '{print $1}')
terminal=$(echo "$line" | awk '{print $2}')
source=$(echo "$line" | awk '{print $3}')
login_date=$(echo "$line" | awk '{print $4, $5, $6}')
login_time=$(echo "$line" | awk '{print $7}')
logout_info=$(echo "$line" | awk '{print $9, $10}')
echo " {"
echo " \"user\": \"$user\","
echo " \"terminal\": \"$terminal\","
echo " \"source\": \"$source\","
echo " \"login_date\": \"$login_date\","
echo " \"login_time\": \"$login_time\","
echo " \"logout_info\": \"$logout_info\""
echo -n " }"
fi
done
echo ""
echo " ],"
# Statistiques utilisateur
echo " \"user_statistics\": {"
local total_users
total_users=$(dscl . list /Users | grep -v "^_" | wc -l | tr -d ' ')
echo " \"total_system_users\": $total_users,"
local regular_users
regular_users=$(dscl . list /Users UniqueID | awk '$2 >= 500' | wc -l | tr -d ' ')
echo " \"regular_users\": $regular_users,"
local active_login_users
active_login_users=$(last | awk '{print $1}' | sort | uniq | grep -v "wtmp" | grep -v "^$" | wc -l | tr -d ' ')
echo " \"users_with_login_history\": $active_login_users"
echo " }"
echo "}"
} > "$report_file"
log_action "Rapport d'historique de connexion généré avec succès"
echo "$report_file"
}
# Surveiller l'activité de connexion suspecte
monitor_suspicious_activity() {
log_action "Démarrage de la surveillance d'activité de connexion suspecte..."
local alerts=()
# Vérifier les heures de connexion inhabituelles (configurable)
local current_hour
current_hour=$(date +%H)
if [[ "$current_hour" -ge "$ALERT_THRESHOLD_UNUSUAL_HOURS" ]]; then
local late_logins
late_logins=$(who | wc -l | tr -d ' ')
if [[ "$late_logins" -gt 0 ]]; then
alerts+=("Activité de connexion nocturne détectée : $late_logins sessions actives après $ALERT_THRESHOLD_UNUSUAL_HOURS:00")
fi
fi
# Vérifier les tentatives de connexion échouées multiples
local failed_logins
failed_logins=$(grep "authentication failure" /var/log/system.log 2>/dev/null | grep "$(date '+%b %d')" | wc -l | tr -d ' ')
if [[ "$failed_logins" -ge "$ALERT_THRESHOLD_FAILED_LOGINS" ]]; then
alerts+=("Nombre élevé de tentatives de connexion échouées aujourd'hui : $failed_logins échecs")
fi
# Vérifier les connexions root
local root_logins
root_logins=$(last | grep "^root " | head -5 | wc -l | tr -d ' ')
if [[ "$root_logins" -gt 0 ]]; then
alerts+=("Activité de connexion root récente détectée : $root_logins sessions")
fi
# Vérifier les connexions simultanées du même utilisateur
local duplicate_users
duplicate_users=$(who | awk '{print $1}' | sort | uniq -d)
if [[ -n "$duplicate_users" ]]; then
alerts+=("Sessions simultanées multiples détectées pour les utilisateurs : $duplicate_users")
fi
# Rapporter les alertes
if [[ ${#alerts[@]} -eq 0 ]]; then
log_action "✅ Aucune activité de connexion suspecte détectée"
return 0
else
log_action "⚠️ Alertes d'activité de connexion suspecte :"
for alert in "${alerts[@]}"; do
log_action " - $alert"
done
return 1
fi
}
# Analyser les modèles de connexion pour insights de sécurité
analyze_security_patterns() {
log_action "Analyse des modèles de connexion pour insights de sécurité..."
echo "=== Analyse des Modèles de Sécurité ==="
echo ""
# Fréquence de connexion par jour de la semaine
echo "1. FRÉQUENCE DE CONNEXION PAR JOUR :"
echo "-----------------------------------"
last | grep -v "wtmp begins" | awk '{print $4}' | sort | uniq -c | sort -nr
echo ""
# Utilisateurs les plus actifs
echo "2. UTILISATEURS LES PLUS ACTIFS :"
echo "--------------------------------"
last | grep -v "wtmp begins" | awk '{print $1}' | sort | uniq -c | sort -nr | head -10
echo ""
# Analyse des sources de connexion
echo "3. SOURCES DE CONNEXION :"
echo "------------------------"
echo "Connexions console : $(last | grep -c "console")"
echo "Connexions distantes : $(last | grep -v "console" | grep -v "wtmp begins" | wc -l | tr -d ' ')"
echo ""
# Analyse de durée de session
echo "4. MODÈLES DE SESSION :"
echo "----------------------"
local avg_sessions
avg_sessions=$(last | grep -v "wtmp begins" | grep -v "still logged in" | wc -l | tr -d ' ')
echo "Total sessions terminées : $avg_sessions"
local active_sessions
active_sessions=$(who | wc -l | tr -d ' ')
echo "Sessions actuellement actives : $active_sessions"
echo ""
# Analyse basée sur l'heure
echo "5. MODÈLES D'HEURE DE CONNEXION :"
echo "--------------------------------"
echo "Heures de bureau (9-17) : $(last | awk '{print $7}' | grep -E '^(09|1[0-7]):' | wc -l | tr -d ' ')"
echo "Après les heures (18-08) : $(last | awk '{print $7}' | grep -E '^(1[8-9]|2[0-3]|0[0-8]):' | wc -l | tr -d ' ')"
}
# Audit d'accès utilisateur
perform_user_audit() {
local audit_file="$REPORT_DIR/user_audit_$(date +%Y%m%d_%H%M%S).txt"
log_action "Exécution d'un audit d'accès utilisateur complet : $audit_file"
{
echo "Rapport d'Audit d'Accès Utilisateur MacFleet"
echo "Généré : $(date)"
echo "Nom d'hôte : $(hostname)"
echo "============================================="
echo ""
echo "APERÇU SYSTÈME :"
echo "----------------"
echo "Version macOS : $(sw_vers -productVersion)"
echo "Build : $(sw_vers -buildVersion)"
echo "Temps de fonctionnement système : $(uptime | awk -F'up ' '{print $2}' | awk -F', ' '{print $1}')"
echo "Date/Heure actuelle : $(date)"
echo ""
echo "RÉSUMÉ COMPTES UTILISATEUR :"
echo "---------------------------"
echo "Total utilisateurs système : $(dscl . list /Users | wc -l | tr -d ' ')"
echo "Utilisateurs réguliers (UID >= 500) : $(dscl . list /Users UniqueID | awk '$2 >= 500' | wc -l | tr -d ' ')"
echo "Actuellement connectés : $(who | wc -l | tr -d ' ')"
echo ""
echo "INFORMATIONS UTILISATEUR DÉTAILLÉES :"
echo "------------------------------------"
dscl . list /Users UniqueID | awk '$2 >= 500' | while read -r username uid; do
echo "Utilisateur : $username (UID : $uid)"
# Nom réel
local real_name
real_name=$(dscl . -read "/Users/$username" RealName 2>/dev/null | grep "RealName:" | cut -d' ' -f2-)
echo " Nom réel : ${real_name:-"Non défini"}"
# Répertoire personnel
local home_dir
home_dir=$(dscl . -read "/Users/$username" NFSHomeDirectory 2>/dev/null | grep "NFSHomeDirectory:" | cut -d' ' -f2)
echo " Répertoire personnel : ${home_dir:-"Non défini"}"
# Dernière connexion
local last_login
last_login=$(last -1 "$username" 2>/dev/null | head -1 | awk '{print $4, $5, $6, $7}')
echo " Dernière connexion : ${last_login:-"Jamais"}"
# Statut du compte
local account_disabled
account_disabled=$(dscl . -read "/Users/$username" AuthenticationAuthority 2>/dev/null | grep -c "DisabledUser" || echo "0")
if [[ "$account_disabled" -gt 0 ]]; then
echo " Statut : DÉSACTIVÉ"
else
echo " Statut : Actif"
fi
echo ""
done
echo "ACTIVITÉ DE CONNEXION RÉCENTE :"
echo "------------------------------"
last -50
echo ""
echo "RECOMMANDATIONS DE SÉCURITÉ :"
echo "----------------------------"
# Vérifier les utilisateurs sans activité de connexion récente
local inactive_users
inactive_users=$(dscl . list /Users UniqueID | awk '$2 >= 500 {print $1}' | while read -r user; do
if ! last "$user" | grep -q "$(date '+%b')" 2>/dev/null; then
echo "$user"
fi
done)
if [[ -n "$inactive_users" ]]; then
echo "• Considérer la révision des comptes utilisateur inactifs :"
echo "$inactive_users" | while read -r user; do
echo " - $user"
done
else
echo "• Tous les utilisateurs ont une activité de connexion récente"
fi
# Vérifier les utilisateurs admin
local admin_users
admin_users=$(dscl . -read /Groups/admin GroupMembership 2>/dev/null | cut -d' ' -f2-)
if [[ -n "$admin_users" ]]; then
echo "• Réviser régulièrement l'accès utilisateur admin :"
for admin in $admin_users; do
echo " - $admin"
done
fi
} > "$audit_file"
log_action "Audit d'accès utilisateur terminé avec succès"
echo "$audit_file"
}
# Exporter les données de connexion pour analyse externe
export_login_data() {
local export_format="${1:-json}" # json, csv, xml
local export_file="$REPORT_DIR/login_export_$(date +%Y%m%d_%H%M%S).$export_format"
log_action "Exportation des données de connexion au format $export_format : $export_file"
case "$export_format" in
"csv")
{
echo "Utilisateur,Terminal,Source,DateConnexion,HeureConnexion,InfoDeconnexion,Duree"
last -100 | grep -v "wtmp begins" | while IFS= read -r line; do
if [[ -n "$line" ]]; then
echo "$line" | awk -F' ' '{
user=$1; terminal=$2; source=$3;
login_date=$4" "$5" "$6; login_time=$7;
logout_info=$9" "$10; duration=$8;
print user","terminal","source","login_date","login_time","logout_info","duration
}'
fi
done
} > "$export_file"
;;
"json")
generate_login_report > /dev/null
cp "$REPORT_DIR"/login_report_*.json "$export_file" 2>/dev/null || echo "{\"error\": \"Aucun rapport récent trouvé\"}" > "$export_file"
;;
"xml")
{
echo '<?xml version="1.0" encoding="UTF-8"?>'
echo '<login_history>'
echo " <generated>$(date -u +%Y-%m-%dT%H:%M:%SZ)</generated>"
echo " <hostname>$(hostname)</hostname>"
echo " <sessions>"
last -50 | grep -v "wtmp begins" | while IFS= read -r line; do
if [[ -n "$line" ]]; then
local user terminal source login_date login_time
user=$(echo "$line" | awk '{print $1}')
terminal=$(echo "$line" | awk '{print $2}')
source=$(echo "$line" | awk '{print $3}')
login_date=$(echo "$line" | awk '{print $4, $5, $6}')
login_time=$(echo "$line" | awk '{print $7}')
echo " <session>"
echo " <user>$user</user>"
echo " <terminal>$terminal</terminal>"
echo " <source>$source</source>"
echo " <login_date>$login_date</login_date>"
echo " <login_time>$login_time</login_time>"
echo " </session>"
fi
done
echo " </sessions>"
echo '</login_history>'
} > "$export_file"
;;
*)
log_action "ERREUR : Format d'exportation non supporté : $export_format"
return 1
;;
esac
log_action "Données de connexion exportées avec succès"
echo "$export_file"
}
# Fonction de gestion principale
main() {
local action="${1:-report}"
local parameter="$2"
setup_directories
log_action "Gestion Historique de Connexion MacFleet démarrée avec l'action : $action"
case "$action" in
"brief")
who
;;
"detailed")
last
;;
"user")
if [[ -n "$parameter" ]]; then
last -1 "$parameter"
else
echo "Usage : $0 user <nom_utilisateur>"
exit 1
fi
;;
"users")
dscl . list /Users | grep -v "^_"
;;
"analyze")
analyze_security_patterns
;;
"monitor")
monitor_suspicious_activity
;;
"audit")
perform_user_audit
;;
"export")
export_login_data "$parameter"
;;
"report"|*)
generate_login_report
;;
esac
log_action "Gestion Historique de Connexion MacFleet terminée avec l'action : $action"
}
# Exécuter la fonction principale avec tous les arguments
main "$@"
Fonctions de Gestion Rapide
Vérification Simple du Statut de Connexion
#!/bin/bash
# Statut de connexion rapide avec sortie améliorée
quick_login_status() {
echo "📊 Statut de Connexion MacFleet - $(date)"
echo "=========================================="
# Utilisateurs actuels
local current_users
current_users=$(who | wc -l | tr -d ' ')
echo "👥 Actuellement connectés : $current_users utilisateurs"
if [[ "$current_users" -gt 0 ]]; then
echo ""
echo "Sessions Actives :"
who | while IFS= read -r line; do
echo " 🔹 $line"
done
fi
echo ""
echo "📈 Activité Récente :"
echo " - Dernières 24 heures : $(last -t "$(date -v-1d '+%Y%m%d%H%M%S' 2>/dev/null || date -d 'yesterday' '+%Y%m%d%H%M%S')" | wc -l | tr -d ' ') connexions"
echo " - Cette semaine : $(last | grep "$(date '+%b')" | wc -l | tr -d ' ') connexions"
# Temps de fonctionnement système
echo " - Temps de fonctionnement système : $(uptime | awk -F'up ' '{print $2}' | awk -F', ' '{print $1}')"
}
quick_login_status
Résumé de Connexion Utilisateur
#!/bin/bash
# Générer un résumé de connexion utilisateur
user_login_summary() {
echo "🔍 Résumé de Connexion Utilisateur"
echo "=================================="
echo ""
echo "Top 10 Utilisateurs les Plus Actifs :"
echo "-------------------------------------"
last | grep -v "wtmp begins" | awk '{print $1}' | sort | uniq -c | sort -nr | head -10 | while read -r count user; do
echo " $user : $count connexions"
done
echo ""
echo "Activité Utilisateur Récente :"
echo "-----------------------------"
dscl . list /Users UniqueID | awk '$2 >= 500 {print $1}' | head -10 | while read -r username; do
local last_login
last_login=$(last -1 "$username" 2>/dev/null | head -1 | awk '{print $4, $5, $7}' | tr -s ' ')
echo " $username : ${last_login:-"Aucune activité récente"}"
done
}
user_login_summary
Fonctions de Surveillance de Sécurité
Détection de Connexions Échouées
#!/bin/bash
# Surveiller et rapporter les tentatives de connexion échouées
monitor_failed_logins() {
echo "🔒 Surveillance des Connexions Échouées"
echo "======================================="
echo ""
# Vérifier le journal système pour les échecs d'authentification
echo "Tentatives de Connexion Échouées Récentes :"
echo "------------------------------------------"
# Dernières 24 heures de tentatives échouées
grep "authentication failure" /var/log/system.log 2>/dev/null | grep "$(date '+%b %d')" | while IFS= read -r line; do
echo " ⚠️ $line"
done || echo " ✅ Aucune tentative de connexion échouée trouvée aujourd'hui"
echo ""
echo "Résumé des Connexions Échouées :"
echo "-------------------------------"
# Compter les échecs par utilisateur (si disponible)
local failure_count
failure_count=$(grep "authentication failure" /var/log/system.log 2>/dev/null | grep "$(date '+%b %d')" | wc -l | tr -d ' ')
echo " Total d'échecs aujourd'hui : $failure_count"
# Recommandations
if [[ "$failure_count" -gt 5 ]]; then
echo ""
echo "🚨 Alerte de Sécurité : Nombre élevé de connexions échouées détecté !"
echo " - Réviser les comptes utilisateur pour d'éventuelles attaques par force brute"
echo " - Considérer l'implémentation de politiques de verrouillage de compte"
echo " - Vérifier les adresses IP suspectes dans les journaux"
fi
}
monitor_failed_logins
Analyse de Durée de Session
#!/bin/bash
# Analyser les durées de session utilisateur
analyze_session_duration() {
echo "⏱️ Analyse de Durée de Session"
echo "==============================="
echo ""
echo "Statistiques de Session :"
echo "------------------------"
# Sessions actives
local active_count
active_count=$(who | wc -l | tr -d ' ')
echo " Sessions actives : $active_count"
# Analyse des sessions terminées
echo " Sessions terminées récentes :"
last | grep -v "still logged in" | grep -v "wtmp begins" | head -10 | while IFS= read -r line; do
local duration
duration=$(echo "$line" | awk '{print $10}' | tr -d '()')
if [[ -n "$duration" ]]; then
echo " Durée : $duration"
fi
done
echo ""
echo "Sessions de Longue Durée (Actives) :"
echo "-----------------------------------"
who -u | while IFS= read -r line; do
local login_time pid idle
login_time=$(echo "$line" | awk '{print $3, $4}')
pid=$(echo "$line" | awk '{print $6}')
idle=$(echo "$line" | awk '{print $5}')
if [[ "$idle" != "." ]]; then
echo " Session démarrée : $login_time (Inactif : $idle)"
else
echo " Session démarrée : $login_time (Actif)"
fi
done
}
analyze_session_duration
Configuration et Conformité
Configuration de Politique de Connexion
# /etc/macfleet/login_monitoring.conf
# Configuration de Surveillance d'Historique de Connexion MacFleet
# Seuils d'alerte
ALERT_THRESHOLD_FAILED_LOGINS=5
ALERT_THRESHOLD_UNUSUAL_HOURS=22
ALERT_THRESHOLD_SIMULTANEOUS_SESSIONS=3
# Paramètres de surveillance
MONITOR_INTERVAL_MINUTES=15
LOG_RETENTION_DAYS=90
REPORT_GENERATION_SCHEDULE="daily"
# Politiques de sécurité
REQUIRE_LOGIN_AUDIT_TRAIL=true
ALERT_ON_ROOT_LOGIN=true
ALERT_ON_AFTER_HOURS_LOGIN=true
MONITOR_REMOTE_LOGINS=true
# Paramètres de conformité
GDPR_COMPLIANCE=true
SOX_COMPLIANCE=false
HIPAA_COMPLIANCE=false
EXPORT_FORMAT="json" # json, csv, xml
Rapport de Conformité
#!/bin/bash
# Générer des rapports de connexion prêts pour la conformité
generate_compliance_report() {
local compliance_type="${1:-general}"
local report_file="$REPORT_DIR/compliance_${compliance_type}_$(date +%Y%m%d).txt"
echo "📋 Génération du rapport de conformité $compliance_type..."
{
echo "RAPPORT DE CONFORMITÉ HISTORIQUE DE CONNEXION"
echo "============================================="
echo "Type de rapport : $compliance_type"
echo "Généré : $(date)"
echo "Période : $(date -v-30d '+%Y-%m-%d') à $(date '+%Y-%m-%d')"
echo "Système : $(hostname)"
echo ""
case "$compliance_type" in
"gdpr")
echo "ENREGISTREMENT DE TRAITEMENT DES DONNÉES RGPD :"
echo "----------------------------------------------"
echo "• Données de connexion collectées pour surveillance de sécurité"
echo "• Rétention des données : 90 jours (configurable)"
echo "• Contrôles d'accès : Utilisateurs admin uniquement"
echo "• Sujets des données : Tous les utilisateurs système"
echo ""
;;
"sox")
echo "CONFORMITÉ CONTRÔLE D'ACCÈS SOX :"
echo "--------------------------------"
echo "• Surveillance d'accès utilisateur : Activé"
echo "• Suivi d'accès privilégié : Activé"
echo "• Surveillance de connexions échouées : Activé"
echo "• Complétude piste d'audit : Vérifiée"
echo ""
;;
"hipaa")
echo "EXIGENCES D'AUDIT D'ACCÈS HIPAA :"
echo "--------------------------------"
echo "• Journalisation d'authentification utilisateur : Active"
echo "• Surveillance tentatives d'accès : Activé"
echo "• Accès minimum nécessaire : En cours de révision"
echo "• Intégrité journal d'audit : Maintenue"
echo ""
;;
esac
echo "ACTIVITÉ DE CONNEXION DÉTAILLÉE :"
echo "--------------------------------"
last -30
echo ""
echo "RÉSUMÉ D'ACCÈS UTILISATEUR :"
echo "---------------------------"
dscl . list /Users UniqueID | awk '$2 >= 500' | while read -r username uid; do
local login_count
login_count=$(last "$username" | grep -v "wtmp begins" | wc -l | tr -d ' ')
echo "$username (UID : $uid) : $login_count sessions de connexion"
done
} > "$report_file"
echo "✅ Rapport de conformité généré : $report_file"
}
# Générer différents rapports de conformité
# generate_compliance_report "gdpr"
# generate_compliance_report "sox"
# generate_compliance_report "hipaa"
Notes Techniques Importantes
Détails des Commandes
who
: Affiche les utilisateurs actuellement connectés avec heures de connexionlast
: Affiche l'historique de connexion depuis/var/log/wtmp
dscl
: Ligne de commande Services d'Annuaire pour informations utilisateurw
: Version étendue dewho
avec informations de charge système
Emplacements des Fichiers de Journal
/var/log/wtmp
: Base de données binaire d'historique de connexion/var/log/system.log
: Journal système incluant événements d'authentification/var/log/secure.log
: Entrées de journal liées à la sécurité (si activé)
Considérations de Sécurité
- Conformité Confidentialité : La surveillance de connexion doit respecter les lois locales de confidentialité
- Rétention de Données : Implémenter des politiques de rétention appropriées pour les journaux d'audit
- Contrôle d'Accès : Restreindre l'accès aux données d'historique de connexion au personnel autorisé
- Surveillance Temps Réel : Considérer l'implémentation d'alertes temps réel pour activité suspecte
Meilleures Pratiques
- Audit Régulier : Réviser les modèles de connexion régulièrement pour anomalies
- Surveillance Automatisée : Configurer des alertes automatisées pour activité suspecte
- Rétention de Données : Maintenir une rétention de journal appropriée pour exigences de conformité
- Confidentialité Utilisateur : Équilibrer surveillance de sécurité avec attentes de confidentialité utilisateur
- Documentation : Maintenir une documentation claire des procédures de surveillance
- Intégration : Considérer l'intégration avec systèmes SIEM pour surveillance centralisée
- Impact Performance : Surveiller l'impact sur performance système des activités de journalisation
- Stratégie Sauvegarde : Implémenter procédures de sauvegarde pour journaux d'audit critiques
N'oubliez pas de valider tous les scripts sur des appareils de test avant de les déployer sur votre environnement MacFleet, et assurez-vous de la conformité avec les politiques de confidentialité et de sécurité de votre organisation lors de l'implémentation de la surveillance d'historique de connexion.