birabiraのめも

忘れっぽいのでここにメモをしていきます

OpenCTI触ってみた

OpenCTIとは

脅威情報を管理するためのプラットフォーム。技術情報と非技術情報を構造化・保存・整理・視覚化をすることができるらしい。

このプラットフォームはSTIX2.1ベースらしいので、STIXの規格については改めて確認したほうが良い。日本語の解説資料求む。

https://docs.oasis-open.org/cti/stix/v2.1/stix-v2.1.html

本記事はOpenCTIのGithubページやドキュメントページを中心に試してみる。

Githubページ: https://github.com/OpenCTI-Platform/opencti

ドキュメントページ: https://docs.opencti.io/latest/

TIP (Threat Intelligence Platform) について

TIPとはその名の通り、脅威情報を収集・集約し活用することができるプラットフォームのことと思われる。正直あまり詳しくないので、PaloAltoのページを読んだところ次のようなことが記載されていた。

A Threat Intelligence Platform (TIP) is a technology solution that collects, aggregates and organizes threat intel data from multiple sources and formats. A TIP provides security teams with information on known malware and other threats, powering efficient and accurate threat identification, investigation and response.

元ページ: https://www.paloaltonetworks.com/cyberpedia/what-is-a-threat-intelligence-platform

DeepL訳

脅威インテリジェンスプラットフォーム(TIP)は、複数のソースやフォーマットから脅威インテリジェンスデータを収集、集約、整理するテクノロジーソリューションです。TIPは、既知のマルウェアやその他の脅威に関する情報をセキュリティチームに提供し、効率的で正確な脅威の特定、調査、対応を支援します。

今回はその中でもOpenCTIというオープンソースのプロダクトを触ってみて、どのように収集され活用することができるのかを調査してみたいと思う

アーキテクチャ

docs.opencti.io

公式ドキュメントにアーキテクチャー図が用意されていた。このプロダクトは基本的にはPythyonとRabbitMQ、ElasticSearchをベースとした構成になっている。

構成要素 概要
Connectors 外部からの情報を収集し、プラットフォームに流し込む役割。また、外部への出力についてもこのコネクターが担っている。公式ドキュメントにある通りいくつかのタイプが存在するため要確認
Messaging system 大量の脅威情報を扱うためか、キューイングシステムが実装されている
Workers キューに溜まっている情報を整形し構造化した状態でプラットフォームに流し込まれるっぽい。
Platform WebUI含めたシステムのことだろうか。GraphQLも使えるとのこと

アーキテクチャ

構築

docs.opencti.io

Dockerベースで構築することができるので非常に便利。Platformのみならず、ConnectorsもDockerベースで構築することができる。Dockerのインストール方法は割愛

あくまでも本記事ではクローズ環境でテスト的に構築するため、本運用の際にはセキュリティを重視した設定・対策を行うこと

そして公式で用意されているコネクターもインストールしちゃいます。

リポジトリのクローン

# クローン
git clone https://github.com/OpenCTI-Platform/docker.git
cd docker

いくつかのコネクターもインストールしているため、docker-compose.ymlを修正します。(長すぎるので最下部のAppendixに貼り付けます)

MISP関連のコネクターはMISPが構築してある前提とします。

環境変数の準備

公式が用意するdocker-compose.yml環境変数ベースで設定することを意図しているため.envを用意して環境変数を設定する

Point

  • OPENCTI_ADMIN_EMAILOPENCTI_ADMIN_PASSWORDは適宜変える
  • CONNECTOR_XXX_IDはコネクターのIDで、UUIDを設定する。後ほどコネクターを追加するので覚えておくこと
