
Pivotable Reverse WhoIs / PDNS Fusion mit Registrant Tracking & Alarmierung plus API für automatisierte Abfragen (JSON/CSV/TXT)
HINWEIS: Während der Entwicklung von PyDat 5 hat sich die interne Ausrichtung geändert, was zur Einstellung des PyDat-Projekts führte. Obwohl ein Großteil der Arbeit zur Fertigstellung der Funktionen von PyDat 5 erledigt wurde, sind einige Fähigkeiten noch nicht vollständig getestet.
Das WhoDat-Projekt ist eine Schnittstelle für whoisxmlapi-Daten oder beliebige Whois-Daten, die in ElasticSearch gespeichert sind. Es integriert Whois-Daten, aktuelle IP-Auflösungen und passives DNS. Neben einer interaktiven, pivotierbaren Anwendung für Analysten zur Recherche bietet es auch eine API, die eine Ausgabe im JSON-Format ermöglicht.
WhoDat wurde ursprünglich von Chris Clark geschrieben. Die ursprüngliche Implementierung ist in PHP und in diesem Repository unter dem Verzeichnis legacy_whodat verfügbar. Der Code wurde von Wesley Shields und Murad Khan in Python neu geschrieben und ist unter dem Verzeichnis pydat verfügbar.
Die PHP-Version bleibt für diejenigen, die sie ausführen möchten, erhalten, ist aber nicht so funktionsreich oder erweiterbar wie die Python-Implementierung und wird nicht unterstützt.
Weitere Informationen zur PHP-Implementierung finden Sie in der readme. Für weitere Informationen zur Python-Implementierung lesen Sie bitte weiter...
pyDat ist eine Python-Implementierung von Chris Clark's WhoDat-Code. Es ist darauf ausgelegt, erweiterbarer zu sein und mehr Funktionen als die PHP-Implementierung zu bieten.
pyDat ist eine Python 3.6+ Anwendung, die Folgendes benötigt:
Um die ordnungsgemäße Befüllung der Datenbank zu unterstützen, wird ein Programm namens pydat-populator bereitgestellt, um die Daten automatisch zu befüllen.
Beachten Sie, dass die Daten von whoisxmlapi nicht immer konsistent zu sein scheinen, daher sollte beim Importieren der Daten Vorsicht walten.
Es müssen weitere Tests durchgeführt werden, um sicherzustellen, dass alle Daten korrekt importiert werden.
Jeder, der seine Datenbank einrichtet, sollte die verfügbaren Flags des Skripts lesen, bevor er es ausführt, um sicherzustellen, dass es für sein Setup angepasst ist.
Im Folgenden die Ausgabe von 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
Beachten Sie, dass beim Hinzufügen einer neuen Version von Daten zur Datenbank entweder das -x-Flag zum Ausschließen bestimmter Felder, die für die Änderungsverfolgung nicht wichtig sind, oder das -n-Flag zum Einschließen bestimmter Felder, die einer Prüfung unterliegen, verwendet werden sollte. Dadurch wird die Datenmenge, die zwischen den Versionen gespeichert wird, erheblich reduziert. Sie können entweder -x oder -n verwenden, nicht beide gleichzeitig, können aber dasjenige auswählen, das für Ihre Umgebung am besten geeignet ist. Wenn Sie beispielsweise tägliche Aktualisierungen erhalten, könnten Sie entscheiden, dass Sie für tägliche Aktualisierungen nur daran interessiert sind, ob sich die contactEmail ändert, aber vierteljährlich möchten Sie vielleicht nur bestimmte Felder ausschließen, die Sie nicht für wichtig halten.
Um Zeit durch wiederholte Flag-Nutzung zu sparen, akzeptiert pydat-populator eine Konfigurationsdatei. Bitte sehen Sie sich die Beispielkonfiguration an, um ein Beispiel für die Erstellung einer Konfigurationsdatei zu erhalten.
pyDat liefert selbst keine Daten. Sie müssen Ihre eigenen Whois-Daten in einem ElasticSearch-Datenspeicher bereitstellen.
pydat-populator -u localhost:9200 -f ~/whois/data/1.csv -v -s -x Audit_auditUpdatedDate,updatedDate,standardRegUpdatedDate,expiresDate,standardRegExpiresDate
PyDat 5 ist eine geteilte Backend/Frontend-Anwendung, die Python Flask zur Bereitstellung einer REST-API und ReactJS für eine interaktive Weboberfläche verwendet. Der einfachste Weg, die App zu verwenden, ist, ein Docker-Image zu erstellen.
cd pydat/
docker build -t mitrecnd/pydat:5
Das erstellte Image kompiliert und installiert die Frontend-Komponenten in das Backend, sodass die gesamte App bereitgestellt werden kann.
Die App kann dann durch Erstellen einer Deployment-Konfigurationsdatei und Verwendung von docker-compose bereitgestellt werden:
version: '3'
services:
pydat:
image: mitrecnd/pydat:5
volumes:
- "./config.py:/opt/pydat/config.py:ro"
ports:
- 127.0.0.1:8888:8888
Erstellen Sie eine Konfigurationsdatei, indem Sie die Datei config_example.py als config.py in dasselbe Verzeichnis wie die Datei docker-compose.yml kopieren.
Das Python-Backend kann auch mit pip installiert werden. Dies ist nützlich, wenn Sie die Datenbefüllungsfunktion nativ ausführen möchten. Beachten Sie, dass dies keine Frontend-Komponenten enthält, da diese nicht vorkompiliert geliefert werden. Lesen Sie das dockerfile, wenn Sie das Frontend manuell kompilieren und installieren möchten.
cd pydat/backend/
pip install ./
Durch die Installation des Pakets erhalten Sie Zugriff auf das oben referenzierte Programm pydat-populator.
PyDat 5 führt eine aktualisierte REST-API ein, behält aber einen Satz von v1-API-Endpunkten bei, um die Ausgabe anzunähern, die von Pydat 4 zurückgegeben würde. Aufgrund einiger struktureller Änderungen zwischen pyDat 4 und 5 wird die Ausgabe nicht exakt gleich sein.
v1 EndpunkteDie folgenden Endpunkte werden bereitgestellt:
api/v1/metadata/
api/v1/metadata/<version>/
Der Metadaten-Endpunkt gibt Metadaten zu den in der Datenbank enthaltenen Daten zurück. Durch Angabe einer Version werden Metadaten für diese spezifische Version zurückgegeben.
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>/
Der Domain-Endpunkt ermöglicht es Ihnen, Informationen zu einem bestimmten Domainnamen abzurufen. Standardmäßig werden Informationen für jede Version einer Domain zurückgegeben, die in der Datenbank gefunden wird. Sie können weitere Informationen angeben, um spezifische Versionen von Domain-Informationen zu erhalten oder den neuesten Eintrag abzurufen. Sie können auch einen Diff zwischen zwei Versionen einer Domain abrufen, um zu sehen, was sich geändert hat.
api/v1/domains/<searchKey>/<searchValue>/
api/v1/domains/<searchKey>/<searchValue>/latest/
api/v1/domains/<searchKey>/<searchValue>/<version>/
api/v1/domains/<searchKey>/<searchValue>/<version1>/<version2>/
Der Domains-Endpunkt ermöglicht es Ihnen, nach Domains basierend auf einem bestimmten Schlüssel zu suchen. Derzeit werden die folgenden Schlüssel unterstützt:
domainName
registrant_name
contactEmail
registrant_telephone
Ähnlich wie beim Domain-Endpunkt können Sie angeben, nach welchen Versionen der Daten Sie suchen.
Beispielabfragen:
curl http://pydat.myorg.domain/ajax/domain/google.com/latest/
curl http://pydat.myorg.domain/ajax/domains/domainName/google.com/
api/v1/query
Dieser Endpunkt akzeptiert 4 Parameter über eine GET-Anfrage:
query - Die Abfrage zur Suche in ES
size - Die Anzahl der zurückzugebenden Elemente (auch Seitengröße)
page - Die zurückzugebende Seite; durch Kombination mit size können Sie die Ergebnisse in Blöcken abrufen
unique - Versucht, den neuesten Eintrag pro domainName zurückzugeben
Hinweis zum unique-Parameter: Wenn Sie den unique-Parameter verwenden, beachten Sie, dass das Paging der Ergebnisse deaktiviert ist, der size-Parameter jedoch weiterhin zur Steuerung der Anzahl der zurückgegebenen Ergebnisse verwendet wird.
v2 EndpunkteDie folgenden Endpunkte werden bereitgestellt:
api/v2/metadata
api/v2/metadata/<version>
Diese Endpunkte sind ähnlich wie ihre v1-Pendants, ihr Antwortformat unterscheidet sich jedoch.
api/v2/resolve/<domain>
Dies ist ein neuer Endpunkt, der es ermöglicht, einen Domainnamen in IP-Adressen aufzulösen. Beachten Sie, dass diese Funktion vom Backend deaktiviert werden kann. Bitte rufen Sie den /settings-Endpunkt auf, um sicherzustellen, dass diese Funktion aktiviert ist, bevor Sie sie aufrufen.
api/v2/domains/diff [POST]
Dieser Endpunkt ermöglicht es Ihnen, einen Diff zwischen zwei Versionen einer Domain abzurufen, um zu sehen, was sich geändert hat. Er erwartet eine JSON-Anfrage mit folgender Form:
{
domain: "mydomain.example",
version1: 1,
version2: 2
}
api/v2/domain [POST]
Dieser Endpunkt gibt Informationen für einen bestimmten Domainnamen zurück und erwartet eine JSON-Anfrage mit folgender Form:
{
value: "mydomain.example",
version: 1, # Optional
chunk_size: 50, # Optional
offset: 0 # Optional
}
api/v2/query [POST]
Dieser Endpunkt unterstützt die erweiterte Abfragesyntax. Er erwartet eine JSON-Anfrage mit folgender Form:
{
query: "myquery",
chunk_size: 50, # Optional
offset: 0, #Optional
unique: false, # Optional
sort_keys: [ # Optional
"domainName",
"registrant_name",
"contactEmail",
"standardRegCreatedDate",
"registrant_telephone",
"dataVersion",
"_score",
]
}
api/v2/info
Dieser Endpunkt liefert Gesundheitsinformationen über den Elastic-Cluster.
api/v2/settings
Dieser Endpunkt wird hauptsächlich vom Frontend verwendet, um dynamisch zu bestimmen, welche Fähigkeiten von der Backend-Anwendung aktiviert sind.
Aufgrund struktureller Änderungen in der Art und Weise, wie Daten in Elastic gespeichert werden, ist pyDat 5 leider nicht abwärtskompatibel mit pydat 4. Das bedeutet, dass Daten neu in einen ElasticSearch-Cluster eingespeist werden müssen, um mit pyDat 5 verwendet zu werden.
pyDat ist urheberrechtlich geschützt durch The MITRE Corporation 2021.
Die PHP-Implementierung ist urheberrechtlich geschützt durch Chris Clark, 2013. Kontaktieren Sie ihn unter [email protected].
Die PHP- und Python-Versionen sind unter derselben Lizenz lizenziert.
pyDat ist freie Software: Sie können es unter den Bedingungen der GNU General Public License, wie von der Free Software Foundation veröffentlicht, weiterverbreiten und/oder modifizieren, entweder in der Version 3 der Lizenz oder (nach Ihrer Wahl) jeder späteren Version.
pyDat wird in der Hoffnung verteilt, dass es nützlich sein wird, aber OHNE JEGLICHE GEWÄHRLEISTUNG; ohne die stillschweigende Gewährleistung der MARKTGÄNGIGKEIT oder EIGNUNG FÜR EINEN BESTIMMTEN ZWECK. Weitere Details finden Sie in der GNU General Public License.
Sie sollten eine Kopie der GNU General Public License zusammen mit pyDat erhalten haben. Falls nicht, siehe http://www.gnu.org/licenses/.
Freigegeben für die öffentliche Verbreitung; uneingeschränkte Verteilung 14-1633