% DO NOT COMPILE THIS FILE DIRECTLY!
% This is included by the other .tex files.

\begin{frame}[t,plain]
\titlepage
\end{frame}

\begin{frame}
    \frametitle{\texttt{\$ whoami}}
    \begin{columns}
        \begin{column}{0.7\textwidth}
            \begin{itemize}
                \item Working @ circl.lu
                \item Part of the MISP-Project team
                \item Adding easter eggs for the past 4 years
            \end{itemize}
        \end{column}
        \begin{column}{0.3\textwidth}
            \includegraphics[width=0.9\linewidth]{pictures/whoami.png}
        \end{column}
    \end{columns}
    \vspace*{0.75em}
    \begin{columns}
        \begin{column}{0.65\textwidth}
            \frame{\includegraphics[width=1.0\linewidth]{pictures/whoami2.png}}
        \end{column}
        \begin{column}{0.35\textwidth}
            \includegraphics[width=1.0\linewidth]{pictures/belgian-joke.jpeg}
        \end{column}
    \end{columns}
\end{frame}

\begin{frame}
    \frametitle{What problems are we trying to tackle?}
    \begin{itemize}
        \item \textbf{Prevent} default MISP behaviors to happen
        \item \textbf{Hook} specific actions to run callbacks
        \item Use-cases:
        \begin{itemize}
            \item Prevent publication of events not passing sanity checks
            \item Prevent querying thrid-party services with sensitive information
            \item Send notifications in a chat rooms
            \item And much much more...
        \end{itemize}
    \end{itemize}
\end{frame}

\begin{frame}
    \frametitle{What already exists in MISP?}
    \includegraphics[width=16px]{pictures/python-logo.png}\hspace*{0.5em} \textbf{MISP API / PyMISP}
    \begin{itemize}
        \item Needs CRON Jobs in place
        \item Heavy for the server
        \item Not realtime
    \end{itemize}
    \vspace*{1em}
    \includegraphics[width=16px]{pictures/zeromq.png}\hspace*{0.5em} \textbf{PubSub channels}
    \begin{itemize}
        \item After the actions happen: No feedback to MISP
        \item Tougher to put in place \& to share
        \item Full integration amounts to develop a new tool
    \end{itemize}
\end{frame}

\begin{frame}
    \frametitle{Simple automation made easy}
    \begin{center}
        \includegraphics[width=0.3\linewidth]{pictures/automation.png}
    \end{center}
    \begin{itemize}
        \item Why?
        \begin{itemize}
            \item Everyone loves \textbf{simple automation}
            \item \textbf{Visual} dataflow programming
            \item Users want \textbf{more control}
        \end{itemize}
        \item How?
        \begin{itemize}
            \item \textbf{Drag \& Drop} editor
            \item Prevent actions \textbf{before they happen}
            \item Flexible \textbf{Plug \& Play} system
            \item \textbf{Share} workflows, \textbf{debug} and \textbf{replay}
        \end{itemize}
    \end{itemize}
\end{frame}

\begin{frame}
    \frametitle{Content of the presentation}
    \begin{itemize}
        \item MISP Workflows fundamentals
        \item Demo by examples
        \item Get started
        \item Using the system \& how it can be extended
    \end{itemize}

    \vspace*{1em}
    \begin{center}
        \frame{\includegraphics[width=0.7\linewidth]{pictures/overview.png}}
    \end{center}
\end{frame}

\section{Workflow - Fundamentals}
\begin{frame}
    \frametitle{How does it work}
    \begin{center}
        \frame{\includegraphics[width=0.4\linewidth]{pictures/event-condition-action.png}}
    \end{center}
    \begin{enumerate}
        \item An \textbf{event} happens in MISP
        \item Check if all \textbf{conditions} are satisfied
        \item Execute all \textbf{actions}
        \begin{itemize}
            \item May prevent MISP to complete its original event
        \end{itemize}
    \end{enumerate}
\end{frame}

\begin{frame}
    \frametitle{What kind of events?}
    \includegraphics[width=60px]{pictures/sc-event.png}
    \vspace*{0.5em}
    \begin{itemize}
        \item New MISP Event
        \item Attribute has been saved
        \item New discussion post
        \item New user created
        \item Query against third-party services
        \item ...
    \end{itemize}
    \vspace*{1em}
    In MISP Workflow terminology, supported events are called \textbf{Triggers}
