How a MISP Shuffle integration moves indicators into response
Security teams need curated indicators from MISP to reach blocking and detection controls quickly, but speed without gating turns a published intelligence item into a firewall change before anyone has reviewed it. This integration separates two jobs: receiving MISP changes as they happen, and deciding which of those changes should act on a control. In the design described here, Shuffle receives MISP event and attribute updates through the ZMQ forwarder extension, and playbooks then decide what, if anything, gets pushed onward. The receiving side and the acting side should be planned together, because the decisions made in the playbook determine how much risk the feed carries into production.
The path runs in four stages. MISP publishes an update, the ZMQ forwarder delivers it to a Shuffle workflow, the workflow filters the update, and the matching playbook branches call the target apps. Filters typically look at attribute type, the to_ids flag, the distribution level, tags that signal handling rules, and the event's publication state. Each target is a separate app action with its own saved credentials: a firewall blocklist, an EDR indicator list, or a SIEM watchlist. Because Shuffle licenses on app runs, meaning actions that actually execute, filtering out irrelevant updates before the action steps also affects running cost. Illustrative example: an IP address attribute flagged for blocking and tagged for the perimeter team could go to a test firewall group, while a hash attribute with no blocking flag is only written to the SIEM watchlist.
The supplied Shuffle extension documentation covers single sign-on only, so the exact forwarder setup must be confirmed against the current extension documentation for your Shuffle version before design is final. Confirm the forwarder's configuration keys, the message format it emits for events and attributes, which MISP event types it publishes, and how it reconnects after a restart. Also confirm what happens to updates published while the forwarder or Shuffle is down, and whether replay is supported. If replay is not available, plan a periodic MISP search that fills gaps. Confirm the MISP version on the publishing side as well: MISP 2.5 is the recommended version for new deployments, and MISP 2.4 is end of life.
Three decisions carry most of the risk. First, define which combinations of flags, tags and distribution levels may act automatically and which must wait for an analyst's approval in a Shuffle workflow step. Second, give each target its own app credentials and permissions so a fault in one watchlist cannot modify another control. Third, decide how removals work. When MISP expires or deletes an indicator, the same expiry must reach each control, or stale blocks accumulate. Test the full path against a non-production MISP instance and a lab copy of each target before any playbook writes to production controls, and record which updates were applied, skipped or failed so the audit trail matches what the controls actually hold.
What you need running before the MISP Shuffle integration starts
The integration depends on five things being in place before any workflow is built: a supported Shuffle release, a MISP 2.5 instance, a MISP API key scoped to the events you intend to share, and network paths for the forwarder and Orborus. Certificates and the Shuffle encryption secret sit underneath all of them, so decide how they are issued and stored first.
Supported Shuffle release line
Pin the Shuffle backend, frontend and Orborus to one release line before you configure anything. v2.1.1 is the oldest line Shuffle still supports, since versions older than it stopped receiving support after January 31, 2026. v2.3.0 is the current published release at the time of writing. Stable deployments use the latest Docker tag, while the nightly tag is for experimental changes only. Confirm the tag you deploy matches the release you tested against.
MISP 2.5 instance
Run MISP 2.5 for this integration. The project recommends 2.5 for new deployments and strongly advises against installing new 2.4 instances, which now receive security fixes only. Ubuntu 24.04 with the project's installer is the recommended path, and Docker images, Ansible roles, Puppet and RPM packages are also listed as options. Record the exact patch level you run, since you will test the forwarder against that build and any upgrade later may change behavior you rely on.
MISP API key and sharing scope
Create a dedicated MISP user for the automation and issue its API key to that user, so analyst keys never reach Shuffle. The user's role and organization decide which events and attributes the forwarder and restSearch calls can see. Check the distribution levels and sharing groups on each event you want to push, because attributes outside that scope will not reach Shuffle. Agree the intended sharing scope with your threat intelligence owners before the first workflow runs.
Forwarder to MISP network path
The ZMQ forwarder needs a reachable path to the MISP ZMQ publisher and a separate path to the Shuffle backend API, which listens on port 5001. Confirm in the MISP and extension documentation which side opens the connection and which publisher port is used, then open only that path. Where possible, place the forwarder in the same network zone as the Shuffle backend so that port is not exposed to the MISP segment.
Orborus to target control paths
Orborus polls the Shuffle backend for jobs and starts a worker for each execution, and the app containers those runs start call your firewall, EDR and SIEM management APIs. Map each target's API endpoint, its listening port and the source addresses allowed to reach it. In the hybrid model with Shuffle Cloud, a local Orborus needs no inbound firewall ports, so keep outbound allowlists narrow and test each one before the first watchlist push.
Certificates and secrets handling
Issue certificates for the MISP and Shuffle endpoints, and confirm every container that makes outbound calls trusts your internal certificate authority. Back up the SHUFFLE_ENCRYPTION_MODIFIER secret in a controlled location before any app authentication is saved. Changing or losing it breaks all saved app authentications in OpenSearch, so agree rotation and recovery steps in advance. Store the MISP key as a saved credential rather than pasting it into workflow steps.
Choosing between streamed updates, polling and scheduled sync
Choose the delivery path before you build the first workflow, because it sets how fast indicators reach Shuffle, how much load lands on MISP, and what happens after an outage. Three options exist. The ZMQ forwarder extension pushes event and attribute updates as MISP publishes them, which suits watchlist pushes that should follow an analyst's publication within moments. Scheduled polling calls the restSearch endpoint from the OpenAPI-described API on a timer, either with direct HTTP requests or through the bundled PyMISP library, and pulls whatever changed inside a time window. MISP's own synchronization copies events between MISP instances, so Shuffle reads from a second MISP node that receives the data.
Latency and load pull in different directions. Streamed updates give the lowest delay, and each message is small, but the forwarder stays connected for as long as Shuffle depends on it. Polling delay is roughly the interval you set, and load grows with query frequency, result size and how wide the time window is. Narrow windows, tag filters and a sensible interval keep the query small. Synchronization adds the most operational weight, since you run and patch a second MISP instance, and its timing follows the sync configuration and distribution rules rather than your Shuffle schedule. Ask your MISP administrator which sharing groups and distribution levels the sync will carry before you count on it for coverage.
The extension dependency and missed-message behavior differ more than teams expect. A streamed design depends on a forwarder that must track MISP upgrades, and any message sent while the forwarder is down is lost unless something replays it. Polling depends only on the API that MISP already exposes. If Shuffle stores a timestamp cursor and polls with a small overlap, a restarted workflow can backfill the gap and catch edited attributes. Synchronization recovers from outages through MISP's own sync mechanism, but you must check sync status and failed pulls, because a broken link can go unnoticed until someone searches for an indicator that never arrived.
Shuffle's licensing and runtime add a cost that is easy to miss. Licensing counts app runs, which are executed actions, and triggers and skipped actions do not count. A scheduled poll that starts a workflow every cycle, even when nothing changed, therefore consumes runs for no benefit. Put a check for new or changed data at the start of the workflow so that only real changes reach the enrichment and push steps. Confirm with the vendor documentation how the ZMQ message formats are structured, whether the forwarder has any event or rate limits, and how the open-source edition limits apply to your version. Test each path against a MISP instance running the version you intend to operate.
How to configure the MISP to Shuffle pipeline in order
This sequence connects a MISP instance to a Shuffle workflow in an order where each stage is tested before the next one depends on it. It starts with what MISP publishes and which API key can read it, then builds the Shuffle side from the receiver outward. The result is a workflow that receives MISP updates, filters them, and passes indicators to each target system.
Confirm MISP publishing and API key scope
The MISP administrator confirms that the instance runs a supported release, with MISP 2.5 recommended for new deployments according to the MISP download page, and that ZeroMQ publishing is enabled in the server settings. Then create a dedicated automation user and API key with read access only to the events and attributes the workflow needs, and record which sharing groups and distribution levels that user can see. Check the setup by publishing a test event with a known tag and confirming it appears in the MISP event log. If the key can see more than the intended scope, narrow the role before continuing.
Enable the ZMQ forwarder extension in Shuffle
The platform team installs or enables the ZMQ forwarder extension on the Shuffle server, confirming first that the extension and its version are available for the Shuffle release you run. Shuffle's configuration docs list the environment settings that must match your deployment, and the ZeroMQ address and port must point at the MISP host and be reachable through your network rules. Store the MISP API key through Shuffle's credential handling rather than in workflow text, so it is encrypted with the SHUFFLE_ENCRYPTION_MODIFIER secret. The check is that the forwarder reports a connected state and receives a test message from MISP.
Create the workflow that receives events
In the Shuffle editor, create a new workflow and set the ZMQ forwarder as its trigger, so that each MISP event or attribute update starts an execution. Keep the first version minimal: the trigger, a single step that logs the raw payload, and no outbound actions. Name the workflow for its purpose and record its owner so that changes can be traced. Publish a test event in MISP and open the resulting execution in Shuffle. The check is an execution record that contains the event identifier, the timestamp, and the attribute list from the test event.
Filter events by distribution level
Add a condition step after the trigger that reads the distribution field of each incoming event and passes only the levels your sharing policy allows into automated handling. Decide with your MISP owners which distribution values count as safe to push to enforcement systems, because an event shared to a wider community may not be suitable for blocking. Events that fail the check should stop the branch and be logged, not dropped silently. Test with one event at each distribution level you use. The check is that each test produces either a continued execution or a logged stop, matching the policy you wrote down.
Filter by tag and attribute type
Add a second condition that checks event tags, such as a tag indicating that the event is approved for automation, and then iterates over attributes to keep only the types the target systems can use, for example IP addresses, domains, or file hashes. Confirm the exact tag names and attribute type identifiers in your own MISP taxonomy and in the configuration of each target. Unsupported attribute types should be routed to a review path or logged with their identifiers. Test with an event containing one attribute of each kept type and one of a type that should be excluded. The check is that only the kept types reach the next stage in the execution view.
Add action steps for each target system
For each firewall, EDR, or SIEM watchlist, add an action step that uses the app for that system, configured with its own credential stored in Shuffle. Build one target at a time, starting with the system where a wrong indicator causes the least harm, and set the action to write to a test list or a non-enforcing group first. Confirm the app version and its API permissions in your own environment before relying on it. Map only the fields the target requires, and keep a rollback step or a removal path for each indicator. The check is a test execution in which the indicator appears in the target's test list with the expected value and expiry fields.
Run an end-to-end test and record the fields
Publish a set of test events in MISP that cover each distribution level, tag combination, and attribute type the workflow handles, then run them through the full pipeline. Compare each Shuffle execution against the expected result, including which branch it took, which fields reached each target, and whether any execution failed. Save the test events, expected outputs, and execution identifiers as evidence for your change record. Repeat the test after any change to the workflow or the MISP configuration. The check is a documented test run in which every case matches its expected outcome, with failures traced and fixed before the workflow is enabled for production events.
How MISP attributes map to firewall, EDR and SIEM watchlist fields
This table lists the mapping decisions the team must make before MISP indicators reach firewall, EDR and SIEM watchlists through Shuffle. Read each row as a decision with a question to confirm with the target vendor, since field names differ by product and version. The main takeaway is that to_ids, distribution, expiry and deletion rules need an explicit answer for every target, because watchlists do not inherit them from MISP.
| Mapping decision | What the team must decide | Confirm before build |
|---|---|---|
| Attribute type | Pick which MISP types each target accepts: IP addresses, domains, file hashes and URLs rarely share one watchlist format. | Target field names for each type, such as SIEM list key names and EDR hash fields, with each vendor. |
| to_ids flag | Decide whether only attributes flagged for detection use can drive blocking, and whether other attributes feed enrichment lists only. | Whether each target's import filter reads to_ids, or whether the Shuffle workflow must apply the flag. |
| Distribution level | Decide which distribution levels may leave MISP for enforcement tools, and exclude sharing groups your team does not control. | That the Shuffle service account reads the same distribution scope as the sync feed. |
| Tags and taxonomies | Use tags such as TLP markings or confidence labels to route indicators to the right watchlist and set blocking strength. | Tag names with your MISP administrators, since taxonomy values can differ between instances. |
| Event identifiers | Store the MISP event ID and attribute UUID on every watchlist entry so updates and removals match back to MISP. | Whether each target has a comment or reference field that can hold these identifiers. |
| Expiry and aging | Set a maximum lifetime per attribute type and target, since watchlist entries stay active unless the workflow expires them. | Whether each target supports native expiry. Where it does not, the workflow must schedule removal. |
| Edits to attributes | Decide whether a changed value replaces the old watchlist entry, matched by attribute UUID. | That an updated value removes the previous entry on every target, not just adds the new one in testing. |
| Deleted or revoked attributes | Decide whether deletion or revocation removes the entry at once or after a review window for analysts. | How each target deletes by key, and how Shuffle logs each removal for audit. |
| Failed removal | Define a retry and alert path for when a target rejects a removal, so stale indicators do not keep blocking traffic unnoticed. | The API response codes each target returns for missing or locked entries. |
Where the forwarder should run at scale
Place the forwarder and the workflows that act on its messages on runtime nodes you can afford to lose, and choose that placement from the Shuffle architecture you already run. A single Docker Compose server keeps the backend, the runtime and the forwarder on one host, which is simple to operate but makes that host the failure domain for the whole threat intelligence path. Docker Swarm spreads the services across several servers. The hybrid option, with Shuffle Cloud and a local Orborus, needs no inbound firewall ports because the local runtime reaches out, which often suits a MISP network with tight ingress rules. Kubernetes with Helm charts fits teams that already operate clusters. In every case, confirm that the runtime location can reach the MISP ZMQ publisher and the MISP API, because a placement that cannot see MISP is not a placement at all.
For high availability, Shuffle's configuration guidance starts with an OpenSearch cluster rather than a single OpenSearch node, since workflow execution records and saved app credentials are stored there. Plan the node count, storage and snapshot policy with the current Shuffle configuration documentation in hand. Memcached is optional and only useful when you want a shared cache across backends. When several backends run, NFS holds the shared files, which makes the NFS export a dependency you must protect with its own availability plan, permissions and backups. Scale the backend and frontend across all servers, and run more than one Orborus node so that workflows keep executing if one runtime fails. Set SHUFFLE_ENCRYPTION_MODIFIER to the same value on every backend, because changing it breaks all saved app authentications.
A single forwarder consumer is a point of loss. If the process, its host or its network path stops, indicator updates published during the gap can be missed, and the watchlists on firewalls, EDR and the SIEM silently fall behind. Before you rely on it, confirm with the extension's maintainers whether it buffers messages, resumes from a checkpoint after a restart, or replays anything at all. Then cover the gap yourself: alert when the consumer has been silent longer than your expected publishing rate allows, and write a runbook that re-pulls changed events and attributes through the MISP REST search API for the outage window and feeds them through the same workflow. Test that runbook before an incident, not during one.
Recovery and failover both produce duplicates. A restarted consumer, a failover to a second consumer, or a handover between Orborus nodes can deliver the same update more than once, so the workflow design must treat repeated messages as normal. Key every action on the MISP event and attribute identifiers together with the update timestamp, check whether the indicator already exists before writing it, and make each watchlist write replace the entry with the same key. Test this by replaying one message twice and confirming that the firewall, EDR and SIEM lists end in the same state. Duplicates also cost money under Shuffle's licensing, which meters app runs, so repeated executions add to the metric. Ask any partner quoting this work how they measure and cap duplicate runs.
How to protect MISP credentials and blocking privileges in Shuffle
These controls cover the credentials Shuffle holds for MISP and the blocking actions that follow from indicator updates, and they depend on each other. A MISP key with broad rights, a workflow editor who can skip approval, or a ZMQ port exposed to the internet weakens the whole chain. Review them together before the first indicator reaches a firewall, EDR or SIEM list.
Back up the encryption modifier
Shuffle encrypts saved app credentials and API keys in OpenSearch with AES-256, using the SHUFFLE_ENCRYPTION_MODIFIER secret. Store that value in your own secrets vault and back it up with the same care as the OpenSearch data. Changing or losing it breaks every saved app authentication, including the MISP and firewall connections, so a restored database without the matching modifier does not recover them. Confirm with your team how a rotation would require re-entering credentials. If you want credentials kept outside Shuffle's database, the external KMS pattern is covered in a separate topic.
Scope the MISP API key
Create a dedicated MISP user for the Shuffle integration, with a role that reads the events and attributes the playbook needs and nothing administrative. Confirm in your MISP version which role permissions cover reading events and adding tags or publishing, since the role model is set in the MISP admin interface. Restrict the user to the sharing groups and distribution levels the workflow should see, so a leaked key exposes only that slice of intelligence. Record who owns the key and when it is rotated.
Least-privilege keys for enforcement targets
Each firewall, EDR and SIEM target needs its own credential with the narrowest permission that lets the app add or remove entries in the specific watchlist, blocklist or list group it manages. Do not share one administrator token across targets. Check whether the vendor offers a scoped API role or service account for list management, and confirm what it grants before configuring the app. Separate read permissions used for enrichment from write permissions used for blocking, so a compromised enrichment step cannot change policy. Review these grants after each vendor upgrade.
Separate approval from blocking
Place a human approval step between the workflow that proposes a block and the action that applies it. Confirm how Shuffle's approval steps notify the approver and how the approver authenticates in your deployment. The approver should not be the identity that started the workflow. Decide which indicator types and confidence levels, if any, may be blocked automatically, and route everything else to review. Log each approval decision with the MISP event identifier so auditors can trace every list change to a named person.
Restrict who can edit workflows
A workflow that can call a firewall app can change blocking policy, so treat workflow editing rights as privileged access. Limit editor roles to a small named group and keep viewer roles separate. Require review for changes to any workflow that reaches a blocking action, and keep an exported copy or version history outside Shuffle. Check how Shuffle's user roles and SSO group mapping apply in your deployment. Audit who edited each workflow and who ran it, and alert on edits to playbooks that reference blocking actions.
Keep the ZMQ channel off public networks
The ZMQ forwarder streams MISP event and attribute updates to Shuffle, so its socket should be reachable only from the MISP host and the Shuffle components that consume it. Bind it to an internal interface, restrict it with host and network firewall rules, and place both systems on segments that can reach it. Confirm whether the ZMQ traffic in your forwarder version is encrypted or authenticated, and add TLS or a private tunnel if it is not. Test from outside the internal network to confirm the port does not respond.
Why MISP updates stop reaching Shuffle or the watchlists
This table lists the failures most often behind missing or duplicate MISP indicators in Shuffle, with the likely cause and first check for each. Work through the rows in order, because the forwarder, API key permissions and Orborus runtime must be healthy before watchlist pushes can succeed. The main takeaway is that most stalled updates trace back to connectivity, permissions or a changed secret, so check those before editing workflow logic.
| Failure | Likely cause | First check |
|---|---|---|
| Forwarder not connecting to the MISP publish channel | The forwarder cannot reach MISP's ZMQ publish port, or publishing is off on the MISP instance | Confirm the publish feature is enabled, then test a TCP connection from the forwarder host to the port and read its subscription errors |
| API key lacks permission for the event's distribution level | The key's user role or sharing group cannot see events at that distribution level, so searches return fewer or no events | Run one authenticated search with the same key for a known event and compare its distribution with the user's sharing group access |
| Missing or changed encryption modifier | SHUFFLE_ENCRYPTION_MODIFIER was changed, unset or differs between backend containers, so saved credentials fail to decrypt | Confirm every backend container holds the value recorded at install, then test one action that uses a saved app authentication |
| Orborus nodes not picking up jobs | Orborus is stopped or cannot reach the backend, or the workflow's execution environment matches no running node | Check Orborus container status and logs, then compare the workflow's execution environment with the node's configured name |
| Duplicate or stale indicators from missed messages | The forwarder restarted or lost its connection without replaying missed messages, so indicators drift from MISP | Compare the newest event in Shuffle with a MISP search for changes since the same time, then check position persistence on restart |
| Watchlist APIs rejecting bulk pushes | The batch exceeds the watchlist API's accepted size or format, or the token lacks write access to that list | Send one indicator with the same token, then retry in smaller batches and read the status code and error body |
How to test indicator flow before it blocks production traffic
Test the indicator flow in stages, and promote it to production only after each stage has produced evidence you can file. Start in a non-production MISP instance that matches production as closely as you can manage, using the same MISP line you run in production. MISP 2.5 is the recommended version for new deployments, so confirm which branch your production instance runs before you build the test. Publish a dedicated test event that contains only the attribute types your workflow handles, using reserved or clearly fictitious values such as a documentation-range IP address and a test domain. Give the event a name that no analyst could mistake for live intelligence, restrict its distribution so it cannot leave the test instance, and record its UUID before you publish.
Next, confirm that Shuffle receives and parses the event correctly. Check that the ZMQ forwarder delivers the publish message to the Shuffle workflow, and that the parsing step extracts each attribute with its type, value and to_ids flag. Compare the parsed output with the JSON export of the same event from MISP, and confirm that unexpected attributes are dropped rather than passed to targets. Then run each target in monitor-only mode. Each firewall, EDR and SIEM watchlist action should log the indicators it would have pushed, and no live list should change. Confirm that each target receives only the attribute types it is meant to handle, and that Orborus started the app containers at the versions you expect.
Verify removal and expiry before any target can enforce anything. Unpublish or delete a test attribute, or let an expiry condition pass if your design uses one, and confirm that the workflow removes the indicator from every monitor list and logs the removal. Edit a test value as well, and confirm that the new value replaces the old entry so that both versions cannot remain on a list. Next, test failover. Stop one Orborus node while a test event is publishing, then confirm that the remaining node completes the workflow executions. Check that the surviving node is the one picking up the jobs, because a standby that never runs can pass a simple success check. Confirm that no indicator is lost or duplicated during the switch.
Keep a change record that an engineer or auditor can follow without asking you questions. Include the test event UUID and its JSON export, the MISP and Shuffle versions and the Docker tags you deployed, since the Shuffle documentation recommends the latest tag for stable releases, so pin and record the tag you actually tested. Add the workflow revision, an export of the workflow definition with credentials excluded, the execution IDs and timestamps for each stage, and the target-side logs showing monitor-only entries and removals. Record the failover timeline with the stopped node identifier, and the approver names and dates. Do not place the SHUFFLE_ENCRYPTION_MODIFIER value or app credentials in the record. Note where they are stored instead. This evidence supports readiness, and it is not an audit. Ask your assessor which artifacts they expect before you start testing.
What a MISP Shuffle integration costs and what it needs from your team
What drives the cost of a MISP Shuffle integration?
The main cost drivers are the number of target systems that receive indicators, the filtering rules that decide which MISP attributes get pushed, the scaling design for the forwarder and Orborus runtime, the MISP and Shuffle versions you run, the depth of testing, and whether high availability is required. Each firewall, EDR or SIEM target adds its own API access, field mapping, watchlist logic and test cycle. Ask for a written scope that lists each target, each rule set and each environment. DeployOpen plans and implements most engagements as fixed-scope work, and it does not publish a price list. A quote follows from that written scope.
Which parts of a MISP Shuffle integration are one-time and which recur?
The build is one-time work: design, forwarder deployment, Shuffle workflow and app configuration, watchlist mapping and acceptance testing. Recurring work includes upkeep after MISP and Shuffle releases, because MISP 2.4 is end of life with security fixes only and Shuffle stopped supporting versions older than v2.1.1 after January 31, 2026. Watchlist maintenance also recurs as feeds, sharing groups and indicator policies change. Ongoing support, upgrades and continuous testing can be covered by a retainer. Ask any quote to show one-time and recurring lines separately so you can budget each one.
How long does a MISP Shuffle integration take to deliver?
Duration depends on scope, not on a fixed template. The biggest factors are the number of target systems, how many filter rules exist, whether your MISP instance already runs the recommended 2.5 line and whether your Shuffle deployment is on a supported version. Change approval cycles and access requests also add elapsed time that the build team does not control. A single target with simple filtering moves faster than several firewall, EDR and SIEM watchlists with high availability. This page does not give a duration. Request a timeline in the written scope, and ask which milestones depend on your approvals or on upgrades.
What access and environments must the client provide?
Plan for the following before the build starts:
- MISP admin access to create API keys and confirm the forwarder and sync settings
- Shuffle admin access and a review of how app runs are counted under your edition and license
- Firewall and EDR API credentials with permissions limited to the watchlist actions in scope
- SIEM API access for any watchlist or lookup updates
- A change approval path that covers automated blocking and rollback
- Non-production test environments for MISP, Shuffle and each target system
- A secrets plan that includes backing up the SHUFFLE_ENCRYPTION_MODIFIER value
Confirm required API permissions with each vendor, since they differ by product and version.
Can an internal team build a MISP Shuffle integration without a partner?
An internal team can build it if it has engineers comfortable with the MISP API and PyMISP, Shuffle workflows and Docker, and it can get API access to each target system. The harder parts are usually the ones that appear after the first working flow: mapping MISP attribute types to each target's watchlist format, handling failed pushes, making the Orborus and OpenSearch layers highly available, managing encryption keys and keeping pace with upgrades. Many teams split the work, keeping MISP and watchlist policy decisions in-house while a partner builds and tests the integration. Name the owner for on-call response and for updates when a target API changes.
Where should the ZMQ forwarder run when the integration grows?
Decide placement based on network paths, failure tolerance and how many consumers depend on the stream. The forwarder needs a reliable connection to the MISP event stream and to the Shuffle backend, so confirm both paths and any firewall rules before choosing a host. As volume and target count grow, plan for monitoring of the forwarder process, a restart policy, and clear ownership of the host. Document which MISP settings it depends on, so an upgrade does not silently break the stream. Ask the implementation partner to show the placement decision and its failure behavior in the written design.
What breaks after go-live, and what should the team check?
The most common failures after go-live are expired or rotated API tokens, MISP or Shuffle upgrades that change behavior, lost or changed SHUFFLE_ENCRYPTION_MODIFIER values that break saved app authentications, a single Orborus node failing without a second node to take over, and watchlist drift that leaves stale indicators in place. Check failed app runs and forwarder health on a schedule, test the workflow after every MISP or Shuffle upgrade, and review expiry and distribution settings on indicators before they reach blocking controls. Staged rollout to a monitor-only mode, with a tested rollback path, reduces the impact of any single error.
How DeployOpen scopes, builds and supports your MISP Shuffle integration
DeployOpen plans, implements, hardens and supports MISP threat intelligence automation with Shuffle inside your own infrastructure, including the MISP instance, the Shuffle deployment and the forwarder that connects them. Engagements are fixed-scope, with scope, deliverables and timelines agreed in writing before work starts. Ongoing support, upgrades and testing are available as retainers.
How we scope
- The written scope names the MISP versions, Shuffle edition and Docker tags in use.
- Scope lists which MISP event and attribute types feed which firewall, EDR or SIEM watchlists.
- Hosting decisions for the forwarder, Orborus nodes and OpenSearch are recorded before build starts.
How we build
- Deploy MISP 2.5 for new instances, because MISP 2.4 is end of life and should not be installed.
- Build the ZMQ forwarder path that streams MISP event and attribute updates into Shuffle workflows.
- Write Shuffle apps or workflow actions for each firewall, EDR and SIEM watchlist, tested against sample data.
How we hand over
- Handover includes the documented workflows, app versions, Docker tags and the upgrade sequence for MISP and Shuffle.
- Your team receives a record of the SHUFFLE_ENCRYPTION_MODIFIER custody and backup procedure.
- Runbooks cover forwarder restarts, MISP sync failures and watchlist push errors, with owners assigned.
How we support
- Retainers can cover Shuffle and MISP upgrades, including checks against the Shuffle release notes before each change.
- Ongoing support can include Orborus capacity reviews as alert volume and workflow runs grow.
- Testing can repeat workflow and indicator push checks after changes to MISP, Shuffle or your firewalls.