## 環境変数
sudo apt install -y jq
cd ~/docker
(cat << EOF
OPENCTI_ADMIN_EMAIL=admin@opencti.io
OPENCTI_ADMIN_PASSWORD=ChangeMePlease
OPENCTI_ADMIN_TOKEN=$(cat /proc/sys/kernel/random/uuid)
MINIO_ROOT_USER=$(cat /proc/sys/kernel/random/uuid)
MINIO_ROOT_PASSWORD=$(cat /proc/sys/kernel/random/uuid)
RABBITMQ_DEFAULT_USER=guest
RABBITMQ_DEFAULT_PASS=guest
ELASTIC_MEMORY_SIZE=4G
CONNECTOR_HISTORY_ID=$(cat /proc/sys/kernel/random/uuid)
CONNECTOR_EXPORT_FILE_STIX_ID=$(cat /proc/sys/kernel/random/uuid)
CONNECTOR_EXPORT_FILE_CSV_ID=$(cat /proc/sys/kernel/random/uuid)
CONNECTOR_IMPORT_FILE_STIX_ID=$(cat /proc/sys/kernel/random/uuid)
CONNECTOR_IMPORT_REPORT_ID=$(cat /proc/sys/kernel/random/uuid)
CONNECTOR_CVE_ID=$(cat /proc/sys/kernel/random/uuid)
CONNECTOR_MISP_ID=$(cat /proc/sys/kernel/random/uuid)
CONNECTOR_URLHAUS_PAYLOAD_ID=$(cat /proc/sys/kernel/random/uuid)
CONNECTOR_URLHAUS_ID=$(cat /proc/sys/kernel/random/uuid)
CONNECTOR_BAZAAR_ID=$(cat /proc/sys/kernel/random/uuid)
CONNECTOR_TRACKER_ID=$(cat /proc/sys/kernel/random/uuid)
CONNECTOR_COLLECTION_ID=$(cat /proc/sys/kernel/random/uuid)
CONNECTOR_DISARM_ID=$(cat /proc/sys/kernel/random/uuid)
CONNECTOR_CISA_ID=$(cat /proc/sys/kernel/random/uuid)
CONNECTOR_MITRE_ID=$(cat /proc/sys/kernel/random/uuid)
CONNECTOR_OPENCTI_ID=$(cat /proc/sys/kernel/random/uuid)
CONNECTOR_PHISHUNT_ID=$(cat /proc/sys/kernel/random/uuid)
EOF
) > .env

その他設定

Elastic関連

sudo sysctl -w vm.max_map_count=1048575

起動

sudo docker-compose up -d
または
sudo docker compose up -d

http://[ホストのIPアドレス]:8080にアクセスを行い、ログイン画面が表示されることを確認する

使い方?

まだ正しい使い方が何なのかは分からないがどのような仕組みでデータが管理されているかを把握したいと思う。大体こういうのは片っ端から実装されている機能をドキュメントを見ながら試すのが早いと信じて。。

思いっきりSTIX2.1ベースでは??というのは現状一旦無視して画面上はこうなっているということから始めたいと思う。

ログイン

先程のログイン画面で、IDとパスワードを入力しログインする。この際のIDとパスワードは.envファイルで指定したもの。ログインが成功するとダッシュボードが表示されると思う。

すでにいくつかのコネクターが起動しているため、データが格納されていると思われる。

ダッシュボード画面

Analyses

docs.opencti.io

Analysesが何なのかはドキュメントに記載はないが、分析のなにかなんだろうとは思う。

report

STIX 2.1のreportと同一っぽい。脅威情報を取りまとめ、分析した結果をまとめる機能の様子。セキュリティベンダーが出している脅威情報の取りまとめのページ相当の機能と思った。

ちなみにSTIX 2.1のreportにはこう書かれている

Reports are collections of threat intelligence focused on one or more topics, such as a description of a threat actor, malware, or attack technique, including context and related details. They are used to group related threat intelligence together so that it can be published as a comprehensive cyber threat story.

https://docs.oasis-open.org/cti/stix/v2.1/os/stix-v2.1-os.html#_n8bjzg1ysgdq

実際に画面を確認すると、MISPから取り込まれたデータがreportとして確認することができた。TLP:CLARなので画面のスクショ載せちゃいます。

概要画面

ナレッジ画面

その他にもこのレポートに関する画面はあるがIoCの一覧のテーブルだったため、割愛。やはり、このレポート機能は文字通りレポートの機能で特定の脅威の情報を取りまとめたものっぽい。

Grouping

これはデータが無かったのでドキュメントベースでしかわからないが、reportほどではないもののグルーピングしたいものをまとめるっぽい。

STIX2.1の定義

A Grouping object explicitly asserts that the referenced STIX Objects have a shared context, unlike a STIX Bundle (which explicitly conveys no context). A Grouping object should not be confused with an intelligence product, which should be conveyed via a STIX Report.