\end{frame}

\begin{frame}
    \frametitle{What kind of conditions?}
    \includegraphics[width=70px]{pictures/sc-condition.png}
    \vspace*{0.5em}
    \begin{itemize}
        \item An MISP Event is tagged with \texttt{tlp:red}
        \item The distribution an Attribute is a sharing group
        \item The creator organisation is \texttt{circl.lu}
        \item Or any other \textbf{generic} conditions
    \end{itemize}

    \vspace*{1em}
    In MISP Workflow terminology, these are also called \textbf{Logic modules}
\end{frame}

\begin{frame}
    \frametitle{What kind of actions?}
    \includegraphics[width=60px]{pictures/sc-action.png}
    \vspace*{0.5em}
    \begin{itemize}
        \item Send an email notification
        \item Perform enrichments
        \item Send a chat message on MS Teams
        \item Attach a local tag
        \item ...
    \end{itemize}

    \vspace*{1em}
    In MISP Workflow terminology, these are also called \textbf{Action modules}
\end{frame}

\begin{frame}
    \frametitle{What is a MISP Workflow?}
    \begin{itemize}
        \item Sequence of all nodes to be executed in the specified order
        \item Basically the whole connected graph.
        \item Workflows can be enabled / disabled
        \item Workflows are always linked to a \textbf{trigger}
    \end{itemize}
    \begin{center}
        \frame{\includegraphics[width=1.0\linewidth]{pictures/simple-workflow.png}}
    \end{center}
\end{frame}

\begin{frame}
    \frametitle{Workflow execution for Event publish}
    \begin{itemize}
        \setlength\itemsep{1em}
        \item[] \hspace*{-2em}\includegraphics[width=16px]{pictures/sc-event-icon.png} \hspace*{0.25em} An Event is about to be published
        \begin{itemize}
            \item The workflow for the \texttt{event-publish} trigger starts
        \end{itemize}
        \item[] \hspace*{-2em}\includegraphics[width=16px]{pictures/sc-condition-icon.png} \hspace*{0.25em} Conditions are evaluated
        \item[] \hspace*{-2em}\includegraphics[width=16px]{pictures/sc-action-icon.png} \hspace*{0.25em} Actions are executed
        \begin{itemize}
            \setlength\itemsep{0.75em}
            \item {\bf\color{green!50!black}success}: Continue the publishing action
            \hspace*{-4em}\includegraphics[width=1.0\textwidth]{pictures/log-entry-publish-success.png}
            \item {\bf\color{red}failure} | \texttt{\color{red}blocked}: Stop publishing and log the reason
            \hspace*{-4em}\includegraphics[width=1.0\textwidth]{pictures/log-entry-publish-blocked.png}
        \end{itemize}
    \end{itemize}
\end{frame}

\begin{frame}
    \frametitle{Blocking and non-blocking}
    Two types of workflows:
    \vspace{0.5em}
    \begin{itemize}
        \item[] \hspace*{-2em}\includegraphics[width=48px]{pictures/blocking-workflow.png} Workflows
        \begin{itemize}
            \item Can prevent / block the original event to happen
            \item If a \textbf{blocking module}\includegraphics[width=10px]{pictures/blocking-module.png} blocks the action
        \end{itemize}
        \vspace{0.5em}
        \item[] \hspace*{-2em}{\bf Regular} Workflows execution outcome has no impact
        \begin{itemize}
            \item \textbf{Blocking modules} No way to prevent something that has already happened
        \end{itemize}
        \begin{center}
            \includegraphics[width=0.4\linewidth]{pictures/time-machine.png}
        \end{center}
    \end{itemize}
\end{frame}

\begin{frame}
    \frametitle{Workflow - Action modules}
    % \begin{center}
    %     \includegraphics[width=0.6\linewidth]{pictures/module-type.png}
    % \end{center}
    \begin{itemize}
        \item \includegraphics[width=12px]{pictures/sc-action-icon.png} \textbf{action} modules: Allow to executes operations or custom scripts
        \begin{itemize}
            \item Tag operations
            \item Send notifications
            \item Webhooks
        \end{itemize}
    \end{itemize}
    \begin{center}
        \includegraphics[width=1.0\linewidth]{pictures/action-module-index.png}
    \end{center}
