
WhoIs inversé pivotable / Fusion PDNS avec suivi et alertes des titulaires, plus API pour requêtes automatisées (JSON/CSV/TXT)
NOTE : Pendant le développement de PyDat 5, les opérations internes ont changé de direction, ce qui a conduit à l'abandon du projet PyDat. Bien qu'une grande partie du travail ait été réalisée pour finaliser les capacités de PyDat 5, certaines capacités n'ont pas encore été entièrement testées.
Le projet WhoDat est une interface pour les données whoisxmlapi, ou toute donnée whois stockée dans ElasticSearch. Il intègre les données whois, les résolutions IP actuelles et le DNS passif. En plus de fournir une application interactive et pivotable permettant aux analystes d'effectuer des recherches, il dispose également d'une API qui permet une sortie au format JSON.
WhoDat a été initialement écrit par Chris Clark. L'implémentation originale est en PHP et est disponible dans ce dépôt sous le répertoire legacy_whodat. Le code a été réécrit à partir de zéro par Wesley Shields et Murad Khan en Python, et est disponible sous le répertoire pydat.
La version PHP est laissée pour ceux qui souhaitent l'exécuter, mais elle n'est pas aussi complète en fonctionnalités ou extensible que l'implémentation Python, et n'est pas supportée.
Pour plus d'informations sur l'implémentation PHP, veuillez consulter le readme. Pour plus d'informations sur l'implémentation Python, continuez à lire...
pyDat est une implémentation Python du code WhoDat de Chris Clark. Elle est conçue pour être plus extensible et possède plus de fonctionnalités que l'implémentation PHP.
pyDat est une application Python 3.6+ qui nécessite les éléments suivants pour fonctionner :
Pour aider à peupler correctement la base de données, un programme appelé pydat-populator est fourni pour auto-peupler les données.
Notez que les données provenant de whoisxmlapi ne semblent pas toujours cohérentes, donc des précautions doivent être prises lors de l'ingestion des données.
D'autres tests doivent être effectués pour s'assurer que toutes les données sont correctement ingérées.
Quiconque met en place sa base de données doit lire les options disponibles du script avant de l'exécuter pour s'assurer de l'avoir adapté à sa configuration.
Voici la sortie de pydat-populator -h :
usage: pydat-populator [-h] [-c CONFIG] [--debug] [--debug-level DEBUG_LEVEL]
[-x EXCLUDE [EXCLUDE ...]] [-n INCLUDE [INCLUDE ...]]
[--ignore-field-prefixes [IGNORE_FIELD_PREFIXES [IGNORE_FIELD_PREFIXES ...]]]
[-e EXTENSION] [-v] [-s] [--pipelines PIPELINES]
[--shipper-threads SHIPPER_THREADS]
[--fetcher-threads FETCHER_THREADS]
[--bulk-ship-size BULK_SHIP_SIZE]
[--bulk-fetch-size BULK_FETCH_SIZE]
[-u [ES_URI [ES_URI ...]]] [--es-user ES_USER]
[--es-pass ES_PASSWORD] [--cacert ES_CA_CERT]
[--es-disable-sniffing] [-p ES_INDEX_PREFIX]
[--rollover-size ES_ROLLOVER_DOCS] [--ask-pass]
[-r | --config-template-only | --clear-interrupted-flag]
[-f INGEST_FILE | -d INGEST_DIRECTORY] [-D INGEST_DAY]
[-o COMMENT]
optional arguments:
-h, --help show this help message and exit
-c CONFIG, --config CONFIG
location of configuration file for
environmentparameter configuration (example yaml file
in /backend)
--debug Enables debug logging
--debug-level DEBUG_LEVEL
Debug logging level [0-3] (default: 1)
-x EXCLUDE [EXCLUDE ...], --exclude EXCLUDE [EXCLUDE ...]
list of keys to exclude if updating entry
-n INCLUDE [INCLUDE ...], --include INCLUDE [INCLUDE ...]
list of keys to include if updating entry (mutually
exclusive to -x)
--ignore-field-prefixes [IGNORE_FIELD_PREFIXES [IGNORE_FIELD_PREFIXES ...]]
list of fields (in whois data) to ignore when
extracting and inserting into ElasticSearch
-e EXTENSION, --extension EXTENSION
When scanning for CSV files only parse files with
given extension (default: csv)
-v, --verbose Be verbose
-s, --stats Print out Stats after running
-r, --redo Attempt to re-import a failed import or import more
data, uses stored metadata from previous run
--config-template-only
Configure the ElasticSearch template and then exit
--clear-interrupted-flag
Clear the interrupted flag, forcefully (NOT
RECOMMENDED)
-f INGEST_FILE, --file INGEST_FILE
Input CSV file
-d INGEST_DIRECTORY, --directory INGEST_DIRECTORY
Directory to recursively search for CSV files --
mutually exclusive to '-f' option
-D INGEST_DAY, --ingest-day INGEST_DAY
Day to use for metadata, in the format 'YYYY-MM-dd',
e.g., '2021-01-01'. Defaults to todays date, use
'YYYY-MM-00' to indicate a quarterly ingest, e.g.,
2021-04-00
-o COMMENT, --comment COMMENT
Comment to store with metadata
Performance Options:
--pipelines PIPELINES
Number of pipelines (default: 2)
--shipper-threads SHIPPER_THREADS
How many threads per pipeline to spawn to send bulk ES
messages. The larger your cluster, the more you can
increase this, defaults to 1
--fetcher-threads FETCHER_THREADS
How many threads to spawn to search ES. The larger
your cluster, the more you can increase this, defaults
to 2
--bulk-ship-size BULK_SHIP_SIZE
Size of Bulk Elasticsearch Requests (default: 10)
--bulk-fetch-size BULK_FETCH_SIZE
Number of documents to search for at a time (default:
50), note that this will be multiplied by the number
of indices you have, e.g., if you have 10
pydat-<number> indices it results in a request for 500
documents
Elasticsearch Options:
-u [ES_URI [ES_URI ...]], --es-uri [ES_URI [ES_URI ...]]
Location(s) of ElasticSearch Server (e.g.,
foo.server.com:9200) Can take multiple endpoints
--es-user ES_USER Username for ElasticSearch when Basic Auth is enabled
--es-pass ES_PASSWORD
Password for ElasticSearch when Basic Auth is enabled
--cacert ES_CA_CERT Path to a CA Certicate bundle to enable https support
--es-disable-sniffing
Disable ES sniffing, useful when ssl
hostnameverification is not working properly
-p ES_INDEX_PREFIX, --index-prefix ES_INDEX_PREFIX
Index prefix to use in ElasticSearch (default: pydat)
--rollover-size ES_ROLLOVER_DOCS
Set the number of documents after which point a new
index should be created, defaults to 50 million, note
that this is fuzzy since the index count isn't
continuously updated, so should be reasonably below 2
billion per ES shard and should take your ES
configuration into consideration
--ask-pass Prompt for ElasticSearch password
Notez que lors de l'ajout d'une nouvelle version de données dans la base de données, vous devez utiliser soit le flag -x pour exclure certains champs qui ne sont pas importants pour suivre les modifications, soit le flag -n pour inclure des champs spécifiques qui sont sujets à examen. Cela réduira considérablement la quantité de données stockées entre les versions. Vous ne pouvez utiliser que -x ou -n, pas les deux en même temps, mais vous pouvez choisir ce qui convient le mieux à votre environnement. Par exemple, si vous recevez des mises à jour quotidiennes, vous pourriez décider que pour les mises à jour quotidiennes, vous vous souciez uniquement si contactEmail change, mais tous les trimestres, vous pourriez préférer n'exclure que certains champs que vous jugez sans importance.
Pour gagner du temps sur l'utilisation répétitive des flags, pydat-populator accepte un fichier de configuration.
Veuillez consulter le fichier de configuration d'exemple pour un exemple de création d'un fichier de configuration.
pyDat ne fournit aucune donnée en soi. Vous devez fournir vos propres données whois dans un magasin de données ElasticSearch.
pydat-populator -u localhost:9200 -f ~/whois/data/1.csv -v -s -x Audit_auditUpdatedDate,updatedDate,standardRegUpdatedDate,expiresDate,standardRegExpiresDate
PyDat 5 est une application divisée en backend/frontend qui utilise Python Flask pour fournir une API REST et ReactJS pour fournir une interface utilisateur Web interactive. Le moyen le plus simple d'utiliser l'application est de construire une image Docker.
cd pydat/
docker build -t mitrecnd/pydat:5
L'image créée compilera et installera les composants frontend dans le backend, permettant le déploiement complet de l'application.
L'application peut ensuite être déployée en créant un fichier de configuration de déploiement et en utilisant docker-compose :
version: '3'
services:
pydat:
image: mitrecnd/pydat:5
volumes:
- "./config.py:/opt/pydat/config.py:ro"
ports:
- 127.0.0.1:8888:8888
Générez un fichier de configuration en copiant le fichier config_example.py sous le nom config.py dans le même répertoire que le fichier docker-compose.yml.
Le backend Python peut également être installé en utilisant pip. Cela est utile si vous souhaitez exécuter nativement la capacité de peuplement des données. Notez que cela ne contient aucun composant frontend car ils ne sont pas pré-compilés. Référez-vous au dockerfile si vous souhaitez compiler et installer manuellement le frontend.
cd pydat/backend/
pip install ./
L'installation du paquet vous donnera accès au programme pydat-populator mentionné ci-dessus.
PyDat 5 introduit une API REST mise à jour mais maintient un ensemble d'endpoints v1 pour approximer la sortie qui serait renvoyée par Pydat 4. En raison de certains changements structurels entre pyDat 4 et 5, la sortie ne sera pas exactement la même.
v1Les endpoints suivants sont exposés :
api/v1/metadata/
api/v1/metadata/<version>/
L'endpoint metadata renvoie les métadonnées disponibles pour les données dans la base de données. Spécifier une version renverra les métadonnées pour cette version spécifique.
api/v1/domain/<domainName>/
api/v1/domain/<domainName>/latest/
api/v1/domain/<domainName>/<version>/
api/v1/domain/<domainName>/<version1>/<version2>/
api/v1/domain/<domainName>/diff/<version1>/<version2>/
L'endpoint domain vous permet d'obtenir des informations sur un nom de domaine spécifique. Par défaut, cela renverra des informations pour toute version d'un domaine trouvé dans la base de données. Vous pouvez spécifier plus d'informations pour obtenir des versions spécifiques des informations du domaine ou pour obtenir la dernière entrée. Vous pouvez également obtenir un diff entre deux versions d'un domaine pour voir ce qui a changé.
api/v1/domains/<searchKey>/<searchValue>/
api/v1/domains/<searchKey>/<searchValue>/latest/
api/v1/domains/<searchKey>/<searchValue>/<version>/
api/v1/domains/<searchKey>/<searchValue>/<version1>/<version2>/
L'endpoint domains vous permet de rechercher des domaines en fonction d'une clé spécifiée. Actuellement, les clés suivantes sont supportées :
domainName
registrant_name
contactEmail
registrant_telephone
Similaire à l'endpoint domain, vous pouvez spécifier les versions des données que vous recherchez.
Exemples de requêtes :
curl http://pydat.myorg.domain/ajax/domain/google.com/latest/
curl http://pydat.myorg.domain/ajax/domains/domainName/google.com/
api/v1/query
Cet endpoint accepte 4 paramètres via une requête GET :
query - La requête pour rechercher dans ES
size - Le nombre d'éléments à retourner (taille de page)
page - La page à retourner, en combinant ceci avec size vous pouvez obtenir les résultats par morceaux
unique - Essaie de retourner l'entrée la plus récente par domainName
Note sur le paramètre unique : Si vous utilisez le paramètre unique, notez que le pagination des résultats est désactivée, mais le paramètre size sera toujours utilisé pour contrôler le nombre de résultats retournés.
v2Les endpoints suivants sont exposés :
api/v2/metadata
api/v2/metadata/<version>
Ces endpoints sont similaires à leurs équivalents v1 mais leur format de réponse diffère.
api/v2/resolve/<domain>
Il s'agit d'un nouvel endpoint qui vous permet de résoudre un nom de domaine en adresses IP. Notez que cette capacité peut être désactivée par le backend. Veuillez appeler l'endpoint /settings pour vous assurer que cette capacité est activée avant de l'appeler.
api/v2/domains/diff [POST]
Cet endpoint vous permet d'obtenir un diff entre deux versions d'un domaine pour voir ce qui a changé. Il attend une requête JSON de la forme suivante :
{
domain: "mydomain.example",
version1: 1,
version2: 2
}
api/v2/domain [POST]
Cet endpoint retourne des informations pour un nom de domaine donné et attend une requête JSON de la forme suivante :
{
value: "mydomain.example",
version: 1, # Optionnel
chunk_size: 50, # Optionnel
offset: 0 # Optionnel
}
api/v2/query [POST]
Cet endpoint supporte la capacité de syntaxe de requête 'avancée'. Il attend une requête JSON de la forme suivante :
{
query: "myquery",
chunk_size: 50, # Optionnel
offset: 0, #Optionnel
unique: false, # Optionnel
sort_keys: [ # Optionnel
"domainName",
"registrant_name",
"contactEmail",
"standardRegCreatedDate",
"registrant_telephone",
"dataVersion",
"_score",
]
}
api/v2/info
Cet endpoint fournit des informations de santé sur le cluster Elastic.
api/v2/settings
Cet endpoint est principalement utilisé par le frontend pour déterminer dynamiquement quelles capacités sont activées par l'application backend.
Malheureusement, en raison de changements structurels dans la façon dont les données sont stockées dans Elastic, pyDat 5 n'est pas rétrocompatible avec pyDat 4. Cela signifie que les données devront être nouvellement ingérées dans un cluster ElasticSearch pour être utilisées avec pyDat 5.
pyDat est copyright de The MITRE Corporation 2021.
L'implémentation PHP est copyright de Chris Clark, 2013. Contactez-le à [email protected].
Les versions PHP et Python sont sous la même licence.
pyDat est un logiciel libre : vous pouvez le redistribuer et/ou le modifier selon les termes de la Licence Publique Générale GNU telle que publiée par la Free Software Foundation, soit la version 3 de la Licence, ou (à votre choix) toute version ultérieure.
pyDat est distribué dans l'espoir qu'il sera utile, mais SANS AUCUNE GARANTIE ; sans même la garantie implicite de COMMERCIALISATION ou d'ADÉQUATION À UN USAGE PARTICULIER. Voir la Licence Publique Générale GNU pour plus de détails.
Vous devriez avoir reçu une copie de la Licence Publique Générale GNU avec pyDat. Sinon, consultez http://www.gnu.org/licenses/.
Approuvé pour diffusion publique ; Distribution illimitée 14-1633