La page Log Analysis de Security Center vous permet de rédiger des requêtes personnalisées et d'effectuer des analyses statistiques sur vos journaux de sécurité. Utilisez la syntaxe décrite dans cette rubrique pour filtrer les journaux par mot-clé ou par champ, agréger les résultats avec SQL et analyser les modèles de connexion selon l'horodatage ou l'adresse IP.
Fonctionnement
Une instruction de requête se compose de deux parties séparées par une barre verticale (|) :
<search syntax> | <analytics syntax>
Ces deux parties sont facultatives :
| Partie | Fonction | Limites |
|---|---|---|
| Recherche | Filtre les journaux par mot-clé, valeur de champ ou plage numérique | Impossible d'agréger ou de calculer des statistiques |
| Analyse | Agrège et calcule des statistiques sur les résultats filtrés ou sur l'ensemble des données de la plage temporelle | Impossible de filtrer par mot-clé en texte intégral de manière autonome |
Si la partie de recherche est
*ou vide, aucun filtre n'est appliqué : tous les journaux de la plage temporelle sélectionnée sont transmis à la partie d'analyse.Si la partie d'analyse est vide, les entrées de journal correspondantes sont renvoyées telles quelles, sans calcul de statistiques.
Pour ouvrir l'éditeur de requêtes, accédez à Risk Governance > Log Analysis dans le volet de navigation de gauche de la console Security Center, puis saisissez votre instruction dans Search & Analyze.
Syntaxe de recherche
La partie de recherche prend en charge les requêtes en texte intégral et les recherches spécifiques aux champs. L'éditeur de requêtes accepte la saisie multiligne et la coloration syntaxique.
Requête en texte intégral
Recherchez dans tous les champs du journal sans spécifier de nom de champ. Séparez les mots-clés par un espace ou par and. Placez les expressions contenant des espaces entre guillemets doubles (").
| Requête | Résultat |
|---|---|
www.aliyundoc.com 404 |
Journaux contenant les deux termes |
www.aliyundoc.com and 404 |
Identique au précédent |
www.aliyundoc.com and (error or 404) |
Journaux contenant www.aliyundoc.com et soit error, soit 404 |
www.aliyundoc.com and failed_* |
Journaux contenant www.aliyundoc.com et tout terme commençant par failed_ |
La correspondance avec joker ne prend en charge que les astérisques placés à la fin (failed_*). Un astérisque placé au début (*failed) n'est pas pris en charge.
Pour consulter la référence complète de la syntaxe de recherche, voir Présentation de la recherche de journaux.
Recherche spécifique à un champ
Filtrez un champ spécifique en utilisant Field: Value ou des comparaisons numériques telles que Field >= Value. Combinez plusieurs conditions de champ avec and ou or, ou mélangez-les avec des termes en texte intégral.
Chaque entrée de journal inclut un champ __topic__ qui identifie le type de journal. Utilisez __topic__ pour cibler une source de journal spécifique, puis ajoutez des filtres de champ pour ce type de journal.
Exemples
Rechercher les journaux d'alerte dont le niveau de gravité est sérieux :
__topic__ : sas-security-log and level: serious
Rechercher les événements de connexion SSH provenant d'une adresse IP spécifique :
__topic__:aegis-log-login and ip:1.2.XX.XX and warn_type:SSHLOGIN
Rechercher les requêtes DNS internes avec un temps de réponse supérieur à 1 seconde :
__topic__:local-dns and time_usecond > 1000000
Rechercher les requêtes DNS internes avec un temps de réponse compris entre 1 seconde et 10 secondes :
__topic__:local-dns and time_usecond in [1000000,10000000]
Syntaxe d'analyse
La partie d'analyse utilise des instructions SQL-92. La clause from log — équivalente à from <table name> en SQL standard — peut être omise.
Par défaut, les requêtes renvoient les 100 premières entrées de journal. Utilisez la clause LIMIT pour modifier ce comportement. Pour plus de détails, consultez Clause LIMIT.
Pour obtenir la liste complète des fonctions SQL prises en charge, voir Présentation de l'analyse des journaux.
Requêtes basées sur le temps
Chaque entrée de journal possède un champ intégré __time__ qui stocke l'horodatage du journal sous forme d'horodatage UNIX (secondes écoulées depuis le 1er janvier 1970, 00:00:00 UTC). Convertissez ce champ avant de l'afficher dans les résultats de la requête.
Récupérer les événements de connexion les plus récents provenant d'une adresse IP spécifique
Renvoyez les 10 événements de connexion les plus récents provenant de l'adresse IP 1.2.XX.XX, avec un horodatage lisible :
__topic__: aegis-log-login and ip: 1.2.XX.XX
| select date_format(__time__, '%Y-%m-%d %H:%i:%s') as time, warn_ip, warn_type
order by __time__ desc
limit 10
Calculer le nombre de jours écoulés depuis chaque connexion
Ajoutez une colonne days_passed indiquant l'ancienneté de chaque événement de connexion en jours :
__topic__: aegis-log-login and ip: 1.2.XX.XX
| select date_format(__time__, '%Y-%m-%d %H:%i:%s') as time, warn_ip, warn_type ,
round((to_unixtime(now()) - __time__)/86400,1) as "days_passed"
order by __time__ desc
limit 10
L'expression round((to_unixtime(now()) - __time__)/86400, 1) fonctionne comme suit :
to_unixtime(now())convertit l'heure actuelle en horodatage UNIX.Soustrayez
__time__pour obtenir le nombre de secondes écoulées.Divisez par 86400 (nombre de secondes dans une journée).
round(..., 1)arrondit le résultat à une décimale.
Compter les événements de connexion quotidiens pour un appareil
Regroupez les événements de connexion par jour et comptez le nombre d'événements survenus chaque jour :
__topic__: aegis-log-login and ip: 1.2.XX.XX
| select date_trunc('day', __time__) as dt,
count(1) as PV
group by dt
order by dt
date_trunc('day', __time__) aligne chaque horodatage sur le début de la journée. Remplacez 'day' par 'second', 'minute', 'hour', 'week', 'month' ou 'year' pour regrouper selon une autre unité de temps.
Compter les événements de connexion par tranches de 5 minutes
Regroupez les événements par tranches de 5 minutes pour tous les appareils :
__topic__: aegis-log-login
| select from_unixtime(__time__ - __time__% 300) as dt,
count(1) as PV
group by dt
order by dt
limit 1000
__time__ - __time__ % 300 arrondit chaque horodatage à la limite inférieure la plus proche par tranche de 5 minutes (300 secondes). limit 1000 récupère les 1 000 premières tranches, ce qui couvre environ 83 heures de données.
Pour en savoir plus sur les fonctions temporelles telles que date_parse et date_format, consultez Fonctions de date et d'heure.
Requêtes basées sur l'adresse IP
Le champ warn_ip dans les entrées de journal de connexion stocke l'adresse IP source. Utilisez les fonctions de géolocalisation IP pour analyser l'origine des connexions.
Identifier les pays sources des connexions à un serveur spécifique
__topic__: aegis-log-login and uuid: 12344567
| SELECT ip_to_country(warn_ip) as country,
count(1) as "Number of logons"
group by country
ip_to_country(warn_ip) renvoie le pays correspondant à l'adresse IP source.
Ventiler les connexions par province ou État
__topic__: aegis-log-login and uuid: 12344567
| SELECT ip_to_province(warn_ip) as province,
count(1) as "Number of logons"
group by province
ip_to_province(warn_ip) renvoie la province pour les adresses IP chinoises. Pour les adresses IP non chinoises, la fonction tente de renvoyer l'équivalent d'une province ou d'un État, mais le résultat ne peut pas être représenté sur une carte de la Chine.
Cartographier la répartition géographique des connexions
__topic__: aegis-log-login and uuid: 12344567
| SELECT ip_to_geo(warn_ip) as geo,
count(1) as "Number of logons"
group by geo
limit 10000
ip_to_geo(warn_ip) renvoie la latitude et la longitude de l'adresse IP source. limit 10000 récupère jusqu'à 10 000 entrées pour la représentation cartographique.
Pour découvrir d'autres fonctions IP, notamment ip_to_provider (recherche du fournisseur d'accès Internet) et ip_to_domain (détection des adresses IP publiques ou privées), consultez Fonctions IP.