\end{frame}

\begin{frame}
    \frametitle{Workflow - Logic modules}
    \begin{itemize}
        \item \includegraphics[width=12px]{pictures/sc-condition-icon.png} \textbf{logic} modules: Allow to redirect the execution flow.
        \begin{itemize}
            \item IF conditions
            \item Delay execution
        \end{itemize}
    \end{itemize}
    \begin{center}
        \includegraphics[width=1.0\linewidth]{pictures/logic-module-index.png}
    \end{center}
\end{frame}

\begin{frame}
    \frametitle{Sources of Workflow modules (1)}
    \begin{itemize}
        \item Built-in \textbf{default} modules
        \begin{itemize}
            \item Part of the MISP codebase
            \item Get in touch if you want us to increase the selection!
        \end{itemize}
    \end{itemize}
    \begin{center}
        \includegraphics[width=1.0\linewidth]{pictures/module-buffet.png}
    \end{center}
\end{frame}

\begin{frame}
    \frametitle{Sources of Workflow modules (2)}
    User-defined \textbf{custom} modules
    \vspace*{0.5em}
    \begin{columns}
        \begin{column}{0.5\textwidth}
            \begin{itemize}
                \item Written in PHP
                \item Extend existing modules
                \item MISP code reuse
            \end{itemize}
        \end{column}
        \begin{column}{0.5\textwidth}
            \includegraphics[width=1.0\linewidth]{pictures/php-joke.jpg}
        \end{column}
    \end{columns}
\end{frame}

\begin{frame}
    \frametitle{Sources of Workflow modules (3)}
    Modules from the \includegraphics[width=0.20\linewidth]{pictures/misp-module-icon.png} \textbf{enrichment service}
    \vspace*{0.5em}
    \begin{columns}
        \begin{column}{0.50\textwidth}
            \begin{itemize}
                \item Written in Python
                \item Can use any python libraries
                \item Plug \& Play
            \end{itemize}
        \end{column}
        \begin{column}{0.50\textwidth}
            \includegraphics[width=1.0\linewidth]{pictures/python-joke.png}
        \end{column}
    \end{columns}
\end{frame}

\begin{frame}
    \frametitle{Triggers currently available}
    Currently 10 triggers can be hooked. 3 being \includegraphics[width=36px]{pictures/blocking-workflow.png}.
    \begin{center}
        \includegraphics[width=1.0\linewidth]{pictures/triggers.png}
    \end{center}
\end{frame}

\begin{frame}
    \frametitle{Demo by examples}
    \begin{center}
        \includegraphics[width=0.85\linewidth]{pictures/no-slides-if-demo.jpg}
    \end{center}
\end{frame}

\section{Workflow - Getting started}
\begin{frame}
    \frametitle{Getting started with workflows (1)}
    \begin{center}
        \includegraphics[width=0.9\linewidth]{pictures/workflow-release.png}
    \end{center}
    \begin{enumerate}
        \item Update your MISP server
        \item Update all your sub-modules
    \end{enumerate}
    \begin{center}
        \includegraphics[width=0.6\textwidth]{pictures/upgrade-people.jpeg}
    \end{center}
\end{frame}

\begin{frame}
    \frametitle{Getting started with workflows (2)}
    Review MISP settings:
    \begin{enumerate}
        \item Make sure \texttt{\bf MISP.background\_jobs} is turned on
        \item Make sure workers are \textbf{up-and-running} and healthy
        \item Turn the setting \texttt{\bf Plugin.Workflow\_enable} on
    \end{enumerate}
    \begin{center}
        \includegraphics[width=1.0\textwidth]{pictures/settings-2.png}
    \end{center}
\end{frame}

\begin{frame}
    \frametitle{Getting started with workflows (3)}
    [optional] Wanna enjoy \includegraphics[width=0.17\linewidth]{pictures/misp-module-icon.png} ?
    \begin{enumerate}
        \item Turn the setting \texttt{\bf Plugin.Action\_services\_enable} on
    \end{enumerate}
    \begin{center}
        \includegraphics[width=1.0\textwidth]{pictures/settings-1.png}
    \end{center}
\end{frame}

\begin{frame}
    \frametitle{Getting started with workflows (4)}
    \begin{enumerate}
        \item Go to the list of modules
        \begin{itemize}
            \item \texttt{Administration > Workflows > List Modules}
            \item or \url{/workflows/moduleIndex}
        \end{itemize}
        \item Make sure \textbf{default} modules are loaded
        \item {[optional:misp-module]} Make sure \textbf{misp-module} modules are loaded
    \end{enumerate}
\end{frame}

\begin{frame}
    \frametitle{Getting started with workflows (4)}
    \centering
    {\Large Everything is ready?}\\
    \vspace*{3em}
    {\LARGE Let's see how to build a workflow!}
\end{frame}

\begin{frame}
    \frametitle{Creating a workflow with the editor}
    \begin{center}
        \begin{tikzpicture}
            \node[align=left] (img1) at (0, 0) {
                $\blacktriangleright$ 1. Go to the list of triggers \texttt{Administration > Workflows} \\
                $\blacktriangleright$ 2. Enable the trigger \\
                $\blacktriangleright$ 3. Edit the \texttt{trigger} you want to create a workflow for \\
                $\blacktriangleright$ 4. Drag an \texttt{action} module from the side panel\\
                to the canvas \\
                $\blacktriangleright$ 5. Drag another \texttt{action} module or a logic module\\
                from the side panel to the canvas \\
                $\blacktriangleright$ 6. From the \texttt{trigger} output, drag an arrow into\\
                the \texttt{action}'s input (left side) \\
                $\blacktriangleright$ 7. Continue linking modules with the input/output system\\
                until all wanted modules are connected \\
                $\blacktriangleright$ 8. Find an action that would execute the desired trigger \\
                $\blacktriangleright$ 9. Execute the action and observe the effect! \\
                $\blacktriangleright$ 10. Optionally, enable debug mode to see realtime execution \\
                $\blacktriangleright$ 10.1. Even more text to make the slide even more unreadable \\
                $\blacktriangleright$ 10.2. And even more boring
            };
            \pause
            \node (img2) at (0, 0) {\includegraphics[width=0.6\textwidth]{pictures/no-slides-if-demo3.jpg}};
        \end{tikzpicture}
    \end{center}
\end{frame}

\section{Considerations when working with workflows}
\begin{frame}
    \frametitle{Working with the editor - Operations not allowed}
    Execution loop are not authorized
    \vspace*{1em}
    \begin{columns}
        \begin{column}{0.7\textwidth}
            \frame{\includegraphics[width=1.0\linewidth]{pictures/editor-not-allowed-1.png}}
        \end{column}
        \begin{column}{0.3\textwidth}
            \frame{\includegraphics[width=1.0\linewidth]{pictures/infinite-loop.jpg}}
        \end{column}
    \end{columns}
\end{frame}

\begin{frame}
    \frametitle{Recursive workflows}
    \frame{\includegraphics[width=1.0\linewidth]{pictures/recursive-workflow.png}}
    \danger Recursion: If an action re-run the workflow
\end{frame}

\begin{frame}
    \frametitle{Working with the editor - Operations not allowed}
    Multiple connections from the same output
    \vspace*{1em}
    \begin{columns}
        \begin{column}{0.7\textwidth}
            \frame{\includegraphics[width=1.0\linewidth]{pictures/editor-not-allowed-2.png}}
        \end{column}
        \begin{column}{0.3\textwidth}
            \frame{\includegraphics[width=1.0\linewidth]{pictures/two-paths.jpeg}}
        \end{column}
    \end{columns}
    \begin{itemize}
        \item Execution order not guaranted
        \item Confusing for users
    \end{itemize}
\end{frame}

\begin{frame}
    \frametitle{Working with the editor}
    Cases showing a warning:
    \begin{itemize}
        \item \textbf{Blocking} modules \includegraphics[width=10px]{pictures/blocking-module.png} in a \textbf{non-blocking} workflow \includegraphics[width=0.12\linewidth]{pictures/time-machine.png}
        \item \textbf{Blocking} modules \includegraphics[width=10px]{pictures/blocking-module.png} after a \textbf{concurrent tasks} module
        \begin{center}
            \frame{\includegraphics[width=1.0\linewidth]{pictures/editor-warning-1.png}}
        \end{center}
    \end{itemize}
\end{frame}

\section{Advanced usage}
\begin{frame}
    \frametitle{Workflow blueprints}
    \hspace*{0.9\textwidth}\includegraphics[width=32px]{pictures/blueprint-32.png}
    \vspace*{-2em}
    \begin{enumerate}
        \item Blueprints allow to \textbf{re-use parts} of a workflow in another one
        \item Blueprints can be saved, exported and \textbf{shared}
    \end{enumerate}
    \begin{center}
        \includegraphics[width=0.5\linewidth]{pictures/blueprint-debugging.png}
    \end{center}
    Blueprints sources:
    \begin{enumerate}
        \item Created or imported by users
        \item From the \texttt{MISP/misp-workflow-blueprints} repository\footnote{\scriptsize https://github.com/MISP/misp-workflow-blueprints}
    \end{enumerate}
\end{frame}

\begin{frame}[fragile]
    \frametitle{Hash path filtering}
Filtering and checking conditions using hash path expression.
\begin{lstlisting}[language=javascript,firstnumber=1]
$path_expression = '{n}[name=fred].id';
$users = [
    {'id': 123, 'name': 'fred', 'surname': 'bloggs'},
    {'id': 245, 'name': 'fred', 'surname': 'smith'},
    {'id': 356, 'name': 'joe', 'surname': 'smith'},
];
$ids = Hash::extract($users, $path_expression);
// => $ids will be [123, 245]
\end{lstlisting}
\begin{columns}
    \begin{column}{0.6\textwidth}
        \begin{center}
            \includegraphics[width=0.7\linewidth]{pictures/attribute-json.png}
        \end{center}
    \end{column}
    \begin{column}{0.4\textwidth}
        \includegraphics[width=1.0\linewidth]{pictures/module-if-generic.png}
    \end{column}
\end{columns}
\end{frame}

\begin{frame}
    \frametitle{Data format in Workflows}
    \begin{center}
        \includegraphics[width=0.7\linewidth]{pictures/workflow-trigger.png}
    \end{center}
    \begin{itemize}
        \item In most cases, the format is compliant with the \textbf{MISP Core format}
        \item But data has \textbf{additional properties}
        \begin{itemize}
            \item Attributes are \textbf{always encapsulated} in the Event or Object
            \item Additional key \textbf{\texttt{\_AttributeFlattened}}
            \item Additional key \textbf{\texttt{\_allTags}}
            \item Additional key \textbf{\texttt{inherited}} for Tags
        \end{itemize}
    \end{itemize}
\end{frame}

\begin{frame}
    \frametitle{Logic module: Concurrent Task}
    \begin{itemize}
        \item Logic module allowing \textbf{multiple output} connections
        \item \textbf{Postpone the execution} for remaining modules
        \item Blocking modules\includegraphics[width=10px]{pictures/blocking-module.png} \textbf{cannot cancel} ongoing operations \includegraphics[width=0.05\linewidth]{pictures/time-machine.png}
    \end{itemize}
    \begin{center}
        \frame{\includegraphics[width=0.5\linewidth]{pictures/module-concurrent.png}}
    \end{center}
\end{frame}

\section{Debugging}
\begin{frame}
    \frametitle{Debugging Workflows: Log Entries}
    \begin{itemize}
        \item Workflow execution is logged in the application logs:
        \begin{itemize}
            \item \texttt{/admin/logs/index}
        \end{itemize}
        \item Or stored on disk in the following file:
        \begin{itemize}
            \item \texttt{/app/tmp/logs/workflow-execution.log}
        \end{itemize}
    \end{itemize}
    \begin{center}
        \includegraphics[width=1.0\linewidth]{pictures/workflow-debug.png}
    \end{center}
\end{frame}

\begin{frame}
    \frametitle{Debugging Workflows: Debug mode}
    \begin{itemize}
        \item The \includegraphics[width=70px]{pictures/debug-mode.png} can be turned on for each workflows
        \item Each nodes will send data to the provided URL
        \begin{itemize}
            \item Configure the setting: \texttt{Plugin.Workflow\_debug\_url}
        \end{itemize}
        \item Result can be visualized in
        \begin{itemize}
            \item \textbf{offline}: \texttt{tools/misp-workflows/webhook-listener.py}
            \item \textbf{online}: \url{requestbin.com} or similar websites
        \end{itemize}
    \end{itemize}
    \begin{center}
        \includegraphics[width=0.6\linewidth]{pictures/request-bin.png}
    \end{center}
\end{frame}

\begin{frame}
    \frametitle{Debugging modules: Stateless execution}
    \begin{itemize}
        \item Test custom modules with custom input
    \end{itemize}
    \begin{center}
        \includegraphics[width=1.0\linewidth]{pictures/stateless-execution.png}
    \end{center}
\end{frame}

\begin{frame}
    \frametitle{Debugging modules: Re-running workflows}
    \begin{itemize}
        \item Try workflows with custom input
        \item Re-run workflows to ease debugging
    \end{itemize}
    \begin{center}
        \frame{\includegraphics[width=0.55\linewidth]{pictures/running-workflows.png}}
    \end{center}
\end{frame}

\begin{frame}
    \frametitle{Debugging options}
    \begin{columns}
        \begin{column}{0.6\textwidth}
            \begin{itemize}
                \item Workflow execution and outcome
                \item Module execution and outcome
                \item Live workflow debugging with module inspection
                \item Re-running/testing workflows with custom data
                \item Stateless module execution
            \end{itemize}
        \end{column}
        \begin{column}{0.4\textwidth}
            \includegraphics[width=1.0\linewidth]{pictures/enough-debugging.jpg}
        \end{column}
    \end{columns}
\end{frame}

\section{Extending the system}
\begin{frame}
    \frametitle{Creating a new module in PHP}
    \begin{center}
        \includegraphics[width=0.65\linewidth]{pictures/custom-1.png}
    \end{center}

    \begin{itemize}
        \item \texttt{\small \textbf{app/Lib/}WorkflowModules/action/[module\_name].php}
        \item Designed to be easilty extended
        \begin{itemize}
            \item Helper functions
            \item Module configuration as variables
            \item Implement runtime logic
        \end{itemize}
    \end{itemize}
\end{frame}

\begin{frame}
    \frametitle{Creating a new module in Python}
    \begin{center}
        \includegraphics[width=0.65\linewidth]{pictures/custom-2.png}
    \end{center}

    \begin{itemize}
        \item Similar to how other \texttt{misp-modules} are implemented
        \begin{itemize}
            \item Helper functions
            \item Module configuration as variables
            \item Implement runtime logic
        \end{itemize}
    \end{itemize}
\end{frame}

\begin{frame}
    \frametitle{Ideas}
    \begin{itemize}
        \item Chat notification a community when new user joins an instance
        \item Trigger on any action via log entries
        \item Extend existing MISP behavior: Push correlation in another system
        \item Sanity check to block publishing
        \item ...
    \end{itemize}
\end{frame}

\begin{frame}
    \frametitle{Future works}
    \begin{columns}
        \begin{column}{0.55\textwidth}
            \begin{itemize}
                \item More \includegraphics[width=12px]{pictures/sc-action-icon.png} modules
                \item More \includegraphics[width=12px]{pictures/sc-condition-icon.png} modules
                \item More \includegraphics[width=12px]{pictures/sc-event-icon.png} triggers
                \item More documentation
                \item Recursion prevention system
                \item On-the-fly data override?
            \end{itemize}
        \end{column}
        \begin{column}{0.45\textwidth}
            \includegraphics[width=1.0\linewidth]{pictures/future-works.jpeg}
        \end{column}
    \end{columns}
\end{frame}

\begin{frame}
    \frametitle{Final words}
    \begin{columns}
        \begin{column}{0.6\textwidth}
            \begin{itemize}
                \item Feature designed to quickly and cheaply support CTI pipeline
                \item \textbf{Beta}: Feature unlikely to change. But still..
                \item Waiting for feedback!
            \end{itemize}
        \end{column}
        \begin{column}{0.4\textwidth}
            \includegraphics[width=1.0\linewidth]{pictures/feeling-of-power.jpg}
        \end{column}
    \end{columns}
    \vspace*{0.5em}
    \includegraphics[width=1.0\linewidth]{pictures/first-cti.png}
\end{frame}

