Guide

Nouvelles mises à jour et améliorations de Roundfleet.

Avis important

Les exemples de code et scripts fournis dans ces tutoriels sont uniquement à des fins éducatives. Roundfleet n'est pas responsable des problèmes, dommages ou vulnérabilités de sécurité qui pourraient survenir lors de l'utilisation, modification ou implémentation de ces exemples. Toujours vérifier et tester le code dans un environnement sécurisé avant de l'utiliser dans des systèmes de production.

Gestion d'Entreprise de l'Historique de Connexion sur macOS

Surveillez et analysez l'activité de connexion des utilisateurs sur vos appareils Roundfleet 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 connexion
  • last - Affiche l'historique de connexion détaillé avec les informations de session
  • dscl - Utilitaire en ligne de commande des Services d'Annuaire pour la gestion des utilisateurs
  • w - Informations étendues d'activité utilisateur avec la charge système
  • finger - 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 Roundfleet
# Surveillance complète de l'activité utilisateur et audit de sécurité

# Configuration
LOG_FILE="/var/log/roundfleet_login_history.log"
REPORT_DIR="/var/reports/roundfleet/login_history"
CONFIG_FILE="/etc/roundfleet/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 Roundfleet"
        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 Roundfleet 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 Roundfleet 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 Roundfleet - $(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/roundfleet/login_monitoring.conf
# Configuration de Surveillance d'Historique de Connexion Roundfleet

# 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 connexion
  • last : Affiche l'historique de connexion depuis /var/log/wtmp
  • dscl : Ligne de commande Services d'Annuaire pour informations utilisateur
  • w : Version étendue de who 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é

  1. Conformité Confidentialité : La surveillance de connexion doit respecter les lois locales de confidentialité
  2. Rétention de Données : Implémenter des politiques de rétention appropriées pour les journaux d'audit
  3. Contrôle d'Accès : Restreindre l'accès aux données d'historique de connexion au personnel autorisé
  4. Surveillance Temps Réel : Considérer l'implémentation d'alertes temps réel pour activité suspecte

Meilleures Pratiques

  1. Audit Régulier : Réviser les modèles de connexion régulièrement pour anomalies
  2. Surveillance Automatisée : Configurer des alertes automatisées pour activité suspecte
  3. Rétention de Données : Maintenir une rétention de journal appropriée pour exigences de conformité
  4. Confidentialité Utilisateur : Équilibrer surveillance de sécurité avec attentes de confidentialité utilisateur
  5. Documentation : Maintenir une documentation claire des procédures de surveillance
  6. Intégration : Considérer l'intégration avec systèmes SIEM pour surveillance centralisée
  7. Impact Performance : Surveiller l'impact sur performance système des activités de journalisation
  8. 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 Roundfleet, 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.

Related Tutorials

Gestion des Privilèges Utilisateur et Conformité Sécurité sur macOS

Gestion complète des privilèges utilisateur, contrôle d'accès administrateur, surveillance de conformité sécuritaire et détection automatisée d'escalade de privilèges pour les appareils macOS en environnements d'entreprise.

7 juil. 2025

Gestion Entreprise des Détails Utilisateur sur macOS

Guide complet pour la récupération et gestion d'informations utilisateur en entreprise sur les appareils Roundfleet avec profilage utilisateur détaillé, capacités d'audit et contrôles de sécurité.

7 juil. 2025

Gestion Entreprise de Création Utilisateur sur macOS

Guide complet pour le provisioning utilisateur et gestion du cycle de vie en entreprise sur les appareils Roundfleet avec workflows automatisés, contrôles de sécurité et processus standardisés de création utilisateur.

7 juil. 2025

Gestion des Comptes Utilisateurs sur macOS

Apprenez à créer, gérer et configurer les comptes utilisateurs sur les appareils macOS en utilisant les outils en ligne de commande. Guide complet pour la création d'utilisateurs administrateurs et standards, politiques de mots de passe et gestion d'utilisateurs en entreprise.

7 juil. 2025

Suppression de Comptes Utilisateur et Gestion du Cycle de Vie sur macOS

Apprenez à supprimer en toute sécurité les comptes utilisateur, gérer la rétention des données, implémenter des procédures de départ sécurisées et traiter la gestion du cycle de vie des utilisateurs d'entreprise sur les appareils macOS.

7 juil. 2025

Gestion d'Entreprise des Utilisateurs de Partage sur macOS

Apprenez à créer et gérer des comptes utilisateurs de partage uniquement sur les appareils macOS en utilisant les commandes dscl avec sécurité de niveau entreprise, déploiement en masse et capacités de gestion de flotte.

7 juil. 2025

Gestion Entreprise de la Suppression de Fichiers et Dossiers pour macOS

Gérez la suppression de fichiers et dossiers macOS sur les appareils Roundfleet avec la suppression sécurisée de données, les pistes d'audit, la protection par sauvegarde, la gestion de conformité et les opérations de nettoyage automatisées pour la gouvernance des données d'entreprise.

7 juil. 2025

Gestion Entreprise de Création de Fichiers et Dossiers sur macOS

Guide complet pour les opérations de création de fichiers et dossiers en entreprise sur les appareils Roundfleet avec gestion de modèles, contrôle des permissions et capacités de provisionnement automatisé.

7 juil. 2025