💭

Re:ゼロから始めるOpenCTI External Input Connector編

2022/09/21に公開

Re:ゼロから始めるOpenCTI

この記事は、Re:ゼロから始めるOpenCTI 導入編の続きになります。

前回までのあらすじ

DockerでOpenCTIをデプロイし、おしゃれなDashboardにアクセスするところまでできたので、実際にインテリジェンスを作るためのデータを収集してみようとしているのであった。

サイバー脅威インテリジェンスとは

脅威インテリジェンスであり、インテリジェンスであり、Threat Intelligenceです。
CERT-UK An introduction to threat intelligenceでは、"Threat intelligence is an elusive concept."と表現するほど、捉えどころのない概念です。が、個人的にしっくりくるものとしては、Joint Chiefs of Staff Joint Publication 2-0 Joint Intelligenceにある、"Information on its own may be of utility to the commander, but when related to other information about the operational environment and considered in the light of past experience, it gives rise to a new understanding of the information, which may be termed “intelligence.” "です。

これを実務的に考えると、やはりSANS The Sliding Scale of Cyber Securityにある、"the process of collecting data, exploiting it into information, and producing an assessment that satisfies a previously identified knowledge gap."が一番しっくりくると思います。

つまり、様々なデータを収集して自身の環境に対して使える形(この場合は、インシデントレスポンスや管理しているシステム、サービスを対象とした脆弱性や攻撃など)に加工した情報だと思っています。

実際にデータを収集してみる

それでも、百聞は一見に如かずなので、実際にデータを収集してみて、どんなものなんだというのを見ていきたいと思います。
(情報提供元はインテリジェンスって言ってるけど、収集してる人や組織にとっては、それってデータなんじゃね?っていう無限ループはおいておきます。自分の思ってるデータとインテリジェンスで生きていこう!)

今回は、OpenCTIの機能の一つである、Connectorsを活用していきます。Connectorsとは、OpenCTI上で簡単に新しいデータを取り入れたり、リッチ化したり、出力したりできる機能です。
大きく分けて4種類の機能があります。

  • External Input Connector
  • Stream Input Connector
  • Internal Enrichment Connector
  • Internal Import File Connector

詳細は、公式ドキュメントで確認してください。

今回は、External Input Connectorを利用してデータを収集します。現在利用できるExternal Input Connectorは、ここにまとまっているものです。それぞれの組織がどんなデータを収集してくれるのかということを全て調べられてないので、詳しい人がいたら是非教えてください。また、組織によって集めたいデータは、違うと思うので好きなものを追加してみてください。

ということで、今回は、CVE DatabaseとMITRE ATT&CKの提供しているデータを収集してみます。Connectersの基本的な追加の方法は、提供されている、docker-compose.ymlの内容をコピーしてすでに展開されているOpenCTIのdocker-compose.ymlに追記して、再度ビルドするというとても簡単な方法です。

CVE Database

まずは、CVE Database Connecterのdocker-compose.ymlを確認します。

docker-compose.yml(connector-cve)

version: '3'
services:
  connector-cve:
    image: opencti/connector-cve:5.3.13
    environment:
      - OPENCTI_URL=http://localhost
      - OPENCTI_TOKEN=ChangeMe
      - CONNECTOR_ID=ChangeMe
      - CONNECTOR_TYPE=EXTERNAL_IMPORT
      - CONNECTOR_NAME=Common Vulnerabilities and Exposures
      - CONNECTOR_SCOPE=identity,vulnerability
      - CONNECTOR_CONFIDENCE_LEVEL=75 # From 0 (Unknown) to 100 (Fully trusted)
      - CONNECTOR_UPDATE_EXISTING_DATA=false
      - CONNECTOR_RUN_AND_TERMINATE=false
      - CONNECTOR_LOG_LEVEL=info
      - CVE_IMPORT_HISTORY=true # Import history at the first run (after only recent), reset the connector state if you want to re-import
      - CVE_NVD_DATA_FEED=https://nvd.nist.gov/feeds/json/cve/1.1/nvdcve-1.1-recent.json.gz
      - CVE_HISTORY_START_YEAR=2002
      - CVE_HISTORY_DATA_FEED=https://nvd.nist.gov/feeds/json/cve/1.1/
      - CVE_INTERVAL=7 # In days, must be strictly greater than 1
    restart: always

