
피벗 가능한 Reverse WhoIs / PDNS Fusion, 등록자 추적 및 알림, 추가로 자동 쿼리용 API (JSON/CSV/TXT)
참고: PyDat 5 개발 중 내부 작업 방향이 변경되어 PyDat 프로젝트가 중단되었습니다. PyDat 5의 기능을 완성하기 위한 많은 작업이 이루어졌지만, 일부 기능은 완전히 테스트되지 않은 상태로 남아 있습니다.
WhoDat 프로젝트는 whoisxmlapi 데이터 또는 ElasticSearch에 저장된 모든 whois 데이터를 위한 인터페이스입니다. whois 데이터, 현재 IP 확인 정보 및 수동적 DNS를 통합합니다. 분석가가 연구를 수행할 수 있는 대화형 피벗 가능한 애플리케이션을 제공할 뿐만 아니라, JSON 형식으로 출력을 제공하는 API도 갖추고 있습니다.
WhoDat은 원래 Chris Clark이 작성했습니다. 원래 구현체는 PHP로 작성되었으며, 이 리포지토리의 legacy_whodat 디렉토리에서 확인할 수 있습니다. 코드는 Wesley Shields와 Murad Khan에 의해 Python으로 처음부터 다시 작성되었으며, pydat 디렉토리에서 제공됩니다.
PHP 버전은 실행을 원하는 사람들을 위해 남겨두었지만, Python 구현체만큼 기능이 풍부하거나 확장성이 좋지 않으며 지원되지 않습니다.
PHP 구현에 대한 자세한 내용은 readme를 참조하십시오. Python 구현에 대한 자세한 내용은 계속 읽어보십시오...
pyDat는 Chris Clark의 WhoDat 코드를 Python으로 구현한 것입니다. PHP 구현보다 확장성이 뛰어나고 더 많은 기능을 제공하도록 설계되었습니다.
pyDat는 Python 3.6+ 애플리케이션으로, 실행을 위해 다음이 필요합니다:
데이터베이스를 올바르게 채우기 위해 pydat-populator라는 프로그램이 제공되어 데이터를 자동으로 채웁니다.
whoisxmlapi에서 오는 데이터가 항상 일관된 것 같지는 않으므로 데이터를 수집할 때 주의해야 합니다.
모든 데이터가 올바르게 수집되도록 더 많은 테스트가 필요합니다.
데이터베이스를 설정하는 사람은 스크립트를 실행하기 전에 사용 가능한 플래그를 읽고 자신의 설정에 맞게 조정했는지 확인해야 합니다.
다음은 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
데이터베이스에 데이터의 새 버전을 추가할 때는 변경 사항을 추적하는 데 중요하지 않은 특정 필드를 제외하기 위해 -x 플래그를 사용하거나, 검토 대상이 되는 특정 필드만 포함하기 위해 -n 플래그를 사용해야 합니다. 이렇게 하면 버전 간에 저장되는 데이터 양이 크게 줄어듭니다. -x 또는 -n 중 하나만 사용할 수 있으며, 동시에 사용할 수 없습니다. 자신의 환경에 가장 적합한 것을 선택하면 됩니다. 예를 들어, 매일 업데이트를 받는 경우 contactEmail이 변경되는지만 관심이 있을 수 있지만, 분기마다는 중요하지 않다고 생각하는 특정 필드만 제외하고 싶을 수도 있습니다.
반복적인 플래그 사용 시간을 절약하기 위해 pydat-populator는 구성 파일을 사용합니다. 구성 파일을 만드는 방법에 대한 예제는 예제 구성을 참조하십시오.
pyDat는 자체적으로 데이터를 제공하지 않습니다. ElasticSearch 데이터 저장소에 자체 whois 데이터를 제공해야 합니다.
pydat-populator -u localhost:9200 -f ~/whois/data/1.csv -v -s -x Audit_auditUpdatedDate,updatedDate,standardRegUpdatedDate,expiresDate,standardRegExpiresDate
PyDat 5는 분할된 백엔드/프론트엔드 애플리케이션으로, REST API를 제공하기 위해 Python Flask를 사용하고 대화형 웹 UI를 제공하기 위해 ReactJS를 사용합니다. 애플리케이션을 사용하는 가장 쉬운 방법은 도커 이미지를 빌드하는 것입니다.
cd pydat/
docker build -t mitrecnd/pydat:5
생성된 이미지는 프론트엔드 구성 요소를 백엔드로 컴파일하고 설치하여 전체 앱을 배포할 수 있게 합니다.
그런 다음 배포 구성 파일을 만들고 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
config_example.py 파일을 config.py로 복사하여 docker-compose.yml 파일과 동일한 디렉토리에 구성 파일을 생성합니다.
Python 백엔드는 pip를 사용하여 설치할 수도 있습니다. 이는 데이터 채우기 기능을 기본적으로 실행하려는 경우 유용합니다. 프론트엔드 구성 요소는 미리 컴파일되어 제공되지 않으므로 여기에는 포함되지 않습니다. 프론트엔드를 수동으로 컴파일하고 설치하려면 dockerfile을 참조하십시오.
cd pydat/backend/
pip install ./
패키지를 설치하면 위에서 언급한 pydat-populator 프로그램에 액세스할 수 있습니다.
PyDat 5는 업데이트된 REST API를 도입했지만, PyDat 4에서 반환되었을 출력에 가깝게 v1 API 엔드포인트 세트를 유지합니다. pyDat 4와 5 사이의 일부 구조적 변경으로 인해 출력이 정확히 동일하지는 않습니다.
v1 엔드포인트다음 엔드포인트가 제공됩니다:
api/v1/metadata/
api/v1/metadata/<version>/
메타데이터 엔드포인트는 데이터베이스에 있는 데이터에 사용 가능한 메타데이터를 반환합니다. 버전을 지정하면 해당 특정 버전의 메타데이터를 반환합니다.
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>/
도메인 엔드포인트를 사용하면 특정 도메인 이름에 대한 정보를 얻을 수 있습니다. 기본적으로 데이터베이스에서 찾은 모든 버전의 도메인에 대한 정보를 반환합니다. 더 많은 정보를 지정하여 특정 버전의 도메인 정보를 얻거나 최신 항목을 얻을 수 있습니다. 또한 두 도메인 버전 간의 차이점(diff)을 확인하여 변경된 사항을 볼 수 있습니다.
api/v1/domains/<searchKey>/<searchValue>/
api/v1/domains/<searchKey>/<searchValue>/latest/
api/v1/domains/<searchKey>/<searchValue>/<version>/
api/v1/domains/<searchKey>/<searchValue>/<version1>/<version2>/
domains 엔드포인트를 사용하면 지정된 키를 기반으로 도메인을 검색할 수 있습니다. 현재 지원되는 키는 다음과 같습니다:
domainName
registrant_name
contactEmail
registrant_telephone
도메인 엔드포인트와 유사하게 데이터의 어떤 버전을 찾고 있는지 지정할 수 있습니다.
쿼리 예시:
curl http://pydat.myorg.domain/ajax/domain/google.com/latest/
curl http://pydat.myorg.domain/ajax/domains/domainName/google.com/
api/v1/query
이 엔드포인트는 GET 요청을 통해 4개의 매개변수를 받습니다:
query - ES에서 검색할 쿼리
size - 반환할 요소 수 (페이지 크기)
page - 반환할 페이지, 이 값을 size와 결합하여 결과를 청크 단위로 가져올 수 있습니다.
unique - 도메인 이름당 최신 항목을 반환하려고 시도합니다.
unique 매개변수 참고: unique 매개변수를 사용하는 경우 결과의 페이징이 비활성화되지만, size 매개변수는 반환되는 결과 수를 제어하는 데 여전히 사용됩니다.
v2 엔드포인트다음 엔드포인트가 제공됩니다:
api/v2/metadata
api/v2/metadata/<version>
이 엔드포인트는 v1 해당 엔드포인트와 유사하지만 응답 형식이 다릅니다.
api/v2/resolve/<domain>
이것은 도메인 이름을 IP 주소로 확인할 수 있는 새로운 엔드포인트입니다. 이 기능은 백엔드에서 비활성화될 수 있습니다. 호출하기 전에 /settings 엔드포인트를 호출하여 이 기능이 활성화되어 있는지 확인하십시오.
api/v2/domains/diff [POST]
이 엔드포인트를 사용하면 두 도메인 버전 간의 차이점(diff)을 확인하여 변경된 사항을 볼 수 있습니다. 다음 형식의 JSON 요청이 필요합니다:
{
domain: "mydomain.example",
version1: 1,
version2: 2
}
api/v2/domain [POST]
이 엔드포인트는 주어진 도메인 이름에 대한 정보를 반환하며, 다음 형식의 JSON 요청이 필요합니다:
{
value: "mydomain.example",
version: 1, # 선택사항
chunk_size: 50, # 선택사항
offset: 0 # 선택사항
}
api/v2/query [POST]
이 엔드포인트는 '고급' 쿼리 구문 기능을 지원합니다. 다음 형식의 JSON 요청이 필요합니다:
{
query: "myquery",
chunk_size: 50, # 선택사항
offset: 0, # 선택사항
unique: false, # 선택사항
sort_keys: [ # 선택사항
"domainName",
"registrant_name",
"contactEmail",
"standardRegCreatedDate",
"registrant_telephone",
"dataVersion",
"_score",
]
}
api/v2/info
이 엔드포인트는 Elastic 클러스터에 대한 상태 정보를 제공합니다.
api/v2/settings
이 엔드포인트는 주로 프론트엔드가 백엔드 애플리케이션에서 활성화된 기능을 동적으로 결정하는 데 사용됩니다.
불행히도 Elastic에서 데이터가 저장되는 방식의 구조적 변경으로 인해 pyDat 5는 pyDat 4와 호환되지 않습니다. 즉, pyDat 5에서 사용하려면 데이터를 새로 ElasticSearch 클러스터에 수집해야 합니다.
pyDat는 The MITRE Corporation 2021의 저작권입니다.
PHP 구현은 Chris Clark, 2013의 저작권입니다. [email protected]로 연락하십시오.
PHP와 Python 버전은 동일한 라이선스에 따라 사용이 허가됩니다.
pyDat는 무료 소프트웨어입니다. 자유 소프트웨어 재단(Free Software Foundation)이 발행한 GNU 일반 공중 사용 허가서(GNU General Public License) 버전 3 또는 (선택에 따라) 이후 버전의 조건에 따라 이를 재배포하거나 수정할 수 있습니다.
pyDat는 유용할 것이라는 희망으로 배포되지만, 어떠한 보증도 제공하지 않습니다. 상품성 또는 특정 목적에의 적합성에 대한 묵시적 보증 조차도 제공하지 않습니다. 자세한 내용은 GNU 일반 공중 사용 허가서를 참조하십시오.
pyDat와 함께 GNU 일반 공중 사용 허가서의 사본을 받았을 것입니다. 받지 못했다면 http://www.gnu.org/licenses/를 참조하십시오.
공개 배포 승인; 배포 무제한 14-1633