Combien de serveurs ont OpenSSL en version vulnérable ? Quels sont les utilisateurs avec UID 0 sur la flotte ? Quelles machines ont un binaire SUID modifié dans les 7 derniers jours ? Ces questions sont triviales à formuler, complexes à répondre sans outillage. Sur 200 hosts hétérogènes, les boucles ssh + grep ne tiennent pas.
osquery, créé par Facebook en 2014 et donné à la Linux Foundation en 2019, expose le système d'exploitation comme une base SQL relationnelle. Disponible sur Linux, macOS, Windows. Fleet (par Fleet Device Management) ajoute le serveur de management qui transforme osquery d'outil local en plateforme parc.
Pour les équipes sécurité, conformité et inventaire, la bascule est nette. Au lieu d'écrire des scripts, on écrit du SQL.
Plan de l'article
- Le concept : OS as relational database
- Tables osquery courantes
- Architecture client-serveur avec Fleet
- Déploiement osquery sur le parc
- Requêtes utiles pour la sécurité
- Packs de queries et planification
- Intégration SIEM et observabilité
- Limites et signaux à surveiller
Le concept : OS as relational database
L'idée centrale d'osquery : pourquoi ne pas exposer le système (processus, sockets, users, services, fichiers, registre, packages, etc.) comme des tables SQL ?
Fini les scripts shell qui parsent /etc/passwd à coups de awk, les boucles find / -perm -4000 qui explosent, les scrapers ps aux fragiles. Une seule API, un seul langage de requête.
-- Tous les processus écoutant sur un port public
SELECT p.name, p.cmdline, l.address, l.port
FROM listening_ports l
JOIN processes p ON p.pid = l.pid
WHERE l.address = '0.0.0.0';
-- Utilisateurs avec UID 0 autres que root
SELECT username, uid, directory, shell
FROM users
WHERE uid = 0 AND username != 'root';
-- Packages installés avec une version vulnérable
SELECT name, version
FROM deb_packages
WHERE name = 'openssl' AND version LIKE '1.1%';
Ces requêtes tournent localement sur l'hôte. Le binaire osqueryi les exécute en interactif, ou osqueryd les schedule en daemon.
Tables osquery courantes
Plusieurs centaines de tables exposées par défaut. Catégories principales :
| Catégorie | Exemples de tables |
| Processus | processes, process_open_files, process_open_sockets |
| Utilisateurs | users, groups, logged_in_users |
| Réseau | interface_addresses, arp_cache, routes, listening_ports |
| Fichiers | file, hash, mounts, block_devices |
| Packages | deb_packages, rpm_packages, homebrew_packages, chocolatey_packages |
| Services | systemd_units, services, launchd |
| Sécurité | suid_bin, kernel_modules, selinux_settings, apparmor_profiles |
| Logs | syslog_events (Linux), windows_events (Windows) |
| Hardware | hardware_events, cpu_info, memory_info |
| Containers | docker_containers, docker_images, docker_networks |
| Cloud | aws_metadata, azure_metadata |
Les tables sont multiplateformes quand c'est possible. La table users existe sur Linux, macOS, Windows avec des colonnes communes. Quelques tables sont OS-specific (apparmor_profiles sur Linux, firewall sur macOS, windows_security_products sur Windows).
Documentation complète sur le site officiel, parcourue avec .tables dans osqueryi.
Architecture client-serveur avec Fleet
osquery seul est un outil local. Pour piloter un parc, il faut un serveur de management. Plusieurs implémentations :
- Fleet (Fleet Device Management) : produit moderne, open source, qui tient la montée en charge, avec API et UI. L'option à retenir en 2026.
- Kolide K2 : alternative commerciale avec UX poussée pour l'entreprise.
- doorman : projet historique CNCF, moins maintenu.
- TLS server custom : on peut écrire son propre serveur TLS qui implémente le protocole osquery.
Architecture Fleet :
- Fleet server (Go) avec MySQL/MariaDB et Redis.
- Endpoints osquery configurés en mode "remote" qui pollent Fleet pour des configs et postent leurs résultats.
- UI web pour gérer les hosts, les queries, les packs, les politiques.
- API GraphQL et REST pour intégration.
Chaque host enregistre son osquery agent dans Fleet via un secret partagé ou un token MDM. Fleet orchestre les requêtes et collecte les résultats en quasi-temps réel.
Déploiement osquery sur le parc
Sur Linux, paquets disponibles pour Debian/Ubuntu, RHEL/CentOS/Rocky/AlmaLinux, Arch :
# Debian / Ubuntu
curl -L https://pkg.osquery.io/deb/pubkey.gpg | sudo apt-key add -
echo "deb [arch=amd64] https://pkg.osquery.io/deb deb main" | sudo tee /etc/apt/sources.list.d/osquery.list
sudo apt update && sudo apt install osquery
Configuration /etc/osquery/osquery.flags pour pointer vers Fleet :
--enroll_secret_path=/etc/osquery/enroll_secret
--tls_hostname=fleet.exemple.fr:8080
--tls_server_certs=/etc/osquery/fleet.pem
--enroll_tls_endpoint=/api/v1/osquery/enroll
--config_plugin=tls
--config_tls_endpoint=/api/v1/osquery/config
--logger_plugin=tls
--logger_tls_endpoint=/api/v1/osquery/log
--disable_distributed=false
--distributed_plugin=tls
--distributed_interval=10
--distributed_tls_max_attempts=3
--distributed_tls_read_endpoint=/api/v1/osquery/distributed/read
--distributed_tls_write_endpoint=/api/v1/osquery/distributed/write
Démarrage :
sudo systemctl enable --now osqueryd
Pour un déploiement parc, intégrer dans le pipeline Packer + Ansible golden images ou via config management.
Sur macOS et Windows, packages MSI / PKG officiels. Configuration équivalente.
Requêtes utiles pour la sécurité
Quelques exemples typiques en prod.
Détection de comptes UID 0 non-root :
SELECT username, uid, directory, shell
FROM users
WHERE uid = 0 AND username != 'root';
Binaires SUID modifiés récemment :
SELECT path, mode, atime, mtime, ctime, hash.sha256
FROM suid_bin
JOIN hash ON suid_bin.path = hash.path
WHERE mtime > (strftime('%s', 'now') - 604800);
Packages avec CVE connue (à compléter avec une liste de versions ciblées) :
SELECT hostname, name, version
FROM deb_packages, system_info
WHERE name IN ('openssl', 'glibc', 'sudo')
AND version < '<version_patchee>';
Connexions sortantes vers IP non whitelistées :
SELECT pid, name, fd, remote_address, remote_port
FROM process_open_sockets
WHERE remote_address NOT LIKE '10.%' AND remote_address NOT LIKE '192.168.%'
AND state = 'ESTABLISHED';
Modules kernel non signés :
SELECT name, status, used_by
FROM kernel_modules
WHERE name NOT IN (SELECT name FROM expected_modules);
Pour le hardening général qui s'aligne sur ces requêtes, voir audit-securite-linux et cis-benchmark-audit.
Packs de queries et planification
Plutôt que d'exécuter des requêtes ad hoc, on définit des "packs" : ensembles de queries scheduled.
Exemple incident_response.conf :
{
"queries": {
"logged_in_users": {
"query": "SELECT * FROM logged_in_users;",
"interval": 300
},
"suid_bin": {
"query": "SELECT * FROM suid_bin;",
"interval": 3600
},
"kernel_modules": {
"query": "SELECT * FROM kernel_modules;",
"interval": 1800
}
}
}
Chaque query schedule génère un événement quand le résultat change (pas à chaque exécution). Idéal pour détecter "un nouveau binaire SUID est apparu", "un kernel module non vu auparavant est chargé".
osquery fournit des packs prédéfinis : incident-response, it-compliance, vuln-management, osquery-monitoring. À enrichir avec des packs métier.
Intégration SIEM et observabilité
Les résultats osquery sont du JSON structuré. Patterns d'ingestion :
- Wazuh ingère osquery via plugin natif. Voir wazuh-siem.
- Loki push HTTP depuis Fleet. Indexation par hostname et pack.
- Elastic SIEM via Filebeat osquery module.
- Splunk via Splunk add-on for osquery.
Pour les alertes temps réel, coupler osquery avec Falco runtime security. osquery donne la photo périodique, Falco détecte les événements en streaming.
Limites et signaux à surveiller
Charge système. osqueryd consomme CPU pour les queries lourdes (par exemple SELECT * FROM file WHERE path LIKE '/%'). Limiter les queries qui scannent le filesystem entier. Utiliser --watchdog_level=0 ou monitoring strict du process pour éviter les abus.
Tables platform-specific. Une query qui marche sur Linux peut casser sur Windows ou macOS. Tester les packs sur les trois OS du parc, ou conditionner par JOIN os_version.
Latence de propagation Fleet. Une query distribuée envoyée à 1000 hosts ne revient pas en 1 seconde. Compter 30s à 2 min pour la majorité des hosts, plus longtemps pour les laggards.
Sécurité du serveur Fleet. Le serveur Fleet voit tout sur tous les hosts. Compromission = visibilité totale du parc. Hardening strict, isolation réseau, MFA, audit logs.
Privacy. osquery peut révéler beaucoup sur les utilisateurs (historique navigateur, fichiers ouverts, processus). Sur des postes utilisateurs, documenter ce qui est collecté et pourquoi, conformité RGPD / accord utilisateur.
Maintenance MIBs / tables. Les tables osquery évoluent. Une query qui marche en v5.10 peut nécessiter ajustement en v5.13. Suivre les release notes.
Pas un endpoint protection. osquery observe et reporte. Il ne bloque rien. Pour le blocage runtime, Falco / Tracee / EDR commercial.
Une fois en place, osquery + Fleet devient la référence pour les questions "qui a quoi sur le parc". Des audits qui prenaient des jours passent à des minutes. Le travail réel n'est pas le déploiement (mécanique), c'est la curation des packs et l'intégration au workflow d'investigation. Curer ces requêtes et ces packs dans la durée occupe réellement quelqu'un ; à défaut, déléguer cette tenue garde l'inventaire fiable.
Sources
- osquery documentation officielle : référence des tables, configuration, scheduler.
- Fleet documentation officielle : install, ops, API.
- GitHub osquery/osquery : code source, releases.
- GitHub fleetdm/fleet : code source Fleet, releases, packs communautaires.
- SQL syntax SQLite (utilisé par osquery) : référence du dialect SQL supporté.
- CIS Benchmarks : référence pour les contrôles que les packs osquery automatisent.


