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というオープンソースのプロダクトを触ってみて、どのように収集され活用することができるのかを調査してみたいと思う
アーキテクチャ
公式ドキュメントにアーキテクチャー図が用意されていた。このプロダクトは基本的にはPythyonとRabbitMQ、ElasticSearchをベースとした構成になっている。
| 構成要素 | 概要 |
|---|---|
| Connectors | 外部からの情報を収集し、プラットフォームに流し込む役割。また、外部への出力についてもこのコネクターが担っている。公式ドキュメントにある通りいくつかのタイプが存在するため要確認 |
| Messaging system | 大量の脅威情報を扱うためか、キューイングシステムが実装されている |
| Workers | キューに溜まっている情報を整形し構造化した状態でプラットフォームに流し込まれるっぽい。 |
| Platform | WebUI含めたシステムのことだろうか。GraphQLも使えるとのこと |
構築
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_EMAILとOPENCTI_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
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
reportは脅威情報を取りまとめたものを取り扱う機能だったが、Caseは自組織のインシデント管理を行う機能っぽい。
Incident Responses
当然データとしては空っぽなのでテストデータを入れてみたいと思う。試してみたところreport画面と同じことができ、大枠の名前だけが変わった感じと思う。


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

観測結果画面ではIPやドメイン情報を入れることができた。タスクなども入れることができるみたいだが・・・?
Event
ドキュメントないよ!?ただし、overviewには次の通り記載あり。SIEMからのイベントなどをここに入れまくってやる感じなのかな?
Events: all incidents & alerts coming from operational systems as well as sightings.
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.

なお、ここまでの情報を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
冒頭にも記載した通り、アドオンとして外部から情報を収集したり出力したりする部分を担う機能。現在インストールしたコネクターは次の通り。

公開されていて無償のものは全て入れたつもりだが、動作していないと思うようなものもあるので、インストール後の確認は重要と思う。
コネクターの一覧はここにあるそうです。
Blog
開発者によるブログ。結構更新されてるしヒントがあるかも。
感想
様々な情報を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:
