MISP enrichment modules setup: what misp-modules adds to your instance
Enrichment in MISP runs through the misp-modules service, a separate process that operates alongside the core MISP platform. When an analyst asks for more context on an indicator, the core platform passes the lookup to misp-modules, which calls the external service and returns the result to the event. The lookup path for VirusTotal, Shodan, Passive DNS and DomainTools therefore sits outside the web application, so its hosting, network access and configuration need their own planning. This page covers how to stand that service up and connect the modules your analysts depend on.
The misp-modules collection is broad, and each module wraps one external or local service with its own inputs, outputs and configuration keys. Start by listing the modules your analysts actually need and enabling only those, which keeps the review and testing load manageable. MISP 2.5 is the recommended version for new deployments, and MISP 2.4 is end of life with security fixes only, so a new instance should not be built on 2.4. Confirm the module list and settings against the specific release you choose, because module availability can differ between versions.
The project lists several installation paths for MISP 2.5: its installer on Ubuntu 24.04, Docker images, Ansible roles, Puppet and RPM packages. The installation method decides how misp-modules is started, how it is restarted after updates and where its configuration lives. A Docker-based design keeps module settings in container configuration and environment files, while a packaged install keeps them on the host. Choose the method before you write the service design, because each one needs different secret injection, health checks and upgrade steps. Confirm with your platform team which method matches your build standards.
Plan three things before you enable any module. First, identify which modules need API keys and whether your organization can hold those keys under its own provider accounts. Second, confirm the rate limits and quota terms each provider applies to your key, since a burst of analyst lookups can exhaust them. Third, define egress: the host running misp-modules must reach each provider, so firewall rules, proxies and DNS entries must allow those destinations. Ask each provider for its current limits in writing, because these terms change and this page does not state them.
Enrichment also sends data out of your environment. A lookup on a suspicious indicator can tell the provider that your organization was investigating it, so decide which attribute types may be sent and which roles may trigger enrichment. Record those decisions in your MISP operating procedures. Import and export modules are covered on a sibling page, so this section stays with expansion. Test each enabled module against a known indicator in a non-production instance before analysts depend on it.
What the enrichment modules do according to the platform documentation
MISP's documented features cover correlation, sharing controls, shared knowledge data, and a documented API and export set that enrichment work depends on. The named third-party lookups sit on top of this core and are configured per module, so the cards below separate what the platform documents from what each module adds.
Correlation engine behavior
MISP's documented correlation engine links attributes through exact matches and advanced patterns, including fuzzy hashes and CIDR overlaps, with granular controls over what is compared. For enrichment, this means a lookup result can connect to existing events only if the attribute types and correlation settings allow it. Check which attribute types correlate in your instance, and test with known indicators before analysts rely on the links.
Taxonomies, galaxies and warning lists
MISP ships shareable taxonomies, warning lists and galaxies covering threat actors, malware, ransomware, tools and MITRE ATT&CK, along with default intelligence feeds. These supply the context that enrichment output is tagged and read against. Confirm which of these are enabled on your instance, and review their licensing separately from the AGPL software license, since the documentation states that taxonomies and galaxy data use CC0 1.0 or BSD-2-Clause terms.
Distribution and sharing controls
Distribution levels and custom sharing groups in MISP can be applied down to individual attributes, and events and attributes can synchronize automatically between instances and trusted communities. Enrichment results inherit this sharing model, so a lookup can add data that is more widely shared than the source event. Decide before go-live which enrichment outputs may leave your instance, and confirm the distribution defaults that apply to them.
OpenAPI API, restSearch and PyMISP
MISP describes its API with OpenAPI and documents restSearch for querying, with the PyMISP library bundled for scripted access. Analysts and automation typically trigger enrichment and retrieve results through these interfaces. Confirm the API version your instance exposes, the key and permission model for each integration account, and whether enrichment calls are logged for audit.
Export formats for downstream tools
MISP documents exports in MISP JSON, STIX 1 and 2, OpenIOC, CSV, text, Suricata, Snort, Zeek and RPZ. Enriched attributes are only useful downstream if they survive these formats with the fields your detection tools expect. Test one enriched event through each export your consumers use, and verify that tags and context carry over.
Third-party lookups need module-level confirmation
VirusTotal, Shodan, Passive DNS and DomainTools are not core MISP features. Each is a module with its own supported attribute types, configuration, API key handling and rate limits, and each provider has its own terms for how results may be stored and shared. Confirm each module's behavior against its documentation for your MISP version, and review each provider's terms before enabling sharing of their results.
Which configuration decisions shape the enrichment setup
This table compares the five decisions that most affect how misp-modules and expansion lookups behave in a MISP deployment. Read each row as a choice to settle before build, with the option that fits, its trade-off and the question to put to your own team or partner.
| Decision | Option and when it fits | Trade-off | Confirm before build |
|---|---|---|---|
| Where misp-modules runs | Same host as MISP suits small, single-instance deployments with few lookups. A separate host or container suits teams that want to scale or restart modules without touching the core platform. | Same host is simpler to operate but shares resources and failure domains. Separate hosts add network paths, service authentication and another component to patch. | Confirm the network path from MISP to the modules service and which hosts can reach the module API. |
| Which modules are enabled | Enable only the modules tied to a documented use, such as a named provider contract or an analyst workflow. Keep the rest disabled until someone owns them. | Every enabled module adds outbound traffic, provider accounts and review effort. Unused modules still widen the set of services that need patching and monitoring. | Confirm the module list against the provider agreements your organization already holds. |
| Who holds and rotates provider API keys | A central owner, such as the platform or threat intelligence team, holds keys in a secrets store and rotates them on a schedule the owner sets. Analysts never see raw keys. | Central ownership reduces key sprawl but creates a dependency on one team. Shared keys make per-user attribution of lookups harder. | Confirm each provider's key scope, quota and rotation procedure with the provider and your security team. |
| Whether results are stored or only shown | Store results as attributes when enrichment must persist for correlation, sharing and later review. Show results only when lookups are exploratory and data-sharing rules forbid retention. | Stored results grow the database and can propagate third-party data to sharing partners. Display-only results are lost after the session and cannot be correlated. | Confirm your sharing policy and any provider terms that limit storing or redistributing returned data. |
| How analysts trigger lookups | Manual triggers from the event view suit teams with low volume and strict control over provider spend. Scheduled or automated enrichment suits high-volume queues with clear rules on which attribute types qualify. | Manual triggers keep control but rely on analyst discipline. Automation consumes quota quickly and can enrich attributes that should not leave the organization. | Confirm which attribute types may be sent to external services and who approves automated enrichment rules. |
How analysts trigger enrichment and which attributes it touches
Enrichment in MISP is always run against a specific attribute type, and each expansion module decides which attribute types it accepts. Before any analyst relies on a lookup, the platform team should check the accepted attribute list for each enabled module in the release in use, because module definitions change between versions and between module releases. Do not assume that a module which handles domains will also handle IP addresses, file hashes or URLs. Treat the module's own documentation and its input definition in the deployed misp-modules service as the source of truth, and record the list in your runbook so analysts see the same scope.
In general terms, an analyst opens an event, selects a single attribute, and launches an enrichment action from the attribute's context menu. MISP sends the attribute value and the chosen module to misp-modules, which runs the lookup against the external service configured with the module's API key. The results come back as new attributes or objects attached to the event, or as a result view that the analyst can review before accepting anything into the event. The analyst should confirm, during setup testing, whether results are added automatically or only shown for review in the release you deploy, since that decision affects how much unverified data enters shared events.
The manual path is an analyst choosing the action on one attribute at a time. It keeps a person in control of which values leave the organization for a third-party service, which matters when an attribute is sensitive, belongs to an active investigation, or is tied to a victim. An automated path runs enrichment without a click, typically through a background job, an import workflow or an API call. Automation scales better but multiplies outbound lookups, so you should decide which attribute types and which events are eligible before turning it on. Note that an automated path still depends on the same module scope, so an attribute type outside a module's accepted list will not be enriched by that module in either path.
Confirm with the platform team which roles can run lookups. In MISP, permissions are set through roles, and enrichment should be limited to roles that have a documented reason to send indicators to external services. Also confirm whether each lookup is written to the audit log, what fields are recorded (user, time, module, attribute, result), and where those logs are retained and reviewed. Ask whether lookups against sensitive or non-public attributes are logged differently, and whether the external service's own logs or terms could retain submitted values. These answers shape your data-handling statement and should be settled before analysts are trained.
Finally, document the attribute scope and trigger rules as operating guidance, not as an assumption carried over from another deployment. Give analysts a short table that lists each enabled module, the attribute types it accepts in your release, whether it is manual or automated, and who may run it. Re-check that table after every misp-modules update and after any change to module settings. An illustrative example: if a module accepts only hash and domain values in your version, a URL-only event will show no enrichment results, and that is the expected outcome rather than a fault to troubleshoot.
Rollout sequence for MISP enrichment modules setup
This sequence moves from version and install decisions to an enrichment capability that is tested, logged and governed before analysts use it in production. Each step closes with a named output, so the team can confirm progress and hand over a documented state at cutover.
Confirm MISP version and install method
Confirm the MISP version and install method before any other work starts. MISP 2.5 is the version the project recommends for new deployments, and MISP 2.4 is end of life with security fixes only, so new instances should not start on it. Record the chosen install path, such as the provided installer on Ubuntu 24.04, Docker images, Ansible roles, Puppet or RPM packages, because that choice determines how misp-modules is installed, configured and upgraded. Output: a version and install decision record approved by the platform owner.
Deploy misp-modules and verify reachability
Deploy the misp-modules service alongside the core platform and confirm that the MISP application can reach it over the network path your design allows. Test the connection from the MISP host first, then trigger a test enrichment from the MISP interface, and review firewall rules and any proxy between the two hosts. Confirm the service restarts cleanly after a host reboot. Output: a reachability test record and a service configuration the team can rebuild from code.
Inventory provider accounts and their terms
List every enrichment provider you plan to enable, such as VirusTotal, Shodan, Passive DNS and DomainTools, and record who holds each account, its tier, its query limits and its terms of use. Terms often restrict commercial use, data sharing or redistribution of results, so ask legal or procurement to review them against how your organization shares indicators. Confirm the quota each account allows with the provider, since limits are set by the provider and can change. Output: a provider register listing owner, tier, quota and approved use for each module.
Store module keys in a managed secret store
Keep each provider key in your managed secret store and supply it to MISP and misp-modules at runtime, so the key is not written into shared configuration files or typed into the admin interface. Assign each key a named owner, a documented rotation procedure and a restricted access list. Test that a rotated key in the store reaches the running service and that the key does not appear in application logs. Output: a key inventory that maps each module to its secret path, owner and rotation procedure.
Enable and test modules in non-production
Enable one module at a time in a non-production instance and test it against sample attributes of the types it claims to enrich, such as IP addresses, domains, file hashes and URLs. Check that results attach to the correct attribute, that the expected fields appear, and that a failed or throttled query produces a visible error instead of a silent gap. Record which attribute types each module enriches and how an analyst triggers it. Output: a test log per module showing inputs, outputs and failure behavior.
Set analyst roles and logging
Map enrichment permissions to analyst roles so that only staff who need to query external providers can trigger them. Decide which actions are logged, including who ran an enrichment, against which attribute and which provider was queried, then confirm that the audit trail reaches your central logging platform. Review whether enriched data may flow into sharing groups, because provider terms can then apply to events shared with other organizations. If you use single sign-on, confirm that identity provider roles map to the intended MISP roles. Output: a role matrix and a log entry from a test enrichment visible in central logging.
Cut over with a documented rollback
Schedule the production cutover with the owners of the MISP instance, the secret store and the provider accounts present. Enable the modules in production in the same order they were tested, then watch the first enrichment queries and error rates closely. Keep the previous configuration available, and write the rollback as explicit steps: disable the modules, revert the configuration, restore the prior keys and confirm the instance returns to its earlier state. Output: a signed cutover record and a rollback runbook that someone other than its author has walked through.
What drives enrichment setup effort and how to keep it down
This table lists the drivers that change how much work an enrichment setup takes and the limits that keep each one contained. Read each row as a question to answer before scoping, because the answers decide which modules, accounts and approvals go into the build. No price or duration is given here; the written scope sets both.
| Driver | How it increases effort | How to keep it down |
|---|---|---|
| Number of modules and provider accounts | Each module needs its own configuration, credentials, testing and owner. Every provider account adds key handling, quota tracking and renewal. | Enable only modules tied to attribute types analysts actually use. Confirm each provider's account terms before scoping. |
| Provider rate limits and key quotas | Batch enrichment can exhaust provider quotas, which slows analysts and forces queuing or retries in the workflow. | Set expected lookup volumes per team. Confirm each provider's limits before choosing which modules to enable. |
| Network boundary for lookups | Lookups that must stay inside the network need proxies, local data sources or self-hosted services, and each outbound path needs review. | Agree early which indicators may leave the network. Map each module to its egress path before the build starts. |
| Analyst roles and approval rules | Each role needs permission to trigger enrichment and view results, and approval steps add workflow design and testing. | Start from a small role set mapped to identity provider groups. Limit approval rules to actions that need them. |
| Sharing and SIEM workflows | Enriched attributes carry distribution settings that affect who can see them. SIEM exports add field mapping and detection testing. | Define distribution levels for enriched attributes first. Export only the fields the detection team uses. |
| MISP version and upgrade path | Module dependencies and API behavior can change between releases, so enrichment calls may need retesting after each upgrade. | Build on MISP 2.5, which the project recommends for new deployments. Test upgrades in a staging copy with the module set frozen. |
How enrichment connects to correlation, sharing and SIEM workflows
After setup, enrichment matters because of what happens next. Enriched attributes feed correlation, distribution settings decide what leaves the instance, and automation and exports determine how far results travel. Each connection below needs a deliberate check before analysts depend on it.
Feeding enriched attributes into correlation
Enriched attributes only help if they reach the correlation engine. MISP correlates attributes through exact matches and advanced patterns, including fuzzy hashes and CIDR overlaps, so an IP address added by an expansion module can link to an existing event. Check that each module returns attribute types the correlation engine uses, and confirm that correlation is enabled for the attribute types you enrich. Test with a known indicator before analysts rely on the links.
Controlling what leaves the instance
Distribution decides what leaves the instance. MISP sets distribution levels on events and attributes, and custom sharing groups can narrow an item down to individual attributes. Enrichment output takes the distribution you configure, so results from internal lookups must carry settings that keep them off community feeds. Review the defaults for enriched attributes and test synchronization with a non-production partner before go-live.
Automating enrichment through the API
Analysts can trigger enrichment by hand, but scheduled or bulk work runs through the API. The OpenAPI-described API includes restSearch, and the bundled PyMISP library lets scripts create events, pull attributes and request enrichment. Plan a dedicated automation user with a scoped API key, store that key in your secrets manager, and confirm how enrichment is requested in your MISP version before you batch large volumes against module rate limits.
Choosing export formats for detection tools
MISP exports MISP JSON, STIX 1 and 2, OpenIOC, CSV, text, Suricata, Snort, Zeek and RPZ. Detection tools usually consume one of these, so pick the format before you design the feed. Confirm whether enriched attributes and their tags appear in each export, and whether your sensor or SIEM parses the fields that enrichment adds, such as passive DNS results or domain registration data. Validate the output against a sample event.
Optional SSO for analyst logins
The OidcAuth plugin lets analysts sign in through an OpenID Connect provider and maps identity provider roles to MISP roles. MISP assigns the first matching role by priority, so the role that controls who may run enrichment and export must sit in the right position. Confirm the mapping and priority order in the plugin README for your MISP version, and keep a local administrator account available for recovery.
Confirming partner product connections
The MISP integrations group covers specific partner products. Enrichment data may reach a SIEM, SOAR platform or threat intelligence product through a connector that the partner maintains, and the field mapping and supported MISP versions are defined in that product. Before you design the workflow, read the partner's own documentation, confirm the supported MISP version, and trace one indicator from enrichment through to the partner product.
Keeping API keys, rate limits and enrichment results under control
Treat provider API keys, quota limits and stored enrichment results as three separate controls, and settle each one before analysts depend on bulk lookups. The module configuration decides which keys misp-modules uses, so keys should not sit in plain text in MISP settings, in the database or in files that are copied into backups and support bundles. Where your platform allows it, inject keys from a secrets store at service start, restrict read access to the account that runs misp-modules, and record which key belongs to which module. Ask each provider whether keys can be scoped to a single purpose and whether separate keys can be issued per environment, so that a leaked test key cannot reach production quota.
Plan rotation as an operational task with an owner, not as an ad hoc reaction. Give each module key a named service account, document the rotation interval your policy requires, and test the procedure in a non-production instance: update the secret, restart the modules service, confirm a known lookup succeeds, then revoke the old key. Check whether your current MISP release reloads module settings without a full restart, because this changes how long a rotation window stays open. Keep the revocation record with the change ticket so reviewers can see when each credential changed hands.
Rate limits are a design input, not a footnote. Before you enable bulk enrichment, confirm each provider's quota for your subscription tier, including daily and per-minute limits, whether quota is shared across all keys on an account, and what the provider returns when a limit is hit. Then test how misp-modules and MISP behave under those conditions: whether a failed call is retried, whether the error is surfaced to the analyst or silently dropped, and whether a batch job stops or continues. Quota figures change with provider plans, so take them from the provider's current terms and record the date you checked.
Enrichment results are data you hold, and they inherit the sharing rules of the event they attach to. Confirm how the attribute distribution and sharing group on the parent event apply to enriched attributes and tags, because a result pulled from a third-party service may be more sensitive than the indicator itself, and a passive DNS or domain intelligence response may carry restrictions in the provider's terms that prohibit redistribution. Decide how long enrichment outputs are retained, whether they are pruned with the event, and whether you will re-query instead of storing provider responses. Check the export and synchronization behavior too, so that enriched data does not leave your organization by a path the provider's licence does not allow.
For audit or data-handling review, document each module, its provider, the account and key owner, the data sent to the provider, the quota tier, the retention period for stored results, the distribution rules that apply, and the rotation and revocation log. Record which analyst roles can trigger enrichment and whether those actions are logged. Ask your privacy or legal team to confirm whether any provider receives personal data from your events and whether that transfer needs a contract or assessment. Note that DeployOpen prepares these records and controls as evidence for your assessors, but the independent auditor or certification body makes the determination.
How much does MISP enrichment modules setup cost and how long does it take?
How much does it cost to set up MISP enrichment modules?
No price is published for this work, and the written scope sets the cost. DeployOpen does not publish a price list, so a quote follows from the scope agreed in writing before work starts. The main cost components are the engineering hours to install and configure the misp-modules service, map each module to the attribute types it should enrich, set up credentials and test analyst workflows. Ask the quote to show which items are one-time (installation, configuration, testing, documentation) and which recur (upgrades, monitoring, ongoing support if you choose a retainer). Enrichment providers such as VirusTotal, Shodan, Passive DNS and DomainTools each have their own license and pricing terms, which you pay to the provider directly. Confirm those terms with each vendor, because they can change the number of modules you can run in practice.
How long does a MISP enrichment modules setup take?
The duration depends on the number of modules, the state of your MISP instance and how quickly your team can approve access. The timeline is set in the fixed-scope document, not estimated here. Work usually moves through a short discovery step, the service build, module configuration, testing with real analyst events and handover. Delays most often come from waiting on provider accounts, outbound network approvals, proxy rules and decisions about which analysts may trigger enrichment. A smaller scope with one or two modules and an already healthy MISP host will finish sooner than a multi-module rollout with several data sources. Ask for the timeline as dated milestones with the client inputs each milestone depends on.
What does my team need to provide for the setup?
Plan on providing several inputs before the build starts. You need a named technical owner for the MISP host, administrative access to the server or container platform that runs misp-modules, and accounts with each enrichment provider that you intend to use. Your network team must approve outbound connections from the misp-modules host to those provider endpoints, and your security team must agree where API keys are stored and who can rotate them. Analyst leads should describe which attribute types they want enriched, how often they expect to trigger enrichment, and which rate limits matter to their workflow. Missing any of these inputs is the most common reason a fixed-scope timeline slips.
Can our internal team set up MISP enrichment modules without a partner?
Yes, a capable internal team can do this without an outside partner, provided it has the skills and time. The work requires operating a PHP and Python based service alongside MISP, handling API keys securely, understanding each provider's rate limits and terms, and testing enrichment results against real events. Teams that already run MISP and have someone comfortable with Linux services, container or package deployments, and secrets management often manage it internally. Teams without that experience, or without spare capacity during an incident-heavy period, usually benefit from a scoped engagement. Be realistic about ongoing ownership: upgrades to MISP and the modules, changes in provider terms and credential rotation continue after the first build.
What does a fixed-scope quote for this work cover?
A fixed-scope quote lists the scope, deliverables, client responsibilities, timeline and exclusions in writing before work starts. For this topic, expect it to name the modules in scope, the MISP and misp-modules versions and hosting model, the attribute types each module will enrich, how API keys and rate limits are handled, and the testing and documentation delivered at handover. It should also state what is excluded, such as providers you add later, custom modules, or changes to upstream MISP. Ask whether the quote includes post-handover support, and if so, what response expectations apply. DeployOpen does not issue guarantees on third-party provider availability or results.
What makes the cost and timeline go up or down?
The biggest drivers are the number of enrichment modules, the number of data sources that need custom handling, and how many analyst workflows must be tested. Scope goes up when you need modules that require custom configuration, when you run misp-modules in a high-availability or air-gapped design, or when you add proxies and egress controls. Scope goes down when you use a small set of well-documented providers, when your MISP instance is already current and monitored, and when your approvals and accounts are ready on day one. Identify these drivers with your partner during scoping so the written quote reflects your actual environment rather than a generic module list.
How do we confirm a module's license and rate limits before we start?
Confirm them directly with each provider before scoping, because license terms, quotas and permitted uses differ between services and can change. Check whether the license allows the use you intend, such as automated enrichment inside a shared threat intelligence platform, and whether it limits redistribution of results to partner communities. Record the rate limit for each key and the expected daily volume from your analysts and automated feeds. Those numbers determine whether you need caching, queuing or a higher tier, which affects both the build and any recurring provider costs. DeployOpen can help you map these questions into the scope, but the terms themselves come from each provider.
How DeployOpen works on this
DeployOpen starts by agreeing in writing which misp-modules expansion modules, API keys and attribute types are in scope for your MISP instance. The build runs in infrastructure you control, and the handover covers configuration, tests and runbooks your analysts and operators can use.
How we scope
- Confirm which expansion modules your team needs, such as VirusTotal, Shodan, Passive DNS or DomainTools, and which licenses each one requires.
- Map each module to the attribute types it should enrich, and to the events and analyst workflows that trigger enrichment.
- Agree in writing how API keys will be stored, rotated and restricted, and which rate limits apply to each provider account.
- Fixed-scope engagements set deliverables and timelines before work starts, and ongoing support is available as a retainer.
How we build
- Install and run the misp-modules service alongside your MISP core, with the module set and network paths you approved.
- Configure each enabled module with its provider credentials and rate-limit settings, and confirm which attributes it enriches.
- Test enrichment on sample attributes in a non-production instance, including failure handling when a provider is unavailable or throttled.
- Document the module configuration, the API key inventory and the enrichment triggers so the setup can be reviewed and repeated.
How we hand over
- Deliver a written configuration record covering enabled modules, mapped attribute types, key ownership and rate-limit settings.
- Walk your operators through checking module health, reviewing enrichment logs and rotating keys without interrupting analysts.
- Provide a runbook for adding or removing a module, including the review steps your security and licensing owners should sign off on.
- Confirm with the vendor or your own environment any module behavior or provider terms we could not verify during the build.
How we support
- Review module updates and MISP version changes before they reach production, so enrichment does not break after an upgrade.
- Support recurring tasks such as key rotation, provider quota reviews and changes to the module set, under a retainer if you choose one.
- Adjust attribute-to-module mappings when your analysts change how they triage indicators or which providers you license.
- Keep the setup documentation current so your own team can operate enrichment without depending on a single person.