ここで必要になるのは、services以下になります。ここを前回構築したOpenCTIのdocker-compose.ymlに追加します。この時、ChangeMeの部分に関しては、新たに環境変数を作成し、OPENCTI_URLに関しては、前回、8080ポートで展開したので、OPENCTI_URL=http://opencti:8080と修正します。
docker-compose.yml(OpenCTI)

version: '3'
services:
---省略---
  connector-import-document:
    image: opencti/connector-import-document:5.3.13
    environment:
      - OPENCTI_URL=http://localhost:8080
      - OPENCTI_TOKEN=${OPENCTI_ADMIN_TOKEN}
      - CONNECTOR_ID=${CONNECTOR_IMPORT_DOCUMENT_ID} # Valid UUIDv4
      - CONNECTOR_TYPE=INTERNAL_IMPORT_FILE
      - CONNECTOR_NAME=ImportDocument
      - CONNECTOR_VALIDATE_BEFORE_IMPORT=true # Validate any bundle before import
      - CONNECTOR_SCOPE=application/pdf,text/plain,text/html
      - CONNECTOR_AUTO=true # Enable/disable auto-import of file
      - CONNECTOR_ONLY_CONTEXTUAL=false # Only extract data related to an entity (a report, a threat actor, etc.)
      - CONNECTOR_CONFIDENCE_LEVEL=15 # From 0 (Unknown) to 100 (Fully trusted)
      - CONNECTOR_LOG_LEVEL=info
      - IMPORT_DOCUMENT_CREATE_INDICATOR=true
    restart: always
    depends_on:
      - opencti
# 追加
  connector-cve:
    image: opencti/connector-cve:5.3.13
    environment:
      - OPENCTI_URL=http://localhost:8080
      - OPENCTI_TOKEN=${OPENCTI_ADMIN_TOKEN}
      - CONNECTOR_ID=${CONNECTOR_IMPORT_CVE_ID}
      - CONNECTOR_TYPE=EXTERNAL_IMPORT
      - CONNECTOR_NAME=Common Vulnerabilities and Exposures
      - CONNECTOR_SCOPE=identity,vulnerability
      - CONNECTOR_CONFIDENCE_LEVEL=75 # From 0 (Unknown) to 100 (Fully trusted)
      - CONNECTOR_UPDATE_EXISTING_DATA=false
      - CONNECTOR_RUN_AND_TERMINATE=false
      - CONNECTOR_LOG_LEVEL=info
      - CVE_IMPORT_HISTORY=true # Import history at the first run (after only recent), reset the connector state if you want to re-import
      - CVE_NVD_DATA_FEED=https://nvd.nist.gov/feeds/json/cve/1.1/nvdcve-1.1-recent.json.gz
      - CVE_HISTORY_START_YEAR=2002
      - CVE_HISTORY_DATA_FEED=https://nvd.nist.gov/feeds/json/cve/1.1/
      - CVE_INTERVAL=7 # In days, must be strictly greater than 1
    restart: always

上で作成した環境変数を、前回作成した、.envに追加します。修正部分に関しては、前回と同様なのでそちらを参考にしてください。
.env