[https://docs.oasis-open.org/cti/stix/v2.1/os/stix-v2.1-os.html#_6hdrixb3ua4j

あーね。

Malware Analyses

これもデータが無かったのでドキュメントベース。マルウェアの解析結果とかを乗せることができそう。

よくわからないけど、マルウェアのオンラインサンドボックスがSTIXの形式で出力してくれればこれに該当する?

STIX2.1の定義

Malware Analysis captures the metadata and results of a particular static or dynamic analysis performed on a malware instance or family. One of result or analysis_sco_refs properties MUST be provided.

Note

Noteはメモっぽいノートなので割愛

External references

外部の情報ソースのことなので割愛

Case

docs.opencti.io

reportは脅威情報を取りまとめたものを取り扱う機能だったが、Caseは自組織のインシデント管理を行う機能っぽい。

Incident Responses

当然データとしては空っぽなのでテストデータを入れてみたいと思う。試してみたところreport画面と同じことができ、大枠の名前だけが変わった感じと思う。

概要画面

エンティティ画面

エンティティ画面ではツールなどを入れた。

観測結果画面

観測結果画面ではIPやドメイン情報を入れることができた。タスクなども入れることができるみたいだが・・・?

Event

docs.opencti.io

ドキュメントないよ!?ただし、overviewには次の通り記載あり。SIEMからのイベントなどをここに入れまくってやる感じなのかな?

Events: all incidents & alerts coming from operational systems as well as sightings.

Overview - OpenCTI Documentation

Observation

https://docs.opencti.io/latest/usage/exploring-observations/

ドキュメントないよ!?ただし、overviewには次の通り記載あり。実際に登録されているデータを確認すると各種Feedから取ってきたと思われるIoCっぽいものが一覧として表示されている。

Observations: all technical data in the platform such as observables, artifacts and indicators.

Overview - OpenCTI Documentation

観測結果画面

なお、ここまでの情報をhot knowledgeとして定義されている。ちょくちょく変わるものなのでメンテナンスや分析が必要だよねって言うことらしい。

https://docs.opencti.io/latest/usage/overview/?h=artifact#the-hot-knowledge

Threats

脅威グループなどのデータをまとめるページっぽい

Arsenal

脆弱性マルウェア、悪用されたツールなどをまとめるページっぽい

Techniques

MITRE ATT&CKなどのテクニックがまとまっているっぽい?

Entities

セクターや組織などその他情報

Locations

地域・国・都市などの位置情報

なおここまでの情報をCold Knowledgeと定義しているらしい。辞書的に扱えるデータ的な。

Connector

冒頭にも記載した通り、アドオンとして外部から情報を収集したり出力したりする部分を担う機能。現在インストールしたコネクターは次の通り。

公開されていて無償のものは全て入れたつもりだが、動作していないと思うようなものもあるので、インストール後の確認は重要と思う。

ネクターの一覧はここにあるそうです。

filigran.notion.site

Blog

開発者によるブログ。結構更新されてるしヒントがあるかも。

blog.filigran.io

感想

様々な情報をSTIXベースでここまで管理・可視化をしてくれる素晴らしいプロダクトだと思った。アーキテクチャーとしてもElasticやMQなど比較的モダンでよく設計されているし、メンテナンスもそこそこ行われているため、TIPを構築したいならOpenCTIは選択肢に入ると思う。

この記事では紹介できなかった機能はもう少しあるようなのでぜひ、公式ドキュメントを読んでみてほしい。概念的な部分はわかりやすく記載されている。

ここまで機能があるとすると自組織にとって不要な機能ややり過ぎな機能がどうしても出てきてしまうと思う。自組織にとってどの情報を精査し、Threat Intelligenceとして管理・活用していくかの方針がないとツールだけが宙に浮いてしまい、非効率的な状況を生んでしまうだけだと思った。

特にCold Knowledge部分をメンテし続けようと思うとそれ相応の人員とコストが必要になるため、有償のTIPも視野に入る。

まー、この記事を読んでいる人はそこの検討が終わっているから製品選定をしていると信じて。。。(逆にここらへん考えている人何を考えてるか教えてください)

最後に

面白そうなオープンソースのTIP募集中です

参考記事

拝読いたしました。ありがとうございます。

ninoseki.github.io techblog.zozo.com zenn.dev

Appendix

docker-compose.yml

version: '3'
services:
  redis:
    image: redis:7.0.12
    restart: always
    volumes:
      - redisdata:/data
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:8.9.0
    volumes:
      - esdata:/usr/share/elasticsearch/data
    environment:
      # Comment-out the line below for a cluster of multiple nodes
      - discovery.type=single-node
      # Uncomment the line below below for a cluster of multiple nodes
      # - cluster.name=docker-cluster
      - xpack.ml.enabled=false
      - xpack.security.enabled=false
      - "ES_JAVA_OPTS=-Xms${ELASTIC_MEMORY_SIZE} -Xmx${ELASTIC_MEMORY_SIZE}"
    restart: always
    ulimits:
      memlock:
        soft: -1
        hard: -1
      nofile:
        soft: 65536
        hard: 65536
  minio:
    image: minio/minio:RELEASE.2023-05-18T00-05-36Z
    volumes:
      - s3data:/data
    ports:
      - "9000:9000"
    environment:
      MINIO_ROOT_USER: ${MINIO_ROOT_USER}
      MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD}    
    command: server /data
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
      interval: 30s
      timeout: 20s
      retries: 3
    restart: always
  rabbitmq:
    image: rabbitmq:3.12-management
    environment:
      - RABBITMQ_DEFAULT_USER=${RABBITMQ_DEFAULT_USER}
      - RABBITMQ_DEFAULT_PASS=${RABBITMQ_DEFAULT_PASS}
      - RABBITMQ_NODENAME=rabbit01@localhost
    volumes:
      - amqpdata:/var/lib/rabbitmq
    restart: always
  opencti:
    image: opencti/platform:5.10.0
    environment:
      - NODE_OPTIONS=--max-old-space-size=8096
      - APP__PORT=8080
      - APP__BASE_URL=${OPENCTI_BASE_URL}
      - APP__ADMIN__EMAIL=${OPENCTI_ADMIN_EMAIL}
      - APP__ADMIN__PASSWORD=${OPENCTI_ADMIN_PASSWORD}
      - APP__ADMIN__TOKEN=${OPENCTI_ADMIN_TOKEN}
      - APP__APP_LOGS__LOGS_LEVEL=error
      - REDIS__HOSTNAME=redis
      - REDIS__PORT=6379
      - ELASTICSEARCH__URL=http://elasticsearch:9200
      - MINIO__ENDPOINT=minio
      - MINIO__PORT=9000
      - MINIO__USE_SSL=false
      - MINIO__ACCESS_KEY=${MINIO_ROOT_USER}
      - MINIO__SECRET_KEY=${MINIO_ROOT_PASSWORD}
      - RABBITMQ__HOSTNAME=rabbitmq
      - RABBITMQ__PORT=5672
      - RABBITMQ__PORT_MANAGEMENT=15672
      - RABBITMQ__MANAGEMENT_SSL=false
      - RABBITMQ__USERNAME=${RABBITMQ_DEFAULT_USER}
      - RABBITMQ__PASSWORD=${RABBITMQ_DEFAULT_PASS}
      - SMTP__HOSTNAME=${SMTP_HOSTNAME}
      - SMTP__PORT=25
      - PROVIDERS__LOCAL__STRATEGY=LocalStrategy
    ports:
      - "8080:8080"
    depends_on:
      - redis
      - elasticsearch
      - minio
      - rabbitmq
    restart: always
  worker:
    image: opencti/worker:5.10.0
    environment:
      - OPENCTI_URL=http://opencti:8080
      - OPENCTI_TOKEN=${OPENCTI_ADMIN_TOKEN}
      - WORKER_LOG_LEVEL=info
    depends_on:
      - opencti
    deploy:
      mode: replicated
      replicas: 3
    restart: always
  connector-export-file-stix:
    image: opencti/connector-export-file-stix:5.10.0
    environment:
      - OPENCTI_URL=http://opencti:8080
      - OPENCTI_TOKEN=${OPENCTI_ADMIN_TOKEN}
      - CONNECTOR_ID=${CONNECTOR_EXPORT_FILE_STIX_ID} # Valid UUIDv4
      - CONNECTOR_TYPE=INTERNAL_EXPORT_FILE
      - CONNECTOR_NAME=ExportFileStix2
      - CONNECTOR_SCOPE=application/json
      - CONNECTOR_CONFIDENCE_LEVEL=15 # From 0 (Unknown) to 100 (Fully trusted)
      - CONNECTOR_LOG_LEVEL=info
    restart: always
    depends_on:
      - opencti
  connector-export-file-csv:
    image: opencti/connector-export-file-csv:5.10.0
    environment:
      - OPENCTI_URL=http://opencti:8080
      - OPENCTI_TOKEN=${OPENCTI_ADMIN_TOKEN}
      - CONNECTOR_ID=${CONNECTOR_EXPORT_FILE_CSV_ID} # Valid UUIDv4
      - CONNECTOR_TYPE=INTERNAL_EXPORT_FILE
      - CONNECTOR_NAME=ExportFileCsv
      - CONNECTOR_SCOPE=text/csv
      - CONNECTOR_CONFIDENCE_LEVEL=15 # From 0 (Unknown) to 100 (Fully trusted)
      - CONNECTOR_LOG_LEVEL=info
    restart: always
    depends_on:
      - opencti
  connector-export-file-txt:
    image: opencti/connector-export-file-txt:5.10.0
    environment:
      - OPENCTI_URL=http://opencti:8080
      - OPENCTI_TOKEN=${OPENCTI_ADMIN_TOKEN}
      - CONNECTOR_ID=${CONNECTOR_EXPORT_FILE_TXT_ID} # Valid UUIDv4
      - CONNECTOR_TYPE=INTERNAL_EXPORT_FILE
      - CONNECTOR_NAME=ExportFileTxt
      - CONNECTOR_SCOPE=text/plain
      - CONNECTOR_CONFIDENCE_LEVEL=15 # From 0 (Unknown) to 100 (Fully trusted)
      - CONNECTOR_LOG_LEVEL=info
    restart: always
    depends_on:
      - opencti
  connector-import-file-stix:
    image: opencti/connector-import-file-stix:5.10.0
    environment:
      - OPENCTI_URL=http://opencti:8080
      - OPENCTI_TOKEN=${OPENCTI_ADMIN_TOKEN}
      - CONNECTOR_ID=${CONNECTOR_IMPORT_FILE_STIX_ID} # Valid UUIDv4
      - CONNECTOR_TYPE=INTERNAL_IMPORT_FILE
      - CONNECTOR_NAME=ImportFileStix
      - CONNECTOR_VALIDATE_BEFORE_IMPORT=true # Validate any bundle before import
      - CONNECTOR_SCOPE=application/json,text/xml
      - CONNECTOR_AUTO=true # Enable/disable auto-import of file
      - CONNECTOR_CONFIDENCE_LEVEL=15 # From 0 (Unknown) to 100 (Fully trusted)
      - CONNECTOR_LOG_LEVEL=info
    restart: always
    depends_on:
      - opencti
  connector-import-document:
    image: opencti/connector-import-document:5.10.0
    environment:
      - OPENCTI_URL=http://opencti: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.10.0
    environment:
      - OPENCTI_URL=http://opencti:8080
      - OPENCTI_TOKEN=${OPENCTI_ADMIN_TOKEN}
      - CONNECTOR_ID=${CONNECTOR_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=error
      - 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
    depends_on:
      - opencti
  connector-misp:
    image: opencti/connector-misp:5.10.0
    environment:
      - OPENCTI_URL=http://opencti:8080
      - OPENCTI_TOKEN=${OPENCTI_ADMIN_TOKEN}
      - CONNECTOR_ID=${CONNECTOR_MISP_ID}
      - CONNECTOR_TYPE=EXTERNAL_IMPORT
      - CONNECTOR_NAME=MISP
      - CONNECTOR_SCOPE=misp
      - CONNECTOR_CONFIDENCE_LEVEL=25 # From 0 (Unknown) to 100 (Fully trusted)
      - CONNECTOR_UPDATE_EXISTING_DATA=false
      - CONNECTOR_LOG_LEVEL=debug
      - MISP_URL=https://192.168.20.114/ # Required
      - MISP_REFERENCE_URL= # Optional, will be used to create external reference to MISP event (default is "url")
      - MISP_KEY=changeme # Required
      - MISP_SSL_VERIFY=false # Required
      - MISP_DATETIME_ATTRIBUTE=timestamp # Required, filter to be used in query for new MISP events
      - MISP_REPORT_DESCRIPTION_ATTRIBUTE_FILTER= # Optional, filter to be used to find the attribute with report description (example: "type=comment,category=Internal reference")
      - MISP_CREATE_REPORTS=true # Required, create report for MISP event
      - MISP_CREATE_INDICATORS=true # Required, create indicators from attributes
      - MISP_CREATE_OBSERVABLES=true # Required, create observables from attributes
      - MISP_CREATE_OBJECT_OBSERVABLES=true # Required, create text observables for MISP objects
      - MISP_CREATE_TAGS_AS_LABELS=true # Optional, create tags as labels (sanitize MISP tag to OpenCTI labels)
      - MISP_GUESS_THREAT_FROM_TAGS=false # Optional, try to guess threats (threat actor, intrusion set, malware, etc.) from MISP tags when they are present in OpenCTI
      - MISP_AUTHOR_FROM_TAGS=false # Optional, map creator:XX=YY (author of event will be YY instead of the author of the event)
      - MISP_MARKINGS_FROM_TAGS=false # Optional, map marking:XX=YY (in addition to TLP, add XX:YY as marking definition, where XX is marking type, YY is marking value)
      - MISP_ENFORCE_WARNING_LIST=false # Optional, enforce warning list in MISP queries
      - MISP_REPORT_TYPE=misp-event # Optional, report_class if creating report for event
      - MISP_IMPORT_FROM_DATE=2000-01-01 # Required, import all event from this date
      - MISP_IMPORT_TAGS= # Optional, list of tags used for import events
      - MISP_IMPORT_TAGS_NOT= # Optional, list of tags to not include
      - MISP_IMPORT_CREATOR_ORGS= # Optional, only import events created by those orgs (put the identifiers here)
      - MISP_IMPORT_CREATOR_ORGS_NOT= # Optional, do not import events created by those orgs (put the identifiers here)
      - MISP_IMPORT_OWNER_ORGS= # Optional, only import events owned by those orgs (put the identifiers here)
      - MISP_IMPORT_OWNER_ORGS_NOT= # Optional, do not import events owned by those orgs (put the identifiers here)
      - MISP_IMPORT_KEYWORD= # Optional, search only events based on a keyword
      - MISP_IMPORT_DISTRIBUTION_LEVELS= # Optional, only import events with the given distribution levels (ex: 0,1,2,3)
      - MISP_IMPORT_THREAT_LEVELS= # Optional only import events with the given threat levels (ex: 1,2,3,4)
      - MISP_IMPORT_ONLY_PUBLISHED=false
      - MISP_IMPORT_WITH_ATTACHMENTS=false # Optional, try to import a PDF file from the attachment attribute
      - MISP_IMPORT_TO_IDS_NO_SCORE=40 # Optional, use as a score for the indicator/observable if the attribute to_ids is no
      - MISP_IMPORT_UNSUPPORTED_OBSERVABLES_AS_TEXT=false #  Optional, import unsupported observable as x_opencti_text
      - MISP_IMPORT_UNSUPPORTED_OBSERVABLES_AS_TEXT_TRANSPARENT=true #  Optional, import unsupported observable as x_opencti_text just with the value
      - MISP_INTERVAL=5 # Required, in minutes
    restart: always
    depends_on:
      - opencti
  connector-urlhaus-recent-payloads:
    image: opencti/connector-urlhaus-recent-payloads:5.10.0
    environment:
      - OPENCTI_URL=http://opencti:8080
      - OPENCTI_TOKEN=${OPENCTI_ADMIN_TOKEN}
      - CONNECTOR_ID=${CONNECTOR_URLHAUS_PAYLOAD_ID}
      - CONNECTOR_TYPE=EXTERNAL_IMPORT
      - "CONNECTOR_NAME=URLhaus Recent Payloads"
      - CONNECTOR_CONFIDENCE_LEVEL=50 # From 0 (Unknown) to 100 (Fully trusted)
      - CONNECTOR_UPDATE_EXISTING_DATA=false
      - CONNECTOR_LOG_LEVEL=error
      - URLHAUS_RECENT_PAYLOADS_API_URL=https://urlhaus-api.abuse.ch/v1/
      - URLHAUS_RECENT_PAYLOADS_COOLDOWN_SECONDS=300 # Time to wait in seconds between subsequent requests
      - URLHAUS_RECENT_PAYLOADS_INCLUDE_FILETYPES=exe,dll,docm,docx,doc,xls,xlsx,xlsm,js,xll # (Optional) Only download files if any tag matches. (Comma separated)
      - URLHAUS_RECENT_PAYLOADS_INCLUDE_SIGNATURES= # (Optional) Only download files matching these Yara rules. (Comma separated)
      - URLHAUS_RECENT_PAYLOADS_SKIP_UNKNOWN_FILETYPES=true # Skip files with an unknown file type
      - URLHAUS_RECENT_PAYLOADS_SKIP_NULL_SIGNATURE=true # Skip files that didn't match known Yara rules
      - URLHAUS_RECENT_PAYLOADS_LABELS=urlhaus # (Optional) Labels to apply to uploaded Artifacts. (Comma separated)
      - URLHAUS_RECENT_PAYLOADS_LABELS_COLOR=#54483b
      - URLHAUS_RECENT_PAYLOADS_SIGNATURE_LABEL_COLOR=#0059f7 # Color for Yara rule match label
      - URLHAUS_RECENT_PAYLOADS_FILETYPE_LABEL_COLOR=#54483b # Color to use for filetype label
    restart: always
  connector-urlhaus:
    image: opencti/connector-urlhaus:5.10.0
    environment:
      - OPENCTI_URL=http://opencti:8080
      - OPENCTI_TOKEN=${OPENCTI_ADMIN_TOKEN}
      - CONNECTOR_ID=${CONNECTOR_URLHAUS_ID}
      - CONNECTOR_TYPE=EXTERNAL_IMPORT
      - "CONNECTOR_NAME=Abuse.ch URLhaus"
      - CONNECTOR_SCOPE=urlhaus
      - CONNECTOR_CONFIDENCE_LEVEL=40 # From 0 (Unknown) to 100 (Fully trusted)
      - CONNECTOR_UPDATE_EXISTING_DATA=false
      - CONNECTOR_LOG_LEVEL=error
      - URLHAUS_CSV_URL=https://urlhaus.abuse.ch/downloads/csv_recent/
      - URLHAUS_IMPORT_OFFLINE=true
      - URLHAUS_THREATS_FROM_LABELS=true
      - URLHAUS_INTERVAL=3 # In days, must be strictly greater than 1
    restart: always
  connector-malware-bazaar-recent-additions:
    image: opencti/connector-malwarebazaar-recent-additions:5.10.0
    environment:
      - OPENCTI_URL=http://opencti:8080
      - OPENCTI_TOKEN=${OPENCTI_ADMIN_TOKEN}
      - CONNECTOR_ID=${CONNECTOR_BAZAAR_ID}
      - CONNECTOR_TYPE=EXTERNAL_IMPORT
      - "CONNECTOR_NAME=MalwareBazaar Recent Additions"
      - CONNECTOR_CONFIDENCE_LEVEL=50 # From 0 (Unknown) to 100 (Fully trusted)
      - CONNECTOR_UPDATE_EXISTING_DATA=false
      - CONNECTOR_LOG_LEVEL=error
      - MALWAREBAZAAR_RECENT_ADDITIONS_API_URL=https://mb-api.abuse.ch/api/v1/
      - MALWAREBAZAAR_RECENT_ADDITIONS_COOLDOWN_SECONDS=300 # Time to wait in seconds between subsequent requests
      - MALWAREBAZAAR_RECENT_ADDITIONS_INCLUDE_TAGS=exe,dll,docm,docx,doc,xls,xlsx,xlsm,js # (Optional) Only download files if any tag matches. (Comma separated)
      - MALWAREBAZAAR_RECENT_ADDITIONS_INCLUDE_REPORTERS= # (Optional) Only download files uploaded by these reporters. (Comma separated)
      - MALWAREBAZAAR_RECENT_ADDITIONS_LABELS=malware-bazar # (Optional) Labels to apply to uploaded Artifacts. (Comma separated)
      - MALWAREBAZAAR_RECENT_ADDITIONS_LABELS_COLOR=#54483b # Color to use for labels
    restart: always
  connector-cybercrimetracker:
    image: opencti/connector-cybercrime-tracker:5.10.0
    environment:
      - OPENCTI_URL=http://opencti:8080
      - OPENCTI_TOKEN=${OPENCTI_ADMIN_TOKEN}
      - CONNECTOR_ID=${CONNECTOR_TRACKER_ID}
      - CONNECTOR_TYPE=EXTERNAL_IMPORT
      - CONNECTOR_NAME=Cybercrime-Tracker
      - CONNECTOR_SCOPE=cybercrime-tracker
      - CONNECTOR_CONFIDENCE_LEVEL=15 # From 0 (Unknown) to 100 (Fully trusted)
      - CONNECTOR_UPDATE_EXISTING_DATA=false
      - CONNECTOR_LOG_LEVEL=error
      - CYBERCRIME_TRACKER_FEED_URL=https://cybercrime-tracker.net/rss.xml
      - CYBERCRIME_TRACKER_TLP=CLEAR
      - CYBERCRIME_TRACKER_INTERVAL=86400
      - CYBERCRIME_TRACKER_CREATE_INDICATORS=true
      - CYBERCRIME_TRACKER_CREATE_OBSERVABLES=true
    restart: always
  connector-cyber-campaign-collection:
    image: opencti/connector-cyber-campaign-collection:5.10.0
    environment:
      - OPENCTI_URL=http://opencti:8080
      - OPENCTI_TOKEN=${OPENCTI_ADMIN_TOKEN}
      - CONNECTOR_ID=${CONNECTOR_COLLECTION_ID}
      - CONNECTOR_TYPE=EXTERNAL_IMPORT
      - "CONNECTOR_NAME=APT & Cybercriminals Campaign Collection"
      - CONNECTOR_SCOPE=report
      - CONNECTOR_CONFIDENCE_LEVEL=0 # From 0 (Unknown) to 100 (Fully trusted)
      - CONNECTOR_UPDATE_EXISTING_DATA=false
      - CONNECTOR_RUN_AND_TERMINATE=false
      - CONNECTOR_LOG_LEVEL=error
      - CYBER_MONITOR_GITHUB_TOKEN= # If not provided, rate limit will be very low
      - CYBER_MONITOR_FROM_YEAR=2018
      - CYBER_MONITOR_INTERVAL=4 # In days, must be strictly greater than 1
    restart: always
  connector-disarm-framework:
    image: opencti/connector-disarm-framework:5.10.0
    environment:
      - OPENCTI_URL=http://opencti:8080
      - OPENCTI_TOKEN=${OPENCTI_ADMIN_TOKEN}
      - CONNECTOR_ID=${CONNECTOR_DISARM_ID}
      - CONNECTOR_TYPE=EXTERNAL_IMPORT
      - "CONNECTOR_NAME=DISARM Framework"
      - CONNECTOR_SCOPE=marking-definition,identity,attack-pattern,course-of-action,intrusion-set,campaign,malware,tool,report,narrative,event,channel
      - CONNECTOR_CONFIDENCE_LEVEL=75 # From 0 (Unknown) to 100 (Fully trusted)
      - CONNECTOR_UPDATE_EXISTING_DATA=false
      - CONNECTOR_RUN_AND_TERMINATE=false
      - CONNECTOR_LOG_LEVEL=error
      - DISARM_FRAMEWORK_URL=https://raw.githubusercontent.com/DISARMFoundation/DISARMframeworks/main/generated_files/DISARM_STIX/DISARM.json
      - DISARM_FRAMEWORK_INTERVAL=7 # In days, must be strictly greater than 1
    restart: always
  connector-cisa-known-exploited-vulnerabilities:
    image: opencti/connector-cisa-known-exploited-vulnerabilities:5.10.0
    environment:
      - OPENCTI_URL=http://opencti:8080
      - OPENCTI_TOKEN=${OPENCTI_ADMIN_TOKEN}
      - CONNECTOR_ID=${CONNECTOR_CISA_ID}
      - CONNECTOR_TYPE=EXTERNAL_IMPORT
      - "CONNECTOR_NAME=CISA Known Exploited Vulnerabilities"
      - CONNECTOR_SCOPE=cisa
      - CONNECTOR_CONFIDENCE_LEVEL=100 # From 0 (Unknown) to 100 (Fully trusted)
      - CONNECTOR_UPDATE_EXISTING_DATA=false
      - CONNECTOR_RUN_AND_TERMINATE=false
      - CONNECTOR_LOG_LEVEL=error
      - CISA_CATALOG_URL=https://www.cisa.gov/sites/default/files/feeds/known_exploited_vulnerabilities.json
      - CISA_CREATE_INFRASTRUCTURES=false
      - CISA_TLP=TLP:CLEAR
      - CISA_INTERVAL=2 # In days, must be strictly greater than 1
    restart: always
  connector-mitre:
    image: opencti/connector-mitre:5.10.0
    environment:
      - OPENCTI_URL=http://opencti:8080
      - OPENCTI_TOKEN=${OPENCTI_ADMIN_TOKEN}
      - CONNECTOR_ID=${CONNECTOR_MITRE_ID}
      - CONNECTOR_TYPE=EXTERNAL_IMPORT
      - "CONNECTOR_NAME=MITRE Datasets"
      - CONNECTOR_SCOPE=tool,report,malware,identity,campaign,intrusion-set,attack-pattern,course-of-action,x-mitre-data-source,x-mitre-data-component,x-mitre-matrix,x-mitre-tactic,x-mitre-collection
      - CONNECTOR_CONFIDENCE_LEVEL=75
      - CONNECTOR_UPDATE_EXISTING_DATA=false
      - CONNECTOR_RUN_AND_TERMINATE=false
      - CONNECTOR_LOG_LEVEL=error
      - MITRE_INTERVAL=7 # In days
    restart: always
  connector-opencti:
    image: opencti/connector-opencti:5.10.0
    environment:
      - OPENCTI_URL=http://opencti:8080
      - OPENCTI_TOKEN=${OPENCTI_ADMIN_TOKEN}
      - CONNECTOR_ID=${CONNECTOR_OPENCTI_ID}
      - CONNECTOR_TYPE=EXTERNAL_IMPORT
      - "CONNECTOR_NAME=OpenCTI Datasets"
      - CONNECTOR_SCOPE=marking-definition,identity,location
      - CONNECTOR_CONFIDENCE_LEVEL=100
      - CONNECTOR_UPDATE_EXISTING_DATA=true
      - CONNECTOR_RUN_AND_TERMINATE=false
      - CONNECTOR_LOG_LEVEL=error
      - CONFIG_SECTORS_FILE_URL=https://raw.githubusercontent.com/OpenCTI-Platform/datasets/master/data/sectors.json
      - CONFIG_GEOGRAPHY_FILE_URL=https://raw.githubusercontent.com/OpenCTI-Platform/datasets/master/data/geography.json
      - CONFIG_COMPANIES_FILE_URL=https://raw.githubusercontent.com/OpenCTI-Platform/datasets/master/data/companies.json
      - CONFIG_REMOVE_CREATOR=false
      - CONFIG_INTERVAL=7 # In days
    restart: always
  connector-phishunt:
    image: opencti/connector-phishunt:5.10.0
    environment:
      - OPENCTI_URL=http://opencti:8080
      - OPENCTI_TOKEN=${OPENCTI_ADMIN_TOKEN}
      - CONNECTOR_ID=${CONNECTOR_PHISHUNT_ID}
      - CONNECTOR_TYPE=EXTERNAL_IMPORT
      - CONNECTOR_NAME=Phishunt
      - CONNECTOR_SCOPE=phishunt
      - CONNECTOR_CONFIDENCE_LEVEL=40 # From 0 (Unknown) to 100 (Fully trusted)
      - CONNECTOR_UPDATE_EXISTING_DATA=false
      - CONNECTOR_LOG_LEVEL=error
      - PHISHUNT_URL=https://phishunt.io/feed.txt
      - PHISHUNT_CREATE_INDICATORS=true
      - PHISHUNT_INTERVAL=3 # In days, must be strictly greater than 1
    restart: always
volumes:
  esdata:
  s3data:
  redisdata:
  amqpdata: