> ## Agent Instructions > Pages under /latest/ document the current release. Paths that begin with a version number, for example /10.0/, are frozen snapshots of superseded releases kept for reference only — never present their instructions as current. If the reader's version is unknown, answer from /latest/ and say which version the answer describes. > xorlab is deployed on-premises, hybrid, or as a cloud service, and integrates with either Microsoft 365 or on-premises mail infrastructure. Configuration steps often differ between these. State which deployment and integration mode an instruction applies to instead of presenting one as universal. > Distinguish inline mode from monitoring mode when describing anything that acts on email. Monitoring mode observes a copy and cannot block or quarantine; inline mode routes mail through xorlab and can. > Write the product name as lowercase 'xorlab'. Use the documented component names: xorlab Control Center (XCC), xorlab MTA, xorlab Sandbox (DANA), xorlab Natural Language Understanding (NLU). After the first mention, use the short forms XCC, MTA, Sandbox, and NLU. Do not use DANA as a standalone name for the Sandbox, but keep it where it is a literal string in configuration keys, container names, and hostnames. > Do not invent configuration keys, rule parameters, list names, log properties, or API fields. If a value is not present in this documentation, say that it is not documented rather than guessing. # xorlab Email Security Source: https://docs.xorlab.com/index Defend your organization against sophisticated phishing attacks with AI-powered email security. Deploy, configure, and operate xorlab across your on-premises, hybrid, or cloud environment.

Start here

Pick the path that matches your role.

Set up xorlab Set up xorlab

For Admins

Set up xorlab

Integrate with Microsoft 365 or on-premise, then tune detection and set up user quarantine. Start the setup →
Investigate and respond Investigate and respond

For Analysts

Investigate & respond

Get oriented in a 15-minute walkthrough, then start triaging reported email. Get started →

Evaluate xorlab

For teams that have not chosen xorlab yet.

Evaluate xorlab Evaluate xorlab

See what xorlab catches before you switch anything on

It runs alongside the filtering you already have and reports what it would have done — no MX record change, and nothing blocked until you decide.

How a trial runs →

Not decided yet? What xorlab Changes for Analysts and What Integrating xorlab Involves answer the two questions that come before a trial. Unfamiliar with a component or a term? Look it up in the Terminology glossary.

Popular guides

Feature Overview Feature Overview

Feature Overview

Every feature, from detection layers to end-user self-service

Self-Service Quarantine Self-Service Quarantine

Self-Service Quarantine

Let users manage their own quarantine

Multi-Tenancy Multi-Tenancy

Multi-Tenancy

Manage multiple tenants in one console

Upgrade Guide Upgrade Guide

Upgrade Guide

Move to the latest version safely

Security & Compliance

Which parties can process your data depends on whether you run xorlab on your own infrastructure or use it as a SaaS. [List of Data Sub-Processors](/latest/data-third-party-subprocessors) names them for each, and [Data Flow Overview](/latest/data-flow-overview) describes what each service receives while an email is analyzed. # Handling the Abuse Mailbox Source: https://docs.xorlab.com/latest/abuse-mailbox Triage, analyze, and respond to employee-reported emails in the Abuse Mailbox, including automated resolution and reporter feedback. ## Manually resolve ### Review a case 1. To view open cases, click on **Abuse Mailbox** in the left menu or on the diagram in the dashboard. Accessing Abuse Mailbox 2. Click on a message to view in detail 3. Review the email, paying attention to: * Message Preview * From and Envelope From address * Authentication * Relationship * Attachment Analysis (if applicable) * Reputation of links (if applicable) 4. Resolve the case Resolve Case 5. The pop-up enables you to modify: * The verdict of the email * The Feedback Template for the employee * Add a comment to the feedback * Report the misclassification ### Resolve multiple cases In the Abuse Mailbox view, you can also select multiple cases and resolve them simultaneously. Resolving multiple cases ## Auto resolve cases xorlab Security Platform provides two mechanisms to automatically send feedback emails to reporters and close corresponding cases without manual interaction. * **Verdict-based Automation** – determines actions based on the verdict and confidence of reported emails. * **Campaign Automation** – enables a fine-tune approach when a reported email matches a specific campaign query. ### Verdict-based automation The verdict-based automation of reported emails is enabled by default and can be modified via the [Actions](/latest/detection-actions) configuration screen. 1. In the dashboard, click the tiles icon next to your account name to click the **Admin** icon. 2. On the **Admin** page, click the **Actions** tile. 3. In the left menu, click **Abuse Mailbox** 4. Hover over the verdict to modify the action: Selecting Abuse Mailbox Actions 5. Choose whether to resolve cases automatically or manually. For automatically resolved cases, select the email template to send to the employee. Modifying Abuse Mailbox Actions ### Campaign automation You can use [Campaigns](/latest/campaigns) to automatically resolve reported emails that match a campaign query. This option is suitable when you detect a pattern in reported emails and wish to fine-tune the system accordingly. 1. **Define the Search Query** * In the Abuse Mailbox view, enter a search query that captures the type of reported emails you want to handle automatically. * You can use tags and attributes such as sender, domain, or attachment type to make the query more specific. * Avoid using fields related to verdicts or actions, as they are not compatible with campaigns. 2. **Review the Results** * Inspect the list of matching emails to make sure your query captures only the messages you want to automate. * To reduce false matches, add inclusion tags like `#auth` or `#trusted` to narrow the scope. * Exclusion tags like `not #document` or `not #cloudstorage` can also be helpful in avoiding false matches. 3. **Create the Campaign** * When the search query is ready, press Enter to refresh the search results. * Then click on the campaign icon next to the search bar to create a new campaign. * If the icon is grayed out, your query contains unsupported fields — remove them and try again. 4. **Configure the Campaign** * Message Action: **None** * Resolve Action: * **Benign** – for legitimate, safe emails; specify which feedback message to send to the employee who reported the email. * **Malicious** – for unwanted or harmful emails; also choose a feedback message to inform the employee who reported the email. ### Campaign examples The following examples show some ideas on how to automatically resolve reported cases with campaigns. * Resolve all reported messages with young domains (sender domain or embedded URL): `(#365daysoldsender or #365daysold) and (#spam or #phishing)` * Resolve all reported messages with shortened URLs (all confidences): `#phishing #shortened` * Resolve all reported internal emails without attachments: `#internal not #nolocalreputation not #document` * Resolve all reported partner emails without attachments or links to cloud storage: `#partner #auth #trusted not #nolocalreputation not #cloudstorage not #document` * Resolve all greymail without attachments or links to cloud storage: ` (#marketing or #crm or #newsletter or #bulk or #external) not #nolocalreputation not(#cloudstorage or #cloudstoragesender) not #document not #spffail not #dkimfail not #subjectcvip not #bodylt75words not #lowtrusted not #internal` Hints: * Use `not #nolocalreputation not(#cloudstorage or #cloudstoragesender)` to avoid any phishing false negatives. * Use `not #document` to avoid any malware false negatives. # What Integrating xorlab Involves Source: https://docs.xorlab.com/latest/admin-essentials For the mail, infrastructure and security admins who have to operate it: the deployment choice, the settings an integration adds, and what stays on your plate afterward. Putting a security product into a mail flow is normally a project. The integration of xorlab is a set of configuration changes in your own admin portal — visible to you afterward, and reversible in minutes. Hosted by xorlab, or on your own virtual infrastructure. Same detection either way. Three steps. Inline or monitoring is the one decision that shapes the rest. Connectors and mail flow rules. No MX change, nothing installed, no mailbox moved. Upgrades, certificates, backups and monitoring, split by SaaS and on-premises. ## Where it runs **Two deployment options, with the same detection either way.** * **xorlab SaaS** — hosted and operated by xorlab. There is nothing to provision, and the platform itself is kept up to date for you. * **On-premises** — you run the xorlab Control Center (XCC) and one or more xorlab MTAs on your own virtual infrastructure, so processing and storage stay with you. Install and configure the VMs first, following the [VM Setup Guide](/latest/vm-setup-guide); the [Sizing Guide](/latest/sizing-guide) says what to provision and the [Network Guide](/latest/network-guide) says which connections to open. Only start the integration once the VMs are running. Hybrid setups are supported in both directions. Which integration path you follow depends on where email enters and leaves your organization, not on where the mailboxes live. If you protect several organizations from a single instance, onboard each of them as a tenant rather than repeating the integration: see [Multi-Tenancy Overview](/latest/multi-tenancy-overview). ## What the integration involves **Three steps, in this order.** | Step | What happens | | :- | :- | | [Before You Begin](/latest/before-begin-integration) | Declare the domains xorlab protects, set the data retention, and choose between inline and monitoring mode. | | [M365 Overview](/latest/m365-integration-overview) or [On-prem Overview](/latest/on-prem-integration-overview) | Connect the mail flow, user login and reporting, plus the optional Microsoft 365 features. | | [What to Configure Next](/latest/integration-next-steps) | Quarantine, notifications, detection and logging. | **Inline or monitoring is the decision that shapes the rest.** In monitoring mode xorlab receives a copy of every email and drops it after the analysis, so your mail flow is untouched and nothing can be blocked. In inline mode email passes through xorlab and is forwarded on, which is what active protection requires. You can go inline in [Toothless Mode](/latest/before-begin-integration#configure-inline-mode) first, where every email is still delivered and you review what would have been quarantined. See [Switch Between Inline and Monitoring Mode](/latest/inline-and-monitoring-mode). ## What changes in your environment The integration is made of settings in your own admin portal: * **Microsoft 365** — two connectors with TLS enforced, two mail flow rules, and one enterprise application in Entra ID. Microsoft Graph permissions, a reporting mailbox and moving the Microsoft quarantine into xorlab are separate, optional steps. * **On-premises** — the scope of your receive connector and a send connector on Exchange, or BCC rules for monitoring mode; firewall rules for SMTP between your mail servers and the xorlab MTAs; and your own mail servers registered inside xorlab as trusted infrastructure, which is a setting in xorlab rather than in your environment ([Add Your Trusted Infrastructure](/latest/on-prem-add-trusted-mtas)). What stays as it is: | Unchanged | Why | | :- | :- | | **Your MX records** | On Microsoft 365, email keeps arriving at Microsoft, which hands it to xorlab and takes it back for delivery. On-premises they change only if xorlab replaces your existing gateway. | | **Your outbound sending identity** | Outgoing email still leaves through Microsoft, so your public sending IPs, your SPF record and your DKIM signatures are unchanged. On-premises it changes only if xorlab replaces your existing gateway. | | **Exchange Online Protection and Defender** | If you use M365, Microsoft’s own filtering keeps running, and xorlab is layered on top of it. | | **Mailboxes, addresses, licenses and clients** | Nothing is migrated and no add-in is rolled out. Reporting uses the button your users already have. | Undoing it is the same size as doing it. Disabling the two mail flow rules puts email back on its previous path within minutes, with no DNS change and no cutover window. The full table for each path: which setting goes where, whether it is mandatory, what your users notice, and how to roll it back. ## What your users notice * **In monitoring mode, nothing at all.** No email is modified, delayed or blocked. * **In inline mode, with the delivered defaults**, email with a malicious verdict is quarantined instead of delivered, and some verdicts are delivered with a subject prefix such as `[SPAM]`. Both are adjustable in [Review Default Actions](/latest/detection-actions). * **Only if you enable them**, users get the [Self-Service Quarantine](/latest/ssq-overview) and the notifications that go with it, or [Contextual Banners](/latest/detection-contextual-banners) inside the message body. Both are off until you turn them on. ## What you maintain afterward **How much of the platform you operate depends on where it runs.** The security configuration — guarded domains, detection tuning, lists, users and roles — stays with you in both cases. | Task | xorlab SaaS | On-premises | Where it is documented | | :- | :- | :- | :- | | Platform upgrades | Handled by xorlab | You upgrade, within the support window of your major version | [Upgrading to a Patch Release](/latest/patch-upgrade), [Release Lifecycle Support](/latest/release-lifecycle-support) | | TLS certificates | Handled by xorlab | You renew and install them on the MTAs and on XCC | [Replace MTA SMTP Certificate](/latest/tls-certificates-for-mta-smtp), [Replace MTA GUI Certificate](/latest/tls-certificates-for-mta-proxy), [Replace XCC Certificate](/latest/tls-certificates-for-xcc) | | Backups | Handled by xorlab | Off by default, because the VM is usually covered by your hypervisor. If you switch them on, xorlab writes the backup files to a directory on the XCC and moving them somewhere durable is yours | [Backup & Recovery](/latest/backup-recovery) | | Monitoring and alerting | Handled by xorlab | Dashboards and a set of alert rules ship with the platform. You decide where alerts are delivered — email, webhook, Slack or your own systems | [Set Up Monitoring](/latest/monitoring-guide), [Enable Alerts](/latest/monitoring-alerts) | | Data retention values | Handled by xorlab | You configure them | [Data Retention Overview](/latest/data-retention-overview) | Releases are rolled out to SaaS customers first and monitored before they are announced for on-premises upgrades, so an on-premises upgrade is applied to a release that has already been running elsewhere. ## Where to start The complete integration in three steps, with the Microsoft 365 and on-premises paths side by side. The questions your mail, network and security teams ask before the project starts, answered per path. How a trial runs on live traffic without blocking anything, and how long each phase takes. Whether the rest of your stack is covered: SIEM, SOAR, identity, Microsoft Graph, threat intelligence. # What xorlab Changes for Analysts Source: https://docs.xorlab.com/latest/analyst-benefits For analysts weighing up the platform: which work it takes over, how much of each decision it shows you, and which corrections you can make on your own. This page summarizes some of the major benefits analysts can get out of using xorlab. Reported email and quarantine releases resolve themselves. What is left is what automation could not decide. Indicators, sender relationship, authentication and file analysis on one screen, down to the individual detection rules. Read at a glance, or in depth. Activate search queries as standing policies. No configuration file, no support ticket, reversible afterward. Search by what a message is about, group a whole wave from one email, pull delivered mail back out. ## Less manual work **Parts of the platform can take work off your desk before you see it.** **Employee-reported email.** Reports arrive as cases, each carrying xorlab’s own analysis of the message. Cases can be closed without you in two ways: by verdict, so anything the platform has already classified confidently is resolved automatically. Or by a campaign, so a pattern you have handled once is handled the same way every time after that. The employee who reported it gets feedback either way. See [Handling the Abuse Mailbox](/latest/abuse-mailbox). **Quarantine release.** End-users see their own quarantined email and release what they need themselves. For the quarantines you are not willing to hand over, they can only ask, and the request reaches you with the analysis already attached. See [SSQ Overview](/latest/ssq-overview) and [Handling Release Requests](/latest/handling-release-requests). Abuse Mailbox ## Every verdict shows its reasoning **Transparent reasoning, and all relevant information at a glance.** Each message carries a verdict and a confidence, and the detail view shows what produced them: the relationship between sender and recipient, authentication results, the indicators that were found, the analysis of every attachment and link, and so on. From there you can go further and read the individual rules that contributed. See [Understanding an Email Verdict](/latest/understand-verdict). **It is all one screen, and it is built to be read quickly.** Detail View This allows you tell an employee why their report was closed, a user why their email was held back, and an auditor why the platform did what it did. The reasoning rests on models that are documented rather than described as magic: how xorlab learns who normally communicates with whom, what content is normal in your environment, and what it makes of sender authentication. See [Concepts Overview](/latest/concepts-overview). ## You correct it yourself **Fix false positives or false negatives in a sustainable way** Any search query can be turned into a campaign: a standing policy that overrides the default decision for exactly the messages it matches, and leaves everything else alone. A campaign can quarantine, deliver, rewrite or classify a an email, and it stays visible and reversible afterward. See [Using Campaigns](/latest/campaigns). Campaigns Smaller corrections are quicker still. Releasing an email from quarantine is itself a signal: xorlab becomes less aggressive toward that sender each time it happens. The step-by-step measures are in [Fix a False Positive](/latest/fix-false-positives) and [Fix a False Negative](/latest/fix-false-negatives), with [Tune Detection](/latest/detection-tuning) for the cases where the overall balance needs to shift, and [Lists Overview](/latest/lists) for sender-level exceptions such as VIPs, blacklists and whitelists. ## Capabilities you may not have today | Capability | What it gives you | | :- | :- | | **Search over all aspects of an email** | Query the whole corpus by what a message is about — an invoice, a credential prompt, a package delivery — as well as by link, domain, attachment property, tag, verdict and authentication result, and so on. The UI is fast, and autocomplete offers the syntax as you type.
[Search](/latest/search) · [Use Topics for Searches and Campaigns](/latest/topic-detection) | | **Find the rest of a wave from one message** | Similarity search groups an email with the others that belong to it, on content rather than on sender or subject, so a wave that varies both is still one result set. The grouping can be saved as a search or promoted to a campaign.
[Quick Walkthrough](/latest/quick-walkthrough) | | **Pull a delivered email back out** | Case Isolation removes a message from the mailboxes it reached, through the Microsoft Graph API.
[Activate Case Isolation](/latest/m365-case-isolation) | | **Analyze email that arrived before xorlab did** | On Microsoft 365, past email is imported from the mailboxes and analyzed, so you have history to work with instead of waiting out a learning phase.
[Import Past M365 Emails](/latest/m365-retrospective-email-scanning) | | **Feed the rest of your stack** | Verdicts, SMTP logs, threat intelligence extracted from your own mail and the full audit trail go out over Syslog in JSON or CEF, and lists are managed over a REST API.
[Connect a SIEM](/latest/integrations-siem) · [Automate with a SOAR](/latest/integrations-soar) | ## Where to start Fifteen minutes in the web interface: search for an email, build a campaign, run a similarity search, answer a report. How a trial runs on your own traffic, and what you can measure the results against before anything is blocked. The full analyst path: core concepts, the daily workflows, and the reference material behind them. The same ground covered on screen, if you would rather watch than read. # Analyst Overview Source: https://docs.xorlab.com/latest/analyst-overview The analyst's entry point, mapping the daily workflows and the order to learn them in. This guide covers the work you do as an analyst in xorlab: understanding why an email received a particular verdict, handling reported emails and release requests, and correcting the detection when a message is classified incorrectly. If you are new to the platform, start with the core concepts and the walkthrough below. The remaining sections describe the day-to-day workflows and the reference material you will return to. *** ## Start here Learn how the platform thinks: relationship, reputation and authentication. A short guided tour through the web interface with hands-on introduction. For visual learners — step-by-step description of the platform. *** ## Essential workflows Your work with xorlab will typically include: | Topic | Description | | - | - | | [Using Campaigns](/latest/campaigns) | Create new detection rules via campaigns. | | [Understanding a Verdict](/latest/understand-verdict) | Understand why xorlab assigned an email a specific verdict. | | [Handling the Abuse Mailbox](/latest/abuse-mailbox) | How to handle the reported emails and give end-users feedback. | | [Handling Release Requests](/latest/handling-release-requests) | How to handle quarantine release requests from end-users. | | [Reporting a Misclassification](/latest/reporting-misclassification) | Handle misclassifications and report them to xorlab. | *** ## Correcting the detection These topics come up when a message is classified incorrectly: * How to [Fix a False Positive](/latest/fix-false-positives) * How to [Fix a False Negative](/latest/fix-false-negatives) * How to [Handle Authentication Issues](/latest/authentication-issues) * How to [Tune Detection](/latest/detection-tuning) overall * [Using Topics](/latest/topic-detection) to improve searches and campaigns *** ## Reference Detailed material on the concepts you will encounter across the workflows above: * [**Tags**](/latest/tags) - what tags exist and how to use them * [**Verdicts**](/latest/verdicts) - list of verdicts with their description and precedence * [**Search Syntax**](/latest/search) - craft fast, accurate queries * [**Lists**](/latest/lists) - description of all built-in lists # Enable Auto-Login Source: https://docs.xorlab.com/latest/authentication-auto-login-link Passwordless quarantine access for employees, via a time-limited link embedded in notification mails. The auto-login link grants end-users access to their quarantined emails in the SSQ, under the `xcc_quarantine_user` role, see [Roles](/latest/built-in-user-roles). ## Quickstart The following steps will enable Auto-Login links: 1. In the Expert Editor, open `/shared/guarded_tenants.yml`. 2. Add the following configuration: * Include the `autoLoginLink` block for each tenant. * Set `enabled` to `true` to include an auto-login link in all quarantine notification emails. * Set `enabled` to `false` to disable the feature. * `expirationDays` defines the validity period of the authentication link. * The default of `expirationDays` is 7 days. * To make links permanent, set `expirationDays` to `-1`. ```yaml /shared/guarded_tenants.yml {7-9} theme={null} tenants: - name: example.com domains: - example.com autoLoginLink: enabled: true expirationDays: 7 ``` 3. Click **Publish**. The Auto-Login configuration becomes active within about one minute. 4. Now all quarantine notifications will contain Auto-Login links. ## Create access link For testing purposes, you can generate a link to access a specific mailbox in the SSQ. Prerequisites: * You need the `xcc_user_impersonate` permission, which is granted by the admin role * `autoLoginLink` needs to be enabled, as shown above Access this URL in your browser to get the token: ``` https:///api/v2/autologin/v1/generateToken?mailbox=test@example.com ``` ## Trigger a notification You can trigger an artificial quarantine notification to a specific mailbox, helping users regain access to the SSQ: Prerequisites: * You need an active, signed-in xorlab administrator session in the same browser. This endpoint is not publicly accessible and cannot be called anonymously. * `autoLoginLink` needs to be enabled, as shown above, for the notification to contain an access link. ``` https:///api/v2/emailNotification/v1/sendQuarantineAccessNotification?mailbox=test@example.com ``` **Use with care** The notification is delivered to whichever mailbox you specify, and depending on the tenant configuration it may contain a valid Auto-Login link for that mailbox. Only trigger it for mailboxes you are entitled to access. ## Additional information ### Compatibility with Authentication Methods The Auto-Login Authentication method is compatible with other authentication methods, including SAML, LDAP, and password-based authentication. This allows organizations to provide seamless access to quarantined emails for end-users while preserving existing authentication mechanisms for roles with elevated permissions. No configuration changes are needed in /auth/auth/auth.yml to enable this feature. When enabled, the auto-login token is included in all quarantine notification emails. It is not possible to restrict the Auto-Login Authentication method to specific user groups—once activated, all users receiving quarantine notifications will have access through the auto-login link. ### Access for Elevated Roles When users with elevated roles—such as analysts or administrators—receive a quarantine notification for their own quarantined emails, they can use the auto-login link to access their Self-Service Quarantine. However, this authentication method does not grant access to the Analyst Dashboard, Admin settings, or other privileged areas of the platform. To access these administrative features, users with elevated roles must first sign out and re-authenticate using their primary authentication method, such as SAML or LDAP. This ensures that privileged actions remain protected under stricter authentication controls, maintaining security while still allowing convenient access to quarantined emails. ## Multi-Tenancy The `autoLoginLink` block shown above is configured per tenant, so in a multi-tenant deployment you can enable Auto-Login for some tenants and not for others, and give each tenant its own `expirationDays`. Auto-Login is our recommended way to give the end-users of a tenant access to their SSQ, because it requires no integration with the tenant. See [Enable Tenant Login](/latest/multi-tenancy-authentication#auto-login) for a per-tenant example. # Add Trusted CA Certificates Source: https://docs.xorlab.com/latest/authentication-certificates Add a custom certificate authority to the xorlab trust store so LDAP and SAML2 connections validate. **Trust store** You must have the certificate(s) ready in a PKCS12 trust store named `truststore.p12`. The trust store must contain all certificates required for all trusted communication initiated by xorlab Authentication Service (LDAP, SAML2, etc.). For every service, only the outermost signer certificate is required to be a part of the trust store as long as the service supplies a correct certificate chain. By inserting a concrete server certificate into the trust store, that certificate is pinned explicitly. To create a trust store, you can use [Keytool](https://docs.oracle.com/cd/E19509-01/820-3503/6nf1il6er/index.html) or [OpenSSL](https://www.ssl.com/how-to/create-a-pfx-p12-certificate-file-using-openssl/). In a nutshell, you have to add your certificate file (.pem, .crt, .cer, .p7b, or .p7c) to the trust store. You can do this with the following `keytool` command: `keytool -import -file certificate.pem -alias ca1 -keystore truststore.p12` This command will export your `certificate.pem` file to the `truststore.p12` trust store file, giving the certificate a `ca1` alias. 1. Open the `auth/auth/auth.yml` file using the XCC [Expert Editor](/latest/expert-editor). 2. Add the following block and enter the password of your provided trust store: ```yaml auth.yml theme={null} trustStore: # The type of the trust store to use. Default is PKCS12 which is also the default # these days when using the 'keytool' shipped with the JRE. type: pkcs12 # The default trust store file. Defaults to 'truststore.p12'. Relative paths are resolved # relative to the config directory. file: truststore.p12 # The trust store password. password: ``` The password of the trust store delivered with a new deployment is documented in [Deployment Defaults → Trust store password](/latest/deployment-defaults#trust-store-password). Access to that page is restricted. 3. Click **Publish**. The authentication configuration becomes active within about one minute. 4. Switch to the CLI of the XCC and execute the following instructions one by one: ```shell theme={null} sudo su -s /bin/bash xcc_backend cd /var/lib/xorlab/xcc/config/work/ag_local/auth/auth ``` 5. Copy the `truststore.p12` file containing your certificate into the folder specified above. 6. Execute the following instructions one by one: ```shell theme={null} git add . git commit -m "Adding truststore file" exit ``` The Authentication service restarts automatically and applies the new configuration. # Handle Authentication Issues Source: https://docs.xorlab.com/latest/authentication-issues Diagnose common email authentication problems, such as legitimate senders blocked for missing SPF or DKIM. Most commonly: * A legitimate email is blocked because the sender does not provide proper authentication * SPF or DKIM is correct, but the email is not marked as authentic | Situation | Explanation | Measures | | - | - | - | | **Sender has valid SPF but is not marked authentic** | Usually, the envelope from domain (used for SPF) differs from the header from domain, which breaks DMARC alignment. | Ask the sender to use the same domain for both. If that’s not possible, configure a [Trusted MTA](/latest/trusted-mtas) in xorlab to override authentication. | | **Email has a valid DKIM signature but is not marked authentic** | Usually, the DKIM signing domain is different from the header from domain, which breaks DMARC alignment. | Ask the sender to sign with the same domain as the header from. If that’s not possible, use a [Trusted MTA](/latest/trusted-mtas) configuration. | | **SPF/DKIM failed, but the email was not blocked** | A failing SPF or DKIM alone is not enough to block an email, as this also happens with legitimate mail. However, it is still treated as a negative signal and increases the chance of blocking. | If you want to block all such emails, create a [campaign](/latest/campaigns) based on the `#dkimfail` and `#spffail` tags. | | **Email passes SPF/DKIM but is still blocked** | Authentication only proves that the email was actually sent from the sender domain, not that the email is safe. Attackers can still send from valid domains. | Create a [campaign](/latest/campaigns), or add the sender to the **Low trusted sender addresses** list ([Trusted Senders and Infrastructure](/latest/trusted-senders-infrastructure)) to make sure the email is not blocked. | # Enable LDAP Login Source: https://docs.xorlab.com/latest/authentication-ldap Configure the LDAP backend so users sign in to xorlab with their existing directory credentials. **Prerequisites** * If you want to connect to an LDAP server with non-public certificates, follow [Add Trusted CA Certificates](/latest/authentication-certificates). ## Basic configuration LDAP backend is defined in the `ldapAuthDataSources:` subsection of the `usernamePasswordAuthBackends:` section in the `auth/auth/auth.yml` file. First, you have to set up the basic parameters of your LDAP source, starting with its name—that can be whatever you like (`myLDAP` in this sample case)—and then configuring the connection as in the example below: ```yaml auth.yml theme={null} ldapAuthDataSources: myLDAP: host: ldap.example.com port: 10636 useLdaps: true useStartTls: false trustAll: false ``` The following table explains the parameters: | Parameter | Value | | :- | :- | | `host` | Address of your LDAP server | | `port` | Port number of your LDAP server | | `useLdaps` | Whether to use SSL on the socket layer (conflicts with `startTls` below) | | `useStartTls` | Whether to use the `startTLS` command (conflicts with `useLdaps` above) | | `trustAll` | Skip verification of the SSL server certificate (**warning**: do NOT do this on production!) | ## Authentication The next step involves user authentication in your LDAP server. You can use a direct distinguished name (DN) of a user who is being authenticated (if you already know what the DN of a user looks like) or query LDAP for the DN. Either way, you have to specify only one method. This is done within the `authentication:` subsection of your LDAP server configuration. ### Direct DN If you want to use a direct DN of a user, you just set the `withUserDn.userDnPattern` attribute to a pattern which will allow to deduct a DN from a login username string, e.g., `"uid={0},ou=users,dc=company,dc=com"`, where `{0}` will be substituted with a username: ```yaml auth.yml theme={null} authentication: withUserDn: userDnPattern: "uid={0},ou=users,dc=example,dc=com" ``` ### DN query When a DN of a user is not known, you can search the LDAP directory for the user entry using a so-called *technical user* for authentication. Once the user entry is found, their DN is used to authenticate with the provided credentials. A sample configuration of a DN query is as follows: ```yaml auth.yml theme={null} authentication: withQueryDn: bindDn: "uid=xcc-dev,ou=users,dc=example,dc=com" bindPassword: "LDAP_bind_pw" userBase: "ou=users,dc=example,dc=com" userSearch: "(uid={0})" ``` The table below explains the parameters: | Parameter | Value | | :- | :- | | `bindDn` | The bind DN of the technical user that will be used to fetch the user information from the directory; both user and password can be omitted if the directory supports unauthenticated access | | `bindPassword` | Password for the technical user | | `userBase` | Specifies the subtree in the directory where user information is stored | | `userSearch` | Template for user search query, e.g.,
- for OpenLDAP: `"(cn={0})"`
- for Microsoft Active Directory: `"(sAMAccountName={0})"`
where `{0}` will be replaced with the login username | ## Authorization After a successful authentication, a user has to be authorized: their roles are read from the LDAP backend. In the `authorization.query:` subsection, you can configure the parameters of the role search using a nested search within a subtree of a directory as in the sample configuration below: ```yaml auth.yml theme={null} authorization: query: roleBase: "ou=groups,dc=example,dc=com" roleSearch: "(member={0})" nestedRoleDepth: 2 groupRoleAttribute: dn ``` The parameters are explained in the table below: | Parameter | Value | | :- | :- | | `roleBase` | Base of the role subtree | | `roleSearch` | Filter to search for roles where
- `{0}` is substituted with the DN of the user entry found with the prior user search
- `{1}` is substituted with the username | | `nestedRoleDepth` | Integer that specifies how many times to search the directory for nested roles (set to `0` to disable resolution of nested roles) | | `groupRoleAttribute` | The role name to be used as an input for the `roleMapping` attribute; if this is not set, the DN of the role entry is used | ## Attribute mapping In the next step you have to map (assign) attributes from the LDAP user entries to the user model in xorlab Security Platform. The mapping is described using [Spring expression language](https://docs.spring.io/spring-framework/docs/3.2.x/spring-framework-reference/html/expressions.html) and is configured under the `attributeMapping:` subsection. You can use these methods: * `attr('')`: retrieve the attribute with the `''` name from attributes in the source authorization system * `replace(, '', 'replace')`: replace every occurrence of `''` with `'replace'` in an input string or a list of input strings * `azureAdEmails()`: read all email addresses from the Azure Active Directory `proxyAddresses` attribute. Literal values have to be quoted, e.g., `key: 'literal value'`. A sample configuration for attribute mapping, which simply retrieves attributes from the auth system, would look like this: ```yaml auth.yml theme={null} attributeMapping: userName: "attr('uid')" displayName: "attr('cn')" emails: "attr('mail')" ``` Available attributes are explained in the table below: | Attribute | Description | | :- | :- | | `userName` | An attribute mapping for the username. The result of this mapping will be put into the `subject` attribute of the token issued to the consuming services | | `displayName` | An attribute mapping for the display name of the user. It is optional and could be used by consuming services in places where a more descriptive name of the user is appreciated | | `emails` | A mapping for the list of emails associated with the user. Consuming services might use this list to associate the user with a certain pool of email messages | | `tenant` | **Only required for multi-tenancy deployments**: Make sure the value of the `tenant` attribute correspond to the `name` defined in the `guarded_tenants.yml`. | ## Role mapping The last step is to configure role mapping. You must map all roles served by the LDAP directory to the corresponding xorlab roles under the `roleMapping:` subsection. Roles that are not mapped are ignored by default. Multiple xorlab roles can be mapped to the same LDAP role, e.g., `xcc_login` → `company1-group1`, `xcc_admin` → `company1-group1`. The role mapping is case sensitive, therefore make sure that you specify the role names according to what is served by the LDAP directory. A sample role mapping configuration is shown below: ```yaml auth.yml theme={null} roleMapping: xcc_login: [ "cn=dev_xcc_login,ou=groups,dc=example,dc=com" ] xcc_analyst: [ "cn=dev_xcc_login,ou=groups,dc=example,dc=com" ] xcc_admin: [ "cn=dev_xcc_soc_admin,ou=groups,dc=example,dc=com" ] xcc_insights: [ "cn=dev_xcc_login,ou=groups,dc=example,dc=com" ] xcc_monitor: [ "cn=dev_xcc_soc_admin,ou=groups,dc=example,dc=com" ] ``` If the LDAP directory already serves roles compatible with xorlab (see [Built-in Roles](/latest/built-in-user-roles)), you can also specify a “pass-through” role-mapping mode using `roleMappingMode: PASS_THROUGH`. Please be aware that in the pass-through role-mapping mode, all roles served by the LDAP directory are added to the xorlab authorization context. If this context is becoming too large, i.e., too many irrelevant roles are added, then it might lead to errors and users being unable to access XCC. Therefore, it is advisable to only map the roles that are relevant to xorlab. A sample role mapping configuration using the pass-through mode: ```yaml auth.yml theme={null} roleMappingMode: PASS_THROUGH roleMapping: # You can still define a role mapping in pass-through mode xcc_monitor: [ "cn=dev_xcc_soc_admin,ou=groups,dc=example,dc=com" ] ``` ## Activate the configuration After updating `auth/auth/auth.yml`, click **Publish**. The authentication configuration becomes active within about one minute. ## Multi-Tenancy The setup on this page applies unchanged in a multi-tenant deployment. Two things are added on top: a `tenant` entry in the [Attribute mapping](#attribute-mapping) that matches the tenant `name` in `guarded_tenants.yml`, and a [tenant-restricted user role](/latest/built-in-user-roles) in the [Role mapping](#role-mapping). Complete per-tenant LDAP example, and the other login options available to tenants. ## Example configuration The final configuration for an LDAP backend should look like this: ```yaml auth.yml theme={null} tokenSigningKey: "xyz" enabledAuthBackends: - usernamePassword usernamePasswordAuthBackends: usernamePassword: ldapAuthDataSources: myLDAP: host: ldap.example.com port: 10636 authentication: withQueryDn: bindDn: "uid=xcc-dev,ou=users,dc=example,dc=com" bindPassword: "LDAP_bind_pw" userBase: "ou=users,dc=example,dc=com" userSearch: "(uid={0})" authorization: query: roleBase: "ou=groups,dc=example,dc=com" roleSearch: "(member={0})" nestedRoleDepth: 2 attributeMapping: userName: "attr('uid')" displayName: "attr('cn')" emails: "attr('mail')" roleMapping: xcc_login: [ "cn=dev_xcc_login,ou=groups,dc=example,dc=com" ] xcc_analyst: [ "cn=dev_xcc_login,ou=groups,dc=example,dc=com" ] xcc_admin: [ "cn=dev_xcc_soc_admin,ou=groups,dc=example,dc=com" ] xcc_insights: [ "cn=dev_xcc_login,ou=groups,dc=example,dc=com" ] xcc_monitor: [ "cn=dev_xcc_soc_admin,ou=groups,dc=example,dc=com" ] ``` # Authentication Overview Source: https://docs.xorlab.com/latest/authentication-overview Compare the available login methods (SAML, LDAP, auto-login, password file) and choose which to enable for admins, analysts, and end users. We recommend to enable **SAML** login for your admin and analyst users, and **Auto-Login** for your end-users to access SSQ. Provide Single Sign-On (SSO) for your users. Login users via LDAP query to an Active Directory. Auto-login users via the link in a quarantine notification. Works only for end-user access to the SSQ. Not available for admin or analyst roles. Maintain user credentials locally on xorlab in a static file, with optional TOTP/2FA onboarding. ## Multi-Tenancy All four methods above work in a multi-tenant deployment. Two things are added on top: * The authentication backend has to map a `tenant` attribute whose value matches the `name` of a tenant in `guarded_tenants.yml`. * Users have to be mapped to a [tenant-restricted role](/latest/built-in-user-roles), so that they only see the resources of their own tenant. Configuration examples for SAML, Auto-Login, password file and LDAP in a multi-tenant deployment. ## Additional information Here we provide additional information about user authentication for reference. ### Using multiple authentication methods xorlab supports using multiple authentication methods at the same time. For example, you can have SAML, LDAP and Password File active in parallel. The enabled methods are specified in `auth.yml`: ```yaml auth.yml {3,4,7,10} theme={null} # The first entry will be the default enabledAuthBackends: - exampleSaml - examplePassword usernamePasswordAuthBackends: examplePassword: # this identifier will determine the name of the backend saml2AuthBackends: exampleSaml: # this identifier will determine the name of the backend ... ``` The first entry in the list will be the default authentication method. This matters if you combine for example SAML and LDAP. **Access non-default auth method** To use a specific authentication method that is not the default, use `_agAuthBackend` in the URL, e.g., `https://xyz.activeguard.cloud/?_agAuthBackend=examplePassword`. ### User object in xorlab An xorlab user has the following attributes. The required ones need to be provided whenever a user logs in. * **User name (required)** (also called "subject") * **Display name (optional)** * **Email addresses (optional)**: List of email addresses associated with the user. Used to determine SSQ mailbox access. * **Roles (required)**: List of roles associated with the user. * **Tenant (optional)**: The tenant the user belongs to. Only relevant in multi-tenant deployments, see [Multi-Tenancy](#multi-tenancy). # Enable SAML Login Source: https://docs.xorlab.com/latest/authentication-saml Set up a generic SAML integration for single sign-on. For Entra ID, use the dedicated Entra ID guide instead. **SAML with M365 Entra ID** If you use Entra ID, please instead follow [SAML with Entra ID](/latest/m365-saml-entra-authentication). In order to get a working SAML authentication setup, you have to configure three elements: 1. Identity provider (on the customer side) 2. Authentication backend in xorlab 3. [Certificate in a trust store](/latest/authentication-certificates) Because multiple SAML identity providers can be active simultaneously in xorlab, they have to be distinguished by their names in the xorlab configuration. Here, this name will be referred to as `saml2BackendName`. ## Identity provider configuration On the identity provider side, you have to set up a new application for xorlab with the following properties: * SSO URL: `https:///auth/saml2/sso/` * Audience URI (SP Entity ID): `https:///auth/saml2/service-provider-metadata/` * The SAML response needs to be signed * The SAML assertion needs to be signed **Authentication request signing is now supported** If your IdP requires authentication request signing, this optional feature is supported in xorlab. For more information, please refer to [Authentication request signing](/latest/authentication-saml-request-signing). In addition, the SAML assertion must have attributes to transport the: * username (required; a list of one element) * roles (required; a list of many elements) * display name (optional; a list of one element) * emails (optional; a list of many elements) * `nameID` claim (required) Mapping these assertion attributes to xorlab user attributes can be specified in the configuration. Before you start configuring this backend in xorlab, please read the [Authentication](/latest/authentication-overview) article, if you haven’t already. ## xorlab configuration The configuration on the xorlab side is in the `auth.yml` file under the `saml2AuthBackends:` section. It is important that you use the same name for the SAML backend within xorlab as it is named on the identity provider side. Also, the identity provider needs to provide the metadata for the application configuration either via an URL or in a file. ### Basic configuration All basic settings are configured under the `idp:` subsection of the SAML backend section—in the example below we used `mySamlProvider` as the backend name: ```yaml auth.yml theme={null} saml2AuthBackends: mySamlProvider: idp: metadataFile: example-saml-provider-metadata.xml # metadataUrl: https://example-idp.com/metadata ``` If the IdP (Relying Party) metadata is stored in a file, specify its location and name as a value for the `metadataFile` attribute. Otherwise, point to this metadata available over a HTTP(S) endpoint by providing its URL address as a value for the `metadataUrl` attribute. Note that only one metadata location can be specified so, in the above example, the `metadataUrl` key is commented out and xorlab will use the metadata file. ### Attribute mapping In the next step, you have to map (assign) attributes from the SAML assertion to the user model in xorlab. The mapping is described using [Spring expression language](https://docs.spring.io/spring-framework/docs/3.2.x/spring-framework-reference/html/expressions.html) and is configured under the `attributeMapping:` subsection. You can use these methods: * `attr('')`: retrieve the attribute with the `''` name from attributes in the source authorization system. * `replace(, '', 'replace')`: replace every occurrence of `''` with `'replace'` in an input string or a list of input strings. * `azureAdEmails()`: read all email addresses from the Azure Active Directory `proxyAddresses` attribute. Literal values have to be quoted, e.g., `key: 'literal value'`. A sample configuration for attribute mapping which simply retrieves attributes from the auth system (Entra ID in this case) would look like this: ```yaml auth.yml theme={null} attributeMapping: displayName: attr('http://schemas.microsoft.com/identity/claims/displayname') emails: attr('http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name') roles: attr('http://schemas.microsoft.com/ws/2008/06/identity/claims/role') ``` Available attributes are explained in the table below: | Attribute | Description | | :- | :- | | `userName` | An attribute mapping for the username. The result of this mapping will be put into the `subject` attribute of the token issued to the consuming services
**Note:** The default is to use the assertion subject as a username. If you want to change this behavior, then specify a mapping for the username. However, in most setups, this should not be the case | | `displayName` | An attribute mapping for the display name of the user. It is optional and could be used by consuming services in places where a more descriptive name of the user is appreciated | | `emails` | Mapping for the list of emails associated with the user. Consuming services might use this list to associate the user with a certain pool of email messages | | `roles` | Mapping for the list of roles assigned to the user. This mapping can only be set for authentication backends which do not do their own authorization | | `tenant` | **Only required for multi-tenancy deployments**: Make sure the value of the `tenant` attribute correspond to the `name` defined in the `guarded_tenants.yml`. | ### Role mapping The last step is to configure role mapping. You must map all roles served by the SAML identity provider to the corresponding xorlab roles under the `roleMapping:` subsection. Roles that are not mapped are ignored by default. Multiple xorlab roles can be mapped to the same identity provider role, e.g., `xcc_login` → `company1-group1`, `xcc_admin` → `company1-group1`. If the SAML identity provider already serves roles compatible with xorlab (see [*Built-in Roles*](/latest/built-in-user-roles)), you can also specify a “pass-through” role-mapping mode using `roleMappingMode: PASS_THROUGH`. Please be aware that in the pass-through role-mapping mode, all roles served by the SAML identity provider are added to the xorlab authorization context. If this context is becoming too large, i.e., too many irrelevant roles are added, then it might lead to errors and users being unable to access XCC. Therefore, it is advisable to only map the roles that are relevant to xorlab. A sample role mapping configuration is shown below: ```yaml auth.yml theme={null} roleMapping: xcc_admin: - xcc_admin xcc_monitor: - xcc_monitor xcc_insights: - xcc_insights xcc_quarantine_user: - xcc_quarantine_user ``` A sample role mapping configuration using the pass-through mode: ```yaml auth.yml theme={null} roleMappingMode: PASS_THROUGH roleMapping: # You can still define a role mapping in pass-through mode xcc_monitor: [ xcc_admin ] ``` ### Activate the configuration After updating `auth/auth/auth.yml`, click **Publish**. The authentication configuration becomes active within about one minute. ### Multi-Tenancy The setup on this page applies unchanged in a multi-tenant deployment. Two things are added on top: a `tenant` entry in the [Attribute mapping](#attribute-mapping) that matches the tenant `name` in `guarded_tenants.yml`, and a [tenant-restricted user role](/latest/built-in-user-roles) in the [Role mapping](#role-mapping). Complete per-tenant SAML example, and the other login options available to tenants. ### Example configuration The final configuration for a SAML backend—Azure in this example—should look like this: ```yaml auth.yml theme={null} tokenSigningKey: "xyz" enabledAuthBackends: - azureSaml saml2AuthBackends: azureSaml: idp: metadataUrl: https://login.microsoftonline.com//federationmetadata/2007-06/federationmetadata.xml?appid= attributeMapping: displayName: attr('http://schemas.microsoft.com/identity/claims/displayname') emails: attr('http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name') roles: attr('http://schemas.microsoft.com/ws/2008/06/identity/claims/role') roleMapping: xcc_admin: - xcc_admin xcc_monitor: - xcc_monitor xcc_insights: - xcc_insights xcc_quarantine_user: - xcc_quarantine_user ``` **Shared mailboxes and aliases** The configuration from the above example will not support shared mailboxes or aliases obtained with the `proxyAddresses` attribute. # Enable Request Signing for SAML Source: https://docs.xorlab.com/latest/authentication-saml-request-signing Sign SAML authentication requests with a key store when your identity provider requires it. This optional feature requires creating a key store containing the certificate of a custom certificate authority and a private key that is used to sign the authentication request. 1. Run this command in your shell to create a `keystore.p12` key store file using the certificate in the `certificate.crt` file and a corresponding private key in the `privateKey.key` file: ```shell theme={null} openssl pkcs12 -export -in certificate.crt -inkey privateKey.key -out keystore.p12 ``` After entering the command, you will be prompted to enter and verify an export password to protect the key store file. Remember this password as you will need it in step #6. 2. Switch to the CLI of the XCC and execute the following instructions one by one: ```shell theme={null} sudo su -s /bin/bash xcc_backend cd /var/lib/xorlab/xcc/config/work/ag_local/auth/auth ``` 3. Copy the `keystore.p12` file into the folder specified above. 4. Execute the following instructions one by one: ```shell theme={null} git add . git commit -m "Adding keystore file" exit ``` 5. Open the `auth/auth/auth.yml` file using the XCC [Expert Editor](/latest/expert-editor). 6. In the `saml2AuthBackends` section, under your IdP config (here as `mySaml`), add the following block and enter your key store password as the `password` parameter: ```yaml auth.yml theme={null} saml2AuthBackends: mySaml: idp: signingKeyStore: file: keystore.p12 password: the-key-store-password ``` 7. Click **Publish**. The authentication configuration becomes active within about one minute. The Authentication service restarts automatically and applies the new configuration. # Enable Login via Password File Source: https://docs.xorlab.com/latest/authentication-with-a-password-file Define local xorlab users in a static password file, with password and account recommendations. To get an overview over all available login mechanisms, have a look at [Authentication](/latest/authentication-overview). When using local users, we recommend to: * Use secure passwords or passphrases. Make them unique, random, and long; preferably create them in a password generator of your favorite password manager. * Don't share accounts. * Enable 2FA. ## Quickstart 1. In the [Expert Editor](/latest/expert-editor), open `auth.yml` in `auth/auth/`. Make sure the following configuration is present. Normally it is pre-configured. Rename `examplePassword` to a more meaningful name. ```yaml auth.yml theme={null} enabledAuthBackends: - examplePassword usernamePasswordAuthBackends: examplePassword: ``` 2. Open `passwordFile.yml` in the same folder and add the local users. Below you find the available attributes that you can configure. We recommend to always require 2FA via `totpRequired`. ```yaml passwordFile.yml theme={null} users: - username: admin tenant: customerA displayName: The Admin passwordHash: "" emails: ["email1@example.com", "email2@example.com"] totpRequired: true roles: - xcc_admin - username: user1 tenant: customerA passwordHash: "{bcrypt}$2y$10$.4If2RFwcvHRrxlR98m9ju/mCRYCHLAYULByGXvJY.jBuK2/bckZu" totpRequired: true roles: - xcc_analyst ``` 3. Click **Publish**. The users become available within about one minute. The following `users` attributes are available: | Attribute | Value | | :- | :- | | `username` | Unique user name | | `tenant` | The `tenant` attribute should reference `name`, defined in `guarded_tenants.yml` | | `displayName` | More descriptive user name | | `passwordHash` | Hash value of a password (see [Password hash generator](#password-hash-generator) below) | | `emails` | List of emails associated with the user | | `roles` | Role in AG assigned to the user | | `totpRequired` | Optional flag. If set to `true`, the user must complete TOTP onboarding at the next login | | `totpSeedBase32` | Base32-encoded TOTP seed that will be set automatically be xorlab after the user completes the TOTP onboarding | ## 2FA/MFA onboarding Password file users can be forced to set up TOTP during their next login by adding `totpRequired: true` to the user entry in `passwordFile.yml`. ```yaml passwordFile.yml {5} theme={null} users: - username: adminMfa # password: test passwordHash: "{bcrypt}$2a$10$HVcQJ4zCw1B0AKPz2Mx8FO4HjtbP46FZNaVJDsosYrMeZXTHTs5ti" totpRequired: true roles: - xcc_admin - xcc_insights - xcc_monitor ``` Afterward, click **Publish**. The authentication configuration becomes active within about one minute, and the user will then be forced into a TOTP onboarding flow during the next login. 2FA Login If the onboarding is successful, the following changes will be automatically made by xorlab: * `totpSeedBase32` is stored on the user object * `totpRequired` is removed again (in this way, a new TOTP onboarding can be triggered by setting it to true again) After onboarding, the user must provide a valid TOTP code when logging in. By default, xorlab generates the seed automatically and updates the `passwordFile.yml`. However, if necessary, you can manually set the seed yourself. One can be created with `openssl rand 20 | base32`. ## Password hash generator 1. Run the `docker exec -it auth_auth create_hash` command on the **XCC** terminal to generate a password hash from the password you enter and re-type when prompted. You should get the output similar to the one below: ```shell theme={null} $ docker exec -it auth_auth create_hash ActiveGuard password hash generator Password to hash: 1234 Hashed password: {bcrypt}$2a$10$YOmSE8jp9fSBlVP3P3KEh.UnezedRVSnBZL7x5xWQvYfiBF0z49Uy ``` 2. Copy the generated hash, open Expert Editor and paste it into `auth/auth/passwordFile.yml` as a value for the `passwordHash` key of a particular user. 3. Once you finish adding password hashes for all users, click **Publish**. After about one minute, the changes are hot-reloaded and active. In case you don't have access to the XCC terminal, run `htpasswd -nBC 10 ignore | sed 's/ignore:/{bcrypt}/'` on a Linux terminal to generate a password hash as alternative to step 1 above. ## Enable Logging With this authorization method, it's good to know whether there were any unsuccessful login attempts. You can use the logging system for that: 1. Follow the instructions for logging [audit trail events](/latest/logging-events#audit-trail-events) to create a log for the `audit.access.denied` event. 2. Your `auth/auth/logback-audit.xml` config file should look like the one below: ```xml theme={null} syslog.example.com 514 UDP LOCAL0 %jsonMsg%n ``` If you want to log all login attempts, both unsuccessful and successful, just change the `logger name` value to `"audit.access"`. ## Multi-Tenancy The setup on this page applies unchanged in a multi-tenant deployment. Two things are added on top: a `tenant` entry per user that matches the tenant `name` in `guarded_tenants.yml`, and a [tenant-restricted user role](/latest/built-in-user-roles) in `roles`. Complete per-tenant password file example, and the other login options available to tenants. # Before You Begin Source: https://docs.xorlab.com/latest/before-begin-integration Complete before any integration: configure guarded domains, set data retention, and choose inline or monitoring mode. ## Configure your guarded domains Open the Expert Editor and add all domains that should be protected by xorlab to `shared/guarded_tenants.yml`. ```yaml shared/guarded_tenants.yml theme={null} tenants: - name: xorlab # Add all domains that should be protected domains: - xorlab.com - "**.xorlab.com" # To include subdomains; note the required quotes ``` ## Define data retention Review the default data retention parameters below. If you want to change a parameter, specify it in the same file `shared/guarded_tenants.yml`. Otherwise, no action is required. **SaaS** For xorlab SaaS, these values are managed by xorlab. Please contact [support@xorlab.com](mailto:support@xorlab.com) if you want to change it. ```yaml shared/guarded_tenants.yml theme={null} tenants: - name: xorlab ## Default data retention dataRetention: ## Duration after which benign mails are deleted. deliveredTtlDays: 90 ## Duration after which reported messages are deleted. reportedTtlDays: 730 ## Duration after which quarantind emails are deleted. quarantinedDefaultTtlDays: 30 ``` For all available retention and storage configurations, see [Data Retention Overview](/latest/data-retention-overview). When you finish editing `shared/guarded_tenants.yml`, click **Publish**. The new configuration becomes active within about one minute. ## Choose between Inline and Monitoring mode **Choose and configure either of those two modes.** This choice will also be required later in the setup. For new xorlab instances, the mode is normally already preconfigured. Active protection. Emails pass through xorlab and are forwarded to the next system. This mode is required for productive integrations. Supports *toothless* operation. xorlab receives only a copy of every email, and discards it after processing. This mode is used for temporary evaluations. ### Configure Inline mode For more information and explanations, see [Inline and Monitoring Mode](/latest/inline-and-monitoring-mode). 1. In `activeguard/core/active_guard.yml`, configure the SMTP handlers and the sender/recipient extraction settings: ```yaml active_guard.yml theme={null} scanSources: smtp: port: 10025 handler: # Inline mode - filter and forward processed emails smtpInline: {} smtpReport: {} ``` 2. Open `activeguard/mta/startup_cfg/postfix_custom/master.cf` and set the following lines to `bounce`. ```ini master.cf theme={null} # Enable all delivery status notifications bounce unix - - n - 0 bounce defer unix - - n - 0 bounce trace unix - - n - 0 bounce ``` 3. Open `activeguard/mta/startup_cfg/postfix_custom/main.cf` and configure it like this. ```ini main.cf highlight={2-3,6} theme={null} # Enable delay warnings delay_warning_time = 1h confirm_delay_cleared = yes # Ativate DSNs smtpd_discard_ehlo_keywords = silent-discard ``` 4. **Optional:** Enable *toothless* mode during learning phase. This will force xorlab to deliver all emails, even malicious ones. In toothless mode, xorlab will not take any actions on emails and always deliver them. This is only used for the first few weeks to avoid false positives during the learning phase. Afterward, this profile needs to be removed again. In toothless mode, you can search for `#quarantine` to find the emails that xorlab would have quarantined. ```yaml guarded_tenants.yml theme={null} tenants: - name: xorlab ruleProfiles: - default_dana.properties - default_actions.properties # Add this line to enable toothless mode - no_subject_rewrite_no_quarantine.properties ``` 5. Click **Publish**. The new configuration becomes active within about one minute. ### Configure Monitoring mode For more information and explanations, see [Inline and Monitoring Mode](/latest/inline-and-monitoring-mode). 1. In `activeguard/core/active_guard.yml`, configure the SMTP handlers and the sender/recipient extraction settings: ```yaml active_guard.yml theme={null} scanSources: smtp: port: 10025 handler: # Activate Monitoring mode - all emails will be dropped after processing. smtpOffline: senderRecipientExtraction: # Get the recipients from the TO and CC headers recipientExtraction: MAIL_HEADER # Get the envelope sender from email headers senderExtraction: HEADER smtpReport: {} ``` For M365 integrations, set `senderRecipientExtraction.senderExtraction` to `MAIL_ENVELOPE` instead of `HEADER`. 2. Open `activeguard/mta/startup_cfg/postfix_custom/master.cf` and set the following lines to `discard`. ```ini master.cf theme={null} # Disable all delivery status notifications bounce unix - - n - 0 discard defer unix - - n - 0 discard trace unix - - n - 0 discard ``` 3. Open `activeguard/mta/startup_cfg/postfix_custom/main.cf` and configure it like this. ```ini main.cf highlight={2-3,6} theme={null} # Comment out the following two lines. This will deactivate delay notifications. #delay_warning_time = 1h #confirm_delay_cleared = yes # Disable Delivery Status Notification (DSN) extension smtpd_discard_ehlo_keywords = silent-discard, dsn ``` 4. Click **Publish**. The new configuration becomes active within about one minute. # Blacklists Source: https://docs.xorlab.com/latest/blacklists Block email delivery by sender address, domain, IP, or other indicators, including how subdomain matching behaves. Blacklists are accessible by selecting **Settings → Lists → Blacklists** in XCC. **Subdomains** When you add a root (top-level) domain, e.g., `example.com`, to the list, all its subdomains will also be blacklisted. When you add a particular subdomain, e.g., `site.example.com`, only this subdomain will be blocked; any lower-level ones such as `other.site.example.com` won’t be affected. ## Blocked senders Customize any of the lists below to block emails from individuals, organizations, or top-level domains. | List name | Description | Accepted entries | | :- | :- | :- | | **Sender TLD blacklist** | Use this list to block emails from entire top-level domains | TLD as `String`, e.g., `cloud` | | **Sender domain blacklist** | Use this list to block emails from certain domains | Domain name as `String` | | **Sender address blacklist** | Use this list to block emails from certain sender addresses | Email address as `String` | | **Exposed accounts local sender domains** | Use this list to protect your exposed accounts from receiving emails from certain domains | Domain name as `String` | ## Blocked links Customize any of the lists below to block emails that contain links matching specific criteria. | List name | Description | Accepted entries | | :- | :- | :- | | **Link domain blacklist** | Use this list to block emails that contain a link from certain domains (or root domains) by the domain name | Domain name as `String` | | **Link IP blacklist** | Use this list to block emails that contain a link from certain domains (or root domains) by the domain IP | Domain IP as `String` | ## Blocked files Customize any of the lists below to block emails that contain files matching specific criteria. | List name | Description | Accepted entries | | :- | :- | :- | | **File extension blacklist (regex)** | Use this list to block emails that contain files with certain extensions | File extension as `Regex`, e.g., `(?i)\.bat$` for case-insensitive matches. | | **File hash blacklist** | Use this list to block emails that contain files matching certain SHA256 hash values | Hash value as `String`, e.g., `9db4 4391 dbfa 43bc 9b13 4440 00f6 9c77 a395 95c9 bac5 710e 0a78 a638 60b0 69a2` | | **File output blacklist (regex)** | Use this list to block emails that contain files for which the `file` command matches certain patterns | Pattern as `Regex`, e.g., `Java archive data` | ## Blocked recipients These are only usable with the `DROP_recipient_address_droplist` rule enabled. | List name | Description | Accepted entries | | :- | :- | :- | | **Recipient address droplist** | All incoming emails to these recipient addresses will be dropped immediately, except when there is another guarded recipient not listed here. | Email address as `String`, e.g., `formeremployee@company.com` | # List of Built-in Roles Source: https://docs.xorlab.com/latest/built-in-user-roles Reference table of the built-in xorlab roles and the capabilities each one grants. To create a new custom role, see [Create a Custom Role](/latest/create-custom-user-role). | xorlab role | Identifier | Capabilities | | - | - | - | | User | `xcc_analyst` | - Release emails from quarantine
- Reanalyze/Unlock emails
- Send feedback for reported incidents
- Submit misclassification reports
- Create, delete, or modify search queries and campaigns
- Update custom tags for messages, reported incidents, and uploaded files
- Upload a file for analysis | | User (Tenant-Restricted) | `xcc_tenant_analyst` | This user can only access resources on their own tenant and can:
- Release emails from quarantine
- Reanalyze/Unlock emails
- Send feedback for reported incidents
- Submit misclassification reports
- View campaigns and saved searches (no modifications)
- Update custom tags for messages, reported incidents, and uploaded files
- Upload a file for analysis | | Auditing User | `xcc_analyst_audit` | - View messages, reported cases, and analyzed files
- View campaigns and saved searches
- View the custom tags of messages
- View items from black- and whitelists in the web interface
- View configuration lists in Expert Editor | | Auditing User (Tenant-Restricted) | `xcc_tenant_analyst_audit` | This user can only access resources on their own tenant and can:
- View messages, reported cases, and analyzed files
- View campaigns and saved searches
- View the custom tags of messages
- View items from black- and whitelists in the web interface
- View configuration lists in Expert Editor | | Admin | `xcc_admin` | - Isolate messages from user mailboxes
- Modify black- and whitelists in the web interface
- Edit configuration lists in Expert Editor
- Start a new backup and check the status of the running process
- Edit system configurations
- Other power user capabilities | | Auditing Admin | `xcc_admin_audit` | - Everything that an `Auditing User` can view
- View system configurations and backup status | | Self-Service Quarantine User | `xcc_quarantine_user` | - Authenticate and log in via the web interface
- Change basic settings such as white/black theme
- View emails in the `Malware`, `Extortion`, `Policy` and `Impersonation` quarantine
- View and release emails from the `Phishing` and `Spam` quarantine. | | Insights User | `xcc_insights` | Access to the statistics dashboards in the **Insights** section | | Monitoring User | `xcc_monitor` | Access to `/monitoring` (Grafana) | ## Multi-Tenancy The two tenant-restricted roles, `xcc_tenant_analyst` and `xcc_tenant_analyst_audit`, exist for multi-tenant deployments. A user with one of these roles only sees the resources of the tenant they are assigned to. The tenant assignment does not come from the role itself: it comes from the `tenant` attribute your authentication backend maps for the user, which must match the `name` of a tenant in `guarded_tenants.yml`. See [Enable Tenant Login](/latest/multi-tenancy-authentication) for the mapping in SAML, LDAP and password file backends. # Using Campaigns Source: https://docs.xorlab.com/latest/campaigns Turn a search query into a standing rule, so analysts can close a detection gap without editing configuration files. Campaigns enable analysts to adjust the built-in detection. They allow the creation of new security policies in response to undetected threats or recurring false positives. ## Create a campaign ### 1. Search Every campaign starts with a search query in the All Messages view. Use the predefined search filters to specify email attributes, or write your own query directly in the search bar. For a syntax description of the search functionality, checkout [Search](/latest/search). Search functionality in All Messages The table below lists useful search parameters that can be used to define a campaign. Keep in mind that campaigns cannot include attributes related to verdicts or actions. | Search | Example | | :- | :- | | `From`, `To`, `CC` email address and display name
Envelope `from` and envelope recipient email address. | `from:search@xorlab.com`, `from.displayname:search`, `envfrom:search@xorlab.com`, `sender:search@xorlab.com`, `recipient:search@xorlab.com`, `involves:search@xorlab.com`
Supports wildcards | | Tags (note that the `#quarantine` and `#subjectrewrite` tags can’t be used in campaigns) | `#untrusted #newdomain` | | Domains in the email (incl. sender domains as well as URL domains in the email body) | `domain:test.xorlab.com`
Supports wildcards | | Attachment name and hash | `file.name:text.exe`, `file.hash:abcdefg`
Supports wildcards | | Spam score | `spam:gt:4` | | Rspamd score | `rsd:gt:2` | | Subject | `subject:"hi there"`
Supports wildcards | | Content similarity | N/A
The similarity search query is automatically generated in the similarity detail view | | Links URL and display text | `link:"https://www.test.com"`, `link.displaytext:"click here!"`
Supports wildcards | | Headers | `header.name:x-xor-example`, `header.value:abcdefg`, `header:{ name:x-xor-example value:abcdefg }`
Supports wildcards | ### 2. Evaluate After entering your search query, carefully review the results it returns. Because campaigns override all default detection rules, it’s crucial to design a query that matches only the intended emails — no more, no less. [Tags](/latest/tags) are a powerful way to narrow the campaign’s scope. Start by examining two or three emails that should match your campaign and identify which tags they have in common. Add these tags to your search query to make it more precise. For example, adding `#auth` ensures that the campaign only applies to senders that can be authenticated by SPF or DKIM. You can also use a NOT clause to exclude certain emails based on missing attributes. For example, adding `NOT #file` ensures the campaign doesn’t apply to emails that contain attachments. Press Enter after modifying your search query to refresh the results. ### 3. Create Once you are satisfied with your search query, click the campaign icon on the right side of the search bar to create a campaign. If the icon is not clickable, the current search query includes one or more attributes that are not compatible with campaigns. Review your query and remove unsupported fields before proceeding. Save the campaign ### 4. Save A pop-up window appears that lets you turn your search query into an active campaign. In addition to adding a name and short description, review the following fields carefully: * **Message Action**: Determines what xorlab should do with incoming, outgoing or internal emails that match the campaign query - quarantine, deliver, or none? * **Quarantine** - Assign a verdict and specify the quarantine where matching emails should be placed. * **Deliver** - Assign a verdict and optionally deliver the email with a rewritten subject. * **None** - Use this option if you want the campaign to only match reported emails with a **Resolve Action**. * **Resolve Action**: Controls how reported emails that match the campaign query are automatically resolved. See [Abuse Mailbox](/latest/abuse-mailbox) for examples. * **Benign** – Select for legitimate, safe emails. You can specify which feedback message is sent to the reporting employee. * **Malicious** – Select for emails that should not have been delivered. You can also specify the feedback message sent to the reporter. * **None** – Select if you do not want the campaign query to automatically resolve reported emails. Define campaign actions ### 5. Review Click the campaign icon in the left menu bar to open the Campaign Overview. This view lists all active campaigns and shows how many emails have matched each campaign — both in total and today. Use these statistics to verify that your campaign works as intended. If you notice an unexpectedly high number of matches, review the campaign query and adjust its filters or tags to narrow the scope. Overview of campaigns ## Modify a campaign From the Campaign Overview (see image above), click on a campaign to open its details page. Here, you can review the campaign’s query, search attributes, and the list of all emails that matched the campaign. Edit an existing campaign **How to edit a campaign:** * Modify the search query or filters * Press **Enter** to refresh the search results * Press on the three dots on the right * Select **Edit** from the menu * Make sure **Update with the current search** is checked * Click **Save** Press **Enter** after changing the search query and before opening the edit menu, otherwise the updated results won’t be applied. ## Campaign examples ### Blocking greymail * CFO Anthony Kovacs reports receiving a high volume of unwanted marketing and newsletter emails * Goal is to reduce inbox noise by quarantining messages that match greymail characteristics **Campaign Query:** ```sql theme={null} to:anthony.kovacs@futuretek-inc.com #domainonlyinbound #inc #untrusted (#crm or #marketing or #newsletter) not(#reputable or #senderwhitelisted or #attachedinvoice or #phishing or #malware or #vipfraud or #extortion or #impersonation) ``` ### Unauthenticated alerts * Technical systems send alert emails to the operations team when a critical threshold is reached * These alerts lack SPF and DKIM authentication, and the sender display name contains the company name * Default policies quarantine the messages as impersonation * Whitelisting the entire sending domain would pose a security risk **Campaign Query:** ```sql theme={null} from:alert@exmample.com from.displayname:"Futuretek-inc" to:operations@futuretek-inc.com subject:"Critical Alert" url:"https://monitoring.futuretek-inc.com/details?id=*" ``` ### Deliver reply-to's * The accounting team uses a third-party billing platform (billing-system.io) to send invoices * The platform routes customer replies to `accounting@futuretek-inc.com` using the header `X-Billing-System: invoice-reply` * These replies are often quarantined because xorlab sees no prior relationship with the sender * Goal is to deliver legitimate invoice replies while still scanning them for malware and static policy violations **Campaign Query:** ```sql theme={null} to:accounting@futuretek-inc.com #auth header:{name:"X-Billing-System" AND value:"invoice-reply"} not(#malware or #policy) ``` # Local Reputation Source: https://docs.xorlab.com/latest/concepts-local-reputation How xorlab learns which domains, file types, and content are normal for your organization, and uses that to spot anomalies. **Local Reputation** is the indicator this produces, and it helps distinguish relevant emails from potentially malicious ones. **Key Takeaways** * Use the local reputation to assess the relevance of certain domains and file types in your organization. * The detection engine filters content without local reputation more aggressively. * The local reputation is built up continuously, and shown for domains and file types. The local reputation for additional objects like root domains, top-level domains, file extensions, etc. can be queried via custom rules. * The local reputation decays over time if the corresponding content is not seen anymore. * The local reputation is only built up based on legitimate traffic with a high [Relationship](/latest/concepts-relationship). The local reputation is specific to your organization. It is distinct from the **Global Reputation** provided by xorlab, which is identical across all xorlab customers and reflects a global relevance scoring. ## Learning phase As with the [Relationship](/latest/concepts-relationship), the local reputation system relies on the initial learning phase to build up the reputation values. During this time, the values are expected to be inaccurate. Afterward, it stabilizes but the system keeps updating the local reputation values based on the email traffic it sees. ## Understanding reputation values The local reputation is a value between 0 and 100. 0 means it has not yet been seen in emails with a high relationship. The local reputation is a strong indicator to distinguish legitimate links from malicious ones, as it is difficult for an attacker to obtain local reputation for a domain. xorlab exposes the local reputation for the following objects. All can be found in the detail view: URL Domain File Type Sender Domain Subdomains normally inherit the local reputation of the root domain. **Reputation and Relationship** It is possible (but rare) that a sender domain has local reputation, but no [Relationship](/latest/concepts-relationship). This happens when your organization did not exchange emails with that domain itself, but the domain was mentioned in communication with another domain that has a relationship. In such a case, the local reputation weights similarly strong as a normal relationship value. ### Special cases There are some special cases where the local reputation behaves differently: * Domains from **Subdomain-Providers** do not inherit the local reputation of the root domain. * The local reputation is not used for domains from **Cloudstorage-Providers**. While it is shown in the platform, the detection engine does not use it as indicator. In general, all cases are exempted from local reputation where an attacker could easily obtain access to that domain. ### Using reputation tags To search and filter emails based on local reputation, you can use these built-in tags: | Tag | Description | | :- | :- | | `#nolocalreputation` | Email contains a link with a domain with no local reputation | | `#tldnoreputation` | Email contains a top-level domain with no local reputation | | `#filetypenoreputation` | Email contains a file type with no local reputation | | `#nonreputable` | Sender domain has no local reputation | For more tags about reputation, have a look at [Tags](/latest/tags). # Concepts Overview Source: https://docs.xorlab.com/latest/concepts-overview The core detection concepts behind xorlab's proactive model. Read these before the hands-on analyst guides. Learning who communicates with whom. Understanding what kind of content is exchanged in legitimate communications. Verifying the authenticity of email senders. # Relationship Source: https://docs.xorlab.com/latest/concepts-relationship The relationship (trust) model of who communicates with whom in your organization, built and maintained automatically. The relationship is a key indicator for the detection engine. **Key Takeaways** * Use the relationship to assess how frequently your organization communicates with a sender. * The relationship is learned on domains and mailboxes separately. The more back and forth emails are seen, the higher its value. It will decay over time if no communication is seen. * The detection engine filters emails with a lower relationship more aggressively. * In xorlab, instead of whitelisting a sender, you can manually increase its relationship to make the detection more permissive. * Relationship requires a successful authentication of the sender. ## Learning phase The relationship model needs an initial learning phase before it is ready to be used. Normally, detection is disabled during learning phase (*Toothless* mode, in which xorlab delivers all emails and only records the actions it would have taken) and manually enabled afterward. It is possible to enable partial protection already during learning phase. If this is required, contact [support@xorlab.com](mailto:support@xorlab.com). To get an indication of the learning, have a look at the *Business Relevant* percentage in the dashboard. The duration of the learning phase and the expected *Business Relevant* range are documented in [Detection Defaults → Learning phase](/latest/detection-defaults#learning-phase). Access to that page is restricted. Business Relevant The relationship model is designed such that it is not affected by special cases like out-of-office messages, subdomain providers, freemail providers, etc. ## Understanding relationship values A relationship value is between 0 and 100. 0 means there was no back and forth communication yet. Each email is assigned three values: * **Personal**: Relationship between sender and recipient mailbox * **Person - Organization**: Relationship between sender mailbox and recipient domain * **Organization**: Relationship between sender domain and recipient domain The overall relationship of an email is the maximum of those three. However, the detection engine may use these values individually. For example, it weights the Personal value higher than the Organization one. The relationship value only increases if emails were seen in both directions. **Relationship value and trust score** The relationship value is also referred to as the **trust score**. They are the same number, and the terms are used interchangeably across xorlab. In [Search](/latest/search#scores), it is the `trust` score: `trust:gte:15` matches every email whose relationship value is 15 or higher. Relationship Overview To see how much each side contributed to the current relationship, hover over one of the values to see the one-sided relationship: Relationship Details ## Using relationship tags To search and filter for emails based on their relationship, you can use these built-in tags: | Tag | Description | | :- | :- | | `#untrusted` | No or negligible relationship. Sender has not been seen or communicated with | | `#lowtrusted` | Small back and forth communication seen | | `#mediumtrusted` | Consistent back and forth communication seen | | `#hightrusted` | Frequent back and forth communication seen | | `#business` | The *Organization* relationship is at least `#lowtrusted` | | `#partner` | The domains with the highest relationship | **Detection** The biggest difference in detection happens between `#untrusted` and `#lowtrusted`. In general, xorlab allows only very little attack surface in `#untrusted` emails. The actual threshold values for the different tags are only indicative and subject to change; they are documented in [Detection Defaults → Relationship trust tiers](/latest/detection-defaults#relationship-trust-tiers) (password required). For more tags about relationship, have a look at [Tags](/latest/tags#relationship-tags). # Sender Authentication Source: https://docs.xorlab.com/latest/concepts-sender-auth How xorlab authenticates email senders with SPF, DKIM, and DMARC, a prerequisite for building the relationship model. Sender authentication is a mandatory requirement for using and building up [Relationship](/latest/concepts-relationship). **Key Takeaways** * xorlab relies on SPF, DKIM, DMARC and several built-in checks to verify the sender of an email. * xorlab treats the *Header From* address as email sender, not the *Envelope From*. An email is marked authentic only if the Header From is successfully authenticated. * More information about the sender authentication is found in the detail view. Sender Auth Overview ## Understanding authentication Each email shows a summary of authentication checks in the **Authentication** box of the detail view. A checkmark next to the header from address indicates whether the email is considered authentic overall. Authentication of the sender **Legend** * **Blue** — Check passed * **Red** — Check failed and flagged as suspicious * **Gray** — Check unavailable (e.g., missing SPF/DKIM) or failed but not considered suspicious Each check contributes to the email authentication in the following way: | Check | Description | Authentication Impact | Colors | | - | - | - | - | | **SPF** | Validates the envelope from domain using SPF. | Authenticates the sender **only when combined with a valid DMARC check**. | **Blue** — SPF pass
**Gray** — Neutral or no SPF
**Red** — SPF fail or softfail | | **DKIM** | Verifies all available DKIM signatures. | Authenticates the sender **only when combined with a valid DMARC check**. | **Blue** — At least one valid signature
**Gray** — No signature
**Red** — All signatures invalid | | **DMARC** | Checks SPF and DKIM alignment. | A passing DMARC check authenticates the sender (requires SPF or DKIM success). | **Blue** — SPF aligned or DKIM aligned
**Gray** — Both SPF and DKIM unavailable
**Red** — All other cases | | **Network** | Custom DNS checks (see details below). | A passing Network check authenticates the sender. | **Blue** — At least one check passed
**Gray** — No checks passed | ### SPF SPF checks if the **envelope from** domain allows the sending server to send emails for it. On its own, SPF doesn’t stop attackers from faking the **header from** address (the one which is seen in the inbox). That’s why SPF only counts when it also passes **DMARC alignment** — meaning the envelope from and header from domains match. You can see both in the email detail view. Header from and envelope from ### DKIM DKIM makes sure the email hasn’t been changed on the way by checking its digital signatures. But an attacker could still create a fake email and sign it with their own DKIM key. That’s why DKIM only counts with **DMARC alignment** — the **signing domain** has to match the **header from** domain you see as the sender. You’ll find the signing domain in the `dkim-signature` header (`d=` value). Header from and envelope from ### DMARC DMARC ties everything together. It works only if at least SPF or DKIM is valid, and makes sure they match the visible sender. Specifically: * With SPF, the envelope from and header from must match * With DKIM, the signing domain and header from must match By default, xorlab uses relaxed alignment. That means the main domain has to match, but subdomains don’t need to. ### Network The Network check consists of several individual checks. Passing any one of them is enough for the overall Network check to pass and to authenticate the sender. Results are either **pass** or **neutral** — there is no negative outcome. | Check | Description | | - | - | | **DNS MX check** | Passes if the sending IP is listed in the MX records of the sender domain. | | **DNS check** | Passes if (1) the EHLO domain matches the sender domain, and (2) its A record matches the sending IP. | | **Reverse DNS check** | Passes if (1) the PTR record of the sending IP matches the sender domain, and (2) its A record points back to the same IP. | | **Header from SPF check** | Passes if the SPF check succeeds for the header from domain. | | **Private IP check** | Passes if the sending IP is a private address. | As with DMARC, xorlab only requires the root domains to match in these checks. ## Handling authentication issues For instructions on how to handle common authentication issues, have a look at [Handling Authentication Issues](/latest/authentication-issues). # Change Misclassification Reporting Source: https://docs.xorlab.com/latest/configure-misclassification-reporting Override the default misclassification reporting parameters in xcc.yml. Configure the relevant parameters in the `xcc.yml` file using the Expert Editor. The values shown below are the defaults. You only need to override the parameters you want to modify, the others can be left out. ```yaml xcc.yml theme={null} misclassificationSubmission: ## Global switch to turn the feature on/off. enabled: true ## Pre-selected values in the web interface uiPreselection: ## Pre-selected Privacy Profile. Choose one of the following options: ## - SHARE_EVERYTHING ## - SHARE_EVERYTHING_EXCEPT_RAW_EML ## - DO_NOT_SHARE_SENSITIVE_INFORMATION privacyProfile: "SHARE_EVERYTHING" ## Pre-selected value of the Share Misclassification checkbox in the web interface shareMisclassification: true ``` ## Disable misclassification reporting To fully disable the misclassification reporting feature, add the following to `xcc.yml`: ```yaml xcc.yml theme={null} misclassificationSubmission: enabled: false ``` ## Turn off auto-selected misclassification checkbox Per default, the "Report misclassification" checkbox is always selected. To turn the auto-selection off, add the following to `xcc.yml`: ```yaml xcc.yml theme={null} misclassificationSubmission: uiPreselection: shareMisclassification: false ``` When you finish editing `xcc.yml`, click **Publish**. This setting is activated automatically within about one minute. # Create a Custom Role Source: https://docs.xorlab.com/latest/create-custom-user-role Define a custom role from permissions and scopes when the built-in roles do not fit. For the list of built-in roles, see [Built-in User Roles](/latest/built-in-user-roles). xorlab defines the concepts of *Roles*, *Permissions* and *Scopes*: * A *Permission* denotes a specific action bound to a specific *Scope*. Example: Releasing an email from the quarantine. * A *Scope* limits a permission to a specific context. Example: Releasing an email is only allowed for a specific tenant. * A *Role* is a set of *Scopes* with *Permissions*. If needed, *Roles* can be arbitrarily composed and assigned to users. Only roles can be assigned to users. ## Create a new role 1. Open the file `xcc.yml` in the Expert Editor. 2. Add the name and permissions of the new role to `roleToPermissionMappings`. You can find all permissions below at [Permissions-role matrix](#permissions-role-matrix) or [Start from a built-in role](#start-from-a-built-in-role). ```yaml xcc.yml theme={null} roleToPermissionMappings: # We advise to use lower snake case for custom role names. # Notice, that you must not use built-in role names like xcc_admin, etc. custom_role1: # The set of granted permissions associated to the role - xcc_asset_fetch|tenant:primary - xcc_rule_list_fetch custom_role2: - xcc_analyst_portal|tenant:primary ``` **Hint:** You can query your current permissions as described [here](/latest/troubleshooting#how-to-view-the-current-permissions-of-a-user). A custom role for SSQ users is not supported. It is required to use the built-in role `xcc_quarantine_user`. If you need to adjust the available permissions for your SSQ users, contact [support@xorlab.com](mailto:support@xorlab.com). ## Start from a built-in role Rather than assembling a role permission by permission, copy the full set of a built-in role and remove what you do not need. Each block below is the complete permission list of one built-in role, ready to paste into `roleToPermissionMappings`. Rename `my_custom_role` first — a custom role must not reuse a built-in role name. ```yaml xcc.yml theme={null} # Admin roleToPermissionMappings: my_custom_role: - config_service_read - config_service_write - xcc_analyst_portal - xcc_api_key_create - xcc_api_key_delete - xcc_api_key_fetch - xcc_asset_fetch - xcc_backup_info_fetch - xcc_backup_trigger - xcc_campaign_add - xcc_campaign_archive - xcc_campaign_fetch - xcc_campaign_remove - xcc_campaign_update - xcc_config_m365_credentials - xcc_core_result_delete - xcc_file_upload - xcc_incident_isolate - xcc_incident_resolve - xcc_login - xcc_mail_import_read - xcc_mail_import_update - xcc_quarantine_archive - xcc_quarantine_release - xcc_quarantine_release_request_create - xcc_quarantine_release_request_resolve - xcc_result_detail_dana_screenshots - xcc_result_detail_fetch - xcc_result_detail_preview - xcc_result_detail_unlock - xcc_result_list_fetch - xcc_result_query_check - xcc_result_report_log_add - xcc_result_report_log_fetch - xcc_rule_list_add - xcc_rule_list_fetch - xcc_rule_list_remove - xcc_rule_list_update - xcc_search_add - xcc_search_fetch - xcc_search_remove - xcc_search_update - xcc_share_misclassification - xcc_sidebar_file_upload - xcc_sidebar_messages - xcc_sidebar_quarantines - xcc_sidebar_reported - xcc_ssq_portal - xcc_topics_fetch - xcc_user_impersonate - xcc_user_settings_change_language - xcc_user_settings_change_quarantine_notification - xcc_user_settings_change_theme - xcc_user_tags_add - xcc_user_tags_fetch - xcc_user_tags_remove ``` ```yaml xcc.yml theme={null} # Admin audit roleToPermissionMappings: my_custom_role: - config_service_read - xcc_analyst_portal - xcc_asset_fetch - xcc_backup_info_fetch - xcc_campaign_fetch - xcc_login - xcc_result_detail_dana_screenshots - xcc_result_detail_fetch - xcc_result_detail_preview - xcc_result_list_fetch - xcc_result_query_check - xcc_result_report_log_fetch - xcc_rule_list_fetch - xcc_search_fetch - xcc_sidebar_file_upload - xcc_sidebar_messages - xcc_sidebar_quarantines - xcc_sidebar_reported - xcc_ssq_portal - xcc_topics_fetch - xcc_user_settings_change_language - xcc_user_settings_change_quarantine_notification - xcc_user_settings_change_theme - xcc_user_tags_fetch ``` ```yaml xcc.yml theme={null} # Analyst roleToPermissionMappings: my_custom_role: - xcc_analyst_portal - xcc_asset_fetch - xcc_campaign_add - xcc_campaign_archive - xcc_campaign_fetch - xcc_campaign_remove - xcc_campaign_update - xcc_file_upload - xcc_incident_isolate - xcc_incident_resolve - xcc_login - xcc_mail_import_read - xcc_quarantine_archive - xcc_quarantine_release - xcc_quarantine_release_request_create - xcc_quarantine_release_request_resolve - xcc_result_detail_dana_screenshots - xcc_result_detail_fetch - xcc_result_detail_preview - xcc_result_detail_unlock - xcc_result_list_fetch - xcc_result_query_check - xcc_result_report_log_add - xcc_result_report_log_fetch - xcc_rule_list_add - xcc_rule_list_fetch - xcc_rule_list_remove - xcc_rule_list_update - xcc_search_add - xcc_search_fetch - xcc_search_remove - xcc_search_update - xcc_share_misclassification - xcc_sidebar_file_upload - xcc_sidebar_messages - xcc_sidebar_quarantines - xcc_sidebar_reported - xcc_ssq_portal - xcc_topics_fetch - xcc_user_settings_change_language - xcc_user_settings_change_quarantine_notification - xcc_user_settings_change_theme - xcc_user_tags_add - xcc_user_tags_fetch - xcc_user_tags_remove ``` ```yaml xcc.yml theme={null} # Analyst audit roleToPermissionMappings: my_custom_role: - xcc_analyst_portal - xcc_asset_fetch - xcc_campaign_fetch - xcc_login - xcc_result_detail_dana_screenshots - xcc_result_detail_fetch - xcc_result_detail_preview - xcc_result_list_fetch - xcc_result_query_check - xcc_result_report_log_fetch - xcc_rule_list_fetch - xcc_search_fetch - xcc_sidebar_file_upload - xcc_sidebar_messages - xcc_sidebar_quarantines - xcc_sidebar_reported - xcc_ssq_portal - xcc_topics_fetch - xcc_user_settings_change_language - xcc_user_settings_change_quarantine_notification - xcc_user_settings_change_theme - xcc_user_tags_fetch ``` ```yaml xcc.yml theme={null} # Tenant analyst roleToPermissionMappings: my_custom_role: - xcc_analyst_portal - xcc_asset_fetch|tenant:primary - xcc_campaign_add|tenant:primary - xcc_campaign_archive|tenant:primary - xcc_campaign_fetch|tenant:primary - xcc_campaign_remove|tenant:primary - xcc_campaign_update|tenant:primary - xcc_file_upload - xcc_incident_isolate|tenant:primary - xcc_incident_resolve|tenant:primary - xcc_login - xcc_mail_import_read|tenant:primary - xcc_quarantine_archive|tenant:primary - xcc_quarantine_release|tenant:primary - xcc_quarantine_release_request_create|tenant:primary - xcc_quarantine_release_request_resolve|tenant:primary - xcc_result_detail_dana_screenshots|tenant:primary - xcc_result_detail_fetch|tenant:primary - xcc_result_detail_preview|tenant:primary - xcc_result_detail_unlock|tenant:primary - xcc_result_list_fetch|tenant:primary - xcc_result_query_check - xcc_result_report_log_add|tenant:primary - xcc_result_report_log_fetch|tenant:primary - xcc_rule_list_add|tenant:primary - xcc_rule_list_fetch|tenant:primary - xcc_rule_list_remove|tenant:primary - xcc_rule_list_update|tenant:primary - xcc_search_add|tenant:primary - xcc_search_fetch|tenant:primary - xcc_search_remove|tenant:primary - xcc_search_update|tenant:primary - xcc_share_misclassification|tenant:primary - xcc_sidebar_file_upload - xcc_sidebar_messages - xcc_sidebar_quarantines - xcc_sidebar_reported - xcc_ssq_portal - xcc_topics_fetch|tenant:primary - xcc_user_settings_change_language - xcc_user_settings_change_quarantine_notification - xcc_user_settings_change_theme - xcc_user_tags_add|tenant:primary - xcc_user_tags_fetch - xcc_user_tags_remove|tenant:primary ``` ```yaml xcc.yml theme={null} # Tenant analyst audit roleToPermissionMappings: my_custom_role: - xcc_analyst_portal - xcc_asset_fetch|tenant:primary - xcc_campaign_fetch|tenant:primary - xcc_login - xcc_result_detail_dana_screenshots|tenant:primary - xcc_result_detail_fetch|tenant:primary - xcc_result_detail_preview|tenant:primary - xcc_result_list_fetch|tenant:primary - xcc_result_query_check - xcc_result_report_log_fetch|tenant:primary - xcc_rule_list_fetch|tenant:primary - xcc_search_fetch|tenant:primary - xcc_sidebar_file_upload - xcc_sidebar_messages - xcc_sidebar_quarantines - xcc_sidebar_reported - xcc_ssq_portal - xcc_topics_fetch|tenant:primary - xcc_user_settings_change_language - xcc_user_settings_change_quarantine_notification - xcc_user_settings_change_theme - xcc_user_tags_fetch ``` ```yaml xcc.yml theme={null} # Insights roleToPermissionMappings: my_custom_role: - xcc_sidebar_insights - xcc_sidebar_threat_intelligence ``` ```yaml xcc.yml theme={null} # Monitor roleToPermissionMappings: my_custom_role: - xcc_sidebar_monitor ``` ## Set the permission scope Optional: you can restrict the permission scope with the following syntax. If you omit the scope, the permission will have global scope. ``` := (|)* := ||| := email:|sender:|recipient:(primary|all|(specific:)) := quarantine:(Airlock|BEC|Extortion|Filter|Impersonation|Malware|Phishing|Spam) := tenant:(primary|) := See Permissions-Role Matrix ``` Examples: | Definition | Explanation | | - | - | | `xcc_quarantine_release` | Allows releasing any quarantined email. | | `xcc_quarantine_release\|email:primary\|tenant:11111111-1111-1111-1111-111111111111` | Allows releasing emails quarantined for the user's primary email address. | | `xcc_quarantine_release\|recipient:all\|quarantine:Spam` | Allows releasing only spam emails quarantined for all of the user's addresses. | | `xcc_quarantine_release\|tenant:primary\|quarantine:Spam` | Allows releasing only spam emails quarantined for the user's primary tenant. | | `xcc_quarantine_release\|sender:primary\|quarantine:Phishing` | Allows releasing only sent phishing emails for the user's primary email address. | When you finish editing `roleToPermissionMappings` in `xcc.yml`, click **Publish**. The role mapping becomes active within about one minute. ## Permissions-role matrix This table shows whether a specific built-in role has a `Permission` or not and if so with what `Scope`. * Table entry `global` means that the role has unrestricted access for a specific permission. * Table entry `tenant:primary` means that the role has access for a specific permission but only within the bounds of the current user's tenant. * Table entry `based on ` means that the role has access only within the user's own tenant, to the quarantined emails of their own addresses, and only where that flag is enabled for the quarantine in `guarded_tenants.yml`. * A missing table entry indicates that the role does not have that permission at all.
Show roles
Permission xcc\_admin xcc\_admin\_audit xcc\_analyst xcc\_analyst\_audit xcc\_tenant\_analyst xcc\_tenant\_analyst\_audit xcc\_insights xcc\_monitor xcc\_quarantine\_user
config\_service\_read global global
Allows reading of configuration file from the config service in Expert Editor
config\_service\_write global
Allows editing of a configuration file in the config service in Expert Editor
xcc\_analyst\_portal global global global global global global
Allows general access to the main analyst UI
xcc\_api\_key\_create global
Allows creation of new API keys.
xcc\_api\_key\_delete global
Allows deletion of API keys.
xcc\_api\_key\_fetch global
Allows listing API keys.
xcc\_asset\_fetch global global global global tenant:primary tenant:primary based on canView
Allows retrieving analysis artifacts of messages, reported emails, and uploaded files
xcc\_backup\_info\_fetch global global
Allows access to information about the current backup status
xcc\_backup\_trigger global
Allows manually triggering of a backup
xcc\_campaign\_add global global tenant:primary
Allows creation of a new campaign
xcc\_campaign\_archive global global tenant:primary
Allows archiving of a campaign
xcc\_campaign\_fetch global global global global tenant:primary tenant:primary
Allows retrieval of the campaigns
xcc\_campaign\_remove global global tenant:primary
Allows removal of a campaign
xcc\_campaign\_update global global tenant:primary
Allows update of existing campaigns
xcc\_config\_m365\_credentials global
Allows managing (setting or clearing) stored credentials for Microsoft 365 integrations
xcc\_core\_result\_delete global
Allows to delete a result from xcc
xcc\_file\_upload global global global
Allows uploading files for analysis
xcc\_incident\_isolate global global tenant:primary
Allows isolation of one or multiple messages
xcc\_incident\_resolve global global tenant:primary
Allows resolving one or multiple incidents
xcc\_login global global global global global global global
Allows performing a login from the UI
xcc\_mail\_import\_read global global tenant:primary
Allows reading of mail imports
xcc\_mail\_import\_update global
Allows updating/managing of mail imports
xcc\_quarantine\_archive global global tenant:primary based on canView
Allows archiving of a quarantined message.
xcc\_quarantine\_release global global tenant:primary based on canRelease
Allows the release of one or more quarantined messages
xcc\_quarantine\_release\_request\_create global global tenant:primary based on canRequestRelease
Allows creating a release request for one or more quarantined messages
xcc\_quarantine\_release\_request\_resolve global global tenant:primary
Allows resolving a message which has been requested to be released either by approving or denying the request.
xcc\_result\_detail\_dana\_screenshots global global global global tenant:primary tenant:primary based on canView
Allows viewing of screenshots and videos from the dynamic analysis (if available)
xcc\_result\_detail\_fetch global global global global tenant:primary tenant:primary based on canView
Allows view of the email details
xcc\_result\_detail\_preview global global global global tenant:primary tenant:primary based on canView
Allows viewing of email previews (if available)
xcc\_result\_detail\_unlock global global tenant:primary based on canUnlock
Allows unlocking of emails with encrypted attachments (Attachment Airlock)
xcc\_result\_list\_fetch global global global global tenant:primary tenant:primary based on canView
Allows view of search query results (e.g., the Messages overview)
xcc\_result\_query\_check global global global global global global global
Internal permission required for all roles
xcc\_result\_report\_log\_add global global tenant:primary
Allows to add a new message to the report log
xcc\_result\_report\_log\_fetch global global global global tenant:primary tenant:primary
Allows viewing of the case log
xcc\_rule\_list\_add global global tenant:primary
Allows addition of entries on black- and whitelists
xcc\_rule\_list\_fetch global global global global tenant:primary tenant:primary
Allows retrieval of black- and whitelists
xcc\_rule\_list\_remove global global tenant:primary
Allows removal of entries of rule lists
xcc\_rule\_list\_update global global tenant:primary
Allows editing of black- and whitelists
xcc\_search\_add global global tenant:primary
Allows creation of a new saved query
xcc\_search\_fetch global global global global tenant:primary tenant:primary
Allows retrieval of the saved queries
xcc\_search\_remove global global tenant:primary
Allows removal of existing saved queries
xcc\_search\_update global global tenant:primary
Allows update of existing saved queries
xcc\_share\_misclassification global global tenant:primary
Allows submission of misclassification reports
xcc\_sidebar\_file\_upload global global global global global global
Allows access to the list of files uploaded using the `File Upload` menu item
xcc\_sidebar\_insights global
Allows access to the `Insights` menu item
Note: To access the actual dashboards, the user must also have role `xcc_insights`
xcc\_sidebar\_messages global global global global global global
Allows display of the Messages menu item
xcc\_sidebar\_monitor global
Allows access to `Monitoring` menu item
Note: To access the actual dashboards, the user must also have role `xcc_monitor`
xcc\_sidebar\_quarantines global global global global global global
Allows display of the Quarantines menu item
xcc\_sidebar\_reported global global global global global global
Allows display of the Reported menu item
xcc\_sidebar\_threat\_intelligence global
Allows access to the `Threat Intelligence` menu item
Note: To access the actual dashboards, the user must also have role `xcc_insights`
xcc\_ssq\_portal global global global global global global global
Allows access to the self-service user quarantine UI
xcc\_topics\_fetch global global global global tenant:primary tenant:primary
Allows viewing of the extracted topics from email (if available)
xcc\_user\_impersonate global
Allows impersonation of another user
xcc\_user\_settings\_change\_language global global global global global global global
Allows the user to change their language
xcc\_user\_settings\_change\_quarantine\_notification global global global global global global global
Allows the user to change their quarantine notification settings
xcc\_user\_settings\_change\_theme global global global global global global global
Allows the user to change their settings (e.g., the theme)
xcc\_user\_tags\_add global global tenant:primary
Allows adding of one or multiple tags for an analyzed message, reported incident, and uploaded file
xcc\_user\_tags\_fetch global global global global global global
Allows retrieval of user tags attached to an analyzed message, reported incident, and uploaded file
xcc\_user\_tags\_remove global global tenant:primary
Allows removal of one or multiple tags for an analyzed message, reported incident, and uploaded file
# Custom Alerts Source: https://docs.xorlab.com/latest/custom-alerts Tag emails with alert hashtags based on domain, address, and keyword lists under Settings, Lists, Alerts. Emails matching one of these lists get tagged `#alert`. The lists are accessible by selecting **Settings → Lists → Alerts** in XCC. Modify any of the lists below: | List name | Description | Accepted entries | | :- | :- | :- | | **Domain alerts** | Use this list to flag emails that contain link domains in the email body or any of its attachments | Domain name as `String`, e.g., `cloudservice.com` | | **Email address alerts** | Use this list to flag emails sent from certain email addresses | Email address as `String`, e.g., `user@suspicious.com` | | **File extension alerts (regex)** | Use this list to flag emails that contain file attachments with a given file extension | File extension as `Regex`, e.g., `(?i)\.exe$` for case-insensitive matching | | **File hash alerts** | Use this list to flag emails that contain file attachments with a given SHA256 hash value | File hash value as `String`, e.g., `9db4 4391 dbfa 43bc 9b13 4440 00f6 9c77 a395 95c9 bac5 710e 0a78 a638 60b0 69a2` | | **Keyword alerts** | Use this list to flag emails that contain any given keyword | Keyword as `String` | # Dashboard and Messages Source: https://docs.xorlab.com/latest/dashboard-messages The dashboard and message list views: traffic statistics, filters, and how to navigate processed emails. ## Dashboard Dashboard is the first page you will see after you login to xorlab. It gives you a summary of the platform activities in a concise and comprehensible way. You can see the statistics of email traffic, the status of the defense system, and the results of its activity. Dashboard In the left pane, there is a navigation menu that allows you to quickly access particular sets of messages and other tools. The navigation menu includes: * **Messages**: A list of **All Messages** processed by xorlab. * **Quarantines**: A list of quarantined messages grouped by a type of threat (malware, phishing, etc). * **Abuse Mailbox**: A list of messages reported as suspicious by users and grouped into cases by priority or status, see [Abuse Mailbox](/latest/abuse-mailbox). * **Saved Searches**: A list of your saved custom searches. * **Campaigns**: The panel for managing your [Campaigns](/latest/campaigns). * **Insights**: The panel for accessing statistic information presented as Elastic-powered graphs. * **Threat Intelligence**: The panel for accessing more detailed information on main five areas in Elastic-powered dashboards. * **Monitoring**: Directs to the Grafana, a centralized access where you can access logs and dashboards, see also [Monitoring Guide](/latest/monitoring-guide). * **File Upload**: A tool that allows you to manually upload a file to the Sandbox, see [File Analysis](/latest/file-analysis). ## All messages This page shows an overview of all messages that have been processed by xorlab. All Messages View The search bar on top of the page enables you to filter the list view for messages. It includes user-friendly features such as autocomplete, filters, and time range selection. Please refer to the [Search Documentation](/latest/search) for more information. For each email in the list view, you find the following information: * **Type**: IN (incoming email), OUT (outgoing email), INT (internal email) * **Received**: The timestamp on which xorlab received the email * **Reputation/Trust**: A color-coded and numeric indicator. Reflects either trust or reputation, depending on which is more relevant and available. * **Authentication**: The blue or gray check symbol. A blue checkmark shows that the sender is authenticated, a gray checkmark indicates broken authentication. * **From**: The sender address of the message and the display name of the sender. * **Attachment**: A paperclip symbol appears if the email includes one or multiple attachments. * **Subject**: The subject of the email. * **To**: The recipient address of the message and the display name of the recipient. * **Verdict**: Classification of the email, ranging from malicious (red) to benign (blue). Exceptions are spam (orange) and simulation (blue). * **Status**: Explains the action that xorlab took with the email. Most frequent actions are either quarantined (yellow) or delivered (green). * **Contextual Banners**: If enabled, the **Status** field might also include a symbol to indicate which [contextual banner](/latest/detection-contextual-banners) was applied. # Review Default Actions Source: https://docs.xorlab.com/latest/detection-actions Decide which verdicts are quarantined and which are delivered with a rewritten subject, and set that per tenant. The **Actions** configuration screen defines what xorlab does with an email once it has been classified: deliver it, rewrite its subject, or quarantine it. Actions are chosen from the email's verdict and confidence — see [List of Verdicts](/latest/verdicts) for how the final verdict is resolved, and [Understanding an Email Verdict](/latest/understand-verdict) for how a message gets one. ## Review the default actions Review the default protection settings of xorlab: 1. Open **Admin → Actions** in XCC. Review the configured actions per confidence and verdict. 1. For a more aggressive detection, set the **Medium Confidence** of the verdicts to quarantine. 2. Change the default **Subject Rewrite** of *\[SPAM]* if required. 3. Setting **Low Confidence** to quarantine is not recommended as it will create false positives. Default actions 2. In addition to the configured **Actions**, xorlab can quarantine an email due to a static policy. Go through [Review Static Policies](/latest/detection-static-policies). For changes this screen cannot express, see [Tune Detection](/latest/detection-tuning) and [Rule Parameters](/latest/rule-parameters). ## Multi-Tenancy Actions are configured per tenant. Select the tenant in the dropdown, then review its **Actions**. To give a tenant a different detection strength altogether, reference a different [rule profile](/latest/rule-profiles) for it. # Add Result Header to Email Source: https://docs.xorlab.com/latest/detection-analysis-result-header Add headers carrying xorlab's analysis results to every email so downstream systems can act on them. The headers contain only the most important analysis results, not the full analysis output. To activate this: 1. In the Expert Editor, open `shared/guarded_tenants.yml`. 2. Find `messageProcessing.pipelines.default`, and add this line: ```yaml guarded_tenants.yml {6} theme={null} tenants: - name: example messageProcessing: pipelines: emails: # Supported values: Enabled|EnabledInbound|Disabled analysisResultInMimeHeader: EnabledInbound ``` Click **Publish**. The new setting becomes active within about one minute. With this feature enabled, the header of an analyzed email will look like the one below: ``` x-xor-id: 111111111111-1111-1111-1111-111111111111 x-xor-decision: DELIVER x-xor-verdict: spam x-xor-verdict-confidence: high x-xor-tags: #spam, #highrisk, #hsrisk, #domainonlyinbound, #mprisk, #noreputation, #rsdmediumscore, #senderonlyinbound, #tldnoreputation, #untrusted, #auth, #lowscore, #spfpass, #banner, #deliver, #dkimfromsigned, #eachlinkmfrom, #htmlmessage, #inc ``` The `x-xor-verdict-confidence` header is only included when the verdict is either Phishing, Spam, VIP Fraud, Impersonation, or Policy. The other verdicts do not have a confidence. # Enable Attachment Removal Source: https://docs.xorlab.com/latest/detection-attachment-removal Strip suspicious attachments and deliver the remaining email. The Self-Service Quarantine is generally the better option. Removed attachments can be replaced with a text file. **Use SSQ instead** In general, we recommend to enable the [SSQ](/latest/ssq-overview) instead of attachment removal. It provides a safer environment and no attachments are lost. Attachment removal can be activated in different ways: * **Verdict based**: Remove all attachments from emails classified as Malware or Filter/Policy. * **File based**: Remove attachments that match certain file criteria (e.g. extension) * **Custom rule based**: Remove attachments based on arbitrary custom rules - contact [support@xorlab.com](mailto:support@xorlab.com) for this After an attachment was replaced or removed, the original attachment is deleted and cannot be recovered anymore. To enable attachment removal or replacement: 1. Open the `activeguard/core/rule_sets/90_local/params/local.properties` file in Expert Editor and add: ```ini local.properties theme={null} # Global switch for enabling attachment removal/replacement POLICY_attachment_transform_state=ACTIVE # Control the file name of the text file which replaces the attachment. Use %s to include the original file name POLICY_attachment_replace_filename_formatstring=removed-%s.txt ``` 2. Specify the email direction on which attachment removal is activated: ```ini local.properties theme={null} # Supported values: ALL, INCOMING (default) and OUTGOING POLICY_attachment_transform_direction=INCOMING ``` 3. For **verdict based** attachment removal, use the following configuration: ```ini local.properties theme={null} # Supported values: keep(default)/remove/replace # Add only the verdicts where you want to enable attachment removal POLICY_malware_dynamic=replace POLICY_malware_static=replace # Use attachment removal/replacement on filter verdicts with care. POLICY_attachment_filter= ``` 4. For **file based** attachment removal, use the following configuration: ```ini local.properties theme={null} # Supported values: keep(default)/remove/replace POLICY_encrypted_archive_file= POLICY_excessive_nesting= # Replace/remove all executable files POLICY_executable_file= # Replace/remove all files with blacklisted extensions/hashes/file outputs POLICY_file_extension_is_blacklisted= # (1) POLICY_file_hash_is_blacklisted= POLICY_file_output_is_blacklisted= # Replace/remove all flash files POLICY_flash= POLICY_legacy_archive_file= POLICY_html_file= POLICY_iso_file= POLICY_office_encrypted= # Replace/remove all files with VBA script POLICY_office_vbascript= # Replace/remove all files with dangerous VBA script (executable, file, network or registry directives) POLICY_office_dangerous_vbascript= POLICY_shortcut_file= ``` 1. Attachment removal based on blacklists only works if the quarantine action for blacklist matches is disabled. If you need help adjusting this setting, contact [support@xorlab.com](mailto:support@xorlab.com). 5. For every use case above, you can specify the text in the replacement file with the following properties: ```ini local.properties theme={null} # If attachment replacement is enabled, this is the generic fallback text which goes into the text file replacing the file. POLICY_attachment_replace_text=This attachment got removed as it violated our security policy. # Specific replacement tests: POLICY_attachment_replace_text_executable_file=This attachment got removed as it was an executable file and thus violated our security policy. POLICY_attachment_replace_text_legacy_archive_file=This attachment got removed as it was an archive and thus considered dangerous. POLICY_attachment_replace_text_excessive_nesting=This attachment got removed because of excessive nesting of files. POLICY_attachment_replace_text_encrypted_archive_file=This attachment got removed as it was an encrypted archive and thus violated our security policy. POLICY_attachment_replace_text_file_extension_is_blacklisted=This attachment got removed as it had a blacklisted file extension. POLICY_attachment_replace_text_file_hash_is_blacklisted=This attachment got removed as it was blacklisted. POLICY_attachment_replace_text_file_output_is_blacklisted=This attachment got removed as it had a blacklisted file extension. POLICY_attachment_replace_text_flash=This attachment got removed as it was a flash file and thus violated our security policy. POLICY_attachment_replace_text_html_file=This attachment got removed as it was a html file and thus violated our security policy. POLICY_attachment_replace_text_iso_file=This attachment got removed as it was an iso file and thus violated our security policy. POLICY_attachment_replace_text_office_encrypted=This attachment got removed as it was an office file with encrypted content and thus violated our security policy. POLICY_attachment_replace_text_office_vbascript=This attachment got removed as it was an office file with active content and thus violated our security policy. POLICY_attachment_replace_text_shortcut_file=This attachment got removed as it was a shortcut file and thus violated our security policy. POLICY_attachment_replace_text_office_dangerous_vbascript=This attachment got removed as it contained suspicious scripts and thus violated our security policy. POLICY_attachment_replace_text_malware_dynamic=This attachment got removed as it contained suspicious scripts and thus violated our security policy. POLICY_attachment_replace_text_malware_static=This attachment got removed as it contained suspicious scripts and thus violated our security policy. POLICY_attachment_replace_text_filter=This attachment got removed as it violated our security policy. ``` 6. Click **Publish**. The rule-set configuration becomes active within about one minute. # Enable Contextual Banners Source: https://docs.xorlab.com/latest/detection-contextual-banners Add contextual warning banners to emails. Requires a subscription; contact support to enable. The script packages and individual scripts linked on this page are protected downloads and require a password. ## Why Contextual Banners Matter Contextual Banners provide users with targeted security insights based on xorlab's analysis, appearing at the top of the email body. They highlight risks such as low sender trust, potential partner impersonation, or suspicious attachments. Unlike generic warnings, these banners are selectively applied to reduce alert fatigue, ensuring that users remain attentive to truly relevant threats. Examples of different types of banners, categorized by severity: * **Alert (Red) banners:** Critical warnings for high-risk messages. Alert banner * **Warning (Orange) banners:** Moderate risks that require user attention. Warning banner * **Information (Blue) banners:** General insights without immediate action required. Info banner ## How It Works Contextual Banners highlight security risks based on matched detection rules: 1. xorlab adds an `x-xor-banner` header to flagged emails. 2. The header includes a banner identifier. 3. Exchange mail flow rules detect the identifier. 4. If a match is found, the banner is added to the email body. 5. Emails with a `x-xor-banner` header appear in xorlab with the `#banner` tag. ## Configuration in xorlab **Optional Feature** The Contextual Banners feature is optional and the configuration options are disabled by default. To enable this feature, please contact [support@xorlab.com](mailto:support@xorlab.com) to add it to your subscription. 1. Log in to the xorlab Security Platform. 2. Click the **Admin** icon in the right menu. 3. In the **Admin Panel**, click **General Settings**. Selecting General Settings 4. Select **Contextual Banners**. 5. Enable the Alert, Warning and Info banners. Enabling Contextual Banners ## Configuration in Exchange Online Before proceeding, ensure you are connected to Exchange Online via PowerShell. If you need guidance, refer to [Microsoft's official documentation](https://learn.microsoft.com/en-us/powershell/exchange/connect-to-exchange-online-powershell). A single script, `xorlabExoContextualBanners.ps1`, manages every banner mail flow rule: creating, updating, removing, enabling and disabling them, in English, German or Spanish. 1. Download the script with the command on [Script Downloads](/latest/script-downloads#contextual-banner-scripts-for-exchange-online). Run that command in your PowerShell window or in the Azure Cloud Shell, then come back here and start the script without any parameters to open the guided menu: ```powershell theme={null} ./xorlabExoContextualBanners.ps1 ``` If you lack admin privileges or are not allowed to run scripts, first run: ```powershell theme={null} Set-ExecutionPolicy -Scope Process -ExecutionPolicy RemoteSigned ``` If the script reports that `ExchangeOnlineManagement` is missing, confirm the prompt to install it, or rerun with `-InstallModule`. 2. Choose `1` for **Add**, keep the default rule prefix `XorBanner`, pick a banner language, then choose `Test` for the recipient scope and enter a test address — so you can confirm the banners render correctly before applying them to everyone. 3. The script then connects to Exchange Online, and a sign-in window opens. Sign in with your Exchange administrator credentials. In the Azure Cloud Shell, the script shows a code instead: ```text theme={null} To sign in, use a web browser to open the page https://microsoft.com/devicelogin and enter the code ABCD-EFGH to authenticate. ``` Open that page in any browser, enter the code and sign in there. The script keeps running in your terminal while you do this. 4. Review the summary and confirm with `y`. The console then lists every rule as it is created: ```text theme={null} Add: XorBannerContentExecutable Add complete: 43 changed, 0 previewed, 0 skipped. ``` 5. From the menu, choose **Add** again, this time with recipient scope `All`, to apply the banners to every internal recipient. Rule creation can take a few minutes. Once complete, go to the [**Transport rules**](https://admin.exchange.microsoft.com/#/transportrules) page in the Exchange admin panel. You should see multiple rules with the prefix `XorBanner`: Banner rules in M365 ### Managing Banner Rules with PowerShell Once you know which operation you need, pass `-Action` (and, for `Add`/`Replace`, `-Language`) to skip the menu and run it directly: ```powershell theme={null} ./xorlabExoContextualBanners.ps1 -Action Replace -Language DE ``` | Action | Effect | | - | - | | `Add` | Creates the rules that do not exist yet for the chosen language; skips the ones that already exist. | | `Replace` | Updates the content and language of existing rules in place. Preserves each rule’s priority, enabled/disabled state and recipient scope unless you change the scope; rules that do not exist yet are skipped — use `Add` to create them first. | | `Remove` | Deletes every rule whose name starts with the selected prefix. | | `Disable` | Disables matching rules without deleting them, for example while troubleshooting. | | `Enable` | Re-enables rules that were previously disabled. | Add `-DryRun` to any of the commands above or below to preview the rules it would change without writing anything. `-DryRun` still needs the `ExchangeOnlineManagement` module and a connection to read the current rules, but it never installs modules or creates, updates, removes, enables or disables a rule. Add `-Language EN`, `DE` or `ES` for `Add`/`Replace`. For the other options: * `-TestRecipientEmail 'alice@example.com','bob@example.com'` restricts `Add`/`Replace` to the listed recipients. On `Replace`, omitting this keeps each rule’s existing recipient scope. * `-ResetRecipientScope` (`Replace` only) clears a previous recipient restriction and returns the rule to all internal recipients. * `-CreateDisabled` (`Add` only) creates the new rules disabled; by default they are created enabled. * `-RulePrefix XorlabBanner` targets rules created by an older version of this script instead of the current `XorBanner` prefix. * `-NonInteractive` fails instead of prompting when a required parameter is missing, for unattended runs. * `-UseExistingConnection` reuses an already-connected Exchange Online session instead of opening a new device sign-in, and leaves it connected afterward. It fails if no connected session exists. For the full parameter reference, run `./xorlabExoContextualBanners.ps1 -Help` or `Get-Help ./xorlabExoContextualBanners.ps1 -Full`. If an operation stops partway through (for example, you cancel the sign-in), earlier successful changes are not rolled back automatically. Review the rule list in the Exchange admin panel before retrying the same command — rerunning `Add` skips the rules it already created. ## Configuration in On-Premises Exchange ### Setup 1. Download the [xorlab contextual banner On-Prem script package](/latest/script-downloads#contextual-banner-scripts-for-on-premises-exchange) to download all scripts to manage the banner mail flow rules and place them on your Exchange Server. 2. Open “Exchange Management Shell” as administrator and go to the Download directory. ### Installing Banners 1. Run the script with the -DryRun command. (replace the email address below for that of the recipient) ```powershell theme={null} .\xorlabOnPremAddBanners_TestRecipientEmail_DE.ps1 -TestRecipientEmail "arthur.dent@exchange.xorlab.net" -DryRun ``` 2. Rerun the script without the -DryRun command. 3. Check in the Exchange Admin Center if mail flow rules were successfully added. ### Removing Banners Execute the script: ```powershell theme={null} ./xorlabOnPremRemoveBanners.ps1 ``` ## Excluding Specific Senders or Recipients To prevent banners from appearing on specific emails, use the Contextual Banners Exclusion Lists in xorlab: * **Contextual banners recipient address exclusion**: Prevents banners from appearing on emails sent to specific internal addresses. * **Contextual banners sender address exclusion**: Prevents banners from appearing on emails from specific external senders. To configure these lists: 1. Go to **Settings → Lists** in XCC. 2. Search for "banners". 3. Add the email address. ## Disabling Individual Banners You can disable one or more banners using either of the following methods: * **In Exchange:** Disable the mail flow rule associated with the unwanted banner. You can find the rule using the banner identifier listed in the banners list. * **In xorlab:** Go to General Settings > Contextual Banners and disable all banners of a specific severity (e.g., Alert, Warning, or Info). ## Banner Categories and Identifiers Each banner has a unique identifier, which starts with the prefix BANNER\_`(Category)`\_`(Name)` (e.g., BANNER\_verdict\_phishing). Use that identifier to find the associated mail flow rule in Exchange when you want to disable an individual banner. The full list of banner names, categories, severity levels and descriptions is documented in [Detection Defaults → Banner categories and identifiers](/latest/detection-defaults#banner-categories-and-identifiers). Access to that page is restricted. # Detection Overview Source: https://docs.xorlab.com/latest/detection-overview The detection features you can enable on top of xorlab's preconfigured protection, in recommended order. xorlab's preconfigured protection settings deliver strong security from the start. | Step | Description | | :- | :- | | [Configure built-in lists](#configure-built-in-lists) | **Mandatory**. Populate built-in lists for optimal protection. | | [Review Default Actions](/latest/detection-actions) | **Optional**. Review the default actions of xorlab. | | [Additional features](#activate-additional-detection-features) | **Optional**. Activate additional detection-related features to get the most out of xorlab. | ## Configure built-in lists To optimize protection, it is required to manually populate some of the built-in lists 1. Go to *Admin* and open *Lists* 2. Select **VIP names** and add the names of your C-level. These names will be used to detect VIP Fraud in incoming emails. VIP names 3. Select **High value targets** and add the email addresses of recipients that will be likely targeted by advanced attacks. Usually this is C-level as well. They will receive a more strict and thorough filtering. 4. Optional: Add mailboxes to **Exposed accounts** that should be filtered more aggressively. You can add mailboxes here that are publicly known and receive a lot of spam. 5. Optional: Add mailboxes to **Exposed public contacts** that should be filtered less aggressively to avoid false positives. ## Review default actions Review what xorlab does with an email per verdict and confidence level, and adjust it where it does not match your policy: [Review Default Actions](/latest/detection-actions). ## Activate additional detection features The following detection related features can be activated to get the most out of xorlab: Enable the Self-Service Quarantine (SSQ) for your end-users so that they can release harmless emails themselves. Enable targeted contextual banners that will be added to suspicious emails. Note: Banners are a paid feature. Extend the XCC web interface with threat intelligence from Virustotal. This enhances the analyst experience, but does not affect detection. The VirusTotal license needs to be provided by the customer. To further improve spam detection, you can integrate third party DNS blocklists. This is only recommended when using xorlab as standalone filter. We recommend to use either: * [Spamhaus Integration](/latest/detection-spamhaus-dqs) * Abusix - contact [support@xorlab.com](mailto:support@xorlab.com) ## Multi-Tenancy In a multi-tenant deployment, the steps above are done per tenant: | Step | In a multi-tenant deployment | | :- | :- | | [Configure built-in lists](#configure-built-in-lists) | Same screens as above. Open the **Admin** view and select the tenant in the dropdown on top, then populate the lists for that tenant. Repeat for each tenant. | | [Review Default Actions](/latest/detection-actions) | Same screens as above. Select the tenant in the dropdown, then review its **Actions**. To give a tenant a different detection strength altogether, reference a different [rule profile](/latest/rule-profiles) for it. | | [Additional features](#activate-additional-detection-features) | **SSQ** is enabled per tenant, see [Add a Tenant](/latest/multi-tenancy-new-tenant#optional-enable-ssq). **Banners** and **VirusTotal** are instance-wide and cannot be configured per tenant. | Detection changes you make for a single tenant are stored in that tenant's rule set. See [Manage Tenant Rules](/latest/multi-tenancy-rules) for the underlying folder structure and for setting rule parameters per tenant. # Enable Spamhaus Integration Source: https://docs.xorlab.com/latest/detection-spamhaus-dqs Integrate Spamhaus DQS through the SpamAssassin plugin by supplying a valid key. Providing a valid key will trigger an automated process to configure this plugin. ## Configuring Spamhaus DQS First, ensure the tenant’s `local.cf` file is correctly configured. Using [Expert Editor](/latest/expert-editor), in the `activeguard/core/startup_cfg/spamass/local.cf` file, make sure that: * `skip_uribl_checks` is set to `0` to enable the [`URIDNSBL` plugin](https://spamassassin.apache.org/full/3.2.x/doc/Mail_SpamAssassin_Plugin_URIDNSBL.html) * `skip_rbl_checks` is set to `0` to enable the `Realtime Blackhole List` checks * the `dns_query_restriction` list does not contain the value `spamhaus.net` but it does contain `spamhaus.org` Please also make sure that the trusted MTAs in Spamassassin are configured correctly in `local.cf`. Some keys are Hash Blocklist (HBL) enabled, some are not. Where to write the key depends on whether the key is HBL enabled and whether you want to use this feature. Therefore, configure Spamhaus either with or without HBL as described below. ### Using Spamhaus DQS with HBL 1. Using Expert Editor, create a new file at `activeguard/core/startup_cfg/spamass/spamhaus_hbl_license.txt`. 2. Populate it with your key and only your key. ### Using Spamhaus DQS without HBL 1. Using Expert Editor, create a new file at `activeguard/core/startup_cfg/spamass/spamhaus_license.txt`. 2. Populate it with your key and only your key. ## Triggering the configuration script After you have completed the steps above, click **Publish**. Then [**restart the `ag_core` container**](/latest/activate-configuration#configuration-files), because the Spamhaus files under `activeguard/core/startup_cfg/` require an MTA restart: ```shell theme={null} cd /etc/xorlab/activeguard/ docker compose down && docker compose up -d ``` and check the `stdout` log of `core` (either use Loki or the command line `docker compose logs core`) for the line containing the message `Spamassassin DQS config successfully linted`. This indicates that the configuration files have been successfully written to the Spamassassin configuration directory and are valid. The communication runs via DNS, therefore you don’t have to change your firewall config. ## Testing 1. Run the [Spamhaus Blocklist Tester (BLT)](https://blt.spamhaus.com). 2. Under `Data Query Service Test`, enter your DQS key, and for the `Test Type` select `Both`, then enter a guarded email address for your tenant to which you have access and permission to use. The tests will display as failed in the BLT itself, as they are successfully delivered to the tenant’s mailserver, but are filtered out later by xorlab Security Platform. The BLT cannot know this. 3. The mailbox will receive several emails from `test@unlisted.blt.spamhaus.net`: * If the key supplied is HBL-enabled, these should all be quarantined and tagged as `#blacklistedexternal`. * If the key is not HBL-enabled, these should all be quarantined and tagged as `#blacklistedexternal` except those with `hbl` in the subject; for example, `BLT DQS Content Test Email (19843:248226:hbl-dqs-body-cc-wallet)`. ## Disabling Spamhaus You should disable Spamhaus when its license expires to avoid any issues: 1. Remove the license file—either `spamhaus_hbl_license.txt` or `spamhaus_license.txt`—from `activeguard/core/startup_cfg/spamass/` in Expert Editor. 2. While in Expert Editor, open `activeguard/core/startup_cfg/spamass/local.cf` and set `skip_rbl_checks` and `skip_uribl_checks` to `1`. 3. Click **Publish**, then [restart the container](/latest/activate-configuration#configuration-files): ```shell theme={null} cd /etc/xorlab/activeguard/ docker compose stop core && docker compose down && sleep 2 && docker compose up -d ``` # Review Static Policies Source: https://docs.xorlab.com/latest/detection-static-policies The static policies enforced on every email regardless of relationship or context, and the Filter quarantine they trigger. Below you find the static policies that are active by default. Normally, they do not need to be changed. To disable one of the static policies below, add a corresponding line to `local.properties`: ```ini local.properties theme={null} # Syntax: _state=PASSIVE FILTER_iso_state=PASSIVE ``` | Static policy (`FILTER` rule) | Description | | :- | :- | | `FILTER_executable` | Quarantine all emails with executable files | | `FILTER_flash` | Quarantine all emails with flash files | | `FILTER_iso` | Quarantine all emails with ISO files | | `FILTER_legacy_archive` | Quarantine all emails with archive files that are considered legacy | | `FILTER_shortcut` | Quarantine all emails with shortcut files | | `FILTER_windows_script` | Quarantine all emails with windows scripts | | `FILTER_office_dde` | Quarantine all emails with Office documents containing Dynamic Data Exchange (DDE) fields | | `FILTER_office_external_frame` | Quarantine all emails with Office documents containing external frame(s) | | `FILTER_office_external_webvideo` | Quarantine all emails with Office documents containing external videos | | `FILTER_wwwdata_sender` | Quarantine all emails where the sender’s FROM address is matched by this regex: `.*www-data.*` | | `FILTER_UNTRUSTED_new_file_type_from_unknown_sender` | Quarantine all emails from unknown senders that contain new file types. A new file type means that it has not been seen yet in trusted communication | The file extensions blocked by each static policy are documented in [Detection Defaults → Static policy file extensions](/latest/detection-defaults#static-policy-file-extensions). Access to that page is restricted. **Malware rules still apply**: Even if the above static policies (filters) are disabled, xorlab will still block the majority of their associated file types because of the built-in malware rules. Malware rules depend on the relationship, for example they might block a script file from an untrusted sender, but allow it from a partner. With the static policy, you can enforce blocking it independently of the relationship. # Tune Detection Source: https://docs.xorlab.com/latest/detection-tuning Fine-tune detection to reduce false positives and false negatives. Intended for analysts. xorlab detection works out of the box, but you can adjust it to address specific issues or align it with your organization's policies. ## Step-by-step guide We recommend adding the tag `#tuned` to emails that you performed some tuning actions on. This will help you avoid looking at the same issue twice. You can also supplement every search query with `not #tuned` to exclude these cases from the results. ### 1️⃣ Authentication | Step | Query | Measures | | - | - | - | | Check if some guarded domains are not configured. | `#ext #auth` | Add missing domains to the list of [guarded domains](/latest/before-begin-integration#configure-your-guarded-domains). | | Check if emails from your organization are not authentic. | `#impersonation or (#senderstguarded #noauth)` | Check [Authentication](/latest/authentication-issues) and [Trusted MTAs](/latest/trusted-mtas) to fix these issues. | | Check that there are no emails marked as external. | `#ext` | Usually, there should be no external emails left. Clarify if these emails are expected in the organization. | ### 2️⃣ False positive tuning | Step | Query | Measures | | - | - | - | | Find all false positives. | `#quarantine` | Follow the steps below depending on the verdict. | | Review false positives with phishing or spam verdicts. | `verdict:phishing or verdict:spam` |
  • Will this sender gain trust during the learning phase? → No actions required.
  • Will this sender never gain trust because they are only inbound? → Add sender to the **Low trusted sender addresses** list (see [Trusted Senders and Infrastructure](/latest/trusted-senders-infrastructure)).
  • Is this a specific recipient that frequently needs to receive emails from new senders? → Add recipient to "Exposed public contacts" list.
  • Is there a more complex pattern? → Go to [Advanced Tuning](#4️⃣-advanced-tuning).
| | Check VIP fraud verdicts (often VIPs sending from personal addresses). | `verdict:vipfraud` | Add them to the **VIP sender email whitelist**. | | Check impersonation verdicts. | `verdict:impersonation` | Fix [missing Authentication](/latest/authentication-issues). | | Investigate malware verdicts to understand the root cause. | `verdict:malware` | Look at the [Classifiers & Rules](/latest/understand-verdict#get-an-in-depth-understanding) tab.
Common issues are network requests made in the Sandbox. If they have benign reasons like loading a logo from SharePoint, you can add them to **Dynamic DNS request whitelist**. | | Identify the responsible `FILTER` rule. | `verdict:filter` | Use [Understand Verdicts](/latest/understand-verdict#understanding-verdict-rules) and follow [Advanced Tuning](#4️⃣-advanced-tuning) to decide whether to disable the specific filter rule. | ### 3️⃣ False negative tuning Use `#inc #untrusted not verdict:reputable not verdict:popular #domainonlyinbound not #quarantine not #dmarcreport` or parts of it to find suspicious emails. * [Report false negative](/latest/reporting-misclassification) to xorlab. * Add sender or link to blacklists. * [Create a campaign](/latest/campaigns). * Follow [Advanced Tuning](#4️⃣-advanced-tuning) to evaluate if you want to enable or disable specific rules. ### 4️⃣ Advanced tuning This section explains how to tune individual detection rules for false positives and false negatives by checking impact and changing rule states when needed. #### False positive tuning 1. Read [Understanding Verdicts](/latest/understand-verdict) to learn what *verdict rules* are and how you can use the *Classifiers & Rules* tab to identify them. 2. Check if multiple false positives in your quarantine are caused by the same verdict rule. 1. To check the impact of this rule, search for `rule:rule-name #quarantine` (see [*Search*](/latest/search#queries-using-rules)). 2. Go through the results to assess the legitimacy of every email. For every true positive that you find, check if any other verdict rules (e.g., `PHISHING_...`) triggered on this email. If so, this email would still be blocked by the other rules. To only see emails that would be delivered after disabling the rule in question, exclude all other occurring verdict rules from the query like this: `rule:verdict_rule-name not rule:verdict_other-rule-name #quarantine`. 3. If you do this and only end up with false positives, you can disable this rule by adding its name appended with `_state=PASSIVE` to `local.properties`, for example `PHISHING_risk_based_one_suspicious_state=PASSIVE` 3. Check if a *passive* **ADAPT\_** rule would match the false positives in your quarantine. 1. To check the impact of this rule, search for `passiverule:ADAPT_rule-name #quarantine` (see [*Search*](/latest/search#queries-using-rules)). 2. Examine the search results to see if the other emails that matched this **ADAPT\_** rule are also false positives that should have been delivered. 3. If the *passive rule* mostly matched false positives, you can activate the rule by adding its name appended with `_state=ACTIVE` to `local.properties`, for example `ADAPT_phishing_confidence_low_based_on_link_with_from_domain_state=ACTIVE` #### False negative tuning 1. Check if your false negatives are caused by a specific **ADAPT\_** rule. 1. To check the impact of this rule, search for `rule:rule-name #deliver` (see [*Search*](/latest/search#queries-using-rules)). 2. Go through the results to assess the legitimacy of every email. For every true negative that you find, exclude any other active **ADAPT\_** rules that also trigger on the same email from the query like this: `rule:ADAPT_rule-name not rule:ADAPT_other-rule-name #deliver`. 3. If you do this and only end up with false negatives, you can disable this rule by adding its name appended with `_state=PASSIVE` to `local.properties`, for example: `ADAPT_phishing_confidence_high_state=PASSIVE` 2. Check if a *passive* verdict- or **FILTER\_** rule would match your false negatives. 1. To check the impact of this rule, search for `passiverule:VERDICT_rule-name #deliver` (see [*Search*](/latest/search#queries-using-rules)). 2. Examine the search results to see if the other emails that matched this passive rule are also false negatives that should have been quarantined. 3. If the passive rule mostly matched false negatives, you can activate the rule by adding its name appended with `_state=ACTIVE` to `/activeguard/core/rule_sets/90_local/params/local.properties`, for example `PHISHING_risk_based_one_suspicious_state=ACTIVE` # Enable VirusTotal Source: https://docs.xorlab.com/latest/detection-virustotal Enable VirusTotal threat intelligence in the email detail view. Informational only, not used for detection. To enable VirusTotal: 1. Open the file `xcc.yml` in the Expert Editor and add the following with your key: ```yaml xcc.yml {2} theme={null} virusTotal: apiKey: "add_your_key_here" ## Optional proxy configuration # http: # host: https://www.virustotal.com # Mandatory in case you provide settings for http # proxy: # host: proxy.xorlab.com # port: 8080 ## Optional credentials: # credentials: # user: "proxy-user" # password: "pwd" ## Enables the TLS/SSL support with no certificate validation # trustAll: false ``` 2. Click **Publish**, then [restart the XCC](/latest/activate-configuration#configuration-files). The `virusTotal` setting is a general `xcc.yml` setting and requires the XCC restart to take effect. ## Information about the integration xorlab sends only the SHA256 hash of an attachment to VirusTotal, not the entire attachment. URLs are submitted as-is without prior hashing. By adding your VirusTotal key you agree that this information will be sent to VirusTotal. Please visit [VirusTotal website](https://www.virustotal.com) for their Terms and Services and their Privacy Policy as by submitting data those will apply. xorlab only uses the VirusTotal API for items that are manually opened in xorlab, e.g., when opening a message in the detail view. No VirusTotal API requests are performed when an email is not viewed. The following VirusTotal API endpoints are used: * [https://developers.virustotal.com/reference#file-info](https://developers.virustotal.com/reference#file-info) * [https://developers.virustotal.com/reference#url-info](https://developers.virustotal.com/reference#url-info) * [https://developers.virustotal.com/reference#domain-info](https://developers.virustotal.com/reference#domain-info) * [https://developers.virustotal.com/reference#ip-info](https://developers.virustotal.com/reference#ip-info) # Email Bombing Recipient Addresses Source: https://docs.xorlab.com/latest/email-bombing-list Tighten filtering for a mailbox under a subscription-flood attack, where mass sign-up confirmations bury real mail. Email bombing (also known as “list linking” or “email cluster bombing”) floods a user’s inbox with thousands of legitimate subscription or notification emails within a short time. These attacks are typically short but high in volume and can hide important security alerts in the noise. The **Email bombing recipient addresses** list is accessible by selecting **Settings → Lists → Other** in XCC. | List name | Description | Accepted entries | | :- | :- | :- | | **Email bombing recipient addresses** | Recipients whose auto-generated emails receive more aggressive filtering | Email address as `String` | ## What this list does When you add a recipient address to this list: * More aggressive filtering of auto-generated emails is applied. * The volume of newsletter and notification emails is reduced. * The impact of an ongoing attack is limited. **Risk of false positives** Aggressive filtering increases the risk of false positives.\ Legitimate password resets, account notifications, or newsletters may be quarantined. ## When to use it Use this list only if: * A user is actively experiencing an email bombing attack. * The inbox is flooded with high volumes of auto-generated emails from many unknown domains. * Manual sender blocking is no longer effective. This is a **temporary containment measure**. ## Operational guidance 1. Add the affected address as soon as the attack is confirmed. 2. Monitor the mailbox for false positives. 3. Remove the address once the attack subsides. 4. Report unique incidents to [support@xorlab.com](mailto:support@xorlab.com). 5. Contact support for help with bulk isolation or unsubscribing affected users. # Email Direction Source: https://docs.xorlab.com/latest/email-direction How xorlab assigns each email a direction (incoming, outgoing, internal, or external) based on your guarded domains. Every email will be assigned one of the following four directions: * **Incoming:** The domain of the recipient is guarded, but the domain of the sender is not. * **Outgoing:** The domain of the sender is guarded, but the domain of the recipient is not. * **Internal:** The domain of the sender and recipient are both guarded. * **External:** Neither sender nor recipient domain is guarded. The direction is important because by default, only **Incoming** emails are filtered. The direction assignment is done based on sender and recipient, and not based on IP address or a dedicated listener. Mail direction A sender that can’t be authenticated is always considered as **not guarded**. **External direction** The direction **External** is in almost all cases caused by a configuration issue: Either a domain is missing from `guarded_tenants.yml`, or xorlab is accidentally receiving emails for a domain that it should not receive any. For a properly configured xorlab, there should be no **External** emails. You can check this with the search `direction:external`. **External verdict vs. External direction** In addition to the External direction, there is also a verdict External. The latter has nothing to do with the direction, and is the fallback verdict for benign emails that cannot be categorized further. # Customize Templates Source: https://docs.xorlab.com/latest/email-template-modifications Add, remove, and customize end-user notification templates, including logo, colors, fonts, and text. ## Change the logo To change the logo in the notifications: 1. Open `shared/email_templates/style/default.yml`. 2. Uncomment the configuration about logo, choose either via embedded **File** or via **URL**: PNG Logo is uploaded to xorlab. ```yaml default.yml theme={null} logo: # Path is relative to email_templates folder, not to the root directory location: "shared/logo.txt" type: "PNG_BASE_64" ``` Logo is referenced via a URL. ```yaml default.yml theme={null} logo: location: "https://your.site/logo.png" type: "LINK" ``` 3. In case of **URL**, click **Publish** and finish. The template configuration becomes active within about one minute. 4. In case of **File**, add a new folder called `shared` under `shared/email_templates`. 5. Create a new file inside `shared/email_templates/shared` and name it `logo.txt` (as configured above). 6. Enter the logo Base64 encoded into this file. For Base64 encoding, you can use e.g. [Base64.guru](https://base64.guru/converter/encode/file) or [CyberChef](https://gchq.github.io/CyberChef/). 7. Click **Publish**. The template configuration becomes active within about one minute. ## Change the colors In the same **Branding & Colors** section of the `default.yml` file, you can change the colors used in the mail notification templates to match your company’s brand identity. 1. Click the `style` folder to expand it and click the `default.yml` file. 2. The second part in the section titled **Branding & Colors** is marked as `#colors:`. 3. Using the Ctrl+Slash (Cmd+Slash on macOS) keyboard shortcut, uncomment the `colors` line and the required lines that follow. Enter new values for color properties that can be changed: * `error`, `alert`, `warning`, `ok`, `neutral`—the color of the text label for the findings (aka the “kicker”, e.g., `ALERT`, `WARN`, `GREEN LIGHT` or `UNDECIDED`) * `background`—self-explanatory: the color of the background * `light` and `dark`—reserved (unused) * `info` * `subscript` (message info: from, date, etc.) 4. Click **Publish**. The template configuration becomes active within about one minute. ## Change the font 1. Click the `style` folder to expand it and click the `default.yml` file. 2. Go to the section titled **Typography**. 3. Using the Ctrl+Slash (Cmd+Slash on macOS) keyboard shortcut, uncomment the `font` line and the required lines that follow. Enter new values for font properties that can be changed: * `size`—if you want to specify a new size * `family`—if you want to use another font family * `color`—for specifying a new font color The resulting Typography section can look like the one below: ```yaml theme={null} font: size: "12" family: "Lato, 'Helvetica Neue', Helvetica, Arial, sans-serif" color: "#0e0e0e" ``` When you are done, click **Publish**. The template configuration becomes active within about one minute. ## Change the footer information All company information appearing as an email footer is configurable in the `default.yml` file located in the `info` folder. 1. Click the `info` folder to expand it and click the `default.yml` file. 2. Using the Ctrl+Slash (Cmd+Slash on macOS) keyboard shortcut, uncomment the required lines. Enter new values for company info properties that can be changed: * `name`—your company name * `details`—additional info, e.g., the department name such as `"Security Operations Center"` * `email`—contact email address * `url`—the URL address for a Self-Service Quarantine link in notification mails, e.g., `"https://customer.activeguard.cloud"` * `provider`—the name of the service provider The resulting company information file can look like the one below: ```yaml theme={null} name: "MyCompany, Inc." details: "Security Operations Center" email: "secops@mycompany.com" url: "https://mycompany.activeguard.cloud" provider: "xorlab AG" ``` When you are done, click **Publish**. The template configuration becomes active within about one minute. ## Localization In order to support localization for a particular language (`lang`) of a given country (`COUNTRY`), follow the steps below: 1. Click the `locale` folder to expand it and click the `default.yml` file. 2. In the right pane, select and copy the whole content of the file. 3. Use the context menu for the `locale` folder to add a new file. 4. Enter the name for the file in the dialog box that appears. Use the convention of `default_lang_COUNTRY.yml`, e.g., `default_pt_BR.yml` for the Brazilian Portuguese version of a file. Click **Create**. 5. Scroll down to the file you have just created, click it, and in the right pane paste the content of the previously copied content of the `default.yml` file. For each template entry in the new localization file, replace the default text with its translation. Click **Publish**. The new localization file becomes active within about one minute. ### Change the default language The default language for notifications is defined in the `default.yml` file located in the `config` folder. 1. Click the `config` folder to expand it and click the `default.yml` file. 2. You will see only one entry: `defaultLocale`. Set it to your country code (currently, only `EN` and `DE` values are supported). 3. Click **Publish**. The new default language becomes active within about one minute. ### Using language headers If you want to use another language in notifications for a particular report email, set the `x-ag-locale` email header in the report email to the locale desired for the template (this header must be set in the “outer” email that carries the reported email as attachment). For example, if you want to set the template for Swiss German, set the value to `de-CH`. For this reported email, xorlab Security Platform will then use the `default_de_CH.yml` instead of the `default.yml` template to pick the translation. To read the language from a custom header, for example `my-custom-language-header` instead of `x-ag-locale`, you would need to edit `activeguard/core/active_guard.yml` the following way: ```yaml theme={null} emailReporting: ## Header name for specifying locale (default = x-ag-locale) localeIdentifyingMailHeaderName: my-custom-language-header ``` Afterward, click **Publish**, then restart all MTAs. The `emailReporting` setting is in `active_guard.yml` and requires an MTA restart; see [How to Activate the Configuration](/latest/activate-configuration). ## Managing Templates ### Disable a template 1. In the main `shared/email_templates` folder, click a `.yml` file for the notification template you want to disable. 2. In the right pane, go to the `category` keyword and change its value from `ANALYST_FEEDBACK` to `DEFAULT`. 3. Repeat these actions for every unwanted template and click **Publish**. The template configuration becomes active within about one minute. ### Create a new template To create a new email notification titled `NOTIFICATION_NAME` for the `default` tenant: 1. Use the context menu for the `email_templates` folder to create a new file inside of it. 2. Enter `NOTIFICATION_NAME.yml` as the name for the file in the dialog box that appears. Click **Create**. 3. Scroll down to the file you just created, click it, and in the right pane paste the following content: ```yaml theme={null} # Note: The `id` must be the same template identifier as the file name. id: NOTIFICATION_NAME # The type of notification for the template (default: DEFAULT) # Supports: DEFAULT, ALERT, ERROR, WARN, CLEAR, ACK type: DEFAULT # The notification category for the template. Use ANALYST_FEEDBACK for feedback to reported emails. # Supports: DEFAULT, ANALYST_FEEDBACK, QUARANTINE_NOTIFICATION category: ANALYST_FEEDBACK # The following block is only supported for category ANALYST_FEEDBACK analystFeedbackConfig: displayText: "Template display text" # Choose any of the predefined verdicts verdict: "phishing" defaultSelection: true ``` 4. Enter values that match the template usage—please refer to the [Template configuration](#template-configuration) section. 5. Go to the `locale` folder and, in each localization file of the `default` tenant, add a new entry for the new `NOTIFICATION_NAME` template using the YAML structure given below. For example, to localize the email notification into US English, add the following lines to `default.yml`: ```yaml theme={null} ################################################################################ ## NOTIFICATION NAME ## ################################################################################ NOTIFICATION_NAME: subject: "This is a subject example for a new template" preview: "This is a preview example for a new template" disclaimer: "This is a disclaimer example for a new template" kicker: "This is a kicker example for a new template" title: "This is a title example for a new template" summary: "This is a summary example for a new template" details: title: "This is a detailed info title example for a new template" paragraphs: - "This is the first paragraph example for a new template" - "This is the second paragraph example for a new template" providerNotice: "This is a provider notice example for a new template" ``` 6. Click **Publish**. The new template becomes active within about one minute. The table below explains the purpose of each key: | Key | Content | | :- | :- | | `subject` | The subject of the email notification | | `preview` | The notification email text content to be used as a preview text displayed in some email clients | | `disclaimer` | “*You are receiving this email as a response…*” | | `kicker` | The notification email text label to describe the response type, e.g., `ALERT` | | `title` | The notification email title | | `summary` | The notification email brief summary of the findings | | `details:title` | The notification email title for the paragraphs providing further details of the findings | | `details:paragraphs` | The notification email paragraphs providing further analysis details of the findings | | `provider_notice` | “*This service is operated by…*” | **Untranslated sections** Any template sections that are not translated will be rendered as empty in the final email notification. ### Template configuration The table below lists template parameters and their allowed values: | Parameter | Values | Description | | - | - | - | | `type` | `DEFAULT` (green)
`ALERT` (red)
`ERROR` (red)
`WARN` (yellow)
`CLEAR` (green)
`ACK` (gray) | Used for color-coding the kicker (see the table above). You can [change the default colors](#change-the-colors) | | `category` | `DEFAULT`: template is not used. The main usage of this value is to deactivate a built-in template
`ANALYST_FEEDBACK`: template can be sent to the reporter of a reported email (as a part of resolving a case)
`QUARANTINE_NOTIFICATION`: used for an SSQ quarantine notification
`LEGACY_QUARANTINE_NOTIFICATION`: used for the legacy quarantine notifications via the `notifyUser` rule [context variable](/latest/context-vars) | Category of the template | | `displayText` | "string" | Text to be displayed to the notification recipient | | `verdict` | Name of a [verdict](/latest/verdicts) | Verdict that will be used for this template | | `defaultSelection` | `true` or `false` | Determines if this template should be shown in the resolve dialog if there are multiple per verdict | ### Using variables in templates It is possible to use some variables in notification templates so that notifications contain more details about the email messages they refer to. The table below lists all available variables. In order to use them, type `$email.`, e.g., `$email.subject` or `$email.senderAddress`, where you want the desired value to appear in the notification email. | Variable | Description | | - | - | | `ggrid` | GGRID of the email | | `sender` | Displayed sender’s name | | `sentFrom` | Sender’s non-clickable address | | `subject` | Email subject | | `verdict` | Verdict given by xorlab after email analysis | | `contextFields` | Indicators given by xorlab after email analysis | | `comment` | Comment added by the case resolver (for feedback on reported emails only) | | `mailbox` | Recipient’s mailbox | | `tenant` | Recipient’s tenant (for feedback on reported emails only) | | `locale` | Locale set for the notification email | | `receivedTimeFormatted` | Time when the reported message was received | **contextFields** The `contextFields` variable is an exception in the usage. Since it’s a map, you have to use the following pattern: `$email.contextFields.get("")`, e.g., `$email.contextFields.get("dce.indicator.shortened")`. ## Multi-Tenancy Everything on this page edits the `default` files, which apply to all tenants. To give a single tenant its own logo, colors, texts or footer, assign it an `emailTemplateStyle` in `guarded_tenants.yml` and create the matching files next to the `default` ones, instead of editing `default` itself. The customization steps are the same as above. Step-by-step guide for per-tenant text, style, logo and footer. # Notifications Overview Source: https://docs.xorlab.com/latest/email-template-overview When xorlab sends end-user notifications: report feedback, quarantine digests, and custom notifications. xorlab can send email notifications to your end-users in the following situations: * The user reports an email and will then get a feedback email from xorlab * Quarantine notifications - for example daily digests * When configured via custom rules This page provides an overview over the existing templates that are used for the above purposes. To change or extend the built-in templates, have a look at [Template Customizations](/latest/email-template-modifications). ## Available Templates The table below lists the built-in notification templates. | Email notification | Description | | - | - | | `BEC` | For reports of business email compromise attacks | | `BENIGN` | For reports of emails that do not contain anything suspicious | | `CLOUD_STORAGE` | For reports of emails that contain a link to a cloud storage service | | `EXTORTION` | For reports of extortion emails | | `IMPERSONATION` | For reports of impersonation attacks | | `POLICY_VIOLATION` | For reports of emails that violate company policies | | `MALICIOUS` | For reports of emails that are suspicious | | `MALWARE` | For reports of emails with an attachment that contains malware | | `MARKETING` | For reports of emails of marketing newsletters | | `PHISHING` | For reports of phishing emails | | `REPORT_NOTIFICATION_ACKNOWLEDGEMENT` | To notify the user that xorlab received their report | | `REPORT_NOTIFICATION_ERROR` | To notify the user that their report is missing a message to analyze | | `SIMULATION` | For reports that are part of awareness campaigns | | `SPAM` | For reports of spam emails | | `USER_QUARANTINE_DIGEST` | To notify the user that xorlab quarantined multiple emails and put them into the SSQ | | `USER_QUARANTINE_NOTIFICATION` | To notify the user that xorlab quarantined an email and put it into the SSQ | | `VIP_FRAUD` | For reports of email attacks that impersonate people of your organization | | `QUARANTINE_NOTIFICATION_IN` | Used for verdict-based quarantine notifications. Deprecated feature. | ## Example Emails While all templates share the same structure, they differ in text and color depending on the type of notification. Below are a few examples: ### BENIGN Benign email ### PHISHING Phishing email ### REPORT\_NOTIFICATION\_ACKNOWLEDGEMENT Report Notification Acknowledgement ### USER\_QUARANTINE\_DIGEST SSQ Daily Digest ## Directory structure Email notification templates are stored in the `shared/email_templates` directory, accessible via the [Expert Editor](/latest/expert-editor). ## Folder Structure ```text theme={null} shared/email_templates ├── BEC.yml # Template configuration files. ├── [... other templates ...] ├── config │ └── default.yml # Default language settings | ├── info │ └── default.yml # Company information for footers | ├── locale | └── default_it.yml # Italian localization file. | └── default_fr.yml # French localization file. │ └── default_de.yml # German localization file. | └── default_en.yml # English localization file. | ├── style │ └── default.yml # Branding and styling | ├── [... other templates ...] └── VIP_FRAUD.yml ``` ## Folder Descriptions * `config` – Defines the default language for notifications. * `locale` – Contains localized strings for different languages. * `style` – Controls visual elements such as colors, fonts, and logos. * `info` – Stores organization details like name, contact email, and links, used in the footers. * Template files – Each template (e.g., `BEC.yml`, `PHISHING.yml`) contains its configuration. ## Multi-Tenancy Support If your organization uses multiple tenants, you can customize templates per tenant. Tenant-specific customizations are controlled by the `emailTemplateStyle` attribute. By default, templates apply as `default` to all tenants, but you can introduce unique identifiers to manage styles, localization, and branding for other tenants. For more information, have a look at [Customize Tenant Notifications](/latest/multi-tenancy-email-templates). # Trigger Test Notifications Source: https://docs.xorlab.com/latest/email-template-preview-notification Send a test notification to a mailbox to verify auto-login, template layout, and localization. The notification contains a dummy message and, depending on the selected template, may include an AutoLogin link. ## Prerequisites * You need an active, signed-in xorlab administrator session in the same browser. This endpoint is not publicly accessible and cannot be called anonymously. * To include an AutoLogin link in the test notification, [Auto-Login](/latest/authentication-auto-login-link) must be enabled for the tenant. **Use with care** The test notification is delivered to whichever mailbox you specify in the `mailbox` parameter, and depending on the selected template and tenant configuration it may contain a valid AutoLogin link for that mailbox. Only trigger it for mailboxes you are entitled to access. ## Endpoint URL ``` https:///api/v2/emailNotification/v1/sendQuarantineNotification ``` ## Supported Request Parameters * **mailbox** (string, required): The recipient mailbox. * **template** (string, optional): Defaults to `USER_QUARANTINE_NOTIFICATION`. Other possible values include: * `VIP_FRAUD` * `SPAM` * `POLICY_VIOLATION` * **locale** (string, optional): The language of the notification. Defaults to the system's default language. ## Example Requests ### Basic request Sends a notification using the default template and system language: ``` https:///api/v2/emailNotification/v1/sendQuarantineNotification?mailbox=info@example.com ``` ### Request with all parameters Sends a localized notification using a specific template: ``` https:///api/v2/emailNotification/v1/sendQuarantineNotification?mailbox=info@example.com&locale=de&template=POLICY_VIOLATION ``` # Change Sender Address Source: https://docs.xorlab.com/latest/email-template-sender-addresses Set a per-tenant sender address for feedback emails, quarantine notifications and digests, and rule-triggered notification messages. In the following code blocks, `` can be a full email address, or just a mailbox such as `notification` or `notification@` — in that case, it is completed using the tenant's primary [guarded domain](/latest/terminology#guarded-domains), the first entry under `domains` for that tenant in `guarded_tenants.yml`. If you leave the setting out entirely, the default shown in each section below applies. ## Feedback emails Feedback emails are sent after a user reports a suspicious email. They can be manually triggered by an analyst through resolving a case as well as automatically generated through a campaign or an auto-close rule. By default, these emails are sent from `notification@`, with `` referring to the tenant's primary domain. If you like to customize the sender address, add the following block (if it does not already exist) to the corresponding tenant or config set in `shared/guarded_tenants.yml`: ```yaml guarded_tenants.yml theme={null} emailReporting: notificationAddress: ``` Afterward, click **Publish**. The new configuration becomes active within about one minute. ### SMTP auth for feedback emails If you want the feedback emails to be sent to an SMTP server requiring authentication, please follow the steps outlined in [SMTP auth for specific email addresses](/latest/smtp-configuration#smtp-auth-for-specific-email-addresses). ## Quarantine notifications Quarantine notifications are sent to the end-user when an email addressed to them has been put in quarantine, and this is also the sender address used for quarantine digests. By default, these emails are sent from `quarantine@`, with `` referring to the tenant's primary domain. If you like to customize the sender address, add the following block (if it does not already exist) to the corresponding tenant or config set in `shared/guarded_tenants.yml`: ```yaml guarded_tenants.yml theme={null} quarantine: notifications: notificationAddress: ``` Afterward, click **Publish**. The new configuration becomes active within about one minute. ## Custom bounce and notification messages The xorlab Security Platform rule language allows configuring custom bounce or notification messages that are triggered for certain events (for example, when using the rule context keys `SenderNotification.Template` or `ReceiverNotification.Template`). These emails share the sender address configured for [feedback emails](#feedback-emails): by default `notification@`, and customizable through the same `emailReporting.notificationAddress` property in `shared/guarded_tenants.yml`. # Evaluate xorlab Source: https://docs.xorlab.com/latest/evaluate-xorlab For teams who have not decided yet: how a trial is set up, how long each phase takes, and what you can measure the results against before anything is blocked. You can find out what xorlab catches without committing to it. The platform runs alongside the filtering you already have, analyzes your real email traffic, and reports what it would have done — no MX record change, no software on your servers, and no email blocked until you decide it should be. The setup is short. Most of the trial is you reading results. ## How a trial runs

Day 0

Decide where xorlab runs

Two deployment options, you get the same results for both: * **xorlab SaaS** — hosted and operated by xorlab. Nothing to provision, so it is the quickest way into a trial. * **On-premises** — you run the xorlab Control Center (XCC) and one or more xorlab MTAs on your own virtual infrastructure.

Day 0

Ask for an instance

Write to [sales@xorlab.com](mailto:sales@xorlab.com). Your own trial instance can be ready as early as the next working day.

Day 1

Connect your email flow

You choose how far into the mail flow xorlab goes. Both options are reversible in minutes, and neither touches your MX records: * **Monitoring Mode** — xorlab receives a copy of every email as an additional BCC recipient and drops it after the analysis. * **Inline Mode** — xorlab sits in the mail flow but delivers every email anyway, including the ones it would have quarantined. On Microsoft 365, run [Retrospective Email Scanning](/latest/m365-retrospective-email-scanning) before you connect the mail flow: xorlab imports the past months of email from the mailboxes and analyzes them, so the trial starts with history behind it.

Some days

Finish the learning phase

The [Relationship](/latest/concepts-relationship) model and [Local Reputation](/latest/concepts-local-reputation) have to observe your traffic before detection can rely on them. Live traffic alone gets them there in a matter of days, on any deployment. If you imported past M365 email in the previous step, they are ready from the moment the mail flow is connected.

Once it has learned

See what is getting through

xorlab assigns a [verdict](/latest/verdicts) and a confidence to every email, and assigns categories to the malicious ones: Phishing, Malware, BEC, VIP Fraud, Impersonation, Extortion, Spam, etc. are separate verdicts you can filter and count. Because nothing is blocked yet, each one is a message that reached the mailbox regardless of what you run today. For any of them, xorlab shows the indicators and reasoning behind the decision — see [Understanding an Email Verdict](/latest/understand-verdict).

Two weeks

Compare it with what you run today

We recommend two weeks of side-by-side traffic: long enough to cover the weekly rhythm of your mail, short enough that the trial does not stall. Compare it either way: * **In xorlab** — search the traffic, save what you are tracking as a saved search, and export it to work through outside the platform. * **In your SIEM** — stream the verdicts and the analysis results extracted over Syslog, then put them next to what your existing controls reported. Write to [support@xorlab.com](mailto:support@xorlab.com) and we will go through the evaluation with you.

Along the way

Tune it to your own risk appetite

You can shift the balance between catching more and flagging less, and correct individual decisions as they come up — see [Fix a False Positive](/latest/fix-false-positives) and [Fix a False Negative](/latest/fix-false-negatives).

Go live

Switch protection on

When the results convince you, protection is a configuration change rather than a new project. If you ran in Inline Mode, enabling a switch is all it takes, and quarantining is active about a minute later. From Monitoring Mode, you switch to Inline Mode first. Nothing else about the integration changes.
## Two ways to connect your mail flow Both let you evaluate on live traffic without blocking anything. The difference is how much of the final setup you have already built by the end of the trial. | | Monitoring Mode | Inline Mode | | :- | :- | :- | | Where xorlab sits | Out of band. It receives a BCC copy and drops it after the analysis | In the mail flow. Every email passes through and is forwarded on | | Your mail flow | Untouched | Carries one more hop | | MX records | Unchanged | Unchanged, unless xorlab replaces your gateway on premises | | What users notice | Nothing at all | Nothing at all | | Import of past M365 email | Available | Available | | Going live afterward | Requires switching to Inline Mode | Just activate a parameter | | Pick it when | Any change to the mail flow needs its own approval | You want the trial to end in one configuration change | ## What the trial does not touch * **Your MX records.** On M365, email keeps arriving at Microsoft, which hands it to xorlab and takes it back for delivery. * **Your current filtering.** Your existing filters keep running. xorlab is layered on top, which is what makes the comparison possible. * **Your servers, clients and mailboxes.** Nothing is installed and nothing is migrated. Reporting uses the button your users already have. * **Your outbound sending identity.** On M365, outgoing email still leaves through Microsoft, so SPF and DKIM stay as they are. Same for on-premises. Ready to see it on your own traffic? Write to [sales@xorlab.com](mailto:sales@xorlab.com). # Feature Overview Source: https://docs.xorlab.com/latest/feature-overview A map of what the platform does, from detection layers through analyst tooling to end-user self-service. xorlab is designed as a unified workflow, where multiple detection layers — relationship modeling, local reputation, sandboxing, campaigns, Abuse Mailbox automation, SSQ, and contextual banners — reinforce each other to provide strong, context-driven protection. While the platform works best when all components are combined, each feature can be activated individually, giving you full flexibility to match your security needs, infrastructure, and rollout strategy. *** ## Feature overview Protects your organization with a contextual detection engine that catches advanced e-mail-based threats with a very low false positive rate. Campaigns let analysts turn any search query into a precise detection rule that overrides default behavior for exactly the emails they choose. Shows the reasoning behind every verdict in a single detail view, from the sender relationship down to the individual rules. Analyzes suspicious files in a secure, isolated environment to detect hidden or unknown malware. Lets users safely manage their quarantined emails — including encrypted attachments and request-release workflows. Allows analysts to remove harmful emails directly from a user’s mailbox via the Microsoft Graph API. Enables automated analysis and triaging of user-reported emails and can provide instant feedback. Displays intelligent, context-driven email warnings that reduce user mistakes without creating alert fatigue. Connects to the rest of your stack over standard protocols — SMTP, Syslog, REST, SAML, and Microsoft Graph. *** ## Inbound Email Security xorlab stops the full range of email attacks, with a strong focus on sophisticated targeted attacks and zero-day exploitation. Inbound Email Security is the core of xorlab’s platform. It protects your organization from phishing, spoofing, and malware by understanding how your organization normally communicates and using that context to detect anomalies. Instead of relying on static indicators or threat feeds, xorlab builds a dynamic model of trusted communication (Relationship), learns what content is common in your environment (Local Reputation), and verifies every sender using authentication standards such as SPF, DKIM, and DMARC. With this information xorlab is able to reliably detect: * Executive and employee impersonation * Credential phishing and brand spoofing * Ransomware, sabotage, and industrial espionage * Email Account Compromise Learn more about how the xorlab detection works: [Concepts Overview](/latest/concepts-overview) How to: [Integrate xorlab into your mail flow](/latest/setup-integration-overview) inbound-security ## Campaigns Campaigns allow analysts to transform any search query into a targeted policy that adapts xorlab’s detection to specific business needs. Because campaigns are built directly from the search engine, anything you can search for — sender patterns, domains, tags, file behavior, topics, authentication signals, and more — can be enforced as a rule. This makes campaigns a precise tool for handling edge cases, reducing false positives, blocking recurring threats, and automating responses without affecting global detection logic. Campaigns evaluate emails in real time and override default behavior only when the defined conditions match. Each campaign specifies exactly what should happen: quarantine, deliver, rewrite, or classify a reported message. They bring structure, auditability, and repeatability to analyst decisions, especially when dealing with greymail, unauthenticated system alerts, third-party workflows, or post-incident cleanups. How to: [Using Campaigns](/latest/campaigns) ## Full Transparency Every email xorlab processes gets a verdict and a confidence, and the detail view shows what produced them. Analysts do not have to trust a score: the sender relationship, the authentication results, the indicators that were found, and the analysis of every attachment and link are on one screen, and from there each individual rule that contributed to the decision can be read. That transparency is what makes the decision defensible outside the SOC. It lets you tell an employee why their report was closed, a user why their email was held back, and an auditor why the platform did what it did — and it is the same view from which an analyst isolates a case or builds a campaign. Learn more: [Understanding an Email Verdict](/latest/understand-verdict) How to: [Fix a False Positive](/latest/fix-false-positives) Detail View ## Sandbox The Sandbox detects malicious behavior in email attachments that can’t be reliably identified through static analysis alone. It complements xorlab’s static analysis by executing suspicious files in a secure, isolated environment and observing how they behave. This helps uncover hidden malware, zero-days, and evasive techniques that would otherwise go unnoticed. Sandbox ## Self-Service Quarantine (SSQ) Self-Service Quarantine gives end-users a safe and controlled way to see, review, and release their own quarantined emails without relying on the security team. It reduces unnecessary IT tickets, speeds up legitimate mail delivery, and provides transparency so users understand why messages were held. SSQ integrates tightly with xorlab’s detection logic, ensuring that risky messages stay blocked while low-risk cases can be handled by users directly. Analysts remain in full control through configurable permissions and optional “Request Release” workflows for sensitive quarantines. SSQ also supports encrypted attachments, shared mailboxes, customizable notifications, and seamless access via auto-login or SSO. Learn more: [SSQ Overview](/latest/ssq-overview) How to: [Handle Release Requests](/latest/handling-release-requests) ssq ## Abuse Mailbox The Abuse Mailbox helps security teams handle user-reported emails quickly and consistently by combining automated triage with analyst review. Reported messages are grouped into clear cases, enriched with xorlab’s analysis, and prioritized so analysts can focus on the few that truly require attention. Reports can be resolved automatically using verdict-based rules or campaigns, which apply precise logic to classify and respond to common patterns. Automated feedback keeps employees informed and reduces repetitive work for the SOC. When manual review is needed, analysts get all relevant context — authentication, relationship signals, file analysis, link reputation, and more — in a single view. The result is faster investigations, consistent decisions, and a scalable way to handle large volumes of reports. How to: [Handle the Abuse Mailbox](/latest/abuse-mailbox) Integrate [Abuse Mailbox with M365](/latest/m365-reporting-integration) Integrate [Abuse Mailbox On-Premises](/latest/on-prem-reporting-integration) Abuse Mailbox ## Case Isolation Case Isolation allows analysts to remotely remove harmful emails from a user’s mailbox through the Microsoft Graph API. Once enabled, an “Isolate” button appears in every message detail view, making it easy to take immediate action whenever a threat is confirmed. Isolation is performed directly against the user’s mailbox How to: [Activate Case Isolation](/latest/m365-case-isolation) ## Contextual Banners Contextual Banners add targeted security insights directly inside the email body, giving users clear and actionable warnings without overwhelming them. Instead of generic “be careful” labels, banners highlight specific risks detected by xorlab — such as low sender trust, suspicious attachments, or potential impersonation. They appear only when relevant, reducing alert fatigue while increasing user awareness. Each banner is tied to a precise detection rule and surfaced through mail flow rules in Exchange. Analysts stay in full control by enabling, disabling, or excluding banners per sender, recipient, or severity level. Banners integrate seamlessly with xorlab’s trust, reputation, and content analysis engines to surface context users normally don’t see. How to: [Enable Contextual Banners](/latest/detection-contextual-banners) Abuse Mailbox ## Open Integrations xorlab is not a closed appliance. Every part of the platform is reachable through interfaces your existing tools already speak, which means it fits into the stack you have rather than requiring one built around it. * **Mail flow over SMTP**, in front of, behind, or alongside Microsoft 365, Exchange, or any standards-compliant gateway — inline or purely observing. * **The full event stream over Syslog** in JSON or CEF: verdicts, SMTP transactions, extracted threat intelligence, and a complete analyst and admin audit trail. Any SIEM can ingest it without a vendor-built connector. * **A REST API** so SOAR playbooks and scripts can manage blocklists, whitelists, and VIP lists without a human in the web interface. * **SAML 2.0 and LDAP** for single sign-on, with role and tenant mapping from your identity provider. * **Microsoft Graph** for case isolation, retrospective scanning, and quarantine handling, through a single app registration in your own tenant. * **Threat intelligence in both directions** — VirusTotal and Spamhaus DQS enrich analysis, while indicators observed in your own mail are exported for use elsewhere. Learn more: [What xorlab Connects To](/latest/integrations-overview) # File Analysis Source: https://docs.xorlab.com/latest/file-analysis Upload files to xorlab for static analysis and Sandbox analysis using the same engine that scans email attachments. The file analysis that is also used to analyze email attachments supports many static and dynamic analysis techniques. From the cracking of encrypted file formats to the detection of different static file properties, xorlab performs a thorough analysis of the files provided. Archives and file formats that support embedded objects are extracted and iteratively analyzed. Sandbox analysis for PDF, Word, and Excel file formats is performed and the runtime behavior is assessed. One of the unique features of the Sandbox in xorlab is the detection of exploits without giving the attacker the opportunity to execute an evasive native code payload. To use the file analysis, just click the **File Upload** item in the left pane of the main XCC page, and click the **Upload Files** frame to select a file to be uploaded. You can also drag and drop the file to this area: File Upload tool After uploading the file (multiple uploads are possible), the file will appear in the lower part of the screen in the “pending” state until the entire scan is completed. Then, the file will receive a VERDICT and a RISK score. Furthermore, the analyzed files are also tagged with informative and classification tags (you will find the full list of tags at the end of this article). When you click the file in the file list, its detailed view appears: Analyzed file details The most important information—verdict and risk—is displayed at the top. The goal of the detail view is to show all the relevant information in a condensed manner but to allow the analyst to further dig down to the relevant details. The `archive.zip` file contains the artifacts of the scan (logs, pcap file, screenshots, etc.). By clicking the row of the file, the view will expand and show all the details related to the file (including video and screenshots and all the system events of the Sandbox scan): Nested file details ## File analysis verdicts Besides the risk score, the VERDICT of file analysis indicates what xorlab Security Platform has found and how the file is classified: | VERDICT | Description | | :- | :- | | `MALWARE (D)` | Malware found based on dynamic runtime behavior | | `MALWARE (S)` | Malware found based on static analysis (e.g., YARA rule) | | `EXECUTABLE` | Executable file format found | | `SCRIPT` | Script file format found | | `SHORTCUT` | Shortcut file format found | | `VBA SCRIPT` (in red) | Dangerous VBA script found (starts a new process, initiates network connection, or performs other potentially malicious operation) | | `VBA SCRIPT` (in orange) | VBA script found | | `EXT. OBJECT` | Office format referencing remote object (e.g., remote video) | | `DDE` | Office format using DDE | | `EMB. OBJECT` | Office format with an embedded object | | `ACTIVEX` | ActiveX object found | | `FLASH` | Flash object or file format found | | `ENCRYPTED` | Encrypted file format found | | `ARCHIVE` | Archive file format (e.g., `.zip`, .`7z`, etc.) | | `LEGACY ARCHIVE` | Legacy archive file format (e.g., `.rar`) | | `DOCUMENT` | Document file format found | | `FILE` | No specific classification | # Fix a False Negative Source: https://docs.xorlab.com/latest/fix-false-negatives React to a missed threat so that xorlab quarantines similar emails in future. If you are looking for a more general approach to tune the overall detection, have a look at [Tune Detection](/latest/detection-tuning). Below we list the most common measures for a false negative and when they should be applied. **Report Misclassification** We recommend to report all false negatives to xorlab via [Reporting a Misclassification](/latest/reporting-misclassification). This helps improving the detection in a sustainable way. ## Add sender to blacklist If you expect more false negatives from the same sender, add its address to the sender blacklist. **Requirements**: 1. The sender does not send legitimate or wanted emails. **Action**: 1. Open the email in the detail view. 2. Press B, or click on the three dots in the upper right and choose **Blacklist**. 3. Select **Sender address blacklist** and save. For the accepted entry formats and how subdomain matching behaves, see [Blacklists](/latest/blacklists). ## Add link to blacklist If you expect more false negatives with the same phishing link, add the link to the link domain blacklist. **Requirements**: 1. The link domain is not used in legitimate emails. **Action**: 1. Open the email in the detail view. 2. Click on the **LINKS** tab. 3. Select the corresponding links and click on **Blacklist**. This adds them to the **Link domain blacklist**, see [Blacklists](/latest/blacklists). ## Create a campaign Create a campaign when the false negatives cannot be tied to a specific sender, or if a sender might send both legitimate and unwanted emails. The full guide about campaigns can be found here: [Campaigns](/latest/campaigns). **Requirements**: 1. None. Campaigns can always be used, but they require a bit more effort for creation and life-cycling. **Action**: 1. Create a search query that matches all the required false negatives. This can differ a lot from case to case. Some examples: 1. Use the built-in **content similarity**. This is the go-to method for all false negatives that vary in sender, display name, subject, etc. For this, open the email in the detail view and click on **SIMILAR**. 2. Often the display name or parts of the subject stays the same through a wave of similar emails. This can be used in a search query like this: `from.displayname:Abc AND subject:"*Password Reset*"`. 3. Sometimes the attackers re-use some URL patterns in the same wave. This can be leveraged with a query like this: `link:"*/special/url-path/*"`. 2. Create a campaign based on the search and set the action to **Quarantine**. If you use the SSQ, choose the quarantine name such that the end-users can or cannot release the email. # Fix a False Positive Source: https://docs.xorlab.com/latest/fix-false-positives React to a wrongly quarantined email so that xorlab stops quarantining that kind of message. If you are looking for a more general approach to tune the overall detection, have a look at [Tune Detection](/latest/detection-tuning). Most false positives can be resolved by following the primary measures below in order. However, in certain special cases (described in the second part), you may need to use a special approach. **Report Misclassification** We recommend to report all false positives to xorlab via [Reporting a Misclassification](/latest/reporting-misclassification), where possible. This helps improving the detection in a sustainable way. ## Primary measures ### 1️⃣Let the system handle it xorlab learns whenever an email is released from the quarantine. It will reduce the chance that the next email from the same sender will be quarantined again. **Auto-learning** For a specific sender: The more emails are released, the less aggressive the detection is for that sender. However, it will never fully disable all checks. Therefore the first step is to just release the email from the quarantine, and this might fix the false positive. **Requirements**: 1. The sender needs to have authentication (`#auth`). 2. The false positives must come from the same sender address. **Action**: 1. Release the email from quarantine. ### 2️⃣Add sender to the low trusted sender list This is the go-to action for most situations that do not resolve on its own. It will reduce the phishing and spam detection for that sender to a minimum, but keeps malware and BEC rules still active. For the full list of trust levels and what each one changes, see [Trusted Senders and Infrastructure](/latest/trusted-senders-infrastructure). **Requirements**: 1. The sender needs to have authentication (`#auth`). 2. You do not expect to receive malicious emails from there. 3. It is not a BEC or malware false positive. (1) 4. Some of the more aggressive malware rules will also be deactivated by the *Low trusted sender* list. Therefore in some cases the list also works for malware verdicts. **Action**: 1. Open the email in the detail view. 2. Press W, or click on the three dots in the upper right and choose **Whitelist**. 3. Select **Low trusted sender addresses** and save. ### 3️⃣ Create a campaign Campaign are used when the requirements for the *Low trusted sender* list are not fulfilled. It allows you to let through very specific emails by creating a search that matches only the desired emails. The full guide about campaigns can be found here: [Campaigns](/latest/campaigns). **Campaigns overwrite built-in detection** A campaign overwrites all built-in detections, therefore be careful with campaigns that set the action to **Deliver**. They should be as narrow as possible to only match the desired emails. **Requirements**: 1. None. Campaigns can always be used, but they require a bit more effort for creation and life-cycling. **Action**: 1. Find aspects of the email that are present in all of the false positives. Examples are: subject keywords, display name, sender address, etc. 2. Create a search query that is as specific as possible and only matches the false positives. Examples: `from:sender@example.com AND subject:*Notification*`. 3. Create a campaign for that search query and set the action to **Deliver**. 1. Tip: You can still exclude certain verdicts from the Deliver campaign, for example to exclude malware: `from:sender@example.com AND subject:*Notification* AND NOT #malware`. ## Special cases ### Malware false positives with #networkactivity If an attachment makes suspicious DNS requests in the Sandbox, the email might be quarantined even though it is legitimate. In such cases, you can allow specific domains for DNS requests. **Requirements**: 1. The malware false positive needs to have the tag `#networkactivity`. **Action**: 1. For the affected email, open the **Attachments** tab and click on the attachment with the red Sandbox symbol. 2. In the new dialog, copy the domain marked as `SUSPICIOUS` in the **Network** tab. 3. Go to **Settings → Lists → Whitelists** and add the domain to the **Dynamic DNS request whitelist**, see [Whitelists](/latest/whitelists). # Fraud Keywords Source: https://docs.xorlab.com/latest/fraud-keywords Customize the keyword list that marks user-reported incidents as potential fraud. Mark user incidents as fraud if they contain certain keywords. These keywords can be customized in **Settings → Lists → Reported**. | List name | Description | Accepted entries | | :- | :- | :- | | **Potential fraud keywords** | User-reported emails are marked as `Fraud` if they contain any of the keywords in this list | Keyword as `String`, e.g., `monorail` | # Handling Release Requests Source: https://docs.xorlab.com/latest/handling-release-requests Review end-user requests to release quarantined emails, and decide whether to release or deny them. If enabled, end-users can request the release of quarantined emails via the SSQ portal. This functionality can be enabled separately for each verdict, and works only for emails the user cannot release themselves. ## End-user view For emails in an eligible quarantine, the end-user sees a Request Release button in the upper-right corner. * After clicking the button, the email status changes to: `RELEASE REQUESTED` * Once an analyst reviews the request, the status updates to: * `RELEASE APPROVED` – if the analyst releases the email * `RELEASE DENIED` – if the analyst denies the request (the email stays in quarantine) Request Release ## Analyst workflow The summarized workflow for an analyst looks like this: 1. You get notified about the newly requested release. There are a few different options: * Via email, triggered by each release request. This can be enabled by an admin user as described in [Enable request notifications](/latest/ssq-request-release#enable-request-notifications). * By manually searching for `status:releaserequested`. * By creating and using a saved search for `status:releaserequested`. 2. You analyze the email to see if it is not harmful. The page [Understand an Email Verdict](/latest/understand-verdict) provides more details to understand why a certain verdict was set. 3. If it is benign, you release the email via the **Release** button. Request Release 4. If it is malicious, you deny the request via the **Deny Release** button. Below you can find all status related to the release request feature, such that you can use them in the search: | Status | Description | | - | - | | `RELEASE REQUESTED` | An end-user requested the release for this email, but no action has been taken yet. | | `RELEASE APPROVED` | An analyst approved the request. The email has been released. | | `RELEASE DENIED` | An analyst denied the request. The email is still quarantined. | **Saved Search** Create a saved search for the status `RELEASE REQUESTED` to quickly access all pending requests. # Switch Between Inline and Monitoring Mode Source: https://docs.xorlab.com/latest/inline-and-monitoring-mode Switch between monitoring mode, which observes a copy out of band, and inline mode, which acts on the email your recipients receive. xorlab can run in either of the following modes: * **Monitoring**: xorlab is located out-of-band of the mail flow and is only used to monitor the traffic (it cannot intervene in your mail flow). Usually, it receives the email traffic as an additional BCC recipient and the copies are dropped after processing. This mode allows email traffic monitoring with low impact on the infrastructure. Detection and the configured actions still run in full, so emails do get the `QUARANTINED` decision — see [Decisions and quarantine in Monitoring mode](#decisions-and-quarantine-in-monitoring-mode). * **Inline**: xorlab is inline in the mail flow and actively filters emails. This mode is configured whenever xorlab is used for inbound email security. Emails are forwarded after they have been processed. ## Monitoring mode The following changes are necessary to run xorlab in Monitoring mode: 1. Open [Expert Editor](/latest/expert-editor) and navigate to the `activeguard/core/active_guard.yml` file. 2. Under the relevant SMTP handler, set `senderRecipientExtraction.recipientExtraction: MAIL_HEADER` and `senderRecipientExtraction.senderExtraction: HEADER`: For M365 integrations, the value for `senderRecipientExtraction.senderExtraction` should be `MAIL_ENVELOPE`. ```yaml active_guard.yml theme={null} scanSources: smtp: port: 10025 handler: smtpReport: {} # The following line activates Monitoring mode. # All emails will be dropped after processing. smtpOffline: senderRecipientExtraction: # Get the recipients from the TO and CC headers recipientExtraction: MAIL_HEADER # Get the envelope `FROM` from email headers senderExtraction: HEADER ``` 3. Set up SMTP routing for Monitoring mode: see *Set Up Email Routing in xorlab* for [on-premises](/latest/on-prem-smtp#configure-for-monitoring) or [Microsoft 365](/latest/m365-smtp). 4. [Disable delivery status notifications](#disable-delivery-status-notifications). 5. Click **Publish**. The monitoring mode configuration becomes active within about one minute. This configuration sets xorlab Security Platform into Monitoring mode. For more information about sender and recipient extraction, please see the [next section](#sender-and-recipient-extraction). It is possible to omit the `handler` block as it is set to `smtpOffline {}` by default: ```yaml active_guard.yml theme={null} scanSources: smtp: port: 10025 ## Default handler configuration - applied if nothing else specified #handler: #- smtpReport #- smtpOffline ``` **Envelope-from** It is important to provide xorlab Security Platform the original envelope `FROM` in Monitoring mode. With the above configuration, xorlab tries to derive it from email headers. Further possibilities are described in the next chapter. ### Sender and recipient extraction In Monitoring mode, emails are often forwarded as copies (BCC) to xorlab. In this case, it is possible that the SMTP envelope `FROM` and recipient information have been overwritten as a part of the BCC forward. The envelope `FROM` might be something like `MAILER-DAEMON@gateway.internal` and the envelope recipient is xorlab itself like, for example, `emails@xorlab.internal` when the email arrives at xorlab. Therefore, you need to configure xorlab to get the envelope `FROM` and recipients from the correct location: ```yaml active_guard.yml theme={null} scanSources: smtp: port: 10025 handler: smtpOffline: senderRecipientExtraction: recipientExtraction: MAIL_HEADER senderExtraction: HEADER ``` For M365 integrations, set `senderRecipientExtraction.senderExtraction` to `MAIL_ENVELOPE` instead of `HEADER`. **Wrong configuration** The usual symptom of a wrong envelope `FROM` configuration is a missing or wrong envelope `FROM` shown in the detail view of an email in XCC. Consequently, xorlab cannot do various checks like, for example, SPF verification. The following values are supported for `senderRecipientExtraction.senderExtraction`: | Value | Default | Description | | :- | :- | :- | | `HEADER` | Default for `smtpOffline` (Monitoring mode) | Try to get the original envelope `FROM` from email headers | | `MAIL_ENVELOPE` | Default for `smtpInline` (Inline mode) | Take the envelope `FROM` from the SMTP `MAIL FROM` command | The following values are supported for `senderRecipientExtraction.recipientExtraction`: | Value | Default | Description | | :- | :- | :- | | `MAIL_HEADER` | Default for `smtpOffline` (Monitoring mode) | Use the `TO` and `CC` headers to get all recipients | | `MAIL_ENVELOPE` | Default for `smtpInline` (Inline mode) | Take the recipients from the SMTP `RCPT TO` command | For reported email handlers, `senderRecipientExtraction.reporterExtraction` controls how the sender of the report itself is extracted. Supported values are `MAIL_ENVELOPE` and `FROM_HEADER`. You can also provide the original envelope `FROM` through specific headers by matching them with `senderHeaderNamePattern`: ```yaml active_guard.yml theme={null} scanSources: smtp: port: 10025 handler: smtpOffline: senderRecipientExtraction: recipientExtraction: MAIL_HEADER senderExtraction: CUSTOM_HEADER # Specify a custom header that contains the original envelope `FROM` senderHeaderNamePattern: "x-original-envelope-from" ``` It is also possible to use a regex when you have multiple custom headers to check; provide that regex as the value for `senderHeaderNamePattern`: ```yaml active_guard.yml theme={null} senderHeaderNamePattern: x-one-envelope-from|x-other-envelope-from ``` The above expression matches either first or second header. ### Disable delivery status notifications For Monitoring mode, we recommend to generally disable delivery status notifications. This includes bounce emails. This will make sure that xorlab will never send delivery status notifications back to the sender when being in Monitoring mode. 1. Open the Expert Editor and navigate to the `activeguard/mta/startup_cfg/postfix_custom/master.cf` file. 2. Find the three lines starting with `bounce unix`, `defer unix`, and `trace unix`, and set the last word on all three lines to `discard`: ```shell theme={null} # Disable all delivery status notifications bounce unix - - n - 0 discard defer unix - - n - 0 discard trace unix - - n - 0 discard ``` 3. Open the `activeguard/mta/startup_cfg/postfix_custom/main.cf` file and comment out (e.g., using the **Ctrl+/** or **Cmd+/** keyboard shortcut) the `delay_warning_time` property (if you have multiple `main.cf` files, do it in each of them): ```shell theme={null} ## Deactivate delivery delay notifications through commenting it out #delay_warning_time = 1h #confirm_delay_cleared = yes ``` 4. Disable Delivery Status Notification (DSN) for bcc deployments in each `main.cf` file. ``` ## xorlab bcc deployment specific settings # Disable Delivery Status Notification (DSN) for bcc deployments smtpd_discard_ehlo_keywords = silent-discard, dsn ``` 5. Click **Publish**. The new Postfix settings become active within about one minute. ### Decisions and quarantine in Monitoring mode Detection and the [Actions](/latest/detection-actions) configuration screen apply exactly as they do in Inline mode: * An email whose verdict and confidence lead to a quarantine action gets the `QUARANTINED` decision, and its copy is kept in the matching quarantine instead of being dropped. Search for `status:quarantined` to list them. * Every other email is dropped after processing. None of this reaches your mail flow. xorlab only ever holds back its own copy, and the email the recipient received was delivered by your existing mail flow, untouched. A quarantine that fills up in Monitoring mode is therefore expected. ## Inline mode In Inline mode, xorlab Security Platform is part of the email traffic and forwards emails accordingly. In order to activate it: 1. Open [Expert Editor](/latest/expert-editor) and navigate to the `activeguard/core/active_guard.yml` file. 2. Under the relevant SMTP handler, set `smtpInline: {}` instead of `smtpOffline`. `senderExtraction` and `recipientExtraction` can be omitted as they default to `MAIL_ENVELOPE`: ```yaml active_guard.yml theme={null} scanSources: smtp: port: 10025 handler: smtpReport: {} # The following line activates the Inline mode. smtpInline: {} ``` 3. Make sure that bounce messages are enabled in `activeguard/mta/startup_cfg/postfix_custom/master.cf`: ```shell theme={null} # bounce, defer and trace must be set to "bounce" bounce unix - - n - 0 bounce defer unix - - n - 0 bounce trace unix - - n - 0 bounce ``` 4. Activate delivery delay notifications in `activeguard/mta/startup_cfg/postfix_custom/main.cf`: ```shell theme={null} ## Enable delivery delay notifications delay_warning_time = 1h confirm_delay_cleared = yes ``` 5. Set up SMTP routing for Inline mode: see *Set Up Email Routing in xorlab* for [on-premises](/latest/on-prem-smtp) or [Microsoft 365](/latest/m365-smtp). 6. Click **Publish**. The inline mode configuration becomes active within about one minute. # Review What Changes in Your Environment Source: https://docs.xorlab.com/latest/integration-impact See which settings an integration adds to Microsoft 365 or to your on-premises mail flow, what it leaves untouched — including your MX records — and how to undo it. xorlab integrates through configuration only. Every step in the integration guides is a setting you make in your own admin portal, every setting is visible to you afterward, and every setting can be switched off again. No software is installed on your servers, your clients or your endpoints, and no mailbox is moved. Use this page to answer the questions your mail, network and security teams ask before the project starts. ## Quick answers | Question | Answer | | :- | :- | | Do our MX records change? | With M365, **no** — they keep pointing at Microsoft. On premises, only if xorlab replaces your existing gateway. | | Do we install software anywhere? | No. The integration consists of connectors, mail flow rules and an app registration in your own tenant, plus configuration inside xorlab. | | Do users need an add-in or a new button? | No. Reporting uses the button your users already have — the built-in M365 one, or your existing third-party button. | | Does Microsoft's own filtering stop working? | No. Exchange Online Protection and Defender keep running, and xorlab is layered on top of them. | | Do our outgoing emails get new sending IPs? | With M365, no — outgoing email still leaves through Microsoft, so SPF and DKIM stay as they are. On premises, only if xorlab becomes your outbound gateway. | | Do we need a DNS change or a cutover window? | Not for M365. The change is made by enabling two mail flow rules, it takes effect within minutes, and it is undone the same way. | | Can we start without blocking anything? | Yes. Run in [Monitoring mode](/latest/inline-and-monitoring-mode), which never touches the mail flow, or go inline in [Toothless Mode](/latest/before-begin-integration#configure-inline-mode), where every email is still delivered. | ## Microsoft 365 ### What the integration adds | Change | Where you make it | Required? | | :- | :- | :- | | Two connectors, `Microsoft365Toxorlab` and `xorlabToMicrosoft365`, both with TLS enforced | Exchange admin center → **Connectors** | Mandatory — [Enable M365 Inline Mode](/latest/m365-inline-mode). [Enable M365 Monitoring Mode](/latest/m365-monitoring-mode) needs only the first one. | | Two mail flow rules that redirect incoming and outgoing email to xorlab, or blind-copy it in Monitoring mode | Exchange admin center → **Mail flow** → **Rules** | Mandatory — [Enable M365 Inline Mode](/latest/m365-inline-mode) or [Enable M365 Monitoring Mode](/latest/m365-monitoring-mode) | | One enterprise application named `xorlab`, with app roles, and the users or groups who sign in to XCC assigned to it | Entra ID | Mandatory — [Create Entra ID App](/latest/m365-entra-id-app) and [Enable Entra ID SAML Login](/latest/m365-saml-entra-authentication) | | Microsoft Graph application permissions (`Mail.ReadWrite` or `Mail.Read`, and `User.Read.All`) with admin consent, and a client secret | Entra ID → the `xorlab` app | Optional — only for [Activate Case Isolation](/latest/m365-case-isolation) and [Import Past M365 Emails](/latest/m365-retrospective-email-scanning) | | The spam actions of the default inbound anti-spam policy set to **Add X-header** | Microsoft Defender portal | Optional — [Move M365 Quarantine to xorlab](/latest/m365-move-quarantine) | | A reporting mailbox and one more mail flow rule, `xorlabReportingIntegration` | Microsoft Defender portal → **User reported settings**, and Exchange admin center | Optional — [Integrate M365 Abuse Mailbox](/latest/m365-reporting-integration) | ### What stays as it is * **Your MX records.** Email keeps arriving at M365 first. A mail flow rule hands it to xorlab over the connector, and xorlab hands it back to M365 for delivery. There is nothing to change at your DNS provider, no TTL to plan around and no cutover moment. * **Your outbound sending identity.** Outgoing email also returns to M365 for final delivery, so your public sending IPs, your SPF record and your DKIM signatures are unchanged. * **Exchange Online Protection and Defender.** Microsoft's own filtering keeps running. The only policy xorlab touches is optional: [Move M365 Quarantine to xorlab](/latest/m365-move-quarantine) changes the spam actions so that users have a single quarantine instead of two. * **Mailboxes, addresses and licenses.** Nothing is migrated and no mailbox is created for your users. The only new mailbox is the optional reporting mailbox. * **Accepted domains, SPF and the connection filter.** A standard integration does not touch them. The three adjustments under [troubleshooting](/latest/m365-inline-mode#troubleshooting) are needed only if you run into deliverability issues. * **Your clients.** No add-in is rolled out. Users report suspicious email with the button M365 already provides. **Hybrid setups** Follow the M365 path whenever you receive and send email through M365, even if mailboxes also exist on premises. If email enters and leaves through your own infrastructure, follow [On-premises](#on-premises) instead. ### How to undo it Disable the two mail flow rules in the Exchange admin center. Email returns to its previous path within minutes, without a DNS change. The connectors and the Entra ID app can then be removed at your own pace. ## On-premises How much changes depends on where xorlab sits in your mail flow. You choose that in [Set Up Email Routing in xorlab](/latest/on-prem-smtp). | Target setup | Mail path | MX records | | :- | :- | :- | | **Inline add-on** (default) | Your gateway forwards incoming email to xorlab instead of directly to Exchange, and xorlab delivers it to Exchange. Outgoing email goes Exchange → xorlab → gateway. | Unchanged. Your existing gateway keeps the MX. | | **Inline gateway** | xorlab receives email from the internet and delivers it to Exchange. It also delivers outgoing email to the external recipient. | Changed. They point at the xorlab MTAs. Also open inbound SMTP to the MTAs, add them to your SPF record, and set up [DKIM signing](/latest/dkim-and-dmarc-setup) on xorlab. | | **Monitoring** | Unchanged. xorlab receives a copy of every email and discards it after the analysis. | Unchanged. | ### What the integration adds | Change | Where you make it | Required? | | :- | :- | :- | | The scope of the default receive connector extended with the IP addresses of the xorlab MTAs | Exchange admin center → **Mail Flow** → **receive connectors** | Inline — [Enable Exchange Inline](/latest/on-prem-exchange-inline) | | A send connector that routes outgoing email through the xorlab MTAs as smart hosts | Exchange admin center → **Mail Flow** → **send connectors** | Inline — [Enable Exchange Inline](/latest/on-prem-exchange-inline) | | Two mail flow rules that blind-copy email to xorlab, or a message filter, bounce profile and destination control on a Cisco ESA | Exchange admin center, or the ESA | Monitoring — [Enable Exchange Monitoring with BCC](/latest/on-prem-exchange-monitoring-mode) or [Enable ESA Monitoring with BCC](/latest/on-prem-esa-monitoring-mode) | | Firewall rules for SMTP between your email servers and the xorlab MTAs, and for the outbound connections of the platform | Your firewall | Mandatory — [Network Guide](/latest/network-guide) | | Your own email servers registered as trusted infrastructure. This is a setting inside xorlab, not in your environment | Expert Editor | Mandatory — [Add Your Trusted Infrastructure](/latest/on-prem-add-trusted-mtas) | | A SAML application or an LDAP service account for signing in to XCC | Your identity provider | Optional — [Enable SAML or LDAP Login](/latest/on-prem-saml-ldap-authentication) | | Forwarding of reported email to `suspicious@` on xorlab | Exchange, or your reporting button | Optional — [Integrate On-prem Abuse Mailbox](/latest/on-prem-reporting-integration) | ### What stays as it is * **Your existing gateway or filter**, unless you deliberately replace it. In the default inline add-on setup, xorlab is added next to what you already run. * **Mailboxes, addresses and clients.** Nothing is migrated and nothing is installed on Exchange or on the endpoints. * **The mail flow itself, in Monitoring mode.** xorlab only receives a copy and never modifies, delays or blocks an email. **Monitoring mode and availability** The copies are ordinary emails, so if all xorlab MTAs are unreachable, they can queue up on the system that sends them. If that happens, disable the BCC rules temporarily. ### How to undo it In Monitoring mode, disable the BCC mail flow rules or the ESA message filter. In Inline mode, set the next hop of the system in front of xorlab back to its previous destination and disable the send connector that points at xorlab. ## What your users notice * **In Monitoring mode, nothing.** No email is modified, delayed or blocked. * **In Inline mode, with the delivered defaults:** * Emails with a malicious verdict are quarantined instead of delivered. Which verdict and confidence leads to which action is visible, and adjustable, in [Review Default Actions](/latest/detection-actions). * Some verdicts are delivered with a subject prefix such as `[SPAM]`, configured on the same screen. * Nothing else is added to the message. [Enable Contextual Banners](/latest/detection-contextual-banners) and [Add Result Header to Email](/latest/detection-analysis-result-header) are separate, optional steps and are off by default. * **Only if you enable it:** the [Self-Service Quarantine (SSQ)](/latest/ssq-overview) lets users see and release their own quarantined emails, and quarantine notifications are sent to them. During the first weeks you can go inline in [Toothless Mode](/latest/before-begin-integration#configure-inline-mode). xorlab then delivers every email, including the ones it would have quarantined, and you review those in XCC by searching for `#quarantine` before switching protection on. ## Next steps Configure your guarded domains, set the data retention, and choose between Inline and Monitoring mode. # What to Configure Next Source: https://docs.xorlab.com/latest/integration-next-steps What to configure once the integration is complete: user login, quarantine, notifications, detection, and logging. Now that you finished the [xorlab integration](/latest/setup-integration-overview), have a look at the following topics: | Step | Description | | :- | :- | | [Enable User Login](/latest/authentication-overview) | In case you haven't done it yet, simplify user login to xorlab via SAML, LDAP or Auto-Login | | [Customize detection](/latest/detection-overview) | Review the built-in detection and activate additional features | | [Enable SSQ](/latest/ssq-overview) | Enable Self-Service Quarantine (SSQ) for your end-users | | [Connect a SIEM](/latest/integrations-siem) | Forward verdicts, threat intelligence, and the audit trail to your SIEM or log management platform | | [Automate with a SOAR](/latest/integrations-soar) | Trigger playbooks from xorlab events, and let them manage list entries over the API | For everything else xorlab connects to — identity providers, Microsoft Graph, threat intelligence, and awareness training tools — see [What xorlab Connects To](/latest/integrations-overview). # What xorlab Connects To Source: https://docs.xorlab.com/latest/integrations-overview Which systems xorlab integrates with and over which interface: SMTP mail flow, Syslog to SIEM, REST APIs for SOAR and automation, SAML and LDAP identity, Microsoft Graph, and threat intelligence. xorlab is built on open, standardized interfaces. You install no proprietary agent and you wait for no vendor-specific connector: if your platform speaks **SMTP**, **Syslog**, **HTTPS/REST**, **SAML**, or **LDAP**, it can be integrated with xorlab today. Use this page to check whether a system in your stack is covered, and to find the guide that covers it. Each section links into the step-by-step instructions under [Admin Configuration](/latest/setup-integration-overview). Ready to start the integration? Go to [Integration Overview](/latest/setup-integration-overview) — the ordered guide through the standard xorlab integration. Come back here when you want to connect a further system. Route or mirror email through xorlab in Microsoft 365, on-premises, or hybrid environments. Stream verdicts, threat intelligence, and the full audit trail to Splunk, Sentinel, QRadar, Elastic, and others. Drive xorlab from your playbooks over REST, and trigger playbooks from xorlab events. SAML 2.0 and LDAP against Entra ID, Active Directory, or any standards-compliant IdP. Case isolation, retrospective scanning, the built-in Report button, and contextual banners. Enrich analysis and investigation with VirusTotal and Spamhaus DQS. Let any phishing simulation service through to the inbox without weakening detection. On-premises only: ship platform health alerts to email, Slack, webhooks, or any Alertmanager receiver. ## Interfaces at a glance | Interface | Direction | Used for | | :- | :- | :- | | SMTP (with TLS) | Inbound and outbound | Mail flow, notifications, reported email, log delivery by email | | Syslog (UDP, TCP, TLS — RFC 3164 or RFC 5424) | xorlab → your system | SIEM, log management, SOAR event triggers | | HTTPS / REST | Your system → xorlab | [List API](/latest/api-rule-list-management) for automated list management, [Email Scanning API](/latest/abby) for on-demand analysis | | Log files (on-premises only) | xorlab → your collector | Log shippers and agents that tail files | | SAML 2.0 | xorlab → your IdP | Single sign-on for admins, analysts, and end users | | LDAP | xorlab → your directory | Login against Active Directory | | Microsoft Graph | xorlab → M365 | Case isolation, retrospective scanning, move to quarantine | | DNS | xorlab → resolver | Sender authentication and DNS-based blocklists such as Spamhaus DQS | ## Mail flow (SMTP) xorlab sits in your mail flow over SMTP, which is what makes it deployable in front of, behind, or alongside almost any mail infrastructure — Microsoft 365, Exchange, or any standards-compliant MTA or gateway. Two modes are supported, and both are available in all deployment variants (on-premises, hybrid, and SaaS): * **Inline mode**: all email is routed through xorlab, which can block, quarantine, and rewrite. * **Monitoring mode**: xorlab receives a copy of every email and discards it after analysis. Nothing is blocked. Each path guide below ends with architecture diagrams of every supported topology for that path, so you can match your environment before you start. Connectors, inline or monitoring mode, and the optional Graph-based features. Includes the [mail flow diagrams](/latest/m365-integration-overview#inline-mode-diagrams). Exchange, Cisco ESA, and other gateways, as a gateway or as an add-on. Includes the [mail flow diagrams](/latest/on-prem-integration-overview#inline-mode-diagrams). What each mode can and cannot do, and how to switch between them later. Multiple next hops, per-domain routing, TLS enforcement, and trusted MTAs. The documented on-premises guides cover Exchange and Cisco ESA, but the interface is plain SMTP: any other MTA or secure email gateway can take their place. If yours is not covered by a guide, contact [support@xorlab.com](mailto:support@xorlab.com) and we will walk you through it. ## SIEM and log management Every relevant thing that happens in xorlab is a log event: the verdict for each message, each SMTP transaction, threat intelligence indicators extracted from malicious mail, and the complete analyst and admin audit trail. Events are emitted over Syslog in JSON or CEF, so any SIEM can consume them without a dedicated connector. Which events to send, which format to choose, and where to look in the documentation of Splunk, Microsoft Sentinel, QRadar, Elastic, Graylog, and others. ## SOAR and automation Automation works in both directions. xorlab pushes events out over Syslog, and your playbooks call back into xorlab over a REST API. Use that, for example, to add a confirmed phishing sender to a Blacklist without anyone logging into the web interface. Event triggers, the List API as the action surface, worked playbook patterns, and the API key model. Read, add, and remove entries on any list, including custom lists. Scoped API keys, multi-tenant aware. Submit a message over HTTP and get the analysis result back synchronously. ## Identity and single sign-on xorlab does not maintain its own user directory unless you want it to. Admins, analysts, and end users authenticate against your identity provider, and roles are mapped from the attributes it returns, including tenant-restricted roles in multi-tenant deployments. | Integration | Notes | | :- | :- | | [SAML 2.0](/latest/authentication-saml) | Recommended for admins and analysts. Works with any standards-compliant IdP; see [Entra ID](/latest/m365-saml-entra-authentication) for a worked Microsoft 365 example. Supports [request signing](/latest/authentication-saml-request-signing) and [certificate handling](/latest/authentication-certificates). | | [LDAP](/latest/authentication-ldap) | Login against Active Directory or another LDAP directory. | | [Auto-Login](/latest/authentication-auto-login-link) | Passwordless access for end users to the Self-Service Quarantine from the quarantine notification. | | [Password file](/latest/authentication-with-a-password-file) | Local credentials with optional TOTP, for break-glass access or environments without an IdP. | Several methods can be active at the same time — for example SAML for the SOC and Auto-Login for end users. See [Authentication Overview](/latest/authentication-overview). ## Microsoft 365 and Microsoft Graph Beyond mail flow, xorlab integrates with Microsoft 365 through a single [Entra ID app registration](/latest/m365-entra-id-app) and Exchange Online mail flow rules. | Integration | What it does | | :- | :- | | [Case Isolation](/latest/m365-case-isolation) | Analysts remove a confirmed malicious email from recipients' mailboxes through Microsoft Graph. | | [Retrospective Email Scanning](/latest/m365-retrospective-email-scanning) | Import and analyze mail that was already delivered, before the tenant goes inline. | | [Move to Quarantine](/latest/m365-move-quarantine) | Move the M365 quarantine to xorlab for a centralized experience. | | [Abuse Mailbox via the Report button](/latest/m365-reporting-integration) | The built-in Microsoft 365 reporting button feeds reported email into xorlab, with automated feedback to the reporter. | | [Contextual Banners](/latest/detection-contextual-banners) | Exchange Online (and on-premises Exchange) mail flow rules insert risk-specific banners. Ready-made PowerShell scripts are provided. | | [Shared mailboxes](/latest/ssq-shared-mailboxes) | Resolve shared mailbox membership so delegates can use the Self-Service Quarantine. | ## Threat intelligence | Integration | Role in the platform | | :- | :- | | [VirusTotal](/latest/detection-virustotal) | On-demand enrichment in the message detail view. Informational only — it does not influence the verdict. Bring your own API key. | | [Spamhaus DQS](/latest/detection-spamhaus-dqs) | DNS-based blocklist and Hash Blocklist checks through the SpamAssassin plugin. Bring your own key. | | xorlab xCloud and xorlab ML | Built in, no configuration required. See [Data Sent to External Services](/latest/data-to-external-services) for exactly what leaves your environment. | xorlab also **exports** threat intelligence: the `ti.*` [log events](/latest/logging-events#threat-analysis-events) emit malicious sender addresses, sending IPs, attachment hashes, domains, and URLs observed in your own mail, ready to be consumed by your SIEM or fed into other controls. See [Connect a SIEM](/latest/integrations-siem#export-threat-intelligence). ## Security awareness and phishing simulation Any awareness training or phishing simulation service can be allowed through, regardless of vendor. Add its distinctive mark to the Simulation lists, ideally the sending IP range, and simulated attacks reach the inbox and are tagged `verdict:simulation`. Which identifiers to use, and why matching on the connecting IP is safer than matching on a header. ## Operational monitoring and alerting **On-premises deployments only** If you run xorlab as SaaS, xorlab operates and monitors the platform for you. Subscribe to the [status page](/latest/important-resources#status-page) for scheduled maintenance and incidents. If you run xorlab on-premises, platform health monitoring is built on Prometheus and Alertmanager, so alerts about the platform itself can go anywhere Alertmanager can send them: email, Slack, a generic webhook, and every other receiver Alertmanager supports. Configure receivers and route alerts by severity. Operational alerting is for platform health. To get email security events into another system, use [Syslog](/latest/integrations-siem) instead. ## Don’t see your product? That is usually not a problem. xorlab integrates through standard protocols rather than per-vendor connectors, so the question is which interface your product speaks: * It can receive Syslog, or an agent of yours can read a log file → see [Connect a SIEM](/latest/integrations-siem). * It can make an HTTP request → see [Automate with a SOAR](/latest/integrations-soar). * It is a mail gateway or mail server → see [Mail flow (SMTP)](#mail-flow-smtp). * It is an identity provider that supports SAML 2.0 or LDAP → see [Authentication Overview](/latest/authentication-overview). If you are unsure, contact [support@xorlab.com](mailto:support@xorlab.com). # Connect a SIEM Source: https://docs.xorlab.com/latest/integrations-siem Stream xorlab verdicts, threat intelligence, and audit events to any SIEM over Syslog in JSON or CEF, with pointers into the ingestion documentation of the common platforms. **Optional** This is a next step after the [standard integration](/latest/setup-integration-overview). xorlab protects email without a SIEM connected. xorlab integrates with SIEM and log management platforms over **Syslog**, using either **JSON** or **CEF** as the message payload. Because both sides of that are standards, you need no xorlab-specific app, add-on, or connector. Any platform that can accept Syslog can ingest xorlab events. Forward Events over Syslog — the appender configuration, TCP/TLS, and all available parameters. ## What you can send Logging is event-based: you choose which events to forward, so you can start with verdicts only and expand from there. The categories most relevant to a SIEM: | What | Events | Why you want it | | :- | :- | :- | | Email verdicts | `trace.msg_verdict`, `trace.msg_analysis.complete` | One record per email with the decision, direction, sender, and recipients — and with the extended JSON format also tags, risk and trust scores, attachment hashes, and extracted URLs. The backbone of email dashboards and correlation. | | SMTP transactions | `trace.mta.received`, `trace.mta.send`, `trace.msg_delivered` | Accept/relay records with queue IDs, for mail flow tracing and delivery troubleshooting. | | Threat intelligence | `ti.email`, `ti.ip`, `ti.file`, `ti.domain`, `ti.url` | Indicators extracted from malicious mail in *your* environment. See [Export threat intelligence](#export-threat-intelligence). | | Analyst and admin audit trail | `audit.*` | Logins, message views and downloads, quarantine releases, list changes, campaign changes, config changes. Needed for compliance evidence and insider-risk monitoring. | | Quarantine and release workflow | `audit.user.quarantine_release`, `audit.quarantine.release.request.*` | Who requested, approved, or denied a release, and when. | | Case isolation | `audit.isolate.removed` | Records every email evicted from a mailbox. | | Platform events | `sys.*` | Startup, shutdown, configuration commits, backup success and failure. | The full list, with event IDs, severities, and the component each one is emitted by, is in [Log Events](/latest/logging-events). ## Choose a payload format | Format | Pattern | Use it when | | :- | :- | :- | | JSON | `%jsonMsg%n` | Default choice. Works for all events. Best when your SIEM parses JSON natively. | | JSON extended | `%coreJsonMsg%n` | You want the complete email analysis result — attachments with hashes, extracted URLs, threat intel hits, headers — as a single record. Only valid for `trace.*` events. | | CEF | `%cef%n` | Your platform expects ArcSight-style CEF, or you use a CEF-based data connector (for example CEF via AMA in Microsoft Sentinel). | | Single attributes | `%logArg{key}` | You only need a few fields, for example to feed a lookup table. | Details and worked examples: [Format Converters](/latest/logging-formats). **Start with the extended JSON verdict event** For most SIEM projects, forward `trace.msg_analysis.complete` with the `%coreJsonMsg%n` pattern. That gives you the highest value per event: exactly one rich record per email. A copy-ready configuration is in [Configuration Examples](/latest/logging-examples#log-detailed-email-results). ## Transport and reliability | Option | Notes | | :- | :- | | UDP | Default. Simplest, but lossy, and messages are truncated to 1500 bytes unless you raise `messageSizeLimit`. Fine for low-volume audit events, not for extended JSON. | | TCP | Recommended. Requires wrapping the Syslog appender in an `AsyncAppender`. | | TLS (`SSL`) | Recommended when logs leave your network, for example to a cloud-hosted SIEM. Also requires an `AsyncAppender`. | Both `RFC3164` (default) and `RFC5424` framing are supported through the `format` parameter, and `hostName` sets the log source identifier your SIEM keys on. See [Available attributes](/latest/logging-via-syslog#available-attributes). For TCP and TLS, adding an `AsyncAppender` is mandatory. Without it, a slow or unreachable SIEM can affect xorlab. See [Use Syslog with TCP or TLS](/latest/logging-via-syslog#use-syslog-with-tcp-or-tls). ## Where to configure it in your SIEM xorlab appears to your SIEM as a generic Syslog source, so the work on the SIEM side is the platform’s standard “add a Syslog source” procedure. We do not ship per-vendor apps. Use the vendor’s own documentation below, and point the source at the `syslogHost` and `port` you configured in xorlab. | Platform | Receive xorlab events by | Vendor documentation | | :- | :- | :- | | Splunk Enterprise / Splunk Cloud | Splunk Connect for Syslog (SC4S), which Splunk recommends over a raw network input | [Splunk Connect for Syslog](https://splunk.github.io/splunk-connect-for-syslog/main/) | | Microsoft Sentinel | Syslog via AMA connector, requires you to run a host with AMA | [Ingest syslog and CEF messages to Microsoft Sentinel](https://learn.microsoft.com/en-us/azure/sentinel/connect-cef-syslog-ama) | | IBM QRadar | A log source with the Syslog protocol type, parsed by a universal DSM or a log source extension | [Adding a log source](https://www.ibm.com/docs/en/dsm?topic=management-adding-log-source) | | Elastic Security | Elastic Agent with the Custom UDP Logs or Custom TCP Logs integration | [Custom UDP Logs integration](https://www.elastic.co/docs/reference/integrations/udp) | | Graylog | Syslog TCP input (with optional TLS) or Syslog UDP input | [Syslog Inputs](https://go2docs.graylog.org/current/getting_in_log_data/syslog_inputs.html) | | Sumo Logic | Syslog source on an installed collector | [Syslog Source](https://www.sumologic.com/help/docs/send-data/installed-collectors/sources/syslog-source/) | | Cribl Stream | Syslog source, then route to any downstream destination | [Syslog Source](https://docs.cribl.io/stream/sources-syslog/) | | Wazuh | Remote syslog on the Wazuh server | [Configuring syslog on the Wazuh server](https://documentation.wazuh.com/current/user-manual/capabilities/log-data-collection/syslog.html) | | Datadog | Syslog source in Observability Pipelines | [Syslog Source](https://docs.datadoghq.com/observability_pipelines/sources/syslog/) | Not listed here does not mean unsupported. Any platform with a Syslog listener works the same way — look for “syslog input”, “syslog source”, or “log source” in its documentation. ### If your collector prefers files For on-premises deployments you can also write events to a rolling log file and let an existing agent or log shipper pick them up. This is often the path of least resistance when you already run a forwarder on every host. Rolling file appender with size and retention policies. ## Export threat intelligence The `ti.*` events are worth calling out separately. Whenever xorlab identifies a malicious element in an email, it emits the indicator as its own event: | Event | Indicator | | :- | :- | | `ti.email` | Malicious sender email address | | `ti.ip` | Malicious sending MTA IP address | | `ti.file` | Malicious attachment | | `ti.domain` | Malicious embedded domain | | `ti.url` | Malicious embedded URL | Because xorlab derives these from attacks against your own organization, they are usually higher-signal than a generic feed. Common uses are populating a SIEM threat intelligence index, blocking indicators on the proxy or firewall, or hunting retroactively across other log sources. ## Verify the integration 1. Configure the appender and logger as described in [Forward Events over Syslog](/latest/logging-via-syslog). 2. Generate the event you subscribed to — for verdict events, send a test email through xorlab. 3. Confirm the event arrives in your SIEM. If nothing appears, check in this order: * Is the event emitted by the component whose `logback-audit.xml` you edited? Each component has its own configuration directory, listed in [How Logging Works](/latest/logging-concept#one-configuration-file-per-component). * Is the chosen pattern valid for the chosen event? `%coreJsonMsg` only works for `trace.*` events. * Is UDP truncating the payload? Extended JSON records easily exceed 1500 bytes — switch to TCP. * Is the port reachable from the xorlab MTA and XCC? See the [Network Guide](/latest/network-guide). The full list of symptoms and causes, including duplicated and truncated records, is in [Verify and Troubleshoot Logging](/latest/logging-verify). # SIEM & SOAR Overview Source: https://docs.xorlab.com/latest/integrations-siem-soar-overview The two ways xorlab connects to a SIEM or SOAR: an outbound event stream over Syslog, and an inbound REST API for automation. Both integrations are **optional**. xorlab protects email without either of them, and analysts can do everything described here by hand in the web interface. They rest on two interfaces: * **Outbound**, over Syslog: verdicts, extracted threat intelligence, and the full analyst and admin audit trail. This is what a SIEM ingests, and what a SOAR uses as a playbook trigger. * **Inbound**, over HTTPS: the [List API](/latest/api-rule-list-management), which lets a playbook or script change list entries without a human in the web interface. | Step | Description | | :- | :- | | [Connect a SIEM](/latest/integrations-siem) | **Optional**. Forward the events you care about to Splunk, Microsoft Sentinel, QRadar, Elastic, or any other platform with a Syslog listener. | | [Automate with a SOAR](/latest/integrations-soar) | **Optional**. Turn those same events into playbook triggers, and let playbooks manage Blacklists, Whitelists, and VIP lists over the API. | **Prerequisites** * Complete the [integration](/latest/setup-integration-overview) # Automate with a SOAR Source: https://docs.xorlab.com/latest/integrations-soar Drive xorlab from your SOAR or automation platform: Syslog events as playbook triggers, the List API as the action surface, and worked playbook patterns. **Optional** This is a next step after the [standard integration](/latest/setup-integration-overview). Analysts can do everything described here by hand in the web interface. You can operate xorlab by machine as well as by hand. Automation runs in two directions: Events are pushed out over Syslog and become playbook triggers: verdicts, extracted indicators, and the full audit trail. Your playbooks call a REST API to change xorlab configuration, most importantly list entries. Both use interfaces most SOAR and automation platform already supports, so integrating xorlab is a matter of configuring a Syslog source and an HTTP action. List API — create an API key, then call the endpoints from your playbook. ## Trigger playbooks from xorlab events Send the relevant [log events](/latest/logging-events) over Syslog to your SOAR, or to the SIEM your SOAR is already connected to. The events most often used as triggers: | Trigger | Event | Typical playbook | | :- | :- | :- | | An email was quarantined or blocked | `trace.msg_verdict`, `trace.msg_analysis.complete` | Open or enrich a case, notify the recipient’s manager, check whether the same sender reached other systems. | | A malicious indicator was observed | `ti.email`, `ti.ip`, `ti.file`, `ti.domain`, `ti.url` | Push the indicator to the proxy, firewall, or EDR blocklist, and hunt for it across other log sources. | | A user released a message from quarantine | `audit.user.quarantine_release` | Post-hoc review of the release, and follow-up if the message was high risk. | | A release request was created | `audit.quarantine.release.request.created` | Route the approval into your ticketing or chat workflow. | | An analyst isolated an email | `audit.isolate.removed` | Record the containment action in the incident record. | | A list or configuration changed | `audit.user.lists.item_added`, `audit.user.lists.item_removed`, `audit.user.config.file_modified` | Change-management evidence, and alerting on unexpected changes. | Setup is the standard Syslog path — see [Connect a SIEM](/latest/integrations-siem) for format and transport guidance, and [Forward Events over Syslog](/latest/logging-via-syslog) for the configuration itself. ## Act on xorlab from a playbook The [List API](/latest/api-rule-list-management) is the primary automation surface. It reaches every list that is visible in the web interface, including custom lists. That covers most of what a playbook needs to change: [Blacklists](/latest/blacklists), [Whitelists](/latest/whitelists), [VIP Names](/latest/vips) and high-value targets, fraud keywords, simulation senders, trusted infrastructure, and reporting addresses. | Endpoint | Use | | :- | :- | | `getLists` | Discover the available lists, their internal names, and their `maxSize`. Always start here. | | `listEntries` | Read the current entries of a list, as NDJSON. | | `addEntries` | Add or update entries, each with a free-text comment. | | `deleteEntries` | Remove entries. Missing entries are ignored, so calls are safe to repeat. | Use this minimal action step to add a sender domain your playbook has confirmed as malicious to a Blacklist: ```bash theme={null} curl -sS -X POST \ '/api/public/lists/v1/addEntries' \ -H 'Authorization: apikey ' \ -H 'Content-Type: application/json' \ -d '{ "tenantUid": null, "listName": "BLACKLIST_local_sender_addresses", "entries": [ { "entry": "bad-domain.example", "comment": "Blocked by playbook PB-114, case INC-4821" } ] }' ``` Use the `comment` field deliberately. Analysts see it on the **Lists** page, so it is the fastest way for them to understand why an automated entry exists. Put the playbook name and the case ID in it. For the API key, the endpoint reference, and multi-tenant scoping, see the [List API](/latest/api-rule-list-management). For the narrower case of submitting a message for analysis over HTTP instead of SMTP, see the [Email Scanning API](/latest/abby). Every list has a maximum size, and adding to a full list removes its oldest entry. An unbounded automation that keeps adding entries will therefore evict older ones. Read `maxSize` from `getLists` and have your playbook clean up its own entries with `deleteEntries`, for example when a case is closed. See [Understanding list behavior](/latest/api-rule-list-management#understanding-list-behavior). ## Playbook patterns Common patterns: | Pattern | How it works | | :- | :- | | **Close the loop on a confirmed phishing case** | An analyst or a playbook confirms a reported email is malicious → `addEntries` puts the sender address or domain on a Blacklist → the indicator also goes to the proxy and EDR. | | **Sync an external feed or deny list** | A scheduled playbook reads your authoritative source (threat feed, MISP, an internal deny list) and reconciles it into a xorlab list with `listEntries`, `addEntries`, and `deleteEntries`. | | **Keep VIP data in step with HR** | On a change in the HR system or an Entra ID group, update the VIP names and high-value-target lists so impersonation protection follows the org chart automatically. | | **Onboard a phishing simulation campaign** | Before a campaign starts, a playbook adds the simulation provider’s sending IP range to the [Simulation lists](/latest/phishing-simulation-tools), and removes it when the campaign ends. | | **Time-boxed exceptions** | A playbook adds a Whitelist entry with a case ID in the comment and schedules its own `deleteEntries` call, so temporary exceptions do not become permanent ones. | | **Enrich tickets with the xorlab verdict** | The verdict event forwarded over Syslog carries the decision, tags, sender authentication result, and attachment hashes. That can be used to populate a ticket automatically. | ## Platform notes The xorlab side is identical for every platform: a Syslog destination for events, and an authenticated HTTP POST for actions. The table below names the building block to use on the other side, and where the vendor documents it. | Platform | Building block | Vendor documentation | | :- | :- | :- | | Palo Alto Cortex XSOAR / XSIAM | The *GenericAPICall* integration, which makes authenticated HTTP calls to endpoints without a dedicated integration | [GenericAPICall](https://xsoar.pan.dev/docs/reference/integrations/generic-api-call) | | Splunk SOAR | The Splunk-built **HTTP** app, configured as an asset. Its `post data` action makes the REST call | [HTTP app on Splunkbase](https://splunkbase.splunk.com/app/5904) | | Microsoft Sentinel | An automation rule invoking a Logic App, whose built-in HTTP action calls the endpoint | [Call external HTTPS endpoints from workflows](https://learn.microsoft.com/en-us/azure/connectors/connectors-native-http) | | Tines | The HTTP Request action | [HTTP Request](https://www.tines.com/docs/actions/types/http-request/) | | Anything else | Any HTTP request step that lets you set a custom header for authentication | — | # Keyboard Shortcuts Source: https://docs.xorlab.com/latest/keyboard-shortcuts All keyboard shortcuts available in XCC, grouped by screen area. | Area | Shortcut | Function | | - | - | - | | Media & preview dialogs | Left, Right | Previous/next image | | Message list view | Slash
Esc
S
Shift+S
T
X
A
E
Del | Set focus to the search bar
Clear search
Save search
Save campaign
Add a tag
Export campaign
Archive campaign
Edit search or campaign
Delete search or campaign | | Message detail view | P
N
B
W
I
R
S
E
T
O
D
Shift+D
M
Del
1
2
3
4
5
6
7 | Previous message
Next message
Blacklist message
Whitelist message
Isolate message
Release message
Resolve message as benign
Resolve message
Add a tag
Show original email
Download email
Download archive
Download metadata
Delete message
Select **Summary** tab
Select **Attachments** tab
Select **Links** tab
Select **Similar** tab
Select **Headers** tab
Select **Classifiers & Rules** tab
Select **Context variables** tab | | Message detail view (reported messages) | 1
2
3
4
5
6
7
8 | Select **Summary** tab
Select **Report log** tab
Select **Attachments** tab
Select **Links** tab
Select **Similar** tab
Select **Headers** tab
Select **Classifiers & Rules** tab
Select **Context variables** tab | | Message list view (SSQ) | A
T
W
M | Select all
Select today
Select since one week
Select since one month | | Message detail view (SSQ) | R | Release message | | File detail view | D
Del
1
2
3
4 | Download
Delete
Select **Summary** tab
Select **Links** tab
Select **Classifiers & Rules** tab
Select **Context variables** tab | | Release dialog | Enter | Release | # Lists Overview Source: https://docs.xorlab.com/latest/lists Overview of the built-in lists that adjust platform behavior on the fly, and where to find them in XCC. Throughout this documentation, a list is referenced as **Settings → Lists → \**. To get there in XCC: 1. On the main screen, click the tiles icon next to your account name and click the **Admin** icon in the displayed menu. 2. On the resulting **Admin** page, click the **Lists** tile: Selecting Lists Lists include [Blacklists](/latest/blacklists) and [Whitelists](/latest/whitelists), but also more sophisticated lists like [Trusted Senders and Infrastructure](/latest/trusted-senders-infrastructure) to manually overwrite trust scores, or the [Phishing Simulation Tools](/latest/phishing-simulation-tools) to define which emails are treated as phishing simulations. **A note on terminology** This documentation uses **Blacklist** and **Whitelist** because that is how these lists are named in xorlab Security Platform. They are also commonly known as blocklist and allowlist. The terms *blocklist* and *allowlist* are used only where they refer to something outside xorlab, such as third-party [DNS blocklists](/latest/detection-overview). If you want to automate list maintenance, use the [Rule List API](/latest/api-rule-list-management). It allows you to read and update list entries directly, without editing config files. Built-in lists **Custom lists** It is possible to add additional lists to this overview that can then be used in custom rules for specific use cases. Contact [support@xorlab.com](mailto:support@xorlab.com) for detailed instructions. # Reporting Addresses Source: https://docs.xorlab.com/latest/lists-reporting-addresses Configure the addresses used to report suspicious emails to services other than xorlab. xorlab Security Platform provides an email address for reporting potentially malicious messages. Additionally, your organization may report malicious emails to other services than xorlab Security Platform. If this is the case, it is important that xorlab Security Platform knows about external reporting addresses. Emails sent to or from such addresses may contain malicious content, which xorlab Security Platform should ignore. Otherwise, malicious URLs in reported emails may start to build up a local reputation. To let xorlab Security Platform know about these other reporting addresses, add them to the list under **Settings → Lists → Reported**. | List name | Description | Accepted entries | | :- | :- | :- | | **External reporting addresses (regex)** | List of external spam-reporting addresses | Regular expressions to match email addresses, e.g., `^(?i)spam@company\.com$` | # Activate Case Isolation Source: https://docs.xorlab.com/latest/m365-case-isolation Remove delivered emails from Microsoft 365 mailboxes through the Graph API using the Isolate action. As soon as you activate this feature, the **Isolate** button appears in the detail view of every email. **Prerequisites** * Complete [Create Entra ID App](/latest/m365-entra-id-app) * Have access to [Entra ID Portal](https://entra.microsoft.com) with an Administrator role * Know your customer ID `xyz`, e.g. `xyz.activeguard.cloud` ## Configure Entra ID 1. Go to [Entra ID Portal](https://entra.microsoft.com/) → **Overview** → copy the **Tenant ID** and keep it for future use. Your AAD Tenant ID 2. In the menu left, go to **App registrations** → select **All applications** → copy the **Application (client) ID** and keep it for future use. Application (client) ID 3. Open the `xorlab` app → **Certificates & secrets** → **Add a certificate or secret** in the list in the main view: Application certificates and secrets 4. Click **New client secret**: New client secret 5. Enter a description for the client secret and set the expiration time in the **Add a client secret** pane that shows up on the right. Click **Add**. **Expiration reminder** Please make sure to set a reminder for the secret expiration date, since there is no warning message or other information from M365 on the expiring secret. 6. Copy the **Value** of the secret and keep it for future use. This value is displayed only once. If you forget to copy the value or lose it, just delete this secret and create a new one. Secret value 7. Select **API permissions** from the left pane and click **Add a permission**: Adding an API permission for your app **Default permission** There can be a default `User.Read` permission already added to your app. It can be left there. 8. Choose **Microsoft Graph**: Selecting Microsoft Graph API 9. Click **Application permissions**: Application permissions 10. Available permissions grouped in categories are displayed. Use the search field to filter the permissions: * Filter for `mail` and check the box next to `Mail.ReadWrite` Selecting mail permissions * Filter for `user.read` and check the box next to `User.Read.All` Selecting user permissions 11. Click **Add permissions**. On the main **API Permissions** page, you should see the three new permissions granted. Click the **Grant admin consent for…** button above the list to apply the permissions change. New permissions for your app ## Configure xorlab 1. In xorlab, open the **Admin** view in the upper right. If you have more than one tenant, select the one you want to activate case isolation for in the dropdown. 2. Open **Integrations**, and add the *Tenant ID*, *Application (client) ID* and *Client Secret* value from before to the **Credentials** section and save it. M365 credentials 3. Go back to the Expert Editor and open the file `shared/guarded_tenants.yml`. 4. Enable case isolation for the corresponding tenant by adding these two lines: ```yaml shared/guarded_tenants.yml {5-6} theme={null} tenants: - name: domains: - caseIsolation: enabled: true ``` 5. Click **Publish**. Within about one minute, case isolation will be active for that tenant. ## Next steps * [Move M365 Quarantine to xorlab](/latest/m365-move-quarantine) # Create Entra ID App Source: https://docs.xorlab.com/latest/m365-entra-id-app Register the mandatory xorlab app in Entra ID for M365 SAML login and optional case isolation or retrospective scanning. Create a basic app for xorlab in Entra ID before enabling the required [SAML Login](/latest/m365-saml-entra-authentication). The same app is also used for optional [Case Isolation](/latest/m365-case-isolation) and [Retrospective Email Scanning](/latest/m365-retrospective-email-scanning). 1. Log in to the [Entra ID Portal](https://entra.microsoft.com). 2. Go to *Enterprise Application* via the search: Selecting an enterprise application 3. Click **New application**: New application 4. Click **Create your own application**. Enter `xorlab` as name. Select **Integrate any other application you don’t find in the gallery**: Create your own application 5. Click **Create**. The application is now available under **App registrations** → **All applications**. ## Next steps Continue with the mandatory SAML login first: * [SAML Login](/latest/m365-saml-entra-authentication) Then enable the protection mode for your tenant, which is also mandatory: * Either [M365 Monitoring Mode](/latest/m365-monitoring-mode) or [M365 Inline Mode](/latest/m365-inline-mode) The app created here is also used by these optional steps: * [Retrospective Email Scanning](/latest/m365-retrospective-email-scanning) — run this *before* the tenant goes inline, as it is not supported for inline tenants * [Case Isolation](/latest/m365-case-isolation) # Enable M365 Inline Mode Source: https://docs.xorlab.com/latest/m365-inline-mode Put xorlab in the Microsoft 365 delivery path so it can block and quarantine. Your MX records stay untouched. The integration is done via mail flow rules and connectors. **Prerequisites** * Complete [Before You Begin](/latest/before-begin-integration) and [Set Up Email Routing in xorlab](/latest/m365-smtp) * Have access to [Exchange Admin Center](https://admin.exchange.microsoft.com/) * Know your xorlab smart host and the domain name on the xorlab MTA certificate, e.g. `mx.xyz.activeguard.cloud` and `*.xyz.activeguard.cloud` * Have the value for the `x-xor-tenant-token` header, which both mail flow rules set ## Choose how to configure it Both paths create the same two connectors and the same two mail flow rules. Pick one. Run one script that asks for your values. Mail flow rules need to be activated manually. The same configuration manually in the web interface. Use it if you prefer to see each setting before you apply it. ## Quick integration with PowerShell One script creates both connectors and both mail flow rules. It asks for your values, shows a summary and changes nothing until you confirm. You need the **Exchange Administrator** role and the `ExchangeOnlineManagement` module. Run it either in a PowerShell window on your own machine or in the Azure Cloud Shell. Run these once, in a PowerShell window on your own machine. Everything installs for your user account only, so you do not need local administrator rights: ```powershell wrap theme={null} Install-PackageProvider -Name NuGet -Force -Scope CurrentUser Install-Module ExchangeOnlineManagement -Scope CurrentUser -Force -AllowClobber Set-ExecutionPolicy RemoteSigned -Scope CurrentUser Import-Module ExchangeOnlineManagement -Force ``` 1. Download the script with the command on [Script Downloads](/latest/script-downloads#exchange-online-setup-script), which requires you to log in. Run that command in your PowerShell window, then come back here and start the script. If you are not signed in to Exchange Online yet, a sign-in window opens first. In the Azure Cloud Shell, the script shows a code instead: open [microsoft.com/devicelogin](https://microsoft.com/devicelogin) in any browser tab and enter it there: ```powershell wrap theme={null} ./xorlabExoSetup.ps1 -Mode Inline ``` If one of the connectors or rules already exists in your tenant, the script stops without changing anything. 2. Answer the prompts: | Prompt | What to enter | | :- | :- | | Smart host | The full MX domain of your xorlab MTAs, for example `mx.xyz.activeguard.cloud`. The script looks up the xorlab MTA IPs from it. | | Certificate domain | The domain name on the xorlab MTA certificate, which M365 verifies, for example `*.xyz.activeguard.cloud`. | | Header value | The value both mail flow rules write into the `x-xor-tenant-token` header. | | Scope | `org` applies the rules to the whole organization. `test` limits them to one mailbox; see [Test with one mailbox first](#test-with-one-mailbox-first). | | Test mailbox | Only for `test`: the mailbox you test with. | | Validation mailbox | A company mailbox that receives the connector validation email. Defaults to the test mailbox. | 3. Check the summary and confirm with `y`. The script then: * creates the `xorlabToMicrosoft365` and `Microsoft365Toxorlab` connectors * validates `Microsoft365Toxorlab` and summarizes the result * creates the `IncomingToxorlab` and `OutgoingToxorlab` mail flow rules, **disabled** In the validation summary, the connectivity check should succeed. The test email can fail at this point; if it does, validate the connector again in the Exchange Admin Center once the mail flow rules are enabled. The Exchange Admin Center shows the connector as not validated until you validate it there. 4. Enable both rules: ```powershell wrap theme={null} Enable-TransportRule -Identity "IncomingToxorlab" Enable-TransportRule -Identity "OutgoingToxorlab" ``` This is the step that puts xorlab in the delivery path. It can take several minutes until the rules are active. Test them by sending an incoming and an outgoing email. If M365 rejects emails from xorlab afterward, or files them as junk, see [Troubleshooting](#troubleshooting). To remove the connectors and mail flow rules again, run `./xorlabExoSetup.ps1 -Mode Inline -Remove`. ### Test with one mailbox first With the `test` scope, each rule gets one extra condition on top of its organization-wide ones: `IncomingToxorlab` matches only email **to** the test mailbox, and `OutgoingToxorlab` only email **from** it. All other email keeps its normal mail flow. When you are done testing, remove that condition and the same rules apply to the whole organization. Either delete it in the Exchange Admin Center under **Mail flow** → **Rules** — **The recipient** → **is this person** on the incoming rule, **The sender** → **is this person** on the outgoing one — or run: ```powershell wrap theme={null} Set-TransportRule -Identity "IncomingToxorlab" -SentTo $null Set-TransportRule -Identity "OutgoingToxorlab" -From $null ``` ## Manual integration in the Exchange Admin Center ### Create xorlab to M365 connector This connector makes sure that M365 will accept emails from xorlab. 1. Go to [Exchange Admin Center](https://admin.exchange.microsoft.com/) → **Connectors** → add a connector: Add a connector 2. **Connection from** → **Your organization’s email server**: New connector 3. Set the name to `xorlabToMicrosoft365` and enable **Retain internal Exchange email headers**: Connector name 4. Choose **By verifying that the subject name…** and add `*.xyz.activeguard.cloud` where `xyz` is your customer ID: Authenticating sent email 5. **Create connector**. ### Create M365 to xorlab connector This connector makes sure that all emails are routed through xorlab. 1. Create a new connector. 2. **Connection from** → **Office 365**, and **Connection to** → **Your organization’s email server**: New connector from M365 3. Set the name to `Microsoft365Toxorlab` and enable **Retain internal Exchange email headers**: Connector name from M365 4. Select **Only when I have a transport rule set up…**: Use of connector 5. Add a new smart host with the value `mx.xyz.activeguard.cloud`, where `xyz` is your customer ID: Routing 6. Activate **Always use Transport Layer Security…** and select **Issued by a trusted certificate authority (CA)**: Security restrictions 7. Enter a company mailbox where a validation email should be sent to: Validation email **Unsuccessful validation** The connector validation might fail at this point. If this happens, save the connector without validation, create the mail flow rule in the next section and then validate the connector again. 8. Review the connector and click **Create** when it’s OK. ### Create mail flow rules Here we create mail flow rules that use the connector from above. The mail flow rules make sure that there is no loop between xorlab and M365. 1. Go to [Exchange Admin Center](https://admin.exchange.microsoft.com/) → **Mail flow** → **Rules** and create a new rule: Creating a new rule 2. Configure the rule like this: * **Name:** `IncomingToxorlab` * **Apply this rule if** → **The sender** → **is external/internal** → **Outside the organization** * Click the plus icon (`+`) to add another condition * **And** → **The recipient** → **is external/internal** → **Inside the organization** * **Do the following** → **Redirect the message to** → **the following connector** → choose **Microsoft365Toxorlab** * Click the plus icon (`+`) to add another action * **And** → **Modify the message properties** → **set a message header** → set `x-xor-tenant-token` to your header value * **Except if** → **The sender** → **IP address is in any of these ranges...** → add all IPs of the xorlab MTAs (find them in the DNS A records of `mx.xyz.activeguard.cloud`) New rule 3. Click through **Next** → **Finish** and leave all settings at their defaults. 4. Repeat steps #2-3 to add another rule but this time set: * **Name:** `OutgoingToxorlab` * **The sender** → **Inside the organization** * **The recipient** → **Outside the organization** * **Except if** → **The sender** → **IP address is in any of these ranges...** → the same xorlab MTA IPs as in step #2 * Click the plus icon (`+`) to add another exception * **The message properties** → **Automatic Reply** Outgoing rule 5. Enable both rules in the **Rules** page. 6. It can take several minutes until the rule is active. Test it by sending an incoming and outgoing email. ## Troubleshooting Apply the following measures only if you experience deliverability issues between M365 and xorlab. Normally, they are not necessary. ### M365 rejects emails from xorlab If M365 rejects some legitimate emails from xorlab, there are multiple measures. Apply them in order written below until the problem is fixed. First, add your xorlab domain as an “[accepted domain](https://learn.microsoft.com/en-us/exchange/mail-flow-best-practices/manage-accepted-domains/manage-accepted-domains)”. 1. Go to [Microsoft 365 Admin Center](https://admin.microsoft.com/) → **Settings** → **Domains** and add a domain: add-domain 2. Enter `xyz.activeguard.cloud`, where `xyz` is your customer ID: Add a domain name 3. Select the first option **Add a text record…**: Domain verification method 4. Send the TXT value to [support@xorlab.com](mailto:support@xorlab.com) so that we can add it to the DNS record of your domain. After this has been done, **verify**: Domain verification data 5. After a successful verification, click **More options** and select **Skip and do this later**: Domain skip and do this later If that does not help, you can add xorlab to your SPF records. You can add the xorlab MTAs to your SPF records. For this, include `a:mx.xyz.activeguard.cloud` to all your domains that route emails via xorlab: ```shell theme={null} dig +short TXT customer.tld "v=spf1 a:mx.xyz.activeguard.cloud include:spf.protection.outlook.com -all" ``` Afterward, check that your SPF records are still valid, for example with DMARCanalyzer’s [SPF checker](https://www.dmarcanalyzer.com/spf/checker/). If adding xorlab to your SPF record did also not help, you can add xorlab to the anti-spam policy of M365. 1. Go to [**Anti-spam policies**](https://security.microsoft.com/antispam) and select **Connection filter policy (Default)**: Anti-spam policies 2. Click **Edit connection filter policy**: Connection filter policy 3. Enter the xorlab MTA IPs to the first field: Allowed IPS for connection cilter 4. Check if the addresses are correct under **IP Allow list** and click **Close**. ### M365 puts emails from xorlab into Junk The following mail flow rule will bypass the M365 spam filtering for emails coming from xorlab. Note that this will mostly disable the Junk folder mechanism for your mailboxes. 1. Go to [Exchange Admin Center](https://admin.exchange.microsoft.com/) → **Mail flow** → **Rules** and create a new rule: Creating a new rule 2. Configure the rule like this: * **Name:** `SpamBypassxorlab`. * **Apply this rule if** → **The sender** → **IP address is in any of these ranges...** → add all IPs of the xorlab MTAs * Click the plus icon (`+`) to add another condition * **And** → **The message properties** → **include an SCL greater than or equal to** → **Bypass spam filtering** * **Do the following** → **Modify the message properties** → **set the spam confidence level (SCL)** → **Bypass spam filtering** Bypass spam filtering actions 3. Click through **Next** → **Finish** and leave all settings at their defaults. 4. Enable the rule in the **Rules** page. ## Next steps Optionally continue with: * [Activate Case Isolation](/latest/m365-case-isolation) * [Move M365 Quarantine to xorlab](/latest/m365-move-quarantine) * [Integrate M365 Reported Emails](/latest/m365-reporting-integration) Once the integration is complete, continue with [What to Configure Next](/latest/integration-next-steps). # M365 Overview Source: https://docs.xorlab.com/latest/m365-integration-overview The complete ordered step list for integrating xorlab with Microsoft 365. **Prerequisites** * Complete [Before You Begin](/latest/before-begin-integration) Your MX records stay with Microsoft: every step below is a connector, a mail flow rule or an app registration inside your own tenant. See [Review What Changes in Your Environment](/latest/integration-impact#microsoft-365) for the full list, including what stays untouched and how to undo it. | Step | Description | | :- | :- | | [Set Up Email Routing in xorlab](/latest/m365-smtp) | **Mandatory**. Configure xorlab to accept and forward emails with your M365 tenant. | | [Create Entra ID App](/latest/m365-entra-id-app) | **Mandatory**. Create the xorlab app in Entra ID. This is required for the mandatory Entra ID SAML login and is also used by Case Isolation and Retrospective Email Scanning. | | [Enable SAML Login](/latest/m365-saml-entra-authentication) | **Mandatory**. Allow single sign-on (SSO) via Entra ID. | | [Import Past M365 Emails](/latest/m365-retrospective-email-scanning) | **Optional**. Import historical emails during onboarding to speed up the learning phase. | | Enable either M365 [Monitoring](/latest/m365-monitoring-mode) or [Inline](/latest/m365-inline-mode) mode | **Mandatory**. In Monitoring mode, M365 sends just copies of emails to xorlab. In Inline mode, M365 routes emails via xorlab for active protection. See [Before you begin](/latest/before-begin-integration#choose-between-inline-and-monitoring-mode) and below for more information. | | [Activate Case Isolation](/latest/m365-case-isolation) | **Optional**. Allow removing emails from mailboxes after they have been delivered. | | [Move M365 Quarantine to xorlab](/latest/m365-move-quarantine) | **Optional**. Make sure that users only need to use the xorlab quarantine. This instructs M365 to send malicious emails to xorlab instead of quarantining them itself. | | [Integrate M365 Reported Emails](/latest/m365-reporting-integration) | **Optional**. Integrate the Abuse Mailbox with xorlab such that reported emails are handled by xorlab. | ## Inline mode diagrams In Inline mode, xorlab filters all emails and sends the benign ones back to M365 for final delivery. M365 Inline mode [Open the M365 Inline mode guide](/latest/m365-inline-mode) ## Monitoring mode diagrams In Monitoring mode, xorlab receives only a copy of every email and discards it after processing. M365 Monitoring mode [Open the M365 Monitoring mode guide](/latest/m365-monitoring-mode) ## Multi-Tenancy If you integrate more than one M365 tenant with the same xorlab instance, follow [Add a Tenant](/latest/multi-tenancy-new-tenant) instead of the table above. It uses the same guides, but adds the per-tenant configuration around them: * Configure the domains and routing of the tenant with the [M365 topology](/latest/multi-tenancy-domain-and-routing#m365-topology). * Set up SAML per tenant, see [Enable Tenant Login](/latest/multi-tenancy-authentication). * Assign reported emails to the right tenant, see [Assign Reported Emails to Tenants](/latest/multi-tenancy-reported-emails). # Enable M365 Monitoring Mode Source: https://docs.xorlab.com/latest/m365-monitoring-mode Set up out-of-band observation in Microsoft 365. In this mode xorlab analyzes traffic and still decides on it, but cannot intervene in your mail flow. M365 sends a copy of every incoming and outgoing email to xorlab. **Prerequisites** * Complete [Before You Begin](/latest/before-begin-integration) and [Set Up Email Routing in xorlab](/latest/m365-smtp) * Have access to [Exchange Admin Center](https://admin.exchange.microsoft.com/) * Know your xorlab smart host and monitoring address, e.g. `mx.xyz.activeguard.cloud` and `monitor@mx.xyz.activeguard.cloud` * Have the value for the `x-xor-tenant-token` header, which both mail flow rules set * Using BCC monitoring sends an additional copy of each email to xorlab, which can lead to hitting the external recipients rate limit (tenant ERRL) of Microsoft Exchange. * You can monitor how close you are to the limit under: **Reports → Mail flow → Outbound external recipients** ## Choose how to configure it Both paths create the same connector and the same two mail flow rules. Pick one. Run one script that asks for your values. Mail flow rules need to be activated manually. The same configuration manually in the web interface. Use it if you prefer to see each setting before you apply it. ## Quick integration with PowerShell One script creates the connector and both mail flow rules. It asks for your values, shows a summary and changes nothing until you confirm. You need the **Exchange Administrator** role and the `ExchangeOnlineManagement` module. Run it either in a PowerShell window on your own machine or in the Azure Cloud Shell. Run these once, in a PowerShell window on your own machine. Everything installs for your user account only, so you do not need local administrator rights: ```powershell wrap theme={null} Install-PackageProvider -Name NuGet -Force -Scope CurrentUser Install-Module ExchangeOnlineManagement -Scope CurrentUser -Force -AllowClobber Set-ExecutionPolicy RemoteSigned -Scope CurrentUser Import-Module ExchangeOnlineManagement -Force ``` 1. Download the script with the command on [Script Downloads](/latest/script-downloads#exchange-online-setup-script), which requires you to log in. Run that command in your PowerShell window, then come back here and start the script. If you are not signed in to Exchange Online yet, a sign-in window opens first. In the Azure Cloud Shell, the script shows a code instead: open [microsoft.com/devicelogin](https://microsoft.com/devicelogin) in any browser tab and enter it there: ```powershell wrap theme={null} ./xorlabExoSetup.ps1 -Mode Monitoring ``` If the connector or one of the rules already exists in your tenant, the script stops without changing anything. 2. Answer the prompts: | Prompt | What to enter | | :- | :- | | Smart host | The full MX domain of your xorlab MTAs, for example `mx.xyz.activeguard.cloud`. | | Monitoring address | The address that receives the copies. Defaults to `monitor@` followed by the smart host. The connector only carries mail to this address’s domain. | | Header value | The value both mail flow rules write into the `x-xor-tenant-token` header. | | Scope | `org` applies the rules to the whole organization. `test` limits them to one mailbox; see [Test with one mailbox first](#test-with-one-mailbox-first). | | Test mailbox | Only for `test`: the mailbox you test with. | 3. Check the summary and confirm with `y`. The script then: * creates the `Microsoft365Toxorlab` connector * validates it with a test email to the monitoring address and summarizes the result * creates the `IncomingBCCxorlab` and `OutgoingBCCxorlab` mail flow rules, **disabled** In the validation summary, both the connectivity check and the test email should succeed. If one fails, the script continues anyway; validate the connector again later in the Exchange Admin Center. It shows as not validated there until you do, because `Validate-OutboundConnector` does not record its result on the connector. 4. Enable both rules: ```powershell wrap theme={null} Enable-TransportRule -Identity "IncomingBCCxorlab" Enable-TransportRule -Identity "OutgoingBCCxorlab" ``` From then on, M365 sends a copy of every incoming and outgoing email to xorlab. It can take several minutes until the rules are active. To remove the connector and mail flow rules again, run `./xorlabExoSetup.ps1 -Mode Monitoring -Remove`. ### Test with one mailbox first With the `test` scope, each rule gets one extra condition on top of its organization-wide ones: `IncomingBCCxorlab` matches only email **to** the test mailbox, and `OutgoingBCCxorlab` only email **from** it. No copies are sent for any other email. When you are done testing, remove that condition and the same rules apply to the whole organization. Either delete it in the Exchange Admin Center under **Mail flow** → **Rules** — **The recipient** → **is this person** on the incoming rule, **The sender** → **is this person** on the outgoing one — or run: ```powershell wrap theme={null} Set-TransportRule -Identity "IncomingBCCxorlab" -SentTo $null Set-TransportRule -Identity "OutgoingBCCxorlab" -From $null ``` ## Manual integration in the Exchange Admin Center ### Create mail flow rule 1. Go to [Exchange Admin Center](https://admin.exchange.microsoft.com/) → **Mail flow** → **Rules** and create a new rule: Creating a new rule 2. Configure the rule like this: * **Name:** `IncomingBCCxorlab` * **Apply this rule if** → **The sender** → **is external/internal** → **Outside the organization** * Click the plus icon (`+`) to add another condition * **And** → **The recipient** → **is external/internal** → **Inside the organization** * **Do the following** → **Add Recipients** → **to the Bcc box** → enter `monitor@mx.xyz.activeguard.cloud`, where `xyz` is your customer ID * Click the plus icon (`+`) to add another action * **And** → **Modify the message properties** → **set a message header** → set `x-xor-tenant-token` to your header value Rule settings for incoming emails 3. Click through **Next** → **Finish** and leave all settings at their defaults. 4. Repeat steps #2-3 to add another rule but this time set: * **Name:** `OutgoingBCCxorlab` * **The sender** → **Inside the organization** * **The recipient** → **Outside the organization** Rule settings for outgoing emails 5. Enable both rules in the **Rules** page. Now, a copy of every incoming and outgoing email will be sent to xorlab. ### Create a connector In addition to the mail flow rule above, we need to create a connector to make sure the emails are sent directly to xorlab. We recommend to always create a connector to ensure proper email delivery. However, you can omit the connector if the following two conditions are met: * You do not have any other connectors that might interfere with the BCC emails sent to xorlab. * You do not have a hybrid MS setup with an on-prem-only email delivery (*Centralized Mail Transport*). 1. Go to [Exchange Admin Center](https://admin.exchange.microsoft.com/) → **Connectors** → add a connector: Add a connector 2. **Connection from** → **Office 365**, and **Connection to** → **Your organization’s email server**: New connector from O365 3. Set the name to `Microsoft365Toxorlab` and enable **Retain internal Exchange email headers**: Connector name from M365 4. Choose the third option and enter `mx.xyz.activeguard.cloud`, where `xyz` is your customer ID. Click the plus (`+`) icon: Use of connector 5. Add a new smart host with the value `mx.xyz.activeguard.cloud`, where `xyz` is your customer ID: Routing 6. Activate **Always use Transport Layer Security…** and select **Issued by a trusted certificate authority (CA)**: Security restrictions *Security restrictions* 7. Enter a company mailbox where a validation email should be sent to: Validation email **Unsuccessful validation** The connector validation might fail at this point. If this happens, save the connector without validation, and then validate the connector again. 8. Review the connector and click **Create** when it’s OK. ## Optional: Include internal emails Per default, xorlab only processes incoming and outgoing emails. However, if you want to include also internal emails, do the following: * Remove one of the two mail flow rules from above * Rename the existing one to `BCCxorlab` * Change **Apply this rule if** to **Apply to all messages** and remove the **And** condition Configuring the monitor rule Now, a copy of every email will be sent to xorlab. ## Next steps Optionally continue with: * [Activate Case Isolation](/latest/m365-case-isolation) * [Move M365 Quarantine to xorlab](/latest/m365-move-quarantine) * [Integrate M365 Reported Emails](/latest/m365-reporting-integration) Once the integration is complete, continue with [What to Configure Next](/latest/integration-next-steps). # Move M365 Quarantine to xorlab Source: https://docs.xorlab.com/latest/m365-move-quarantine Move the Microsoft 365 quarantine to xorlab so end users have a single quarantine, including the known limitations. **Prerequisites** * Complete [Before You Begin](/latest/before-begin-integration) and [Set Up Email Routing in xorlab](/latest/m365-smtp) * Have either [M365 Monitoring Mode](/latest/m365-monitoring-mode) or [M365 Inline Mode](/latest/m365-inline-mode) enabled * Have access to the [Microsoft Defender portal](https://security.microsoft.com) with permission to edit anti-spam policies **Limitation** Although you can force M365 to pass quarantined emails to xorlab, the ones recognized as malware or high-confidence phishing cannot be moved out of M365 quarantine. 1. Go to [the Anti-spam settings page](https://security.microsoft.com/antispam) → open **Anti-spam Inbound policy (Default)**: Anti-spam policies 2. Scroll down the pane until you see the **Edit actions** link: Edit anti-spam actions 3. Select **Add X-header** from the drop-down list for: * **Spam** * **High-confidence spam** * **Phishing** * **Bulk complaint level (BCL) met or exceeded** In the **Add this X-header text**, enter `x-eopmarkedspam` (this value is required by xorlab): Anti-spam actions 4. Click **Save**. By default, xorlab recognizes the EOP header and assigns the `#eopmarkedspam` tag to the email. This tag increases the likelihood that the email will be classified as spam. To reduce false positives, these emails are not automatically quarantined. If desired, you can create a campaign that automatically quarantines all emails tagged with `#eopmarkedspam`. ## Next steps * [Integrate M365 Reported Emails](/latest/m365-reporting-integration) # Integrate M365 Abuse Mailbox Source: https://docs.xorlab.com/latest/m365-reporting-integration Connect the built-in Microsoft 365 reporting button to xorlab so reported emails appear in xorlab and reporters receive feedback. **Prerequisites** * Complete [Before You Begin](/latest/before-begin-integration) and [Set Up Email Routing in xorlab](/latest/m365-smtp) ## Prepare xorlab 1. Open `shared/guarded_tenants.yml` and add all email address patterns that are allowed to report emails. ```yaml guarded_tenants.yml {4-6} theme={null} tenants: - name: example emailReporting: authorizedEmailReportRecipients: - .*@xorlab\.com - .*@xorlab\.net ``` 2. Choose if you want to enable or disable automatic feedback. If enabled, every reporter will get an immediate feedback email. ```yaml guarded_tenants.yml {4,5} theme={null} tenants: - name: example ruleProfiles: # REMOVE this line - no_auto_feedback.properties ``` ```yaml guarded_tenants.yml {4,5} theme={null} tenants: - name: example ruleProfiles: # ADD this line - no_auto_feedback.properties ``` 3. Optional: Change the sender address used for feedback emails: [Change Sender Address](/latest/email-template-sender-addresses#feedback-emails). 4. Click **Publish**. The new configuration becomes active within about one minute. ## Forward M365 reported emails to xorlab You need a dedicated mailbox in M365 that receives reported emails. If you don't have one, create one like `reporting@example.com` first. Both paths below require it. Both paths configure the same user reported settings and the same mail flow rule. Pick one. Run one script that asks for your values. The mail flow rule needs to be activated manually. The same configuration manually in the Microsoft Defender portal and the Exchange Admin Center. Use it if you prefer to see each setting before you apply it. ### Quick integration with PowerShell The script configures the user reported settings and creates the mail flow rule. Run it either in a PowerShell window on your own machine or in the Azure Cloud Shell. You need **Exchange Administrator** role for the mail flow rule, **Security Administrator** role for the user reported settings and the `ExchangeOnlineManagement` Powershell module. Run these once, in a PowerShell window on your own machine. Everything installs for your user account only, so you do not need local administrator rights: ```powershell wrap theme={null} Install-PackageProvider -Name NuGet -Force -Scope CurrentUser Install-Module ExchangeOnlineManagement -Scope CurrentUser -Force -AllowClobber Set-ExecutionPolicy RemoteSigned -Scope CurrentUser Import-Module ExchangeOnlineManagement -Force ``` 1. Download the script with the command on [Script Downloads](/latest/script-downloads#exchange-online-setup-script). Run that command in your PowerShell window, then come back here and start the script. If you are not signed in to Exchange Online yet, a sign-in window opens first. In the Azure Cloud Shell, the script shows a code instead: open [microsoft.com/devicelogin](https://microsoft.com/devicelogin) in any browser tab and enter it there: ```powershell wrap theme={null} ./xorlabExoSetup.ps1 -Mode Reporting ``` If the `xorlabReportingIntegration` rule already exists in your tenant, the script stops without changing anything. 2. Answer the prompts: | Prompt | What to enter | | :- | :- | | Internal mailbox | Your internal mailbox where you can receive reported emails, for example `reporting@example.com`. It must already exist. | | Destination | `mailbox` sends reported emails to your reporting mailbox only. `both` sends them to Microsoft as well. | | xorlab reporting address | The address xorlab receives reported emails on, for example `suspicious@mx.xyz.activeguard.cloud`. | 3. Check the summary and confirm with `y`. The summary also shows the reporting mailbox that is configured now, which the script replaces. The script then: * turns on **Monitor reported messages in Outlook** and sends reported emails to your reporting mailbox, and to Microsoft if you chose `both` * creates the `xorlabReportingIntegration` mail flow rule, **disabled** 4. Enable the rule, then [test the integration](#test-the-integration): ```powershell wrap theme={null} Enable-TransportRule -Identity "xorlabReportingIntegration" ``` To remove the mail flow rule again, run `./xorlabExoSetup.ps1 -Mode Reporting -Remove`. The user reported settings stay as they are. ### Manual integration in the admin portals 1. In the [M365 Defender portal](https://security.microsoft.com/) go to **Settings** → **Email & collaboration** → **User reported settings**. Or directly via [User submissions](https://security.microsoft.com/securitysettings/userSubmission). 2. Activate **Monitor reported messages in Outlook**. 3. Scroll down to **Reported message destinations** and add your reporting mailbox to the mailbox field. Choose either **My reporting mailbox only** or **Microsoft and my reporting mailbox** in the dropdown. Email address for reported messages 4. Click **Save**. 5. Go to [Exchange Mail Flow](https://admin.exchange.microsoft.com/#/transportrules) and create a new rule with the name `xorlabReportingIntegration`: * **Apply this rule if** → **The recipient** → **is this person** and select your reporting mailbox. * **Do the following** → **Redirect the message to** → enter the xorlab reporting address `suspicious@mx.xyz.activeguard.cloud`, where `xyz` is your customer ID. Reporting rule conditions 6. Click **Next** until **Finish**, then **Done**. 7. Enable the new rule. ## Test the integration 1. Report an email via the M365 built-in button. It is available in the web interface as well as in Outlook. 2. In xorlab, go to **Abuse Mailbox** → **All Cases** and there you should see the reported email. It can take up to 30 seconds to appear. 3. If you enabled **automatic feedback** in the beginning, you should receive a feedback email within 30 seconds. ## How to change the reporting address The default address under which xorlab will listen for reported emails is `suspicious@`, with `templateDomain` referring to the parameter that's set in `active_guard.yml`. If you like to customize the sender address, add the following block (if it does not already exist) to the `active_guard.yml` file: ```yaml active_guard.yml {7} theme={null} scanSources: smtp: port: 10025 handler: smtpReport: # Default. corresponds to the parameter templateDomain in active_guard.yml emailAddress: suspicious@ ``` Afterward, click **Publish**. The `scanSources` handler settings become active within about one minute. ## How to automate reported email handling For further information about automation, have a look at [Abuse Mailbox](/latest/abuse-mailbox#auto-resolve-cases). ## How "Not Junk" reports are handled When you integrate M365 reporting, xorlab adds one of the following tags to each reported email: * `#reportedasnotjunk` for messages reported as **Not Junk** * `#reportedasjunk` for messages reported as **Junk** * `#reportedasphishing` for messages reported as **Phishing** Default behavior: * **Not Junk**: the case is automatically resolved as `benign` by `REPORTED_NOT_JUNK_decision`, no acknowledgment email is sent, and the `#reportedasnotjunk` tag is added. * **Junk/Phishing**: the corresponding tag is added, acknowledgment is sent (if enabled), and the case is handled by normal reported-email analysis. `REPORTED_NOT_JUNK_decision` is evaluated before campaigns, so these cases are auto-resolved before campaign rules are applied. To disable this auto-resolve behavior and return to normal reported-email handling, set the rule state to `PASSIVE` in `/activeguard/core/rule_sets/90_local/params/local.properties`: ```shell local.properties theme={null} # Disable auto-resolve for M365 "Not Junk" reports REPORTED_NOT_JUNK_decision_state=PASSIVE ``` Then click **Publish**. The rule-set configuration becomes active within about one minute. ## Multi-Tenancy Repeat this integration for each M365 tenant. In addition, xorlab needs to know which tenant a reported email belongs to, which is decided by a header on the carrier email: Add the `x-ag-tenant` header so that reported emails end up in the right tenant. Note that `local.properties` above applies to all tenants. To change this behavior for a single tenant only, see [Manage Tenant Rules](/latest/multi-tenancy-rules#tenant-specific-parameters). ## Next steps The M365 integration is complete: * [What to Configure Next](/latest/integration-next-steps) # Import Past M365 Emails Source: https://docs.xorlab.com/latest/m365-retrospective-email-scanning Backfill the relationship and reputation models from mailbox history, so protection is effective sooner after go-live. Import past emails from M365 and pushes them through xorlab for analysis (Retrospective Email Scanning). This is intended as a one-time onboarding step for a new tenant or customer. It can only be used for domains that are not already inline with xorlab. ## What you achieve With Retrospective Email Scanning, you can: * Import past emails from M365 for one tenant * Speed up the initial learning phase * Observe imported emails in the normal xorlab message view Imported emails are processed similarly to live emails. In the message list, the **Received** date remains the original date of the message, not the import date. ## Before you start 1. Add your tenant to `shared/guarded_tenants.yml`. An example can be found [here](/latest/before-begin-integration#configure-your-guarded-domains). 2. Customize detection for that tenant. For standard onboardings, this only includes adding list entries: [Configure built-in lists](/latest/detection-overview#configure-built-in-lists). 3. Complete [Create Entra ID App](/latest/m365-entra-id-app). ## Configure Microsoft Graph permissions Set up Microsoft permissions: 1. Follow exactly as described in [Configure Entra ID for Case Isolation](/latest/m365-case-isolation#configure-entra-id). If you have done that already for case isolation, then this step is not necessary anymore. **Same credentials as case isolation** Retrospective Email Scanning uses the same Graph credentials as [Case Isolation](/latest/m365-case-isolation). The application must include these permissions: * `Mail.Read` * `User.Read.All` The Graph credential is currently shared between the Retrospective Email Scanning and Case Isolation. If you also use Case Isolation, `Mail.Read` must be replaced with `Mail.ReadWrite`. ## Add the Graph credentials in xorlab 1. Open the **Admin** view in xorlab. 2. Select the tenant for which you want to run the import. 3. Open **Microsoft 365**. 4. Add the *Tenant ID*, *Application (client) ID*, and *Client Secret* in the **Credentials** section. 5. Save the credentials. M365 credentials ## Start a new import 1. Open **Admin → Microsoft 365** for the tenant. **Choose a tenant** If you have more than one tenant, you need to select one of them in the dropdown on top. 2. Click on **New Import**. M365 import 3. Enter a name for the import. 4. Set the time range to **3 months**. Depending on the situation, this can be increased or decreased. However, for proper learning at least one month is required. For a quick test, you can choose a short time range of 1 hour. 5. Start the import. **Tenant data reset** Starting a new import job removes all past email data of that tenant. 6. After the import is through, you can continue with the normal M365 onboarding by either activating [Inline](/latest/m365-inline-mode) or [Monitoring](/latest/m365-monitoring-mode). ## Additional information The below chapters provide more information about the Retrospective Email Scanning itself. ### Important behavior **Tenant data reset** Starting an import job wipes the tenant data before the import begins. This includes result publication, trust values, reputation values, and related learned state. xorlab then starts from a clean slate for that tenant. Only emails from the tenant domains defined in `shared/guarded_tenants.yml` are imported. If a guarded domain contains a pattern, xorlab strips the pattern and uses the base domain instead. Example: * `*.xorlab.com` becomes `xorlab.com` ### Watch the import progress An import job can have the following active states: * `INDEXING`: xorlab is indexing the messages to be imported * `IMPORTING`: xorlab is importing and processing the messages An import job can finish in the following states: * `COMPLETED` * `FAILED` * `CANCELED` While a job is in the `IMPORTING` state, xorlab shows a progress bar in percent. ### Pause, resume, or cancel a job * Jobs in the `IMPORTING` phase can be paused and resumed * Jobs in the `INDEXING` phase cannot be paused * If you want to stop a job during `INDEXING`, cancel it ### Restrictions * Retrospective Email Scanning is not supported for tenants with active mail flow. In multi-tenant environments, tenants not affected by the import may still have mail flow activated * The Sandbox is always disabled for imported messages, even if it is enabled elsewhere ### Required permissions The following xorlab user permissions are required for Retrospective Email Scanning. The built-in `xcc_admin` role contains those already: * `xcc_mail_import_update`: create, pause, resume, and cancel import jobs * `xcc_mail_import_read`: view the status of import jobs For details on custom roles and permissions, see [Create a Custom Role](/latest/create-custom-user-role). ### Related log events The log events for Retrospective Email Scanning are the `mail_import` ones in [Log Events](/latest/logging-events). To forward them, start at [Logging Overview](/latest/logging-overview). ## Next steps * Either [M365 Monitoring Mode](/latest/m365-monitoring-mode) or [M365 Inline Mode](/latest/m365-inline-mode) # Enable Entra ID SAML Login Source: https://docs.xorlab.com/latest/m365-saml-entra-authentication Wire Entra ID to xorlab as a SAML identity provider, so analysts, admins or end-users sign in with their Microsoft account. **Prerequisites** * Complete [Create Entra ID App](/latest/m365-entra-id-app) * Have access to [Entra ID Portal](https://entra.microsoft.com) with one of these roles: Cloud Application Administrator, Application Administrator, or owner of the service principal. * Know your customer ID `xyz`, e.g. `xyz.activeguard.cloud` If you want to enable a different login mechanism like for example LDAP, have a look at [Authentication Overview](/latest/authentication-overview). ## Activate SAML in Entra ID 1. Go to [Entra ID Portal](https://entra.microsoft.com) → **Enterprise apps** → click on the `xorlab` app. 2. Open **Single sign-on**: Set up single sign-on 3. Choose **SAML**. 4. Edit the **Basic SAML Configuration**: Edit the basic SAML configuration 5. Add an **Identifier** and a **Reply URL** entry, where `xyz` is your customer ID. SAML configuration | Input field name | URL | | :- | :- | | Identifier (Entity ID) | `https://xyz.activeguard.cloud/auth/saml2/service-provider-metadata/entraSaml` | | Reply URL (Assertion Consumer Service URL) | `https://xyz.activeguard.cloud/auth/saml2/sso/entraSaml` | The `entraSaml` part of both URLs is the **SAML backend name**. You will need to use **exactly the same name** later when configuring the SAML authentication in xorlab. Each SAML backend must have a unique name. If you are configuring multiple SAML providers in a multi-tenant deployment, use unique names that identify the tenant (e.g `nameSAML`). 6. **Save** and click **No, I’ll test it later**. 7. Copy and save the App Federation Metadata URL from **SAML Certificates**, you will need it later. App Federation Metadata ## Configure users and roles in Entra ID 1. Go to [Entra ID Portal](https://entra.microsoft.com) → **App registrations** → **All applications** → click on the `xorlab` app. App registrations 2. Click on **App roles** and then **Create app role**: Create app role 3. Create three new app roles via **Create app role**. The optional ones can be omitted if they are not needed. | Display Name | Value | Required? | | :- | :- | :- | | Administrator | `entra_xor_admin` | Mandatory | | Analyst | `entra_xor_analyst` | Optional | | Quarantine user | `entra_xor_quarantine_user` | Optional | App role configuration panel 4. Open the **Enterprise apps** menu on the left side, choose again the `xorlab` app and click on **Assign users and groups**: Assign users and groups 5. Click on **Add user/group**: Add user/group 6. Add the users or groups who need access to xorlab and assign them one of the three created roles Administrator, Analyst or Quarantine user. **Group assigning is only available in the Microsoft Entra ID P1+ license.** ## Activate SAML on xorlab Now that you have the Entra ID configured, we will set up xorlab accordingly. 1. Open the file `auth/auth/auth.yml` and add a SAML backend. ```yaml auth.yml theme={null} enabledAuthBackends: # Add this to the list of enabled backends. If you put it as first entry, it will be the new default. - entraSaml saml2AuthBackends: entraSaml: idp: # Enter the App Federation Metadata URL from Entra ID metadataUrl: https://login.microsoftonline.com/***************************** attributeMapping: displayName: attr('http://schemas.microsoft.com/identity/claims/displayname') emails: attr('http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name') roles: attr('http://schemas.microsoft.com/ws/2008/06/identity/claims/role') ``` **If you rename `entraSaml`, make sure to update the Identifier and Reply URL in Entra ID SAML configuration above.** 2. Enter the **App Federation Metadata Url** you copied before for the `metadataUrl` key. 3. Map your Entra ID roles to xorlab roles by adding a `roleMapping`. More information about xorlab roles can be found at [Built-in User Roles](/latest/built-in-user-roles) ```yaml auth.yml {14-27} theme={null} enabledAuthBackends: - entraSaml saml2AuthBackends: entraSaml: idp: # Enter the App Federation Metadata Url from M365 metadataUrl: https://login.microsoftonline.com/***************************** attributeMapping: displayName: attr('http://schemas.microsoft.com/identity/claims/displayname') emails: attr('http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name') roles: attr('http://schemas.microsoft.com/ws/2008/06/identity/claims/role') # Add your Entra ID roles to every xorlab role that is required. roleMapping: xcc_admin: - entra_xor_admin xcc_monitor: - entra_xor_admin xcc_analyst: - entra_xor_analyst xcc_insights: - entra_xor_admin - entra_xor_analyst xcc_quarantine_user: - entra_xor_admin - entra_xor_analyst - entra_xor_quarantine_user ``` The following example shows how to do a role pass-through without role mapping. In general this is not recommended because it is more error prone. However if you do it, make sure to: * Specify all xorlab roles in Entra ID (including `xcc_insights` and `xcc_monitor`) and assign them to your users * Provide only xorlab related roles in the SAML token to avoid an excessive token size ```yaml auth.yml {14} theme={null} enabledAuthBackends: - entraSaml saml2AuthBackends: entraSaml: idp: # Enter the App Federation Metadata Url from M365 metadataUrl: https://login.microsoftonline.com/***************************** attributeMapping: displayName: attr('http://schemas.microsoft.com/identity/claims/displayname') emails: attr('http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name') roles: attr('http://schemas.microsoft.com/ws/2008/06/identity/claims/role') # Specify PASS_THROUGH, otherwise xorlab will only consider roles that match the role mapping roleMappingMode: PASS_THROUGH ``` 4. Click **Publish**. The authentication configuration becomes active within about one minute. 5. Now the SAML integration is done and you can test the login with the link `https://xyz.activeguard.cloud/?_agAuthBackend=entraSaml`. Replace `xyz` with your customer ID. **Custom trust store** In case your xorlab configuration uses a custom trust store, you will also have to add the [DigiCert Global Root CA certificate](https://cacerts.digicert.com/DigiCertGlobalRootCA.crt.pem) when integrating SAML with Azure Active Directory. Please follow the steps described in [Certificate configuration](/latest/authentication-certificates). ## Next steps Enable the protection mode for your tenant: * Either [M365 Monitoring Mode](/latest/m365-monitoring-mode) or [M365 Inline Mode](/latest/m365-inline-mode) Optionally, before going inline, import your existing emails: * [Import Past M365 Emails](/latest/m365-retrospective-email-scanning) # Enable Shared Mailbox Script for M365 Source: https://docs.xorlab.com/latest/m365-shared-mailbox-script Set the Entra ID attribute that tells xorlab which shared mailboxes each Self-Service Quarantine user may access. When shared mailboxes are being used, xorlab needs to know, which mailboxes to include for which [Self-Service Quarantine](/latest/ssq-overview) users. This can be accomplished by setting an attribute in Entra ID, which is read by xorlab via the SAML integration. For on-premises setups the process will differ. ## Pre-requisites * **Global Administrator Role on Entra ID** Performing the following operations will require administrator privilege on your Microsoft Entra ID and Exchange Admin portal. * **xorlab Entra ID Application** Ensure that an xorlab enterprise application and application registration has been created, which should have been done during the [Create Entra ID App](/latest/m365-entra-id-app). * **Postman or access to Graph Explorer** To create the extension property, necessary to store the shared mailboxes, you will need the Postman software with an account (free) or an access to the Graph Explorer. **Using API tools with admin credentials** It is strongly recommended that sensitive credentials are stored only locally and not uploaded to cloud accounts, such as Postman. ## Configure your xorlab App Registration Open the [Azure Portal](https://portal.azure.com/), search for the xorlab *App Registration* created during the [Create Entra ID App](/latest/m365-entra-id-app). 1. From the left hand sidebar navigate to **Manage → Certificates & secrets → Client Secrets** and create a temporary client secret. You will need it later for creating a custom extension property. 2. Create a PKCS#12 certificate (.pfx) by following the official Microsoft guide below. As a result, you should have two certificate files: `.cer` and `.pfx`. Make sure to take note of the certificate password. **Certificate creation on Windows** Follow the steps from [Create a self-signed public certificate to authenticate your application](https://learn.microsoft.com/en-us/entra/identity-platform/howto-create-self-signed-certificate) including the optional "Export your public certificate with its private key" section. 3. Upload the public certificate `.cer` into **Certificates** in *App Registration* section. 4. Once the certificate is uploaded, navigate to the **API permissions**, and add the following application permissions: ```txt API permissions theme={null} Microsoft APIs → Microsoft Graph: User.Read.All User.ReadWrite.All Group.ReadWrite.All Application.Read.All Application.ReadWrite.All Application.ReadWrite.OwnedBy API my organization uses -> Office 365 Exchange Online: Exchange.ManageAsApp ``` 5. Make sure that the permissions are granted admin consent (**Grant admin consent for ...**). 6. Assign the **Exchange Administrator** role to the xorlab App Registration: 1. Navigate to **Microsoft Entra ID → Roles and administrators**. 2. Search for the **Exchange Administrator** administrative role in the search bar and open it. 3. Use the **Add assignments** button. Exchange Administrator Role ## Create the custom extension property To create this property, you will have to use the Graph API. We prepared a Postman collection containing the requests needed. Copy the collection below, save it as `ExtensionProperty_cheatsheet.postman_collection.json`, and import it into Postman with **Import**. The IDs are collection variables, not values: set `tenantID`, `clientID`, `appID`, `objectID` and `userID` on the collection's **Variables** tab before you run a request. ```json ExtensionProperty_cheatsheet.postman_collection.json theme={null} { "info": { "_postman_id": "6f9a433f-92a5-49c7-8774-beb231bab7ca", "name": "ExtensionProperty cheatsheet", "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json", "_exporter_id": "4674986" }, "item": [ { "name": "Optional", "item": [ { "name": "Delete custom property", "request": { "auth": { "type": "bearer", "bearer": [ { "key": "token", "value": "{{GraphAPIToken}}", "type": "string" } ] }, "method": "DELETE", "header": [], "body": { "mode": "raw", "raw": "", "options": { "raw": { "language": "json" } } }, "url": { "raw": "https://graph.microsoft.com/v1.0/applications/{{appID}}/extensionProperties/{{objectID}}", "protocol": "https", "host": [ "graph", "microsoft", "com" ], "path": [ "v1.0", "applications", "{{appID}}", "extensionProperties", "{{objectID}}" ] } }, "response": [] }, { "name": "Set mailboxes for a user", "request": { "auth": { "type": "bearer", "bearer": [ { "key": "token", "value": "{{GraphAPIToken}}", "type": "string" } ] }, "method": "PATCH", "header": [], "body": { "mode": "raw", "raw": "{\n \"extension_4f24edfca6384790ae9e4eea5a0363d7_xorlab\": [\"test@yourdomain.ch\", \"test2@yourdomain.ch\"]\n}\n", "options": { "raw": { "language": "json" } } }, "url": { "raw": "https://graph.microsoft.com/v1.0/users/{{userID}}", "protocol": "https", "host": [ "graph", "microsoft", "com" ], "path": [ "v1.0", "users", "{{userID}}" ] } }, "response": [] } ] }, { "name": "Get a token", "request": { "method": "POST", "header": [], "body": { "mode": "formdata", "formdata": [ { "key": "client_id", "value": "{{clientID}}", "type": "text" }, { "key": "client_secret", "value": "{{clientSecret}}", "type": "text" }, { "key": "redirect_uri", "value": "localhost", "type": "text" }, { "key": "grant_type", "value": "client_credentials", "type": "text" }, { "key": "scope", "value": "https://graph.microsoft.com/.default", "type": "text" } ] }, "url": { "raw": "https://login.microsoftonline.com/{{tenantID}}/oauth2/v2.0/token", "protocol": "https", "host": [ "login", "microsoftonline", "com" ], "path": [ "{{tenantID}}", "oauth2", "v2.0", "token" ] } }, "response": [] }, { "name": "Create custom property", "request": { "auth": { "type": "bearer", "bearer": [ { "key": "token", "value": "{{GraphAPIToken}}", "type": "string" } ] }, "method": "POST", "header": [], "body": { "mode": "raw", "raw": " {\n \"name\": \"xorlab\",\n \"isMultiValued\": \"true\",\n \"targetObjects\": [\n \"User\"\n ]\n }", "options": { "raw": { "language": "json" } } }, "url": { "raw": "https://graph.microsoft.com/v1.0/applications/{{objectID}}/extensionProperties", "protocol": "https", "host": [ "graph", "microsoft", "com" ], "path": [ "v1.0", "applications", "{{objectID}}", "extensionProperties" ] } }, "response": [] } ], "variable": [ { "key": "tenantID", "value": "tenantID" }, { "key": "clientID", "value": "clientID" }, { "key": "appID", "value": "appID" }, { "key": "objectID", "value": "objectID" }, { "key": "userID", "value": "userID" }, { "key": "GraphAPIToken", "value": "GraphAPIToken" } ] } ``` **In case you can't download Postman** In case you can’t have access to Postman, you can also use the Graph Explorer. Make sure to have the necessary Application rights and run a POST query on this endpoint: `https://graph.microsoft.com/v1.0/applications/**REPLACE WITH OBJECT ID**/extensionProperties` In the body section, you will have to insert this: ```json theme={null} { "name": "xorlab", "isMultiValued": "true", "targetObjects": [ "User" ] } ``` 1. Import the collection into your Postman software. 2. In the **Collection > Variables** section, ensure that you are not syncing or sharing any sensitive variables — especially `GraphAPIToken` and `clientSecret`. The recommended approach is to store the token and any secrets as a secret variable in your local Postman Vault and reference it directly using `{{vault:secret-name}}` in your requests. This ensures the token remains secure and is not accidentally uploaded or shared. 3. In **Get a token** request, replace the different variables and use the request to get a token from Graph API. 4. In **Create custom property**, replace **GraphAPIToken** variable with the token returned by the previous request. You should now be able to run the Create custom property request, as a response you will get the property name, it should be: `extension_**clientID**_xorlab`. ## Run and automate the script in Azure Automation Azure provides the possibility to run PowerShell scripts directly in their system for a cheap price. We recommend using this option which save resources and implementation time. You will first need to create an Automation Account, you can do so by searching for **Automation Account** in the Azure Portal. During the creation, make sure the Managed Identities are *System Assigned* and that the networking is *Public Access* After the creation of the Automation Account, you have to activate *Try Runtime Environment Experience* by clicking the according button. Then, navigate into **Runtime environment** and create a new **PowerShell 7.2** environment. In this new runtime environment, add the following modules from the PowerShell Gallery: ``` - ExchangeOnlineManagement - Microsoft.Graph.Authentication - Microsoft.Graph.Users ``` Go back to your Automation Account and navigate in **Certificates**, here you will have to upload the `.pfx` certificate file created previously. The name of the certificate must be ‘cert’. You will be asked to enter the password of the certificate and select **Exportable** as **Yes**. **Wrong password** If Azure tells you that the password is incorrect, it can be due to a wrong certificate created. Double check that it is **PKCS#12** compliant. Once this is done, you will need to navigate to **Variables** and create some of them, based on the data you saved before: | Name | Type | Encrypted | Description | | - | - | - | - | | certificateThumb | string | No | The hexadecimal thumb of your certificate without '-' | | clientID | string | No | The client ID of your xorlab App Registration | | organization | string | No | The tenant domain of your organization (e.g contoso.corp) | | tenantID | string | No | The Azure tenant ID | | unifiedGroupsType | string | No | Define who will have access to the M365 unified groups, can be: ‘Members’ or ‘Owners’ | | extensionProperty | string | No | The extension property name created previously | Navigate to Runbooks and create a new runbook. Then, import the [shared mailboxes script](/latest/script-downloads#shared-mailboxes-script). Make sure your runbook is using your custom Runtime Environment previously created. Try to run your runbook, the final output should let you know some of the mailboxes updated. **There shouldn’t be any errors.** If you’re happy with the result, publish the runbook and schedule it on a regular basis (e.g each night) via the **Schedules** functionality. ## Use the new extension property in xorlab 1. In the Azure portal, search for the xorlab Enterprise Application 2. Navigate to **Single Sign On** 3. Edit **Attributes & Claims** 4. Add a new claim named `xorlabAddresses` (Namespace can be left empty) 5. Select **Directory Schema Extension** and find your xorlab App Registration 6. Select it and find the `user.xorlab` attribute 7. Save the changes and open your xorlab instance 8. In the Expert Editor, open the `auth.yml` file and search for your SAML configuration 9. Set the `emails:` property to ```yaml theme={null} emails: sortPrefixedList(attr('xorlabAddresses'), ":") ``` 10. Click **Publish**. The authentication configuration becomes active within about one minute. ## Maintenance Task – Updating an Expired Certificate Depending on the parameters used in the [Configure your xorlab App Registration](#configure-your-xorlab-app-registration), the certificate (both .pfx and .cer files) may expire after some time. When this happens, you’ll need to renew the certificate and upload the updated files to both App Registration and Azure Automation. ### Steps to Renew the Certificate #### App Registration * Repeat steps 2 and 3 from the [Configure your xorlab App Registration](#configure-your-xorlab-app-registration) section. * This will update the certificate at the App Registration level. #### Azure Automation * Go to your Automation Account>Shared Resources. * Navigate to Certificates. * Remove the existing certificate named `cert`. * Upload the newly created `.pfx` certificate file. * Ensure the certificate name is exactly cert. * Enter the certificate password. * Set Exportable to Yes. Once these steps are completed, your automation should resume functioning correctly. # Set Up Email Routing in xorlab Source: https://docs.xorlab.com/latest/m365-smtp Configure email routing and TLS enforcement on xorlab in preparation for the Microsoft 365 integration. **Prerequisites** * Complete [Before You Begin](/latest/before-begin-integration) ## Enforce TLS In `activeguard/mta/startup_cfg/postfix_custom/main.cf`, set the following parameters to enforce TLS on all connections. In SaaS, they are normally already configured like this. ```ini main.cf theme={null} smtpd_tls_cert_file = /etc/ssl/my_certs/my_cert.crt smtpd_tls_key_file = /etc/ssl/my_certs/my_cert.key smtp_tls_security_level = verify smtpd_tls_security_level = encrypt ``` If you had to change anything, click **Publish**. The new Postfix settings become active within about one minute. ## Route all emails to M365 1. Open `main.cf` in `activeguard/mta/startup_cfg/postfix_custom/`. 2. Set `relayhost` to `.mail.protection.outlook.com`. You find your `` in the M365 Exchange Admin Center under **Mail flow** → **Accepted domains**. ```ini main.cf theme={null} relayhost = .mail.protection.outlook.com ``` If for any reason you need to route your emails to different M365 regions, configure the following in addition: 1. For every domain that should be routed separately, add a corresponding entry in the `transport` and `sender_dependent_transport` file. ```text transport theme={null} xorlab.com smtp:xorlab-com.mail.protection.outlook.com xorlab.net smtp:xorlab-net.mail.protection.outlook.com ``` ```text sender_dependent_transport theme={null} @xorlab.com xorlab-com.mail.protection.outlook.com @xorlab.net xorlab-net.mail.protection.outlook.com ``` By default, subdomains need to be added separately. Please see [Subdomain matching](/latest/smtp-configuration#subdomain-matching) to change the default. 2. In `main.cf`, configure the following two lines: ```ini main.cf theme={null} # Activate recipient transport maps transport_maps = lmdb:/etc/postfix/transport # Activate sender transport maps sender_dependent_relayhost_maps = lmdb:/etc/postfix/sender_dependent_transport ``` When you finish editing the Postfix files, click **Publish**. The routing configuration becomes active within about one minute. ## Next steps * [Create Entra ID App](/latest/m365-entra-id-app) # Add Your Trusted Infrastructure Source: https://docs.xorlab.com/latest/on-prem-add-trusted-mtas Register your own email infrastructure as trusted so xorlab can trace the true origin of an email. More information and explanations about trusted infrastructure can be found under [Trusted MTAs](/latest/trusted-mtas). ## Add email servers 1. Open `shared/guarded_tenants.yml`. 2. Under `trustedMTAs`, add an entry for each email server that is part of your email infrastructure. You only need to add servers that do not use a private IP. ```yaml guarded_tenants.yml theme={null} tenants: - name: example # Add your servers either via IP OR via hostname. Servers with private IPs do not need to be added trustedMTAs: # Via IP in CIDR notation - hostCidrBlock: 1.2.3.4/32 - hostCidrBlock: 5.6.7.0/24 # Via hostname regex (matching the EHLO) - hostNamePattern: exchange\.example\.com - hostNamePattern: .*\.example\.com ``` 3. This step is only required if outgoing email sent to xorlab are not DKIM signed. For all of your Exchange servers, add an `authenticDomains` parameter that contains all your guarded domains. **Use `authenticDomains` only for servers that do not forward malicious emails. Do not use it for your gateway.** ```yaml guarded_tenants.yml highlight={6-8} theme={null} tenants: - name: example trustedMTAs: - hostNamePattern: exchange\.example\.com # Add all your guarded domains as regex authenticDomains: - example\.com - example\.net ``` `authenticDomains` will set all emails coming from that corresponding server as authentic. This is used to tell xorlab from which infrastructure you send outgoing emails. When you sign emails with DKIM, this is not required anymore. 4. Open the `activeguard/core/startup_cfg/spamass/local.cf` file and add the IP address of each of your email server that receives incoming emails before xorlab. This is only required for email servers that do not use a private IP address (RFC1918). ```shell local.cf theme={null} # Set which networks or MTAs are considered trusted trusted_networks 1.2/16 5/8 # all in 1.2.*.* and 5.*.*.* trusted_networks 212.17.35.15 # specific address trusted_networks 1. # all in 1.*.*.* ``` 5. Click **Publish**. The `guarded_tenants.yml` changes become active within about one minute. If you edited `local.cf` in step #4, [restart all MTAs](/latest/activate-configuration#configuration-files) as well, because files under `activeguard/core/startup_cfg/` require an MTA restart: ```shell theme={null} cd /etc/xorlab/activeguard docker compose down && docker compose up -d ``` ## Verify 1. Check that outgoing emails are marked as outgoing. For this, search for `from:*@guarded.com` and see if the direction is correct. Replace `guarded.com` with your primary guarded domain. 2. Open an incoming email in the detail view and check that the `IP` and `EHLO` are correct. They should contain the external sender, not your infrastructure. ## Next steps Optionally continue with: * [Enable SAML or LDAP Login](/latest/on-prem-saml-ldap-authentication) * [Integrate Reported Emails](/latest/on-prem-reporting-integration) Once the integration is complete, continue with [What to Configure Next](/latest/integration-next-steps). # Enable ESA Monitoring with BCC Source: https://docs.xorlab.com/latest/on-prem-esa-monitoring-mode Configure Cisco ESA message filters to BCC a copy of every email to xorlab for out-of-band monitoring. **Prerequisites** * Complete [Before You Begin](/latest/before-begin-integration) and [Set Up Email Routing in xorlab](/latest/on-prem-smtp) ## Message Filter The first step is to create a message filter that sends a BCC copy of all incoming and outgoing emails to xorlab. The following snippet shows such a message filter, assuming the ESA has different receive listeners for incoming and outgoing emails: ```text theme={null} ActiveGuardBCCEmails: if recv-listener == "" { insert-header("X-Original-Envelope-From","$EnvelopeFrom"); bcc-scan(""); } else { if recv-listener == "" { bcc-scan(""); } } ``` “xorlab Security Platform Email” corresponds to any email address with a domain that resolves to the xorlab MTAs. You can set it to `monitor@mx.xyz.activeguard.cloud`, for example. See the [DNS registration](/latest/vm-setup-guide#register-required-dns-records) section for details on how to set and configure your DNS records. Note that this rule adds the original envelope `FROM` to the BCC email, which is required by xorlab. If the BCC emails should be sent through a specific network interface, add an additional content filter like this (where `` corresponds to the desired network interface): ESA Content Filter *Content Filter to specify a network interface for the BCC emails* ## Bounce Profile Now, we need to create a bounce profile so that no bounce or warning messages are sent to the sender if a BCC email could not be delivered to xorlab: Bounce Profile *Bounce profile to disable bounce and warning messages* This bounce profile should be applied whenever an email is sent to xorlab. To this end, add a Destination Control for the domain used above in the xorlab Security Platform email address: Destination Controls *Apply the new Bounce Profile only to emails sent to xorlab Security Platform* ## Next steps * [Add Your Trusted Infrastructure](/latest/on-prem-add-trusted-mtas) # Enable Exchange Inline Source: https://docs.xorlab.com/latest/on-prem-exchange-inline Place xorlab in the Exchange delivery path using receive and send connectors, so it can block and quarantine. This applies to on-premises Microsoft Exchange 2016 or 2019. **Prerequisites** * Complete [Before You Begin](/latest/before-begin-integration) and [Set Up Email Routing in xorlab](/latest/on-prem-smtp) * For incoming emails, you must extend the receive connectors to accept emails from xorlab Security Platform. * For outgoing emails, you must add a new send connector pointing to xorlab Security Platform. ## Setting up the receive connector To extend the default receive connector to accept emails from xorlab: 1. Open Exchange Admin Center. 2. Under **Mail Flow** → **receive connectors**, select your Exchange server and edit the connector starting with **Default Frontend…**. 3. In the dialog, go to **Scoping** and, for each xorlab MTA in your setup, add its IP address as a new entry to **Remote network settings**. Scope of IP addresses 4. Click **Save**. ## Adding a new send connector To route all outgoing emails through xorlab Security Platform: 1. Go to Exchange Admin Center. 2. Under **Mail Flow** → **send connectors**, add a new connector. 3. Enter a name and choose **Custom**. Custom send connector 4. Click **Next**. 5. Choose the **Route email through smart hosts** option and add the domain names of all xorlab MTAs in your setup (the domain names—with DNS A records—corresponding to the IPs that you configured in **Setting up the receive connector**) as smart hosts. 6. Tick the checkbox to use external DNS lookup settings. Smart hosts for send connector 7. Click **Next**. 8. Leave the smart host authentication to **None**. TLS between xorlab and the Exchange server is enforced by xorlab (for incoming and outgoing emails). 9. Click **Next**. 10. Under **Address space**, add a new space and enter `*` as a domain. Click **Next**. Address space for email routing 11. Add your Exchange server as a source. Click **Finish**. ## Next steps * [Add Your Trusted Infrastructure](/latest/on-prem-add-trusted-mtas) # Enable Exchange Monitoring with BCC Source: https://docs.xorlab.com/latest/on-prem-exchange-monitoring-mode Configure Exchange to blind-copy traffic to xorlab, letting it analyze without sitting in the delivery path. This applies to on-premises Microsoft Exchange 2016 or 2019. xorlab will receive a copy of every incoming and outgoing email. **Prerequisites** * Complete [Before You Begin](/latest/before-begin-integration) and [Set Up Email Routing in xorlab](/latest/on-prem-smtp) ## Creating the mail flow rules ### Incoming emails First, we need to create a mail-flow rule that sends a copy of all incoming emails to xorlab Security Platform. 1. In the Exchange Control Panel, under **Mail Flow → Rules**, create a new rule. 2. After you enter the name for the rule, click the drop-down list under **Apply this rule if…** to expand it and choose **The sender is located…** and then **is external/internal**: Selecting the sender for the rule 3. In the **select sender location** input box that appears (if it doesn’t, click **Select one…** next to the list), select **Outside the organization** and click **OK**: Sender from outside of the organization 4. Click the drop-down list under **Do the following…** to expand it and choose **BCC the message to…** 5. A new browser tab/window opens where you can enter the xorlab Security Platform monitoring mailbox address, e.g., `monitor@mx.xyz.activeguard.cloud`. Your new rule should look like the one depicted below: Exchange rule for incoming emails 6. Click **Save**. ### Outgoing emails Now we need to create another mail-flow rule that sends a copy of all outgoing emails to xorlab Security Platform. Repeat the same steps as for incoming mails but, in step #2, select **The recipient is located…** in the first list. Now the rule should look like this: Exchange rule for outgoing emails After creating those two rules, a copy of all incoming and outgoing emails will be sent to xorlab. ## Internal emails In order to also send a copy of internal emails to xorlab Security Platform, the two mail-flow rules from above can be replaced with one single mail-flow rule that is applied to **all messages** (select this item from the list in step #2) as shown below. This step can be ignored if internal emails should not be forwarded to xorlab: Exchange rule for internal emails ## Considerations As mentioned above, in monitoring mode, xorlab Security Platform will not change the mail traffic in any way. However, if all xorlab MTAs are down or do not accept emails, it can lead to a growing email queue on the Exchange Server. If this happens, you should temporarily disable the BCC mail flow rules. ## Next steps * [Add Your Trusted Infrastructure](/latest/on-prem-add-trusted-mtas) # On-prem Overview Source: https://docs.xorlab.com/latest/on-prem-integration-overview The complete ordered step list for integrating xorlab with on-premises email infrastructure. **Prerequisites** * Complete [Before You Begin](/latest/before-begin-integration) Your MX records only change if xorlab replaces your existing gateway. See [Review What Changes in Your Environment](/latest/integration-impact#on-premises) for what each topology changes in your mail flow, what stays untouched and how to undo it. | Step | Description | | :- | :- | | [Set Up Email Routing in xorlab](/latest/on-prem-smtp) | **Mandatory**. Configure xorlab to accept and forward emails properly in your environment. | | Forward emails in **Monitoring** or **Inline** mode | **Mandatory**. In Monitoring mode, you send just copies of emails to xorlab. In Inline mode, you route emails via xorlab for active protection. See [Before you begin](/latest/before-begin-integration#choose-between-inline-and-monitoring-mode) and below for more information. Here we provide instructions for common systems.

*Monitoring*: [Cisco ESA](/latest/on-prem-esa-monitoring-mode) or [Exchange](/latest/on-prem-exchange-monitoring-mode)
*Inline*: [Exchange](/latest/on-prem-exchange-inline)

If your system is not listed—for example Cisco ESA in Inline mode, or any other MTA—contact [support@xorlab.com](mailto:support@xorlab.com) and we will guide you through the setup. | | [Add Your Trusted Infrastructure](/latest/on-prem-add-trusted-mtas) | **Mandatory**. Configure your trusted email infrastructure in xorlab to allow proper detection. | | [Enable SAML or LDAP Login](/latest/on-prem-saml-ldap-authentication) | **Optional**. Allow SAML-based or LDAP-based user login to xorlab. | | [Integrate Reported Emails](/latest/on-prem-reporting-integration) | **Optional**. Integrate the Abuse Mailbox such that reported emails are handled by xorlab. | ## Inline mode diagrams In Inline mode, xorlab filters all emails and sends the benign ones to the next hop. Depending on if xorlab is the gateway or an add-on, the integration looks different. Simple on-premises gateway integration [Gateway setup guide](/latest/on-prem-smtp#configure-as-inline-gateway) Advanced on-premises gateway integration [Gateway setup guide](/latest/on-prem-smtp#configure-as-inline-gateway) On-premises Exchange add-on integration [Add-on setup guide](/latest/on-prem-smtp#configure-as-inline-add-on) ## Monitoring mode diagrams In Monitoring mode, xorlab receives only a copy of every email and discards it after processing. The copy can be setup either on the gateway or on the Exchange server. **Evaluation** If you plan to evaluate xorlab as an add-on to an existing solution, setup the BCC on the Exchange server. In this way you can quickly evaluate the additional security that xorlab provides on top. BCC monitoring from a gateway [Monitoring setup guide](/latest/on-prem-smtp#configure-for-monitoring) BCC monitoring from Exchange [Monitoring setup guide](/latest/on-prem-smtp#configure-for-monitoring) The diagrams show Exchange and a generic gateway, but the interface is plain SMTP: any other MTA or secure email gateway can take the place of the gateway shown. See [Advanced SMTP Configurations](/latest/smtp-configuration) for multiple next hops, per-domain routing, and TLS enforcement. ## Multi-Tenancy If you protect more than one organization with the same xorlab instance, follow [Add a Tenant](/latest/multi-tenancy-new-tenant) instead of the table above. It uses the same guides, but adds the per-tenant configuration around them: * Configure the domains and routing of the tenant with the topology that matches your setup, see [Configure Tenant Domains and Routing](/latest/multi-tenancy-domain-and-routing). * Set up SAML or LDAP per tenant, see [Enable Tenant Login](/latest/multi-tenancy-authentication). * Configure the trusted infrastructure per tenant or in a shared config template, see [Trusted MTAs In-Depth](/latest/trusted-mtas). * Assign reported emails to the right tenant, see [Assign Reported Emails to Tenants](/latest/multi-tenancy-reported-emails). # Integrate On-prem Abuse Mailbox Source: https://docs.xorlab.com/latest/on-prem-reporting-integration Route user-reported suspicious mail from a self-hosted mail system into the Abuse Mailbox, with automated replies. You will be able to view all reported emails in xorlab and send feedback to the reporters. **Prerequisites** * Complete [Before You Begin](/latest/before-begin-integration) and [Set Up Email Routing in xorlab](/latest/on-prem-smtp) If you have a hybrid M365 setup and all your mailboxes are hosted in M365, follow [Integrate M365 Reported Emails](/latest/m365-reporting-integration) instead. ## Prepare xorlab 1. Open `shared/guarded_tenants.yml` and add all email address patterns that are allowed to report emails. ```yaml guarded_tenants.yml {4-6} theme={null} tenants: - name: example emailReporting: authorizedEmailReportRecipients: - .*@xorlab\.com - .*@xorlab\.net ``` 2. Choose if you want to enable or disable automatic feedback. If enabled, every reporter will get an immediate feedback email. ```yaml guarded_tenants.yml {4,5} theme={null} tenants: - name: example ruleProfiles: # REMOVE this line - no_auto_feedback.properties ``` ```yaml guarded_tenants.yml {4,5} theme={null} tenants: - name: example ruleProfiles: # ADD this line - no_auto_feedback.properties ``` 3. Optional: Change the sender address used for feedback emails: [Change Sender Address](/latest/email-template-sender-addresses#feedback-emails). 4. Click **Publish**. The new configuration becomes active within about one minute. ## Forward reported emails to xorlab Reported emails need to be forwarded as **EML** attachment to a dedicated email address on xorlab: `suspicious@`. The `templateDomain` property can be found in `activeguard/core/active_guard.yml`. The actual implementation of the forwarding depends on your setup. Choose the one that fits your environment. You have a dedicated mailbox where users in your organization can report emails to. They need to manually forward the reported email as attachment to that mailbox. **Forwarding:** In your Exchange, create a mail flow rule that forwards all email from that mailbox to xorlab at `suspicious@`. If you need the emails still in that mailbox, you can send xorlab just a BCC copy of the emails instead. You have a third party button in place that your users use for reporting emails. **Forwarding:** Most buttons allow you to add an additional recipient to the reported emails. Add `suspicious@`. If that is not possible, create a mail flow rule on Exchange as described under "Manual reporting mailbox". There is no reporting button and no dedicated reporting mailbox available. **Forwarding:** We recommend that you acquire a third party reporting button that allows your users to report emails. xorlab partners with multiple reporting button providers. Contact [support@xorlab.com](mailto:support@xorlab.com) for more information. ## How to change the reporting address The default address under which xorlab will listen for reported emails is `suspicious@`, with `templateDomain` referring to the parameter that's set in `active_guard.yml`. If you like to customize the sender address, add the following block (if it does not already exist) to the `active_guard.yml` file: ```yaml active_guard.yml {7} theme={null} scanSources: smtp: port: 10025 handler: smtpReport: # Default. corresponds to the parameter templateDomain in active_guard.yml emailAddress: suspicious@ ``` Afterward, click **Publish**. The `scanSources` handler settings become active within about one minute. ## How to automate reported email handling For further information about automation, have a look at [Abuse Mailbox](/latest/abuse-mailbox#auto-resolve-cases). ## Multi-Tenancy Repeat this integration for each tenant. In addition, xorlab needs to know which tenant a reported email belongs to, which is decided by a header on the carrier email and not by the reporting address: Add the `x-ag-tenant` header so that reported emails end up in the right tenant. ## Next steps The on-premises integration is complete: * [What to Configure Next](/latest/integration-next-steps) # Enable On-prem SAML/LDAP Login Source: https://docs.xorlab.com/latest/on-prem-saml-ldap-authentication Enable SAML or LDAP login for on-premises deployments. SAML is recommended for a smoother single sign-on experience. For an overview over all supported authentication methods, have a look at [Authentication Overview](/latest/authentication-overview). ## Enable SAML login If you have Entra ID from Microsoft, follow that guide. Otherwise have a look at the generic SAML integration. Follow this guide to authenticate your users via Entra ID. Replace any occurrences of `xyz.activeguard.cloud` with the domain of your XCC. This guide provides general instructions on how to enable SAML-based user login for xorlab. ## Enable LDAP login See [Enable LDAP Login](/latest/authentication-ldap) for generic instructions on how to enable LDAP-based user login for xorlab. ## Next steps * [Integrate Reported Emails](/latest/on-prem-reporting-integration) # Set Up Email Routing in xorlab Source: https://docs.xorlab.com/latest/on-prem-smtp Set up email routing on xorlab for on-premises integration, with a guide for each target architecture. **Prerequisites** * Complete [Before You Begin](/latest/before-begin-integration) Follow one guide of the following that fits your target architecture: Default. xorlab is located between your gateway and exchange server. xorlab is the gateway and receives/sends emails from/to the internet. xorlab receives only a copy of every email, and discards it after processing. ## Configure as Inline add-on As Inline add-on, xorlab will: * Deliver incoming emails to `` (usually an Exchange server) * Deliver outgoing emails to `` (the Gateway) Follow these steps: 1. Go to `activeguard/mta/startup_cfg/postfix_custom/` in the Expert Editor. 2. Open `main.cf` and enable `transport_maps`: ```ini main.cf theme={null} transport_maps = lmdb:/etc/postfix/transport ``` 3. Open `transport`. Create it if it does not exist. Add a line for every guarded domain with `` and one line for all outgoing emails with ` xorlab.net smtp: # Outbound emails * smtp: ``` By default, subdomains need to be added separately. Please see [Subdomain matching](/latest/smtp-configuration#subdomain-matching) to change the default. You can specify fallbacks if the first destination is not reachable: `smtp:[1.2.3.4],[2.2.2.2]`. 4. Open `client_access` and add the IP of every email server that will send emails to xorlab: ```ini client_access theme={null} # Permit this IP to send emails to xorlab permit permit # You can also permit domains. The domain name is determined by means of a reverse DNS lookup and automatically extends to subdomains. example.com permit ``` 5. Click **Publish**. The inline add-on configuration becomes active within about one minute. ## Configure as Inline gateway As Inline gateway, xorlab will: * Deliver incoming emails to `` (usually an Exchange server) * Deliver outgoing emails directly to the external recipient Follow these steps: 1. Go to `activeguard/mta/startup_cfg/postfix_custom/` in the Expert Editor. 2. Open `main.cf` and enable `transport_maps`: ```ini main.cf theme={null} transport_maps = lmdb:/etc/postfix/transport ``` 3. In `main.cf`, add all guarded domains as `relay_domains`: ```ini main.cf theme={null} # Only add domains to the relay_domains, this will automatically include subdomains as well # xorlab will accept emails to these domains from every IP relay_domains = xorlab.com, xorlab.net ``` 4. Open `transport`. Create it if it does not exist. Add a line for every guarded domain with ``: ```ini transport theme={null} # Inbound emails xorlab.com smtp: xorlab.net smtp: ``` By default, subdomains need to be added separately. Please see [Subdomain matching](/latest/smtp-configuration#subdomain-matching) to change the default. You can specify fallbacks if the first destination is not reachable: `smtp:[1.2.3.4],[2.2.2.2]`. 5. Open `client_access` and add the IP of every email server that will send emails to xorlab: ```ini client_access theme={null} # Permit this IP to send emails to xorlab permit permit # You can also permit domains. The domain name is determined by means of a reverse DNS lookup and automatically extends to subdomains. example.com permit ``` 6. Click **Publish**. The inline gateway configuration becomes active within about one minute. ## Configure for Monitoring In Monitoring Mode, xorlab discards all received emails. Here we configure the routing for emails that are generated by xorlab itself (for example feedback notifications). 1. Go to `activeguard/mta/startup_cfg/postfix_custom/` in the Expert Editor. 2. Specify the relay destination in the `main.cf` file: ```ini main.cf theme={null} ## Route all emails to this host relayhost = relay.host.com ``` 3. Open `client_access` and add the IP of every email server that will send emails to xorlab: ```ini client_access theme={null} # Permit this IP to send emails to xorlab permit permit # You can also permit domains. The domain name is determined by means of a reverse DNS lookup and automatically extends to subdomains. example.com permit ``` 4. Click **Publish**. The monitoring configuration becomes active within about one minute. ## Next steps Forward emails to xorlab in the mode you chose: * *Monitoring*: [Cisco ESA](/latest/on-prem-esa-monitoring-mode) or [Exchange](/latest/on-prem-exchange-monitoring-mode) * *Inline*: [Exchange](/latest/on-prem-exchange-inline) # Phishing Simulation Source: https://docs.xorlab.com/latest/phishing-simulation-tools Allow simulated phishing emails from awareness training services to reach inboxes unfiltered. There’s a myriad of services allowing you to launch simulated cyber attacks against your organization and measure its awareness of email-borne threats. To make sure that simulated emails reach the inbox of your staff, consult the documentation of a respective service and include its infrastructure, sender address, or sender domain in the Simulation lists. xorlab Security Platform will mark simulated attacks with `verdict:simulation` if the distinctive mark of a service is known. Log in to xorlab, navigate to **Settings → Lists → Simulation**, and add the distinctive mark of your simulation service to the appropriate list. Emails matching a Simulation list entry are treated as benign, bypassing all other threat analysis. Sender address, sender domain, MTA EHLO, and x-mailer header are all values an attacker can forge, so configuring simulation matching on these increases your attack surface to impersonation. **We recommend using MTA IP (regex) wherever your simulation service supports it**, since the connecting IP is much harder for an attacker to spoof than a header value. | List name | Description | Accepted entries | | :- | :- | :- | | **Sender address** | Use this list if your simulation service uses designated sender addresses.
No authentication is required | Email address as `String`, e.g., `awareness@myfakedomain.com`
Matches Header FROM and Envelope FROM | | **Sender domain** | Use this list if your simulation service uses a designated sender domain.
No authentication is required | Sender domain as `String`, e.g., `myfakedomain.com`
Matches Header FROM and Envelope FROM | | **MTA EHLO (regex)** | Use this list if your simulation service sends simulated attacks from designated host names | Host names as `Regex`, e.g., `*.\.awarenesstool\.com`
Please be aware that the email needs to contain EHLO or EHLO IP for this verification to work | | **MTA IP (regex)** | Use this list if your simulation service sends simulated attacks from designated IPs | IP records as `Regex`, e.g., `192\.168\.1\..`
Please be aware that the email needs to contain EHLO or EHLO IP for this verification to work | | **x-mailer header (regex)** | Use this list if your simulation service adds a designated x-mailer header to simulated attack emails.
Note that all emails matching any entries in this list will be marked as simulation | Header content as `Regex`, e.g., `Tool v5\..` | # Quick Walkthrough Source: https://docs.xorlab.com/latest/quick-walkthrough A hands-on tour of the most important xorlab features. Read the core concepts first. If you prefer to watch a video instead, have a look at [Video Tutorials ](/latest/video-tutorials). We recommend to have read the [Core Concepts](/latest/concepts-overview) before starting with the walkthrough here. In 15 minutes, you will cover the basics of using xorlab: * How to search for emails * Create your first campaign * Using the similarity search * Give feedback to a reported email ## Search an email The search is very powerful and one of the key tools in xorlab. The full search syntax can be found under [Search](/latest/search). 1. Open the **Messages** menu on the left. 2. Search for all sender addresses that contain the word `notification`: Open the **Sender** filter, switch the dropdown to **contains** and add `notification`. If you don't get any results, you can choose any other word. Sender search 3. Refine the search further by adding some [Tags](/latest/tags) to only match incoming emails from untrusted senders: `#untrusted #inc`. You can add as many tags as you want. By default, they are ANDed. Sender search tags 4. All filters can be replaced by text search. The following gives the same results as above: Sender search tags text 5. You can further play around using for example: * `(topic:invoice OR topic:accountissue) #newsender`: Unknown senders that send emails about invoices or account issues * `#untrusted #vbascript`: Emails from untrusted senders with VBA script * `#partner #encryptedarchive`: Emails from partners that contain an encrypted archive 6. Save your search for later use with the button on the right side. You can find all your saved searches in the **Saved Searches** menu. Saved searches ## Create a campaign Campaigns allow you to define an action for all emails that match a search query. It is an easy tool to react to missed threats or false positives. Campaigns work only forward-looking, and do not affect past emails. For an in-depth guide about Campaigns, check out [Using Campaigns](/latest/campaigns). 1. Create a new search query that will be the basis of the campaign: `#youngsender #newsender topic:packagedelivery`. This will find all emails from recently registered domains that talk about package delivery. 2. Click on the campaign button on the right side in the search. Create campaign 3. Enter a descriptive campaign name. 4. Under **Message Action**, you can choose the action that should be applied to all emails that will match this search from now on. Choose **None** for now, in this way the campaign will be passive and not have any impact. The **Resolve Action** can also be left as **None** as it affects only [Reported Emails](/latest/abuse-mailbox). Create campaign dialog **Deliver** Be careful when using the Deliver action. It will overwrite all built-in detection mechanisms. It is normally only used in a very narrow scope to address false positives. 5. After saving, you can find your new campaign in the **Campaign** menu on the left. The switch in the upper right provides different views for convenience. Campaign overview 6. If you want to activate the campaign, you can set the **Message Action** any time later to **Quarantine**. ## Using the similarity search The similarity search allows to group emails based on different parameters. For example, a phishing wave might use different sender addresses and subjects, but you can still group them based on content similarity. 1. In the **Messages** menu, click on any email in the list to open the [Detail View](/latest/understand-verdict). 2. Open the **SIMILAR** tab. This will show you all emails with a similar content. The first email highlighted in blue is the one that you opened in the detail view. Similar view **Content similarity** The content similarity uses fuzzy hashing of the email body to group emails. It is robust such that one can change several words of an email and even re-arrange paragraphs and it will still group them together. The false positive rate is generally very low for emails with enough text (above 30-40 words). 3. If your email does not have any results based on content similarity, you can use one of the other built-in groupings like **Same Sender**. The number in brackets shows the amount of matches. * When choosing another grouping, you need to disable the **Content similar** search, otherwise they will be ANDed. Similar view 2 4. When you found a grouping that works for you, you can create again a saved search or even a campaign with the two icons on the right side in the search bar. 5. The search bar here supports the same searches as the default one in the **Messages** menu. For example, you can refine the built-in groupings with normal search queries. In this example we grouped the emails based on display name and restricted it via search `verdict:phishing` to only phishing emails. Similar view 3 ## Give feedback to a reported email **Prerequisites** * This chapter is only applicable if you use the [Abuse Mailbox](/latest/abuse-mailbox) feature of xorlab. * You need at least one already reported email in xorlab. Here we show how you find the user reported emails and give feedback to the reporter. 1. Open the **Abuse Mailbox** menu on the left and choose **All Cases**. This will show all reported emails xorlab received. Abuse Mailbox 2. The search bar on top works in the same way as the ones we've seen in the previous chapters. Optional: You can additionally use the `reporter:` keyword to search for specific internal reporters. 3. Click on an email where the **STATUS** on the right side is `OPEN`. 4. You will see the same detail view as before, but additionally you have **Resolve** buttons in the upper right. Click on **Resolve as Spam**. Abuse Mailbox detail view 5. Under **Feedback Template** you can select what feedback the reporter should get. Keep it as *Spam*. Add a custom **Comment**, and click on **Resolve**. Abuse Mailbox dialog **Attaching the reported email** When you select a benign verdict (shown as green in the search), xorlab will attach the reported email as EML to the feedack email. For malicious emails, this is not the case. 6. A few seconds later, the reporter will now get a feedback email like this. The comment is added in the lower half of the email: Abuse Mailbox feedback # Reporting a Misclassification Source: https://docs.xorlab.com/latest/reporting-misclassification Report a false positive or false negative to xorlab so that the detection can be corrected. Suppose a message was mistakenly quarantined but is benign (false positive) or was delivered although it shouldn’t have been (false negative). You can report a misclassification in various locations: We show here how to report the misclassification of an arbitrary email: 1. Open the email in the detail view 2. Click the three dots in the upper right and choose **Report Misclassification**: Report misclassification from menu 3. In the new dialog, choose the **Expected verdict** and select the severity of the issue with the slider (see the [guide below](#severity-levels) to pick the right level) Report misclassification 4. Optional: Add a comment clarifying the reason for this misclassification report. **Report locations** Besides the above shown way, you can also report a misclassification whenever you: * Release an email from the quarantine * Isolate an email * Resolve a reported email The corresponding dialogs offer a **Report misclassification** checkbox. ## Severity levels Please follow these guides to find the severity level that fits your case best: ### Reporting a misclassified malicious email | Level | Description | | :- | :- | | **Low** | Unwanted mail with no security impact (e.g., newsletters & marketing, graymail). | | **Moderate** | Pure spam with no/little security impact (e.g., shady promotions, obvious spam, high-volume spam). | | **Major** | Harmful spam or threat with potential security impact (e.g., adult/drug spam, phishing, extortion, fraud, impersonation). | | **Critical** | High-severity threat with clear harm potential that requires immediate attention (e.g., malware or a high-quantity phishing wave). Please include a comment with critical issues to help us assess them quickly. | ### Reporting a misclassified benign email | Level | Description | | :- | :- | | **Low** | Wanted informational mail (e.g., newsletters & marketing). | | **Moderate** | Wanted non-business-relevant or personal email (e.g., notifications from services, emails for private purposes). | | **Major** | Business-relevant or critical emails (e.g., business communication, password-reset emails, invoices, travel tickets). | | **Critical** | Business-critical email that required immediate attention (e.g., a quarantined email that required an immediate response, causing potential for business damage). Please include a comment with critical issues to help us assess them quickly. | ## Report a misclassified topic To report a misclassified topic, please see [Report misclassified topics](/latest/topic-detection#report-misclassified-topics). ## Configuration The Admin guide to configure the behavior of the reporting can be found here: [Configure Misclassification Reporting](/latest/configure-misclassification-reporting). # Restrict Access to Expert Editor Source: https://docs.xorlab.com/latest/restrict-admin-access Restrict which IP addresses can reach the Expert Editor, on top of role-based access control. 1. In the Expert Editor, create the file `xcc/web/access.d/web_admin.conf` 2. Add the following content and adjust the `deny` and `allow` commands accordingly: ``` # Define Nginx access restrictions here. # For details, see: https://nginx.org/en/docs/http/ngx_http_access_module.html # Allow only specific IPs to access the Expert Editor allow 1.2.3.0/24; allow 2.3.4.5; deny all; ``` 3. Click **Publish**, then restart the `xcc_web` container. Files under `xcc/web/` require an XCC restart; see [How to Activate the Configuration](/latest/activate-configuration). # Search Source: https://docs.xorlab.com/latest/search Locate messages with autocomplete-assisted queries, then reuse a query as a saved view or promote it to a campaign. Search in xorlab helps you find any message in seconds using intuitive filters, tags, time ranges, and wildcards, and keeps track of your recent queries.