OPENCTI_ADMIN_EMAIL=ChangeMe
OPENCTI_ADMIN_PASSWORD=ChangeMe
OPENCTI_ADMIN_TOKEN=ChangeMe_UUIDv4
MINIO_ROOT_USER=opencti
MINIO_ROOT_PASSWORD=ChangeMe
RABBITMQ_DEFAULT_USER=opencti
RABBITMQ_DEFAULT_PASS=ChangeMe
CONNECTOR_EXPORT_FILE_STIX_ID=ChangeMe_UUIDv4
CONNECTOR_EXPORT_FILE_CSV_ID=ChangeMe_UUIDv4
CONNECTOR_EXPORT_FILE_TXT_ID=ChangeMe_UUIDv4
CONNECTOR_IMPORT_FILE_STIX_ID=ChangeMe_UUIDv4
CONNECTOR_IMPORT_DOCUMENT_ID=ChangeMe_UUIDv4
ELASTIC_MEMORY_SIZE=4G
# 追加
CONNECTOR_IMPORT_CVE_ID=ChangeMe_UUIDv4

ここまできたら、OpenCTIを再ビルドしてみます。

$ docker-compose up -d --build

MITRE ATT&CK

次に、MITRE ATT&CK Connecterのdocker-compose.ymlを確認します。

docker-compose.yml(connector-mitre)

version: '3'
services:
  connector-mitre:
    image: opencti/connector-mitre:5.3.13
    environment:
      - OPENCTI_URL=http://localhost
      - OPENCTI_TOKEN=ChangeMe
      - CONNECTOR_ID=ChangeMe
      - CONNECTOR_TYPE=EXTERNAL_IMPORT
      - "CONNECTOR_NAME=MITRE Datasets"
      - CONNECTOR_SCOPE=marking-definition,identity,attack-pattern,course-of-action,intrusion-set,campaign,malware,tool,report,external-reference-as-report
      - CONNECTOR_CONFIDENCE_LEVEL=75 # From 0 (Unknown) to 100 (Fully trusted)
      - CONNECTOR_UPDATE_EXISTING_DATA=false
      - CONNECTOR_RUN_AND_TERMINATE=false
      - CONNECTOR_LOG_LEVEL=info
      - MITRE_ENTERPRISE_FILE_URL=https://raw.githubusercontent.com/mitre-attack/attack-stix-data/master/enterprise-attack/enterprise-attack.json
      - MITRE_MOBILE_ATTACK_FILE_URL=https://raw.githubusercontent.com/mitre-attack/attack-stix-data/master/mobile-attack/mobile-attack.json
      - MITRE_ICS_ATTACK_FILE_URL=https://raw.githubusercontent.com/mitre-attack/attack-stix-data/master/ics-attack/ics-attack.json
      - MITRE_CAPEC_FILE_URL=https://raw.githubusercontent.com/mitre/cti/master/capec/2.1/stix-capec.json
      - MITRE_INTERVAL=7 # In days, must be strictly greater than 1
    restart: always

ここも必要になるのはservices以下になり、同様にOpenCTIのdocker-compose.ymlに追加します。この時、ChangeMeの部分に関しては、新たに環境変数を作成し、OPENCTI_URLに関しては、前回、8080ポートで展開したので、OPENCTI_URL=http://opencti:8080と修正します。
docker-compose.yml(OpenCTI)

version: '3'
services:
---省略---
  connector-cve:
    image: opencti/connector-cve:5.3.13
    environment:
      - OPENCTI_URL=http://localhost:8080
      - OPENCTI_TOKEN=${OPENCTI_ADMIN_TOKEN}
      - CONNECTOR_ID=${CONNECTOR_IMPORT_CVE_ID}
      - CONNECTOR_TYPE=EXTERNAL_IMPORT
      - CONNECTOR_NAME=Common Vulnerabilities and Exposures
      - CONNECTOR_SCOPE=identity,vulnerability
      - CONNECTOR_CONFIDENCE_LEVEL=75 # From 0 (Unknown) to 100 (Fully trusted)
      - CONNECTOR_UPDATE_EXISTING_DATA=false
      - CONNECTOR_RUN_AND_TERMINATE=false
      - CONNECTOR_LOG_LEVEL=info
      - CVE_IMPORT_HISTORY=true # Import history at the first run (after only recent), reset the connector state if you want to re-import
      - CVE_NVD_DATA_FEED=https://nvd.nist.gov/feeds/json/cve/1.1/nvdcve-1.1-recent.json.gz
      - CVE_HISTORY_START_YEAR=2002
      - CVE_HISTORY_DATA_FEED=https://nvd.nist.gov/feeds/json/cve/1.1/
      - CVE_INTERVAL=7 # In days, must be strictly greater than 1
    restart: always
# 追加
connector-mitre:
    image: opencti/connector-mitre:5.3.12
    environment:
      - OPENCTI_URL=http://opencti:8080
      - OPENCTI_TOKEN=${OPENCTI_ADMIN_TOKEN}
      - CONNECTOR_ID=${CONNECTOR_IMPORT_MITRE_ID}
      - CONNECTOR_TYPE=EXTERNAL_IMPORT
      - "CONNECTOR_NAME=MITRE Datasets"
      - CONNECTOR_SCOPE=marking-definition,identity,attack-pattern,course-of-action,intrusion-set,campaign,malware,tool,report,external-reference-as-report
      - CONNECTOR_CONFIDENCE_LEVEL=75 # From 0 (Unknown) to 100 (Fully trusted)
      - CONNECTOR_UPDATE_EXISTING_DATA=false
      - CONNECTOR_RUN_AND_TERMINATE=false
      - CONNECTOR_LOG_LEVEL=info
      - MITRE_ENTERPRISE_FILE_URL=https://raw.githubusercontent.com/mitre-attack/attack-stix-data/master/enterprise-attack/enterprise-attack.json
      - MITRE_MOBILE_ATTACK_FILE_URL=https://raw.githubusercontent.com/mitre-attack/attack-stix-data/master/mobile-attack/mobile-attack.json
      - MITRE_ICS_ATTACK_FILE_URL=https://raw.githubusercontent.com/mitre-attack/attack-stix-data/master/ics-attack/ics-attack.json
      - MITRE_CAPEC_FILE_URL=https://raw.githubusercontent.com/mitre/cti/master/capec/2.1/stix-capec.json
      - MITRE_INTERVAL=7 # In days, must be strictly greater than 1
    restart: always

上で作成した環境変数を、.envに追加します。修正部分に関しては、前回と同様なのでそちらを参考にしてください。
.env

OPENCTI_ADMIN_EMAIL=ChangeMe
OPENCTI_ADMIN_PASSWORD=ChangeMe
OPENCTI_ADMIN_TOKEN=ChangeMe_UUIDv4
MINIO_ROOT_USER=opencti
MINIO_ROOT_PASSWORD=ChangeMe
RABBITMQ_DEFAULT_USER=opencti
RABBITMQ_DEFAULT_PASS=ChangeMe
CONNECTOR_EXPORT_FILE_STIX_ID=ChangeMe_UUIDv4
CONNECTOR_EXPORT_FILE_CSV_ID=ChangeMe_UUIDv4
CONNECTOR_EXPORT_FILE_TXT_ID=ChangeMe_UUIDv4
CONNECTOR_IMPORT_FILE_STIX_ID=ChangeMe_UUIDv4
CONNECTOR_IMPORT_DOCUMENT_ID=ChangeMe_UUIDv4
ELASTIC_MEMORY_SIZE=4G
CONNECTOR_IMPORT_CVE_ID=ChangeMe_UUIDv4
# 追加
CONNECTOR_IMPORT_MITRE_ID=ChangeMe_UUIDv4

ここまできたら、OpenCTIを再ビルドしてみます。

$ docker-compose up -d --build

確認

無事にデプロイができたら、OpenCTIのDashboardにアクセスし、左側Data>上部Connectorsに追加されていることを確認します。また、上部Entitiesに次々とデータがインポートされていることが確認できます。データの詳細は、左側Activities>Analisysから確認できます。

はじめて追加した場合は、すべてインポートするのにかなりの時間がかかると思いますが、とりあえずデータを収集することができました。次回は、コラムっぽくなるかもしれませんが、自組織でどのデータをインポートすればいいのかを考察して実際に追加したいと思います。

Discussion