Only this pageAll pages
Powered by GitBook
Couldn't generate the PDF for 118 pages, generation stopped at 100.
Extend with 50 more pages.
1 of 100

v5

Loading...

Loading...

Loading...

User Guide

Loading...

How Link11 WAAP Works

Loading...

Loading...

Loading...

Loading...

Loading...

Console UI Walkthrough

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Using the product

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Reference Information

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Known Issues

For known issues or limitations in the current version of Link11 WAAP.

Log Exporters

Issue
Workaround/solution

The Log Exporter feature is not enabled by default. When trying to create a new Log Exporter, the Save procedure fails and an error message appears.

Before attempting to create a Log Exporter for the first time, to enable this feature on your planet.

Link11 WAAP Documentation

Link11 offers a network security software suite, including robust WAAP (Web Application and API Protection). This is the documentation for the Link11 WAAP ("L11WAAP") SaaS system.

Release Notes

  • November 24, 2025

Known Issues

  • Available .

User Guide

The manual is organized into the following sections, accessible through the sidebar table of contents:

  • Introduction to Link11 WAAP: general information about the system and its capabilities

  • How It Works: an overview of how L11WAAP filters traffic

  • Console UI Walkthrough: a detailed explanation of the user interface

  • Using the Product: some tips and best practices

Reference Information

October 6, 2025
September 8, 2025
Older
here
contact support

Introduction to Link11 WAAP

Product overview, architecture, and how it works

Welcome!

Link11 offers an all-in-one WAAP platform. It includes a next-gen Web Application Firewall (WAF), autoscaling Denial of Service (DoS)/Distributed Denial of Service (DDoS) protection, advanced bot management, real-time traffic monitoring & control, full historical logs & analytics, and more.

Link11 WAAP runs on the customer’s clouds of choice, whether the Link11 Network and Web Security solution, or any of the top-tier public cloud providers (AWS, Azure, and GCP). It protects web applications, services and microservices, and API endpoints.

Platform overview

L11WAAP deploys as a reverse proxy, continually analyzing incoming traffic. Benign traffic is passed through to the customer's origin, while hostile traffic is blocked and denied access.

The platform's overall architecture is as follows:

Cloud-based web security

  • L11WAAP deploys and runs in the customer's choice of clouds, whether private (Link11) or public (AWS, GCP, or Azure).

  • All incoming traffic is routed through L11WAAP and scrubbed as it passes through. Latency is negligible (generally 1.5 milliseconds or less).

  • Hostile traffic is blocked before it reaches the protected network. Legitimate traffic has normal access to the requested resources.

Full integration

L11WAAP is integrated with, and runs natively on, multiple cloud platforms. It leverages the advantages of each. Examples:

  • When L11WAAP runs on Link11, customers can use Secure CDN, Link11 load balancing, Infrastructure DDoS for offloading Layer 3 protection, and more.

  • On GCP, L11WAAP can act as the 'threat detection engine' for Cloud Armor, automating and extending its capabilities, and blocking attacks at the edges.

  • On Azure, L11WAAP integrates with Azure Security Center to fit smoothly into existing customer workflows.

  • On AWS, L11WAAP integrates with AWS WAF and Shield, adding granularity, control, and many other additional capabilities to AWS's native security features.

Content Filter

This section provides settings for content filtering:

DNS Records

An optional feature

DNS Management is an optional capability. Your DNS records do not need to be maintained within Link11, but they can be.

The user interface displays the records that are currently defined within Link11 WAAP. These records are not editable within the UI; they are configured outside of the UI, and are displayed here for informational purposes only.

For assistance in changing or configuring DNS records, within L11WAAP, .

Best Practices

This section describes best practices for some common tasks.

How Do I...

A task-based FAQ

This section answers questions that often arise about using Link11 WAAP.

Add custom messages to events

Sometimes it is desirable to add custom annotations to events in the traffic logs: perhaps for monitoring, visibility, or other purposes.

This can be done with .

Authenticate mobile app users

Link11 WAAP includes a Mobile SDK for authenticating mobile application clients. For more information, see .

Configure TCP passthrough

Sometimes end-to-end encryption is necessary, and client traffic must be kept encrypted until it reaches the backend server.

For this purpose, Link11 supports TCP passthrough. When this is configured, neither the Link11 load balancer nor L11WAAP will terminate or decrypt the TCP connection. The specified traffic will be passed through to the backend as-is.

Caution: If TCP passthrough is enabled, we recommend using it with the narrowest possible scope. This traffic is not decrypted, and therefore, cannot be inspected by Link11.

Passed-through requests are not filtered for hostile content, rate limit violations, ACL enforcement, etc. They also are not logged by Link11.

Control caching behavior

Web clients can cache resources from a server. Afterwards, a client can access its local cache, which reduces the number of requests sent to the server.

Servers can instruct clients to implement caching in certain ways. Servers can also set separate caching policies for any intermediary proxies in-between the server and the client.

Link11 WAAP is a proxy between the clients and the backend. When the backend responds to clients, the outgoing responses pass through L11WAAP. You can instruct the system to preserve or alter the caching instructions in those responses.

This can be done through . Out of the box, L11WAAP includes several cache policy Edge Functions for this purpose. If you need additional assistance in customizing L11WAAP's caching behavior, .

Improve Events Log performance for large argument volumes

When a web application or API frequently receives incoming requests with excessively large arguments, or a large number of arguments, this can adversely impact the performance of the Events Log.

To address this, Link11 WAAP can defer the retrieval of arguments until an admin specifically requests it. More info on this feature is .

Load balance traffic across my origin servers

Link11 WAAP provides inherent capabilities for load-balancing across origin/backend servers.

This is configured in .

Run custom code

To run custom Lua code before or after Link11 WAAP processes a request, use an .

To define code for customizing nginx's behavior or parameters, use .

Stream event data to a SIEM solution or other destination

Link11 WAAP integrates with a wide range of SIEM [Security Information and Events Management] solutions. Most of our enterprise clients stream L11WAAP events to ArcSight, RSA, IBM, Splunk, and other solutions.

To stream traffic event data to one or more of these destinations, create one or more .

The lengths of Log Exporter data values can be controlled using the .

Actions

Content Filter Rules

To enable TCP passthrough, contact support.
Content Filter Profiles
Content Filter Rules
Saving and Publishing Your Changes
Enabling Passive Challenges
Understanding and Diagnosing Traffic Issues
Authenticate mobile app users
Ban, unban, and allowlist traffic sources
Bypass Link11 WAAP for loadtesting or other purposes
Configure a new path/section of a site
Control caching behavior
Enable GraphQL traffic
Enable mTLS (mutual TLS)
Protect sensitive information in logs and analytics
Quickly block an attacker
Redirect or block HTTP traffic
Set rate limits and exemptions
Stream event data to a SIEM solution or other destination
Edge Functions
Mobile Application Groups
Edge Functions
contact support
here
Backend Services
Edge Function
Proxy Templates / Advanced Configuration
Log Exporters
System DB
Attackers cannot reach, or even find, the targeted web platform.
  • Bandwidth, compute, and other resources scale automatically as needed.

  • Remote management ensures minimal obligations (of time or expertise) from onsite staff.

  • L11WAAP supports various methods of authentication such as Basic, Digest, and Kerberos. (Note that NTLM cannot work with reverse proxies, and thus L11WAAP does not support NTLM sites/applications.)

  • contact support

    SSL

    This section is for SSL settings.

    Load BalancersCertificates

    Namespace reference

    ACL ProfilesActionsBackend ServicesCertificatesConfigsContent Filter ProfilesContent Filter RulesData queriesDynamic RulesEdge FunctionsFlow Control PoliciesGlobal FiltersLoad BalancersLog ExportersMobile Application GroupsPlanetsProxy TemplatesRate Limit RulesSecurity AlertsSecurity PoliciesServer GroupsTagsToolsUsers

    API

    API access to traffic dataTypes of namespacesNamespace reference

    Customize responses to clients

    Blocked requests can receive customized response headers, status codes, and content, by configuring the appropriate Actions.

    Admins can also run custom Lua code via Edge Functions. Edge Functions with a phase of Response Pre Processing or Response Post Processing will be run after the backend has responded to the request, but before the response is sent to the client.

    Protect sensitive information in logs and analytics

    Sometimes, incoming requests contain sensitive or Personally Identifiable Information that should not be included in logs and other forms of analytics.

    Link11 WAAP provides the ability to mask specific types of information. This is configured using the Masking Seed and Mask? fields within Content Filter Profiles.

    Note that you should ensure that the relevant requests are always subjected to the Content Filtering process.

    Analytics

    The Analytics section contains the UI for viewing traffic.

    If you have not used Link11 WAAP before, read this first: Traffic Reporting and Analytics.

    Otherwise, the Analytics UI is documented here:

    • Dashboard

    • Events Log

    Security

    The Security section of the UI provides configuration options for basic security rulesets and policies. The pages in this section document the configuration for these security settings.

    If you are not yet familiar with how Link11 WAAP filters traffic, and how the various settings below fit into this process, it is recommended that you read this overview first: The traffic filtering process.

    • Global Filters

    • Flow Control Policies

    • Content Filter:

    Quarantined

    Display and manage the list of quarantined traffic sources

    Overview

    The Quarantined List page shows a list of traffic sources that have triggered one or more Dynamic Rules. While a traffic source is on this list, Link11 WAAP responds to all of its requests automatically with the Dynamic Rule's Action.

    This is often used to ban a persistent violator of other security rulesets, but it can also be used merely to monitor a traffic source for a period of time. An explanation of the quarantining process is here.

    Administration and Use

    Viewing quarantines

    Each quarantined traffic source will have an entry in the list. Long lists will be broken up across multiple pages, which can be navigated using the controls at the bottom of the page.

    The overall list can be sorted according to the values in each column by using the Filter control at the top.

    Cancelling quarantines and preventing False Positives

    Traffic sources will be automatically removed from the Quarantine list when their quarantines have expired.

    They can also be manually deleted. In the UI, this is done by selecting the trash icon at the end of an entry in the Quarantined List.

    "Manual deletion" refers to deletion by an admin through either the UI or the API. Both methods produce the same results, as described below.

    When a traffic source is manually deleted from the list, L11WAAP understands this to mean that the quarantine was a False Positive.

    Therefore, when the next cycle of Dynamic Rule evaluation occurs, the Rule's corresponding Global Filter will be updated by removing the traffic source from its Rule list. Subsequent requests from that traffic source will not automatically receive the Rule's Tags and Action., unless/until that traffic source violates the Dynamic Rule again.

    To exempt the traffic source from further Dynamic Rule enforcement, an admin should add appropriate tag(s) to the Dynamic Rule's Exclude list.

    If L11WAAP has quarantined a traffic source and you wish to reverse this decision, the procedure above (editing the Quarantine list) should be performed. L11WAAP will update the corresponding Dynamic Rule and Global Filter automatically. Do not try to accomplish this by editing the Global Filter itself (which is non-editable in the UI, but could still be changed via API). Manually editing the Global Filter will not work; the next time Dynamic Rules are evaluated, the system will take everything that's currently quarantined and add it back to the Global Filter.

    Sites

    This section of the console contains the following options:

    • Server Groups: properties of server(s) for sites(s).

    • Backend Services: the services that L11WAAP is protecting.

    • Edge Functions: for running custom Lua code.

    • : information about DNS configuration.

    • : managing SSL associated with load balancers.

    • : for managing SSL certificates.

    Security Alerts

    Overview

    Security Alerts allow admins to configure email alerts to be sent when Dynamic Rules are triggered.

    Usage within applications and APIs

    Security Alerts operate at the system level. They can be defined for individual , or for multiple Server Groups simultaneously. When any of the specified Dynamic Rules is triggered for any of the specified Server Groups, an email alert will be sent to the designated recipient(s).

    Each email alert includes:

    • The Dynamic Rule that was triggered: its name, description, "Limit" (a combination of the Rule's Number of events and Time frame), and "Type" (which corresponds to the Rule's setting)

    • A list of the violators of that Rule

    In the email alerts, a Dynamic Rule enforcing limits on IP addresses will not be described as Type: IP; rather, the email body will say Type: remote_addr.

    Administration

    The main window (shown above) lists all currently defined Security Alerts.

    The administration (addition/deletion/editing/versioning) of these Alerts follows the conventions described .

    Parameters

    Name

    The name of this Security Alert, for use within the interface.

    Server Groups

    The Server Group(s) for which this Security Alert will be active.

    Alert recipients

    One or more recipients (specified as email addresses, separated by commas) to receive alerts when any of the listed Dynamic Rules are triggered.

    Dynamic Rules

    One or more Dynamic Rules which will, when violated, trigger the sending of email alerts to the specified recipients.

    When adding Dynamic Rules to a Security Alert, ensure that each Rule is in "". Rules that are inactive will not trigger Security Alerts.

    Saving and Publishing Your Changes

    Whenever you change the configuration of the Link11 WAAP platform within the UI, you must save your changes, and you must publish them to the cloud as well.

    If you do not save your changes, they will be lost when you go to a different page within the user interface. You will not be prompted or asked to confirm the abandonment of your changes.

    The Publishing process checks the saved changes for errors. If no errors are found, they are pushed to the cloud.

    Saving Changes

    The various Editor pages within the UI have "Save" buttons in the top row of controls. Select this button to save whatever changes have been ma.de

    Note that the "Save" button only saves your changes within your local session. To push them to your planet in the cloud, you must publish the changes as well.

    Publishing Your Changes

    Follow the process described here: .

    Bypass Link11 WAAP for loadtesting or other purposes

    Sometimes an admin needs to bypass the WAAP's traffic filtering, for example when "attacking" an application or server as part of a loadtest. Under normal circumstances, L11WAAP would prevent this, because it would enforce rate limits and block the excessive requests from reaching the backend.

    Specific requests can be exempted from L11WAAP's traffic filtering (including rate limiting) by:

    • Creating a Global Filter with narrowly-defined Rules (which will only match those specific requests, and no others)

    • Selecting the Global Filter's Action to be one of type Skip

    • And ideally, defining a unique to assign to those requests, so they will be identifiable in the traffic logs.

    Incoming requests that meet the criteria for the Global Filter will not subjected to filtering. They will be passed directly through to the backend.

    Configure a new path/section of a site

    Scenario: An admin has recently created a new section within an existing domain. (In this context, "section" means a path, or set of paths, that can be described in a single regex.) For example, perhaps a new API version is being exposed at /apiv3, which is a URL that did not previously exist.

    How can the admin configure Link11 WAAP's security settings for the new path(s)?

    As shown in the diagram below, the association between security settings and paths is done within a Security Policy.

    Specifically, each Security Policy contains a Path Map: a list of paths, and the security settings assigned to each.

    Thus, the process for configuring new paths within L11WAAP is as follows:

    1. Determine the Security Policy currently in place for the domain

    2. Within that Security Policy, clone an existing Path Map

    3. Configure the new Path Map as appropriate, to contain the new settings.

    These steps are described below.

    Determining the Security Policy

    1. Navigate to Sites -> Server Groups.

    2. In the list that appears, select the for the domain in question.

    3. On the Server Group Editor page, note the current selection in the Security Policy pulldown list.

    Cloning an existing Path Map

    1. Navigate to Security -> Security Policies

    2. Select the Security Policy that is (as noted above) currently assigned to the domain's Server Group.

    3. At the bottom of the Security Policies Editor page is the Path Mapping section. Expand one of the entries in this list.

    4. Within the expanded display of the Path Map, at the bottom right, select the Fork Path Mapping

    Configuring the new Path Map

    Ensure that the new Path Map is displayed for editing, and then:

    1. Edit its Name to something appropriate

    2. Define the Match path with an expression that will match all the new path(s) being configured

    3. Verify that the other security settings in this Path Map are appropriate. If not, existing security rulesets (such as Rate Limit Rules, Content Filter Profiles, etc.) are available for selection. If it is necessary to create one or more new rulesets, you will need to leave this page (be sure to select Save first!), create the new settings, and return here to select them.

    Enable GraphQL traffic

    Motivation

    By default, Link11 WAAP will block GraphQL traffic, for two reasons:

    1. The size of the argument

    2. number 600110, which contains this Match string: ([$@{}()\[\]].*){8,})

    Enabling GraphQL traffic

    To allow GraphQL traffic, create a with:

    1. An Argument Max Length that will accommodate the maximum size of the queries

    2. This tag in the Ignore Content Filter Tags list: cf-rule-name:600110

    Then assign this Content Filter Profile to the location (i.e., the site or path) of the GraphQL queries via an appropriate .

    ACL Profiles

    AI Management

    Overview

    As part of its security suite, Link11 includes robust bot management, including tracking of individual types of bots. There is some additional granularity for managing AI crawlers.

    Load Balancers

    Overview

    This page lists the load balancers currently set up within Link11 WAAP.

    Load balancers are added and managed outside of the UI; for assistance in changing or configuring load balancers, .

    Load balancer administration involves two primary activities:

    System

    This section of the console is for system-wide configuration.

    • : one of Link11 WAAP's mechanisms for human verification.

    • : for managing Single Sign-On for L11WAAP

    • : for clearing the cache(s) of Content Delivery Network nodes

    Version Control

    Link11 WAAP maintains Git versions of data and configurations.

    This page displays previous versions of configurations, and allows admins to:

    • Download a version by using the "Download" button at the top

    • Revert/restore the system to any saved configuration.

    To revert/restore, hover the cursor over the desired configuration. The "Restore"

    Publish Changes

    This page pushes a selected system configuration to the proxy, and makes it active. This is necessary when:

    • Edits were recently made to the current configuration

    • Changing to a different system configuration on the page: either reverting to a previous version, or rolling forward to one that's different than the currently active one.

    Account

    Overview

    If the user is logged into the planet directly (i.e., without using SSO), then selecting the user icon () at the top right of the UI will display a menu, including an option for opening the Account Details page.

    This page displays the account details of the current user, allows configuration of MFA (multi-factor authentication), and provides keys for using the API. Its sections are described below.

    Ban, unban, and allowlist traffic sources

    The section shows a list of traffic sources (i.e., sources of incoming requests) that are currently banned, blocklisted, and allowlisted.

    How to ban a requestor

    A traffic source is banned automatically when it violates a .

    You cannot manually move a traffic source into quarantine. Instead, you can create a Dynamic Rule to do it for you. The Dynamic Rule's parameters should be as follows:

    Generate or renew my own SSL certificates

    By default, Link11 supports communication between customer backends and .

    When a backend system requests a new or renewed certificate from LE, Let's Encrypt responds initially with a challenge. Because Link11 WAAP is a proxy for the backend, this challenge will be sent to L11WAAP.

    Under normal circumstances, L11WAAP will forward this to the customer system. If this is not occurring, something in L11WAAP's default configuration might have been changed.

    To correct this, perform the following two-step process.

    Step 1: Verify the necessary Global Filter

    Redirect or block HTTP traffic

    Under most circumstances, a session over unencrypted HTTP should not be accepted. Using Link11 WAAP, admins can refuse HTTP requests by either:

    • Redirecting them to HTTPS

    • Or simply blocking them.

    Admins must also choose whether to refuse HTTP traffic:

    • Globally, throughout the entire planet, or

    Using Swagger UI

    The Link11 WAAP API is available in . This tool provides design documentation, and can also be used to submit API calls directly to your planet.

    Location

    By default, the API is available in Swagger UI at:

    {your planet name}/api/v4.0/openapi.

    Internal data structures

    Overview

    Link11 WAAP maintains most of its security parameters as Entries, which are contained in Documents, which are contained in Configurations.

    A Configuration is a complete definition of L11WAAP's behavior for a specific environment. An organization can maintain multiple Configurations (e.g., development, staging, and production).

    Each Configuration contains multiple Documents of various types (Global Filters, ACL Profiles, etc.) Each Document contains at least one Entry, i.e., an individual security rule or definition.

    A Configuration also includes data blobs, which currently are used to store the geolocation database. This is where L11WAAP obtains its geolocation data and ASN for each request it processes.

    Set rate limits and exemptions

    Restricting consumption of resources and rate of requests

    Different types of rate limits are defined in different parts of the Link11 WAAP interface.

    Static rate limits for entire sites/applications: A static rate limiting capability is available via the within . This is simple, IP-based rate limiting that applies globally to every site/application based upon that Proxy Template.

    Granular rate limiting: More powerful capabilities are available through , including variable scope, multiple criteria for tracking requestors, actions, and more. These Rules are then associated with specific locations/URLs through .

    Global enforcement by traffic source: Requestors who submit excessive requests across the planet can be banned for configured lengths of time. This can be done via .

    Overview

    Link11 WAAP includes an API that provides full coverage of the system's capabilities.

    Using the API will require familiarity with the following:

    • L11WAAP's

    • The API's namespaces and endpoints, which are documented in two locations:

      • In the reference section of this manual

    Certificates

    Dynamic Rules

    Data queries

    Two of the Data queries routes below manage . The rest are for retrieving traffic data; for instructions on using them, see .

    Mobile Application Groups

    Content Filter Profiles

    Log Exporters

    AI Management
    Security Policies
    Rate Limit Rules
    ACL Profiles
    Actions
    Dynamic Rules
    Quarantined
    Profiles
    Rules
    DNS Records
    Load Balancers
    Certificates
    Publish Changes
    tag
    Content Filter Rule
    Content Filter Profile
    Security Policy
    Users Management: for administering users of L11WAAP
  • Security Alerts: for configuring email alerts, sent when Dynamic Rules are triggered

  • Log Exporters: for exporting traffic event data, e.g. to a SIEM solution

  • Version Control: for rolling forward/back to a different configuration

  • System DB: for accessing system settings

  • Publish Changes: for publishing configuration changes to proxies

  • Interactive Challenge
    SSO Configuration
    Purge CDN Cache

    It should be active (in other words, the Inactive toggle should not be selected).

  • Target should be set to IP

  • Number of events should be 0

  • Action should be a blocking action (e.g., Dynamic-rule block)

  • Quarantine Time should be the length of time you wish the ban to last

  • The Exclude list should be empty

  • The Include list should not contain all

  • The Include list should contain the tag(s) that will uniquely identify requests coming from the traffic source.

  • How to unban a requestor

    Manually removing a requestor from quarantine is discussed here: Cancelling quarantines and preventing False Positives.

    How to allowlist a requestor

    To exempt a traffic sources from potential quarantine, add identifying tags to the Exclude list in the active Dynamic Rules.

    To exempt a traffic source from other stages of filtering, do one of the following:

    • To bypass all stages of filtering, follow the steps described here: Bypass Link11 WAAP for Loadtesting or Other Purposes.

    • To exempt requests only from bot challenges or content filtering, configure an ACL Profile with appropriate tag(s) in the Bypass list, then use a Security Policy to assign that ACL Profile to the desired paths/URLs.

    • To exempt requests only from bot challenges, configure an ACL Profile with appropriate tag(s) in the Bot Challenge / Skip list, then use a Security Policy to assign that ACL Profile to the desired paths/URLs.

    Quarantine
    Dynamic Rule
    .
  • In Swagger UI. Along with documenting the API, this also includes the ability to submit API calls directly to your planet. (more info)

  • (Optional) the process for accessing the API using curl.

  • internal data structures
    here
    icon will appear at the end of the entry. Select this icon.

    Once the restoration process is complete, publish. L11WAAP will push the selected configuration out to the proxy.

    Publishing recent edits to the current configuration

    Whenever you change the configuration of the Link11 WAAP platform, you must save your changes. This is done with the "Save" button, available at the top of many pages within the UI.

    If you do not save your changes, they will be lost when you go to a different page within the user interface. You will not be prompted or asked to confirm the abandonment of your changes.

    After saving the changes, you must publish them as well, to push the changes out to the cloud. This is done by coming to this page and selecting the "Publish" button.

    When you first arrive on this page, the most recent commit is automatically selected, so it is the one that is published when the button is selected. The most recent commit will include all of the changes that were made and saved.

    Publishing a version after working with Version Control

    After working with Version Control, you must come to this page, select the desired Commit entry (hovering the cursor over an entry will show the Select button), and select the "Publish" button on the top right.

    Changing to a different commit

    To set the system to a different commit, follow these steps:

    1. In the pulldown at the top left of the sidebar menu, ensure that the appropriate Target Bucket(s) are selected. (The list of buckets is maintained in the System DB.)

    2. The Commit list is a list of configurations, with the most recently edited version at the top. If you wish to publish your most recent edits, ensure that the top entry is selected. If instead you wish to revert to a previous entry, find it in the list and select it.

    3. Select the "Publish" button on the top right.

    In version 5, the UI does not show which commit is the current published version. We plan to add this in a future version.

    Version Control

    All of these data structures can be edited via API:

    • A Document is a file treated as a JSON list of entries.

    • An Entry is a JSON dictionary with a unique identifier. This field value must be unique inside the Document, and must be a valid part of an URL. Often, this field is labeled id (for example, configurations). At other times, it has a specific name (for example, Routing Profiles use the field planet_name.)

    • A blob is a file treated as binary data.

    The fundamental data structure: Configuration

    The Configuration is the atomic unit for all of L11WAAP's parameters. Any edits to a Configuration result in a new Configuration being created. Configurations are versioned, and can be reverted at any time.

    Default configuration

    Most API calls require a parameter for the configuration (typically listed as {config}), representing the configuration id.

    Out of the box, the default value for this parameter is prod.

    Modifying a configuration

    When a Configuration is created or modified (whether by the UI console or an API call), the admin must push the changes out to the planet. This is the publishing process.

    Account Details

    The name, email address, phone number, and organization of the current user are shown here.

    For most users, their account details on this page are read-only. Editing is available through the Users Management page.

    Users that are Organization Administrators can edit their name and phone number here.

    User Authentication

    This section provides for setup of MFA (multi-factor authentication). It contains a QR code that can be scanned, to obtain an OTP (one-time password) via Google Authenticator, Authy, or other authentication platforms.

    At the bottom of this section, there are links to authentication apps for iOS and Android.

    Sending OTPs via SMS is still supported on the login page. However, other forms of authentication are generally preferable, as they are more secure.

    API Keys

    This section displays the current API Keys. Multiple keys can be defined.

    API keys are required when directly accessing the Link11 WAAP API. (When using Swagger to access the API, a key is provided automatically.)

    To add a key, select + New. Specify a title for the new key.

    To revoke an existing key, hover the cursor over it and select the trash can icon.

    Server Groups
    Target
    here
    active mode
    button. This will create a clone of the original entry.
    When the new Path Map is correctly defined, select Save. Then publish the changes.
    Server Group
    The AI Management Dashboard

    This Dashboard provides analytics that reveal their activity and composition of AI crawler activity. It is divided into three sections, in this order (top to bottom):

    • The date/time range for the analytics display, similar to the Query Specification section of the main analytics Dashboard.

    • A graphical summary of all crawler activity for the specified time range. Dragging the cursor over a portion of the chart will adjust the display to focus only on this time period.

    • Activity by individual crawlers, and the disposition of their requests.

    The Passed and Blocked metrics are the number of requests Link11 passed to the origin or blocked, respectively. For these purposes, requests which made it to the origin but were blocked there are counted as "passed."

    At this time, it is not possible to break out statistics for Copilot and Gemini crawlers, as they are indistinguishable from the standard Bing and Google spiders. However, visitors arriving from these services (along with other AI services) can be identified, enabling their requests to be handled differently if desired. See AI Referrals, below.

    How to Manage AI Crawlers

    The AI Management Dashboard is for displaying crawler activity.

    The crawlers' activity can also be managed; this is configured in a different part of L11WAAP, based on a dedicated set of Global Filters that identify them.

    To control crawler activity within the protected systems, two approaches can be taken, depending on the desired scope.

    Global blocking

    To globally block all requests for a specific crawler, edit the appropriate Global Filter and set its Action parameter to Global filter block. For example, the AI ChatGPT Filter can be used to block ChatGPT's crawler.

    Path-dependent management

    To block or otherwise manage AI bot requests for specific parts of the system, follow this procedure:

    • Open the appropriate Global Filter for editing (the one which identifies the crawler in question).

    • Ensure that the Filter’s Action parameter is set to monitor (tag only).

    • In the Filter’s Tags field, note the specific tag that the system will attach to all requests generated by the crawler. Or, you can define your own.

    • Next, for each part of the protected system where crawler activity should be controlled, determine the that is in effect. (ACL Profiles are assigned to paths by .)

    • Add the crawler’s Tag to the appropriate column within each ACL Profile. (To block the requests, the Enforce Deny column can be used.)

    AI Referrals

    Sometimes it is desirable to set up unique management for visitors that originate from AI services.

    Link11 includes specific "Referral" Global Filters for this purpose. For example, the AI ChatGPT Referral Filter will match every request that has its referer header set to https://chatgpt.com/.

    Using the procedures explained above, these Filters can be used to block, or trigger other specific handling, of these requests.

    Attachment of one or more security certificates.
  • For Link11 load balancers supporting a multi-regional or multi-cluster planet, configuring the preferred traffic routing (optional).

  • Attaching certificates

    You can select or change the SSL certificate attached to a load balancer. Selecting the Attach Certificate button displays this dialog:

    The certificates available for selection are those defined within the SSL Certificate list.

    Configuring traffic routing

    When a public-cloud load balancer is used, Link11 automatically routes traffic to the customer planet for processing.

    When Link11 cloud load balancing is used, and the customer planet has multiple clusters or spans geographic regions, admins have additional control over traffic routing.

    Note: in this discussion, "one" load balancer is a conceptual representation. Physically, it represent multiple load balancing instances, running simultaneously in multiple locations.

    For each load balancer, admins can specify the preferred datacenter, i.e. the preferred regional instance of Link11 WAAP to scrub the traffic.

    • The UI offers the selection of one Preferred datacenter; this will be the destination for traffic from all locations where that load balancer is running.

    • If more granularity is needed, the API can be used to set a different preference for each location.

    How traffic is routed

    When traffic is received, the system will route the traffic as follows:

    • If a Preferred datacenter was selected, and that datacenter is up, it receives the traffic.

    • If a Preferred datacenter was selected, but that datacenter is currently down, traffic is balanced across all available datacenters.

    • If a Preferred datacenter was not selected, traffic is sent to the datacenter closest to the load balancer.

    In the above, Preferred datacenter refers to any preference, whether specified via the UI or API. See this discussion about using the API correctly.

    Multiple datacenters processing a client session

    In certain situations, a single client session might be processed in more than one datacenter.

    This can occur when Frankfurt is the destination for traffic. In the interface, "Frankfurt" represents two physical datacenters in the Frankfurt region. The system can send traffic to either one.

    This can also occur when a preferred datacenter is, or becomes, unavailable. The system will route its traffic elsewhere, as described above, but will continue monitoring the preferred datacenter. Once it becomes available, traffic will be routed there again.

    When a client session is processed by multiple datacenters, this has no impact on analytics or most traffic scrubbing. However, it can delay enforcement of Rate Limit Rules, because each datacenter will only have processed a subset of the client's requests.

    contact support

    Confirm that there is a Global Filter named Let's Encrypt Requests.

  • Confirm that this Filter:

    1. is in Active mode

    2. will add a tag of let-s-encrypt

    3. has an Action of monitor (tag only)

    4. contains a single entry, with Category set to URI and Match set to ^/\.well-known/(acme-challenge|rbz-traffic)/[A-Za-z0-9_-]+$

  • If any edits were performed as a result of the above, save them and publish.

  • If your planet was created before May 2025, the Global Filter described above should have been added during the upgrade to v5.3.17. Therefore, it should be restorable from the Version History at the bottom of the Global Filter Editor. Alternately, the settings described above can be edited manually.

    Step 2: Verify the passthrough of Let's Encrypt traffic

    The Global Filter described above will add a tag of let-s-encrypt to challenges from LE.

    To ensure that this traffic is passed through L11WAAP to the customer backend:

    1. Ensure that this tag is in the Ignore field in every Content Filter Profile. During this process, if a Profile is edited, ensure that the changes are saved.

    2. After all Profiles have been checked, publish the changes (if any were made).

    Troubleshooting

    If the process above is followed, and Let's Encrypt traffic is still being blocked by L11 WAAP, check the LE requests in the Events Log to discover the reason(s) for this.

    Note that the passthrough of Let's Encrypt requests does not occur until the Content Filtering stage of the traffic filtering process. This means that several stages of filtering are still performed before the passthrough can occur. If legitimate requests from Let's Encrypt are tagged with let-s-encrypt but are still being blocked, use the Events Log entries to determine the source of the blocking action, and then correct the security settings that are responsible for this.

    Getting assistance

    Feel free to for assistance with any part of the process described above.

    Let's Encrypt

    Selectively, to certain paths within the planet.

    This can all be done with a single Global Filter.

    Initial Configuration

    Create a Global Filter with these parameters:

    • Name and Description: as desired

    • Active mode: enabled

    • Source: self-managed

    • Tags: as desired, perhaps something descriptive such as http-received

    Configuring the Action

    The Global Filter's Action setting determines what will happen to the request.

    To block the request completely, choose a blocking Action (perhaps the default Global filter block Action).

    To redirect the HTTP request to HTTPS, you can select the default https redirect Action (shown below). If you choose to edit this Action or use a different one, ensure that the selected Action has the same Status code, and the same setting for the location header.

    Configuring the Rule list

    Within the Rule list, select +New Entry. Populate the new entry with:

    • Category set toTag

    • Match set toprotocol:http

    • Whatever Annotation you wish.

    At this point, the Global Filter should look something like this:

    Configuring the Scope

    By following the steps above, you have a Global Filter that will block or redirect HTTP traffic globally, throughout the entire planet.

    If this was your goal, skip down to the Saving and Publishing steps below.

    If instead you only want to apply this Global Filter to certain paths within the planet, you must create one or more additional entries in the Rule list. Each should have:

    • Category set toPath

    • Match set to a regex describing the path

    • Whatever Annotation you wish.

    Create as many entries as necessary to include all the desired paths.

    Note that these entries should all be within the same section as the first Tag entry. (If instead you selected +New section, and the entries are now in separate sections, ensure that the relation between them is set to Relation: AND.)

    Saving and Publishing

    When you have completed the steps above, the Global Filter has been created.

    Select Save, and then publish the changes.

    Access

    Using Swagger UI will require the user to be logged into the planet with a sufficient Access Level.

    Swagger will display the entire API. However, the availability of individual routes is dependent upon the user's Access Level. A request sent with insufficient permissions for the route will fail.

    If Swagger UI receives a request and the response is an HTML document, the most likely cause is the user is not logged in, or is logged in with insufficient permissions.

    Namespaces

    The Swagger interface shows the namespaces and data models for the API. Often, each one is initially collapsed, as in this example:

    Expanding a namespace reveals the endpoints within it:

    Expanding an endpoint reveals more information about required inputs (if any) and the information that will be returned in the response.

    Some endpoints, as in the example above, do not require any inputs. Others require specific parameters:

    ... or other inputs, such as a request body.

    Running API calls

    Selecting the Try it out button will enable the editing of the required inputs, if any. Once the required inputs have been completed, the system will:

    • display a command that can be submitted via curl (as explained here), and

    • display an Execute button, which if selected will submit the command to the system and display the results.

    Swagger allows you to interact with the API, try different commands, and see what responses will be generated.

    Swagger UI
    Creating Rate Limiting Exemptions

    To exempt one or more traffic sources from all filtering, follow the instructions here: Bypass Link11 WAAP for Loadtesting or Other Purposes.

    To exempt a traffic source from rate limiting only, do the following:

    1. Determine a unique tag that will identify the traffic source(s).

      • There might already be one in use by the system. For example, to exempt an entire ASN, the system tag for that ASN can be used.

      • If not, then create a Global Filter that will assign a unique tag to requests from the traffic source(s) in question.

    2. Add the tag to the Exclude filter list in the applicable and .

    Application IP Rate Limits settings
    Proxy Templates
    Rate Limit Rules
    Security Policies
    Dynamic Rules
    quarantined traffic sources
    API access to traffic data

    Mobile Application Groups

    Overview

    Link11 WAAP includes a Mobile SDK: a unique client certification mechanism for iOS and Android apps. Customers can publish their applications with the SDK embedded.

    In use, the SDK signs the application, authenticates the device, and verifies user identity, adding a cryptographic HMAC signature to each request. The SDK provides a reliable and secure mechanism to confirm that the traffic is originating from a legitimate app user and not a bot or emulator.

    Acquiring the SDK

    The latest version of the Mobile SDK, including instructions and code samples, is available here:

    Below, we discuss the parameters to configure within L11WAAP for receiving requests from mobile applications.

    Usage

    A Mobile Application Group configures Mobile SDK parameters for a specific (which usually represents a domain).

    Administration

    The main window (shown above) lists all currently defined Mobile Application Groups.

    The administration (addition/deletion/editing/versioning) of these Groups follows the conventions described .

    Components

    Name

    The name of this Mobile Application Group, for use within the interface.

    Description

    A description of this Mobile Application Group, for use within the interface.

    Token header name (optional)

    The name of the header that contains the user authentication token. This can be left blank.

    Grace period

    The allowable time between the timestamp of a request and the time that L11WAAP receives the request from the application. Requests with a longer delay will be rejected.

    App signatures

    This list contains the SHA-256 digests of recognized certificates.

    To find the signature for an iOS app, you can open the Apple Development Certificate in the Keychain app, and copy the SHA-256 fingerprint. Alternatively, you can this fingerprint from the ipa bundle.

    For Android app, you can get the SHA-256 fingerprint from the keystore or extract it from a signed APK with the apksigner tool (part of the Android SDK). See detailed instructions .

    When uploading the fingerprint to the L11WAAP Console, make sure that it contains hexadecimal characters only, in lowercase, without spaces.

    Active mode

    Any number of signatures may be 'Active' at given time.

    While debugging the app on an emulator, it will present a special signature: abadbabe. Make sure this is not activated on production.

    Profiles

    This lists the remote profiles that can override the parameters of the SDK on all mobile clients.

    The Default profile is always empty. When it is active, the SDK parameters are fully determined by the app's local configuration. Only one remote profile may be active at a given time.

    Interactive Challenge

    Overview

    Link11 WAAP contains several mechanisms for detecting bots within web traffic, including Active Challenges and Passive Challenges.

    This page allows admins to configure the third mechanism: the L11WAAP Interactive Challenge, which is a form of CAPTCHA ("Completely Automated Public Turing test to tell Computers and Humans Apart").

    The Interactive Challenge is more stringent than the other mechanisms. Therefore, when an Interactive Challenge is triggered, the user must pass it before being allowed to continue, even if the user had previously passed an Active Challenge or Passive Challenge.

    Usage within applications

    The Interactive Challenge defined on this page can be used at various places within a web application. Create one or more with the Type parameter set to Interactive Challenge, and then use the Action(s) within the appropriate security rulesets (within , , , and ).

    Admins should ensure that rulesets which can trigger Interactive Challenges are not applied to API endpoints. Interactive Challenges require user interaction, and therefore, API clients cannot pass them.

    Parameters

    The parameters described below will determine how the Interactive Challenge page is displayed to the user.

    Direction

    The direction of the text displayed to the user. For example, English should be set to Left to right, while for Hebrew, this should be set to Right to left.

    Style

    This specifies how to display the image configured in the Image/IMG settings within the Languages section. When set to Logo, the image will be shown on the page once. When set to Wallpaper, the image will be tiled to fill the page.

    Palette

    The colors used in the challenge.

    Languages

    Admins can configure Interactive Challenges in different languages. A default L11WAAP deployment will contain English; to add additional languages for configuration, select New language. (This appears below the Languages section; you can collapse the section to make it more accessible.)

    Each configured language will include the options below.

    Title

    The title that will be shown on the page.

    Buttons text

    During the Interactive Challenge, two buttons are shown to the user. The top field specifies the text for the first button that appears, and the bottom field specifies the text for the second button.

    Image Element Source

    This is the source for the image that will be shown on the Interactive Challenge page. It will be shown according to the Style setting.

    IMG Element Preview

    This displays a preview of the image specified in the Image Element Source.

    Testing an Interactive Challenge

    To see how an interactive challenge will appear to a user, you can select it as the Action for a dedicated : one with a Rule list that will only match a test request (e.g., a specific IP that you will use to test the challange).

    Purge CDN Cache

    This feature allows admins to purge CDN caches at various scopes:

    • The entire planet

    • Specific domain(s) within the planet

    • Specific paths within domain(s)

    A history of current and past activity is provided.

    Prerequisites

    This feature is available when at least one CDN has been set up in the system. (To do this, contact customer support.) If no CDN is currently configured, an error message will be shown.

    Three-Step Purging Process

    Purging requires these steps:

    1. Select the cache(s)

    2. Initiate the purge

    3. (Optional) monitor the results

    Step 1: Select the cache(s) to purge

    Cache selection varies, depending on the CDN being used.

    To purge caches for an entire planet

    For non-AWS CDNs, at the top left of the page, ensure that All domains in the planet is selected, then skip the remainder of Step 1, and continue to Step 2 below.

    To purge one or more domains within the planet

    AWS Cloudfront users will see the controls described below. For non-AWS CDNs, at the top left of the page, ensure that Specific domains is selected to display them.

    • Select CDN: If there are multiple AWS load balancers, this control will appear. Select the AWS CDN provider for each domain/path where the cache has to be purged. In other situations (e.g., the planet uses the Google Cloud or Link11 CDN, or has only one AWS load balancer) this control is unnecessary and will not appear.

    • Alternative domain names: For non-AWS CDNs, specify a domain configured within the planet. AWS Cloudfront does not support individual purges, so Cloudfront users will see a non-editable list (for informational purposes only) of all the domains for which caches will be purged.

    • Add a specific path:

    Adding more domains/paths Multiple domains and/or paths can be specified for a purge.

    After appropriate values have been entered into the controls described above, if another domain or path purge needs to be defined, select the New Host button and populate the new entry in the purge list. Repeat this process until all desired purges have been specified.

    Step 2: Initiate the purge

    Select the Purge CDN cache button. The specified purge(s) will appear in the Results list at the bottom of the page.

    Step 3: (Optional) monitor the results

    The Results list shows a history of purge commands submitted during the previous week. The list shows the date and time when each was submitted.

    Within the list, the Status field shows the result of each purge during the most recent status update. Updates occur when the page is loaded or reloaded, and also each time the Refresh Status button is selected.

    The possible statuses are:

    • In progress: as of the most recent status update, the purge was still being processed. (Note that depending on how recently the list was updated, the actual current status might be different.)

    • Done. The purge completed successfully.

    • Failed. The purge was attempted but was not successful. To try again, a new purge command must be submitted.

    • Not available. The purge was unsuccessful because the CDN was unavailable. To try again, a new purge command must be submitted.

    Users Management

    Overview

    This page allows admins to manage users of the Link11 WAAP system.

    This page is available only to users with an Access Level of Organization admin and Reblaze admin.

    Administration

    User administration follows the List/Editor UI conventions described .

    Add a new user

    Select the + New button, and the New User dialog will appear:

    Note that once a user is created, the email and organization values cannot be edited later. To change these, the user should be deleted and

    User Parameters

    Field
    Comment

    Log Exporters

    Overview

    Log Exporters allow admins to stream event data to an outside destination, e.g. a SIEM solution. Every few seconds, Link11 WAAP bundles and exports the most recent traffic events from its internal logs.

    If desired, data values can be truncated according to settings in the System DB.

    For details of the protocols and format of the event data, see .

    There is a known issue when attempting to create a new Log Exporter.

    Below is a discussion of the console interface for configuring Log Exporters.

    Usage within applications and APIs

    Log Exporters operate at the system level. Admins can configure them for specific , or for the entire planet.

    Administration

    The main Log Exporter window lists all currently defined Log Exporters.

    The administration (addition/deletion/editing/versioning) of Log Exporters follows the conventions described .

    Parameters

    Name

    A unique name for use within L11WAAP.

    Status

    Whether or not this Log Exporter is currently active.

    Destination IP

    The destination IP to which event data will be sent.

    Port

    The port to which event data will be sent.

    Server Groups

    The specific server groups for which event data will be sent.

    Include encoded request data

    When this is enabled, exported data will include a Base64-encoded representation of the HTTP request: its headers, cookies, and query arguments. This enables customer admins to extract and inspect the auth token and other metadata required for customer identification and security analysis.

    Request data will be truncated (if necessary) to the , then encoded for export.

    Transport protocol

    The protocol to use while streaming the event data.

    • TCP: Event data will be streamed over TCP.

    • TCP + TLS (Trusted): Event data will be streamed over HTTPS. When this is selected, an additional control will appear for uploading a PEM file containing the TLS certificate for the data's destination. The system will validate the certificate upon upload.

    • TCP + TLS (Untrusted): Event data will be streamed over HTTPS, but the system will not use a certificate.

    Requests to export

    • Blocked: Export only the requests blocked by L11WAAP.

    • All: Export all the requests blocked or passed by L11WAAP.

    Note that currently, Log Exporters can not include requests challenged by L11WAAP, or blocked by the origin.

    Troubleshooting

    If a Log Exporter has been configured but is not streaming data:

    1. Verify that it is in .

    2. If its is TCP + TLS (Trusted), verify that the certificate is valid and has not expired.

    If a Log Exporter is streaming truncated data, verify the data-length limits set in the .

    Quickly block an attacker

    Sometimes situations will arise where an attacker needs to be blocked temporarily, while the security posture is being reconfigured. Since the hostile traffic is not being filtered, admins recognize that their security posture needs to be strengthened, but they need some time to analyze the situation. Meanwhile, the attacker should be blocked.

    It might seem that admins should merely add the system tag for the attacker's IP (e.g., ip:82-64-131-193) to the Enforce Deny column in the applicable ACL Profile. This can work (as long as the attacker is consistently using the same IP), but it's not necessarily the best approach.

    Using a Global Filter

    The better approach is usually to create a , based upon criteria that will match the attacker (but will not match any other traffic source), with an to block the matching requests.

    Here's why this is usually the optimal choice:

    • While both approaches can be done when the attacker is using a single IP (or a set of IPs), the second one also supports situations where the attacker is rotating IPs, and therefore needs to be identified with a combination of characteristics.

    • The ACL Profile will limit the blocking to specific paths/URLs (those defined in the associated with it, and used within one or more ). The Global Filter will block the attacker's activity globally, which is usually more desirable.

    • The Global Filter is more efficient during processing, because the hostile requests are blocked earlier in the .

    Consider a dedicated Global Filter for long-term management

    Instead of creating and discarding one-off Global Filters, it's often better to maintain a dedicated Global Filter for manually blocking attackers. As traffic sources need to be blocked (or unblocked), admins can just add (or remove) matching criteria.

    This creates a single location for administering these special cases. Admins can easily monitor the current list of manual interventions, and purge them as they become obsolete.

    Configs

    Backend Services

    Global Filters

    Load Balancers

    Prerequisites

    The {config} API parameter is discussed here.

    Load balancer administration is discussed here. The discussion below assumes familiarity with it.

    Special considerations when using the API

    Multi-regional configuration

    As explained , when a Link11 load balancer supports a multi-regional planet, admins can (if desired) configure traffic routing.

    The API provides additional granularity beyond the configuration available in the web console:

    • In the UI, the load balancer is treated as a single instance. However, this "one" load balancer is conceptual: it represents multiple physical instances, running simultaneously in different cities. The API provides the ability to configure each city separately, if desired.

    • In the UI, the Preferred datacenter control displays a list of datacenters where Link11 WAAP has been deployed. In the API, this list is provided in the upstream_regions parameter, which is returned when calling GET /api/v4.3/conf/{config}/load-balancers/regions.

    • In the UI, one Preferred datacenter can be selected, which will be applied to all cities. In the API, different datacenters can be specified for different cities, by calling POST /api/v4.3/conf/{config}/load-balancers/regions.

    When calling POST /api/v4.3/conf/{config}/load-balancers/regions, all desired preferences should be specified. All unspecified regions will be set to the default preference of automatic .

    If an incorrect preferred datacenter (one where L11WAAP is not running) is specified, this action will be rejected, and the previous selection will remain in effect.

    API overview

    To retrieve information about all load balancers:

    GET /api/v4.3/conf/{config}/load-balancers

    To add a certificate:

    PUT /api/v4.3/conf/{config}/load-balancers/{entry_name}/certificates/{certificate_id}

    To remove a certificate:

    DELETE /api/v4.3/conf/{config}/load-balancers/{entry_name}/certificates

    To get the list of Link11 WAAP datacenters, and each city's current preference:

    GET /api/v4.3/conf/{config}/load-balancers/regions

    To set preferred datacenters for each city:

    POST /api/v4.3/conf/{config}/load-balancers/regions

    Operations

    Flow Control Policies

    Policy Mapping and Traffic Routing

    Overview

    When L11WAAP processes incoming requests (as described in the discussion of the ), the system must perform:

    • Policy mapping: deciding which security rulesets are applicable to the request.

    System DB

    This page within the L11WAAP console displays the current System Database. The parameters contained here are used throughout the system.

    Most of these settings are displayed for informational purposes only. In some cases, they can reflect features of the system not currently in use.

    The following features are available for configuration by customer admins:

    Acronyms

    Used in this Product Manual

    ACL Profile
    Security Policies
    Rate Limit Rules
    Dynamic Rules

    The ACL Profile approach can result in the long-term accumulation of "special cases" within the Profiles, if admins are not diligent about cleaning them up when they're no longer needed. This situation is not ideal, because it can be messy and difficult to manage. The Global Filter approach makes it easier to also consists in creating special cases, but they are more visible and thus, easier to find and purge when no longer necessary.

    Global Filter
    Action
    Security Policies
    Server Groups
    traffic filtering process

    Traffic routing: If the request successfully passes through the filtering process, the system must decide how and where to route it to the protected backend.

    As shown in the diagram above, a fundamental component within L11WAAP is the Server Group. Generally, admins will configure a Server Group to represent a domain. Each Server Group specifies:

    • A Security Policy, used for policy mapping.

    • The Proxy Template that is based upon.

    • The domain's SSL Certificate.

    Policy mapping

    During the traffic filtering process, some stages of processing (for example, Global Filtering) are universal; the same rulesets are enforced upon all requests.

    However, other stages of processing will vary. Admins can specify different rulesets for enforcement, depending on the request's destination URL. For these stages, policy mapping is necessary.

    When a request is received, it is first matched with the appropriate Server Group. As shown above, every Server Group includes a Security Policy, which is the foundation for policy mapping.

    Each Security Policy includes a list of paths (which are usually expressions, although individual URLs can be specified too). It associates each path with several rulesets:

    • Content Filter Profile (which defines the threat signatures, content requirements, and other restrictions to enforce upon the request according to its content)

    • Rate Limit Rule(s) (which restrict the rates at which traffic sources can submit requests)

    • ACL Profile (which define the disposition of requests, depending on the tags that it received during processing)

    The request's destination URL is evaluated against the list of paths, to find the best match. The rulesets associated with that path are the ones used to process the request. For more information, see the explanation of Security Policy path mapping.

    Traffic routing

    When a request has successfully passed through traffic filtering, L11WAAP forwards it to the customer's backend, accepts the backend's response, and returns the response to the client.

    To do this, the system must know how to route requests to the backend. This is configured in Security Policies.

    Each Security Policy includes a list of paths (which are usually expressions, although individual URLs can be specified too). Each path is associated with, among other things, a Backend Service.

    When a request is processed, its destination URL is evaluated against the list of paths, to find the best match. The Backend Service associated with that path is the one to which L11WAAP will send the request, and then receive the response, and so on.

    traffic filtering process
    Server Group
    here
    extract
    here
    Mobile SDK v2.3.0
    Actions
    Global Filters
    Rate Limit Rules
    ACL Profiles
    Content Filter Profiles
    Global Filter

    When this control is untoggled, caches for the entire domain will be purged.

  • When this control is toggled, the Path field will appear. Enter the path for which the cache should be purged.

  • Contact Name

    The user's name

    Email

    The user's email address. Note: after a user is created, this value is read-only and cannot be edited.

    Mobile

    The user's mobile number, for sending OTP (one-time passwords) via SMS. This is an optional entry, because L11WAAP also provides other options for multi-factor authentication (which are configured on the Account page). The number should begin with a "+" symbol and the country code. Example: a US number should appear in the format +12223334567.

    Access Level

    There are four Access Levels within L11WAAP:

    • Viewer: can see the Analytics section, i.e. the Dashboard and Events Log.

    • Editor: has all Viewer permissions, and can also configure security rulesets and policies.

    • Organization Admin: has all Editor permissions, and can also manage users.

    • Reblaze Admin: has all Organization Admin permissions, and can also manage the organization. Note that this Access Level is not available through User Management; these Admins must be added manually.

    Organization

    The organizations within the planet. The list of organizations is obtained during system bootup.

    here
    Log Exporter Output
    More info
    server groups
    here
    maximum lengths and parameter limits configured in the System DB
    Active mode
    Protocol
    System DB

    Blocklist

    BQ

    BigQuery

    BQML

    BigQuery Machine Learning

    CA

    Cloud Armor

    CDN

    Content Delivery Network

    FP

    False Positive

    GCP

    Google Cloud Platform

    IPS

    Intrusion Prevention System

    LB

    Load Balancer

    ML

    Machine Learning

    RFC

    Request for Comments

    SIEM

    Security Information and Events Management

    SOC

    Security Operation Center

    TTL

    Time to Live

    VPC

    Virtual Private Cloud

    WAAP

    Web Application and API Protection

    WAF

    Web Application Firewall

    Acronym

    Meaning

    ACL

    Access Control List

    API

    Application Programming Interface

    ASN

    Autonomous System Number

    AWS

    Amazon Web Services

    BL

    Except for these, it is not recommended that admins attempt to edit settings within System DB. If you would like assistance, contact support.

    Enabling certificates for mTLS

    By default, the Link11 WAAP interface does not offer management of certificates for mTLS. These features can be enabled through the System DB.

    To do this, begin by selecting the system namespace for editing, then select feature-toggle.

    As shown above, this contains three parameters:

    • ssl-client-to-v5-client-ca-certificate, for mTLS between Link11 WAAP and end users.

    • ssl-server-to-backend-mtls-certificate, for mTLS between Link11 WAAP and the customer origin (a certificate for customer origins to validate L11WAAP).

    • ssl-server-to-backend-ca-certificate, for mTLS between Link11 WAAP and the customer origin (a certificate for L11WAAP to validate customer origins).

    Set the appropriate parameter(s) to true, save the changes, and then publish.

    • If ssl-client-to-v5-client-ca-certificatewas activated, the CA Certificates tab will appear on the Certificates page. After being added there, certificates will be available for use in Server Groups.

    • If ssl-server-to-backend-mtls-certificatewas activated, the Server-to-Backend mTLS Certificates tab will appear on the Certificates page. After being added there, certificates will be available for use in Backend Services.

    • If ssl-server-to-backend-ca-certificate was activated, the Server-to-Backend CA Certificates tab will appear on the page. After being added there, certificates will be available for use in .

    The following can be helpful in understanding the names and usage of the various certificates:

    Limiting Log Exporter data lengths

    Log Exporters stream traffic data to external destinations. Using the System DB, admins can limit the maximum lengths of various data included in the messages.

    This is done by selecting the system namespace for editing, then selecting log-exporter. The values shown above will be available for editing.

    After editing any of these parameters, save the changes and then publish.

    The max_characters settings are the allowable lengths for the various data fields.

    • Each setting is specified as the maximum number of characters. Data exceeding those lengths will be truncated.

    • The encoded_fields limit applies to all fields within encoded requests, i.e. to each header, cookie, and argument.

    The request_data_max_parameters_num limit defines the maximum number of parameters in the encoded data. For example, when this is set to 100, then the following limits are enforced:

    1. The maximum number of POST data parameters is 100

    2. The maximum number of GET data parameters is 100

    3. The maximum number of header data parameters is 100

    The numbers shown in the screenshot above are the default values. If for some reason the log-exporter settings are deleted from System DB, these values will be used.

    Enabling certificates for mTLS
    Limiting Log Exporter data lengths
    here
    Rule

    Traffic Filtering Process

    Introduction

    Link11 WAAP subjects incoming requests to a multi-stage filtering process.

    Below is a high-level description of the overall process. For a more in-depth review of the various stages and how to configure them, see their detailed discussion in the Console UI Walkthrough section of this manual, as linked to below in each description.

    When processing an incoming request, L11WAAP enforces the applicable security rulesets. As shown above, some types of rulesets are applicable to all requests, while others will vary depending on each request's destination URL and/or the tags attached to the request. To see how L11WAAP decides which rulesets are applicable to a request, see the Policy Mapping page.

    Overview

    Link11 WAAP acts as a proxy for the backend that it protects. It receives incoming requests, and examines them for potential threats. Requests that pass inspection are passed through to the backend. Those that do not pass inspection trigger an , which often is either a blocking action or a . Along the way, L11WAAP logs the request and the actions that occur, which are available to admins via analytics and dashboards.

    The diagram above shows the progression of incoming requests through this process, shown from left to right. When a request successfully passes a stage, it proceeds to the next stage, as designated by a green arrow. When it does not, it follows the red arrow instead. Black arrows show activities that occur independent of a request's evaluation.

    Stages/components of traffic filtering

    "Request Pre-Processing" Edge Functions

    Before any other processing occurs, L11WAAP can execute one or more . An Edge Function consists of custom Lua code; it allows admins to extend the system's capabilities as desired.

    Each Edge Function contains a parameter. When this is set to Request Pre Processing, the Function is executed immediately, before other processing occurs.

    Initialization

    L11WAAP uses a when processing and evaluating requests. At various points during processing, tags are attached to a request based on its source, content, and other characteristics.

    Subsequently, the attached tags can be the basis for decisions about the disposition of the request.

    In this stage of processing, each request receives a . For example, every request will be tagged with all, along with tags for the geolocation of the traffic source.

    This stage is also when L11WAAP performs : determining which security rulesets should be enforced upon the request.

    Global Filters

    The stage has two primary purposes:

    • Attaching tags when the request matches specified criteria.

    • Executing an depending on the tags that were attached. In some situations, admins will decide to stop ths system's processing at the Global Filter stage. For example, an admin can decide that if the traffic source is found on a hostile IP list, there is no point in analyzing it further; it should just be blocked.

    Flow Control

    In this stage, are evaluated. Flow Control allows admins to define and enforce sequences (flows) of requests submitted by traffic sources.

    Example: a web application has a login page. A legitimate user will submit a GET request to access the page, followed by a POST request with login credentials. Conversely, a threat actor waging a brute-force attack might conserve resources by submitting a series of POSTS, without any GETs. A Flow Control Policy can allow the legitimate user to access the page, while excluding the threat actor.

    Global Rate Limits

    Rate limiting restricts the rate at which the system will accept requests from traffic sources. When a limit is exceeded, an action can be taken.

    In this stage, rate limiting is enforced upon incoming requests, regardless of their destination URLs. The limits are defined in with enabled.

    Rate Limits

    In this stage, path-specific rate limiting is enforced. Admins can define different parameters for the limits, depending on the request's destination URL.

    Path-specific rate limiting can be configured in two places within the system:

    • that do not have enabled.

    • , which allow for IP-based rate limiting to be defined for all applications based upon them.

    ACL Profiles

    An defines what will happen to a request, based on the tags that it contains. Admins can assign a variety of available actions that will be performed.

    As shown in the diagram above, three outcomes are possible:

    • The request triggers an .

    • The request is passed, and then subjected to content filtering.

    • The request is passed, but is exempted from content filtering.

    Content Filtering

    In this stage, the applicable is used to evaluate the request. Each Profile defines the applicability of various .

    This stage fulfills the traditional role of a WAF, which is to examine the content of a request for threat signatures and take action when a match is found.

    However, Content Filtering within L11WAAP is much more powerful than this. Admins can configure Content Filter Profiles to allow or block requests if they do have specific characteristics, or if they don't.

    "Request Post-Processing" Edge Functions

    When an has a setting of Request Post Processing, L11WAAP will execute it as the final step in its processing, before sending the request to the backend.

    Customer Backend

    When a request has passed all of the system's processing, it is forwarded to the backend. The backend's response is then obtained, and returned to the client. L11WAAP's interaction with the backend is configured in and .

    After the request is received from the backend, additional Edge Functions can be run: those with Phase settings of Response Pre Processing and Response Post Processing.

    Actions

    Various stages of processing can result in an being executed. Often, this is a blocking action, but as well, including the acceptance of the request and bypassing the remainder of the filtering process.

    Logging

    L11WAAP stores all requests and their details, and makes them accessible in the .

    Analytics and Dashboards

    The and provide customizable displays of traffic and events.

    Dynamic Rules and Quarantines

    L11WAAP periodically reviews the most recent tranche of incoming requests and evaluates them using . Unlike the other stages of analysis described above, this is done after the requests have been processed, and the resulting responses have been returned to the user.

    Dynamic Rules are not meant to pass or block specific requests. Instead, they are used to analyze the overall behavior of traffic sources, as shown in the requests they have recently submitted.

    When a traffic source violates a Dynamic Rule, the traffic source is quarantined. Until the quarantine expires, two things occur:

    • The traffic source is added to the list, where admins can monitor it.

    • The traffic source can also be banned, which means that future requests will be blocked. (As shown in the diagram above, this is done by adding the traffic source to an internal system-maintained Global Filter, automatically.)

    Flow Control Policies

    Tagging valid or invalid session flow patterns

    Overview

    Flow Control Policies allow admins to define "flow" sequences of submitted requests. As incoming traffic is received, the requests are evaluated against the active Policies. If a defined sequence is completed--in other words, if the listed requests are received in the specified order--the Policy will attach one or more tags to the final request in the sequence. The tags can subsequently trigger an action (allow, block, challenge, etc.)

    Link11 WAAP includes several types of behavioral profiling and control. Flow Control Policies are one type of behavioral control that are defined by admins. They can allow, or disallow, traffic sources that display specific patterns of behavior.

    Use case example: A web application has a login page. A legitimate user session will begin with a GET request, followed by a POST. However, threat actors who are waging brute-force login attacks will typically just send a series of POSTs. A Flow Control Policy can be the basis for blocking every POST request that was not preceded by a GET.

    Usage within applications and APIs

    A Flow Control Policy's purpose is to assign its defined Tags to the last request in defined flow sequences. The Tags can then be used in or to trigger specific actions. Usually, a is involved in the process as well (see the implementation example below).

    Unlike some other types of security settings, Flow Control Policies are not assigned to paths in , because a Flow Control Policy can incorporate multiple paths within an application or API.

    Instead, each Policy has its applicable scope defined by the Active, Include, and Exclude parameters, as described below.

    Implementation example

    To implement the GET/POST example mentioned above, an admin would create the following configuration:

    • A Global Filter would assign a tag (e.g., method-post) to all POST requests sent to /login.

    • A Flow Control Policy would assign a tag (e.g., login-flow) to each POST that was preceded by a GET.

    Administration

    The main page (shown above) lists all current Flow Control Policies.

    The administration (addition/deletion/editing/versioning) of Policies follows the conventions described .

    Components

    Each Flow Control Policy consists of:

    • A flow sequence: A list of two or requests that are expected to be received in the sequence shown, within the specified Time frame.

    • Tag(s) to assign to the final request in the defined flow sequence.

    • Include/Exclude: Tags to define the scope within which this Policy is enforced.

    Each of these is described in depth below.

    Individual parameters

    Name

    A name for this Policy, to be used within the interface. A (shown below the Tags field) will include it as well.

    Active

    When this toggle is selected, the Policy will be enforced within its defined scope.

    Time Frame

    This defines the time available for the flow sequence to be completed. When the first request in the sequence is received, an internal timer begins. The final request must be received within the Time Frame in order for the Tags to be assigned.

    Count by

    At any given time, an application might receive a variety of incoming requests from different users simultaneously, each of which might be at a different stage of a flow sequence. For Flow Control Policies to work successfully, the system must be able to differentiate among all the various streams of incoming traffic, and perform stateful evaluations of each one separately.

    The Count by parameter allows admins to define how this differentiation is done. For example, a common configuration is Attribute / IP Address. When the application is receiving requests from multiple IP addresses simultaneously, the requests from each IP will be considered as a separate and distinct set for Flow Control purposes. On the other hand, if it is possible that users will sometimes share IP addresses, then a better choice might be Attribute / Session ID.

    Admins have a variety of configuration options for this parameter. Incoming requests can be processed according to specific headers, cookies, arguments, or attributes.

    Multifactorial Count by definitions can be set up by selecting "New entry" and editing the controls that appear. When incoming requests are evaluated, the Count by definitions are combined with a logical AND.

    Tags

    Enter one or more unique tags, separated by spaces. When a series of incoming requests matches the flow control sequence, the tags listed here will be attached to the final request.

    In addition to these admin-defined tags, the system also shows some system tags that will be attached as well.

    Description

    Information about this Policy, for use within the interface.

    Include and Exclude

    These are lists of tags that can limit the applicable scope for this Policy. Their use is described on the page.

    Flow Control Sequence

    This is an admin-defined sequence of at least two steps.

    The system maintains stateful histories of each traffic stream defined by the Count by parameter. When a series of incoming requests matches the Flow Control Sequence exactly, the final request has the defined Tags attached.

    Each step in the sequence is defined by a Method, Host, and Path, along with any optional parameters added by an admin.

    A new Flow Control Policy includes a two-step sequence by default. To add additional steps, select the "Add Step" button.

    Content Filter Rules

    Signatures of threats and other potential issues

    Overview

    A traditional WAF evaluates incoming requests according to a list of threat signatures, and flags the request if any matches are found.

    Within Link11 WAAP, Content Filter Rules provide the equivalent of these signatures, although they are more powerful and flexible than those within a traditional WAF.

    When a request undergoes the content filtering process, its content is compared to the Rules administered here. When a request matches a Rule, various tags will be attached to it. Those tags can be evaluated, and can cause actions to be taken on the request.

    Usage within applications and APIs

    Content Filter Rules are defined globally within the system, and are available to all Content Filter Profiles.

    The usage of Content Filter Profiles within applications and APIs is explained .

    Administration

    The main page lists all current Content Filter Rules.

    The administration (addition/deletion/editing/versioning) of Rules follows the conventions described .

    Out of the box, L11WAAP includes a wide variety of well-tested Content Filter Rules. Usually, there will be no need to edit their Match criteria (which can be quite complicated). Before deleting or editing a default Rule, admins should consider the implications of doing so.

    If edits are made, and later it becomes desirable to restore an edited Rule to its original form, an admin can revert it using the Versioning capabilities at the bottom of the page.

    Alternately, the original request can be duplicated to preserve it, and marked with an appropriate tag (e.g., inactive) which could then be added to the appropriate Ignore lists.

    For most of the included Rules, their categories and subcategories should make their functions clear. If you have any questions about the purpose of a specific Rule, feel free to .

    Components

    A Content Filter Rule consists of the following:

    • The signature for this Rule. Usually, this represents the characteristics that makes a request hostile. (Match)

    • Organizational parameters for the Rule (Category, Subcategory, Risk level)

    • Tags to apply to requests that match this Rule

    Parameters

    Name

    A name for this Rule, to be used within the interface. A (shown below the Tags field) will include it as well.

    For the default Rules included with L11WAAP, the Names are numeric identifiers. (A production deployment will include a large number of Rules; therefore, they are usually organized/administered by their categories and subcategories.)

    Description

    Information about this Rule, for use within the interface.

    Category

    A general category for this Rule. It will be the basis for a system tag.

    Subcategory

    A subcategory for this Rule, within the general Category. It will be the basis for a system tag.

    Risk level

    A number ranging from 1 (lowest threat) to 5 (highest threat). It will be the basis for a system tag.

    Tags

    A list of one or more tags, separated by spaces. Whenever this Content Filter Rule's Match condition matches a request, these tags will be attached.

    In addition to these admin-defined tags, the system also shows some system tags that will be attached as well.

    The tags are the basis for the decisions made when the applicable is evaluated for a request. They will also appear in the traffic logs.

    Log Message

    (This field is not currently used, but will be in a pending release.) A message that will appear in the traffic logs when a request matches the Match condition.

    Match

    The criteria against which incoming requests will be compared. For Content Filter rules only, regexps are of the hyperscan flavor ().

    Enabling Passive Challenges

    As described here, out of the box Link11 WAAP includes an Active Challenge process. This is very useful in distinguishing humans from bots.

    Active Challenges work well, but an even better option is Passive Challenges.

    • Active Challenges temporarily redirect the user's browser. This can affect site metrics gathered by products such as Google Analytics. (Specifically, the initial referrer information is lost.) Passive Challenges are simple pieces of Javascript. They do not redirect the user's browser; they merely ask it to solve a challenge, and then insert the L11WAAP cookies.

    • Active Challenges will not occur when site content is served from a CDN. Passive Challenges can still detect bots in this situation.

    Most importantly, Passive Challenges allow L11WAAP to use Biometric Bot Detection—an advanced and sophisticated means of distinguishing humans from automated traffic sources.

    Biometric Bot Detection

    With Biometric Bot Detection, L11WAAP continually gathers and analyzes stats such as client-side I/O events, triggered by the user’s keyboard, mouse, scroll, touch, zoom, device orientation, movements, and more. Based on these metrics, the platform constructs and maintains behavioral profiles of legitimate human visitors. L11WAAP learns and understands how actual humans interact with the web apps it is protecting. Continuous multivariate analysis verifies that each user is indeed conforming to expected behavioral patterns, and is thus a human user with legitimate intentions.

    We recommend that all customers enable Passive Challenges if it is possible to do so. Biometric Bot Detection provides much more robust detection of automated traffic than is possible without it.

    Implementation

    Implementing Passive Challenges is simple. Place this Javascript code within the pages of your web applications:

    The code snippet can go into the header or at the end of the page. The best practice is to place it within the header. This ensures that subsequent calls contain authenticating cookies.

    (This matters for the first page served to a visitor. Subsequent pages will already have the authenticating cookies to include with their requests.)

    Most customers set up the code snippet as a tag within their tag manager. This makes it simple to install it instantly across their entire site/application.

    If desired, the script code can include async and/or defer attributes:

    These usually are not necessary, and their effect will depend on the placement of the script within the page. Their use is left to your discretion.

    Testing

    To test the implementation, use a browser to visit a page containing the Javascript snippet. Once it runs, the browser should have a cookie named waap_id.

    Disabling Active Challenges (Optional)

    There are two primary situations where customers sometimes want to disable Active Challenges:

    • When a customer needs site analytics to correctly reflect all referrers. (Active Challenges can interfere with this.)

    • For API endpoints. Active Challenges are designed to verify the client's browser environment; for most API calls, there is no browser environment to verify. (For users of our , this is not a problem. They can still use active challenges for these endpoints.)

    Other than those situations, Active Challenges can be very beneficial.

    We recommend that you keep Active Challenges enabled if possible. They automatically eliminate almost all DDoS traffic, scanning tools, and other hostile bot traffic.

    If you wish to turn off Active Challenges, do the following.

    • Decide which paths/URLs should have Active Challenges disabled.

    • Make a list of the that are enforced upon those paths/URLs.

    • Ensure that this combined list of Security Policies does not apply to any paths/URLs where you wish to keep Active Challenges enabled. If there are some undesired paths/URLs included, split them off into separate Security Policies that are not part of the list. When you are done, the list of Policies should include all desired paths/URLs, and only those paths/URLs.

    Note that the acl-deny-bot ACL Profile includes the all tag in its Bot Challenge / Apply column. As described above, for all Security Policies that use this Profile, you could exempt some traffic sources from Active Challenges by adding tags to the Bot Challenge / Skip column, or all traffic sources by removing the all tag.

    However, if this were done, then this Profile would not behave in the way that its name implies. This can cause confusion later: not only during administration, but also when viewing events in the Dashboard and Events Log. To avoid this situation, we recommend that this default Profile should not be edited. Instead, admins should create a separate one for use in the relevant Security Policies.

    Turning off Active Challenges will disable the direct blocking of bots (where a requestor is blocked merely for being identified as a bot). However, automated traffic will still be excluded via all other relevant means.

    If you have not enabled Passive Challenges (and successfully tested them), disabling Active Challenges is not recommended.

    Enable mTLS (mutual TLS)

    Overview

    Link11 WAAP supports mTLS encryption. This is optional, and can be enabled separately for:

    • Communication between Link11 WAAP and customer backends, for one or both ends of the pipeline.

    • Communication between clients (end users) and L11WAAP.

    To enable mTLS for an end of a pipeline, the appropriate certificate must be supplied. Their names within the system are as follows:

    How it works

    L11WAAP-to-customer-backend mTLS

    Configuring mTLS to the customer backend is straightforward. After enabling this feature (as described below), admins add certificate(s) and assign them to . Once configured, L11WAAP will use mTLS when communicating with customer origins.

    Client-to-L11WAAP mTLS

    Configuring mTLS to clients also requires feature enablement. Then, admins add CA Certificates and assign them to .

    Once client-to-L11WAAP mTLS is configured, end users will be required to present a client certificate at the beginning of each session during the TLS handshake. L11WAAP will validate the certificate, including the date, issuer, and verification against the . If validation fails, the user will receive an error, and will not be permitted to connect to the protected system.

    Two additional notes about this type of mTLS:

    • In the user interface, mTLS is only available when using an AWS (Network Load Balancer). To enable mTLS when using a Link11 load balancer, contact support.

    • mTLS verification does not exempt a client from other types of traffic filtering. Even if a client successfully establishes an mTLS connection with L11WAAP, its requests will still be blocked if they originate from a banned source, or exceed rate limits, or match a content filtering signature, etc.

    How to configure mTLS for communication with the backend(s)

    Follow this process:

    • .

    • Upload the certificate(s) in the Server-to-Backend mTLS Certificates tab and/or Server-to-Backend CA Certificates tab(s) of the page.

    • your changes.

    • Assign the appropriate certificate(s) to each Backend Service:

    How to configure mTLS for communication with clients

    Follow this process:

    • .

    • Upload the CA Certificate(s) in the CA Certificates tab of the page.

    • your changes.

    • Assign the appropriate certificate to each Server Group:

    Using curl

    While Swagger UI provides a visual interface into the API, it is often desirable to send API calls via the command line. For this, curl can be used.

    Required information

    To send a curl request to the API, two things are required:

    • An API key

    • The curl command string

    Obtaining an API key

    If an API key is not already available from previous API usage, the following steps should be followed.

    1. Log into the planet console using a Link11 WAAP account (i.e., without using SSO). The account must have an of Editor or higher.

    2. Navigate to by selecting the user icon on the top right of the page

    3. Navigate to Account Details -> API Keys. (If Account Details is not displayed in the Account menu, verify that the login was done directly into the planet using an L11WAAP account. If SSO is used, Account Details will not be available in the interface.)

    Using Swagger UI to construct the curl command string

    Sending an API request via Swagger UI will also construct and display its curl command string:

    1. Navigate to .

    2. Expand the desired namespace, and then the desired route within the namespace.

    3. Select the "Try it Now" button

    4. Edit the input fields (if any), providing all required inputs

    To send this request using curl, edit the command string to include an additional header (Authorization:Basic) for the API key obtained earlier.

    Example

    When Swagger UI is used to get a list of configurations via GET /api/v4/conf/configs, it will also display this curl command:

    To submit this command directly via curl, the following header must be added:

    ...without the <>, and where api-key-obtained-earlier is the string obtained .

    Manually constructing the curl command string

    API calls using curl are constructed according to these requirements:

    • The API key is included, as explained above

    • Input parameters defined as query are encoded into the URL

    • Input parameters defined as header are included as headers

    • Input parameters defined as Request body are included via curl's -d

    Example: query and header parameters

    A route to retrieve traffic data has this definition:

    Note that limit, offset, filters, and debug are marked as query parameters, and therefore, will be encoded into the URL. However, syntax and provider are marked as header parameters.

    The resulting curl command will look like this:

    Example: request body

    The POST /api/v4.0/data/timeline/parse call includes this input:

    Let's say that an admin wants to submit the string timestamp between 2024-06-06 09:31:00 and 2024-06-06 09:36:00, status=301. The curl command would look like this:

    Certificates

    Administration of SSL certificates

    Overview

    This section allows admins to manage SSL Certificates. There are four kinds of certificates, each with its own tab:

    • Server Certificates, so that clients (end users) can communicate with Link11 WAAP using HTTPS.

    • CA Certificates, so that Link11 WAAP can validate clients for mTLS communication.

    • Server-to-Backend mTLS Certificates, so that customer origins can validate Link11 WAAP for mTLS communication.

    • Server-to-Backend CA Certificates, so that Link11 WAAP can validate customer origins for mTLS communication.

    Server Certificates are necessary for end users to communicate securely with Link11 WAAP. The other types of certificates are optional, and are only necessary for using mTLS (mutual TLS).

    Here is a diagram of the different types of certificates:

    Out of the box, Link11 offers management of Server Certificates.

    To enable management of the other types of certificates so that their tabs appear in the interface, follow the instructions here: .

    Usage within applications and APIs

    Server Certificates can be attached to , or to domains via .

    Similarly, CA Certificates are also used in Server Groups. However, they are only available in the interface when using AWS NLB (Network Load Balancing). When using a Link11 load balancer, please contact support.

    Server-to-Backend mTLS/CA Certificates are used in .

    Administration

    The list of currently defined Certificates is displayed in each tab. From here, new certificates can be generated, or existing ones can be edited.

    When adding new certificates, publishing your changes is necessary to make the new certificates available for use in the system.

    All four types of certificates are administered using the same procedures, described below.

    Securing private keys

    By default, Link11 WAAP offers admins the ability to auto-replace certificates using Let's Encrypt, and to download certificates in PFX format. To remove these features from the web console and API, .

    Generating a Certificate

    Selecting the + New button displays the Upload Certificate dialog:

    Certificates can be added manually, or L11WAAP can parse a PFX file.

    When using a GCP load balancer, the certificate must meet these requirements:

    • It must be in .

    • It cannot be protected by a passphrase. Google Cloud stores the private key in its own encrypted format.

    Editing/Configuring a Certificate

    When an existing Certificate is edited, the Edit Certificate dialog appears:

    Editable parameters and controls

    Auto Replacement by Let's Encrypt

    Let's Encrypt is a free certificate authority service. L11WAAP integrates with it, and offers this service by default.

    Once a day, L11WAAP will check each application it protects. If that application's certificate is going to expire in the coming week, and its Auto Replacement by Let's Encrypt option for that certificate is enabled, L11WAAP will generate a new certificate using Let's Encrypt, and will attach all of its sites to the new certificate.

    This feature can be disabled in the web console and API if desired. Contact support to do this.

    Attach To Application

    This tab includes a list of Server Groups. Selecting one will connect this Certificate to it.

    Replace Existing Certificate

    This tab includes a list of Certificates defined within the system. Selecting one and then clicking Save will result in all sites/applications being transferred from the selected Certificate over to the Certificate you're currently editing.

    Download PFX

    This will download the certificate information as a file in PFX format.

    This feature can be disabled in the web console and API if desired. Contact support to do this.

    Edge Functions

    Release Notes

    November 24, 2025

    What's New

    Edge Functions

    Running custom code during traffic processing

    Overview

    An Edge Function (EF) allow you to extend Link11 WAAP's tools and functionality. An EF consists of Lua code that can be run at different points in L11WAAP's traffic processing.

    An EF can be configured to execute before any other processing occurs. Therefore, it can override or preempt other configured settings within L11WAAP.

    Or, it can be run after traffic filtering has been completed. An example use case is .

    The Link11 WAAP API

    This section explains the usage of L11WAAP's API.

    Overview
    Internal data structures
    Using Swagger UI
    Using curl
  • Open the Backend Service in the Backend Service Editor page.

  • Select the appropriate certificate(s) in the dropdown list(s).

  • Save and publish your changes.

  • Open the Server Group in the Server Group Editor page.

  • Select the appropriate CA certificate in the dropdown list.

  • Select the desired mode.

  • Configure CRLs (Client Revocation Lists), if desired

  • Save and publish your changes.

  • Backend Service(s)
    Server Groups
    Client Revocation List
    NLB
    Enable the desired type(s) of server-to-backend certificates within the system
    Certificates
    Publish
    Enable CA Certificates within the system
    Certificates
    Publish
    Certificates
    Backend Services
    Action
    bot challenge
    Edge Functions
    Phase
    tag-based system
    specific set of system tags
    policy mapping
    Global Filters
    Action
    Flow Control Policies
    Rate Limit Rules
    Global mode
    Rate Limit Rules
    Global mode
    Proxy Templates
    ACL Profile
    Action
    Content Filter Profile
    Content Filter Rules
    Edge Function
    Phase
    Proxy Templates
    Backend Services
    Action
    other actions are possible
    Events Log
    Dashboard
    Events Log
    Dynamic Rules
    Quarantine

    An ACL Profile would Block/Skip all requests tagged with login-flow, and Block/Apply all requests tagged with method-post.

    Count by parameters for identifying distinct flow sequences within incoming traffic. In other words, these settings tell the system how to separate incoming requests into distinct groups, each of which will be evaluated separately for flow sequence analysis. Usually, admins will want to enforce flow sequences on individual users (for example, according to IP address).
  • General parameters for administrative purposes.

  • Rate Limit Rules
    ACL Profiles
    Global Filter
    Security Policies
    here
    system tag
    UI Overview
    A Flow Control Policy, opened within its Editor page
    Log message for requests that match this Rule (this field is not currently used, but will be in a pending release)
  • General parameters for administration (Name, Description)

  • here
    here
    contact Support
    system tag
    Content Filter Profile
    syntax
    Its encryption algorithm must be either RSA-2048 or ECDSA P-256.

    To create a new private key, use one of the following OpenSSL commands.

    • Create an RSA-2048 private key:

    • Create an ECDSA P-256 private key:

    ...where $PRIVATE_KEY_FILE is the path and filename for the new private key file.

    How do I enable mTLS
    Load Balancers
    Server Groups
    Backend Services
    contact support
    PEM format
    For each Security Policy in the list:
    • To completely disable Active Challenges, ensure that its ACL Profile does not include any tags in the Bot Challenge / Apply column.

    • To partially disable Active Challenges, ensure that its ACL Profile has the proper combination of tags in the Bot Challenge / Skip and Bot Challenge / Apply columns.

    More information about this.
    Mobile SDK
    Security Policies
    Select "New" -> Enter a name for the key -> "Confirm"
  • Copy the value of that key for use within curl. (Note: this is the string that the system generated, not the name you supplied.)

  • Select the "Execute" button

  • After sending the request, Swagger UI will display the curl command string. Copy this.

  • option
    Access Level
    Account
    the planet's instance of Swagger UI
    above
    openssl genrsa -out $PRIVATE_KEY_FILE 2048
    openssl ecparam -name prime256v1 -genkey -noout -out $PRIVATE_KEY_FILE
    <script src="/c3650cdf-216a-4ba2-80b0-9d6c540b105e58d2670b-ea0f-484e-b88c-0e2c1499ec9bd71e4b42-8570-44e3-89b6-845326fa43b6" type="text/javascript"></script>
    <script async src="/c3650cdf-216a-4ba2-80b0-9d6c540b105e58d2670b-ea0f-484e-b88c-0e2c1499ec9bd71e4b42-8570-44e3-89b6-845326fa43b6" type="text/javascript"></script>
    <script defer src="/c3650cdf-216a-4ba2-80b0-9d6c540b105e58d2670b-ea0f-484e-b88c-0e2c1499ec9bd71e4b42-8570-44e3-89b6-845326fa43b6" type="text/javascript"></script>
    curl -X 'GET' \
      'https://www.mysite.com/api/v4/conf/configs' \
      -H 'accept: application/json'
    -H 'Authorization:Basic <api-key-obtained-earlier>'
    curl -X 'GET' \
      'https://mysite.com/api/v4.0/data/logs?limit=100&offset=0&filters=%7B%22AND%22%3A%5B%7B%22field%22%3A%20%22timestamp%22%2C%20%22value%22%3A%20%5B%222024-06-02T00%3A00%3A00%22%2C%20%222024-06-03T00%3A00%3A00%22%5D%2C%22op%22%3A%20%22between%22%7D%20%5D%7D&debug=false' \
      -H 'accept: application/json' \
      -H 'syntax: json' \
      -H 'provider: bigquery' \
      -H 'Authorization:Basic kFiudeEIOSd18dDineS2wn98sIO'
    curl -X 'POST' \
      'https://mysite.com/api/v4.0/data/timeline/parse' \
      -H 'accept: application/json' \
      -H 'Content-Type: application/json' \
      -H 'Authorization:Basic kFiudeEIOSd18dDineS2wn98sIO' \
      -d '{
      "query": "timestamp between 2024-06-06 09:31:00 and 2024-06-06 09:36:00, status=301"
    }'
    AI traffic analytics: The new AI Management Dashboard provides analytics of requests originating from AI crawlers.
  • AI traffic management: AI crawlers can be blocked or otherwise managed as needed; configuration can be set up per-crawler and at various scopes (from globally down to individual URLs). Visitors referred by these services (e.g., chatgpt.com) can also be handled uniquely if desired.

  • Dynamic management of Trusted Sources: Each Proxy Template includes a list of trusted sources: IP ranges from which Link11 WAAP will accept traffic (for example, load balancers or a CDN). Previously, the list of trusted IP ranges had to be managed manually. Now, Global Filters can also be added as Trusted Sources; when a Filter is updated, the linked Proxy Template will be updated dynamically as well.

  • October 6, 2025

    What's New

    • Custom traffic log annotations: Edge Functions can now be used to inject custom messages into events for better visibility, monitoring, debugging, etc.

    Fixes

    • Excessive request sizes: Resolved an issue where excessively-large requests were blocked, but the reason was not logged.

    • Log exceptions: Resolved an issue where a name-resolution exception would produce excessive error messages.

    September 8, 2025

    What's New

    • Control over Log Exporter data: To better manage syslog messages, admins can now define maximum-length limits for various Log Exporter fields. Exported data values will be truncated to those limits.

    August 18, 2025

    What's New

    • Tag visibility via Edge Functions: Post-processing Edge Functions can now access information about the tags attached to the request.

    Fixes

    • Malformed body inspection: Resolved an issue where requests with malformed bodies were not being fully inspected. As part of this bug fix, all Content Filter Profiles had the malformed-body tag added to their Ignore sections. To enable content filtering on malformed bodies, this tag can be removed; however, note that this can potentially result in performance degradation and False Positive alarms.

    • mTLS cancellation: Resolved an issue where mTLS, when previously enabled but subsequently disabled, was still being enforced.

    July 28, 2025

    What's New

    • CRLs (Client Revocation Lists) for mTLS: When mTLS has been enabled for communication with clients, admins can use CRLs to verify client certificates. Unauthorized or compromised clients will be rejected without waiting for certificate expiration.

    • Enhanced traffic data exporting: Log Exporters now include an option to include a Base64-encoded representation of the HTTP request (its headers, cookies, and query arguments). Customers can now extract and inspect the auth token and other metadata required for customer identification and security analysis.

    • Modal display of entities in Tag Finder: In the Tag Finder, the user can view a list of security entities that use or can generate a specific tag, and can open each one. Previously, entities were opened in their appropriate editors; now, to preserve session context, each one opens in a read-only window.

    • Security Policy path map search capability: When editing a Security Policy, the Path Mapping table now has Filter fields at the top of each column for quickly finding specific entries. Regex is supported.

    • Multi-regional independent load balancing: For planets spanning multiple regions, individual load balancers can now be defined, each with distinct settings. Each load balancer can have a list of preferred datacenters to which it will send its traffic for processing, so that admins can ensure optimal routing within geographic regions.

    Fixes

    • Dashboard Top Metrics query building: Resolved an issue that could occur when examining a Top Metric, where the Events Log (matching) option would open the Events Log, but without pre-populating the query.

    • Let's Encrypt certificate generation: Resolved an issue where using the Redirect HTTP to HTTPS Edge Function could prevent the generation of Let's Encrypt certificates.

    July 7, 2025

    What's New

    • Validation of customer backends for mutual TLS: Previously, admins could configure mTLS so that Link11 WAAP would validate end users, and customer backends would validate L11WAAP. This release adds support for validation of customer origins by L11WAAP.

    • Additional certificate visibility: The Certificates page now includes a consolidated column for cloud providers and a new column showing whether the certificate was issued by Let's Encrypt.

    • Passive challenge cookies: As part of the recent Link11 rebranding, passive challenge cookies have been renamed. (Previously, they were rbzid ; now, they are named waap_id.) Admins should ensure that if any security rulesets (such as Rate Limit Rules, Dynamic Rules, etc.) were based on these cookies, that these rulesets are updated.

    Fixes

    • User interface: Resolved some minor issues in the UI.

    • Edge Function redirects: Resolved an issue where requests redirected during the Request Pre Processing phase were not being logged.

    • SSL certificate renewal: Resolved an issue where customers using Link11 load balancing could have difficulties when auto-renewing certificates.

    • Adding a Backend Service: Resolved an issue where an existing Backend Service configuration couldn't be duplicated.

    June 17, 2025

    What's New

    • Extended mTLS support: Mutual TLS is now supported between L11 WAAP and customer backends.

    • Easier use of Edge Functions: Edge Functions can now be connected to Security Polices from within the Edge Functions Editor.

    • Enhanced HTML pages for Block actions. Previously, blocking Actions included a minimalistic default response. Actions that still contain this default (a Content value of access denied) will be upgraded to a rich HTML page, based on the customization tokens introduced in release v5.3.15. Admins can also create their own customized response pages.

    Fixes:

    • Content Filtering triggers: Resolved an issue that could occur when a Content Filter Rule blocked a request, but in the logs, the trigger for the block would be misidentified.

    • Dashboard chart rendering: Resolved an issue where charts would not correctly respond when the user zoomed in or out.

    • Events blocked by origin: Resolved an issue where requests blocked by the backend could be shown in the Dashboard as "passed".

    • Log Exporter behavior: Resolved an issue where Log Exporters that aren't correctly configured would generate excessive amounts of traffic data.

    • Truncated event data: Resolved an issue where excessively large requests (those exceeding the maximum allowable log entry size) were not being correctly truncated in the Events Log.

    May 21, 2025

    What's New

    • Enhanced granularity for Dashboard queries: When querying traffic data for the Dashboard, admins can now filter by domain.

    • Self-generated SSL certificates: Customer systems can now communicate directly with Let's Encrypt to generate or renew their own certificates using the ACME protocol. In previous releases, the resulting challenges from LE would be dropped; now, Link11 WAAP will pass LE responses through to the customer backend.

    • SSL private key security: Planets can now be configured so that certificates cannot be downloaded or replaced.

    • Enhanced Events Log display for large quantities of arguments: In the April 17 release, it became possible (using an internal setting) to defer argument retrieval until the admin chose to see them. In the current release, this has been refined further; when a large quantity of arguments is displayed, the UI will present them in a user-friendly table that includes search capabilities.

    • Enhanced granularity when offloading IP blocking: In Dynamic Rules, when offloading IP blocking to Link11's Layer 3 protection, admins can now use Include/Exclude tags to narrow down the applicable scope of the Rules.

    Fixes

    • User agent visibility: Resolved an issue in the Events Log where long user-agent strings were being truncated.

    • Events Log results display: Resolved an issue where the dropdown list offering different quantities of results was sorted incorrectly.

    • Proxy Template creation: Resolved an issue where a Proxy Template containing an Advanced Configuration could not be duplicated.

    • Analytics date/time specification: Resolved an issue where the date/time selection control was displaying some options on a transparent background.

    • Site-level Rate Limit Rules: Resolved an issue where site-level Rules were not backwards-compatible with certain automated updates.

    • Quarantined IP duplication: Resolved an issue where a misbehaving IP could be added to the Quarantine list more than once.

    • Log Exporter unavailability: Resolved an issue where a certificate without a CN could make Log Exporter configurations unavailable.

    • Query parameters display in the Events Log: Resolved an issue where requests could be shown with duplicated parameters.

    • UI issues: Resolved several minor issues in the web console.

    April 28, 2025

    What's New:

    • Rebranding: The Link11 WAAP interface has been throughly updated, presenting a new look as part of Link11's rebranding.

    • Enhanced Events Log filtering: Events Log queries can now be filtered by domain.

    • Customizable block responses: Admins have additional ways to customize the responses to blocked requests.

    • Edge Function flexibility: Admins have additional options for timing the execution of Edge Functions.

    Fixes:

    • Duplicate tags in Content Filter Profiles: Resolved an issue where the Content Filter Profiles Editor could display tags twice in the Ignore Content Filter Tags field.

    April 17, 2025

    What's New:

    • Improved Dashboard performance: The Dashboard is now more responsive when the planet is undergoing a large attack.

    • Improved Events Log performance: Events Log entry display is now more performant for requests containing large, or a large number of, arguments. Argument retrieval can be deferred until the user selects them for viewing.

    • Easier applications of Rate Limit Rules: A Rate Limit Rule can now be attached to all Security Polices with a single action in the UI. Admins can then delete individual attachments as desired.

    • Immediate SSL certificate generation: When a domain is added to a Server Group, and the change is saved, a Let's Encrypt certificate can be generated for it immediately. (Previously, this did not occur until the changes were published.)

    • Improved visibility of Global Filters, Dynamic Rules, Server Groups, and Proxy Templates: Each of these list pages has a new column, showing more information to reduce clickthroughs to the respective Editor pages. The new columns are:

      • For Global Filters: whether or not the Filter is system-managed, and the numbers of Sections and Entries in the Filter's Rule list

      • For Dynamic Rules: the Target field

      • For Server Groups: the number of hosts

    • Improved visibility for passed requests: Requests sent to the customer origin now receive additional tags (sent-to-origin and upstream-status:xxx). Use cases include better analysis of potential False Positives, and using Dynamic Rules to exclude requests that reached the origin.

    • AWS CDN purging: AWS CDN caches can now be purged from within the Link11 WAAP interface.

    • Additional mTLS options: For communication with clients, admins can now configure a Server Group with these options:

      • Do not request a CA certificate

      • Request and require a valid CA certificate

      • Request but not require a certificate. If the client provides a certificate, it must be valid for communication to continue.

    Fixes:

    • Global Filter editing: Resolved an issue where the Global Filters editor had high latency when a Filter contains a large number of sections.

    • PEM file import: Resolved an issue preventing the import of PEM files in Windows format (with CRLF end of lines).

    • Custom backend configuration: Resolved an issue where Proxy Template Custom Configuration Code location-level commands to add headers were not working.

    • Log Exporter configuration: Resolved an issue preventing Log Exporters from having their ports changed.

    • Security Policy paths: Resolved an issue preventing multiple Security Policies from containing the same path mapping.

    • Load Balancing certificates: Resolved an issue where CA certificates were displayed in the list of potential certificates for the LB.

    March 24, 2025

    What's New:

    • More flexibility when configuring Rate Limits: Admins can now apply a rate limit to an entire site.

    • Improved CAPTCHAs: Interactive challenges are now more robust. (Some potential methods of bypassing them are no longer possible.)

    Fixes:

    • Dashboard: Resolved an issue where the Topx table would sometimes fail to load.

    • SSL certificates: Resolved an issue preventing server certificates from being replaced.

    • SSO session expiration: Resolved an issue where a user logged in via SSO could potentially lose unsaved configuration changes when the SSO token expires. Now, unsaved data is maintained through the expiration/re-login process.

    • UI: Resolved an issue where the Tag info panel would sometimes fail to open.

    March 5, 2025

    What's New:

    • End-to-end encryption now supported: Client traffic can now be forwarded to the customer origin while remaining SSL encrypted, e.g. to satisfy PCI 3DS requirements. To enable this feature, contact Support.

    • Assigning Rate Limit Rules to multiple paths: Admins can now assign a Rate Limit Rule to all defined paths within a site, which creates a separate entry for each path automatically. Individual entries can then be edited or deleted as necessary.

    • mTLS (mutual TLS) support between clients and L11WAAP: Admins can now upload CA certificates and assign them to Server Groups. Clients attempting to access the specified sites will be required to present certificates, the issuers of which will be validated. This feature was already available when using Link11 load balancers (although it needs to be configured by Support); now it is available for AWS NLB as well, through the user interface and API.

    • Multiple load balancers now supported: Within the Link11 private cloud, admins can now create multiple load balancer configurations, e.g. various ports can now be opened for a single planet.

    Fixes

    • Duplicate quarantined IPs: Resolved an issue where during an attack, a hostile IP could be added to the Quarantine list multiple times.

    • Offloaded IP blocking: Resolved an issue where an IP that was offloaded to Layer 3 protection would not be blocked immediately.

    • Internal service resilience: Resolved an edge case where if a certain internal service crashed, the system would not try to restart it.

    • Creating Mobile Application Groups: Resolved an issue where duplicating an existing Mobile Application Group would fail.

    • UI: Added some minor improvements to the web console.

    February 10, 2025

    What's New:

    • SDK for mobile applications: The L11WAAP Mobile SDK, previously only available for v2.x, is now available for v5. This is a unique client certification mechanism for iOS and Android apps. In use, the SDK signs the application, authenticates the device, and verifies user identity, adding a cryptographic HMAC signature to each request. The SDK provides a reliable and secure mechanism to confirm that the traffic is originating from a legitimate app user and not a bot or emulator.

    • Additional protocol for Log Exporters: There is now an "Untrusted" option for Log Exporters' Transport protocol, where TLS will be used, but Link11 will not verify the certificate.

    • Improved visibility and performance for requests with malformed bodies: When a request has a large malformed body, the entire body is no longer displayed in the Events Log or exported via Log Exporters. Instead, it is truncated to 500 characters, and the displayed/exported event includes a message to this effect.

    Fixes:

    • Dynamic Rules Editor performance: Resolved an issue where the Dynamic Rules Editor page in the UI would take several seconds to load.

    • Additional resilience for Dynamic Rules: Resolved an edge case when offloaded IPs are quarantined. Previously, if an admin unblocked the IP, and the initial unblocking attempt failed, the unblocking process would not be retried.

    • Content Filter Profiles tag editing: Resolved an issue where editing a tag list (e.g., the Active allowlist) would remove the tags already on the list.

    • Improved web console: Resolved some minor issues in, and added some improvements to, the UI.

    January 13, 2025

    What's New:

    • Improved table search: For various tables in the interface (displaying lists of policies, security rulesets, etc.), it is now easier to find a specific entry:

      • Search fields are displayed at the top of the list. (Previously, they were hidden unless the Filter button was selected.)

      • The search fields now support regex. (Example: entering ^Api will filter the list to only show entries starting with Api.)

    • Easier selection within dropdown lists: Dropdown controls are now easier to use: all options in each list are sorted, and if more than five options are available, the list also contains a Search capability.

    • Removed certificate limits for load balancers in the Link11 Cloud: When L11WAAP is deployed in the Link11 Cloud, the number of certificates per load balancer is now unlimited.

    • Improved consistency of Security Policy API: Some legacy field names were updated.

    • Improved consistency for Autonomous System references: Within the UI and API, some legacy terminology was updated. When mentioning an AS, L11WAAP now consistently refers to it as "organization" rather than "company".

    Fixes:

    • Error-handling of quarantined IPs: Resolved an issue where a request sent from a quarantined IP with a specific syntax error would be blocked, but would not be correctly represented in traffic analytics.

    • Error-handling when publishing: Resolved an issue where a failed publish operation would not recover gracefully.

    December 24, 2024

    What's New:

    • Configuring traffic event streaming within the UI: Configuring event streaming to external destinations (e.g., SIEMs) was previously available only through the API. This feature is now available through the web console as well.

    Fixes:

    • Analytics: Resolved an issue where under certain conditions, the Events Log was not displaying the X-Forwarded-Port headers for requests.

    • Backend SaaS: Improved error handling in the backend services for several edge cases.

    • UI: Resolved several minor issues.

    December 10, 2024

    What's New:

    • Additional ability to purge CDN caches: The Purge CDN Cache command now supports Link11's Secure CDN.

    • Additional options for exporting traffic events: When using Log Exporters to stream event data to an external destination (e.g. a SIEM solution), admins can now choose to export all events, or only events where requests were blocked by L11WAAP. Admins can also choose to export events for all server groups (i.e., sites), or only specific server groups.

    Fixes:

    • Dynamic Rules: Resolved an issue when editing Dynamic Rules that are configured to offload IP blocking to Link11's Layer 3 protection, and that are currently being triggered by one or more IPs. (When such a Rule was deactivated, the triggering IPs would be removed from quarantine, but would still be blocked until the original quarantine period had expired.)

    • Events Monitoring: Resolved an issue where requests that triggered a Monitor action were not being assigned correct tags for their status.

    • Security Alerts: Resolved an issue preventing Security Alerts from being created when they were based upon newly-created Dynamic Rules.

    • Security Policies: Previously, each Policy contained an unused field named "match". This has now been removed.

    • SSL: Resolved an issue where importing a PFX file with multiple domain names would result in an extra space being added to each name after the initial one.

    • SSL: Resolved an issue that could occur when renewing multiple certificates; if a certificate could not be renewed, the remaining renewals would not be attempted.

    November 4, 2024

    What's New:

    • Purging CDN caches: Admins can now purge CDN caches from within L11WAAP, without needing to contact support.

    • Offload IP blocking to Link11 Layer 3 protection: When a Dynamic Rule is blocking a hostile IP, the blocking can be offloaded to Link11's Layer 3 protection. The hostile requests will be blocked before they reach the WAAP, which will increase performance.

    • iCloud IP lists: Global Filters now include a list of iCloud IPs, so admins can, if desired, create distinct handling and security rulesets for requests from those IPs.

    • Log Exporter / Event Streaming: In previous versions, L11WAAP could export log data and stream traffic events to external destinations such as SIEM solutions. This has now been enabled for v5 via the API. Setup details are .

    • Advanced configuration: Link11 advanced support users can now create customized capabilities for customers by defining custom code in Proxy Templates. Note: This capability should only be used by advanced support, as improper use of this capability can severely damage the system.

    Fixes:

    • API: Resolved an issue where Security Policy path mapping entries were not being validated correctly (duplicate values were being allowed).

    • Backend Services: Resolved an issue where the interface for new backend creation included an incorrect default value for the Host field.

    • Events Log: Resolved an issue where selecting an entry to show additional details could display an empty panel.

    September 22, 2024

    What's New:

    • Dynamic Rules and Rate Limit Rules: OR or AND operators were added to the Include and Exclude tag lists, providing more precision and flexibility when specifying the scope of rule enforcement.

    Fixes:

    • Security Alerts: Resolved an issue where alerts were not being sent.

    • UI: Resolved several minor issues.

    September 12, 2024

    What's New:

    • Security Alerts: A security alerting feature has been added (similar to a feature previously available in version 2). When Dynamic Rules are violated, email alerts can be sent to specified addresses.

    • SSL: Admins can now set SSL protocols and SSL ciphers on a server group level via the API. (Previously, these values were hardcoded in a backend file.)

    Fixes:

    • Publishing Resolved an issue where multiple publish operations in a short time were not succeeding.

    • Server Groups: Resolved an issue where a domain could be assigned to more than one group.

    • SSO: Resolved an issue with Azure SSO (from this Microsoft error) where users could not login via PIN or Face ID using the Edge browser.

    • UI: Resolved some minor issues.

    August 14, 2024

    What's New:

    • API: The Swagger display has been updated to reflect API v4.2.

    • API: When a "publish configuration" command is sent before a previous publish operation has completed, a 503 error will be returned. API users should use a retry mechanism to ensure that publish commands are successful.

    • Global Filters: When creating an IP-based filter, users can now specify ipv6 addresses with subnet > 32

    • Traffic logs: Requests that are blocked because they caused processing errors are now shown in the logs.

    • UI: Reblaze logos in the documentation and web console now reflect Reblaze Technologies' new role as part of the Link11 Group.

    Fixes:

    • Dashboard: Resolved an issue where a request with an invalid (null) status would prevent data from being displayed.

    • Dashboard: Resolved an issue where the Response Status Graph was not filtering results according to user selection of "By Origin" or "By Reblaze".

    • Events Log: Resolved an issue where a POST request with a malformed JSON payload was not being correctly reflected in the logs.

    • Events Log: The "Copy Request as Curl" command now includes the protocol in the curl string.

    • Proxy Templates: When an invalid CIDR is added to the list of Trusted Sources, an error message is now displayed in the UI.

    • Publishing: Resolved an issue where, when publishing a configuration change, a "validation failed" error could occur if a temporary file already existed.

    • SSL certificates: Resolved an issue where a failure to renew certificates with more than one domain could cause an internal error.

    • System performance: Resolved an issue where internal database queries could potentially hang. Now a timeout is enforced; if it is triggered, a 408 code is returned.

    July 24, 2024

    What's New:

    • Backend Services: it is now possible to

      • define multiple ports per host for HTTP and HTTPS

      • define multiple hosts when setting up Port Bridge mode

      • define multiple ports when setting up the other modes (Per Request, HTTP Always, and HTTPS Always)

    • Proxy Templates: A new configuration option enables sites to accept requests with client body sizes above 5 MB.

    • Traffic analytics: In the Dashboard and Events Log, the date/time query control now allows the specification of seconds; previously, only hours and minutes could be specified. Timestamps now default to zero seconds (i.e., the query parameter defaults to the beginning of the specified minute); when seconds are zero, they are not displayed in the timestamps.

    Fixes:

    • API: Resolved an issue with the/accounts/api-keysroute, which was not correctly accepting the API key.

    • Backend Services: Resolved an issue where Port Bridge Mode was not working correctly for ALBs (application load balancers).

    • Content Filter Rules: Resolved an issue where a Rule could be configured with an invalid Match parameter.

    • Edge Functions: Resolved an issue where Edge Function identifiers submitted via the API were not being validated correctly, potentially resulting in 502 errors.

    • Events Log: Modified the units for Reblaze time (from ms to seconds), so that it is consistent with other metrics.

    • SSO Configuration: Resolved an issue where Azure SSO was not working correctly.

    Known Issues

    • SSL Certificates: When upgrading from Reblaze v2.x to v5, existing SSL certificates will be retained. However, when they expire, they will not auto-renew. To enable auto-renewal for migrated certificates, contact support.

    July 3, 2024

    What's New:

    • Events Log: the events display has been revamped and is now easier to use. Selecting an event now displays a window with several sections: the most important data on the top, followed by one or more expandable sections with various categories of additional information.

    • Edge Functions: when a user defines custom Lua code, its syntax is now validated before being accepted.

    • Publishing: when a user submits configuration changes for the backend, the changes are now validated before being accepted.

    • SSL policies: default policies for load balancers are now min tls 1.2 - modern (for GCP) and ELBSecurityPolicy-TLS13-1-2-2021-06 (for AWS). This change applies to new planets only.

    Bug Fixes:

    • Analytics: in the Dashboard and Events Log, the preset time period selectors (e.g., "Last hour") were not being reset when the timeframe changed.

    • Backend services: when creating a new backend service, it was possible that an internal id would not be assigned correctly.

    • Content Filter Rules: when creating a new rule, it was possible that an internal id would not be assigned correctly.

    • Dynamic Rules: if a Rule's ID contained a hyphen, an internal error would occur, and the Rule would not be effectual.

    • Events Log: when a host name included a port, under certain conditions the port would be appended again.

    • Events Log: When a request included arguments, the "Copy as Curl" menu option was not composing curl commands correctly.

    • Events Log: When a request triggered a "Skip" action, under certain conditions it could be reported as a "Block reason".

    • Events Log: for data-heavy queries, there could be a significant delay between the query's completion and the UI's refresh.

    • Proxy Templates: when creating a new template, the header host was not being set correctly.

    • SSL Certificates: the Certificates page in the console would not load if its timeouts were exceeded.

    • SSL Certificates: all expiring certificates were being renewed. Now, unused certificates are not renewed.

    • SSL Certificates: under certain conditions, certificate replacements were being reported as having failed, even when they succeeded.

    • Swagger UI was not correctly accepting load balancer names in the Load Balancer DELETE/PUT API routes.

    • Tags: for short tags, it was difficult to click on the portion of the tag that opens the Tag Finder.

    • User accounts: an uncommon structure for email addresses was not being accepted.

    • UI cleanup: in a few places, long strings were not being displayed correctly. Some inconsistencies in capitalization, font colors, and spacing were corrected.

    Known Limitations:

    • Events Log: when viewing events that occurred before this software version was deployed, incomplete "block reason" data will be shown for events blocked due to "general reasons" or "content filter rule" violations.

    June 12, 2024

    What's New:

    • Global Filters: Entries within a Global Filer's Rule can now be edited from within the table. (Previously, they had to be deleted and re-created.)

    Bug Fixes:

    • Backend Services: under certain conditions, users could define multiple hosts in bridge mode.

    • Dashboard: retrieved data was not always being cleared between searches.

    • DNS Records: multiple values were concatenated in a single line. Now, they are displayed in separate rows.

    • Dynamic Rules: Target entry was not displayed correctly if it included an underscore.

    • Events Log: displayed keys and values could be vertically misaligned.

    • Events Log: large data files could overflow the text display.

    • Flow Control: arguments with long strings could overflow the input control.

    • Login screen: empty input fields were not displaying errors.

    • Tag Finder: could display incorrect tag usage.

    • Tag Finder: header row of tags table was too short.

    • Traffic data queries: certain inputs were not being validated for data types.

    • Traffic filtering: Headers with invalid (non-UTF) characters would throw runtime errors. Now, they are blocked with 400 response codes.

    • Web console: "User Guide" link was not pointing to the most recent version.

    • Web console: various minor issues with table column widths, redundant tooltips, and others.

    May 21, 2024

    What's New:

    • Traffic filtering: Headers larger than 64k are now supported.

    • Analytics: the date/time control for queries was accepting AM/PM time specifications. Now, for consistency with graphs and logs, it accepts 24-hour time specifications.

    • Content Filter Profiles: previously, the "Ignore Content Filter Tags" list accepted all types of tags, and there was different behavior when matches were found for CF tags versus non-CF tags. To improve consistency, this list now only accepts Content Filter Rule and libinjection tags.

    • Security entities: previously, selecting "New" would create an entity (e.g., a Global Filter) with default values that could be edited. This created friction if the selection of "New" was inadvertent, because the unwanted entity would then need to be deleted. Now, entities are not actually created until the user selects "Save".

    Bug Fixes:

    • Dynamic Rules: when the Action of a Dynamic Rule was changed, any traffic sources currently in quarantine from the Rule did not have their action changed.

    • Edge Functions: the Edge Function Editor page was not displaying the function's Automatic Tag (edge-function).

    • Edge Functions: when multiple Edge Functions were assigned to the same path, the Events Log was not reporting all of their tags.

    • Security Policies: when a Policy did not include any Rate Limit Rules or Edge Functions, the console failed to display a "No data found" message.

    • SSL Certificates: When certificates were generated from a server group with multiple domains on “Match Host/Authority Headers”, Let's Encrypt was only generating a certificate for the last domain on the list.

    May 14, 2024

    What's New:

    • Reblaze v5 is released; a thorough restructuring of Reblaze, from UI to architecture. Compared to previous versions, v5 provides a much more intuitive workflow, better analytics, numerous performance enhancements, more powerful traffic filtering, and much more.

    When an admin creates an Edge Function, L11WAAP validates the code with a Lua compiler. If any syntax errors are found, an error message will be shown. However, Link11 does not validate the code beyond this. Please ensure that the code is valid and tested before adding it. If the code has errors, undefined behavior can occur when L11WAAP attempts to execute it.

    Edge Functions are a very powerful tool. If you need assistance with this feature, please feel free to contact support.

    Usage within applications and APIs

    Edge Functions are assigned to destination paths/URLs within Security Policies.

    Out of the box, L11WAAP includes a number of Edge Functions. Initially, they are not assigned to any Security Policies, and thus, are inactive by default.

    Administration

    The main window (shown above) lists all current Edge Functions.

    The administration (addition/deletion/editing/versioning) of EFs follows the conventions described here.

    Parameters

    Name

    A name for this EF, to be used within the interface.

    Description

    Information about this EF, for use within the interface.

    Phase

    This specifies when the Edge Function code will be executed.

    Phase
    Description

    Request Pre Processing

    Executes immediately when L11WAAP receives an incoming request, before any other processing occurs.

    • Runs before the security logic.

    • Cannot be preempted/prevented by the security logic, since it executes beforehand.

    • A request might only be blocked here if NGINX itself blocks it (e.g., due to malformed headers or connection limits).

    Request Post Processing

    Executes after L11WAAP has finished processing the request, and before it sends the request to the backend server.

    • Runs after the security logic.

    • Will only be reached if the request is allowed by the security logic.

    • If the request is blocked, this stage will not be executed.

    Response Pre Processing

    Executes when L11WAAP receives the response from the backend.

    • Runs on the response coming back from the origin, before any potential processing.

    • The response cannot be blocked here, as L11WAAP does not evaluate or filter responses from the origin at this stage (unless NGINX does it for some reason).

    Response Post Processing

    Executes as the last action before L11WAAP sends the response to the client.

    • Runs after the response has been processed (e.g., the addition of the upstream-status tag) and just before it is sent to the client.

    • Similar to the previous stage, since there is no security logic evaluating responses, this function cannot be blocked and will execute as normal.

    Code

    The Lua code for the Edge Function.

    Connections to Security Policies

    The list of Security Policies that include this Edge Function. Each Security Policy defines the scope (i.e., the paths within Backend Services) for which the Function will be active.

    For a discussion of how to use this control, see Connections to Security Policies.

    Examples

    Out of the box, Link11 WAAP includes multiple Edge Functions. These can be studied as good illustrations of how to create and use Edge Functions.

    Typically, an Edge Function will leverage built-in capabilities of nginx. Link11 WAAP also includes some custom capabilities, described below with examples.

    Custom Capabilities

    Accessing Tag data

    A use case that sometimes arises is to access the Tags attached to the request during L11WAAP's processing, for case-specific purposes (business logic, customized responses, etc.)

    This can be done in the Request Post Processing phase, with a custom function [ngx.tag_exist] that returns a boolean. Its usage is as follows:

    For example, L11WAAP includes a default Global Filter that adds a tag (cloudfront) to all requests bearing an AWS CloudFront IP. An Edge Function can pass this information to the origin in a header named "is-cloudfront", like this:

    Adding custom messages to log events

    An Edge Function can inject custom messages into events. This can be useful for increasing visibility into traffic logs, debugging, etc.

    The syntax is as follows:

    So, this Edge Function code:

    ...will add Hello world to the event. This message will appear in:

    • the Event Log's Messages section (shown below)

    • and the messages field when retrieving traffic data from the API, or when downloading data from the Events Log.

    custom logic based on the tags that Link11 WAAP attached to the request

    Traffic Reporting and Analytics

    How Link11 WAAP reports on the requests it receives

    Metrics

    The Link11 WAAP and provide intuitive yet powerful ways of viewing your traffic.

    Data is reported in terms of several statistics:

    Events Log

    Revealing the composition and details of your traffic

    Overview

    This page provides the ability to review and analyze the most recent traffic, up to and including real time. It is a powerful tool for traffic control; if a security event occurs, this page will allow you to quickly find its root cause.

    Running a query will display a list of requests matching the specified criteria. Each request can be expanded to display additional details.

    ACL Profiles

    Executing actions based on a request's tags

    Overview

    When a request is processed by Link11 WAAP, a number of are assigned to it during the early stages of the .

    As one of the final stages of processing, the relevant ACL (Access Control List) Profile for this request is evaluated.

    The ACL Profile defines what will happen to a request, based on the tags that it contains. Admins can assign a variety of available actions that will be performed.

    Actions

    Actions to perform in response to traffic analysis

    Overview

    At various stages in the traffic filtering process, Link11 WAAP can execute an action according to the characteristics of the request. These actions are defined within Actions.

    Out of the box, L11WAAP includes several default Actions for admins to select. Additional ones can also be defined.

    Understanding and Diagnosing Traffic Issues

    Leveraging Link11 WAAP's traffic data

    Introduction

    Many security solutions provide information only about the traffic that they block. Contrary to this, Link11 WAAP shows all of the traffic that it receives.

    This provides you with a powerful ability to dig into your traffic data and gain deep understanding about the nature and disposition of incoming requests.

    Metrics about blocked requests are useful, but their usefulness is multiplied when you can compare them to passed requests. By showing all requests, L11WAAP allows you to understand what "normal" requests look like. This gives you more insights into abnormal traffic.

    Types of namespaces

    The Link11 WAAP API includes over a dozen namespaces, each containing a number of routes.

    Each namespace has its own page in the documentation, listing all its routes, their parameters, and so on. These pages can be accessed in the left sidebar, in the .

    The namespace pages are intended to act as a reference. They assume that you're already familiar with how to use the API, which is explained here .

    Also, by default, every L11WAAP planet includes a Swagger UI instance that offers this same namespace information. However, the Swagger instance also provides additional interactive features, such as automatically building curl commands, submitting API calls directly, and more. .

    Below is a general guide to the namespaces, showing the type of functionality each one provides. The namespaces can be organized into three broad categories:

    // returns true if tag1 was attached to the request, false otherwise
    ngx.tag_exist("tag1")
    
    // returns true if tag1 AND tag2 were attached to the request, false otherwise
    ngx.tag_exist("tag1","tag2")
    
    // returns true if tag1 OR tag2 were attached to the request, false otherwise
    ngx.tag_exist("tag1") || ngx.tag_exist("tag2")
    ngx.header["is-cloudfront"] = ngx.tag_exist("cloudfront")
    ngx.ctx.additional_messages = {"$MESSAGE"};
    ngx.ctx.additional_messages = {"Hello world"};

    For Proxy Templates: the usage of Advanced Configuration

    here

    Hits

    Total incoming requests

    Humans

    Requests originating from humans.

    Bots

    Requests originating from traffic sources not (yet) verified to be human. Most of the requestors will be bots, but some will not be. More on this below.

    Passed

    Requests accepted by L11WAAP and passed upstream to the origin (i.e., the web server, API endpoint, etc.).

    Blocked

    Requests deemed to be hostile, and blocked.

    Challenges

    Requests that were challenged. The is an important part of L11WAAP's traffic processing, as seen below.

    The Dashboard provides a variety of ways to view your traffic. Some of them include all of the above metrics in the same view, while others include a subset.

    This graph shows Hits, Blocked, Passed, and Bots
    The Countries view shows all the metrics

    The Challenge Process

    Link11 WAAP includes a multi-layered mechanism for distinguishing between human users and bots.

    In the interface, this mechanism is summarized as "challenges." Requests from non-authenticated users will be challenged, i.e., they will undergo a process through which L11WAAP ascertains if the traffic source can be verified as a human user or not.

    When a traffic source successfully passes the challenge, it will not be challenged again for the remainder of the session. For legitimate users, this entire process happens quickly (in a few milliseconds), and is invisible to the user. Users will perceive no impediment or latency in their access to the requested resources.

    For more details on this mechanism, see Hostile bot detection.

    As noted above, this is the "typical" process that occurs in normal use. There are a variety of situations in which it might not be followed. For example, sometimes L11WAAP is configured to allowlist certain IP addresses, and not to challenge them.

    The discussion below will be based on the typical process described above.

    How Requests Are Reflected in L11WAAP's Statistics

    The process described above will result in the following statistics being incremented.

    For each challenge that was not passed:

    • Hits

    • Challenge

    • Bots

    If the challenge was passed:

    • Hits

    • Challenge

    • Bots (see explanation below)

    • Hits (incremented a second time for the post-challenge resubmission of the request)

    • Passed

    • Humans

    Counting Bots

    Within L11WAAP, a request that does not have authenticating cookies is counted as a bot.

    As a result, the Bot count can sometimes be incremented even when the visitors are humans. Examples:

    • When a human user visits an L11WAAP-protected site for the first time, the first request does not yet have the authenticating cookies.

    • Static files (images, etc.) are often exempted from challenges for performance reasons. Direct requests for those URLs from a new visitor will not have cookies.

    • Sometimes, trusted IPs are whitelisted and exempted from challenges. They never receive authenticating cookies.

    Therefore, although most of the Bot count represents non-human requests to your web application, the Bot metric is not an exact count of this.

    Relationships of Traffic Metrics

    When working with L11WAAP's traffic statistics, the following relationships can be helpful.

    Hits = Passed + Blocked + Challenges

    Hits = Humans + Bots

    Active Challenges versus Passive Challenges

    The process described on this page is the active challenge process. Out of the box, this is the challenge process that Link11 WAAP uses.

    We recommend that whenever possible, customers also enable passive challenges.

    Passive challenges still include Environmental detection and browser verification, while adding three additional benefits:

    • They enable biometric behavioral verification: a much more powerful means of identifying automated traffic, and an important part of L11WAAP's behavioral analysis.

    • In some situations, active challenges can interfere with certain metrics such as those provided by Google Analytics. (The initial referrer information is lost.) If this is a problem, active challenges can be disabled. In this situation, passive challenges can provide effective bot protection instead.

    • When caching is being done by a CDN, active challenges will not occur for pages being served from the cache. Passive challenges are necessary for L11WAAP to perform bot detection in this situation.

    If possible, we recommend that customers use both active and passive challenges.

    To learn more about passive challenges, go here: Enabling passive challenges.

    Statistic

    Comment

    Dashboard
    Events Log

    By default, expanding an entry will display all of its data. When a request contains thousands of arguments, or very large arguments, the data retrieval can negatively affect the performance of the Events Log display. If your planet commonly receives such requests, the Events Log can be configured to only retrieve the arguments when the Arguments tab is selected in the Additional Details display, which will improve performance. To enable this, contact support.

    The Events Log page contains two primary sections:

    • Query specification

    • Query results

    Query specification

    This section determines the events, if any, that will be displayed in the Query results section.

    The top part of this section is identical to the Query specification section on the Dashboard page, except that it contains a button to transfer the current query criteria to the Dashboard. (Note that in order for the query to transfer, it must have been run already.)

    The Events Log also provides three additional controls:

    Download button

    This downloads a JSON file containing complete log data for the requests in the current query results, in this structure:

    ...where each $REQUEST has this structure:

    ...and the $FIELDs are the Field names described here.

    Filter button

    Selecting this button will display a row of controls at the top of the query results. Entering text into a control will quickly filter the results list, to display only those events which match the filter. For example, to only display "Passed" requests, enter P into the Result control.

    Number of results pulldown

    This specifies the number (200, 500, 1000, 1500, or 2000) of the results displayed.

    Query results

    When a query is run, a list of matching events is shown. See screenshot at the top of this page for an example.

    Clicking on an event will open a window with more information, including two expandable sections: Additional details and Messages. (The latter will only appear if there are messages in the event.)

    The user has expanded the "Additional details" section.

    Some of the data shown comes from the request itself, while some of it was added during L11WAAP's processing. Important information in the latter category includes:

    • Block reason: if the request was blocked, the reason will be shown. In the example above, a Global Filter blocked the request. (To conserve compute resources, L11WAAP stops processing a request when a blocking action is triggered. Thus, it's possible that additional problems with the request would have been discovered if further stages of traffic filtering had been performed.)

    • Monitor reason: if the request triggered at least one Action with a Type of "Monitor", the source(s) of this will be shown. Note that Block reasons and Monitor reasons are not mutually exclusive; a request can have both types simultaneously.

    • Tags: the various tags that were attached to the request during processing, shown in blue. User-defined tags are shown in the top section; system-defined tags are shown in the Additional details section.

    • Messages: this section appears if the system has added any messages to the event. These can include .

    The UI displays the most important request data. Full details of an event can be obtained by using the Download button or the Copy Request as JSON command, described below.

    Improving performance by deferring argument retrieval

    By default, when the Events Log responds to a query, all arguments in the requests will be retrieved. In some environments, incoming requests can contain excessively large arguments, or a large number of arguments, either of which can delay the delivery of the results.

    If this situation arises frequently, there is an internal system setting that will defer argument retrieval until a button is clicked (the Show All Arguments button in the Arguments tab). This can improve Events Log performance, and will also make it easier to find specific arguments (because argument data will be displayed in a table with search capabilities).

    To enable this feature, contact support. Note that if this setting is enabled, it will no longer be possible to (successfully) run queries based on arguments, since argument data will not be available when the queries are processed.

    Building queries while investigating security events

    When security incidents occur, the investigator will frequently submit a succession of queries, often starting from a broad scope and then drilling down into a narrower focus while trying to discern the underlying cause.

    L11WAAP provides some tools to make this process easier. When viewing an event, right-clicking on one of its values will reveal a popup menu, as shown below.

    The user right-clicked on "Blocked by origin".

    The menu options are as follows.

    Copy Request as Curl: Copies a curl command containing this request to the clipboard, so that an admin can re-submit that exact request to the system. This can be useful in various situations, e.g., to test a security setting that was modified.

    Copy Request as JSON: Copies the request's log data to the clipboard as JSON for further analysis, including the data and tags added by L11WAAP. The log data structure is the same as described above for the Download button, except that only one request will be returned.

    Copy Value to Clipboard: Copies whatever was right-clicked to the clipboard.

    Show Matching: Adds a filter parameter (for whatever was right-clicked) to the existing query in the Search field at the top of the page. Submitting the modified query will restrict the results to requests that match the field and value that was selected. In the example above, the following string would be added to the query: result="Blocked by origin".

    Hide Matching: Adds a filter parameter (for whatever was right-clicked) to the existing query in the Search field at the top of the page. Submitting the modified query will exclude requests that match the field and value that was selected. In the example above, the following string would be added to the query: result!="Blocked by origin".

    The Dashboard has similar query-filtering capabilities in its Top Metrics section.

    How anomalies are handled

    Excessive request sizes

    Potentially, a very large request could exceed the maximum allowable size of a log entry. This makes it impossible for the system to capture all the request's data in the log.

    In this situation, the system will truncate the log entry by omitting some of the request's details, and the log entry will contain a notice of this.

    Omissions will occur in this order:

    1. Additional log entries (the last section in the Events Log)

    2. Parameters (arguments/headers/cookies, but see note below on protected headers), in this order :

      1. Ignored parameters

      2. Examined parameters

      3. Examined parameters that triggered an Action

    3. Monitor reasons

    4. Block reasons that were not final

    5. Content from the main block reason (e.g., a large value of a parameter), noting the omission with an ellipsis (...)

    The following headers are protected from being omitted when parameters are examined:

    • accept

    • connection

    • content-length

    • content-type

    • host

    • user-agent

    • via

    • x-cloud-trace-context

    • x-forwarded-for

    • x-forwarded-port

    • x-forwarded-proto

    Large malformed bodies

    Requests with large (longer than 500 characters) malformed bodies will have their bodies truncated in the Events Log, and in the events exported via Log Exporters.

    In the event data, the body will be preceded by this message: The request contains a malformed body (displaying only first 500 characters):.

    Note: 500 characters is the default limit, but this can be changed if necessary. To do this, contact Customer Support.

    Malformed JSON payloads

    If a POST request with content-type: application/json contains a malformed JSON payload, the system will not be able to process the payload.

    The event data (in the Events Log entry and any active Log Exporters) will contain an error message, noting that a malformed body was received. However, the system will be unable to parse the body to count the number of arguments. Thus, in the event data, the request will have a tag of args:0, even though strictly speaking, arguments might have been present.

    Note also that the payload will not be subjected to content filtering. Thus, the disposition of the request will depend solely on whether or not it violated other security rulesets (e.g., rate limiting).

    Usage within applications and APIs

    An ACL Profile is assigned to paths/URLs within applications and APIs via Security Policies.

    When a request is received, the system checks its destination URL, and uses the ACL Profile that best matches it.

    Out of the box, the system includes a default ACL Profile. It can (and usually should) be edited, but it cannot be deleted. It is used for all URLs where no other Profile has been assigned.

    Administration

    The main page lists all current ACL Profiles.

    The administration (addition/deletion/editing/versioning) of Profiles follows the conventions described here.

    Components

    Each ACL Profile consists of the following:

    • Six ACL Lists, shown in the UI as six columns organized into four sections. (These Lists are not labeled in the interface, but ACL Lists will be our designation here in the documentation.) Each List contains zero or more tags; these tags are compared to the request's tags. The first List with a matching tag causes an event to occur. See the full explanation of this process below.

    • An Action to execute under certain circumstances (see below).

    • Tags that are attached to requests that are evaluated using this Profile.

    • General parameters for administration.

    How an ACL Profile works

    As mentioned above, an ACL Profile includes six ACL Lists, each of which is shown in a separate column in the interface. Each one includes a list of zero or more tags.

    When a request is processed, its tags are compared to the ones in the Lists. The Lists are evaluated in order from left to right.

    • If a match is not found, the next List is evaluated.

    • If a match is found, then one of the following occurs:

      • The request is subjected to a bot challenge. If it passes, ACL processing continues.

      • The request is exempted from bot challenges, and ACL processing continues.

      • The request is passed to the Content Filter Profile for further inspection.

      • The request is passed, and is exempted from content filtering.

      • The is executed, and processing ends.

    Here is a flowchart of this process, with the evaluation of each ACL List column shown as a decision.

    ACL Lists and some typical applications

    ACL List
    Comment

    Enforce Deny

    Triggers the Action. (In most situations, admins will choose an action that blocks the request. This is a useful way to quickly filter out, with minimal computing overhead, large numbers of requests that are obviously hostile or otherwise unwanted.)

    Bypass

    Allows the request, and bypasses/exempts it from subsequent evaluation by Content Filter Profiles. (Note that any Response phase will still be executed.)

    Bot Challenge / Skip

    Skip the Bot Challenge / Apply stage (the process by which non-human traffic is identified and blocked), and continue processing. An example usage is to allow search engine spiders.

    Bot Challenge / Apply

    If the requestor has not previously been verified to be human, a bot challenge will be issued. If the challenge is passed, the request will continue in the evaluation process. Otherwise the Action is triggered. A common use of this column is to add the all tag, which means to challenge all requests that haven't already passed a challenge, or didn't match a tag in Bypass or Bot Challenge / Skip.

    Block / Skip

    Passes the request to the Content Filter Profile process for further inspection.

    An ACL Profile that blocks requests will only apply to the paths/URLs in the Security Policy where this ACL Profile has been assigned. If you want to block requests globally for specific tags, this can be done by assigning an Action within a Global Filter.

    Be cautious when adding the "all" tag to an ACL List. In most situations, that action will be performed for all requests for which a match was not found in any columns to the left.

    One common use is the Bot Challenge / Apply column, as noted above. This means that all requestors (except for those which matched one of the columns to the left) will be challenged and verified to be humans.

    Another possible use is to place "all" in the Block / Apply column, to create a positive security model. (This will block all requests which did not explicitly meet any of the conditions for Bypass or Block / Skip.) But even this usage can be risky. Unless all the potential conditions for allowing a request are fully and correctly defined, this can result in False Positive errors, and some legitimate requests will be blocked and filtered.

    In other columns, "all" can have serious consequences. For example, placing it in the Enforce Deny column will block all incoming traffic to which this ACL Profile is applied. On the other hand, placing it in the Bypass column will allow all incoming traffic (and exempt it from being scrubbed by the Content Filter Profiles!), except for those requests which matched a tag in the Enforce Deny column.

    Summary: before using the "all" tag in an ACL Profile, carefully consider its ramifications.

    Individual parameters

    ACL Lists

    These six columns are explained above: How an ACL Profile works.

    Name

    A name for this Profile, to be used within the interface. A system tag (shown below the Tags field) will include it as well.

    Description

    Information about this Profile, for use within the interface.

    Action

    The action that is performed when a request matches a tag in Enforce Deny or Block / Apply, or the requestor fails a bot challenge. The actions available here are the defined Actions that are relevant for the Enforce Deny and Block / Apply columns (thus, "monitor" and "challenge" types aren't available here).

    Tags

    A list of one or more tags, separated by spaces. Whenever this ACL Profile is used to evaluate a request, these tags will appear in the traffic logs.

    In addition to these admin-defined tags, the system also shows some system tags that will be attached as well.

    tags
    traffic filtering process
    Usage within applications and APIs

    Actions are available at various stages of the traffic filtering process, e.g. Global Filters, Rate Limit Rules, ACL Profiles, and Content Filter Profiles.

    As shown in the diagram below, different types of Actions can occur at various stages. An Action can terminate the processing of a request by blocking it, but other Actions (Skip, Challenge, and Monitor) are available as well, with different outcomes. See the description below of the Type parameter.

    Administration

    The main page lists all current Actions.

    The administration (addition/deletion/editing/versioning) of Actions follows the conventions described here.

    Components

    An Action consists of the following:

    • The Type of the action

    • Additional Type-specific parameters

    • Tag(s) to attach to requests that triggered this action

    • General parameters for administration

    Individual parameters

    Name

    A name for this Action, to be used within the interface.

    Description

    Information about this Action, for use within the interface.

    Type

    This parameter will be one of the values below.

    Setting
    Effect

    Skip

    Adds the tag(s) to the request, then skips the remainder of the traffic evaluation process (similar to the Bypass option in ). Note that any Response phase will still be executed (as they are not part of the evaluation process).

    Block

    Adds the tag(s) to the request, and sends a response to the user with the defined Response headers, Status code, and Content.

    Challenge

    Adds the tag(s) to the request, and issues a to verify that the user is human.

    Interactive Challenge

    Adds the tag(s) to the request, and issues an to verify that the user is human.

    Monitor

    Adds the tag(s) to the request, and continues to the next stage of without responding to the user. Admins can also define Request headers to add to the request as it is passed upstream.

    Prioritization

    Sometimes Link11 WAAP must choose one of several potential Actions. For example, when a request matches the conditions for multiple Global Filters, each Filter will include an Action. The system must execute the highest-priority one.

    The priority hierarchy is, from highest to lowest:

    • Skip

    • Block

    • Challenges (bot and/or interactive)

    • Monitor

    Tags

    A list of one or more tags, separated by spaces. When this Action is triggered, these tags will appear in the traffic logs.

    Request headers (only available for monitor Actions)

    Additional header(s) to add to the request, which will be sent to the backend.

    Status code (only available for block Actions)

    The status code returned to the user.

    Response Headers (only available for block Actions)

    A list of header(s) to add to the response that is sent to the user, specified as the header name and its value. Example: content-type and text/html.

    Content (only available for block Actions)

    The response sent to the user, of the appropriate format and type. Example: if there is a Request Header of content-type and text/html, then this should begin with <html> and end with </html>.

    This field can contain tokens (preceded and followed by %, as shown in the example below), to customize the response sent to the client:

    Token
    Comment

    Client_IP

    The client's IP address

    Timestamp

    The request's timestamp

    Status_Code

    The HTTP status code being returned to the client

    Host_Domain

    Domain of the destination URL

    Request_ID

    A unique identifier for the request, used internally by Link11 WAAP (and which also appears in the Events Log)

    Session_ID

    A unique identifier for the client's session, used internally by Link11 WAAP (and which also appears in the Events Log)

    By default, Link11 WAAP comes with a rich HTML page, as shown in the screenshot above.

    Here's an example of the Content for a simpler token-based response:

    The discussion below assumes you are already familiar with Query Filter Syntax and Best Practices.

    Gaining General Insights

    L11WAAP provides multiple ways to view your traffic. The discussion below will focus on the Events Log. Similar tactics can be applied when viewing different parts of the Dashboard.

    Sometimes the Events Log is used to answer a specific question about a request or a traffic source. At other times, it might be a more general exploration; for example, a beginning-of-the-day review of what happened over the last 24 hours.

    Let's discuss the latter scenario (a general exploration). Because the Events Log shows all requests, it can be overwhelming. It's helpful to start by excluding requests that aren't as relevant to your current purpose. Examples:

    • Exclude passed requests: result!="Passed"

    • Exclude requests being rejected by the origin (i.e., the upstream server): result!="Blocked by origin"

    • Exclude requests from a banned IP: tags!="ip:192-168-2-3".

    • Exclude requests that are obviously invalid. For example, exclude those with unrecognized host headers: reason~"unrecognized".

    Eventually, you can filter the display down to a list of challenges or blocked requests that might produce some insights.

    From this point, you are looking for possible patterns, or unusual outliers, and considering possible actions to take. For example:

    • Are there a lot of requests for a Wordpress file, but your site does not use Wordpress? These are coming from malicious traffic sources. It might be useful to set up a Dynamic Rule, e.g. to Ban requestors who submit more than one request for that file in a three-minute period.

    • Is the same IP failing multiple challenges? It might be interesting to filter on that IP only, and go through all of its activity, to see what that traffic source was trying to do. (You can see that a challenge is being failed when the challenge itself appears in the logs, but it is not followed by a successful request by the IP for the same URI.)

    • Are there many blocked requests for the same URI, but from different traffic sources? This might be a False Positive alarm. See below for more on this.

    There is no set procedure for this process. Essentially, you are browsing the list of challenges or blocked requests, thinking about why you are seeing the entries there, and asking further questions.

    Translating Encoding in Requests

    Sometimes, request data will be encoded. Here's an example of an XSS attempt:

    default.site/api/?a== %3c%73%63%72%69%70%74%3e%77%69%6e%64%6f%77%2e%6f%6e%6c%6f%61%64%20%3d%20%66%75%6e%63%74%69%6f%6e%28%29%20%7b%76%61%72%20%6c%69%6e%6b%3d%64%6f%63%75%6d%65%6e%74%2e%67%65%74%45%6c%65%6d%65%6e%74%73%42%79%54%61%67%4e%61%6d%65%28%22%61%22%29%3b%6c%69%6e%6b%5b%30%5d%2e%68%72%65%66%3d%22%68%74%74%70%3a%2f%2f%61%74%74%61%63%6b%65%72%2d%73%69%74%65%2e%63%6f%6d%2f%22%3b%7d%3c%2f%73%63%72%69%70%74%3e

    In plain text, this is:

    default.site/api/?a==window.onload = function() {var link=document.getElementsByTagName("a");link[0].href="http://attacker-site.com/";}]

    L11WAAP will decode many requests, but not necessarily all. For example, double-encoded requests will only have their first level of encoding undone.

    In these cases, you can right-click on the string in the UI (for example, the Block Reason field), select Copy Value To Clipboard, and run it through decoding tools. (For example, http://0xcc.net/jsescape/.)

    False Positive Alarms

    A “False Positive” (FP) alarm occurs when a security system misinterprets a non-malicious activity as an attack. These errors are a critical issue for cybersecurity.

    Although it might seem that FP errors do not necessarily have serious consequences, incorrect security alerts can lead to significant monetary losses. For example, an e-commerce site might incorrectly exclude real online shoppers. Or, it might reject "good" web crawlers, which would reduce its Internet visibility.

    FP diagnosis is often done when L11WAAP is first deployed, before it has been fine-tuned for the customer's applications. It can also be done later, when you discover that certain requests are being blocked, but you do not understand why.

    Determining if a block is a FP

    When examining blocked request(s), it can be helpful to ask questions such as the following.

    Is the configuration appropriate for the application?

    Sometimes an application will expect and accept inputs that L11WAAP blocks by default. Example: the site might use a CMS which accepts HTML/Javascript POST requests. However, out of the box, the system is often configured to block requests containing POST. Thus, L11WAAP would need to be re-configured to match the application it is protecting.

    Has the web application been updated, without L11WAAP being updated as well?

    If the range of valid inputs has changed, but L11WAAP was not re-configured, then FP errors can result.

    Is the block happening to multiple users?

    If a single IP is being blocked, but other requestors for the same URI are being allowed through, the block is more likely to be the correct response to this IP's request. This is especially true when the single IP has attempted other questionable activities.

    Conversely, if multiple requestors are being blocked, and they seem to be innocuous otherwise, this indicates the problem might be a FP.

    Is the block being done by L11WAAP, or is it coming from elsewhere?

    There are some situations where a request is blocked even though the system has no obvious reason to be blocking it. This can occur when L11WAAP is not actually the entity making the decision.

    • The upstream server can reject requests. These requests can be displayed in the Events Log with result~"origin" as the filter.

    • L11WAAP can use external sources of information. Out of the box, L11WAAP includes a number of Global Filters based on threat intelligence feeds. Although a given traffic source might not be triggering any of L11WAAP's explicitly-configured security settings, it can still be blocked based on factors such as these.

    Is this a FP that resulted from incorrect user actions?

    Example: a web user visited a landing page, entered contact details into a form, and then tried to proceed to the next page. However, the request to proceed was blocked.

    This could be a FP due to "junk input." Perhaps the user entered a phone number of "1111111111" and it was rejected by the upstream application. Or perhaps the page itself autocompleted a field and inadvertently created junk input on its own.

    Is this a FP that resulted from faulty or too-restrictive parameters within L11WAAP?

    If requestors are being blocked for violating rate limits, and the rate limits are very stringent, then perhaps the limits are too tight, and they need to be relaxed.

    Or, perhaps the block is the result of content filtering. This feature is powerful, and it is possible to mistakenly configure it to be too restrictive.

    Example: requests are being blocked because of a Content Filter Rule that contains this Match condition:

    (?i)(select|create|drop|\<|>|alert)\W

    The admin wrote this regex in order to identify SQL injection attempts (i.e, SELECT, CREATE, and DROP commands. Normally SQL and code injection attempts are blocked automatically by L11WAAP, but occasionally customers choose to disable this).

    Now let's examine one of the blocked requests in the Events Log. It contains this:

    https://www.pinterest.com/pin/create/button/?url=https%3A%2F%2Fexample.com%2Fpitbull-2012%3Frt%3Dstorefront%26rp%3Dpitbull%26rn%3DPitbull%26s%3Dhanes-S04V%26c%3DBlack%26p%3DFRONT&amp;media=&amp;description=

    This can be decoded with a tool such as http://0xcc.net/jsescape/. It now becomes this:

    https://www.pinterest.com/pin/create/button/?url=https://example.com/pitbull-2012?rt=storefront&rp=pitbull&rn=Pitbull&s=hanes-S04V&c=Black&p=FRONT&amp;media=&amp;description=

    Now let's see why the regex condition matched the request. On https://www.debuggex.com/, it's possible to paste in regex and a string, and see if/where a match occurs.

    The result from deguggex.com

    Notice the highlighted (in yellow) part of the string in the bottom textbox. This shows which part of the bottom string matches with the regex in the box above it.

    We see that the expression that was meant to identify an SQL command of CREATE, is also matching with the URL generated by a user who was trying to feature this site's product on Pinterest.

    This indicates that the regex should probably be modified, so that it only accomplishes its intended purpose. In this example, it could be modified as follows:

    (?i)(\sselect|\screate|\sdrop|\<|>|alert)\W

    This would require a space to be found before each potential SQL command, thus eliminating matches when those words are found in a URL.

    Summary of FP Detection

    As mentioned earlier, there is no set procedure for the process of identifying the underlying reasons why requests are blocked. It requires digging into the requests, gathering data, and asking questions.

    Hopefully the examples above are helpful in illustrating the necessary thought process, and some of the tools that are available.

    • Security settings

    • Site-related settings

    • Other capabilities

    Security settings

    API namespace
    Full discussion of these settings in the UI

    Site-related settings

    API namespace
    Comments

    For managing the services L11WAAP is protecting.

    For managing SSL certificates.

    For running custom Lua code.

    For managing SSL associated with load balancers.

    For configuring Mobile SDK parameters.

    For managing architectural parameters.

    Other capabilities

    API namespace
    Comments

    For managing , the fundamental internal data structure

    For and managing

    For such as a SIEM solution

    For planet-level settings such as

    For retrieval of data

    For miscellaneous capabilities, including

    Namespace reference section
    Using the Product / The Link11 WAAP API
    Read more about this

    Server Groups

    Overview

    This section defines Server Groups: the highest level of organization within Link11 WAAP. A Server Group is based on a Proxy Template, and contains at least one SSL Certificate and a Security Policy.

    Usage

    The usage of Server Groups is explained in detail here: .

    Typically, a Server Group represents a single domain.

    Administration

    The main window (shown above) lists all currently defined Server Groups.

    The administration (addition/deletion/editing/versioning) of these Groups follows the conventions described .

    Parameters

    Name

    A name for this Server Group, to be used within the interface.

    Challenge's cookie domain

    The domain to use when are issued.

    Description

    Information about this Server Group, to be used within the interface.

    Match Host/Authority Headers

    The scope for this Server Group (typically this is a list of domains), specified as a regex. If this list is edited, the edits must be saved before .

    Security policy

    The for this Server Group, with its parameters displayed for convenience.

    Proxy template

    The that this Server Group is based upon.

    Mobile Application Group

    The for this Server Group, if any.

    Server Certificate

    The for this Server Group. The Generate button will generate a new certificate.

    To avoid errors, the Server Certificate Generate button will be disabled if the Match host/authority headers field has been edited and the edits have not yet been saved.

    CA Certificate

    The CA Certificate to use when enforcing mTLS for the domain (). The available certificates are those defined in the CA Certificates tab of the page.

    In use, CA certificates are verified against the CRLs in the .

    CA Certificate features will only be available if both of the following are true:

    • An AWS NLB (Network Load Balancer is being used. (When using a Link11 Load Balancer, contact support.)

    • CA Certificates have been .

    Mode

    Specifies how clients (i.e., end users) should present CA certificates for mTLS validation. Options are:

    • [Off] Client authentication is disabled. The system will not request CA certificates from clients.

    • [On] CA certificate is required for authentication. The system will request and validate CA certificates from clients.

    • [Optional] CA certificate is requested but not required for authentication. The system will not require clients to provide CA certificates. However, if a client does provide a certificate, it must be valid in order for its request to be accepted. If the client provides an invalid certificate (e.g., expired, revoked, or forged), the request will be blocked.

    Sending CA data to the origin

    When CA Certificates are enabled, Link11 WAAP will add headers to requests before passing them to the backend.

    If a CA Certificate is provided, Link11 WAAP will add it to the request header, along with these additional headers:

    If no certificate is provided, the following headers will be passed:

    Using CRLs to revoke client certificates

    Link11 supports CRLs (Client Revocation Lists). Admins can revoke client certificates that were previously allowed for mTLS authentication, so that unauthorized or compromised clients will be rejected without waiting for certificate expiration.

    When Enable CRL validation is enabled, admins can add entries to the Client Revocation List. Each entry is a URL of a CRL.

    During mTLS negotiation, if a CA certificate has been specified, the client certificate is validated against the specified CRL(s).

    • If the certificate is revoked, the connection is rejected with a status code of 496. The Events Log will contain an entry with a Block reason of “General: Client certificate revoked.”

    • If the certificate is signed by another CA, the connection is rejected with a status code of 495. The Events Log will contain an entry with a Block reason of “General: Client certificate could not be verified.”

    • If the certificate is not in the CRL, the connection succeeds (assuming other validation checks pass).

    If the Client Revocation List is populated, Link11 WAAP will fetch CRL data from the specified URL(s) every eight hours.

    Backend Services

    Video Walkthrough (with an emphasis on Load Balancing)

    Overview

    This section defines the Backend Services that Link11 WAAP will protect. In other words, these are the destinations to which Link11 WAAP will send the (legitimate) traffic it receives.

    A Service consists of one or more endpoints (defined in the , discussed below). Each Service can receive traffic for multiple web applications, and for multiple resources/locations within each web application.

    For a single Service, you can define multiple endpoints. Within them you can:

    • Enable and configure load balancing, weighting and distributing traffic across your primary endpoints.

    • Define backups hosts, to which L11WAAP will failover your traffic when your primary hosts aren’t available.

    • Take hosts offline for maintenance by ticking a single box in the interface.

    Usage within applications and APIs

    Backend Services are designated to receive traffic for specific destination URLs in .

    Administration

    The main window (shown above) lists all currently defined Backend Services.

    The administration (addition/deletion/editing/versioning) of these Services follows the conventions described .

    Parameters

    Name

    A name for this Service, to be used within the interface.

    Use HTTP/1.1

    Enables HTTP 1.1, which can increase performance due to multiplexing.

    Description

    Information about this Service, for use within the interface.

    Transport Protocol

    This configures the communication between L11WAAP and the backend.

    Load Balancing Stickiness Model

    Sometimes an application requires a user to be connected to the same instance and backend endpoint throughout the session. L11WAAP can ensure that this occurs, and can do so using a variety of methods.

    Server-to-Backend mTLS Certificate

    The certificate to use for mTLS communication between Link11 WAAP and the customer origin.

    • The available certificates are those defined in the Server-to-Backend mTLS Certificates tab of the page.

    • To use this feature, it must first be .

    Endpoint List (not labeled in the UI)

    This is a list of one or more endpoints. The settings for each endpoint in the list are as follows.

    There is currently a bug when adding a new endpoint to a list of existing endpoints. The second one will have its Is Down? checkbox disabled. Workaround: if you wish to add a "down" endpoint, begin by defining and adding it in "up" mode. Then, edit it; the Is Down? checkbox will be available.

    Tagging

    Overview

    Link11 WAAP uses an intuitive tag-based system for evaluating and processing traffic.

    As an incoming request is analyzed and processed, internal tags are generated and attached to it:

    • are generated automatically by L11WAAP.

    Security Policies

    Applying security rules to paths and resources

    Overview

    Security Policies assign security rulesets to specific paths within applications and APIs. When a request is received, Link11 WAAP finds the Security Policy assigned to its destination Server Group (i.e., the destination site). That Policy then specifies the security rules to enforce upon the request, according to its destination URL.

    Each Security Policy also includes a definition of the Session ID to use within its scope. This is an important setting, as discussed below.

    Dynamic Rules

    Banning or monitoring traffic sources that violated defined limits

    Overview

    The Dynamic Rules section defines security rulesets that evaluate various criteria over time. When traffic sources commit activities that exceed defined thresholds, those traffic sources can be banned, or merely reported on within the Dashboard and Events Log.

    Note that Dynamic Rules do not block individual requests based on their content; they define actions to take against the sources of requests. Individual incoming requests are blocked elsewhere, e.g., in or in processing stages that include .

    [{$REQUEST1},{$REQUEST2},...{$REQUESTn}]
    $FIELD1:$VALUE1,
    $FIELD2:$VALUE2,
    ...
    $FIELDn:$VALUEn
    Access Denied
    
    Request was:
    received at %Timestamp%
    from IP address %Client_IP%
    sent to %Host_Domain%
    and was answered with response code %Status_Code%.

    More info

    Global Filters

    More info

    Rate Limit Rules

    More info

    Security Alerts

    More info

    Security Policies

    More info

    Server Groups

    For managing site-level properties. More info

    Users

    For management of users and API keys

    ACL Profiles
    More info
    Actions
    More info
    Content Filter Profiles
    More info
    Content Filter Rules
    More info
    Dynamic Rules
    More info
    Flow Control Policies
    Backend Services
    More info
    Certificates
    More info
    Edge Functions
    More info
    Load Balancers
    More info
    Mobile Application Groups
    More info
    Proxy Templates
    More info
    Configs
    configurations
    Data queries
    API access to traffic data
    quarantined traffic sources
    Log Exporters
    streaming events to an external destination
    Planets
    interactive challenges
    Tags
    tag
    Tools
    publishing
    challenge process
    custom admin-defined messages injected by an Edge Function

    Block / Apply

    Triggers the Action.

    Action
    Edge Functions
    ACL Profiles
    Edge Functions
    bot challenge
    interactive challenge
    traffic processing

    Unique serial number of the client certificate

    1234567890ABCDEF

    SSL_CLIENT_FINGERPRINT

    SHA-1 fingerprint of the client certificate

    5F:7C:1E:2B:...

    Empty (no serial number since no cert exists)

    -

    SSL_CLIENT_FINGERPRINT

    Empty (no fingerprint since no cert exists)

    -

    Header

    Description

    Example Value

    SSL_CLIENT_VERIFY

    Client certificate verification status

    SUCCESS (valid) / FAILED (invalid)

    SSL_CLIENT_CERT

    Full client certificate in URL encoded

    -----BEGIN CERTIFICATE----- ...

    SSL_CLIENT_S_DN

    Client's Subject Distinguished Name (DN)

    CN=John Doe, O=ExampleCorp, C=US

    SSL_CLIENT_I_DN

    Issuer (CA) Distinguished Name (DN)

    CN=Example CA, O=ExampleCorp, C=US

    Header

    Description

    Example Value

    SSL_CLIENT_VERIFY

    Indicates no client certificate was provided

    NONE

    SSL_CLIENT_CERT

    Empty (not passed or -)

    -

    SSL_CLIENT_S_DN

    Empty (no subject DN since no cert exists)

    -

    SSL_CLIENT_I_DN

    Empty (no issuer DN since no cert exists)

    -

    Policy Mapping and Traffic Routing
    here
    bot challenges
    a new SSL Certificate can be generated
    Security Policy
    Proxy Template
    Mobile Application Group
    SSL certificate
    read more about this
    Certificates
    Certificate Revocation List
    enabled within the System DB

    SSL_CLIENT_SERIAL

    SSL_CLIENT_SERIAL

    When a server fails, this is the length of time in seconds that L11WAAP will wait before trying to send traffic to it again.

    Is Down?

    When this box is checked, L11WAAP will not attempt to communicate with this server. This allows you to take a server offline for temporary maintenance or some other purpose.

    Option

    Value

    Per Request

    This is the default mode. Incoming HTTP requests will go over HTTP, and incoming HTTPS requests will go over HTTPS.

    HTTP Always

    All communication between L11WAAP and the backend will be over HTTP. (This mode should not be used unless L11WAAP runs within the same cloud as the backend.)

    HTTPS Always

    All communication between L11WAAP and the backend will be over HTTPS.

    Port Bridge Mode

    Link11 WAAP will use the same port as the incoming request. This is not limited to ports 80 and 443; L11WAAP will use whatever port was specified. Note: this mode is not available when more than one host is defined.

    Setting

    Behavior

    None

    This is the default. Requests will be distributed across the endpoints in a round-robin fashion, according to the Weights assigned to them (described below in the ).

    Auto Cookie

    L11WAAP will automatically generate a cookie to maintain the session on the same endpoint.

    Custom Cookie

    You can provide the name of the cookie that L11WAAP will use to track the session, e.g. one generated by an AWS or GCP load balancer.

    IP Hash

    Routing will be determined from a hash of the client and destination IP addresses.

    Least Connection

    Requests will be sent to the endpoint with the fewest number of connections.

    Attribute

    Description

    Host

    The name or IP address for each endpoint that L11WAAP protects. (Do not enter self-referential values such as 127.0.0.0/8, 0.0.0.0, ::1/128, ::0/128 or “localhost”.) The host can be a normal web server, or it can be a load-balancer. Note that L11WAAP also provides load-balancing capabilities in its own right, as discussed below. In Port Bridge Mode, it is possible to specify more than one host, separated by commas (as in the screenshot above).

    HTTP Port

    The HTTP port(s) for the server. To add a port, click in the field, and enter the port number into the "Search" field.

    HTTPS Port

    The HTTPS port(s) for the server. To add a port, click in the field, and enter the port number into the "Search" field.

    Weight

    The relative weight of each server for load-balancing purposes. L11WAAP distributes traffic with a round-robin sequence, according to these weights. For example, if two servers are both set to 'weight=1', they will receive equal amounts of traffic. If the first is set to 'weight=3' while the second is set to 'weight=1', the first server will receive three visitors for every single visitor that the second server receives.

    Max Fails

    The maximum number of failed communication attempts that are allowed for this server. Once this number of failures occurs, L11WAAP will consider the server to be inactive. If other servers are available, L11WAAP will failover the traffic to them. If this was the only server available, the system will return an error to the client (either 504 Timeout, or 502 Bad Gateway).

    Endpoint List
    Server Groups
    here
    Certificates
    enabled in the System DB

    Fail Timeout

    Some system tags are always attached to the request. Other tags will vary, depending on the policies and security rulesets that were applied, or the disposition of the request.

  • Admins can define additional user tags for specific circumstances.

  • During processing, tags can be used to make decisions about how the request is handled. For example, an ACL Profile might block all requests that contain a specific tag.

  • Tags will also be attached to reflect decisions that were made. For example, a request that was blocked because it violated a Rate Limit Rule will be assigned a tag containing that Rate Limit Rule's name.

  • Once processing is complete, all of the request's tags are included in the traffic analytics and logs. They can also be accessed by Edge Functions.

  • When using tags to make decisions during the traffic filtering process, only tags that were generated before the relevant step are available. For example, sent-to-origin and upstream-status:xxx are only available for use in Dynamic Rules, because they are not attached until after L11WAAP has passed the request to the customer origin.

    Tag categories

    As mentioned above, there are two types of tags:

    • System tags are created automatically by L11WAAP.

    • User tags are defined by admins.

    System tags

    System tags are attached to the request at different stages of traffic processing. In the UI, they are displayed in blue, as in this Security Policy example:

    The dropdown list is for administering user tags, described further below.

    Attached during initialization

    One of the earliest stages of the traffic filtering process is the Initialization stage. Here, L11WAAP attaches a variety of tags to the request, based on its characteristics.

    Every request receives certain tags, including all and several tags according to its source (the IP address, geolocation, etc.).

    Examples

    • all

    • geo-country:france

    • geo-city:paris

    • geo-region:idf

    • geo-subregion:75

    • geo-continent-code:eu

    • geo-asn:12322

    • geo-continent-name:europe

    • ip:82-64-131-193

    Attached during processing

    As L11WAAP processes a request, it will attach system tags to reflect what happened to the request during processing.

    Some types of system tags will always be attached (assuming that the request makes it far enough into the processing sequence). For example, every request receives tags that reflect the Security Policy that it matched.

    Other system tags will depend on the disposition of the request. For example, requests which violate a security ruleset (such as a Rate Limit Rule) or fulfill a condition (such as being the last request in a Flow Control Policy sequence) will receive tags with descriptive names.

    Some system tags have their names generated during processing. When tag names are generated from underlying values (IP addresses, security rule names, etc.), hyphens will replace spaces and special characters.

    System tags that can potentially be attached are shown at the appropriate places in the UI (generally, in the Editor page for a security ruleset or setting).

    Examples:

    Generic

    • bot or human (bot is assigned to all requests unless the traffic source passes a bot challenge, in which case its requests receive human)

    • sent-to-origin L11WAAP passed the request and sent it to the customer origin

    • upstream-status:xxx The response status code from the customer origin, if any

    Security rulesets

    (Note: below, xxxis a placeholder for the name of the entity that was used.)

    • aclname:xxx

    • securitypolicy-entry:xxx

    • securitypolicy:xxx

    • contentfilterid:xxx

    • contentfiltername:xxx

    Triggered by mechanisms, e.g. Content Filters

    • cf-rule-id:xxx

    • cf-rule-category:xxx

    • cf-rule-subcategory:xxx

    • cf-rule-risk:xxx

    Libinjection tags

    If a request matches a libinjection check during Content Filtering, the following tags will be added:

    • cf-rule-id:libinjection-sqli or -xss (per case)

    • cf-rule-risk:libinjection

    • cf-rule-category:libinjection

    • cf-rule-subcategory:libinjection-sqli or -xss (per case)

    While processing a request, there is other information that might get attached to a request. For example, when a Global Filter matches a request and its Action is set to "Monitor", this will be shown in the Events Log with a Monitor reason named Global filter:[name of the Global Filter]. These are not tags, since they cannot be used in ACL Policies and so on.

    Sometimes a request will get two separate tags that seem to be redundant. For example:

    • securitypolicy:default-security-policy

    • securitypolicy-entry:default

    When a Security Policy is mapped to a request, a tag is generated for the Policy itself, and for the path-map entry within that Policy that was used. If the names are similar (which is true for default values, as in the example), then the tags can appear to be redundant.

    User tags

    User tags are defined and configured by admins, typically in a Tags field in a ruleset Editor page.

    Admin-defined tags do not replace the system tags. Rather, when a request triggers a security ruleset, all of the specified tags (system and user) are attached to it.

    Administration

    Admin-defined Tags are created and selected via the Tags dropdown list. Initially, it appears as in this Security Policy example:

    When expanded, the Tags list looks like this:

    Adding user tags

    To add an existing user tag, find it in the list (or start typing its name into the Search field), and select its checkbox.

    To define a new user tag, type its name into the Search field and hit Enter. The tag will be created, and will be automatically selected for use.

    Unlike system tags, admin-defined tags do not need to be unique. Therefore, admins can use them to combine different categories of requests for later processing. For example, there might be several different Global Filters, each of which defines a category of requests to be allowlisted. An admin might specify the same tag (e.g., trusted) for each one, and then have that tag configured in an ACL Profile to be exempted from content filtering.

    Note that the Tags field will accept more than one tag, separated by spaces. This provides even more flexibility, such as the ability to create a hierarchy of tag categories.

    Removing user tags

    When editing a security entity, hovering the cursor over the Tags control will display an X at the end of the control. Clicking on this will remove all tags from the entity.

    As shown above, hovering over a tag will also show an x on that tag. Click on it to remove only this specific tag from the entity.

    When a tag is removed from an entity, and no other entity uses this tag, it will also be removed from the list of available tags displayed within the Tags list.

    If it is needed again in the future, it can be restored by defining it again as a new tag (i.e., by entering it into the Search field and selecting Enter).

    Displaying tag usage

    Sometimes, admins will wish to see a list of all uses of a specific tag. Examples:

    • When examining a request in the Events Log, an admin might want to verify the source of a particular tag.

    • When editing a security configuration, it can be useful to see which other configurations generate or rely on a particular tag.

    • An admin might also want to see all requests in the Events Log which had a specific tag attached.

    For this purpose, L11WAAP provides the Tag Finder feature.

    Tag Finder

    The Tag Finder lists all current usages of a given tag. It works for both system tags and user tags.

    To open the Tag Finder in the UI, simply click the tag. Here's an example (a tag named static-content) from a Global Filter:

    The Tag Finder is available when editing various types of security entities, and also from the Events Log.

    When a tag is clicked, the Tag Finder panel will appear with a list of all the entities that use or can generate that tag:

    In this example, along with the Global Filter that is currently being edited, the tag is also used in two Rate Limit Rules.

    As shown above, hovering the cursor over an entry will display a button that will open the relevant security entity in a "Viewer" (read-only) window, where its attributes are displayed.

    At the bottom, there is also a button to open the Events Log, pre-populated with a filter to display all requests that have this tag attached. (This button does not appear if the Events Log is already open.)

    System tags
    Usage within applications and APIs

    Security Policies are used within Server Groups. Every Server Group includes a Security Policy.

    Every L11WAAP deployment contains a default Security Policy. This default Policy cannot be deleted. Admins can define additional Policies as well.

    Administration

    The main page (shown at the top of the page) lists all current Security Policies.

    The administration (addition/deletion/editing/versioning) of Policies follows the conventions described here.

    Components

    Each Security Policy contains the following:

    • A list of paths or scopes within which this Policy will be applied.

    • The Content Filter Profile, ACL Profile, and (optional) Rate Limit Rule(s) that will be enforced on requests sent to the specified paths.

    • Optional Edge Functions(s) to run when requests are sent to the specified paths.

    • One or more Tags that will be attached to requests sent to the specified paths.

    • What to use as a Session ID for requests sent to the specified paths. This is used elsewhere by the system; for example, .

    • General parameters for administration.

    Individual parameters

    Name

    A name for this Policy, to be used within the interface. A system tag (shown below the Tags field) will include it as well.

    Description

    Information about this Policy, for use within the interface.

    Tags

    A list of one or more tags, separated by spaces. Whenever this Security Policy is applied to a request, these tags will appear in the Events Log.

    In addition to these admin-defined tags, the system also shows some system tags that will be attached as well.

    Main Session ID & Other Session IDs

    Some types of settings within L11WAAP allow admins to track user activity and enforce security rules based on the user's Session ID. (Examples of this include Flow Control Policies and Rate Limit Rules.)

    However, the definition of a Session ID can vary. The optimal combination of request parameters can differ, depending on the circumstances.

    The Main Session ID and Other Session IDs define the request parameters that should be combined and used as the Session ID within the scope of this Security Policy.

    Main Session ID: This is the header, cookie, argument, or attribute that will be the Session ID by default.

    Other Session IDs: This is a list of additional headers, cookies, arguments, and/or attributes that might, or might not, be available, depending on the situation. When they are available, they are combined with the Main Session ID to form the Session ID used by L11WAAP.

    Example: the Main Session ID is set to Header / user_id, and Other Session IDs contains one entry for an authentication token (Header / auth_token). Initially, the Session ID will consist of the user_id alone. Once the user is authenticated and the requests begin to include auth_token too, the Session ID will then be a combination of those two values.

    Another example: the Main Session ID is set to Header / user_id. In Other Session IDs, there is one definition (Header / device_id) for a field that is sent by a mobile application.

    • If the user is using the mobile application, then device_id will be included in the incoming requests, and the Session ID will be a combination of user_id and device_id.

    • If the user is using a browser instead, then device_id will not be defined, and the Session ID will consist solely of user_id.

    The choice of parameters for the Session ID should be carefully considered, because it can affect the performance of various security settings and rules. Sometimes, a narrowly-defined Session ID is better, while in other situations, a broader definition should be used.

    For example, an admin has defined a Rate Limit Rule based on Session ID. A threat actor then begins a session in a web browser, copies its session tokens, and tries to use them in a brute force attack across different IPs and distributed networks in the cloud.

    • If the applicable Security Policy has a Session ID based on the session tokens, then the Rate Limit Rule will detect and block the attack.

    • If however the Session ID also includes the IP address, then a Rate Limiting Rule would maintain separate counts for each of the various IPs that are used, and the Rule would not perform as the admin had intended.

    Path Mapping

    This is a list of paths, and the security settings (Content Filter Profiles, ACL Profiles, Backend Service, Rate Limit Rules, and Edge Functions) assigned to each one.

    Every incoming request targets a specific URL. L11WAAP finds the best match for that URL in the Path Mapping list, and applies the security settings defined for it, along with whatever settings are contained in the special Site Level path definition (see below).

    The "best match" is determined by regex evaluation. The order in which the paths are listed in the interface does not matter. If multiple admin-defined Path Maps could match a request's destination, the longest matching regex will determine which Path Map gets selected. If no regex matches, then the Default Path Map will be selected.

    Out of the box, Security Policies can contain three special path definitions:

    • Root: Will be selected for requests sent to the root level of the site.

    • Site Level: Will be selected for all requests sent to the site (see note below).

    • Default: Will be selected for requests that do not match any other specific path definitions.

    The Site Level definition behaves differently than other path definitions; it is always selected and added to the best-matching path definition for the request (including the Default definition). Thus, if Site Level contains any settings, they are used in addition to the settings contained in the best-matching definition.

    Managing the Path Maps

    A new Security Policy will include several Path Maps. Clicking on a listing will expand it for editing.

    Creating Path Maps

    To add a new Path Map, select an existing one, expand it, and select "Fork Path Mapping" at the bottom. The existing one will be cloned, and the new one will be displayed for editing.

    Note that the controls at the top of the window are for administering Security Policies, which generally correspond to domains. Administering Path Maps (for paths and URLs within the specified domain) is done in the Path Mapping list.

    Path Map Fields

    Field

    Value

    Name

    A descriptive label for use within the interface.

    Path or Expression

    An expression for the path, expressed as PCRE (Perl Compatible Regular Expressions).

    Content Filter Profile

    The applied to this path. Its name will be displayed in green if it is active; if displayed in red, it is currently disabled.

    ACL Profile

    The applied to this path. Its name will be displayed in green if it is active; if displayed in red, it is currently disabled.

    Backend service

    The associated with this path. Requests that pass through L11WAAP without being blocked will be forwarded here.

    In addition to editing the fields discussed above, the expanded Path Mapping dialog also provides the ability to:

    • Activate or deactivate the Content Filter Profile (by changing its active mode toggle).

    • Activate or deactivate the ACL Profile (by changing its active mode toggle).

    • Add an existing Rate Limit Rule to this Path Map, via the + New button. (The + New button will only be shown if there are Rate Limit Rules available.) An existing Rate Limit Rule can be removed by selecting the trash icon at the end of its entry.

    • Add an existing Edge Function to this Path Map, via the + New button. (The + New button will only be shown if there are Edge Functions available.) An existing Edge Function can be removed by selecting the trash icon at the end of its entry.

    • Create a copy of this Path Map, and open it for editing, via the "Fork Path Mapping" button.

    Dynamic Rules have similarities to Rate Limit Rules: both types of Rules include thresholds and time frames, and each Rule includes an allowable number of events that can occur within a defined period of time.

    However, there is an important difference:

    • Rate Limit Rules are evaluated while an incoming request is being processed. A violation will result in an action being taken against that request.

    • Dynamic Rules are evaluated later, during periodic queries of the traffic logs. They are used to examine requests in the traffic log that have already been passed or blocked. A violation will result in an action being taken against future requests from the responsible traffic source.

    Dynamic Rules have many potential uses. A common one arises from the nature of Rate Limit Rules, which can only block persistent attackers for short periods of time (as discussed here). Dynamic Rules can place violators into quarantine for extended periods of time, during which all requests from those traffic sources are blocked.

    Lastly, although Dynamic Rules are commonly used with Rate Limit Rules, they can be used independently as well, and have many other potential applications.

    How a Dynamic Rule works

    Dynamic Rules work together with Global Filters and the Quarantine list.

    When a Dynamic Rule is created, Link11 WAAP auto-generates a corresponding dynamic Global Filter. Initially, the Global Filter will not have any effect on incoming traffic.

    Dynamic Global Filters are managed automatically by L11WAAP. They are not visible to, or editable by, admins. They are described here so that admins understand how the system operates.

    As incoming requests are received and processed, L11WAAP periodically queries the traffic logs, and uses the Dynamic Rules to evaluate the most recent requests.

    The timing and frequency of these evaluations will depend on the Threshold parameters defined for the currently active Dynamic Rules. L11WAAP selects the optimal frequency for promptly identifying Rule violators, while still minimizing the number of queries and amount of data that must be pulled from the traffic logs for analysis.

    When a traffic source is found to have violated a Dynamic Rule, the following occurs:

    • A Security Alert will be sent (if any were configured for this Dynamic Rule and the relevant Server Group).

    • The Rule's Global Filter is updated automatically to include the offending traffic source.

    • The traffic source is added to the Quarantine list.

    For all subsequent requests from that traffic source, the Global Filter will:

    • Attach the Dynamic Rule's Tags

    • And execute the Rule's Action.

    This situation will continue until either of the following occurs:

    • The Rule's Quarantine time expires

    • Or an admin manually removes the traffic source from the Quarantine list (see more below about the effects of this).

    At that point, the traffic source will no longer be on the Quarantine list, and will also be removed from the Global Filter.

    In the discussion above, "traffic source" describes the source(s) that sent the requests which violated the Dynamic Rule. This might be a single entity, or multiple entities, depending on the admin's choice of the Target parameter. For example, an admin could choose to enforce a Dynamic Rule on each IP address separately, or on all requestors collectively within a country, or on all requestors collectively who submitted a certain header or argument, etc.

    Appearing on the "Quarantine" list does not necessarily mean that a traffic source has been banned. It only means that a traffic source has exceeded a Dynamic Rule, and that currently, its requests will trigger the Rule's Action. Often, this will be a blocking action. However, admins might also choose to merely monitor the traffic source's behavior without banning it.

    Offloading blocking actions

    When the planet is deployed on a Link11 private cloud, and a Dynamic Rule is configured with an IP blocking action, admins have the ability to offload the IP blocking to Link11's Layer 3 protection. During DDoS attacks, these requests will be blocked before they reach L11WAAP; therefore, this will increase performance, and reduce the scaling necessary for the system to handle the attack. During this time, the traffic sources will still be listed on the Quarantined page, and will be designated there as having been offloaded.

    Note that while offloaded blocking is occurring, the blocked requests will not be received by L11WAAP; thus, they will not be counted toward violations of other Dynamic Rules or Rate Limit Rules.

    Exempting a traffic source from evaluation

    Traffic sources can be exempted from Dynamic Rule enforcement by adding one of their tags to the Rule's Exclude list.

    Eliminating False Positives

    If a traffic source is being incorrectly quarantined, it should be manually deleted from the Quarantined list. The next time that Dynamic Rules are evaluated, the following will occur:

    • The quarantine will end.

    • The Dynamic Rule's corresponding Global Filter will be updated, so that requests from this traffic source will no longer receive the Rule's Tags and Action.

    • The Dynamic Rule will be automatically updated to allowlist the traffic source, by adding a tag for the traffic source's IP (or whatever identifier is being used as the Target) to the Exclude list.

    Usage within applications and APIs

    Unlike some other types of security settings, Dynamic Rules are not assigned to paths in Security Policies.

    Instead, each Policy has its applicable scope defined by the Active mode, Include, and Exclude parameters, as described below.

    Administration

    The main window (shown above) lists all current Dynamic Rules.

    The administration (addition/deletion/editing/versioning) of Dynamic Rules follows the conventions described here.

    Components

    A Dynamic Rule consists of the following:

    • Parameters defining its applicable scope [Active mode, Include, and Exclude]

    • The definition of an entity, i.e. how to combine incoming requests for counting purposes [Target]

    • The behavioral limits for each entity [Number of events, Time frame]

    • What the system should do when the behavioral limits are exceeded [Action], which part of the system should do it [Offload IP blocking], and how long it should be done [Quarantine time]

    • Tag(s) to attach to requests that are currently being quarantined

    • General parameters for administration [Name, Description]

    Individual parameters

    Name

    A name for this Rule, to be used within the interface.

    Active mode

    When this is enabled, this Rule will be applied within the scope defined by the Include and Exclude lists. Otherwise, it will not be enforced.

    When Active mode is changed to "off", admins should check the Security Alerts list, to see if any Alerts are based upon this Dynamic Rule. As long as the Rule remains inactive, it will not fire any Alerts.

    Description

    Information about this Rule, for use within the interface.

    Target

    The entity that will be evaluated for this Dynamic Rule, and that will be quarantined if the Rule is violated.

    For example, selecting IP means that each IP address in the traffic logs will have its requests counted separately, and if a violator is found, that IP will be quarantined. On the other hand, selecting ASN will combine all requests from all IPs within each ASN, and a violation will result in all IPs from that ASN being quarantined.

    Some values for Target also require an associated value for Target key, e.g. the name of a specific header, cookie, etc.

    Offload IP blocking

    As described above, admins can choose to block Dynamic Rule violators with Link11's Layer 3 protection. This option will be available when the planet is deployed on a Link11 private cloud, and an IP blocking action is selected.

    When this option is enabled, and the change is published, it will apply to new violations of the Dynamic Rule. In other words, traffic sources currently in quarantine will continue being blocked by L11WAAP until the quarantine expires.

    Number of events

    The number of permissible requests within the specified Time frame. Exceeding this number is a violation of the Rule and triggers the Action.

    Time frame

    The period of time within which the Number of events is enforced.

    Action

    The action to take when the Target exceeds the Number of events during the Time frame.

    Quarantine time

    The period of time to keep the traffic source in quarantine, and execute the Action for its requests.

    Tags

    The tag(s) to include in the Global Filter that is constructed for this Dynamic Rule.

    Include and Exclude

    The Include and Exclude tag lists define the applicable scope of this Dynamic Rule. Their use is described on the UI Overview page.

    Example use cases for Dynamic Rules

    Banning rate-limit violators for specific URLs

    Unlike Rate Limit Rules (which can be enforced against specific target URLs via Security Policies), Dynamic Rules are global by default.

    However, they can still be limited to specific paths/targets by using a Global Filter to attach descriptive tag(s) to the appropriate requests, and then using the tag(s) in the Dynamic Rule's Include and Exclude lists.

    Limiting enforcement to certain categories of requests

    Global Filters can be used to limit enforcement of a Dynamic Rule to certain types of requests (e.g., HTTP methods, non-static files, etc.).

    For example, to enforce a Dynamic Rule only upon POST requests, a Global Filter could attach method-post to all incoming POST requests, and the Dynamic Rule would only Include method-post.

    Using cookies to ban an attacker who is switching IPs

    By using a cookie threshold, it is possible to quarantine hostile traffic originating from the same source, even if the attacker is changing IP addresses. This can be done by selecting a Target of cookie, with a Target key of waap_id (the cookie that L11WAAP sets for all traffic sources).

    ACL Profiles
    Actions

    UI Overview and Common Elements

    Features and conventions found throughout the user interface

    The Link11 WAAP UI has several main parts:

    • In the left-hand sidebar, there is the console menu. By default, it is collapsed; it will slide out when clicked on, or the ">" button is selected.

    • The right-hand part of the window varies, depending on what the user has selected. If traffic analytics are not currently displayed, typically this will be a List page or an Editor page.

    • Most pages have common UI elements, described below.

    • Most pages have a section for .

    These parts are described below, along with a discussion of how L11WAAP is configured and administered through the UI, and some common UI elements that are found throughout the interface.

    Console Menu

    This consists of the following sections:

    • Analytics

    • Security

    • Sites

    • System

    The first section contains L11WAAP's reporting capabilities. The others are for configuring L11WAAP.

    Configuration and Administration

    The configuration sections use a common structure for administration, with two types of pages:

    • List page: Displays all the entries for that configuration type.

    • Editor page: Provides the ability to edit a specific entry.

    List page administration

    Most L11WAAP settings are collections of individual entries. The List page allows admins to manage these collections.

    Viewing entries

    When a configuration type is selected in the sidebar menu (e.g., , shown above), its List page is shown. By default, it shows all the current entries for that configuration type.

    The display can be filtered by selecting the funnel icon on the upper right. The list can be downloaded by selecting the download button next to the funnel.

    Adding an entry

    To add a new entry, select the "+ New" button at the top right of the list.

    After adding an entry, .

    Deleting an entry

    Deleting an entry can be done from the list of entries, or from the entry's Editor page.

    • From the list, hover the cursor over the entry, then select the trash icon that appears at the end of the entry.

    • From the Editor page, select the "Delete" button at the top.

    You will be asked to confirm the deletion.

    After deleting an entry, .

    Editing an entry

    Hovering the cursor over an entry in the list will reveal an "edit" icon at the right end of the entry. Select this to open that entry in the appropriate Editor page.

    Editor pages

    Editor pages allow admins to manage individual entries within a collection of configuration settings.

    Navigation

    Selecting the "<-" button on the upper left will navigate back to the .

    Selecting the entry being displayed

    Within an Editor page, the entry being displayed can be changed by selecting the pulldown list at the upper left. (The name shown for the currently-displayed entry is part of the pulldown list.)

    Modifying an entry

    After editing an entry, be sure to save your changes with the "Save" button at the top of the Editor page, and then .

    Note that if you make configuration changes, but do not select the "Save" button before navigating to a different page, your changes will not be retained, and you will not be prompted or asked to confirm.

    Duplicating an entry

    To clone the entry being displayed, select the "Duplicate" button on the upper right.

    Downloading an entry

    To download the information in the entry being displayed, select the "Download" button on the upper right.

    Deleting an entry

    To delete the entry being displayed, select the "Delete" button on the upper right. As mentioned above, entries can also be deleted from the appropriate List page.

    Versions and Branches

    L11WAAP maintains versions for most of its configuration data. Admins can roll back or forward to a different version at any time.

    Versioning

    Within the UI, most pages contain a Version History section at the bottom.

    This section displays previous versions of configurations, and allows you to revert/restore the system to any saved configuration. By default, it is collapsed:

    Expanding it reveals its contents:

    To select a different version, hover the cursor over the end of the desired configuration's entry. A button will appear with an icon representing the "restore" operation.

    Select this button. Once the process is complete, .

    List and Table Filters

    Throughout the interface, there are various lists and tables. Most of them have filter fields: text boxes at the top of each column, which will accept expressions to filter the displayed entries.

    Here's an example of the Global Filters list, with crawler entered into the filter for the Name column:

    As shown here, entering an expression will filter the results to display only matching entries, if any. Multiple filter fields can be used simultaneously; they will be combined with a logical AND.

    The filter fields support regex.

    Tag selector

    Many settings include , as in this Security Policy example:

    The dropdown list allows admins to add one or more . Below the list, the are displayed.

    Administration and management of tags is described in detail here: .

    Include and Exclude Filter Lists

    The Editor pages for some types of security rules (, , and ) contain two lists labeled Include and Exclude.

    By default, a security rule will be enforced for all incoming requests within its scope. The Include and Exclude lists can be used to limit the scope of this enforcement.

    Each list can contain one or more tags:

    • If the Exclude list contains any tags, a request is exempted from enforcement if it matches the list.

    • If the Include list contains any tags, a request is exempted from enforcement unless it matches the list.

    What it means to "match" the list

    Rate Limit Rules and Dynamic Rules have or/and selectors for their Include and Exclude tag lists. These selectors become visible when more than one tag has been added to a list.

    • When a list is set to or, a request will match if it contains any of the tags in the list.

    • When a list is set to and, a request will match only if it contains all of the tags in the list.

    Note that for any security rule, its two lists are separate, and can be set to different modes.

    Flow Control Policy tag lists do not have or/and selectors. These lists operate in or mode; therefore, a request will match a list if it contains any of the tags in the list.

    Important details about the Include/Exclude process

    • The Exclude list is evaluated before the Include list, and takes priority. See example below.

    • The Include list is not exhaustive. In other words, for the security rule to be enforced, all of the request's tags do not need to be listed in Include. However, if the Include list contains any tags, the request must have at least one (in OR mode) or all (in AND mode) of them, for it to be subjected to enforcement.

    • An empty Include list is treated as if it contains all. This is a system tag that all requests have. In other words, by default, the security rule will be enforced on every request (unless the request matches the

    As mentioned above, Exclude takes priority over Include. Example: a request has been tagged withfoo. A security rule has Includefooand Excludeall. The request will be excluded from evaluation by this rule.

    To add a tag to a list, select the "+" button. To remove a tag, hover the cursor over it and select the "x" that appears on it. To remove all tags, hover the cursor over the tag list and select the "X" that appears at the end of the list.

    Connections to Security Policies

    map security rulesets to paths within . The connections can be made within the Security Policies Editor.

    These 'parent-to-child' relationships can also be configured within some of the Editor pages for the 'child' entities: , and .

    The Connections to Security Policies list contains all of the paths within that use the child entity, and it allows admins to link the entity to additional Security Policies. In this context, a "connection" defines the scope within which the entity will be executed/enforced (assuming the entity is otherwise configured appropriately, e.g. the Rate Limit Rule is in Active mode).

    Connections are created by adding entries to the list, confirming them by selecting the checkbox at the end of the entry, saving the changes, then publishing.

    Admins can define individual connections, or multiple connections at once:

    • When Security Policies Name is set to a specific Security Policy, three options are available:

      • Match path creates one connection to the path(s) defined in the Path or Expression field. See note below about multiple path definitions.

      • Site Level creates a single connection to all paths within the site. This option is unavailable when an existing connection to this Policy contains a value in the Path or Expression field.

    The Path or Expression field can contain multiple path definitions. The pulldown offers a list of previously-created definitions; to create a new one, enter it into the textbox. When all necessary definitions are available, select their corresponding checkboxes.

    When a Policy has been connected at the Site Level, it will no longer appear for additional connections in the dropdown list of Policies.

    Global Filters

    Assigning tags and (potentially) executing an Action

    Overview

    This page allows you to administer Global Filters. These are applied to each request early in the .

    A Global Filter has two purposes:

    Exclude
    list).

    Add to all creates a separate connection for each path defined in the Security Policy. This is useful for Security Policies with a large number of paths; admins can automatically create multiple connections, then edit or delete the individual entries as needed.

  • When Security Policies Name is set to All Security Policies, Site level and Add to all function the same as described above, except that connections will be created for every Security Policy. Any unwanted connections can then be deleted.

  • versioning
    Global Filters
    publish the changes
    publish the changes
    List page
    publish the changes
    publish
    tags
    user tags
    system tags
    Tagging
    Dynamic Rules
    Flow Control Policies
    Rate Limit Rules
    Security Policies
    Backend Services
    Rate Limit Rules
    Edge Functions
    Security Policies
    An example List page
    An example Editor page, for Global Filters

    Rate Limit Rules

    The Rate Limit Rule(s) assigned to this path.

    Edge functions

    The Edge Function(s) assigned to this path.

    Rate Limit Rules can be enforced on a per-session basis
    Content Filter Profile
    ACL Profile
    Backend Service
    It can assign one or more tags to an incoming request. Subsequently, the tags can be used to make decisions about how the request is processed. After processing, a request's tags remain associated with it, and they are available for display in traffic analytics.
  • It also contains an Action, which can be executed when the Filter's conditions are met.

  • For each request, Link11 WAAP will evaluate all active Global Filters. The request will receive tags from all Filters which match it.

    After all Filters have been evaluated, L11WAAP will execute the highest-priority Action found in those Filters which matched the request.

    Two types of Global Filters

    There are two types of Global Filters:

    • System-managed, which are maintained by Link11.

    • Admin-managed, which are maintained by customer admins.

    They vary in their visibility, alterability, and sources for Rule lists (i.e., the criteria for determining if a Filter should be applied to the request being analyzed).

    System-managed Global Filters

    These are provided and maintained by Link11. Most use external datafeeds as the sources of their Rule lists.

    Datafeed-based Filters are updated regularly by Link11. Admins can also trigger an immediate refresh by selecting the Update now button on the Editor page.

    Most system-managed Filters are visible to admins in the interface, with the ability to edit some of their parameters.

    Depending on traffic conditions, some additional Filters might exist that are not visible to admins. Each active Dynamic Rule creates an internal Global Filter to enforce its restrictions. These are managed automatically by the system, and are mentioned here purely for informational purposes.

    Changing system-managed Global Filters might result in unexpected behavior. For example, the Let's Encrypt Requests Global Filter is necessary for customers who want to use Let's Encrypt to generate or renew their own SSL certificates.

    Admin-managed Global Filters

    These are created and managed by admins. They are fully editable within the interface.

    Typically, admins will manually create and manage their Rule lists, although these Filters can also be based on external data sources.

    Administration

    The administration of Global Filters follows the List/Editor UI conventions described here.

    When a Global Filter is used as a Trusted Source in a Proxy Template, it cannot be deleted until it is removed from the Trusted Sources list.

    The main List page (shown above) lists all current Global Filters. The Editor page (discussed below) enables administration of individual entries.

    Components

    Each Global Filter consists of:

    • Tag(s) to assign to requests that match the Rule list.

    • Rule list: The possible characteristics that a request could match (e.g., a list of IP addresses that it might originate from).

    • An Action that, if a match occurs, will be executed after all active Global Filters have been evaluated, unless a higher-priority Action overrides it.

    • General parameters for administrative purposes.

    Each of these is described in depth below.

    Individual Parameters

    The discussion below will focus on admin-managed Filters. For system-managed Filters, the parameters that are editable will work the same as discussed below.

    A Global Filter, opened in its Editor

    General parameters

    • Name. A description that will be displayed within the L11WAAP interface.

    • Active. By default, this Global Filter will be evaluated for all incoming requests. To deactivate it, unselect this toggle.

    • Description: Information about this Filter, for use within the interface.

    • Source: For datafeed-based Global Filters, this contains the URL of the source. Otherwise, this field should be set to self-managed.

    Tags

    This field contains one or more user tags (separated by spaces) that will be assigned to all requests that fulfill the Rule list. Example: internal team-devops

    Action

    The choices for this parameter are administered in the Actions page.

    The Action that is selected here will be applied globally to all requests that match the Rule list.

    If a request triggers an Action, the Action is performed after all Global Filters have been evaluated and all applicable tags have been attached to the request.

    Rule list

    The Rule list is generated in different ways, depending on the source of the data.

    Datafeed-based Global Filters

    Many Global Filters obtain their Rules from an external source, specified by the URL in the Source field. Some are maintained by Link11; others can be created and maintained by admins.

    • System-managed Global Filters based on datafeeds are maintained automatically. Their underlying data sources are refreshed every 24 hours, and the Global Filters are updated automatically.

    • Admin-managed Global Filters based on datafeeds are initially created by entering the URL of the source file into the Source field, then selecting the Update now button that appears. L11WAAP will then populate the Rule list automatically. To refresh the Rule List, simply select the Update now button again.

    "Self-managed" Global Filters

    Many Global Filters will be based on criteria that are not found in an external feed. In this situation, the Source field will say self-managed.

    Typically, most admin-managed Filters will have this setting, with their Rule lists being created and maintained manually (described below). It is also possible for a system-managed Filter to have this Source setting.

    To avoid confusion, note that "self-managed" does not mean "managed by admins instead of the system". Rather, it means "using Rules defined directly by specific criteria instead of being pulled from a datafeed".

    Manually creating a Rule list

    When a new Global Filter is created, its Rule list will be empty, as shown above.

    A Rule list contains one or more Sections. Each Section contains one or more Entries, where each Entry defines a match condition for evaluating requests. Sections can also contain one or more nested Sections.

    When a Section contains multiple items (whether Entries or other Sections), its Section Relation button defines the logical condition (either AND or OR) to apply among those items.

    Example: A Rule list contains two sections, with the overall Section Relation set to AND. The first section has criteria a, b, c and the second has i, j, k . Within each section, the Section Relation is set to OR. Thus, for a request x, the evaluation will be ((x==a) OR (x==b) OR (x==c)) AND ((x==i) OR (x==j) OR (x==k)).

    Defining a Section

    To create a new Section, select the + New Section button. (If this button is not available, verify that the Source field is set to self-managed.)

    Defining an entry

    To create an Entry within a Section, select the + New Entry button. The following dialog will appear:

    For some of the criteria categories, the dialog will appear as it is above. Multiple entries can be made at once, with each entry on a separate line. Each line contains the value, plus a pound sign (#) followed by an optional individual annotation (a label for display within the L11WAAP interface). If individual annotations are not provided, then L11WAAP will assign the content of the Annotation field to each entry. Example:

    For other categories, one entry can be made at a time. Annotations are defined in the Annotation field, and are not preceded by a pound sign.

    Most Rule criteria are case sensitive. The exception is Header, where the criteria are not case sensitive.

    Category and Match

    The Match parameter will vary, depending on the chosen Category.

    Category
    Match
    Comments

    Argument

    Name: exact match, case sensitive. Value: regex

    ASN

    Exact match for ASN number

    Authority

    Regex

    Combination of the domain and (optional) port

    Cookie

    Name: exact match, case sensitive. Value: regex

    Currently, there is not a category for a request's protocol. However, you can still create a protocol-based Global Filter by specifying an appropriate Tag, for example protocol:http or protocol:https. This is useful when blocking or redirecting unencrypted HTTP traffic (how to do this).

    Examples

    Here are some sample entries for the various categories. (Note that when the Rule list is displayed like this, for criteria that consist of Name and Value fields, the system displays a colon between them. This colon is not included when entering the criteria.)

    Editing the Rules list

    A Rule list for admin-managed Global Filters can be edited. Hover the cursor over the Entry that you wish to edit, and an "edit" button (a pencil icon) will appear. Select this button, and the Entry can be edited. After editing is complete, select the "confirm" button (a checkmark), then save the changes, and publish them.

    traffic filtering process

    SSO Configuration

    Link11 WAAP provides the ability to log in using SSO (single sign-on). Configuration varies depending on the type of SSO: Okta, Microsoft, or Google.

    Set up Okta SSO

    Step 1: register on , and create an application

    Go to https://{YOUR ACCOUNT}-admin.okta.com/admin/apps/active

    Click Add Application → Create New App

    Choose Platform: Web, sign-in method OIDC (OAuth 2.0)

    Set these attributes:

    Sign-in redirect URIs:

    https://<planet-name>.app.reblaze.io/auth/okta-oauth2-<planet-name>/authorization-code/callback

    Federation Broker mode: disabled

    Step 2: Create group

    In order to pass the Admin group ID, we need to add a custom attribute to the user groups. Directory > Profile Editor > Apps > Click on Profile

    Now map it:

    Directory > Profile Editor > Apps > Click on Mappings

    Assign group reblazeadmin to your app.

    Copy the values for Client ID and a new client secret:

    Step 3: Add parameters to Reblaze

    On the Reblaze SSO page (System -> SSO Configuration):

    Fill in the requested values. For Issuer, use your Okta account. For IDP Group Claim, use the group you created above in Step 2.

    Set up Microsoft Entra ID SSO

    Step 1: Go to → Enterprise applications

    Step 2. Create the application

    Choose + New Application → + Create your own application:

    Step 3: Create the SSO app

    Select Integrate any other application you don't find in the gallery (Non-gallery)

    Step 4: Select SAML method

    Go to Single sign-on section and choose SAML:

    Step 5: Set up appropriate links

    Edit the Basic SAML Configuration:

    • Set Azure's Identifier (Entity ID) to <planet-name>.app.reblaze.io. Alternately, a unique identifier can be entered (e.g., customer_domain.com?sso=123), without any "https://" prefix. In either case, save a copy of this value somewhere; it will be needed again later.

    • Set Azure's Reply URL to https://<planet-name>.app.reblaze.io/auth/azure-saml2-<planet-name>/authorization-code/callback

    Step 6: Add a user group claim

    Edit user.groups:

    Click on +Add a group claim, and choose:

    • All groups

    • Source attribute: Group ID

    Step 7: Add a user as a member of the application:

    Step 8: Get admin group ID

    Go to Azure Active Directory → Groups, and create a group.

    And assign a user to the group:

    Step 9: Get SAML 2 data for Reblaze

    From Azure's Single sign-on section, copy the Entity ID (entered during a previous step) and Login URL:

    And from the Groups Overview section, copy the Object Id. This should be the same ID from Step 8.)

    Add these parameters to the Reblaze SSO page. For Reblaze's IDP group claim, use Azure's Object Id.

    Set up Google SSO

    Step 1: Generate new OAuth credentials

    1. Go to Google APIs & Services Credentials:

    2. Click Create Credentials (shown below) -> OAuth client ID

    Step 2: Configure the new OAuth client ID

    1. For Application type, select Web application

    2. Specify a Name for this client ID. (This name is only shown in the Google Cloud console.)

    Step 3: Add authorized URIs

    Define the domains and endpoints used by your planet to communicate with the OAuth 2.0 server:

    • Authorized JavaScript origins: https://<planet-name>.app.reblaze.io

    • Authorized redirect URIs: https://<planet-name>.app.reblaze.io/auth/google-oauth2-<planet-name>/authorization-code/callback

    Step 4: Create and get credentials

    1. When you are done with the above steps, select Create. The new client ID will be created and displayed to you.

    2. Copy the credentials (client id + client secret) for use in the following steps below.

    Step 5: Enable the Admin SDK API

    1. Navigate to

    2. In the APIs & Services menu, select Library

    3. Search for "Admin SDK API", and select the result. The Admin SDK page will appear.

    4. Select ENABLE if it isn't already enabled.

    Step 6: Authorize the API client

    1. Navigate to

    2. Select Security -> Settings

    3. At the bottom of the page, select API access control

    4. Select Domain wide delegation -> Manage domain wide delegation

    Step 7: Configure Reblaze SSO

    Within the Reblaze console, go to the SSO page (System -> SSO Configuration).

    • Enabled: if not already "on", toggle it

    • SSO login name: choose a name for display within the console

    • Provider: select google

    • OAuth2 Client id: enter the client id obtained in Step 4

    Step 8: Map groups

    Every Reblaze user account has a role, with an Access Level that defines permissions. There are available, with varying capabilities.

    When a user logs in via Google SSO, the system uses their Google Groups to determine which role they will have within Reblaze.

    In this step, you will define (if necessary) and connect Google groups to Reblaze roles.

    1. Determine how many roles are being used within your planet. (Some organizations will use all four, while others might not.)

    2. Navigate to . Consider the Groups that currently exist; would any map well to a Reblaze role? For each role that does not currently have an appropriate Google Group, select Create Group and define one.

    3. Return to the Reblaze SSO Configuration page. For each role being used, create a group map with:

    Dashboard

    An overview of traffic activity

    The Dashboard page displays all incoming traffic and the actions executed in response to the different traffic events.

    The user interface has three main sections:

    Country

    Exact match

    Header

    Name: exact match, case insensitive. Value: regex

    IP Address

    Exact match for IP, CIDR

    Method

    Regex

    Organization

    Regex

    Example: the Organization for ASN AS15169 is Google LLC.

    Path

    Regex

    Path Matching Name

    Exact match

    Query

    Regex

    Region

    Regex

    Security Policy Name

    Exact match

    Subregion

    Regex

    Tag

    Exact match

    URI

    Regex

    Path + query

    In the API Client section, select Add New

  • In the Client Name field, enter the client ID from Step 4 above.

  • In the One or More API Scopes field, enter this: https://www.googleapis.com/auth/admin.directory.group.readonly

  • Select Authorize

  • OAuth2 Client secret: enter the client secret obtained in Step 4

  • Protocol: select oauth2

  • JWT token group property name: select email

  • An IDP Group Claim containing the email associated with the corresponding Google Group
  • The Reblaze role

  • SSO configuration within Reblaze is now complete. User management now consists of ensuring that each user is a member of the appropriate Google Group. For example: a Google Group has been created for [email protected], and within Reblaze, this email address is mapped to the role of Editor. Every user who should have Editor permissions can receive them merely by being added to the [email protected] Google Group.

  • Okta
    Azure Portal
    https://console.cloud.google.com/apis/credentials
    https://console.developers.google.com
    admin.google.com
    four Access Levels
    https://groups.google.com/my-groups
    contact support

    Top Metrics

    Note also that the Top Metrics section includes some tools for quickly building queries, often useful when investigating security events.

    Query specification

    Constructing a query

    The controls at the top allow you to easily filter the display to show only the data you want. Initially, it asks you to supply a query.

    Adding a query to the Search field and selecting the magnifying glass icon will display the results.

    If the Search field is left empty, Link11 WAAP will display all results that match the selected Server Group (if any) and the parameters in the date/time selection field.

    Server Group selection

    On the upper right, there is a dropdown list of Server Groups (which in most deployments, correspond to domains). Selecting one will add a filter parameter that will restrict query results to that Server Group. If no Server Group is selected, traffic data will be returned for all of them.

    Server Group filtering can also be done manually, by entering a parameter and value (server_group="$SERVER_GROUP_NAME") into the Search field. The dropdown list will reflect this specification.

    If a Server Group is manually specified with an operator other than "equals" (e.g., server_group~"api"), the dropdown list will not be able to reflect this. In this situation, the UI's controls will not fully represent the query that is being run.

    Date/Time selection

    Selecting the "calendar" icon will display the date/time picker, for specifying the beginning and ending dates/times for the query.

    When selecting times, hours and minutes are required, while seconds are optional. To specify seconds, simply click in the time selection box and type them, as shown in the "To" field below.

    When seconds are not specified, the beginning of the specified minute will be used.

    Filter syntax

    Queries consist of field names, operators, and arguments. Multiple filters can be combined (separating them with commas), and are evaluated with a logical AND. Some examples:

    • Show blocked requests: blocked=true

    • Show requests from the United States: country="United States"

    • Show requests with status codes in the 200s: status>199,status<=299

    • Show requests containing the string contentfilter in their reason for being blocked: reason~"contentfilter"

    For a full explanation and more examples, see the documentation of Query Filter Syntax.

    Copying a query

    If you have constructed a query that you want to use for another purpose, select the "duplicate" icon next to the magnifying glass icon. A text string for the query will be copied to your clipboard.

    Transferring a query to the Events Log

    To transfer the current query to the Events Log, simply select the "Open Events Log" button on the upper right. (Note that in order for the query to transfer, it must have been run already.)

    Additional options

    The kebab (vertical three-dot) menu on the far right offers three options:

    • Filter Information: Links to a page in the user documentation describing syntax and best practices for constructing queries.

    • Query History: Shows the history of your queries in the current page (Dashboard or Events Log; separate histories are maintained for each). Each entry provides a Restore button, to restore that query to the Search field. Selecting the Search button will then re-run that query.

    • Apply Previous Query: Restores the previous query to the Search field. Selecting the Search button will then re-run that query.

    Working with the Dashboard charts

    Data categories

    Link11 WAAP reports data according to several categories, summarized here:

    Hits

    Total amount of requests

    Passed

    Requests that reached the upstream server.

    Blocked

    Requests that were blocked by L11WAAP.

    Humans

    Requests that passed L11WAAP's human vs. bot challenge process.

    Bots

    Requests with originators that were not (yet) verified as humans. For a full explanation, see .

    Challenges

    Requests that were served with bot detection challenges.

    For a full explanation of these categories and their relationships to each other, see this page: Traffic Reporting and Analytics.

    Time scale

    The charts display all data for the query's time period.

    Normally, the time period is shown in the date/time selection control. However, if the query string shown in the Search field contains a date/time period, the one in the Search field will override the selection control.

    To adjust the time period shown in the charts, modify the query in the Search field or date/time control.

    If you merely wish to inspect a smaller portion of the current period, you can drag the cursor over the corresponding portion of the chart. The query will be adjusted automatically to focus only on this time period.

    Showing data for points in time

    Hovering the cursor over a chart will display the values at that point on the graph.

    Quickly filtering data categories

    You can filter the items being shown in a chart by selecting the data categories in the legend to enable/disable them.

    Filtering the chart to show only Hits and Blocked requests, by disabling Passed and Bots.

    Timelines

    Passed vs. Blocked

    This chart shows the traffic that was processed by L11WAAP: requests which passed through to the upstream servers, and requests that were blocked. Hits are distributed by time and sorted into three different categories: Humans, Challenges, and Blocked.

    Response Status

    Counts the number of status codes in a certain time period.

    HTTP Status response codes are divided into five categories:

    • 1xx - Informational Response

    • 2xx - Request Successful

    • 3xx - Request for Redirection

    • 4xx - Client Error

    • 5xx - Server Error

    For a detailed list of response codes, go here.

    Unique Sessions and IPs

    How many unique sessions and IP addresses were active at any given time.

    Total Bandwidth (Bytes)

    Total bandwidth for all proxies.

    Requests Count

    The number of network requests during a certain period of time.

    Bandwidth (Bytes)

    Bandwidth for the current proxy.

    Latency

    The time (in milliseconds) consumed by L11WAAP's processing.

    Top Metrics

    The bottom part of the Dashboard displays traffic statistics according to a variety of "top" or "most frequent" metrics: the Top Applications, Top Countries, Top Targets, etc.

    Each metric contains a list of entries. Where appropriate, entries representing blocked requests are shown in red.

    In most of these lists, right-clicking on the entries will display a menu with options to copy the corresponding value to the clipboard, automatically rebuild the current query to show only (or exclude) that value, or show the Events Log with requests matching (or excluding) that value.

    Most of the Top Metrics lists display their results according to the data categories described above (i.e., Hits, Humans, Bots, etc.)

    Some of the lists include values for Down (the amount of traffic that originated from the upstream server towards the clients) and Up (the amount of traffic that originated from the client towards the upstream server).

    In the Top Metrics lists, rows are marked as red when they have a blockage rate above 30%. The blockage rate is the ratio of requests blocked by the system to the number of total network requests: blockage rate = (challenged requests + requests blocked by Link11 WAAP + requests blocked by the origin) / (total requests)

    In the Top Metrics lists, Hits greater than 999 are specified in short scale notation. They contain a coefficient and a suffix (K, M, B, or T) with zero or one decimals of precision. Specifically:

    • Values from 0-999 are given in full.

    • Values from 1,000-999,999 are "1.0K" to "999K".

    • Values from 1,000,000-999,999,999 are "1.0M" to "999M".

    • Values from 1,000,000,000-999,999,999,999 are "1.0B" to "999B".

    • Values from 1,000,000,000,000-999,999,999,999,999 are "1.0T" to "999T".

    The full value can be displayed by hovering the cursor over the number.

    Note that in the Hits column, these short-scale values are quantities (the amount of hits), not sizes (i.e., they do not represent bytes). They should not be confused with columns such as Down and Up, which use similar suffixes when describing bandwidth in bytes.

    Applications

    Shows all protected sites for the current L11WAAP deployment.

    Countries

    Shows incoming traffic sorted by country. Each country's flag is shown by its name.

    Sources

    Shows traffic data according to IP address. The ASN (autonomous system number) is included where appropriate.

    Sessions

    Shows the nature of user sessions. Sessions that pass L11WAAP's bot mitigation challenge are identified as originating from humans, and are listed here according to a user cookie containing RBZ in the cookie ID. Sessions that did not pass the challenge are shown with - for the ID.

    Targets

    Shows the URLs that were accessed the most frequently.

    Blocked & Monitored

    Shows the most common reasons why requests are being blocked or monitored during the time period.

    Referers

    Shows the referers that were extracted from the request headers.

    Browsers

    Shows all the user agents that initiated requests for the application(s).

    Organizations

    Shows all of the ASNs (Autonomous System Numbers) from which requests were sent. The ASN can identify individual entities, or larger networks: for example, a telecom provider or a cloud provider.

    Total Time

    Shows a list of URIs, with the total latency for each.

    WAAP Time

    Shows a list of URIs, with the latency for each from L11WAAP.

    Origin Time

    Shows a list of URIs, with the latency for each due to the upstream server.

    Building queries while investigating security events

    When security incidents occur, the investigator will frequently submit a succession of queries, often starting from a broad scope and then drilling down into a narrower focus while trying to discern the underlying cause.

    Link11 WAAP provides several tools in the Top Metrics section to make this process easier. The entries in each list can be right-clicked to display a popup menu, as shown below.

    In this example, the admin is observing the Organizations list in the Top Metrics section, and has right-clicked on the top entry.

    The options in the menu will do the following.

    Copy value to clipboard: Copies the value of whatever was right-clicked to the clipboard. In the example above, this string would be copied: ASN4766 Korea Telecom.

    Show matching: Adds a filter parameter (for whatever was right-clicked) to the existing query in the Search field at the top of the page. Submitting the modified query will restrict the results to requests that match the field and value that was selected. In the example above, the following string would be added to the query: organization="ASN4766 Korea Telecom".

    Hide matching: Adds a filter parameter (for whatever was right-clicked) to the existing query in the Search field at the top of the page. Submitting the modified query will exclude requests that match the field and value that was selected. In the example above, the following string would be added to the query: organization!="ASN4766 Korea Telecom".

    Events Log (matching): The same as Show matching, except that it opens the Events Log with the modified query.

    Events Log (other): The same as Hide matching, except that it opens the Events Log with the modified query.

    The Events Log has similar query-building capabilities when displaying a request.

    Query specification
    Timelines
    The Dashboard page, with the "Top Metrics" section at bottom set to Countries.

    Rate Limit Rules

    Controlling the rates of incoming requests

    Overview

    There are many web threats that are built upon requests which otherwise might seem benign: credential stuffing, enumeration, payment card validation, coupon/gift code discovery, and more.

    Rate limiting defends against these malicious activities by restricting the rates at which traffic sources can successfully submit requests. When a limit is exceeded, an action can be taken; for example, subsequent requests from that traffic source can be blocked for a defined period of time.

    For more information, see the detailed discussion below of .

    Content Filter Profiles

    Filtering requests based on their content

    Overview

    Content Filtering is the final stage of traffic processing. This fulfills the role of a traditional WAF, which is to examine the content of a request for specific signatures and take specific actions when matches are found.

    A Content Filter Profile associates signatures () with specific actions, and includes some other parameters as well.

    Counting Bots
    Usage within applications and APIs

    A Rate Limit Rule can be enforced globally by enabling its Global mode setting. Otherwise, the Rule's scope will be defined by its Connections to Security Policies.

    In both cases, enforcement is also subject to the Rule's Active mode setting and the constraints of its Include/Exclude filters.

    If you define a Rate Limit Rule, but its Global mode setting is not enabled and the Rule is not connected to any Security Policies, it will not have any effect within your applications/APIs.

    Administration

    The main page lists all current Rate Limit Rules.

    The administration (addition/deletion/editing/versioning) of these Rules follows the conventions described here.

    Components

    Each Rate Limit Rule consists of the following:

    • Settings to define the scope (the Global mode, Active mode, Include/Exclude lists, and Connections to Security Policies). These specify the requests upon which this Rule will be enforced.

    • A rate limit (defined by the combination of Time Frame, Count by / Event, Number of events, and Time frame).

    • Action(s) to perform when a violation occurs (Action, and Ban mode)

    • General parameters for administration.

    These parameters are described below.

    Note that while Rate Limit Rules can be used for simple rate limiting (e.g., enforcing limits on the rate of requests from an IP), they can do much more than this. See How rate limits are enforced below for an in-depth discussion and examples.

    Individual parameters

    Name

    A name for this Rule, to be used within the Link11 WAAP interface. A system tag (shown below the Tags field) will include it as well.

    It can be helpful to use descriptive names based on the Rule's parameters. For example, a Rule that limits 50 requests per username, per 60 seconds, could be named "RL 50/60s username". This makes administration straightforward, and also clarifies events in the traffic logs.

    Active mode

    When this setting is enabled, this Rate Limit Rule will be enforced globally (if the Global mode setting is enabled) or within the paths configured in all connected Security Policies, subject to the scope defined by the Include and Exclude lists. To deactivate the Rule, deselect this setting.

    This can be helpful when a Rule is not performing as expected, and needs to be reconsidered. Rather than having to go find all the places where the Rule is being used, admins can simply deactivate it here, which will take effect across the entire platform.

    Global mode

    When enabled, this Rule will be enforced globally, subject to the Active mode setting and the scope defined by the Include and Exclude lists.

    Description

    Information about this Rule, for use within the interface.

    Count by / Event

    These parameters tell the system how to count incoming events for rate limiting purposes. See "How rate limits are enforced," below.

    Number of events

    The maximum allowable number of events within the Time frame.

    Time frame

    The time period within which the Number of events limit is enforced, specified in seconds.

    Frequently, an admin will want to constrain user activity within short periods of time (e.g., only allow three login attempts per minute). However, the optimal setting for Time frame will often be a much larger period of time. This is explained in more detail below: multi-tiered rate limiting.

    Action

    An action to execute when the Number of events limit is exceeded within the Time frame. The available actions are defined on the Actions page. (Note that this can be, but doesn't need to be, a blocking action.)

    Ban mode

    Enables the blocking of a Rule violator for a longer time period than the Time frame. See discussion below: Banning traffic sources.

    Tags

    A list of one or more tags, separated by spaces. These will be attached to requests from traffic sources that have exceeded a rate limit.

    In addition to these admin-defined tags, the system also shows some system tags that will be attached as well.

    Include / Exclude

    By default, an active Rate Limit Rule will be enforced upon all requests globally (if the Global mode setting is enabled), or upon incoming requests targeting URLs to which this rule has been assigned via a Security Policy.

    The Include and Exclude tag lists can be used to further constrain the enforcement of this Rule. Their use is described on the UI Overview page.

    Connections to Security Policies

    The list of Security Policies that include this Rate Limit Rule. Each Security Policy defines the paths within Backend Services for which the Rule will be applicable.

    For a discussion of how to use this control, see Connections to Security Policies.

    How rate limits are enforced

    Above, Rate Limit Rules were described as if the system will count incoming requests, while monitoring the count to see if it has exceeded the Number of events. This is true sometimes, but not always.

    A more accurate description is that a Rate Limit Rule counts events, as specified in the Event field. Frequently, this field will be set to HTTP request, which means that indeed, an internal counter will be incremented every time a request is received. However, there are more powerful ways to configure a Rule beyond this.

    To illustrate how Rate Limit Rule parameters can be used, we'll discuss several examples. We'll start with simple use cases and finish with more complicated situations.

    The examples below are for individual Rate Limit Rules. Note that it's possible for multiple Rules to be in-scope simultaneously, e.g. when several Rules have their Global setting enabled. When a request is received, all applicable Rate Limit Rules are evaluated. If it exceeds the thresholds of multiple Rules, Link11 WAAP will compare their Actions and execute the one that has the highest priority.

    Limiting incoming requests

    Example 1: Let's say an admin wants to define a rate limit as follows:

    "Allow each unique IP address to send up to three requests to /login. If more than three requests are sent within one minute, block them."

    To configure this, the following parameters would be set:

    • Time frame: 60 seconds

    • Count by: Attribute / IP Address

    • Event: HTTP request

    • Number of events: 3

    ...and then this Rate Limit Rule would be connected to a Security Policy that includes /login in its Path Mapping.

    The "Count by" field

    As shown in the example above, L11WAAP maintains an internal counter for every unique value of the Count by parameter(s).

    In the example, a separate counter is maintained for each IP address that is sending traffic. When a request is received from an IP, that IP's counter is incremented, and the system checks to ensure that the counter's value hasn't exceeded the Number of events.

    Each counter is reset to zero once the Time frame has passed (starting when the first request was received).

    Multiple Count by settings

    The Count by parameter can be multifactorial. In other words, admins can select "New Entry" and add additional Count by settings. When this is done, an internal counter is maintained for every unique combination of these settings.

    Example 2: an admin configures the Count by section with two lines: Attribute / IP Address and Header / user_id. When the first request is received, an internal counter is created (set to a value of one) for this unique combination of IP and user_id. A second request is then received, originating from the same IP and from the same user; this causes the internal counter to be incremented up to two. A third request is then received from the same IP but with a different user_id; this causes a new internal counter to be created (and set to a value of one) for this combination.

    Example 3: multiple Count by settings can be used to create site-level rate limiting. Let's say that there are three sites: www.example.com, api.example.com, and mobile.example.com. If the Count by section has Attribute / Session ID and Header / host, then the system will enforce separate rate limit counts for each site.

    Rate limiting within sessions

    Example 4: an admin wants to rate limit the activity within each user session, regardless of the IP that is being used. For this purpose, the admin can set the Count by parameter to Attribute / Session ID.

    Note that the composition of a Session ID might vary, according to context. Therefore, the system allows admins to define it within Security Policies, as explained here.

    Each time a request is received, the system examines its destination's path to see which Security Policy applies. That Policy's definition of Session ID is used for any active Rate Limit Rules connected to it.

    If a Rate Limit Rule is "Active" and "Global", but is not connected to a Security Policy, then the system will use the requestor's IP Address as the default Session ID for rate limiting purposes. In this situation, if actual session-based rate limiting is needed, then admins will need to specify the appropriate combination of headers, cookies, arguments, etc. manually in the Count by section.

    Limiting different types of Events

    As mentioned earlier, the rate limiting system does not directly count requests; instead, it counts events.

    The four examples above have the Event field set to its default of HTTP request. This means that the receipt of a request is an event, and therefore, each request will cause an internal counter to be incremented.

    Other Event settings are possible; admins can specify a header, cookie, argument, or attribute. When this is done, an internal counter is maintained for each Count by value, and incremented each time a new, previously unobserved Event value is encountered in a request.

    Therefore, if an Event is defined as something other than HTTP request, the Rate Limit Rule constrains the number of allowable Event values for any given Count by value.

    Example 5: Let's say we want to allow an individual user to login from a maximum of two ASNs within one hour. (Perhaps the user is accessing our web application from a coffee shop's WiFi, and then a few minutes later, leaves the coffee shop and begins using the cell network instead.) We want to allow this possibility; however, if we receive requests from the same user originating from three or more ASNs within an hour, we want to treat this traffic more suspiciously. This is not possible merely by specifying two Count by conditions, as described above in the "Multiple Count by settings" section. If we set up two conditions (Argument / Username and Attribute / Organization) with a Number of events of 2, and assign it to our login form, then this will merely limit the number of times that the user can login from each ASN within an hour. Instead, we set up one Count by condition (Argument / Username), and then set the Event to Attribute / Organization. Now the Number of events will apply to the number of Organizations that are observed for each specific Username.

    Example 6: Your L11WAAP deployment includes some Rate Limit Rules out of the box. One of them might be a global Rule with settings similar to these:

    • Time frame 3600

    • Count by Cookie / waap_id

    • Event Attribute / IP Address

    • Number of events 5

    L11WAAP sets a cookie (waap_id) for all users who interact with it. This can serve as a global identifier for users, across all domains, sites, applications, etc., even if individual sites/apps track users with different methods (whether user id, authentication tokens, and so on).

    The example Rule shown above allows any particular user to have up to five IP addresses within an hour. When a sixth IP is encountered, it will execute the Action.

    Multi-Tier Rate Limiting

    A common use case for Rate Limit Rules is the following:

    • Allow incoming requests until the Number of events has been reached.

    • Each subsequent request within the same Time frame will trigger the Action.

    However, it is often necessary to create multiple tiers of Rate Limiting:

    • Allow the requests until the first Number of events is reached.

    • Each subsequent event will trigger the first tier's Action, until the second Number of events is reached.

    • Each subsequent event will trigger the second tier's Action, until the third Number of events is reached.

    • And so on.

    For this purpose, multiple Rate Limit Rules can be created and set to be active within the same scope. This allows for increasingly restrictive actions to be taken as the number of events within the same Time frame increases.

    Example 7: one possible use of multi-tier Rate Limits is to allow a certain amount of activity, and then verify that the user is human before allowing the activity to continue, while still enforcing reasonable boundaries. To do this, the Rules might look like this:

    • Number of events 3, Action monitor [tag only]

    • Number of events 7, Action challenge

    • Number of events 10, Action default blocking

    The system would behave as follows:

    • The first three events would be allowed.

    • Events 4-7 would be allowed, but the requests would be tagged.

    • Event 8 would subject the user to a bot challenge. If the challenge is failed, subsequent requests would be blocked.

    • Events 9 and 10 would be allowed.

    • Subsequent events would be blocked.

    Earlier, it was mentioned that the optimal Time frame for a Rate Limit Rule might be quite long. Multi-tier Rate Limits are the reason for this; the Time frame must be long enough to accommodate all of the previous tiers.

    Blocking persistent violators

    When its Time frame expires, a rate limit will reset, and its internal counter will be set to zero.

    This means that the rate limiting described above cannot, on its own, fully defeat persistent attackers.

    Example: Access to a login form is rate-limited to four requests per minute. An attacker tries to brute-force the login, and sends 60 requests per minute. The Rate Limit Rule allows the first four requests, but then blocks the next 56 requests. However, after the minute has passed, the rate limit resets. The attacker is allowed another four attempts before being temporarily blocked again. This cycle can continue for as long as the attacker wishes. In effect, the rate limit is not preventing the attack; it is merely slowing it from 60 attempts per minute down to four attempts per minute.

    To accomplish this, L11WAAP provides two capabilities: Ban mode, and Dynamic Rules.

    Both allow admins to define granular Rate Limit Rules with short time frames and maintain precise control of various situations, while still being able to block persistent violators for much longer periods of time.

    Banning traffic sources

    When Ban mode is enabled, the Ban duration field appears. These two values allow admins to configure a longer-term blocking action for rate limit violators.

    When a Rate Limit Rule is violated (i.e., an event occurs that exceeds the Number of Events), and Ban mode is enabled, the offending traffic source is banned immediately.

    Beginning with the request that triggered the ban, L11WAAP will reject all activity from the offending traffic source, for the length of time specified in Ban duration.

    Dynamic Rules

    A Dynamic Rule is similar to a Rate Limit Rule with Ban mode enabled. It too defines an allowable threshold of events that can occur within a certain period of time. If that threshold is violated, an action occurs.

    However, there are some important differences:

    • When configuring a Dynamic Rule, an admin can choose to block violators, but can also choose a non-blocking Action.

    • If blocking is selected, the blocking can be offloaded to Link11's Layer 3 protection.

    • Dynamic Rules are enforced globally, unless their scope is otherwise constrained.

    • Violators of a Dynamic Rule will appear in the Quarantined list. Admins can manually remove them from this list (which ends the quarantine early) if desired.

    • When a Dynamic Rule is violated, a can be sent.

    how rate limits are enforced
    Circumstances where content filtering will not occur

    A request will not be subjected to content filtering if any of these are true:

    • It was blocked during a previous stage of processing.

    • It triggered a Skip action in a Global Filter, or Bypass in the ACL Profile.

    • Its destination URL matches a which does not have an active Content Filter Profile assigned to it.

    As discussed below, there are also several stages within the content filtering process where some or all of a request might be exempted from completing the process.

    Usage within applications and APIs

    A Content Filter Profile is assigned to paths/URLs within applications and APIs via Security Policies.

    When a request is received, the system checks its destination URL, and uses the Profile that best matches it.

    Out of the box, the system includes a default Content Filter Profile. It can be edited, but it cannot be deleted. It is used for all URLs where no other Profile has been assigned.

    Administration

    The main page lists all current Content Filter Profiles.

    The administration (addition/deletion/editing/versioning) of Profiles follows the conventions described here.

    The Content Filtering process

    Content filtering is a multi-step process:

    1. Data Masking: sensitive data in the request is masked, so that it does not appear in traffic logs.

    2. Content Type Checking: if one or more Restrict content type settings are enabled, they are enforced.

    3. Allowlisting: if the request has one or more specified tags in the Ignore list, it is exempted from further processing.

    4. Content Filtering: several forms of content limits are checked. The request's parameters (headers, cookies, and arguments) are then examined. Tags are added to the request based on .

    5. Tag Evaluation: the request's tags are evaluated for reporting and/or action purposes.

    Each step is described in more detail below. For context, here is a graphic showing the controls/sections within the UI that are used in each step:

    Click to expand this image.

    And here is a flowchart of the process described below, with captions along the top representing the relevant steps:

    Step 1: Data Masking

    For parameters listed in the Parameter Properties list with the Mask? option enabled, their values are replaced by hashes of these values with the Masking seed.

    Step 2: Content Type Checking

    If the Ignore Body setting is not enabled, and one or more Restrict content type settings are enabled, the request is evaluated against them. If the request cannot be parsed according to one of the specified types, the Action will be executed.

    Step 3: Allowlisting

    Before content filtering is performed, the tags that are already attached to the request are evaluated. (These tags could be the result of Global Filters, Rate Limit Rules, or Flow Control Policies.)

    If any tag is found in the Ignore list, the request is not subjected to content filtering (i.e., Step 4 and Step 5 below do not occur). This allows certain requests to be allowlisted (for example, if they are from a trusted source), avoiding the overhead of unnecessary processing.

    Link11 WAAP deployments include two default tags in the Ignore list:

    • let-s-encrypt enables customers to use Let's Encrypt to generate or renew their own SSL certificates.

    • malformed-body prevents Content Filtering from being applied to malformed request bodies. Removing this tag from Ignore will result in tighter security, but can potentially result in performance degradation and False Positive alarms.

    Step 4: Content Filtering

    Starting with the headers, each parameter (each header, cookie, and arg) of the request is processed. Each parameter and its value are compared to the entries in the Parameter Properties list: the entries in its All section and also the relevant parameter-type section (either Headers, Cookies, or Arguments).

    The Parameter Properties list allows the following to be defined:

    • The parameters, if any, whose values should be masked.

    • The parameters, if any, whose values should be restricted to regex definitions.

    • The parameters, if any, which should be exempted from evaluation against specific Content Filter Rules.

    For each parameter, the processing occurs in the order described below, until one of the following happens:

    • the parameter is exempted from further inspection

    • the Action is triggered (which also terminates the processing of the request)

    • the parameter completes its processing

    At that point, the next parameter is processed, until none remain.

    Parameter processing in detail

    • The relevant Max Count limit is checked (excluding decoded content). If it is active and the parameter exceeds the limit, the Action is triggered.

    • The relevant Max Length limit is checked (excluding decoded content). If it is active and the parameter exceeds the limit, the Action is triggered.

    • If the Ignore Alphanumeric input option is enabled, and all the parameter's content is alphanumeric, this parameter is exempted from further inspection.

    • If one or more entries have a definition for Parameter that matches the parameter's name, the entry that most closely matches it is selected. If an entry was selected, and the parameter's value does not match the entry's Matching Value, and the entry's Restrict? option is enabled, the Action is triggered.

    • The parameter is evaluated against the . Link11 WAAP iterates through the Rules, and for each one:

      • If the parameter matched an entry (in both Parameter and Matching Value), and any of the Rule's tags are listed in the entry's Ignore Content Filter Tags, this Rule is skipped and its tag(s) are not attached.

      • Otherwise, the Rule's Match string is compared to the parameter's value. If a match is found, the Rule's tags are attached to the request.

    • This parameter has now completed its processing, and the next parameter in the request is selected.

    A parameter can be exempted from all Content Filtering Rules by including cf-all in its Ignore Content Filter Tags.

    When the Action is triggered, it is executed immediately, and no further content filtering occurs for that request. Therefore, if a request contains more than one type of attack, one will appear in the logs while the remainder will not.

    Step 5: Tag Evaluation

    All the request's tags, including the list of new tags accumulated in the previous step from Content Filter Rule evaluation, are now compared to the Report and Active tag lists.

    During this process, a request's tags are divided into two categories:

    • Specific tags produced by individual rules (and designated with the Rule name: cf-rule-id-XXX)

    • General tags (cf-all and all other tags that are not specific)

    Specific tags are processed first. This allows admins to set up general configurations for threat categories, while still being able to make exceptions for how specific Content Filter Rules are handled.

    The request's list of tags are processed as follows:

    1. All specific tags are compared to the Report list. For each tag that is found there, the relevant Content Filter Rule name will be added to the Events Log's Monitor reason field for the request.

    2. All general tags are compared to the Report list. For each tag that is found there, the relevant Content Filter Rule name will be added to the Events Log's Monitor reason field for the request.

    3. If any of the specific tags are found in the Active list, the Action is executed, and processing ceases.

    4. If any of the general tags are found in the Active list, the Action is executed, and processing ceases.

    Note that in the UI, the Ignore list appears next to the Active and Report lists. However, the Ignore list is processed earlier in the content filtering process (see Step 3: Allowlisting, above). If any of a request's tags match one in the Ignore list, that request is exempted from content filtering.

    An entry in Ignore always "wins". It is dangerous to put anything other than specific tags into it.

    Configuring a Positive Security model

    Content Filter Profiles can be used as part of a positive security model (where by default, all requests are rejected, except for those identified as being legitimate).

    This can be done by ensuring that each parameter (header, argument, or cookie) that could appear within a request is listed in the Parameter Properties list, with an appropriate Matching Value, and with the Restrict? option enabled.

    As described above, during processing, each parameter in the incoming request will be evaluated according to the applicable Matching Value.

    • If it matches, this parameter will pass the test.

    • If it does not match, the Restrict? setting will cause the Action to be executed.

    If a positive security model is correctly implemented, with all possible parameters appropriately defined in the list of Parameter Properties, then Step 5: Tag Evaluation would seem to be irrelevant. Invalid requests will trigger the Action before the Active and Report lists are evaluated, and only valid ones would remain when these lists are evaluated; thus, in theory, these lists could be left empty. However, to compensate for potential errors or omissions, it is still wise to include general high-risk tags (such as the cf-rule-risk:5) anyway.

    Components

    A Content Filter Profile consists of the following:

    • Settings for parsing the request (Restrict content type, Decoding, Ignore Alphanumeric Input, Ignore Body)

    • Settings for processing the request (Action, Tags)

    • Content filtering parameters (the bottom section of the UI, referred to below as the Parameter Properties section)

    • Parameters for (the Ignore list) and (Active and Report lists)

    • Masking parameters for concealing sensitive information in logs and analytics (Masking seed, and Mask? setting for individual parameters)

    • General administration parameters (Name, Description)

    Parameters

    Global Parameters

    In this context, "global" means "applying to the entire request."

    Name

    A name for this Profile, to be used within the interface. A system tag (shown below the Tags field) will include it as well.

    Description

    Information about this Profile, for use within the interface.

    Masking seed

    An admin-defined string for salting the hash when masking private data. See discussion of the Mask? field, below.

    Action

    The action that can be executed under the various circumstances described above in The Content Filtering Process.

    Tags

    A list of one or more tags, separated by spaces. Whenever this Content Filter Profile is applied to a request, these tags will appear in the traffic logs.

    In addition to these admin-defined tags, the system also shows some system tags that will be attached as well.

    Ignore Alphanumeric Input

    When this is selected, this Content Filter Profile will not inspect requests that only contain alphanumeric characters. This reduces computational overhead by not evaluating alphanumeric requests. (Hostile requests such as SQLi, XSS, etc., will contain some non-alphanumeric characters.)

    Ignore Body

    When this is selected, this Content Filter Profile will not inspect the body of the request.

    Restrict content type

    If Ignore Body is not selected, and one or more Content Types are checked, L11WAAP will expect the request to conform to one of them. If the body cannot be parsed according to one of the specified types, the Action will be executed. If no Types are checked, no restrictions are enforced.

    This setting can be a useful way to easily block a variety of attacks. For example, when "Multipart Form" is not selected, a user cannot upload any files, thus preventing malware uploads.

    Decoding

    Which decoding standard(s) should be used.

    When one or more decoding standards are not applicable, they should be unselected here. This will reduce processing time and overhead.

    Tag Processing Settings

    This section defines what happens to a request, depending on its tags.

    The Ignore list

    This list is evaluated before content filtering occurs, as described above in Step 3.

    The interface has two separate places where a tag can be configured to be ignored: here in this section's Ignore column, and also in the Parameter Properties (discussed below). The setting here is global, and will apply to all tags attached to the request. The settings in the Parameter Properties list apply only to the evaluation of specific parameters.

    The Active and Report lists

    These lists are evaluated after content filtering rules have been evaluated. See the description above of Step 5.

    If a potential tag is not included in the Active or Report lists, it is effectively in Ignore mode. That tag cannot result in the request being blocked, regardless of the severity of the threat signature (i.e., the Content Filter Rule) that produced the tag. Along with ensuring that all potential tags are properly configured, it is also recommended that each Content Filter Rule has an appropriate Risk Level defined, and that each Content Filter Profile has the highest risk-level tags (e.g., cf-rule-risk:5, cf-rule-id:libinjection-sqli, andcf-rule-id:libinjection-xss) included in the Active mode. This ensures that the highest-risk requests will still be blocked.

    Parameter Properties

    This is the bottom section of the interface. It defines how L11WAAP processes individual parameters within a request.

    Max length

    The maximum allowable length of the value for this parameter type (header, cookie, or arg).

    Max length limit active mode

    When enabled, Max length is enforced.

    Max count

    The maximum allowable number of this parameter type (headers, cookies, or args).

    Max count limit active mode

    When enabled, Max count is enforced.

    Parameter

    The parameter whose value will be compared to the Matching Value. This can be provided as a specific Name (e.g., sessionid), or as a Regex to match multiple parameters (e.g., user_.+). Note that a Name will be marked with ABC, while a Regex will be marked with <>.

    Matching Value

    A regex pattern. If a parameter's value matches it, the Ignore Content Filter Tags become relevant. If it does not match, the Restrict? option becomes relevant.

    Restrict?

    If a parameter does not match the Matching Value, and Restrict? is selected, then the Action is executed.

    Mask?

    Some requests might contain private data which should not be saved to a traffic log. Parameters which match the Matching Value and for which Mask? is set will be masked / hashed when they are written to the logs, salted with the Matching Seed from the global settings.

    Ignore Content Filter Tags

    A parameter whose value matches its Matching Value, or which does not match but Restrict? is not enabled, will be evaluated against the Content Filter Rules. For each Rule that it matches, that Rule's tags will be attached. Sometimes it is desirable to exempt a parameter from the effects of certain Rules. For example, some Rules filter out special characters; if a parameter can legitimately contain these characters, it would make sense to exempt that parameter from those specific filters. To do this, add the tags from those Rules to this list. These tags will then be ignored for this parameter.

    Properties are defined in the same way for Headers, Cookies, and Arguments within their respective tabs.

    Content Filter Rules

    Proxy Templates

    Overview

    Link11 WAAP acts as a reverse proxy; it receives requests from clients (web visitors, API clients, etc.), blocks hostile traffic, and passes legitimate requests to the backend.

    Proxy Templates define L11WAAP's behavior as a proxy. They are templates for creating new sites (i.e., ) within Link11 WAAP.

    Security Alert
    Security Policy
    Content Filter Rules
    Content Filter Rules
    Step 3: Allowlisting
    Step 5: Tag Evaluation

    When new sites are created, they remain linked to their underlying templates. Revising a Proxy Template will automatically update all sites that are based upon it.

    Components

    A Proxy Template consists of the following:

    • General parameters for administration

    • Frontend settings, defining L11WAAP's interaction with clients

    • Backend settings, defining L11WAAP's interaction with backend servers

    • Trusted Sources, defining trusted sources of traffic (e.g., load balancers and CDNs)

    • Advanced Configuration, defining additional customization

    General Parameters

    Name

    A name to be used within the interface.

    Description

    Information about this Template, to be used within the interface.

    Frontend Settings

    General frontend settings

    Client IP header name

    Defines one or more header fields within which L11WAAP can find the client's IP address. When the system receives an incoming request from a client, the request will have passed through a load balancer on its way to L11WAAP. This means that the header will contain the client's IP and the load-balancer IP. These two IPs are usually found within the X-Forwarded-For field (which is the default entry here). In this situation, L11WAAP knows how to extract the client IP from this field. In other situations, a different field name might be necessary. For example, if the customer is using Akamai CDN, the incoming request will have the client IP in a field named True-Client-IP instead.

    Size Limits

    You can place limits on the amount of data that users can upload to the system. The defaults usually work well; however, if your application accepts user-generated content or other large files, then changes to these settings might be necessary.

    Please note that if you increase these settings within L11WAAP, then the upstream server should also be configured to accept and store the quantity of data that L11WAAP will (potentially) pass through.

    Client max body size

    Specifies the maximum accepted body size of a client request, as indicated by the request header Content-Length. Size in MBs.

    Application IP Rate Limits

    These settings allow you to limit the amount of resources consumed by an IP address. The system can limit consumption by the average number of requests per second, while also allowing temporary bursts at a higher rate.

    When a requestor exceeds any of these thresholds, subsequent requests will be answered with error code 503 (Service Unavailable).

    Note that this rate limiting applies across the entire application. For example, if one IP address is submitting requests to multiple URLs within a web application, all the requests are combined when determining if rate limits have been violated. If you need more flexibility, consider using Rate Limit Rules instead.

    Requests per second per IP address

    Sets the allowable request rate per IP, per second: i.e., the allowable per-second average of incoming requests, enforced on an incremental basis (where "increment" refers to the number of milliseconds allowed for one request).

    Example: This is set to 100. Thus, 100 requests are allowed per second. However, the system does not enforce rate limits on a per-second basis; it used a granularity of milliseconds. Therefore, it will allow one request every 10 milliseconds. (100 r/s, divided by 1000 ms/s, equals 1r/10ms.)

    Burst of requests per second per IP address

    Sets the allowable additional burst rate per IP, per second. The additional requests are accepted and placed into a queue.

    Example: Let's say that the previous field (Requests per second per IP address) is set to 100. Without burst limits—i.e., if this field were set to zero—the system will reject every request that was received less than 10ms after the previous one. However, the burst limit is set to 20 instead. This means that L11WAAP will accept 21 requests (1 original plus 20 additional) per 10 milliseconds. In other words, when a request is received, up to 20 more can be received and accepted within the following 10 ms. If instead 25 total requests are received during that time, the last four requests will be denied with a 503 error.

    Timeouts

    The Timeout settings allow the system to monitor the time required to serve resources to each client. Any connection that exceeds the specific limits will be dropped.

    Why timeouts are important

    Some DDoS tools (e.g., R-U-Dead-Yet, or RUDY) send a relatively small quantity of traffic requests, but do so as slowly as possible (often with each byte sent separately). While a legitimate request can be resolved in milliseconds, a single RUDY client can tie up server resources for several minutes. Even a few hundred of these machines attacking a server can be very destructive.

    The Timeout settings allow L11WAAP to block unresponsive requestors, whether their unresponsiveness is malicious or not. For most deployments, the default timeout settings work well. They are sufficient to filter out hostile traffic, while still accommodating even those users with low bandwidth.

    All times are specified in seconds.

    Client body timeout

    If the body is not obtained in one read-step, this timeout begins. If the timeout expires and the client has still sent nothing, the L11WAAP Gateway returns error Request time out (408).

    Keepalive Timeout

    The timeout for keep-alive connections with the client. The L11WAAP Gateway will close connections after this time. This setting increases server efficiency; it allows the server to re-use browser connections and save resources. When changing this value, special care should be taken; in some cases, it depends on specific cloud vendor and load balancer settings.

    Client header timeout

    How long to wait for the client to send a request header. If the header is not received within this time, L11WAAP returns error 408 (Request Timeout).

    Send timeout

    Specifies the response timeout to the client. This timeout does not apply to the entire transfer but, rather, only between two subsequent client-read operations. Thus, if the client has not read any data for this amount of time, the L11WAAP Gateway shuts down the connection.

    Header Sizes

    For more info on the header size settings below, see this and this.

    The multiple of Large header size and Large header buffers should not exceed load balancer limitations.

    Large header size

    The maximum buffer size for accepting client request headers.

    Header buffer size

    The default buffer size for accepting client request headers.

    Large header buffers

    The maximum number of buffers for accepting client request headers.

    Body Size

    Client body buffer size

    The maximum buffer size for accepting the client body.

    Backend Settings

    Proxy Connect Timeout

    The time (in seconds) for L11WAAP to wait, before treating a connection with the backend as having failed.

    Proxy Send Timeout

    The time (in seconds) for L11WAAP to wait, before treating a data transfer attempt to the backend as having failed.

    Proxy Read Timeout

    The time (in seconds) for L11WAAP to wait, before treating a downstream (toward Link11) data transfer attempt as having failed.

    Backend Service Host Header

    Defines the value of the Host header passed to the backend. The default value ($host) sets it equal to the Host header in the incoming request (in other words, the Host header is passed upstream unchanged).

    Real IP Header Name

    Defines the field name that contains the client's IP address. L11WAAP is a proxy, and it passes incoming client requests to the upstream server. This means that the server will receive request headers which contain L11WAAP's cloud IP address as the "client" IP. Usually, this is not useful; almost always, the server will need the IP of the actual client instead. To facilitate server logging, analytics, and so on, L11WAAP adds the IP address of the originating client to the headers that it sends to the server. The Real IP Header Name defines the name of the field within which this information is passed.

    Trusted Sources

    This list defines the ranges of IP addresses which are trusted for providing forwarded IPs: for example, the load balancers in front of L11WAAP, or a CDN.

    Each entry in the list can be specified as either:

    • A range of IPs

    • The name of a Global Filter. The Trusted Sources list will link to that Filter, and include its list of IPs; whenever the Filter's IPs are updated, the Trusted Sources list will be dynamically updated as well.

    Selecting the + New button will display a new entry for editing. Multiple entries can be added.

    For each entry, fill in the Source field to specify the type (IP Address or Global Filter), and the Source value (the IP range or Global Filter name). The Comment field is optional.

    Advanced Configuration

    Internally, L11WAAP uses Nginx. A Proxy Template contains a number of commonly-used settings that define Nginx's parameters and behavior. However, there are many other possible configuration changes that an admin might want to make.

    The Advanced Configuration section allows admins to define custom code for this purpose.

    How it works

    Nginx uses configuration files to define its settings. When a Link11 WAAP admin adds Custom Configuration Code to a Proxy Template, and then publishes the changes, this code is inserted into an individual per-site configuration file. (In other words, each server group can have its own code.) It is then imported into the main nginx.conf file.

    During this process, nginx.conf's other contents are not overwritten. L11WAAP extends this file with its various per-site settings.

    Be extremely cautious when using the capability. The system will perform some basic validation on custom code (for syntax and so on), but this is not exhaustive; therefore, admins are ultimately responsible to ensure that the code is correct. If incorrect code is executed, this can result in unpredictable system behavior.

    Some examples are below.

    Parameters

    Advanced Configuration Name

    A name to be used within the interface.

    Description

    A description to be used within the interface.

    Protocol

    Requests with this protocol will trigger the execution of the Custom Configuration Code.

    Custom Configuration Code

    The code which will be executed when requests have the specified Protocol.

    Custom code can use the directives and variables from ngx_http_upstream_module.

    In the examples below, there are sections of code delimited by -----BEGIN SERVER----- / -----END SERVER-----. and -----BEGIN LOCATION----- / -----END LOCATION-----. These delimiters are not included in the final file; they merely tell L11WAAP where to insert the code.

    • Code inside the SERVER delimiters will be placed into a server {} block. (This code can include one or more nginx location {} blocks.)

    • Code inside the LOCATION delimiters will be placed within a location / {} block for the specific server group.

    • Code without any delimiters will be placed into the server {} block.

    Below are some examples.

    Example 1

    Example 1 discussion

    This snippet configures SSL client certificate authentication on the Nginx server, requiring clients to present valid certificates. The server uses the certificate authority file at /etc/zzzz-client-cert-mydomain.crt to validate the client's certificate, allowing up to 3 levels of intermediate certificates in the validation chain. There are no specific configurations for any URL locations.

    Here is a detailed explanation.

    Specifies the path to the client certificate authority (CA) file. This file contains the trusted CA certificates (in this case, zzzz-client-cert-mydomain.crt) that are used to verify the client's SSL certificate.

    This turns on SSL client verification, meaning the server will require and verify client certificates. Any client trying to connect to this server must present a valid SSL certificate signed by a trusted authority specified in the ssl_client_certificate file.

    Defines the maximum verification depth for the client certificate chain, meaning that Nginx will verify up to 3 levels of intermediate certificates. This ensures that the certificate chain presented by the client is valid up to the root certificate authority.

    This section is empty, indicating that no specific configurations are defined for any particular location in this part of the file. However, in the broader context of Nginx configurations, this would be where you define behavior for specific paths or endpoints on the server, such as /api or /login.

    Example 2

    Example 2 discussion

    By default, Let's Encrypt is supported only on port 80 (the http protocol). If for some reason the request is received over HTTPS (note that on Cloudfront there is a redirect from HTTP to HTTPS), it needs to be allowed. The code above adds validation on HTTPS.

    Example 3

    Example 3 discussion

    This configuration proxies requests for a certain location (the root) to an upstream server, handling WebSocket connections and forwarding various headers like real client IP and protocol. Lua scripting is used to inject custom logic during the request and response phases, and the caching status of the upstream is also added to the response headers.

    Configures Nginx to use HTTP/1.1 when communicating with the upstream server.

    Passes the request to the upstream server, which is dynamically defined by the $active_upstream variable.

    Sets the Upgrade header to the value of $http_upgrade, typically used for WebSocket connections or other HTTP protocol upgrades.

    Sets the Connection header to the value of $connection_upgrade. This also relates to keeping WebSocket or other persistent connections alive.

    Modifies the Host header that is passed to the upstream server to include the requested host and port.

    Adds a header to pass the client’s real IP address (from $remote_addr).

    Sets the X-Forwarded-For header, which includes the original IP address of the client, useful for tracking traffic through multiple proxies.

    Sets the protocol used for the request (HTTP or HTTPS) in the X-Forwarded-Proto header.

    Ensures that the request headers are forwarded to the upstream server.

    Lua blocks now customize how requests and responses are processed. First, a script is run at the access phase of the request. This script requires a Lua module called hooks and calls the trigger_access() function. This can be used to run custom logic like authentication, logging, or modifying requests.

    Next, a Lua script is run during the header filter phase (typically after the response headers are received from the upstream server but before they are sent to the client). The trigger_header() function can modify or inspect response headers.

    Adds a custom header (X-Cache-Status) to the response, reflecting the caching status of the upstream server.

    Example 4

    Example 4 discussion

    This Nginx configuration block handles requests for the path /public/notification, forwarding them to an upstream HTTPS server. Lua scripts are used to log profiling data for request and response processing times. Caching is disabled, and the response is sent directly without buffering. The use of session handling (session.process_request()) suggests some form of user/session validation or similar logic.

    Specifies that this block handles requests to the exact URL /public/notification.

    Begins Lua scripting for request handling.

    Loads a Lua module named "session". This module is likely responsible for session management or processing the request in some way.

    Loads a Lua module called metadict, likely for logging or profiling purposes.

    Gets a function metadict_set from the metadict module to set profiling data.

    Logs the start of request processing by calling metadict_set with the current timestamp (ngx.now()), storing it under the key 'rbz_start_req_proc' in a "profiler".

    Calls a function process_request() from the session module, which processes the request, likely dealing with authentication, session validation, etc.

    Logs the end of the request processing by calling metadict_set again, marking the completion of the request with the timestamp.

    Next, there is Lua scripting for response handling.

    This block runs after the upstream server responds but before the response is sent to the client.

    Loads the metadict module again.

    Retrieves the metadict_set function.

    Logs the start of the response phase by setting a timestamp for the key 'rbz_start_response' in the "profiler".

    Instructs Nginx to bypass any caching mechanism for this specific request, meaning the response will not be served from cache.

    Ensures that the response is not stored in the cache for future requests.

    Adds a custom response header (X-Cache-Status) that contains the upstream cache status, indicating whether caching was used for this request.

    Disables proxy buffering for this location, meaning that Nginx will not buffer the response and will immediately send it to the client as it receives it from the upstream server.

    Forwards the request to the specified upstream server at https://mydomain_ssl. This could be a load balancer or an actual backend server, and it's handling the secure HTTPS protocol.

    Server Groups
    -----BEGIN SERVER-----
    ssl_client_certificate /etc/zzzz-client-cert-mydomain.crt;
    ssl_verify_client on;
    ssl_verify_depth 3;
    -----END SERVER-----
    -----BEGIN LOCATION-----
    -----END LOCATION-----
    
    ssl_client_certificate /etc/zzzz-client-cert-mydomain.crt;
    ssl_verify_client on;
    ssl_verify_depth 3;
    -----BEGIN LOCATION-----
    -----END LOCATION-----
    -----BEGIN SERVER-----
    location ^~ /.well-known/acme-challenge/ {
      proxy_set_header rbz-letsencrypt 931f5de197188ad0ab3e2de3efeb4d60b15767dff448fbd0;
      proxy_set_header Host myplanet.app.reblaze.io;
      proxy_pass https://myplanet.app.reblaze.io;
      add_header Cache-Control "max-age=0, no-cache, no-store";
      add_header expires "Thu, 01 Jan 1970 00:00:01 GMT";
      add_header Pragma no-cache;
    }
    -----END SERVER-----
    -----BEGIN LOCATION-----
    -----END LOCATION-----
    
    location / {
      proxy_http_version  1.1;
      proxy_pass $active_upstream;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection $connection_upgrade;
      proxy_set_header Host $host:$proxy_port;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto $scheme;
      proxy_pass_request_headers on;
      access_by_lua_block {
        local hooks  = require "hooks"
        hooks.trigger_access()
      }
      header_filter_by_lua_block {
        local hooks  = require "hooks"
        hooks.trigger_header()
      }
      add_header X-Cache-Status $upstream_cache_status;
    }
    proxy_http_version  1.1;
    proxy_pass $active_upstream;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;
    proxy_set_header Host $host:$proxy_port;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_pass_request_headers on;
    access_by_lua_block {
      local hooks = require "hooks"
      hooks.trigger_access()
    }
    header_filter_by_lua_block {
      local hooks  = require "hooks"
      hooks.trigger_header()
    }
    add_header X-Cache-Status $upstream_cache_status;
    location = /public/notification {
      access_by_lua_block {
        local session = require "session"
        local metadict = require "metadict"
        local metadict_set = metadict.metadict_set
        
        metadict_set("profiler", ngx.now(), 'rbz_start_req_proc')
        session.process_request()
        metadict_set("profiler", ngx.now(), 'rbz_done_req_proc')
      }
      header_filter_by_lua_block {
        local metadict = require "metadict"
        local metadict_set = metadict.metadict_set
        metadict_set("profiler", ngx.now(), 'rbz_start_response')       
      }
      proxy_cache_bypass 1;
      proxy_no_cache 1;
      add_header X-Cache-Status $upstream_cache_status;
      proxy_buffering off;
      proxy_pass https://mydomain_ssl;
    }
    location = /public/notification {
    access_by_lua_block {
     local session = require "session"
    local metadict = require "metadict"
    local metadict_set = metadict.metadict_set
    metadict_set("profiler", ngx.now(), 'rbz_start_req_proc')
    session.process_request()
    metadict_set("profiler", ngx.now(), 'rbz_done_req_proc')
    header_filter_by_lua_block {
    local metadict = require "metadict"
    local metadict_set = metadict.metadict_set
    metadict_set("profiler", ngx.now(), 'rbz_start_response')
    proxy_cache_bypass 1;
    proxy_no_cache 1;
    add_header X-Cache-Status $upstream_cache_status;
    proxy_buffering off;
    proxy_pass https://mydomain_ssl;

    Get Load Balancers

    get

    Get all Load Balancers in a configuration

    Path parameters
    configstringRequired
    Responses
    200

    Load Balancers retrieved successfully

    application/json
    400

    Input Error

    application/json
    500

    Internal Server Error

    application/json
    get
    /api/v4.3/conf/{config}/load-balancers

    Add Certificate

    put

    Add a certificate to a Load Balancer

    Path parameters
    configstringRequired
    entry_namestringRequired
    certificate_idstringRequired
    Query parameters
    providerstring · enumRequired

    An enumeration.

    Possible values:
    regionstringRequired
    defaultbooleanOptionalDefault: false
    elbv2booleanOptionalDefault: true
    listenerstringRequired
    listener-portintegerRequired
    Responses
    200

    Successfully added certificate to Load Balancer

    No content

    422

    Validation Error

    application/json
    500

    Internal Server Error

    application/json
    put
    /api/v4.3/conf/{config}/load-balancers/{entry_name}/certificates/{certificate_id}

    No content

    Detach certificate

    delete

    Detach a non-default certificate from the Load Balancer

    Path parameters
    configstringRequired
    entry_namestringRequired
    Query parameters
    providerstringRequired
    regionstringRequired
    certificate-idstringOptional
    elbv2booleanOptionalDefault: true
    listenerstringOptional
    listener-portstringOptional
    Responses
    200

    Successfully detached certificate from Load Balancer

    No content

    422

    Validation Error

    application/json
    500

    Internal Server Error

    application/json
    delete
    /api/v4.3/conf/{config}/load-balancers/{entry_name}/certificates

    No content

    Get available datacenters per region and Load Balancer

    get

    Get regions with available datacenters for each Load Balancer.

    Path parameters
    configstringRequired
    Responses
    200

    Load Balancers retrieved successfully

    application/json
    400

    Input Error

    application/json
    500

    Internal Server Error

    application/json
    get
    /api/v4.3/conf/{config}/load-balancers/regions

    Set preferred datacenters for each Load Balancer

    post

    Set preferred datacenters for each Load Balancer. "automatic" will choose the best route depending on the load balancer location.

    Path parameters
    configstringRequired
    Body
    lbsobject · LoadBalancerRegiontoDatacenterRegion[]RequiredExample: [{"id":"<id>","regions":{"ash":"ffm","ffm":"ffm","hkg":"ffm","lax":"ffm","lon":"ffm","sgp":"ffm","stl":"automatic"}}]
    Responses
    200

    Load Balancers retrieved successfully

    application/json
    400

    Input Error

    application/json
    500

    Internal Server Error

    application/json
    post
    /api/v4.3/conf/{config}/load-balancers/regions
    {
      "message": "Successfully set Load Balancer regions"
    }
    GET /api/v4.3/conf/{config}/load-balancers HTTP/1.1
    Host: 
    Accept: */*
    
    {
      "total": 1,
      "items": [
        {
          "certificates": [
            "text"
          ],
          "default_certificate": "text",
          "dns_name": "text",
          "listener_name": "text",
          "listener_port": 1,
          "load_balancer_type": "classic",
          "max_certificates": 1,
          "name": "text",
          "provider": "aws",
          "region": "text"
        }
      ]
    }
    PUT /api/v4.3/conf/{config}/load-balancers/{entry_name}/certificates/{certificate_id}?provider=aws&region=text&listener=text&listener-port=1 HTTP/1.1
    Host: 
    Accept: */*
    
    DELETE /api/v4.3/conf/{config}/load-balancers/{entry_name}/certificates?provider=text&region=text HTTP/1.1
    Host: 
    Accept: */*
    
    GET /api/v4.3/conf/{config}/load-balancers/regions HTTP/1.1
    Host: 
    Accept: */*
    
    {
      "city_codes": "{\"ams\":\"Amsterdam\",\"ash\":\"Ashburn\",\"ffm\":\"Frankfurt\",\"hkg\":\"Hong Kong\",\"lax\":\"Los Angeles\",\"lon\":\"London\",\"sgp\":\"Singapore\",\"stl\":\"Saint Louis\"}\n",
      "lbs": "[{\"id\":\"<id>\",\"name\":\"<name>\",\"regions\":{\"ams\":\"automatic\",\"ash\":\"automatic\",\"ffm\":\"automatic\",\"hkg\":\"automatic\",\"lax\":\"automatic\",\"lon\":\"automatic\",\"sgp\":\"automatic\",\"stl\":\"automatic\"},\"upstream_regions\":[\"ffm\",\"lax\"]}]\n"
    }
    POST /api/v4.3/conf/{config}/load-balancers/regions HTTP/1.1
    Host: 
    Content-Type: application/json
    Accept: */*
    Content-Length: 163
    
    {
      "lbs": "[{\"id\":\"<id>\",\"regions\":{\"ash\":\"ffm\",\"ffm\":\"ffm\",\"hkg\":\"ffm\",\"lax\":\"ffm\",\"lon\":\"ffm\",\"sgp\":\"ffm\",\"stl\":\"automatic\"}}]\n"
    }

    API access to traffic data

    The page below describes how to retrieve traffic data via the API. It contains these main sections:

    • Introduction

    • The filters parameter (which specifies the traffic data that will be retrieved)

    • The four API routes that retrieve traffic data, and how to use them

    Introduction

    The provides access to traffic data, via these four routes:

    • GET /api/v4.0/data/topx

    • GET /api/v4.0/data/stats

    • GET /api/v4.0/data/timeline

    • GET /api/v4.0/data/logs

    Each includes an input parameter named filters. This parameter specifies the traffic data that will be retrieved.

    Below, we begin by discussing this parameter's usage, syntax, and construction. Then we discuss the four API routes that require it, and the different types of data they return.

    The filters parameter

    filters is a string that specifies one or more conditions. A database query is constructed from those conditions, and the results are returned to the user.

    Usage of the filters parameter depends on the context:

    • When using Swagger UI, this value is supplied directly in the filters input field.

    • When using curl to call the Link11 WAAP API, this value is encoded into the destination URL, preceded by "filters=". See for more information.

    A short example

    Here is an example of a filters specification in JSON format:

    This will return requests which:

    • were received in a five-minute time period (from 2024-06-06 09:31:00 to 2024-06-06 09:36:00), and...

    • have a containing the string unrecognized . (In this example, the admin wanted to retrieve requests tagged with unrecognized-host-header.)

    Format

    The filters parameter can be supplied as a query string, or as JSON.

    Query string format

    This format is used in the first input field in the UI's and . For example, this query string will display all requests with a 301 response code within a certain time period:

    status=301, timestamp between 2024-06-06 09:31:00 and 2024-06-06 09:36:00

    For more information on this format, see .

    JSON format

    The JSON equivalent of the query string above is:

    (This is provided as an example only. A full discussion of JSON syntax is below.)

    Converting from query string to JSON

    The POST /api/v4.0/data/timeline/parse API route accepts query strings and returns the same query in JSON format.

    JSON structure

    The discussion below will focus on building the filters parameter in JSON format, for two reasons. First, text query strings are discussed elsewhere (in the links given above). Second, for complex queries, JSON is more powerful.

    A JSON filters parameter is structured as follows:

    The first condition: a range of dates/times

    The first condition must be included, and must be a range of dates/times. It is structured as follows:

    where $TIMESTAMP1 and $TIMESTAMP2 are timestamps: specifications of date and time.

    For timestamps, any ISO format is supported. Nevertheless, both timestamps must include year, month, and day.

    If hours, minutes, or seconds are not included in a timestamp, the time will be rendered as the beginning of the day/hour/minute, respectively. Examples: "2022-07-14" -> "2022-07-14 00:00:00", "2022-07-14 06:52" -> "2022-07-14 06:52:00", etc.

    Subsequent conditions

    After the first condition, additional conditions can be specified if desired. They are structured as follows:

    They must meet these requirements:

    • Multiple conditions are combined with a logical AND. (A logical OR is not supported, as this could potentially retrieve unexpectedly large amounts of data.)

    • When multiple conditions are provided, all are followed by commas, except for the final one.

    • The "key" line is optional; see discussion .

    Here in the documentation, spaces and carriage returns are included in JSON filter examples for clarity. In usage, they are optional.

    Also, the order of a condition's components (its field/op/key/value) does not matter.

    Field names

    Available fields include those inherent to HTTP requests, along with additional data added by L11WAAP during processing.

    • Some of the added information consists of internal IDs for the security settings that are relevant to the request.

    • Some requests will not contain all possible information. When L11WAAP blocks a request, processing usually stops immediately, and later stages in the do not occur.

    Field name
    Comments

    Key

    For some types of data, it might not be enough to specify the field, because there could be multiple parameters in the request that match it. For example, a field name of "cookies" or "headers" does not tell the system which cookie or header to inspect.

    The key field supplies this information; it is the name of the specific parameter to evaluate. If this parameter is not defined, the system will inspect all instances of the specified field (all cookies, all headers, etc.).

    Some examples are in the below.

    Values

    Values should be specified in the appropriate data type: strings as quote-delimited strings, integers as numbers, etc. Arrays of values can be supplied.

    Operators

    Operator
    Data Type
    Description

    Negative operators

    Operators can be inverted by adding not. For example, not eq means "does not equal".

    Inverting a condition

    It's possible to invert an entire condition by adding NOT, like this:

    JSON filter examples

    Retrieve PUT and POST requests:

    Retrieve requests containing a tag that matches "geo" or "location":

    Retrieve requests where certain cookies' values match a regex:

    Retrieve requests where any cookie's value matches a regex:

    Retrieve requests according to a subfield (the acl_active subfield of security_config must be greater than 11).

    Retrieve requests according to an array of subfields:

    Retrieve requests according to a combination of conditions (there is no limit on the number of conditions):

    API access to traffic data

    As noted previously, there are four API routes that use the filters parameter to retrieve traffic data:

    • GET /api/v4.0/data/topx

    • GET /api/v4.0/data/stats

    • GET /api/v4.0/data/timeline

    • GET /api/v4.0/data/logs

    Their typical uses are as follows.

    Quickly discover the most important factors in the traffic stream (e.g., the countries sending the most blocked requests, the URLs receiving the most bot traffic, etc.): use the topx route.

    Get a summary of traffic statistics (total requests, bandwidth, and latency): use the stats route.

    Get a summary of security metrics (total requests, blocked requests, status codes returned, number of human clients, activity of the origin, etc.): use the timeline route.

    Get complete data for all requests matching certain criteria (often used for drilling down into trends discovered from the other routes): use the logs route.

    Below, we discuss each route in detail.

    GET /api/v4.0/data/topx

    This route provides API access to the same available in the Dashboard. Here's an example of Top Countries in the Dashboard:

    Calling this route returns all metrics of data: all results for "top applications", all results for "top countries", all items for "top sources", and so on. They are combined into a single continuous list:

    ...where the list of $RESULTs looks something like this (incomplete) example:

    We see that in the time period specified in the filters parameter, there were three IP addresses in two countries that sent requests to a single URL.

    Some points to note:

    • The results are organized and grouped together in the list according to their label.

    • Labels are ordered alphabetically.

    • Labels can differ in their number of results.

    • The route returns the "top" results for each label (for example, results with the "ip" label show the IPs that sent the most blocked requests). When there are only a few results for a given label, all are retrieved. When there are many, only the "top" results are retrieved.

    Actual usage

    The example above is oversimplified. In actual use, the topx route:

    • Returns much more data per result, not just key and label (see the list of fields below)

    • Returns more categories than just country, ip, and url (see the discussion of the label field below)

    A detailed discussion of topx follows.

    Contents of each result

    Each result contains the fields listed below.

    The _time fields are in seconds. These are floats, but can appear at various precisions: zero decimal places, several decimal places, or scientific notation (e.g., 1.6210818451802098e-9).

    Result field name
    Type
    Comments

    Organization of results: the label and key fields

    The topx route returns results in a specific order:

    • Results are grouped together according to their label (i.e., their category).

    • Labels are ordered alphabetically (see full list below)

    • Within each label, results are ordered by num_of_blocked_requests, in descending order.

    Notice that this is unlike the UI's Dashboard Top Metrics, where some types of results have other default orders.

    The topx route returns twelve categories of results, each with its own label. The label determines the contents of the key field.

    Label
    'Key' field contains

    GET /api/v4.0/data/stats

    This route returns traffic metrics for the requested time period, broken down into shorter segments of time.

    Data structures

    The retrieved metrics are structured like this:

    ...where each $RESULTS-TIMESEGMENT-x has this structure:

    Contents of each result

    Field name

    GET /api/v4.0/data/timeline

    This route returns security metrics for the requested time period, broken down into shorter segments of time.

    Data structures

    The retrieved metrics are structured like this:

    ...where each $RESULTS-TIMESEGMENT-x has this structure:

    ...and each $STATUS-DATA-x contains the number of responses with a specific status:

    Contents of each result

    Field name

    GET /api/v4.0/data/logs

    This route returns all requests that match the filter parameters, up to the number of requests specified. The results are returned like this:

    Each $REQUEST has this structure:

    ...where the $FIELDs are the Field names listed in the filters discussion, and the $VALUEs are their values, if any. So a request looks like this:

    bot

    boolean

    branch

    string

    bytes_sent

    integer

    challenge

    boolean

    challenge_type

    string

    cf_restrict_triggers

    array

    cf_triggers

    Populated if the request triggered a Content Filter Rule. Contains keys: action, extra, name, risk_level, ruleid, section, trigger_id, trigger_name, value. All have string values, except for risk_level, which is an integer.

    challenge

    boolean

    challenge_type

    string

    cookies

    Can inspect specific cookies or all cookies. See .

    country

    string

    dr_triggers

    array

    geo_region

    string

    gf_triggers

    An array of entries, one for each Global Filter that matched the request. Each entry contains these keys: action, extra, name, section, trigger_id, trigger_name, value

    headers

    Can inspect specific headers or all headers. See .

    host

    string

    hostname

    string

    human

    boolean

    ichallenge

    boolean

    ip

    string

    logs

    array

    messages

    An array of strings, containing messages added to the event by the system. These can include

    method

    string

    monitor

    boolean: whether or not the request triggered a Monitor action.

    monitor_reasons

    array of strings; the various reasons (if any) that the request triggered Monitor actions.

    organization

    string

    path

    string. The path excluding the TLD and excluding arguments; the string begins with "/".

    path_parts

    string. Contents for mysite.com/abc/123/home.html?foo=true: "path_parts": {

    "part1": "abc",

    "part2": "123",

    "part3": "home.html",

    "path": "/abc/123/home.html"

    } To match the second part of this example: path_parts["part2"]="123" {"field": "path_parts", "key": "^part2$", "op": "eq", "value": "123"}

    port

    string

    processing_stage

    integer: the furthest stage of that was reached. 0: Initialization 2: Global Filtering 3. Flow Control 4. Global Rate Limits 5. Rate Limits 6. ACL Profile 7. Content Filtering

    profiling

    array of items containing the security settings relevant to this request. Each item contains: a name (secpol, mapping, flow, limit, acl, content_filter) and value (the internal ID of that setting).

    protocol

    string

    proxy

    array of items containing proxy-related data. Each item contains a name and value. The names are: additional_tags, bytes_sent, container, geo_as_domain, geo_as_name, geo_as_type, geo_company_country, geo_company_domain, geo_company_type, geo_lat, geo_long, geo_mobile_carrier, geo_mobile_country, geo_mobile_mcc, geo_mobile_mnc, realip, request_id, request_length, request_time, ssl_cipher, ssl_protocol, status.

    query

    string. Example: for mysite.com/page?code=117, this is ?code=117.

    rbz_latency

    integer

    rbzsessionid

    Cookie set by L11WAAP. Example query string and JSON: cookies["rbzsessionid"]="57870178706cb50db6d41aab" {"field": "cookies", "key": "^rbzsessionid$", "op": "eq", "value": "578701713f70dcd8706cb50db6d41aab"}

    reason

    string. The reason, if any, the request was blocked.

    referer

    string

    request_id

    string

    request_length

    integer

    request_time

    float

    result

    string; the disposition of the request. A way to quickly see anomalies is to search for {"field": "result", "op": "not eq", "value": "Passed"}

    rl_triggers

    array; the reasons (if any) that rate limits were triggered.

    security_config

    The configuration of security settings when this request was processed. Keys and data types are: acl_active (boolean)

    cf_active (boolean)

    cf_rules (integer)

    gf_rules (integer)

    revision (string)

    rl_rules (integer)

    secpolentryid (string)

    secpolid (string)

    session

    string

    session_ids

    array

    status

    integer

    tags

    array of strings: all the tags attached to the request

    time_period

    integer; the Epoch Unix timestamp of the request

    timestamp

    string; date and time

    trigger_counters

    The number of times an Action was triggered, and the source of the triggers (ACL Profile, Content Filtering, Global Filters, or Rate Limits). This is a collection of keys (counters) and values (integers with the value of each counter). Counter names are strings: acl, cf, cf_restrict, dr, gf, rl. Sample filter condition: {"field": "trigger_counters", "key": "acl", "value": 0, "op": "gt"}

    upstream_addr

    array of strings

    upstream_data

    array of elements: {addr (string), response_time (float), status (integer)}

    upstream_response_time

    float or null

    upstream_status

    array of integers

    url

    string

    user_agent

    string

    version

    string

    waap_id

    Cookie set by L11WAAP. Example query string and JSON: cookies["waap_id"]="Jc491eLWqTBOfDnJwNk" {"field": "cookies", "key": "^waap_id$", "op": "eq", "value": "Jc491eLWqTBOfDnJwNk"}

    in

    integer / float / string

    checks if numeric/string value is in a list of values

    regex

    string

    checks if string has a match with a regex

    between

    integer / float / timestamp

    checks if value between two numbers/ timestamps. Does not depend on order.

    first_geo_country

    string

    First entry in the list of countries

    first_organization

    string

    First entry in the list of organizations

    key

    string

    Content varies; see discussion below.

    label

    string

    Category of result. See discussion below.

    max_origin_time

    float

    The longest amount of processing time by the origin among these requests. If no requests reached the origin, this will be null.

    max_rbz_time

    float

    The longest amount of processing time by L11WAAP among these requests.

    max_total_time

    float

    The longest amount of total processing time among these requests.

    min_origin_time

    float

    The shortest amount of processing time by the origin among these requests. If no requests reached the origin, this will be null.

    min_rbz_time

    float

    The shortest amount of processing time by L11WAAP among these requests.

    min_total_time

    float

    The shortest amount of total processing time among these requests.

    num_of_blocked_requests

    integer

    num_of_bot_requests

    integer

    num_of_challenges

    integer

    num_of_human_requests

    integer

    num_of_monitored_requests

    integer

    Includes all requests that triggered a "monitor" action, even if they were blocked as well.

    num_of_requests

    integer

    sum_of_bytes_sent

    integer

    sum_of_request_length

    integer

    reason

    reason the request was monitored or blocked

    referer

    referer string

    total_time

    target URL

    url

    target URL

    user_agent

    user agent string

    waap_id

    waap_id cookie value

    Number of requests rejected by the origin

    num_of_requests

    Total requests received during the time period

    num_of_sessions

    Number of unique sessions

    sum_of_sent_bytes

    Total bytes sent

    time_period

    Beginning of time segment, as an Epoch Unix integer (e.g., 1718186400)

    timeperiod_string

    Beginning of time segment, as a string (e.g., "2024-06-12 10:00:00")

    acl_triggers

    Populated during evaluation of the active ACL Profile. Contains keys: acl_action

    action (the type of Action that was triggered)

    extra (currently unused)

    tags

    trigger_id

    trigger_name All are strings, except for tags, which is an array of strings.

    arguments

    Arguments of the request, if any. Query string and JSON examples for mysite.com/page?foo=1 :

    arguments["foo"]="1"

    {"field": "arguments", "key": "^foo$", "op": "eq", "value": "1"}

    asn

    string

    authority

    string

    biometric

    array

    blocked

    boolean

    is

    boolean

    checks if value is True or False

    eq

    integer / float / string

    checks exact match for numeric/string value

    gt/ lt

    integer / float

    checks if value is greater/less than

    gte/ lte

    integer / float

    avg_origin_time

    float

    The average amount of processing time by the origin for these requests. If no requests reached the origin, this will be null.

    avg_rbz_time

    float

    The average amount of processing time by L11WAAP for these requests.

    avg_total_time

    float

    The average total amount of processing time for these requests.

    first_asn

    string

    country

    country name

    host

    host name or IP

    ip

    IP address

    organization

    organization

    origin_time

    target URL

    rbz_time

    target URL

    avg_latency

    Average latency in seconds

    hostname

    Host

    num_of_requests

    Total requests received during the time period

    sum_of_bandwidth

    Total bytes sent and received

    time_period

    Beginning of time segment, as an Epoch Unix integer (e.g., 1718186400)

    timeperiod_string

    Beginning of time segment, as a string (e.g., "2024-06-12 10:00:00")

    array_origin_status_codes

    An array: each element contains a status code and the number of responses from the origin with that code. If no requests reached the origin during the specified time period, the array will be empty.

    array_status_codes

    An array: each element contains a status code and the number of responses from L11WAAP with that code.

    num_of_blocked_requests

    Requests that were blocked

    num_of_challenges

    Number of times L11WAAP issued a bot challenge

    num_of_human_requests

    Requests from human (i.e., non-bot) clients

    num_of_ip

    Number of IPs used by clients

    Data queries API namespace
    this explanation
    Tag
    Query Specification
    Dashboard
    Events Log
    Query filter syntax and best practices
    below
    traffic filtering process
    JSON filters examples
    Top Metrics
    above

    checks if value is greater/less than or equal

    First entry in the list of ASNs

    num_of_origin_blocked_requests

    Get Actions

    get

    Get all Actions in a configuration

    Path parameters
    configstringRequired
    Responses
    200

    Actions retrieved successfully

    application/json
    422

    Validation Error

    application/json

    Modify Actions

    put

    Update an existing set of Actions for a configuration

    Path parameters
    configstringRequired
    Bodyobject · Action[]
    descriptionstringOptional
    idstringRequired
    namestring · min: 1Required
    paramsany ofOptionalDefault: {}
    or
    objectOptional
    tagsstring[]Optional

    List of tags to apply

    Default: []
    typeall ofRequired

    Need to be one of predefined strings

    string · enumOptionalPossible values:

    Create Actions

    post

    Create complete set of Actions for a configuration

    Path parameters
    configstringRequired
    Bodyobject · Action[]
    descriptionstringOptional
    idstringRequired
    namestring · min: 1Required
    paramsany ofOptionalDefault: {}
    or
    objectOptional
    tagsstring[]Optional

    List of tags to apply

    Default: []
    typeall ofRequired

    Need to be one of predefined strings

    string · enumOptionalPossible values:

    Delete Actions

    delete

    Delete all Actions in a configuration

    Path parameters
    configstringRequired
    Responses
    200

    Actions deleted successfully

    application/json
    422

    Validation Error

    application/json

    Get single Action

    get

    Get an individual Action from the specified configuration

    Path parameters
    configstringRequired
    entry_idstringRequired
    Responses
    200

    Action retrieved successfully

    application/json
    422

    Validation Error

    application/json

    Modify a single Action

    put

    Update an individual Action within a configuration

    Path parameters
    configstringRequired
    entry_idstringRequired
    Body

    Create single Action

    post

    Create an individual Action within a configuration

    Path parameters
    configstringRequired
    entry_idstringRequired
    Body

    Delete single Action

    delete

    Delete an individual Action from the specified configuration

    Path parameters
    configstringRequired
    entry_idstringRequired
    Responses
    200

    Action deleted successfully

    application/json
    422

    Validation Error

    application/json

    Get Actions version list

    get

    Get list of versions of Actions in a configuration

    Path parameters
    configstringRequired
    Responses
    200

    Actions version list retrieved successfully

    application/json
    422

    Validation Error

    application/json

    Get version of Actions

    get

    Get a specific version of an Action

    Path parameters
    configstringRequired
    versionstringRequired
    Responses
    200

    Action version retrieved successfully

    application/json
    422

    Validation Error

    application/json

    Revert Actions to the specified version

    put

    Set a previous Actions version to be the current one

    Path parameters
    configstringRequired
    versionstringRequired
    Responses
    200

    Actions reversion was successful

    application/json
    422

    Validation Error

    application/json

    Get Content Filter Rules

    get

    Get all Content Filter Rules in a configuration

    Path parameters
    configstringRequired
    Responses
    200

    Content Filter Rules retrieved successfully

    application/json
    422

    Validation Error

    application/json

    Modify Content Filter Rules

    put

    Update an existing set of Content Filter Rules for a configuration

    Path parameters
    configstringRequired
    Bodyobject · ContentFilterRule[]
    categorystringRequired

    Category of the rule

    descriptionany ofOptionalDefault: ""
    stringOptional
    or
    nullOptional
    idstringRequired
    msgstringRequired

    Log message for this rule

    namestring · min: 1Required
    operandstring · min: 1Required

    Matching domain(s) regex

    riskinteger · min: 1 · max: 5Required

    Risk level of this rule, between 1 (lowest risk) and 5 (highest risk)

    subcategorystringRequired

    Subcategory of the rule

    tagsstring[]Optional

    List of tags to apply

    Default: []

    Create Content Filter Rules

    post

    Create a complete set of Content Filter Rules for a configuration

    Path parameters
    configstringRequired
    Bodyobject · ContentFilterRule[]
    categorystringRequired

    Category of the rule

    descriptionany ofOptionalDefault: ""
    stringOptional
    or
    nullOptional
    idstringRequired
    msgstringRequired

    Log message for this rule

    namestring · min: 1Required
    operandstring · min: 1Required

    Matching domain(s) regex

    riskinteger · min: 1 · max: 5Required

    Risk level of this rule, between 1 (lowest risk) and 5 (highest risk)

    subcategorystringRequired

    Subcategory of the rule

    tagsstring[]Optional

    List of tags to apply

    Default: []

    Delete Content Filter Rules

    delete

    Delete all Content Filter Rules in a configuration

    Path parameters
    configstringRequired
    Responses
    200

    Content Filter Rules deleted successfully

    application/json
    422

    Validation Error

    application/json

    Get single Content Filter Rule

    get

    Get a Content Filter Rule from the specified configuration

    Path parameters
    configstringRequired
    entry_idstringRequired
    Responses
    200

    Content Filter Rule retrieved successfully

    application/json
    422

    Validation Error

    application/json

    Modify a single Content Filter Rule

    put

    Update an individual Content Filter Rule within a configuration

    Path parameters
    configstringRequired
    entry_idstringRequired
    Body

    Create single Content Filter Rule

    post

    Create an individual Content Filter Rule within a configuration

    Path parameters
    configstringRequired
    entry_idstringRequired
    Body

    Delete single Content Filter Rule

    delete

    Delete an individual Content Filter Rule from the specified configuration

    Path parameters
    configstringRequired
    entry_idstringRequired
    Responses
    200

    Content Filter Rule deleted successfully

    application/json
    422

    Validation Error

    application/json

    Get Content Filter Rules version list

    get

    Get list of versions of Content Filter Rules in a configuration

    Path parameters
    configstringRequired
    Responses
    200

    Content Filter Rules version list retrieved successfully

    application/json
    422

    Validation Error

    application/json

    Get version of Content Filter Rule set

    get

    Get a specific version of a Content Filter Rule set

    Path parameters
    configstringRequired
    versionstringRequired
    Responses
    200

    Content Filter Rule set retrieved successfully

    application/json
    422

    Validation Error

    application/json

    Revert a Content Filter Rule to the specified version

    put

    Set a previous Content Filter Rule version to be the current one

    Path parameters
    configstringRequired
    versionstringRequired
    Responses
    200

    Content Filter Rule reversion was successful

    application/json
    422

    Validation Error

    application/json

    Get ACL Profiles

    get

    Get all ACL Profiles in a configuration

    Path parameters
    configstringRequired
    Responses
    200

    ACL Profiles retrieved successfully

    application/json
    422

    Validation Error

    application/json

    Modify ACL Profiles

    put

    Updates an existing set of ACL Profiles for a configuration

    Path parameters
    configstringRequired
    Bodyobject · ACLProfile[]
    actionstringOptional
    allowstring[]Optional
    allow_botstring[]Optional
    denystring[]Optional
    deny_botstring[]Optional
    descriptionstringOptional
    force_denystring[]Optional
    idstringRequired
    namestringRequired
    passthroughstring[]Optional
    tagsstring[]Optional

    Create ACL Profiles

    post

    Create a complete set of ACL Profiles for a configuration

    Path parameters
    configstringRequired
    Bodyobject · ACLProfile[]
    actionstringOptional
    allowstring[]Optional
    allow_botstring[]Optional
    denystring[]Optional
    deny_botstring[]Optional
    descriptionstringOptional
    force_denystring[]Optional
    idstringRequired
    namestringRequired
    passthroughstring[]Optional
    tagsstring[]Optional

    Delete ACL Profiles

    delete

    Delete all ACL Profiles in a configuration

    Path parameters
    configstringRequired
    Responses
    200

    ACL Profiles deleted successfully

    application/json
    422

    Validation Error

    application/json

    Get single ACL Profile

    get

    Get an individual ACL Profile (not the entire set) from the specified configuration

    Path parameters
    configstringRequired
    entry_idstringRequired
    Responses
    200

    ACL Profile retrieved successfully

    application/json
    422

    Validation Error

    application/json

    Modify a single ACL Profile

    put

    Update an individual ACL Profile within a configuration

    Path parameters
    configstringRequired
    entry_idstringRequired
    Body

    Create single ACL Profile

    post

    Create an individual ACL Profile within a configuration

    Path parameters
    configstringRequired
    entry_idstringRequired
    Body

    Delete single ACL Profile

    delete

    Delete an individual ACL Profile (not the entire set) from the specified configuration

    Path parameters
    configstringRequired
    entry_idstringRequired
    Responses
    200

    ACL Profile deleted successfully

    application/json
    422

    Validation Error

    application/json

    Get ACL Profiles version list

    get

    Get list of versions of ACL Profiles in a configuration

    Path parameters
    configstringRequired
    Responses
    200

    ACL Profiles version list retrieved successfully

    application/json
    422

    Validation Error

    application/json

    Get version of ACL Profile

    get

    Get a specific version of an ACL Profile

    Path parameters
    configstringRequired
    versionstringRequired
    Responses
    200

    ACL Profile retrieved successfully

    application/json
    422

    Validation Error

    application/json

    Revert an ACL Profile to the specified version

    put

    Set a previous ACL Profile version to be the current one

    Path parameters
    configstringRequired
    versionstringRequired
    Responses
    200

    ACL Profile reversion was successful

    application/json
    422

    Validation Error

    application/json

    Get traffic data from logs

    get

    Retrieve traffic data using 'filters' parameter, explained at https://gb.docs.reblaze.com/reference-information/api/api-access-to-traffic-data

    Query parameters
    limitinteger · min: 1 · max: 2500OptionalDefault: 100
    offsetintegerOptionalDefault: 0
    filtersstringOptional

    Filters for request in format selected below (JSON or query string)

    Example: {"AND":[{"field":"timestamp","op":"between","value":["2024-06-06 09:31:00","2024-06-06 09:36:00"]},{"field":"status","op":"eq","value":301}]}
    debugbooleanOptional

    if set to true the request will return rendered SQL without running it, for debug purposes

    Example: true | false
    parameters
    Header parameters
    providerstring · enumOptional

    Database to get data from

    Example: bigqueryPossible values:
    syntaxstringOptional

    syntax of query

    Example: json
    parameters
    /api/v4.0/data/logs

    Get quarantined list

    get

    Get quarantined list

    Query parameters
    configstringOptional
    idsstring[]Optional
    rule_idsstring[]Optional
    Header parameters
    providerstring · enumRequired

    Database to get data from

    Example: mongodbPossible values:
    syntaxstring · enumRequired

    Syntax of query

    Example: string_queryPossible values:

    Delete record(s) from quarantined list

    delete

    Delete record(s) from quarantined list

    Header parameters
    providerstring · enumRequired

    Database to get data from

    Example: mongodbPossible values:
    syntaxstring · enumRequired

    Syntax of query

    Example: jsonPossible values:
    Body

    Get traffic stats

    get

    Get stats (time_period, counter, hostname, bandwidth, latency) using 'filters' parameter, explained at https://gb.docs.reblaze.com/reference-information/api/api-access-to-traffic-data

    Query parameters
    filtersstringOptional

    Filters for request in format selected below (JSON or query string)

    Example: {"AND":[{"field":"timestamp","op":"between","value":["2024-06-06 09:31:00","2024-06-06 09:36:00"]},{"field":"status","op":"eq","value":301}]}
    debugbooleanOptional

    if set to true the request will return rendered SQL without running it, for debug purposes

    Example: true | false
    parameters
    Header parameters
    providerstring · enumOptional

    Database to get data from

    Example: bigqueryPossible values:
    parameters
    /api/v4.0/data/stats

    Get traffic timeline

    get

    Get timeline (time_period, sessions, remote_addr, all_hits, blocked, origin_blocked, challenge, is_human, statuses stats, origin statuses stats, bytes_sent) using 'filters' parameter, explained at https://gb.docs.reblaze.com/reference-information/api/api-access-to-traffic-data

    Query parameters
    filtersstringOptional

    Filters for request in format selected below (JSON or query string)

    Example: {"AND":[{"field":"timestamp","op":"between","value":["2024-06-06 09:31:00","2024-06-06 09:36:00"]},{"field":"status","op":"eq","value":301}]}
    debugbooleanOptional

    if set to true the request will return rendered SQL without running it, for debug purposes

    Example: true | false
    parameters
    Header parameters
    providerstring · enumOptional

    Database to get data from

    Example: bigqueryPossible values:
    syntaxstringOptional

    syntax of query

    Example: json
    parameters
    /api/v4.0/data/timeline

    Convert 'filters' query string to JSON

    post

    Convert a query string (as used in the UI Dashboard and Events Log) into JSON format.

    Body
    queryone ofRequired
    stringOptional
    or
    objectOptional
    Responses
    200

    Filter string has been converted successfully

    application/json
    Responseobject
    4XX

    Misconfigured request

    application/json

    Get "top" traffic data

    get

    Get topx stats using 'filters' parameter, explained at https://gb.docs.reblaze.com/reference-information/api/api-access-to-traffic-data

    Query parameters
    filtersstringOptional

    Filters for request in format selected below (JSON or query string)

    Example: {"AND":[{"field":"timestamp","op":"between","value":["2024-06-06 09:31:00","2024-06-06 09:36:00"]},{"field":"status","op":"eq","value":301}]}
    debugbooleanOptional

    if set to true the request will return rendered SQL without running it, for debug purposes

    Example: true | false
    parameters
    Header parameters
    providerstring · enumOptional

    Database to get data from

    Example: bigqueryPossible values:
    parameters
    /api/v4.0/data/topx

    Modify Content Filter Profiles

    put

    Update an existing set of Content Filter Profiles for a configuration

    Path parameters
    configstringRequired
    Bodyobject · ContentFilterProfile[]

    Modify a single Content Filter Profile

    put

    Update an individual Content Filter Profile within a configuration

    Path parameters
    configstringRequired
    entry_idstringRequired
    Body

    Create single Content Filter Profile

    post

    Create an individual Content Filter Profile within a configuration

    Path parameters
    configstringRequired
    entry_idstringRequired
    Body

    Delete single Content Filter Profile

    delete

    Delete an individual Content Filter Profile from the specified configuration

    Path parameters
    configstringRequired
    entry_idstringRequired
    Responses
    200

    Content Filter Profile deleted successfully

    application/json
    422

    Validation Error

    application/json

    Get version of Content Filter Profile

    get

    Get a specific version of a Content Filter Profile

    Path parameters
    configstringRequired
    versionstringRequired
    Responses
    200

    Content Filter Profile retrieved successfully

    application/json
    422

    Validation Error

    application/json

    Get Configurations

    get

    Get detailed list of existing configurations

    Responses
    200

    List of configurations was retrieved successfully

    application/json
    get
    /api/v4.0/conf/configs

    Get a Configuration

    get

    Retrieve a complete configuration

    Path parameters
    configstringRequired
    Responses
    200

    Configuration retrieved successfully

    application/json
    Responseany
    422

    Validation Error

    application/json
    get
    /api/v4.0/conf/configs/{config}

    Get Versions of a Config

    get

    Get all versions of a given configuration

    Path parameters
    configstringRequired
    Responses
    200

    Config versions retrieved successfully

    application/json
    422

    Validation Error

    application/json

    Revert a Config to a Version

    put

    Set a previous version of a configuration to be the current one

    Path parameters
    configstringRequired
    versionstringRequired
    Responses
    200

    Configuration reversion was successful

    application/json
    422

    Validation Error

    application/json

    Get Global Filters

    get

    Get all Global Filters in a configuration

    Path parameters
    configstringRequired
    Responses
    200

    Global Filters retrieved successfully

    application/json

    Modify Global Filters

    put

    Update an existing set of Global Filters for a configuration

    Path parameters
    configstringRequired
    Bodyobject · GlobalFilter[]
    actionanyOptional
    activebooleanRequired
    descriptionstringOptional
    idstringRequired
    mdatestringRequired
    namestringRequired
    ruleany ofOptionalDefault: {}
    anyOptional
    or
    sourcestringRequired
    tagsstring[]Optional

    Create Global Filters

    post

    Create a complete set of Global Filters for a configuration

    Path parameters
    configstringRequired
    Bodyobject · GlobalFilter[]
    actionanyOptional
    activebooleanRequired
    descriptionstringOptional
    idstringRequired
    mdatestringRequired
    namestringRequired
    ruleany ofOptionalDefault: {}
    anyOptional
    or
    sourcestringRequired
    tagsstring[]Optional

    Delete Global Filters

    delete

    Delete all Global Filters in a configuration

    Path parameters
    configstringRequired
    Responses
    200

    Global Filters deleted successfully

    application/json
    422

    Validation Error

    application/json

    Get specific Global Filter

    get

    Get a Global Filter from the specified configuration

    Path parameters
    configstringRequired
    entry_idstringRequired
    Responses
    200

    Global Filter retrieved successfully

    application/json
    422

    Validation Error

    application/json

    Modify a single Global Filter

    put

    Update an individual Global Filter within a configuration

    Path parameters
    configstringRequired
    entry_idstringRequired
    Body

    Create single Global Filter

    post

    Create an individual Global Filter within a configuration

    Path parameters
    configstringRequired
    entry_idstringRequired
    Body

    Delete single Global Filter

    delete

    Delete an individual Global Filter from the specified configuration

    Path parameters
    configstringRequired
    entry_idstringRequired
    Responses
    200

    Global Filter deleted successfully

    application/json
    422

    Validation Error

    application/json

    Get Global Filters version list

    get

    Get list of versions of Global Filters in a configuration

    Path parameters
    configstringRequired
    Responses
    200

    Global Filters version list retrieved successfully

    application/json
    422

    Validation Error

    application/json

    Get version of Global Filter

    get

    Get a specific version of a Global Filter

    Path parameters
    configstringRequired
    versionstringRequired
    Responses
    200

    Global Filter retrieved successfully

    application/json
    422

    Validation Error

    application/json

    Revert a Global Filter to the specified version

    put

    Set a previous Global Filter version to be the current one

    Path parameters
    configstringRequired
    versionstringRequired
    Responses
    200

    Global Filter reversion was successful

    application/json
    422

    Validation Error

    application/json

    Get Edge Functions

    get

    Get all Edge Functions in a configuration

    Path parameters
    configstringRequired
    Responses
    200

    Edge Functions retrieved successfully

    application/json

    Modify Edge Functions

    put

    Update an existing set of Edge Functions for a configuration

    Path parameters
    configstringRequired
    Bodyobject · EdgeFunction[]
    codestringRequired

    Edge Function Code

    descriptionany ofOptionalDefault: ""
    stringOptional
    idstringRequired

    Unique id

    Pattern: ^[A-Za-z0-9_]*$
    namestringRequired
    phasestring · enumRequiredPossible values:

    Create Edge Functions

    post

    Create a complete set of Edge Functions for a configuration

    Path parameters
    configstringRequired
    Bodyobject · EdgeFunction[]
    codestringRequired

    Edge Function Code

    descriptionany ofOptionalDefault: ""
    stringOptional
    idstringRequired

    Unique id

    Pattern: ^[A-Za-z0-9_]*$
    namestringRequired
    phasestring · enumRequiredPossible values:

    Delete Edge Functions

    delete

    Delete all Edge Functions in a configuration

    Path parameters
    configstringRequired
    Responses
    200

    Edge Functions deleted successfully

    application/json
    422

    Validation Error

    application/json

    Get specific Edge Function

    get

    Get an Edge Function from the specified configuration

    Path parameters
    configstringRequired
    entry_idstringRequired
    Responses
    200

    Edge Function retrieved successfully

    application/json
    422

    Validation Error

    application/json

    Modify a single Edge Function

    put

    Update an individual Edge Function within a configuration

    Path parameters
    configstringRequired
    entry_idstringRequired
    Body

    Create single Edge Function

    post

    Create an individual Edge Function within a configuration

    Path parameters
    configstringRequired
    entry_idstringRequired
    Body

    Delete single Edge Function

    delete

    Delete an individual Edge Function from the specified configuration

    Path parameters
    configstringRequired
    entry_idstringRequired
    Responses
    200

    Edge Function deleted successfully

    application/json
    422

    Validation Error

    application/json

    Get Edge Functions version list

    get

    Get list of versions of Edge Functions in a configuration

    Path parameters
    configstringRequired
    Responses
    200

    Edge Functions version list retrieved successfully

    application/json
    422

    Validation Error

    application/json

    Get version of Edge Function

    get

    Get a specific version of an Edge Function

    Path parameters
    configstringRequired
    versionstringRequired
    Responses
    200

    Edge Function retrieved successfully

    application/json
    422

    Validation Error

    application/json

    Revert an Edge Function to the specified version

    put

    Set a previous Edge Function version to be the current one

    Path parameters
    configstringRequired
    versionstringRequired
    Responses
    200

    Edge Function reversion was successful

    application/json
    422

    Validation Error

    application/json
    {
      "AND": [
        {
          "field": "timestamp",
          "op": "between",
          "value": [
            "2024-06-06 09:31:00",
            "2024-06-06 09:36:00"
          ]
        },
        {
          "field": "tags",
          "op": "regex",
          "value": "unrecognized"
        }
      ]
    }
    {
      "AND": [
        {
          "field": "timestamp",
          "op": "between",
          "value": [
            "2024-06-06 09:31:00",
            "2024-06-06 09:36:00"
          ]
        },
        {
          "field": "status",
          "op": "eq",
          "value": 301
        }
      ]
    }
    {
      "AND": [
        $CONDITION1,
        $CONDITION2,
        ...
        $CONDITIONn
      ]
    }
    {
      "field": "timestamp",
      "op": "between",
      "value": [
        "$TIMESTAMP1",
        "$TIMESTAMP2"
      ]
    }
    {
      "field": "$FIELD_NAME",
      "op": "$OPERATOR",
      "key": "$KEY",
      "value": $VALUE
    }
    {
      "NOT": {
        "field": "$FIELD_NAME",
        "op": "$OPERATOR",
        "key": "$KEY",
        "value": $VALUE
      }
    }
    {
        "AND": [
            {"field": "timestamp", "op": "between", "value": ["2022-07-14 06:52:37", "2022-07-12 06:52:37"]},
            {"field": "method", "value":"^P.*T$", "op":"regex"}
        ]
    }
    {
        "AND": [
            {"field": "timestamp", "value": ["2022-07-14 06:52:37", "2022-07-12 06:52:37"], "op": "between"},
            {"field": "tags", "value": ["geo", "location"], "op": "in"}
        ]
    }
    {
        "AND": [
            {"field": "timestamp", "value": ["2022-07-14 06:52:37", "2022-07-12 06:52:37"], "op": "between"},
            {"field": "cookies", "key": "analytics_.*", "value": "gcp_.*", "op": "regex"}
        ]
    }
    {
        "AND": [
            {"field": "timestamp", "value": ["2022-07-14 06:52:37", "2022-07-12 06:52:37"], "op": "between"},
            {"field": "cookies", "value": "gcp_.*", "op": "regex"}
        ]
    }
    {
        "AND": [
            {"field": "timestamp", "value": ["2022-07-14 06:52:37", "2022-07-12 06:52:37"], "op": "between"},
            {"field": "security_config", "key": "acl_active", "value": 11, "op": "gt"}
      ]
    }
    {
        "AND": [
            {"field": "timestamp", "value": ["2022-07-14 06:52:37", "2022-07-12 06:52:37"], "op": "between"},
            {
                "field": "cf_triggers",
                "conditions": [
                    {"field": "risk_level", "value": 2, "op": "gt"},
                    {"field": "ruleid", "value": "100037", "op": "eq"}
                ]
            }
        ]
    }
    {
        "AND": [
            {"field": "timestamp", "value": ["2022-08-08 01:15:25", "2022-08-08 01:52:28"], "op": "between"},
            {"field": "tags", "value":"geo-continent-name:north-america", "op": "eq"},
            {"field": "agent", "key": "ephemeral_id", "value": "029ab6f-6d15-4290-b44f-9133", "op": "regex"},
            {"field": "trigger_counters", "key": "acl","value": 2,"op": "not gt"},
            {"field": "headers", "key": "x-forwarded.*", "value": "3.65.14.177", "op": "regex"},
            {"field": "path_parts", "key": "^part3$", "value": "^-1&", "op": "regex"},
            {"field": "security_config", "key": "cf_active", "value": true, "op": "not eq"},
            {"field": "ip", "value": ["2.55.96.231", "23.65.14.177", "3.1.92.15", "8.206.254.196"], "op": "in"}
        ]
    }
    {
      "data": {
        "results": [
            $RESULT1,
            $RESULT2,
            $RESULT3,
            ...
            $RESULTn
        ],
        "statistics": {
          "bytes_billed": null,
          "bytes_processed": null,
          "elapsed_ms": 0
        }
      },
      "status": 200
    }
    "results": [
      {
        "key": "China",
        "label": "country"
      },
      {
        "key": "United States",
        "label": "country"
      },
      {
        "key": "161.1.50.2",
        "label": "ip"
      },
      {
        "key": "101.6.123.53",
        "label": "ip"
      },
      {
        "key": "161.1.50.5",
        "label": "ip"
      },
      {
        "key": "mysite.com/login",
        "label": "url"
      }
    ]
    
    {
      "data": {
        "results": [
          $RESULTS-TIMESEGMENT-1,
          $RESULTS-TIMESEGMENT-2,
          ...
          $RESULTS-TIMESEGMENT-n
        ],
        "statistics": {
          "bytes_billed": null,
          "bytes_processed": null,
          "elapsed_ms": 0
        }
      },
      "status": 200
    }
    {
       "avg_latency": float,
       "hostname": string,
       "num_of_requests": integer,
       "sum_of_bandwidth": integer,
       "time_period": integer,
       "timeperiod_string": string
    }
    
    {
      "data": {
        "results": [
          $RESULTS-TIMESEGMENT-1,
          $RESULTS-TIMESEGMENT-2,
          ...
          $RESULTS-TIMESEGMENT-n
        ],
        "statistics": {
          "bytes_billed": null,
          "bytes_processed": null,
          "elapsed_ms": 0
        }
      },
      "status": 200
    }
    {
      "array_origin_status_codes": [
        $STATUS-DATA-ORIGIN1,
        $STATUS-DATA-ORIGIN2,
        ...
        $STATUS-DATA-ORIGINn,    
      ],
      "array_status_codes": [
        $STATUS-DATA-L11WAAP1,
        $STATUS-DATA-L11WAAP2,
        ...
        $STATUS-DATA-L11WAAPn,    
      ],
      "num_of_blocked_requests": integer,
      "num_of_challenges": integer,
      "num_of_human_requests": integer,
      "num_of_ip": integer,
      "num_of_origin_blocked_requests": integer,
      "num_of_requests": integer,
      "num_of_sessions": integer,
      "sum_of_sent_bytes": integer,
      "time_period": integer,
      "timeperiod_string": string 
    }
    {
      "num_of_requests": integer,
      "status": integer [an HTTP status code]
    }
    {
      "data": {
        "results": [
          {
                $REQUEST1
          },
          {
                $REQUEST2
          }, 
          {
                $REQUEST3
          },           
          ...
          {
                $REQUESTn
          }
        ],
        "statistics": {
          "bytes_billed": null,
          "bytes_processed": null,
          "elapsed_ms": 0
        }
      },
      "status": 200
    }
    $FIELD1: $VALUE1,
    $FIELD2: $VALUE2,
    ...
    $FIELDn: $VALUEn
    "acl_triggers": [],
    "arguments": {},
    "asn": "AS4837",
    ...
    "user_agent": "curl/7.74.0",
    "version": null
    JSON filter examples
    JSON filter examples
    messages injected into events by Edge Functions.
    traffic filtering
    get
    /api/v4.0/conf/{config}/actions
    Responses
    200

    Actions updated successfully

    application/json
    422

    Validation Error

    application/json
    put
    /api/v4.0/conf/{config}/actions
    Responses
    201

    Actions created successfully

    application/json
    422

    Validation Error

    application/json
    post
    /api/v4.0/conf/{config}/actions
    delete
    /api/v4.0/conf/{config}/actions
    get
    /api/v4.0/conf/{config}/actions/{entry_id}
    descriptionstringOptional
    idstringRequired
    namestring · min: 1Required
    paramsany ofOptionalDefault: {}
    or
    objectOptional
    tagsstring[]Optional

    List of tags to apply

    Default: []
    typeall ofRequired

    Need to be one of predefined strings

    string · enumOptionalPossible values:
    Responses
    200

    Action updated successfully

    application/json
    422

    Validation Error

    application/json
    put
    /api/v4.0/conf/{config}/actions/{entry_id}
    descriptionstringOptional
    idstringRequired
    namestring · min: 1Required
    paramsany ofOptionalDefault: {}
    or
    objectOptional
    tagsstring[]Optional

    List of tags to apply

    Default: []
    typeall ofRequired

    Need to be one of predefined strings

    string · enumOptionalPossible values:
    Responses
    200

    Action created successfully

    application/json
    422

    Validation Error

    application/json
    post
    /api/v4.0/conf/{config}/actions/{entry_id}
    delete
    /api/v4.0/conf/{config}/actions/{entry_id}
    get
    /api/v4.0/conf/{config}/actions/versions
    get
    /api/v4.0/conf/{config}/actions/versions/{version}
    put
    /api/v4.0/conf/{config}/actions/versions/{version}/revert
    get
    /api/v4.0/conf/{config}/content-filter-rules
    Responses
    200

    Content Filter Rules updated successfully

    application/json
    422

    Validation Error

    application/json
    put
    /api/v4.0/conf/{config}/content-filter-rules
    Responses
    201

    Content Filter Rules created successfully

    application/json
    422

    Validation Error

    application/json
    post
    /api/v4.0/conf/{config}/content-filter-rules
    delete
    /api/v4.0/conf/{config}/content-filter-rules
    get
    /api/v4.0/conf/{config}/content-filter-rules/{entry_id}
    categorystringRequired

    Category of the rule

    descriptionany ofOptionalDefault: ""
    stringOptional
    or
    nullOptional
    idstringRequired
    msgstringRequired

    Log message for this rule

    namestring · min: 1Required
    operandstring · min: 1Required

    Matching domain(s) regex

    riskinteger · min: 1 · max: 5Required

    Risk level of this rule, between 1 (lowest risk) and 5 (highest risk)

    subcategorystringRequired

    Subcategory of the rule

    tagsstring[]Optional

    List of tags to apply

    Default: []
    Responses
    200

    Content Filter Rule updated successfully

    application/json
    422

    Validation Error

    application/json
    put
    /api/v4.0/conf/{config}/content-filter-rules/{entry_id}
    categorystringRequired

    Category of the rule

    descriptionany ofOptionalDefault: ""
    stringOptional
    or
    nullOptional
    idstringRequired
    msgstringRequired

    Log message for this rule

    namestring · min: 1Required
    operandstring · min: 1Required

    Matching domain(s) regex

    riskinteger · min: 1 · max: 5Required

    Risk level of this rule, between 1 (lowest risk) and 5 (highest risk)

    subcategorystringRequired

    Subcategory of the rule

    tagsstring[]Optional

    List of tags to apply

    Default: []
    Responses
    201

    Content Filter Rule created successfully

    application/json
    422

    Validation Error

    application/json
    post
    /api/v4.0/conf/{config}/content-filter-rules/{entry_id}
    delete
    /api/v4.0/conf/{config}/content-filter-rules/{entry_id}
    get
    /api/v4.0/conf/{config}/content-filter-rules/versions
    get
    /api/v4.0/conf/{config}/content-filter-rules/versions/{version}
    put
    /api/v4.0/conf/{config}/content-filter-rules/versions/{version}/revert
    get
    /api/v4.0/conf/{config}/acl-profiles
    Responses
    200

    ACL Profiles updated successfully

    application/json
    422

    Validation Error

    application/json
    put
    /api/v4.0/conf/{config}/acl-profiles
    Responses
    201

    ACL Profiles created successfully

    application/json
    422

    Validation Error

    application/json
    post
    /api/v4.0/conf/{config}/acl-profiles
    delete
    /api/v4.0/conf/{config}/acl-profiles
    get
    /api/v4.0/conf/{config}/acl-profiles/{entry_id}
    actionstringOptional
    allowstring[]Optional
    allow_botstring[]Optional
    denystring[]Optional
    deny_botstring[]Optional
    descriptionstringOptional
    force_denystring[]Optional
    idstringRequired
    namestringRequired
    passthroughstring[]Optional
    tagsstring[]Optional
    Responses
    200

    ACL Profile updated successfully

    application/json
    422

    Validation Error

    application/json
    put
    /api/v4.0/conf/{config}/acl-profiles/{entry_id}
    actionstringOptional
    allowstring[]Optional
    allow_botstring[]Optional
    denystring[]Optional
    deny_botstring[]Optional
    descriptionstringOptional
    force_denystring[]Optional
    idstringRequired
    namestringRequired
    passthroughstring[]Optional
    tagsstring[]Optional
    Responses
    201

    ACL Profile created successfully

    application/json
    422

    Validation Error

    application/json
    post
    /api/v4.0/conf/{config}/acl-profiles/{entry_id}
    delete
    /api/v4.0/conf/{config}/acl-profiles/{entry_id}
    get
    /api/v4.0/conf/{config}/acl-profiles/versions
    get
    /api/v4.0/conf/{config}/acl-profiles/versions/{version}
    put
    /api/v4.0/conf/{config}/acl-profiles/versions/{version}/revert
    get
    /api/v4.0/conf/{config}/global-filters
    200

    Global Filters retrieved successfully

    Responses
    200

    Global Filters updated successfully

    application/json
    422

    Validation Error

    application/json
    put
    /api/v4.0/conf/{config}/global-filters
    Responses
    201

    Global Filters created successfully

    application/json
    422

    Validation Error

    application/json
    post
    /api/v4.0/conf/{config}/global-filters
    delete
    /api/v4.0/conf/{config}/global-filters
    get
    /api/v4.0/conf/{config}/global-filters/{entry_id}
    actionanyOptional
    activebooleanRequired
    descriptionstringOptional
    idstringRequired
    mdatestringRequired
    namestringRequired
    ruleany ofOptionalDefault: {}
    anyOptional
    or
    sourcestringRequired
    tagsstring[]Optional
    Responses
    200

    Global Filter updated successfully

    application/json
    422

    Validation Error

    application/json
    put
    /api/v4.0/conf/{config}/global-filters/{entry_id}
    actionanyOptional
    activebooleanRequired
    descriptionstringOptional
    idstringRequired
    mdatestringRequired
    namestringRequired
    ruleany ofOptionalDefault: {}
    anyOptional
    or
    sourcestringRequired
    tagsstring[]Optional
    Responses
    201

    Global Filter created successfully

    application/json
    422

    Validation Error

    application/json
    post
    /api/v4.0/conf/{config}/global-filters/{entry_id}
    delete
    /api/v4.0/conf/{config}/global-filters/{entry_id}
    get
    /api/v4.0/conf/{config}/global-filters/versions
    get
    /api/v4.0/conf/{config}/global-filters/versions/{version}
    put
    /api/v4.0/conf/{config}/global-filters/versions/{version}/revert
    get
    /api/v4.0/conf/{config}/edge-functions
    200

    Edge Functions retrieved successfully

    Responses
    200

    Edge Functions updated successfully

    application/json
    422

    Validation Error

    application/json
    put
    /api/v4.0/conf/{config}/edge-functions
    Responses
    201

    Edge Functions created successfully

    application/json
    422

    Validation Error

    application/json
    post
    /api/v4.0/conf/{config}/edge-functions
    delete
    /api/v4.0/conf/{config}/edge-functions
    get
    /api/v4.0/conf/{config}/edge-functions/{entry_id}
    codestringRequired

    Edge Function Code

    descriptionany ofOptionalDefault: ""
    stringOptional
    idstringRequired

    Unique id

    Pattern: ^[A-Za-z0-9_]*$
    namestringRequired
    phasestring · enumRequiredPossible values:
    Responses
    200

    Edge Function updated successfully

    application/json
    422

    Validation Error

    application/json
    put
    /api/v4.0/conf/{config}/edge-functions/{entry_id}
    codestringRequired

    Edge Function Code

    descriptionany ofOptionalDefault: ""
    stringOptional
    idstringRequired

    Unique id

    Pattern: ^[A-Za-z0-9_]*$
    namestringRequired
    phasestring · enumRequiredPossible values:
    Responses
    201

    Edge Function created successfully

    application/json
    422

    Validation Error

    application/json
    post
    /api/v4.0/conf/{config}/edge-functions/{entry_id}
    delete
    /api/v4.0/conf/{config}/edge-functions/{entry_id}
    get
    /api/v4.0/conf/{config}/edge-functions/versions
    get
    /api/v4.0/conf/{config}/edge-functions/versions/{version}
    put
    /api/v4.0/conf/{config}/edge-functions/versions/{version}/revert
    200

    List of configurations was retrieved successfully

    No content

    get
    /api/v4.0/conf/configs/{config}/versions
    put
    /api/v4.0/conf/configs/{config}/versions/{version}/revert
    GET /api/v4.0/conf/{config}/actions HTTP/1.1
    Host: 
    Accept: */*
    
    {
      "total": 1,
      "items": [
        {
          "description": "text",
          "id": "text",
          "name": "text",
          "params": {
            "content": "",
            "headers": {
              "ANY_ADDITIONAL_PROPERTY": "text"
            },
            "status": 1
          },
          "tags": [
            "text"
          ],
          "type": "skip"
        }
      ]
    }
    PUT /api/v4.0/conf/{config}/actions HTTP/1.1
    Host: 
    Content-Type: application/json
    Accept: */*
    Content-Length: 160
    
    [
      {
        "description": "text",
        "id": "text",
        "name": "text",
        "params": {
          "content": "",
          "headers": {
            "ANY_ADDITIONAL_PROPERTY": "text"
          },
          "status": 1
        },
        "tags": [
          "text"
        ],
        "type": "skip"
      }
    ]
    {
      "message": "Successfully updated entry"
    }
    POST /api/v4.0/conf/{config}/actions HTTP/1.1
    Host: 
    Content-Type: application/json
    Accept: */*
    Content-Length: 160
    
    [
      {
        "description": "text",
        "id": "text",
        "name": "text",
        "params": {
          "content": "",
          "headers": {
            "ANY_ADDITIONAL_PROPERTY": "text"
          },
          "status": 1
        },
        "tags": [
          "text"
        ],
        "type": "skip"
      }
    ]
    {
      "message": "Successfully created entry"
    }
    DELETE /api/v4.0/conf/{config}/actions HTTP/1.1
    Host: 
    Accept: */*
    
    {
      "message": "Successfully deleted entry"
    }
    GET /api/v4.0/conf/{config}/actions/{entry_id} HTTP/1.1
    Host: 
    Accept: */*
    
    {
      "description": "text",
      "id": "text",
      "name": "text",
      "params": {
        "content": "",
        "headers": {
          "ANY_ADDITIONAL_PROPERTY": "text"
        },
        "status": 1
      },
      "tags": [
        "text"
      ],
      "type": "skip"
    }
    PUT /api/v4.0/conf/{config}/actions/{entry_id} HTTP/1.1
    Host: 
    Content-Type: application/json
    Accept: */*
    Content-Length: 158
    
    {
      "description": "text",
      "id": "text",
      "name": "text",
      "params": {
        "content": "",
        "headers": {
          "ANY_ADDITIONAL_PROPERTY": "text"
        },
        "status": 1
      },
      "tags": [
        "text"
      ],
      "type": "skip"
    }
    {
      "message": "Successfully updated entry"
    }
    POST /api/v4.0/conf/{config}/actions/{entry_id} HTTP/1.1
    Host: 
    Content-Type: application/json
    Accept: */*
    Content-Length: 158
    
    {
      "description": "text",
      "id": "text",
      "name": "text",
      "params": {
        "content": "",
        "headers": {
          "ANY_ADDITIONAL_PROPERTY": "text"
        },
        "status": 1
      },
      "tags": [
        "text"
      ],
      "type": "skip"
    }
    {
      "message": "Successfully created entry"
    }
    DELETE /api/v4.0/conf/{config}/actions/{entry_id} HTTP/1.1
    Host: 
    Accept: */*
    
    {
      "message": "Successfully deleted entry"
    }
    GET /api/v4.0/conf/{config}/actions/versions HTTP/1.1
    Host: 
    Accept: */*
    
    {
      "total": 1,
      "items": [
        {
          "author": "text",
          "email": "[email protected]",
          "message": "text",
          "date": "2025-12-15T13:59:37.020Z",
          "version": "42bcc1282349db1e5791484c3d69420b1d8a8bc1",
          "parents": [
            "f44073242093228b45bff7eb7a065559fa9b46aa"
          ]
        }
      ]
    }
    GET /api/v4.0/conf/{config}/actions/versions/{version} HTTP/1.1
    Host: 
    Accept: */*
    
    {
      "total": 1,
      "items": [
        {
          "description": "text",
          "id": "text",
          "name": "text",
          "params": {
            "content": "",
            "headers": {
              "ANY_ADDITIONAL_PROPERTY": "text"
            },
            "status": 1
          },
          "tags": [
            "text"
          ],
          "type": "skip"
        }
      ]
    }
    PUT /api/v4.0/conf/{config}/actions/versions/{version}/revert HTTP/1.1
    Host: 
    Accept: */*
    
    {
      "message": "Successfully updated entry"
    }
    GET /api/v4.0/conf/{config}/content-filter-rules HTTP/1.1
    Host: 
    Accept: */*
    
    {
      "total": 1,
      "items": [
        {
          "category": "text",
          "description": "",
          "id": "text",
          "msg": "text",
          "name": "text",
          "operand": "text",
          "risk": 1,
          "subcategory": "text",
          "tags": [
            "text"
          ]
        }
      ]
    }
    PUT /api/v4.0/conf/{config}/content-filter-rules HTTP/1.1
    Host: 
    Content-Type: application/json
    Accept: */*
    Content-Length: 140
    
    [
      {
        "category": "text",
        "description": "",
        "id": "text",
        "msg": "text",
        "name": "text",
        "operand": "text",
        "risk": 1,
        "subcategory": "text",
        "tags": [
          "text"
        ]
      }
    ]
    {
      "message": "Successfully updated entry"
    }
    POST /api/v4.0/conf/{config}/content-filter-rules HTTP/1.1
    Host: 
    Content-Type: application/json
    Accept: */*
    Content-Length: 140
    
    [
      {
        "category": "text",
        "description": "",
        "id": "text",
        "msg": "text",
        "name": "text",
        "operand": "text",
        "risk": 1,
        "subcategory": "text",
        "tags": [
          "text"
        ]
      }
    ]
    {
      "message": "Successfully created entry"
    }
    DELETE /api/v4.0/conf/{config}/content-filter-rules HTTP/1.1
    Host: 
    Accept: */*
    
    {
      "message": "Successfully deleted entry"
    }
    GET /api/v4.0/conf/{config}/content-filter-rules/{entry_id} HTTP/1.1
    Host: 
    Accept: */*
    
    {
      "category": "text",
      "description": "",
      "id": "text",
      "msg": "text",
      "name": "text",
      "operand": "text",
      "risk": 1,
      "subcategory": "text",
      "tags": [
        "text"
      ]
    }
    PUT /api/v4.0/conf/{config}/content-filter-rules/{entry_id} HTTP/1.1
    Host: 
    Content-Type: application/json
    Accept: */*
    Content-Length: 138
    
    {
      "category": "text",
      "description": "",
      "id": "text",
      "msg": "text",
      "name": "text",
      "operand": "text",
      "risk": 1,
      "subcategory": "text",
      "tags": [
        "text"
      ]
    }
    {
      "message": "Successfully updated entry"
    }
    POST /api/v4.0/conf/{config}/content-filter-rules/{entry_id} HTTP/1.1
    Host: 
    Content-Type: application/json
    Accept: */*
    Content-Length: 138
    
    {
      "category": "text",
      "description": "",
      "id": "text",
      "msg": "text",
      "name": "text",
      "operand": "text",
      "risk": 1,
      "subcategory": "text",
      "tags": [
        "text"
      ]
    }
    {
      "message": "Successfully created entry"
    }
    DELETE /api/v4.0/conf/{config}/content-filter-rules/{entry_id} HTTP/1.1
    Host: 
    Accept: */*
    
    {
      "message": "Successfully deleted entry"
    }
    GET /api/v4.0/conf/{config}/content-filter-rules/versions HTTP/1.1
    Host: 
    Accept: */*
    
    {
      "total": 1,
      "items": [
        {
          "author": "text",
          "email": "[email protected]",
          "message": "text",
          "date": "2025-12-15T13:59:37.020Z",
          "version": "42bcc1282349db1e5791484c3d69420b1d8a8bc1",
          "parents": [
            "f44073242093228b45bff7eb7a065559fa9b46aa"
          ]
        }
      ]
    }
    GET /api/v4.0/conf/{config}/content-filter-rules/versions/{version} HTTP/1.1
    Host: 
    Accept: */*
    
    {
      "total": 1,
      "items": [
        {
          "category": "text",
          "description": "",
          "id": "text",
          "msg": "text",
          "name": "text",
          "operand": "text",
          "risk": 1,
          "subcategory": "text",
          "tags": [
            "text"
          ]
        }
      ]
    }
    PUT /api/v4.0/conf/{config}/content-filter-rules/versions/{version}/revert HTTP/1.1
    Host: 
    Accept: */*
    
    {
      "message": "Successfully updated entry"
    }
    GET /api/v4.0/conf/{config}/acl-profiles HTTP/1.1
    Host: 
    Accept: */*
    
    {
      "total": 1,
      "items": [
        {
          "action": "text",
          "allow": [
            "text"
          ],
          "allow_bot": [
            "text"
          ],
          "deny": [
            "text"
          ],
          "deny_bot": [
            "text"
          ],
          "description": "text",
          "force_deny": [
            "text"
          ],
          "id": "text",
          "name": "text",
          "passthrough": [
            "text"
          ],
          "tags": [
            "text"
          ]
        }
      ]
    }
    PUT /api/v4.0/conf/{config}/acl-profiles HTTP/1.1
    Host: 
    Content-Type: application/json
    Accept: */*
    Content-Length: 201
    
    [
      {
        "action": "text",
        "allow": [
          "text"
        ],
        "allow_bot": [
          "text"
        ],
        "deny": [
          "text"
        ],
        "deny_bot": [
          "text"
        ],
        "description": "text",
        "force_deny": [
          "text"
        ],
        "id": "text",
        "name": "text",
        "passthrough": [
          "text"
        ],
        "tags": [
          "text"
        ]
      }
    ]
    {
      "message": "Successfully updated entry"
    }
    POST /api/v4.0/conf/{config}/acl-profiles HTTP/1.1
    Host: 
    Content-Type: application/json
    Accept: */*
    Content-Length: 201
    
    [
      {
        "action": "text",
        "allow": [
          "text"
        ],
        "allow_bot": [
          "text"
        ],
        "deny": [
          "text"
        ],
        "deny_bot": [
          "text"
        ],
        "description": "text",
        "force_deny": [
          "text"
        ],
        "id": "text",
        "name": "text",
        "passthrough": [
          "text"
        ],
        "tags": [
          "text"
        ]
      }
    ]
    {
      "message": "Successfully created entry"
    }
    DELETE /api/v4.0/conf/{config}/acl-profiles HTTP/1.1
    Host: 
    Accept: */*
    
    {
      "message": "Successfully deleted entry"
    }
    GET /api/v4.0/conf/{config}/acl-profiles/{entry_id} HTTP/1.1
    Host: 
    Accept: */*
    
    {
      "action": "text",
      "allow": [
        "text"
      ],
      "allow_bot": [
        "text"
      ],
      "deny": [
        "text"
      ],
      "deny_bot": [
        "text"
      ],
      "description": "text",
      "force_deny": [
        "text"
      ],
      "id": "text",
      "name": "text",
      "passthrough": [
        "text"
      ],
      "tags": [
        "text"
      ]
    }
    PUT /api/v4.0/conf/{config}/acl-profiles/{entry_id} HTTP/1.1
    Host: 
    Content-Type: application/json
    Accept: */*
    Content-Length: 199
    
    {
      "action": "text",
      "allow": [
        "text"
      ],
      "allow_bot": [
        "text"
      ],
      "deny": [
        "text"
      ],
      "deny_bot": [
        "text"
      ],
      "description": "text",
      "force_deny": [
        "text"
      ],
      "id": "text",
      "name": "text",
      "passthrough": [
        "text"
      ],
      "tags": [
        "text"
      ]
    }
    {
      "message": "Successfully updated entry"
    }
    POST /api/v4.0/conf/{config}/acl-profiles/{entry_id} HTTP/1.1
    Host: 
    Content-Type: application/json
    Accept: */*
    Content-Length: 199
    
    {
      "action": "text",
      "allow": [
        "text"
      ],
      "allow_bot": [
        "text"
      ],
      "deny": [
        "text"
      ],
      "deny_bot": [
        "text"
      ],
      "description": "text",
      "force_deny": [
        "text"
      ],
      "id": "text",
      "name": "text",
      "passthrough": [
        "text"
      ],
      "tags": [
        "text"
      ]
    }
    {
      "message": "Successfully created entry"
    }
    DELETE /api/v4.0/conf/{config}/acl-profiles/{entry_id} HTTP/1.1
    Host: 
    Accept: */*
    
    {
      "message": "Successfully deleted entry"
    }
    GET /api/v4.0/conf/{config}/acl-profiles/versions HTTP/1.1
    Host: 
    Accept: */*
    
    {
      "total": 1,
      "items": [
        {
          "author": "text",
          "email": "[email protected]",
          "message": "text",
          "date": "2025-12-15T13:59:37.020Z",
          "version": "42bcc1282349db1e5791484c3d69420b1d8a8bc1",
          "parents": [
            "f44073242093228b45bff7eb7a065559fa9b46aa"
          ]
        }
      ]
    }
    GET /api/v4.0/conf/{config}/acl-profiles/versions/{version} HTTP/1.1
    Host: 
    Accept: */*
    
    {
      "total": 1,
      "items": [
        {
          "action": "text",
          "allow": [
            "text"
          ],
          "allow_bot": [
            "text"
          ],
          "deny": [
            "text"
          ],
          "deny_bot": [
            "text"
          ],
          "description": "text",
          "force_deny": [
            "text"
          ],
          "id": "text",
          "name": "text",
          "passthrough": [
            "text"
          ],
          "tags": [
            "text"
          ]
        }
      ]
    }
    PUT /api/v4.0/conf/{config}/acl-profiles/versions/{version}/revert HTTP/1.1
    Host: 
    Accept: */*
    
    {
      "message": "Successfully updated entry"
    }
    GET /api/v4.0/conf/{config}/global-filters HTTP/1.1
    Host: 
    Accept: */*
    
    {
      "total": 1,
      "items": [
        {
          "action": null,
          "active": true,
          "description": "text",
          "id": "text",
          "mdate": "text",
          "name": "text",
          "rule": null,
          "source": "text",
          "tags": [
            "text"
          ]
        }
      ]
    }
    PUT /api/v4.0/conf/{config}/global-filters HTTP/1.1
    Host: 
    Content-Type: application/json
    Accept: */*
    Content-Length: 137
    
    [
      {
        "action": null,
        "active": true,
        "description": "text",
        "id": "text",
        "mdate": "text",
        "name": "text",
        "rule": null,
        "source": "text",
        "tags": [
          "text"
        ]
      }
    ]
    {
      "message": "Successfully updated entry"
    }
    POST /api/v4.0/conf/{config}/global-filters HTTP/1.1
    Host: 
    Content-Type: application/json
    Accept: */*
    Content-Length: 137
    
    [
      {
        "action": null,
        "active": true,
        "description": "text",
        "id": "text",
        "mdate": "text",
        "name": "text",
        "rule": null,
        "source": "text",
        "tags": [
          "text"
        ]
      }
    ]
    {
      "message": "Successfully created entry"
    }
    DELETE /api/v4.0/conf/{config}/global-filters HTTP/1.1
    Host: 
    Accept: */*
    
    {
      "message": "Successfully deleted entry"
    }
    GET /api/v4.0/conf/{config}/global-filters/{entry_id} HTTP/1.1
    Host: 
    Accept: */*
    
    {
      "action": null,
      "active": true,
      "description": "text",
      "id": "text",
      "mdate": "text",
      "name": "text",
      "rule": null,
      "source": "text",
      "tags": [
        "text"
      ]
    }
    PUT /api/v4.0/conf/{config}/global-filters/{entry_id} HTTP/1.1
    Host: 
    Content-Type: application/json
    Accept: */*
    Content-Length: 135
    
    {
      "action": null,
      "active": true,
      "description": "text",
      "id": "text",
      "mdate": "text",
      "name": "text",
      "rule": null,
      "source": "text",
      "tags": [
        "text"
      ]
    }
    {
      "message": "Successfully updated entry"
    }
    POST /api/v4.0/conf/{config}/global-filters/{entry_id} HTTP/1.1
    Host: 
    Content-Type: application/json
    Accept: */*
    Content-Length: 135
    
    {
      "action": null,
      "active": true,
      "description": "text",
      "id": "text",
      "mdate": "text",
      "name": "text",
      "rule": null,
      "source": "text",
      "tags": [
        "text"
      ]
    }
    {
      "message": "Successfully created entry"
    }
    DELETE /api/v4.0/conf/{config}/global-filters/{entry_id} HTTP/1.1
    Host: 
    Accept: */*
    
    {
      "message": "Successfully deleted entry"
    }
    GET /api/v4.0/conf/{config}/global-filters/versions HTTP/1.1
    Host: 
    Accept: */*
    
    {
      "total": 1,
      "items": [
        {
          "author": "text",
          "email": "[email protected]",
          "message": "text",
          "date": "2025-12-15T13:59:37.020Z",
          "version": "42bcc1282349db1e5791484c3d69420b1d8a8bc1",
          "parents": [
            "f44073242093228b45bff7eb7a065559fa9b46aa"
          ]
        }
      ]
    }
    GET /api/v4.0/conf/{config}/global-filters/versions/{version} HTTP/1.1
    Host: 
    Accept: */*
    
    {
      "total": 1,
      "items": [
        {
          "action": null,
          "active": true,
          "description": "text",
          "id": "text",
          "mdate": "text",
          "name": "text",
          "rule": null,
          "source": "text",
          "tags": [
            "text"
          ]
        }
      ]
    }
    PUT /api/v4.0/conf/{config}/global-filters/versions/{version}/revert HTTP/1.1
    Host: 
    Accept: */*
    
    {
      "message": "Successfully updated entry"
    }
    GET /api/v4.0/conf/{config}/edge-functions HTTP/1.1
    Host: 
    Accept: */*
    
    {
      "total": 1,
      "items": [
        {
          "code": "text",
          "description": "",
          "id": "text",
          "name": "text",
          "phase": "request"
        }
      ]
    }
    PUT /api/v4.0/conf/{config}/edge-functions HTTP/1.1
    Host: 
    Content-Type: application/json
    Accept: */*
    Content-Length: 78
    
    [
      {
        "code": "text",
        "description": "",
        "id": "text",
        "name": "text",
        "phase": "request"
      }
    ]
    {
      "message": "Successfully updated entry"
    }
    POST /api/v4.0/conf/{config}/edge-functions HTTP/1.1
    Host: 
    Content-Type: application/json
    Accept: */*
    Content-Length: 78
    
    [
      {
        "code": "text",
        "description": "",
        "id": "text",
        "name": "text",
        "phase": "request"
      }
    ]
    {
      "message": "Successfully created entry"
    }
    DELETE /api/v4.0/conf/{config}/edge-functions HTTP/1.1
    Host: 
    Accept: */*
    
    {
      "message": "Successfully deleted entry"
    }
    GET /api/v4.0/conf/{config}/edge-functions/{entry_id} HTTP/1.1
    Host: 
    Accept: */*
    
    {
      "code": "text",
      "description": "",
      "id": "text",
      "name": "text",
      "phase": "request"
    }
    PUT /api/v4.0/conf/{config}/edge-functions/{entry_id} HTTP/1.1
    Host: 
    Content-Type: application/json
    Accept: */*
    Content-Length: 76
    
    {
      "code": "text",
      "description": "",
      "id": "text",
      "name": "text",
      "phase": "request"
    }
    {
      "message": "Successfully updated entry"
    }
    POST /api/v4.0/conf/{config}/edge-functions/{entry_id} HTTP/1.1
    Host: 
    Content-Type: application/json
    Accept: */*
    Content-Length: 76
    
    {
      "code": "text",
      "description": "",
      "id": "text",
      "name": "text",
      "phase": "request"
    }
    {
      "message": "Successfully created entry"
    }
    DELETE /api/v4.0/conf/{config}/edge-functions/{entry_id} HTTP/1.1
    Host: 
    Accept: */*
    
    {
      "message": "Successfully deleted entry"
    }
    GET /api/v4.0/conf/{config}/edge-functions/versions HTTP/1.1
    Host: 
    Accept: */*
    
    {
      "total": 1,
      "items": [
        {
          "author": "text",
          "email": "[email protected]",
          "message": "text",
          "date": "2025-12-15T13:59:37.020Z",
          "version": "42bcc1282349db1e5791484c3d69420b1d8a8bc1",
          "parents": [
            "f44073242093228b45bff7eb7a065559fa9b46aa"
          ]
        }
      ]
    }
    GET /api/v4.0/conf/{config}/edge-functions/versions/{version} HTTP/1.1
    Host: 
    Accept: */*
    
    {
      "total": 1,
      "items": [
        {
          "code": "text",
          "description": "",
          "id": "text",
          "name": "text",
          "phase": "request"
        }
      ]
    }
    PUT /api/v4.0/conf/{config}/edge-functions/versions/{version}/revert HTTP/1.1
    Host: 
    Accept: */*
    
    {
      "message": "Successfully updated entry"
    }
    {
      "total": 1,
      "items": [
        {
          "date": "2025-12-15T13:59:37.020Z",
          "description": "text",
          "id": "text",
          "logs": [
            {
              "date": "2025-12-15T13:59:37.020Z",
              "version": "text"
            }
          ],
          "version": "text"
        }
      ]
    }
    GET /api/v4.0/conf/configs/{config}/versions HTTP/1.1
    Host: 
    Accept: */*
    
    {
      "total": 1,
      "items": [
        {
          "author": "text",
          "email": "[email protected]",
          "message": "text",
          "date": "2025-12-15T13:59:37.020Z",
          "version": "42bcc1282349db1e5791484c3d69420b1d8a8bc1",
          "parents": [
            "f44073242093228b45bff7eb7a065559fa9b46aa"
          ]
        }
      ]
    }
    PUT /api/v4.0/conf/configs/{config}/versions/{version}/revert HTTP/1.1
    Host: 
    Accept: */*
    
    {
      "message": "Successfully updated entry"
    }
    GET /api/v4.0/conf/configs HTTP/1.1
    Host: 
    Accept: */*
    
    GET /api/v4.0/conf/configs/{config} HTTP/1.1
    Host: 
    Accept: */*
    
    Header parameters
    providerstring · enumOptional

    Database to get data from

    Example: bigqueryPossible values:
    syntaxstringOptional

    syntax of query

    Example: json
    Responses
    200

    Logs has been received successfully

    application/json
    4XX

    Misconfigured request

    application/json
    get
    /api/v4.0/data/logs
    Responses
    200

    Query for quarantined has been run successfully

    application/json
    4XX

    Misconfigured request

    application/json
    get
    /api/v4.0/data/quarantined
    configstringOptional
    idsstring[]Optional
    rule_idsstring[]Optional
    Responses
    200

    Record(s) was/were successfully deleted

    application/json
    4XX

    Misconfigured request

    application/json
    delete
    /api/v4.0/data/quarantined
    Header parameters
    providerstring · enumOptional

    Database to get data from

    Example: bigqueryPossible values:
    syntaxstring · enumOptional

    syntax of query

    Example: jsonPossible values:
    Responses
    200

    Stats has been received successfully

    application/json
    4XX

    Misconfigured request

    application/json
    get
    /api/v4.0/data/stats
    Header parameters
    providerstring · enumOptional

    Database to get data from

    Example: bigqueryPossible values:
    syntaxstringOptional

    syntax of query

    Example: json
    Responses
    200

    Timeline has been received successfully

    application/json
    4XX

    Misconfigured request

    application/json
    get
    /api/v4.0/data/timeline
    post
    /api/v4.0/data/timeline/parse
    Header parameters
    providerstring · enumOptional

    Database to get data from

    Example: bigqueryPossible values:
    syntaxstring · enumOptional

    syntax of query

    Example: jsonPossible values:
    Responses
    200

    Topx has been received successfully

    application/json
    4XX

    Misconfigured request

    application/json
    get
    /api/v4.0/data/topx
    actionany ofOptionalDefault: ""
    stringOptional
    activestring[]Optional

    List of tags to apply

    Default: []
    allsectionsany ofOptional
    argsall ofRequired
    content_typeany ofOptional

    List of content types

    Default: []
    string[]Optional
    cookiesall ofRequired
    decodingall ofRequired
    descriptionany ofOptionalDefault: ""
    stringOptional
    or
    nullOptional
    graphql_pathany ofOptional

    A field in a JSON that contains GraphQL query that need to be parsed. The value should be passed in JSONPath format. It supports regex for values as well.

    Default: ""
    stringOptional
    headersall ofRequired
    idstringRequired
    ignorestring[]Optional

    List of tags to apply

    Default: []
    ignore_alphanumbooleanRequired

    When true, arguments, headers or cookies, which contain only alpha numeric characters, will be ignored

    ignore_bodyany ofOptionalDefault: false
    booleanOptional
    masking_seedstringRequired

    A seed which will be used in the masking process

    namestring · min: 1Required
    pathall ofRequired
    reportstring[]Optional

    List of tags to apply

    Default: []
    tagsstring[]Optional

    List of tags to apply

    Default: []
    Responses
    200

    Content Filter Profiles updated successfully

    application/json
    422

    Validation Error

    application/json
    put
    /api/v4.0/conf/{config}/content-filter-profiles
    actionany ofOptionalDefault: ""
    stringOptional
    activestring[]Optional

    List of tags to apply

    Default: []
    allsectionsany ofOptional
    argsall ofRequired
    content_typeany ofOptional

    List of content types

    Default: []
    string[]Optional
    cookiesall ofRequired
    decodingall ofRequired
    descriptionany ofOptionalDefault: ""
    stringOptional
    or
    nullOptional
    graphql_pathany ofOptional

    A field in a JSON that contains GraphQL query that need to be parsed. The value should be passed in JSONPath format. It supports regex for values as well.

    Default: ""
    stringOptional
    headersall ofRequired
    idstringRequired
    ignorestring[]Optional

    List of tags to apply

    Default: []
    ignore_alphanumbooleanRequired

    When true, arguments, headers or cookies, which contain only alpha numeric characters, will be ignored

    ignore_bodyany ofOptionalDefault: false
    booleanOptional
    masking_seedstringRequired

    A seed which will be used in the masking process

    namestring · min: 1Required
    pathall ofRequired
    reportstring[]Optional

    List of tags to apply

    Default: []
    tagsstring[]Optional

    List of tags to apply

    Default: []
    Responses
    200

    Content Filter Profile updated successfully

    application/json
    422

    Validation Error

    application/json
    put
    /api/v4.0/conf/{config}/content-filter-profiles/{entry_id}
    actionany ofOptionalDefault: ""
    stringOptional
    activestring[]Optional

    List of tags to apply

    Default: []
    allsectionsany ofOptional
    argsall ofRequired
    content_typeany ofOptional

    List of content types

    Default: []
    string[]Optional
    cookiesall ofRequired
    decodingall ofRequired
    descriptionany ofOptionalDefault: ""
    stringOptional
    or
    nullOptional
    graphql_pathany ofOptional

    A field in a JSON that contains GraphQL query that need to be parsed. The value should be passed in JSONPath format. It supports regex for values as well.

    Default: ""
    stringOptional
    headersall ofRequired
    idstringRequired
    ignorestring[]Optional

    List of tags to apply

    Default: []
    ignore_alphanumbooleanRequired

    When true, arguments, headers or cookies, which contain only alpha numeric characters, will be ignored

    ignore_bodyany ofOptionalDefault: false
    booleanOptional
    masking_seedstringRequired

    A seed which will be used in the masking process

    namestring · min: 1Required
    pathall ofRequired
    reportstring[]Optional

    List of tags to apply

    Default: []
    tagsstring[]Optional

    List of tags to apply

    Default: []
    Responses
    201

    Content Filter Profile created successfully

    application/json
    422

    Validation Error

    application/json
    post
    /api/v4.0/conf/{config}/content-filter-profiles/{entry_id}
    delete
    /api/v4.0/conf/{config}/content-filter-profiles/{entry_id}
    get
    /api/v4.0/conf/{config}/content-filter-profiles/versions/{version}
    GET /api/v4.0/data/logs HTTP/1.1
    Host: 
    Accept: */*
    
    {
      "data": {
        "results": [],
        "statistics": {}
      },
      "status": 1
    }
    GET /api/v4.0/data/quarantined HTTP/1.1
    Host: 
    provider: mongodb
    syntax: string_query
    Accept: */*
    
    {
      "data": {
        "results": [],
        "statistics": {}
      },
      "status": 1
    }
    DELETE /api/v4.0/data/quarantined HTTP/1.1
    Host: 
    provider: mongodb
    syntax: json
    Content-Type: application/json
    Accept: */*
    Content-Length: 52
    
    {
      "config": "text",
      "ids": [
        "text"
      ],
      "rule_ids": [
        "text"
      ]
    }
    {
      "data": {
        "results": [],
        "statistics": {}
      },
      "status": 1
    }
    GET /api/v4.0/data/stats HTTP/1.1
    Host: 
    Accept: */*
    
    {
      "data": {
        "results": [],
        "statistics": {}
      },
      "status": 1
    }
    GET /api/v4.0/data/timeline HTTP/1.1
    Host: 
    Accept: */*
    
    {
      "data": {
        "results": [],
        "statistics": {}
      },
      "status": 1
    }
    POST /api/v4.0/data/timeline/parse HTTP/1.1
    Host: 
    Content-Type: application/json
    Accept: */*
    Content-Length: 16
    
    {
      "query": "text"
    }
    {}
    GET /api/v4.0/data/topx HTTP/1.1
    Host: 
    Accept: */*
    
    {
      "data": {
        "results": [],
        "statistics": {}
      },
      "status": 1
    }
    PARAMETERS /api/v4.0/data/logs HTTP/1.1
    Host: 
    Accept: */*
    
    PARAMETERS /api/v4.0/data/stats HTTP/1.1
    Host: 
    Accept: */*
    
    PARAMETERS /api/v4.0/data/timeline HTTP/1.1
    Host: 
    Accept: */*
    
    PARAMETERS /api/v4.0/data/topx HTTP/1.1
    Host: 
    Accept: */*
    
    PUT /api/v4.0/conf/{config}/content-filter-profiles HTTP/1.1
    Host: 
    Content-Type: application/json
    Accept: */*
    Content-Length: 1562
    
    [
      {
        "action": "",
        "active": [
          "text"
        ],
        "allsections": {
          "enable_max_count": true,
          "enable_max_length": true,
          "max_count": 1,
          "max_length": 1,
          "names": [
            {
              "exclusions": [
                "text"
              ],
              "key": "",
              "mask": false,
              "reg": "",
              "restrict": true
            }
          ],
          "regex": [
            {
              "exclusions": [
                "text"
              ],
              "key": "",
              "mask": false,
              "reg": "",
              "restrict": true
            }
          ]
        },
        "args": {
          "enable_max_count": true,
          "enable_max_length": true,
          "max_count": 1,
          "max_length": 1,
          "names": [
            {
              "exclusions": [
                "text"
              ],
              "key": "",
              "mask": false,
              "reg": "",
              "restrict": true
            }
          ],
          "regex": [
            {
              "exclusions": [
                "text"
              ],
              "key": "",
              "mask": false,
              "reg": "",
              "restrict": true
            }
          ]
        },
        "content_type": [
          "text"
        ],
        "cookies": {
          "enable_max_count": true,
          "enable_max_length": true,
          "max_count": 1,
          "max_length": 1,
          "names": [
            {
              "exclusions": [
                "text"
              ],
              "key": "",
              "mask": false,
              "reg": "",
              "restrict": true
            }
          ],
          "regex": [
            {
              "exclusions": [
                "text"
              ],
              "key": "",
              "mask": false,
              "reg": "",
              "restrict": true
            }
          ]
        },
        "decoding": {
          "base64": true,
          "dual": false,
          "html": false,
          "unicode": false
        },
        "description": "",
        "graphql_path": "",
        "headers": {
          "enable_max_count": true,
          "enable_max_length": true,
          "max_count": 1,
          "max_length": 1,
          "names": [
            {
              "exclusions": [
                "text"
              ],
              "key": "",
              "mask": false,
              "reg": "",
              "restrict": true
            }
          ],
          "regex": [
            {
              "exclusions": [
                "text"
              ],
              "key": "",
              "mask": false,
              "reg": "",
              "restrict": true
            }
          ]
        },
        "id": "text",
        "ignore": [
          "text"
        ],
        "ignore_alphanum": true,
        "ignore_body": false,
        "masking_seed": "text",
        "name": "text",
        "path": {
          "enable_max_count": true,
          "enable_max_length": true,
          "max_count": 1,
          "max_length": 1,
          "names": [
            {
              "exclusions": [
                "text"
              ],
              "key": "",
              "mask": false,
              "reg": "",
              "restrict": true
            }
          ],
          "regex": [
            {
              "exclusions": [
                "text"
              ],
              "key": "",
              "mask": false,
              "reg": "",
              "restrict": true
            }
          ]
        },
        "report": [
          "text"
        ],
        "tags": [
          "text"
        ]
      }
    ]
    PUT /api/v4.0/conf/{config}/content-filter-profiles/{entry_id} HTTP/1.1
    Host: 
    Content-Type: application/json
    Accept: */*
    Content-Length: 1560
    
    {
      "action": "",
      "active": [
        "text"
      ],
      "allsections": {
        "enable_max_count": true,
        "enable_max_length": true,
        "max_count": 1,
        "max_length": 1,
        "names": [
          {
            "exclusions": [
              "text"
            ],
            "key": "",
            "mask": false,
            "reg": "",
            "restrict": true
          }
        ],
        "regex": [
          {
            "exclusions": [
              "text"
            ],
            "key": "",
            "mask": false,
            "reg": "",
            "restrict": true
          }
        ]
      },
      "args": {
        "enable_max_count": true,
        "enable_max_length": true,
        "max_count": 1,
        "max_length": 1,
        "names": [
          {
            "exclusions": [
              "text"
            ],
            "key": "",
            "mask": false,
            "reg": "",
            "restrict": true
          }
        ],
        "regex": [
          {
            "exclusions": [
              "text"
            ],
            "key": "",
            "mask": false,
            "reg": "",
            "restrict": true
          }
        ]
      },
      "content_type": [
        "text"
      ],
      "cookies": {
        "enable_max_count": true,
        "enable_max_length": true,
        "max_count": 1,
        "max_length": 1,
        "names": [
          {
            "exclusions": [
              "text"
            ],
            "key": "",
            "mask": false,
            "reg": "",
            "restrict": true
          }
        ],
        "regex": [
          {
            "exclusions": [
              "text"
            ],
            "key": "",
            "mask": false,
            "reg": "",
            "restrict": true
          }
        ]
      },
      "decoding": {
        "base64": true,
        "dual": false,
        "html": false,
        "unicode": false
      },
      "description": "",
      "graphql_path": "",
      "headers": {
        "enable_max_count": true,
        "enable_max_length": true,
        "max_count": 1,
        "max_length": 1,
        "names": [
          {
            "exclusions": [
              "text"
            ],
            "key": "",
            "mask": false,
            "reg": "",
            "restrict": true
          }
        ],
        "regex": [
          {
            "exclusions": [
              "text"
            ],
            "key": "",
            "mask": false,
            "reg": "",
            "restrict": true
          }
        ]
      },
      "id": "text",
      "ignore": [
        "text"
      ],
      "ignore_alphanum": true,
      "ignore_body": false,
      "masking_seed": "text",
      "name": "text",
      "path": {
        "enable_max_count": true,
        "enable_max_length": true,
        "max_count": 1,
        "max_length": 1,
        "names": [
          {
            "exclusions": [
              "text"
            ],
            "key": "",
            "mask": false,
            "reg": "",
            "restrict": true
          }
        ],
        "regex": [
          {
            "exclusions": [
              "text"
            ],
            "key": "",
            "mask": false,
            "reg": "",
            "restrict": true
          }
        ]
      },
      "report": [
        "text"
      ],
      "tags": [
        "text"
      ]
    }
    POST /api/v4.0/conf/{config}/content-filter-profiles/{entry_id} HTTP/1.1
    Host: 
    Content-Type: application/json
    Accept: */*
    Content-Length: 1560
    
    {
      "action": "",
      "active": [
        "text"
      ],
      "allsections": {
        "enable_max_count": true,
        "enable_max_length": true,
        "max_count": 1,
        "max_length": 1,
        "names": [
          {
            "exclusions": [
              "text"
            ],
            "key": "",
            "mask": false,
            "reg": "",
            "restrict": true
          }
        ],
        "regex": [
          {
            "exclusions": [
              "text"
            ],
            "key": "",
            "mask": false,
            "reg": "",
            "restrict": true
          }
        ]
      },
      "args": {
        "enable_max_count": true,
        "enable_max_length": true,
        "max_count": 1,
        "max_length": 1,
        "names": [
          {
            "exclusions": [
              "text"
            ],
            "key": "",
            "mask": false,
            "reg": "",
            "restrict": true
          }
        ],
        "regex": [
          {
            "exclusions": [
              "text"
            ],
            "key": "",
            "mask": false,
            "reg": "",
            "restrict": true
          }
        ]
      },
      "content_type": [
        "text"
      ],
      "cookies": {
        "enable_max_count": true,
        "enable_max_length": true,
        "max_count": 1,
        "max_length": 1,
        "names": [
          {
            "exclusions": [
              "text"
            ],
            "key": "",
            "mask": false,
            "reg": "",
            "restrict": true
          }
        ],
        "regex": [
          {
            "exclusions": [
              "text"
            ],
            "key": "",
            "mask": false,
            "reg": "",
            "restrict": true
          }
        ]
      },
      "decoding": {
        "base64": true,
        "dual": false,
        "html": false,
        "unicode": false
      },
      "description": "",
      "graphql_path": "",
      "headers": {
        "enable_max_count": true,
        "enable_max_length": true,
        "max_count": 1,
        "max_length": 1,
        "names": [
          {
            "exclusions": [
              "text"
            ],
            "key": "",
            "mask": false,
            "reg": "",
            "restrict": true
          }
        ],
        "regex": [
          {
            "exclusions": [
              "text"
            ],
            "key": "",
            "mask": false,
            "reg": "",
            "restrict": true
          }
        ]
      },
      "id": "text",
      "ignore": [
        "text"
      ],
      "ignore_alphanum": true,
      "ignore_body": false,
      "masking_seed": "text",
      "name": "text",
      "path": {
        "enable_max_count": true,
        "enable_max_length": true,
        "max_count": 1,
        "max_length": 1,
        "names": [
          {
            "exclusions": [
              "text"
            ],
            "key": "",
            "mask": false,
            "reg": "",
            "restrict": true
          }
        ],
        "regex": [
          {
            "exclusions": [
              "text"
            ],
            "key": "",
            "mask": false,
            "reg": "",
            "restrict": true
          }
        ]
      },
      "report": [
        "text"
      ],
      "tags": [
        "text"
      ]
    }
    DELETE /api/v4.0/conf/{config}/content-filter-profiles/{entry_id} HTTP/1.1
    Host: 
    Accept: */*
    
    {
      "message": "Successfully deleted entry"
    }
    GET /api/v4.0/conf/{config}/content-filter-profiles/versions/{version} HTTP/1.1
    Host: 
    Accept: */*
    
    {
      "total": 1,
      "items": [
        {
          "action": "",
          "active": [
            "text"
          ],
          "allsections": {
            "enable_max_count": true,
            "enable_max_length": true,
            "max_count": 1,
            "max_length": 1,
            "names": [
              {
                "exclusions": [
                  "text"
                ],
                "key": "",
                "mask": false,
                "reg": "",
                "restrict": true
              }
            ],
            "regex": [
              {
                "exclusions": [
                  "text"
                ],
                "key": "",
                "mask": false,
                "reg": "",
                "restrict": true
              }
            ]
          },
          "args": {
            "enable_max_count": true,
            "enable_max_length": true,
            "max_count": 1,
            "max_length": 1,
            "names": [
              {
                "exclusions": [
                  "text"
                ],
                "key": "",
                "mask": false,
                "reg": "",
                "restrict": true
              }
            ],
            "regex": [
              {
                "exclusions": [
                  "text"
                ],
                "key": "",
                "mask": false,
                "reg": "",
                "restrict": true
              }
            ]
          },
          "content_type": [
            "text"
          ],
          "cookies": {
            "enable_max_count": true,
            "enable_max_length": true,
            "max_count": 1,
            "max_length": 1,
            "names": [
              {
                "exclusions": [
                  "text"
                ],
                "key": "",
                "mask": false,
                "reg": "",
                "restrict": true
              }
            ],
            "regex": [
              {
                "exclusions": [
                  "text"
                ],
                "key": "",
                "mask": false,
                "reg": "",
                "restrict": true
              }
            ]
          },
          "decoding": {
            "base64": true,
            "dual": false,
            "html": false,
            "unicode": false
          },
          "description": "",
          "graphql_path": "",
          "headers": {
            "enable_max_count": true,
            "enable_max_length": true,
            "max_count": 1,
            "max_length": 1,
            "names": [
              {
                "exclusions": [
                  "text"
                ],
                "key": "",
                "mask": false,
                "reg": "",
                "restrict": true
              }
            ],
            "regex": [
              {
                "exclusions": [
                  "text"
                ],
                "key": "",
                "mask": false,
                "reg": "",
                "restrict": true
              }
            ]
          },
          "id": "text",
          "ignore": [
            "text"
          ],
          "ignore_alphanum": true,
          "ignore_body": false,
          "masking_seed": "text",
          "name": "text",
          "path": {
            "enable_max_count": true,
            "enable_max_length": true,
            "max_count": 1,
            "max_length": 1,
            "names": [
              {
                "exclusions": [
                  "text"
                ],
                "key": "",
                "mask": false,
                "reg": "",
                "restrict": true
              }
            ],
            "regex": [
              {
                "exclusions": [
                  "text"
                ],
                "key": "",
                "mask": false,
                "reg": "",
                "restrict": true
              }
            ]
          },
          "report": [
            "text"
          ],
          "tags": [
            "text"
          ]
        }
      ]
    }
    {
      "message": "Successfully updated entry"
    }
    {
      "message": "Successfully updated entry"
    }
    {
      "message": "Successfully created entry"
    }

    Get Dynamic Rules

    get

    Get all Dynamic Rules in a configuration

    Path parameters
    configstringRequired
    Responses
    200

    Dynamic Rules retrieved successfully

    application/json
    400

    Input Error

    application/json
    500

    Internal Server Error

    application/json
    get
    /api/v4.0/conf/{config}/dynamic-rules

    Get specific Dynamic Rule

    get

    Get a Dynamic Rule from the specified configuration

    Path parameters
    configstringRequired
    entry_idstringRequired
    Responses
    200

    Dynamic Rule retrieved successfully

    application/json
    400

    Input Error

    application/json
    422

    Validation Error

    application/json
    500

    Internal Server Error

    application/json
    get
    /api/v4.0/conf/{config}/dynamic-rules/{entry_id}

    Modify Dynamic Rule

    put

    Update an individual Dynamic Rule within a configuration

    Path parameters
    configstringRequired
    entry_idstringRequired
    Body
    actionstringRequired
    activebooleanRequired
    descriptionstringOptionalDefault: ""
    idstringRequired

    Unique id

    Pattern: ^[A-Za-z0-9\-\_]*$
    namestringRequired
    offload_ip_filteringbooleanRequired
    tagsstring[]Optional
    targetstringRequired
    thresholdintegerRequired
    timeframeintegerRequired
    ttlintegerRequired
    Responses
    200

    Dynamic Rule updated successfully

    application/json
    400

    Input Error

    application/json
    422

    Validation Error

    application/json
    500

    Internal Server Error

    application/json
    put
    /api/v4.0/conf/{config}/dynamic-rules/{entry_id}

    Create Dynamic Rule

    post

    Create an individual Dynamic Rule within a configuration

    Path parameters
    configstringRequired
    entry_idstringRequiredPattern: ^[A-Za-z0-9\-\_]*$
    Body
    actionstringRequired
    activebooleanRequired
    descriptionstringOptionalDefault: ""
    idstringRequired

    Unique id

    Pattern: ^[A-Za-z0-9\-\_]*$
    namestringRequired
    offload_ip_filteringbooleanRequired
    tagsstring[]Optional
    targetstringRequired
    thresholdintegerRequired
    timeframeintegerRequired
    ttlintegerRequired
    Responses
    201

    Dynamic Rule created successfully

    application/json
    400

    Input Error

    application/json
    422

    Validation Error

    application/json
    500

    Internal Server Error

    application/json
    post
    /api/v4.0/conf/{config}/dynamic-rules/{entry_id}

    Delete Dynamic Rule

    delete

    Delete an individual Dynamic Rule from the specified configuration

    Path parameters
    configstringRequired
    entry_idstringRequired
    Responses
    200

    Dynamic Rule deleted successfully

    application/json
    400

    Input Error

    application/json
    422

    Validation Error

    application/json
    500

    Internal Server Error

    application/json
    delete
    /api/v4.0/conf/{config}/dynamic-rules/{entry_id}

    Get Backend Services

    get

    Get all Backend Services in a configuration

    Path parameters
    configstringRequired
    Responses
    200

    Backend Services retrieved successfully

    application/json
    422

    Validation Error

    application/json
    get
    /api/v4.0/conf/{config}/backend-services

    Modify Backend Services

    put

    Updates an existing set of Backend Services for a configuration

    Path parameters
    configstringRequired
    Bodyobject · BackendService[]
    descriptionany ofOptionalDefault: ""
    stringOptional
    http11booleanRequired

    Use HTTP/1.1

    idstringRequired
    least_connbooleanRequired
    namestring · min: 1Required
    stickystring · enumRequired

    Load Balancing stickiness model

    Possible values:
    sticky_cookie_nameany ofRequired

    Custom cookie name

    Default: ""
    stringOptional
    transport_modestring · enumRequired

    Tranport protocol Service connectivity might follow incoming requests, will always be HTTP, or always HTTPS. Port-bridge mode means that Reblaze will target port numbers identical to incoming requests' port numbers.

    Possible values:
    Responses
    200

    Backend Services updated successfully

    application/json
    422

    Validation Error

    application/json
    put
    /api/v4.0/conf/{config}/backend-services

    Create Backend Services

    post

    Create a complete set of Backend Services for a configuration

    Path parameters
    configstringRequired
    Bodyobject · BackendService[]
    descriptionany ofOptionalDefault: ""
    stringOptional
    http11booleanRequired

    Use HTTP/1.1

    idstringRequired
    least_connbooleanRequired
    namestring · min: 1Required
    stickystring · enumRequired

    Load Balancing stickiness model

    Possible values:
    sticky_cookie_nameany ofRequired

    Custom cookie name

    Default: ""
    stringOptional
    transport_modestring · enumRequired

    Tranport protocol Service connectivity might follow incoming requests, will always be HTTP, or always HTTPS. Port-bridge mode means that Reblaze will target port numbers identical to incoming requests' port numbers.

    Possible values:
    Responses
    201

    Backend Services created successfully

    application/json
    422

    Validation Error

    application/json
    post
    /api/v4.0/conf/{config}/backend-services

    Delete Backend Services

    delete

    Delete all Backend Services in a configuration

    Path parameters
    configstringRequired
    Responses
    200

    Backend Services deleted successfully

    application/json
    422

    Validation Error

    application/json
    delete
    /api/v4.0/conf/{config}/backend-services

    Get single Backend Service

    get

    Get an individual Backend Service from the specified configuration

    Path parameters
    configstringRequired
    entry_idstringRequired
    Responses
    200

    Backend Service retrieved successfully

    application/json
    422

    Validation Error

    application/json
    get
    /api/v4.0/conf/{config}/backend-services/{entry_id}

    Modify a single Backend Service

    put

    Update an individual Backend Service within a configuration

    Path parameters
    configstringRequired
    entry_idstringRequired
    Body
    descriptionany ofOptionalDefault: ""
    stringOptional
    http11booleanRequired

    Use HTTP/1.1

    idstringRequired
    least_connbooleanRequired
    namestring · min: 1Required
    stickystring · enumRequired

    Load Balancing stickiness model

    Possible values:
    sticky_cookie_nameany ofRequired

    Custom cookie name

    Default: ""
    stringOptional
    transport_modestring · enumRequired

    Tranport protocol Service connectivity might follow incoming requests, will always be HTTP, or always HTTPS. Port-bridge mode means that Reblaze will target port numbers identical to incoming requests' port numbers.

    Possible values:
    Responses
    200

    Backend Service updated successfully

    application/json
    422

    Validation Error

    application/json
    put
    /api/v4.0/conf/{config}/backend-services/{entry_id}

    Create single Backend Service

    post

    Create an individual Backend Service within a configuration

    Path parameters
    configstringRequired
    entry_idstringRequired
    Body
    descriptionany ofOptionalDefault: ""
    stringOptional
    http11booleanRequired

    Use HTTP/1.1

    idstringRequired
    least_connbooleanRequired
    namestring · min: 1Required
    stickystring · enumRequired

    Load Balancing stickiness model

    Possible values:
    sticky_cookie_nameany ofRequired

    Custom cookie name

    Default: ""
    stringOptional
    transport_modestring · enumRequired

    Tranport protocol Service connectivity might follow incoming requests, will always be HTTP, or always HTTPS. Port-bridge mode means that Reblaze will target port numbers identical to incoming requests' port numbers.

    Possible values:
    Responses
    201

    Backend Service created successfully

    application/json
    422

    Validation Error

    application/json
    post
    /api/v4.0/conf/{config}/backend-services/{entry_id}

    Delete single Backend Service

    delete

    Delete an individual Backend Service from the specified configuration

    Path parameters
    configstringRequired
    entry_idstringRequired
    Responses
    200

    Backend Service deleted successfully

    application/json
    422

    Validation Error

    application/json
    delete
    /api/v4.0/conf/{config}/backend-services/{entry_id}

    Get Backend Services version list

    get

    Get list of versions of Backend Services in a configuration

    Path parameters
    configstringRequired
    Responses
    200

    Backend Services version list retrieved successfully

    application/json
    422

    Validation Error

    application/json
    get
    /api/v4.0/conf/{config}/backend-services/versions

    Get version of Backend Service

    get

    Get a specific version of a Backend Service

    Path parameters
    configstringRequired
    versionstringRequired
    Responses
    200

    Backend Service retrieved successfully

    application/json
    422

    Validation Error

    application/json
    get
    /api/v4.0/conf/{config}/backend-services/versions/{version}

    Revert a Backend Service to the specified version

    put

    Set a previous Backend Service version to be the current one

    Path parameters
    configstringRequired
    versionstringRequired
    Responses
    200

    Backend Service reversion was successful

    application/json
    422

    Validation Error

    application/json
    put
    /api/v4.0/conf/{config}/backend-services/versions/{version}/revert

    Get Content Filter Profiles

    get

    Get all Content Filter Profiles in a configuration

    Path parameters
    configstringRequired
    Responses
    200

    Content Filter Profiles retrieved successfully

    application/json
    422

    Validation Error

    application/json

    Create Content Filter Profiles

    post

    Create a complete set of Content Filter Profiles for a configuration

    Path parameters
    configstringRequired
    Bodyobject · ContentFilterProfile[]
    actionany ofOptionalDefault: ""
    stringOptional
    activestring[]Optional

    List of tags to apply

    Default: []
    allsectionsany ofOptional
    argsall ofRequired
    content_typeany ofOptional

    List of content types

    Default: []
    string[]Optional
    cookiesall ofRequired
    decodingall ofRequired
    descriptionany ofOptionalDefault: ""
    stringOptional
    or
    nullOptional
    graphql_pathany ofOptional

    A field in a JSON that contains GraphQL query that need to be parsed. The value should be passed in JSONPath format. It supports regex for values as well.

    Default: ""
    stringOptional
    headersall ofRequired
    idstringRequired
    ignorestring[]Optional

    List of tags to apply

    Default: []
    ignore_alphanumbooleanRequired

    When true, arguments, headers or cookies, which contain only alpha numeric characters, will be ignored

    ignore_bodyany ofOptionalDefault: false
    booleanOptional
    masking_seedstringRequired

    A seed which will be used in the masking process

    namestring · min: 1Required
    pathall ofRequired
    reportstring[]Optional

    List of tags to apply

    Default: []
    tagsstring[]Optional

    List of tags to apply

    Default: []

    Delete Content Filter Profiles

    delete

    Delete all Content Filter Profiles in a configuration

    Path parameters
    configstringRequired
    Responses
    200

    Content Filter Profiles deleted successfully

    application/json
    422

    Validation Error

    application/json

    Get single Content Filter Profile

    get

    Get a Content Filter Profile from the specified configuration

    Path parameters
    configstringRequired
    entry_idstringRequired
    Responses
    200

    Content Filter Profile retrieved successfully

    application/json
    422

    Validation Error

    application/json

    Get Content Filter Profiles version list

    get

    Get list of versions of Content Filter Profiles in a configuration

    Path parameters
    configstringRequired
    Responses
    200

    Content Filter Profiles version list retrieved successfully

    application/json
    422

    Validation Error

    application/json

    Revert a Content Filter Profile to the specified version

    put

    Set a previous Content Filter Profile version to be the current one

    Path parameters
    configstringRequired
    versionstringRequired
    Responses
    200

    Content Filter Profile reversion was successful

    application/json
    422

    Validation Error

    application/json
    GET /api/v4.0/conf/{config}/dynamic-rules HTTP/1.1
    Host: 
    Accept: */*
    
    {
      "total": 1,
      "items": [
        {
          "action": "text",
          "active": true,
          "description": "",
          "id": "text",
          "include": {
            "relation": "OR",
            "tags": [
              "text"
            ]
          },
          "exclude": {
            "relation": "OR",
            "tags": [
              "text"
            ]
          },
          "name": "text",
          "offload_ip_filtering": true,
          "tags": [
            "text"
          ],
          "target": "text",
          "threshold": 1,
          "timeframe": 1,
          "ttl": 1
        }
      ]
    }
    GET /api/v4.0/conf/{config}/dynamic-rules/{entry_id} HTTP/1.1
    Host: 
    Accept: */*
    
    {
      "action": "text",
      "active": true,
      "description": "",
      "id": "text",
      "include": {
        "relation": "OR",
        "tags": [
          "text"
        ]
      },
      "exclude": {
        "relation": "OR",
        "tags": [
          "text"
        ]
      },
      "name": "text",
      "offload_ip_filtering": true,
      "tags": [
        "text"
      ],
      "target": "text",
      "threshold": 1,
      "timeframe": 1,
      "ttl": 1
    }
    PUT /api/v4.0/conf/{config}/dynamic-rules/{entry_id} HTTP/1.1
    Host: 
    Content-Type: application/json
    Accept: */*
    Content-Length: 258
    
    {
      "action": "text",
      "active": true,
      "description": "",
      "id": "text",
      "include": {
        "relation": "OR",
        "tags": [
          "text"
        ]
      },
      "exclude": {
        "relation": "OR",
        "tags": [
          "text"
        ]
      },
      "name": "text",
      "offload_ip_filtering": true,
      "tags": [
        "text"
      ],
      "target": "text",
      "threshold": 1,
      "timeframe": 1,
      "ttl": 1
    }
    POST /api/v4.0/conf/{config}/dynamic-rules/{entry_id} HTTP/1.1
    Host: 
    Content-Type: application/json
    Accept: */*
    Content-Length: 258
    
    {
      "action": "text",
      "active": true,
      "description": "",
      "id": "text",
      "include": {
        "relation": "OR",
        "tags": [
          "text"
        ]
      },
      "exclude": {
        "relation": "OR",
        "tags": [
          "text"
        ]
      },
      "name": "text",
      "offload_ip_filtering": true,
      "tags": [
        "text"
      ],
      "target": "text",
      "threshold": 1,
      "timeframe": 1,
      "ttl": 1
    }
    DELETE /api/v4.0/conf/{config}/dynamic-rules/{entry_id} HTTP/1.1
    Host: 
    Accept: */*
    
    {
      "message": "Successfully deleted entry"
    }
    {
      "message": "Successfully updated entry"
    }
    {
      "message": "Successfully created entry"
    }
    {
      "message": "Successfully updated entry"
    }
    {
      "message": "Successfully created entry"
    }
    GET /api/v4.0/conf/{config}/backend-services HTTP/1.1
    Host: 
    Accept: */*
    
    {
      "total": 1,
      "items": [
        {
          "back_hosts": [
            {
              "backup": true,
              "down": true,
              "fail_timeout": 1,
              "host": "text",
              "http_ports": [
                80,
                8080
              ],
              "https_ports": [
                443,
                8443
              ],
              "max_fails": 1,
              "monitor_state": "text",
              "weight": 1
            }
          ],
          "description": "",
          "http11": true,
          "id": "text",
          "least_conn": true,
          "name": "text",
          "sticky": "none",
          "sticky_cookie_name": "",
          "transport_mode": "default"
        }
      ]
    }
    PUT /api/v4.0/conf/{config}/backend-services HTTP/1.1
    Host: 
    Content-Type: application/json
    Accept: */*
    Content-Length: 315
    
    [
      {
        "back_hosts": [
          {
            "backup": true,
            "down": true,
            "fail_timeout": 1,
            "host": "text",
            "http_ports": [
              80,
              8080
            ],
            "https_ports": [
              443,
              8443
            ],
            "max_fails": 1,
            "monitor_state": "text",
            "weight": 1
          }
        ],
        "description": "",
        "http11": true,
        "id": "text",
        "least_conn": true,
        "name": "text",
        "sticky": "none",
        "sticky_cookie_name": "",
        "transport_mode": "default"
      }
    ]
    POST /api/v4.0/conf/{config}/backend-services HTTP/1.1
    Host: 
    Content-Type: application/json
    Accept: */*
    Content-Length: 315
    
    [
      {
        "back_hosts": [
          {
            "backup": true,
            "down": true,
            "fail_timeout": 1,
            "host": "text",
            "http_ports": [
              80,
              8080
            ],
            "https_ports": [
              443,
              8443
            ],
            "max_fails": 1,
            "monitor_state": "text",
            "weight": 1
          }
        ],
        "description": "",
        "http11": true,
        "id": "text",
        "least_conn": true,
        "name": "text",
        "sticky": "none",
        "sticky_cookie_name": "",
        "transport_mode": "default"
      }
    ]
    DELETE /api/v4.0/conf/{config}/backend-services HTTP/1.1
    Host: 
    Accept: */*
    
    {
      "message": "Successfully deleted entry"
    }
    GET /api/v4.0/conf/{config}/backend-services/{entry_id} HTTP/1.1
    Host: 
    Accept: */*
    
    {
      "back_hosts": [
        {
          "backup": true,
          "down": true,
          "fail_timeout": 1,
          "host": "text",
          "http_ports": [
            80,
            8080
          ],
          "https_ports": [
            443,
            8443
          ],
          "max_fails": 1,
          "monitor_state": "text",
          "weight": 1
        }
      ],
      "description": "",
      "http11": true,
      "id": "text",
      "least_conn": true,
      "name": "text",
      "sticky": "none",
      "sticky_cookie_name": "",
      "transport_mode": "default"
    }
    PUT /api/v4.0/conf/{config}/backend-services/{entry_id} HTTP/1.1
    Host: 
    Content-Type: application/json
    Accept: */*
    Content-Length: 313
    
    {
      "back_hosts": [
        {
          "backup": true,
          "down": true,
          "fail_timeout": 1,
          "host": "text",
          "http_ports": [
            80,
            8080
          ],
          "https_ports": [
            443,
            8443
          ],
          "max_fails": 1,
          "monitor_state": "text",
          "weight": 1
        }
      ],
      "description": "",
      "http11": true,
      "id": "text",
      "least_conn": true,
      "name": "text",
      "sticky": "none",
      "sticky_cookie_name": "",
      "transport_mode": "default"
    }
    POST /api/v4.0/conf/{config}/backend-services/{entry_id} HTTP/1.1
    Host: 
    Content-Type: application/json
    Accept: */*
    Content-Length: 313
    
    {
      "back_hosts": [
        {
          "backup": true,
          "down": true,
          "fail_timeout": 1,
          "host": "text",
          "http_ports": [
            80,
            8080
          ],
          "https_ports": [
            443,
            8443
          ],
          "max_fails": 1,
          "monitor_state": "text",
          "weight": 1
        }
      ],
      "description": "",
      "http11": true,
      "id": "text",
      "least_conn": true,
      "name": "text",
      "sticky": "none",
      "sticky_cookie_name": "",
      "transport_mode": "default"
    }
    DELETE /api/v4.0/conf/{config}/backend-services/{entry_id} HTTP/1.1
    Host: 
    Accept: */*
    
    {
      "message": "Successfully deleted entry"
    }
    GET /api/v4.0/conf/{config}/backend-services/versions HTTP/1.1
    Host: 
    Accept: */*
    
    {
      "total": 1,
      "items": [
        {
          "author": "text",
          "email": "[email protected]",
          "message": "text",
          "date": "2025-12-15T13:59:37.020Z",
          "version": "42bcc1282349db1e5791484c3d69420b1d8a8bc1",
          "parents": [
            "f44073242093228b45bff7eb7a065559fa9b46aa"
          ]
        }
      ]
    }
    GET /api/v4.0/conf/{config}/backend-services/versions/{version} HTTP/1.1
    Host: 
    Accept: */*
    
    {
      "total": 1,
      "items": [
        {
          "back_hosts": [
            {
              "backup": true,
              "down": true,
              "fail_timeout": 1,
              "host": "text",
              "http_ports": [
                80,
                8080
              ],
              "https_ports": [
                443,
                8443
              ],
              "max_fails": 1,
              "monitor_state": "text",
              "weight": 1
            }
          ],
          "description": "",
          "http11": true,
          "id": "text",
          "least_conn": true,
          "name": "text",
          "sticky": "none",
          "sticky_cookie_name": "",
          "transport_mode": "default"
        }
      ]
    }
    PUT /api/v4.0/conf/{config}/backend-services/versions/{version}/revert HTTP/1.1
    Host: 
    Accept: */*
    
    {
      "message": "Successfully updated entry"
    }
    {
      "message": "Successfully updated entry"
    }
    {
      "message": "Successfully created entry"
    }
    get
    /api/v4.0/conf/{config}/content-filter-profiles
    Responses
    201

    Content Filter Profiles created successfully

    application/json
    422

    Validation Error

    application/json
    post
    /api/v4.0/conf/{config}/content-filter-profiles
    delete
    /api/v4.0/conf/{config}/content-filter-profiles
    get
    /api/v4.0/conf/{config}/content-filter-profiles/{entry_id}
    get
    /api/v4.0/conf/{config}/content-filter-profiles/versions
    put
    /api/v4.0/conf/{config}/content-filter-profiles/versions/{version}/revert

    Get Mobile Application Groups

    get

    Get all Mobile Application Groups

    Path parameters
    configstringRequired
    Responses
    200

    Mobile Application Groups retrieved successfully

    application/json
    400

    Input Error

    application/json
    500

    Internal Server Error

    application/json
    get
    /api/v4.0/conf/{config}/mobile-application-groups

    Get Mobile Application Group

    get

    Get a Mobile Application Group from the specified identifier

    Path parameters
    configstringRequired
    entry_idstringRequired
    Responses
    200

    Mobile Application Group retrieved successfully

    application/json
    400

    Input Error

    application/json
    422

    Validation Error

    application/json
    500

    Internal Server Error

    application/json
    get
    /api/v4.0/conf/{config}/mobile-application-groups/{entry_id}

    Modify Mobile Application Group

    put

    Update an individual Mobile Application Group within a configuration

    Path parameters
    configstringRequired
    entry_idstringRequired
    Body
    idstringOptional
    namestringOptional
    descriptionstringOptional
    uid_headerstringOptional
    gracestringOptional
    Responses
    200

    Mobile Application Group updated successfully

    application/json
    400

    Input Error

    application/json
    422

    Validation Error

    application/json
    500

    Internal Server Error

    application/json
    put
    /api/v4.0/conf/{config}/mobile-application-groups/{entry_id}

    Create Mobile Application Group

    post

    Create an individual Mobile Application Group within a configuration

    Path parameters
    configstringRequired
    entry_idstringRequiredPattern: ^[A-Za-z0-9\-\_]*$
    Body
    idstringOptional
    namestringOptional
    descriptionstringOptional
    uid_headerstringOptional
    gracestringOptional
    Responses
    201

    Mobile Application Group created successfully

    application/json
    400

    Input Error

    application/json
    422

    Validation Error

    application/json
    500

    Internal Server Error

    application/json
    post
    /api/v4.0/conf/{config}/mobile-application-groups/{entry_id}

    Delete Mobile Application Group

    delete

    Delete an individual Mobile Applicaions Group from the specified configuration

    Path parameters
    configstringRequired
    entry_idstringRequired
    Responses
    200

    Mobile Application Group deleted successfully

    application/json
    400

    Bad Request

    application/json
    422

    Validation Error

    application/json
    500

    Internal Server Error

    application/json
    delete
    /api/v4.0/conf/{config}/mobile-application-groups/{entry_id}

    Get Log Exporters

    get

    Get all Log Exporters in a configuration

    Path parameters
    configstringRequired
    Responses
    200

    Log Exporters retrieved successfully

    application/json
    422

    Validation Error

    application/json
    get
    /api/v4.0/conf/{config}/log-exporters

    Get single Log Exporter configuration

    get

    Get an individual Log Exporter configuration from the specified configuration

    Path parameters
    configstringRequired
    entry_idstringRequired
    Responses
    200

    Log Exporter configuration retrieved successfully

    application/json
    422

    Validation Error

    application/json
    get
    /api/v4.0/conf/{config}/log-exporters/{entry_id}

    Modify a single Log Exporter configuration

    put

    Update an individual Log Exporter configuration within a configuration

    Path parameters
    configstringRequired
    entry_idstringRequired
    Body
    idstringRequired
    namestringRequired

    Name field

    activebooleanOptional

    This configuration will only take effect when the flag is set to true

    Default: false
    filterstring · enumOptionalPossible values:
    formatstring · enumRequired

    Format of the log row that will be exported

    Possible values:
    Responses
    200

    Log Exporter configuration updated successfully

    application/json
    422

    Validation Error

    application/json
    put
    /api/v4.0/conf/{config}/log-exporters/{entry_id}

    Create single Log Exporter configuration

    post

    Create an individual Log Exporter configuration within a configuration

    Path parameters
    configstringRequired
    entry_idstringRequired
    Body
    idstringRequired
    namestringRequired

    Name field

    activebooleanOptional

    This configuration will only take effect when the flag is set to true

    Default: false
    filterstring · enumOptionalPossible values:
    formatstring · enumRequired

    Format of the log row that will be exported

    Possible values:
    Responses
    201

    Log Exporter configuration created successfully

    application/json
    422

    Validation Error

    application/json
    post
    /api/v4.0/conf/{config}/log-exporters/{entry_id}

    Delete single Log Exporter configuration

    delete

    Delete an individual Log Exporter configuration from the specified configuration

    Path parameters
    configstringRequired
    entry_idstringRequired
    Responses
    200

    Log Exporter configuration deleted successfully

    application/json
    422

    Validation Error

    application/json
    delete
    /api/v4.0/conf/{config}/log-exporters/{entry_id}

    Get Log Exporters version list

    get

    Get list of versions of Log Exporters in a configuration

    Path parameters
    configstringRequired
    Responses
    200

    Log Exporters version list retrieved successfully

    application/json
    422

    Validation Error

    application/json
    get
    /api/v4.0/conf/{config}/log-exporters/versions

    Get version of Log Exporters

    get

    Get a specific version of an Log Exporter configuration

    Path parameters
    configstringRequired
    versionstringRequired
    Responses
    200

    Log Exporter configuration version retrieved successfully

    application/json
    422

    Validation Error

    application/json
    get
    /api/v4.0/conf/{config}/log-exporters/versions/{version}

    Revert Log Exporters to the specified version

    put

    Set a previous Log Exporters version to be the current one

    Path parameters
    configstringRequired
    versionstringRequired
    Responses
    200

    Log Exporters reversion was successful

    application/json
    422

    Validation Error

    application/json
    put
    /api/v4.0/conf/{config}/log-exporters/versions/{version}/revert

    Get Flow Control Policies

    get

    Get all Flow Control Policies in a configuration

    Path parameters
    configstringRequired
    Responses
    200

    Flow Control Policies retrieved successfully

    application/json
    get
    /api/v4.0/conf/{config}/flow-control-policies
    200

    Flow Control Policies retrieved successfully

    Modify Flow Control Policies

    put

    Update an existing set of Flow Control Policies for a configuration

    Path parameters
    configstringRequired
    Bodyobject · FlowControl[]
    activebooleanRequired

    This flow is active

    descriptionany ofOptionalDefault: ""
    stringOptional
    or
    nullOptional
    excludestring[]Optional

    Tags describing requests to exclude from the flow control rule

    Default: []
    idstringRequired
    includestring[]Optional

    Tags describing requests to include in the flow control rule

    Default: []
    namestring · min: 1Required
    tagsstring[]Optional

    List of tags to apply

    Default: []
    timeframenumberRequired

    The time in which to limit the requests according to the threshold

    Responses
    200

    Flow Control Policies updated successfully

    application/json
    422

    Validation Error

    application/json
    put
    /api/v4.0/conf/{config}/flow-control-policies

    Create Flow Control Policies

    post

    Create a complete set of Flow Control Policies for a configuration

    Path parameters
    configstringRequired
    Bodyobject · FlowControl[]
    activebooleanRequired

    This flow is active

    descriptionany ofOptionalDefault: ""
    stringOptional
    or
    nullOptional
    excludestring[]Optional

    Tags describing requests to exclude from the flow control rule

    Default: []
    idstringRequired
    includestring[]Optional

    Tags describing requests to include in the flow control rule

    Default: []
    namestring · min: 1Required
    tagsstring[]Optional

    List of tags to apply

    Default: []
    timeframenumberRequired

    The time in which to limit the requests according to the threshold

    Responses
    201

    Flow Control Policies created successfully

    application/json
    422

    Validation Error

    application/json
    post
    /api/v4.0/conf/{config}/flow-control-policies

    Delete Flow Control Policies

    delete

    Delete all Flow Control Policies in a configuration

    Path parameters
    configstringRequired
    Responses
    200

    Flow Control Policies deleted successfully

    application/json
    422

    Validation Error

    application/json
    delete
    /api/v4.0/conf/{config}/flow-control-policies

    Get specific Flow Control Policy

    get

    Get a Flow Control Policy from the specified configuration

    Path parameters
    configstringRequired
    entry_idstringRequired
    Responses
    200

    Flow Control Policy retrieved successfully

    application/json
    422

    Validation Error

    application/json
    get
    /api/v4.0/conf/{config}/flow-control-policies/{entry_id}

    Modify a single Flow Control Policy

    put

    Update an individual Flow Control Policy within a configuration

    Path parameters
    configstringRequired
    entry_idstringRequired
    Body
    activebooleanRequired

    This flow is active

    descriptionany ofOptionalDefault: ""
    stringOptional
    or
    nullOptional
    excludestring[]Optional

    Tags describing requests to exclude from the flow control rule

    Default: []
    idstringRequired
    includestring[]Optional

    Tags describing requests to include in the flow control rule

    Default: []
    namestring · min: 1Required
    tagsstring[]Optional

    List of tags to apply

    Default: []
    timeframenumberRequired

    The time in which to limit the requests according to the threshold

    Responses
    200

    Flow Control Policy updated successfully

    application/json
    422

    Validation Error

    application/json
    put
    /api/v4.0/conf/{config}/flow-control-policies/{entry_id}

    Create single Flow Control Policy

    post

    Create an individual Flow Control Policy within a configuration

    Path parameters
    configstringRequired
    entry_idstringRequired
    Body
    activebooleanRequired

    This flow is active

    descriptionany ofOptionalDefault: ""
    stringOptional
    or
    nullOptional
    excludestring[]Optional

    Tags describing requests to exclude from the flow control rule

    Default: []
    idstringRequired
    includestring[]Optional

    Tags describing requests to include in the flow control rule

    Default: []
    namestring · min: 1Required
    tagsstring[]Optional

    List of tags to apply

    Default: []
    timeframenumberRequired

    The time in which to limit the requests according to the threshold

    Responses
    201

    Flow Control Policy created successfully

    application/json
    422

    Validation Error

    application/json
    post
    /api/v4.0/conf/{config}/flow-control-policies/{entry_id}

    Delete single Flow Control Policy

    delete

    Delete an individual Flow Control Policy from the specified configuration

    Path parameters
    configstringRequired
    entry_idstringRequired
    Responses
    200

    Flow Control Policy deleted successfully

    application/json
    422

    Validation Error

    application/json
    delete
    /api/v4.0/conf/{config}/flow-control-policies/{entry_id}

    Get Flow Control Policies version list

    get

    Get list of versions of Flow Control Policies in a configuration

    Path parameters
    configstringRequired
    Responses
    200

    Flow Control Policies version list retrieved successfully

    application/json
    422

    Validation Error

    application/json
    get
    /api/v4.0/conf/{config}/flow-control-policies/versions

    Get version of Flow Control Policy

    get

    Get a specific version of a Flow Control Policy

    Path parameters
    configstringRequired
    versionstringRequired
    Responses
    200

    Flow Control Policy retrieved successfully

    application/json
    422

    Validation Error

    application/json
    get
    /api/v4.0/conf/{config}/flow-control-policies/versions/{version}

    Revert a Flow Control Policy to the specified version

    put

    Set a previous Flow Control Policy version to be the current one

    Path parameters
    configstringRequired
    versionstringRequired
    Responses
    200

    Flow Control Policy reversion was successful

    application/json
    422

    Validation Error

    application/json
    put
    /api/v4.0/conf/{config}/flow-control-policies/versions/{version}/revert

    List Certificates

    get

    Get a list of the planet's certificates for a configuration

    Path parameters
    configstringRequired
    Responses
    200

    Certificates were retrieved successfully

    application/json
    500

    Internal Server Error

    application/json
    get
    /api/v4.0/conf/{config}/certificates

    Get Certificate

    get

    Get a specific Certificate for a configuration

    Path parameters
    configstringRequired
    entry_idstringRequired
    Responses
    200

    Certificate was retrieved successfully

    application/json
    422

    Validation Error

    application/json
    500

    Internal Server Error

    application/json
    get
    /api/v4.0/conf/{config}/certificates/{entry_id}

    Modify Certificate

    put

    Change settings for a specific certificate. ("le_" parameters refer to Let's Encrypt.)

    Path parameters
    configstringRequired
    entry_idstringRequired
    Query parameters
    le_auto_renewbooleanOptionalDefault: true
    le_auto_replacebooleanOptionalDefault: true
    replace_cert_idstringOptional
    Responses
    200

    Certificate modified successfully

    No content

    422

    Validation Error

    application/json
    put
    /api/v4.0/conf/{config}/certificates/{entry_id}

    No content

    Add Certificate

    post

    Create new certificate for a specific list of domains. Generate new certificate or upload existing one based on input parameters. "le_" parameters refer to Let's Encrypt.

    Path parameters
    configstringRequired
    entry_idstringRequiredPattern: (?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?)
    Query parameters
    domainsstring[]OptionalDefault: []
    Body
    Responses
    201

    Certificate created

    application/json
    422

    Validation Error

    application/json
    post
    /api/v4.0/conf/{config}/certificates/{entry_id}

    Delete Certificate

    delete

    Delete an individual Certificate from the specified configuration

    Path parameters
    configstringRequired
    entry_idstringRequired
    Responses
    200

    Certificate deleted successfully

    No content

    400

    Input Error

    application/json
    422

    Validation Error

    application/json
    500

    Internal Server Error

    application/json
    delete
    /api/v4.0/conf/{config}/certificates/{entry_id}

    No content

    Get Certificate PEM

    get
    Path parameters
    configstringRequired
    entry_idstringRequired
    Responses
    200

    Certificate's PEM retrieved successfully

    application/x-pem-file
    Responsestring · binary
    400

    Input Error

    application/json
    422

    Validation Error

    application/json
    500

    Internal Server Error

    application/json
    get
    /api/v4.0/conf/{config}/certificates/{entry_id}/pem

    Get Certificate PFX

    get
    Path parameters
    configstringRequired
    entry_idstringRequired
    Responses
    200

    Certificate's PFX retrieved successfully

    application/json
    Responsestring · binary
    400

    Input Error

    application/json
    422

    Validation Error

    application/json
    500

    Internal Server Error

    application/json
    get
    /api/v4.0/conf/{config}/certificates/{entry_id}/pfx

    Get traffic data from logs

    get

    Retrieve traffic data using 'filters' parameter, explained at https://gb.docs.reblaze.com/reference-information/api/api-access-to-traffic-data

    Query parameters
    limitinteger · min: 1 · max: 2500OptionalDefault: 100
    offsetintegerOptionalDefault: 0
    filtersstringOptional

    Filters for request in format selected below (JSON or query string)

    Example: {"AND":[{"field":"timestamp","op":"between","value":["2024-06-06 09:31:00","2024-06-06 09:36:00"]},{"field":"status","op":"eq","value":301}]}
    debugbooleanOptional

    if set to true the request will return rendered SQL without running it, for debug purposes

    Example: true | false
    save_historybooleanOptional

    if set to true the query will be saved in the query history

    Example: true | false
    Header parameters
    providerstring · enumOptional

    Database to get data from

    Example: bigqueryPossible values:
    syntaxstringOptional

    syntax of query

    Example: json
    Responses
    200

    Logs has been received successfully

    application/json
    4XX

    Misconfigured request

    application/json
    get
    /api/v4.0/data/logs
    GET /api/v4.0/conf/{config}/content-filter-profiles HTTP/1.1
    Host: 
    Accept: */*
    
    {
      "total": 1,
      "items": [
        {
          "action": "",
          "active": [
            "text"
          ],
          "allsections": {
            "enable_max_count": true,
            "enable_max_length": true,
            "max_count": 1,
            "max_length": 1,
            "names": [
              {
                "ignore_cf_rule_tags": [
                  "text"
                ],
                "key": "",
                "mask": false,
                "reg": "",
                "restrict": true
              }
            ],
            "regex": [
              {
                "ignore_cf_rule_tags": [
                  "text"
                ],
                "key": "",
                "mask": false,
                "reg": "",
                "restrict": true
              }
            ]
          },
          "args": {
            "enable_max_count": true,
            "enable_max_length": true,
            "max_count": 1,
            "max_length": 1,
            "names": [
              {
                "ignore_cf_rule_tags": [
                  "text"
                ],
                "key": "",
                "mask": false,
                "reg": "",
                "restrict": true
              }
            ],
            "regex": [
              {
                "ignore_cf_rule_tags": [
                  "text"
                ],
                "key": "",
                "mask": false,
                "reg": "",
                "restrict": true
              }
            ]
          },
          "content_type": [
            "text"
          ],
          "cookies": {
            "enable_max_count": true,
            "enable_max_length": true,
            "max_count": 1,
            "max_length": 1,
            "names": [
              {
                "ignore_cf_rule_tags": [
                  "text"
                ],
                "key": "",
                "mask": false,
                "reg": "",
                "restrict": true
              }
            ],
            "regex": [
              {
                "ignore_cf_rule_tags": [
                  "text"
                ],
                "key": "",
                "mask": false,
                "reg": "",
                "restrict": true
              }
            ]
          },
          "decoding": {
            "base64": true,
            "dual": false,
            "html": false,
            "unicode": false
          },
          "description": "",
          "graphql_path": "",
          "headers": {
            "enable_max_count": true,
            "enable_max_length": true,
            "max_count": 1,
            "max_length": 1,
            "names": [
              {
                "ignore_cf_rule_tags": [
                  "text"
                ],
                "key": "",
                "mask": false,
                "reg": "",
                "restrict": true
              }
            ],
            "regex": [
              {
                "ignore_cf_rule_tags": [
                  "text"
                ],
                "key": "",
                "mask": false,
                "reg": "",
                "restrict": true
              }
            ]
          },
          "id": "text",
          "ignore": [
            "text"
          ],
          "ignore_alphanum": true,
          "ignore_body": false,
          "masking_seed": "text",
          "name": "text",
          "path": {
            "enable_max_count": true,
            "enable_max_length": true,
            "max_count": 1,
            "max_length": 1,
            "names": [
              {
                "ignore_cf_rule_tags": [
                  "text"
                ],
                "key": "",
                "mask": false,
                "reg": "",
                "restrict": true
              }
            ],
            "regex": [
              {
                "ignore_cf_rule_tags": [
                  "text"
                ],
                "key": "",
                "mask": false,
                "reg": "",
                "restrict": true
              }
            ]
          },
          "report": [
            "text"
          ],
          "tags": [
            "text"
          ]
        }
      ]
    }
    POST /api/v4.0/conf/{config}/content-filter-profiles HTTP/1.1
    Host: 
    Content-Type: application/json
    Accept: */*
    Content-Length: 1652
    
    [
      {
        "action": "",
        "active": [
          "text"
        ],
        "allsections": {
          "enable_max_count": true,
          "enable_max_length": true,
          "max_count": 1,
          "max_length": 1,
          "names": [
            {
              "ignore_cf_rule_tags": [
                "text"
              ],
              "key": "",
              "mask": false,
              "reg": "",
              "restrict": true
            }
          ],
          "regex": [
            {
              "ignore_cf_rule_tags": [
                "text"
              ],
              "key": "",
              "mask": false,
              "reg": "",
              "restrict": true
            }
          ]
        },
        "args": {
          "enable_max_count": true,
          "enable_max_length": true,
          "max_count": 1,
          "max_length": 1,
          "names": [
            {
              "ignore_cf_rule_tags": [
                "text"
              ],
              "key": "",
              "mask": false,
              "reg": "",
              "restrict": true
            }
          ],
          "regex": [
            {
              "ignore_cf_rule_tags": [
                "text"
              ],
              "key": "",
              "mask": false,
              "reg": "",
              "restrict": true
            }
          ]
        },
        "content_type": [
          "text"
        ],
        "cookies": {
          "enable_max_count": true,
          "enable_max_length": true,
          "max_count": 1,
          "max_length": 1,
          "names": [
            {
              "ignore_cf_rule_tags": [
                "text"
              ],
              "key": "",
              "mask": false,
              "reg": "",
              "restrict": true
            }
          ],
          "regex": [
            {
              "ignore_cf_rule_tags": [
                "text"
              ],
              "key": "",
              "mask": false,
              "reg": "",
              "restrict": true
            }
          ]
        },
        "decoding": {
          "base64": true,
          "dual": false,
          "html": false,
          "unicode": false
        },
        "description": "",
        "graphql_path": "",
        "headers": {
          "enable_max_count": true,
          "enable_max_length": true,
          "max_count": 1,
          "max_length": 1,
          "names": [
            {
              "ignore_cf_rule_tags": [
                "text"
              ],
              "key": "",
              "mask": false,
              "reg": "",
              "restrict": true
            }
          ],
          "regex": [
            {
              "ignore_cf_rule_tags": [
                "text"
              ],
              "key": "",
              "mask": false,
              "reg": "",
              "restrict": true
            }
          ]
        },
        "id": "text",
        "ignore": [
          "text"
        ],
        "ignore_alphanum": true,
        "ignore_body": false,
        "masking_seed": "text",
        "name": "text",
        "path": {
          "enable_max_count": true,
          "enable_max_length": true,
          "max_count": 1,
          "max_length": 1,
          "names": [
            {
              "ignore_cf_rule_tags": [
                "text"
              ],
              "key": "",
              "mask": false,
              "reg": "",
              "restrict": true
            }
          ],
          "regex": [
            {
              "ignore_cf_rule_tags": [
                "text"
              ],
              "key": "",
              "mask": false,
              "reg": "",
              "restrict": true
            }
          ]
        },
        "report": [
          "text"
        ],
        "tags": [
          "text"
        ]
      }
    ]
    DELETE /api/v4.0/conf/{config}/content-filter-profiles HTTP/1.1
    Host: 
    Accept: */*
    
    {
      "message": "Successfully deleted entry"
    }
    GET /api/v4.0/conf/{config}/content-filter-profiles/{entry_id} HTTP/1.1
    Host: 
    Accept: */*
    
    {
      "action": "",
      "active": [
        "text"
      ],
      "allsections": {
        "enable_max_count": true,
        "enable_max_length": true,
        "max_count": 1,
        "max_length": 1,
        "names": [
          {
            "ignore_cf_rule_tags": [
              "text"
            ],
            "key": "",
            "mask": false,
            "reg": "",
            "restrict": true
          }
        ],
        "regex": [
          {
            "ignore_cf_rule_tags": [
              "text"
            ],
            "key": "",
            "mask": false,
            "reg": "",
            "restrict": true
          }
        ]
      },
      "args": {
        "enable_max_count": true,
        "enable_max_length": true,
        "max_count": 1,
        "max_length": 1,
        "names": [
          {
            "ignore_cf_rule_tags": [
              "text"
            ],
            "key": "",
            "mask": false,
            "reg": "",
            "restrict": true
          }
        ],
        "regex": [
          {
            "ignore_cf_rule_tags": [
              "text"
            ],
            "key": "",
            "mask": false,
            "reg": "",
            "restrict": true
          }
        ]
      },
      "content_type": [
        "text"
      ],
      "cookies": {
        "enable_max_count": true,
        "enable_max_length": true,
        "max_count": 1,
        "max_length": 1,
        "names": [
          {
            "ignore_cf_rule_tags": [
              "text"
            ],
            "key": "",
            "mask": false,
            "reg": "",
            "restrict": true
          }
        ],
        "regex": [
          {
            "ignore_cf_rule_tags": [
              "text"
            ],
            "key": "",
            "mask": false,
            "reg": "",
            "restrict": true
          }
        ]
      },
      "decoding": {
        "base64": true,
        "dual": false,
        "html": false,
        "unicode": false
      },
      "description": "",
      "graphql_path": "",
      "headers": {
        "enable_max_count": true,
        "enable_max_length": true,
        "max_count": 1,
        "max_length": 1,
        "names": [
          {
            "ignore_cf_rule_tags": [
              "text"
            ],
            "key": "",
            "mask": false,
            "reg": "",
            "restrict": true
          }
        ],
        "regex": [
          {
            "ignore_cf_rule_tags": [
              "text"
            ],
            "key": "",
            "mask": false,
            "reg": "",
            "restrict": true
          }
        ]
      },
      "id": "text",
      "ignore": [
        "text"
      ],
      "ignore_alphanum": true,
      "ignore_body": false,
      "masking_seed": "text",
      "name": "text",
      "path": {
        "enable_max_count": true,
        "enable_max_length": true,
        "max_count": 1,
        "max_length": 1,
        "names": [
          {
            "ignore_cf_rule_tags": [
              "text"
            ],
            "key": "",
            "mask": false,
            "reg": "",
            "restrict": true
          }
        ],
        "regex": [
          {
            "ignore_cf_rule_tags": [
              "text"
            ],
            "key": "",
            "mask": false,
            "reg": "",
            "restrict": true
          }
        ]
      },
      "report": [
        "text"
      ],
      "tags": [
        "text"
      ]
    }
    GET /api/v4.0/conf/{config}/content-filter-profiles/versions HTTP/1.1
    Host: 
    Accept: */*
    
    {
      "total": 1,
      "items": [
        {
          "author": "text",
          "email": "[email protected]",
          "message": "text",
          "date": "2025-12-15T13:59:37.020Z",
          "version": "42bcc1282349db1e5791484c3d69420b1d8a8bc1",
          "parents": [
            "f44073242093228b45bff7eb7a065559fa9b46aa"
          ]
        }
      ]
    }
    PUT /api/v4.0/conf/{config}/content-filter-profiles/versions/{version}/revert HTTP/1.1
    Host: 
    Accept: */*
    
    {
      "message": "Successfully updated entry"
    }
    {
      "message": "Successfully created entry"
    }
    GET /api/v4.0/conf/{config}/mobile-application-groups HTTP/1.1
    Host: 
    Accept: */*
    
    {
      "total": 1,
      "items": []
    }
    GET /api/v4.0/conf/{config}/mobile-application-groups/{entry_id} HTTP/1.1
    Host: 
    Accept: */*
    
    {
      "id": "text",
      "name": "text",
      "description": "text",
      "uid_header": "text",
      "grace": "text",
      "active_config": [],
      "signatures": [
        {
          "active": true,
          "hash": "text",
          "name": "text"
        }
      ]
    }
    PUT /api/v4.0/conf/{config}/mobile-application-groups/{entry_id} HTTP/1.1
    Host: 
    Content-Type: application/json
    Accept: */*
    Content-Length: 161
    
    {
      "id": "text",
      "name": "text",
      "description": "text",
      "uid_header": "text",
      "grace": "text",
      "active_config": [],
      "signatures": [
        {
          "active": true,
          "hash": "text",
          "name": "text"
        }
      ]
    }
    {
      "message": "Successfully updated entry"
    }
    POST /api/v4.0/conf/{config}/mobile-application-groups/{entry_id} HTTP/1.1
    Host: 
    Content-Type: application/json
    Accept: */*
    Content-Length: 161
    
    {
      "id": "text",
      "name": "text",
      "description": "text",
      "uid_header": "text",
      "grace": "text",
      "active_config": [],
      "signatures": [
        {
          "active": true,
          "hash": "text",
          "name": "text"
        }
      ]
    }
    {
      "message": "Successfully created entry"
    }
    DELETE /api/v4.0/conf/{config}/mobile-application-groups/{entry_id} HTTP/1.1
    Host: 
    Accept: */*
    
    {
      "message": "Successfully deleted entry"
    }
    {
      "message": "Successfully updated entry"
    }
    {
      "message": "Successfully created entry"
    }
    {
      "message": "Successfully updated entry"
    }
    {
      "message": "Successfully created entry"
    }
    GET /api/v4.0/conf/{config}/flow-control-policies HTTP/1.1
    Host: 
    Accept: */*
    
    {
      "total": 1,
      "items": [
        {
          "active": true,
          "description": "",
          "exclude": [
            "text"
          ],
          "id": "text",
          "include": [
            "text"
          ],
          "key": [
            {
              "args": "text",
              "attrs": "asnFlowSef",
              "cookies": "text",
              "headers": "text",
              "plugins": "text"
            }
          ],
          "name": "text",
          "steps": [
            {
              "args": {
                "ANY_ADDITIONAL_PROPERTY": "text"
              },
              "cookies": {
                "ANY_ADDITIONAL_PROPERTY": "text"
              },
              "headers": {
                "ANY_ADDITIONAL_PROPERTY": "text"
              },
              "method": "GET",
              "plugins": {
                "ANY_ADDITIONAL_PROPERTY": "text"
              },
              "uri": "text"
            }
          ],
          "tags": [
            "text"
          ],
          "timeframe": 1
        }
      ]
    }
    PUT /api/v4.0/conf/{config}/flow-control-policies HTTP/1.1
    Host: 
    Content-Type: application/json
    Accept: */*
    Content-Length: 441
    
    [
      {
        "active": true,
        "description": "",
        "exclude": [
          "text"
        ],
        "id": "text",
        "include": [
          "text"
        ],
        "key": [
          {
            "args": "text",
            "attrs": "asnFlowSef",
            "cookies": "text",
            "headers": "text",
            "plugins": "text"
          }
        ],
        "name": "text",
        "steps": [
          {
            "args": {
              "ANY_ADDITIONAL_PROPERTY": "text"
            },
            "cookies": {
              "ANY_ADDITIONAL_PROPERTY": "text"
            },
            "headers": {
              "ANY_ADDITIONAL_PROPERTY": "text"
            },
            "method": "GET",
            "plugins": {
              "ANY_ADDITIONAL_PROPERTY": "text"
            },
            "uri": "text"
          }
        ],
        "tags": [
          "text"
        ],
        "timeframe": 1
      }
    ]
    POST /api/v4.0/conf/{config}/flow-control-policies HTTP/1.1
    Host: 
    Content-Type: application/json
    Accept: */*
    Content-Length: 441
    
    [
      {
        "active": true,
        "description": "",
        "exclude": [
          "text"
        ],
        "id": "text",
        "include": [
          "text"
        ],
        "key": [
          {
            "args": "text",
            "attrs": "asnFlowSef",
            "cookies": "text",
            "headers": "text",
            "plugins": "text"
          }
        ],
        "name": "text",
        "steps": [
          {
            "args": {
              "ANY_ADDITIONAL_PROPERTY": "text"
            },
            "cookies": {
              "ANY_ADDITIONAL_PROPERTY": "text"
            },
            "headers": {
              "ANY_ADDITIONAL_PROPERTY": "text"
            },
            "method": "GET",
            "plugins": {
              "ANY_ADDITIONAL_PROPERTY": "text"
            },
            "uri": "text"
          }
        ],
        "tags": [
          "text"
        ],
        "timeframe": 1
      }
    ]
    DELETE /api/v4.0/conf/{config}/flow-control-policies HTTP/1.1
    Host: 
    Accept: */*
    
    {
      "message": "Successfully deleted entry"
    }
    GET /api/v4.0/conf/{config}/flow-control-policies/{entry_id} HTTP/1.1
    Host: 
    Accept: */*
    
    {
      "active": true,
      "description": "",
      "exclude": [
        "text"
      ],
      "id": "text",
      "include": [
        "text"
      ],
      "key": [
        {
          "args": "text",
          "attrs": "asnFlowSef",
          "cookies": "text",
          "headers": "text",
          "plugins": "text"
        }
      ],
      "name": "text",
      "steps": [
        {
          "args": {
            "ANY_ADDITIONAL_PROPERTY": "text"
          },
          "cookies": {
            "ANY_ADDITIONAL_PROPERTY": "text"
          },
          "headers": {
            "ANY_ADDITIONAL_PROPERTY": "text"
          },
          "method": "GET",
          "plugins": {
            "ANY_ADDITIONAL_PROPERTY": "text"
          },
          "uri": "text"
        }
      ],
      "tags": [
        "text"
      ],
      "timeframe": 1
    }
    PUT /api/v4.0/conf/{config}/flow-control-policies/{entry_id} HTTP/1.1
    Host: 
    Content-Type: application/json
    Accept: */*
    Content-Length: 439
    
    {
      "active": true,
      "description": "",
      "exclude": [
        "text"
      ],
      "id": "text",
      "include": [
        "text"
      ],
      "key": [
        {
          "args": "text",
          "attrs": "asnFlowSef",
          "cookies": "text",
          "headers": "text",
          "plugins": "text"
        }
      ],
      "name": "text",
      "steps": [
        {
          "args": {
            "ANY_ADDITIONAL_PROPERTY": "text"
          },
          "cookies": {
            "ANY_ADDITIONAL_PROPERTY": "text"
          },
          "headers": {
            "ANY_ADDITIONAL_PROPERTY": "text"
          },
          "method": "GET",
          "plugins": {
            "ANY_ADDITIONAL_PROPERTY": "text"
          },
          "uri": "text"
        }
      ],
      "tags": [
        "text"
      ],
      "timeframe": 1
    }
    POST /api/v4.0/conf/{config}/flow-control-policies/{entry_id} HTTP/1.1
    Host: 
    Content-Type: application/json
    Accept: */*
    Content-Length: 439
    
    {
      "active": true,
      "description": "",
      "exclude": [
        "text"
      ],
      "id": "text",
      "include": [
        "text"
      ],
      "key": [
        {
          "args": "text",
          "attrs": "asnFlowSef",
          "cookies": "text",
          "headers": "text",
          "plugins": "text"
        }
      ],
      "name": "text",
      "steps": [
        {
          "args": {
            "ANY_ADDITIONAL_PROPERTY": "text"
          },
          "cookies": {
            "ANY_ADDITIONAL_PROPERTY": "text"
          },
          "headers": {
            "ANY_ADDITIONAL_PROPERTY": "text"
          },
          "method": "GET",
          "plugins": {
            "ANY_ADDITIONAL_PROPERTY": "text"
          },
          "uri": "text"
        }
      ],
      "tags": [
        "text"
      ],
      "timeframe": 1
    }
    DELETE /api/v4.0/conf/{config}/flow-control-policies/{entry_id} HTTP/1.1
    Host: 
    Accept: */*
    
    {
      "message": "Successfully deleted entry"
    }
    GET /api/v4.0/conf/{config}/flow-control-policies/versions HTTP/1.1
    Host: 
    Accept: */*
    
    {
      "total": 1,
      "items": [
        {
          "author": "text",
          "email": "[email protected]",
          "message": "text",
          "date": "2025-12-15T13:59:37.020Z",
          "version": "42bcc1282349db1e5791484c3d69420b1d8a8bc1",
          "parents": [
            "f44073242093228b45bff7eb7a065559fa9b46aa"
          ]
        }
      ]
    }
    GET /api/v4.0/conf/{config}/flow-control-policies/versions/{version} HTTP/1.1
    Host: 
    Accept: */*
    
    {
      "total": 1,
      "items": [
        {
          "active": true,
          "description": "",
          "exclude": [
            "text"
          ],
          "id": "text",
          "include": [
            "text"
          ],
          "key": [
            {
              "args": "text",
              "attrs": "asnFlowSef",
              "cookies": "text",
              "headers": "text",
              "plugins": "text"
            }
          ],
          "name": "text",
          "steps": [
            {
              "args": {
                "ANY_ADDITIONAL_PROPERTY": "text"
              },
              "cookies": {
                "ANY_ADDITIONAL_PROPERTY": "text"
              },
              "headers": {
                "ANY_ADDITIONAL_PROPERTY": "text"
              },
              "method": "GET",
              "plugins": {
                "ANY_ADDITIONAL_PROPERTY": "text"
              },
              "uri": "text"
            }
          ],
          "tags": [
            "text"
          ],
          "timeframe": 1
        }
      ]
    }
    PUT /api/v4.0/conf/{config}/flow-control-policies/versions/{version}/revert HTTP/1.1
    Host: 
    Accept: */*
    
    {
      "message": "Successfully updated entry"
    }
    {
      "message": "Successfully created entry"
    }
    GET /api/v4.0/conf/{config}/certificates HTTP/1.1
    Host: 
    Accept: */*
    
    {
      "total": 1,
      "items": [
        {
          "cert_body": "text",
          "expires": "2025-12-15",
          "id": "text",
          "issuer": "text",
          "le_auto_renew": true,
          "le_auto_replace": true,
          "le_hash": "",
          "private_key": "text",
          "san": [
            "text"
          ],
          "subject": "text",
          "uploaded": "2025-12-15T13:59:37.020Z",
          "revoked": false,
          "crl": [
            "text"
          ],
          "cdp": [
            "text"
          ],
          "side": "server"
        }
      ]
    }
    GET /api/v4.0/conf/{config}/certificates/{entry_id} HTTP/1.1
    Host: 
    Accept: */*
    
    {
      "links": [
        {
          "link": "text",
          "provider": "text",
          "region": "text"
        }
      ],
      "cert_body": "text",
      "expires": "2025-12-15",
      "id": "text",
      "issuer": "text",
      "le_auto_renew": true,
      "le_auto_replace": true,
      "le_hash": "",
      "private_key": "text",
      "san": [
        "text"
      ],
      "subject": "text",
      "uploaded": "2025-12-15T13:59:37.020Z",
      "revoked": false,
      "crl": [
        "text"
      ],
      "cdp": [
        "text"
      ],
      "side": "server"
    }
    PUT /api/v4.0/conf/{config}/certificates/{entry_id} HTTP/1.1
    Host: 
    Accept: */*
    
    POST /api/v4.0/conf/{config}/certificates/{entry_id} HTTP/1.1
    Host: 
    Content-Type: application/json
    Accept: */*
    Content-Length: 350
    
    {
      "provider_links": [
        {
          "link": "text",
          "provider": "text",
          "region": "text"
        }
      ],
      "cert_body": "text",
      "expires": "2025-12-15",
      "id": "text",
      "issuer": "text",
      "le_auto_renew": true,
      "le_auto_replace": true,
      "le_hash": "",
      "private_key": "text",
      "san": [
        "text"
      ],
      "subject": "text",
      "uploaded": "2025-12-15T13:59:37.020Z",
      "revoked": false,
      "crl": [
        "text"
      ],
      "cdp": [
        "text"
      ],
      "side": "server"
    }
    DELETE /api/v4.0/conf/{config}/certificates/{entry_id} HTTP/1.1
    Host: 
    Accept: */*
    
    GET /api/v4.0/conf/{config}/certificates/{entry_id}/pem HTTP/1.1
    Host: 
    Accept: */*
    
    binary
    GET /api/v4.0/conf/{config}/certificates/{entry_id}/pfx HTTP/1.1
    Host: 
    Accept: */*
    
    binary
    GET /api/v4.0/conf/{config}/log-exporters HTTP/1.1
    Host: 
    Accept: */*
    
    {
      "total": 1,
      "items": [
        {
          "id": "text",
          "name": "text",
          "active": false,
          "filter": "all",
          "format": "custom_syslog",
          "server_groups": {
            "all": true,
            "ids": [
              "text"
            ]
          },
          "connection": {
            "host": "https://example.com",
            "port": 1,
            "protocol": "text",
            "tls_mode": "no_tls",
            "certificate": {
              "chain_data": [],
              "cert_body": "text"
            }
          }
        }
      ]
    }
    GET /api/v4.0/conf/{config}/log-exporters/{entry_id} HTTP/1.1
    Host: 
    Accept: */*
    
    {
      "id": "text",
      "name": "text",
      "active": false,
      "filter": "all",
      "format": "custom_syslog",
      "server_groups": {
        "all": true,
        "ids": [
          "text"
        ]
      },
      "connection": {
        "host": "https://example.com",
        "port": 1,
        "protocol": "text",
        "tls_mode": "no_tls",
        "certificate": {
          "chain_data": [],
          "cert_body": "text"
        }
      }
    }
    PUT /api/v4.0/conf/{config}/log-exporters/{entry_id} HTTP/1.1
    Host: 
    Content-Type: application/json
    Accept: */*
    Content-Length: 252
    
    {
      "id": "text",
      "name": "text",
      "active": false,
      "filter": "all",
      "format": "custom_syslog",
      "server_groups": {
        "all": true,
        "ids": [
          "text"
        ]
      },
      "connection": {
        "host": "https://example.com",
        "port": 1,
        "protocol": "text",
        "tls_mode": "no_tls",
        "certificate": {
          "cert_body": "text"
        }
      }
    }
    POST /api/v4.0/conf/{config}/log-exporters/{entry_id} HTTP/1.1
    Host: 
    Content-Type: application/json
    Accept: */*
    Content-Length: 252
    
    {
      "id": "text",
      "name": "text",
      "active": false,
      "filter": "all",
      "format": "custom_syslog",
      "server_groups": {
        "all": true,
        "ids": [
          "text"
        ]
      },
      "connection": {
        "host": "https://example.com",
        "port": 1,
        "protocol": "text",
        "tls_mode": "no_tls",
        "certificate": {
          "cert_body": "text"
        }
      }
    }
    DELETE /api/v4.0/conf/{config}/log-exporters/{entry_id} HTTP/1.1
    Host: 
    Accept: */*
    
    {
      "message": "Successfully deleted entry"
    }
    GET /api/v4.0/conf/{config}/log-exporters/versions HTTP/1.1
    Host: 
    Accept: */*
    
    {
      "total": 1,
      "items": [
        {
          "author": "text",
          "email": "[email protected]",
          "message": "text",
          "date": "2025-12-15T13:59:37.020Z",
          "version": "42bcc1282349db1e5791484c3d69420b1d8a8bc1",
          "parents": [
            "f44073242093228b45bff7eb7a065559fa9b46aa"
          ]
        }
      ]
    }
    GET /api/v4.0/conf/{config}/log-exporters/versions/{version} HTTP/1.1
    Host: 
    Accept: */*
    
    {
      "total": 1,
      "items": [
        {
          "id": "text",
          "name": "text",
          "active": false,
          "filter": "all",
          "format": "custom_syslog",
          "server_groups": {
            "all": true,
            "ids": [
              "text"
            ]
          },
          "connection": {
            "host": "https://example.com",
            "port": 1,
            "protocol": "text",
            "tls_mode": "no_tls",
            "certificate": {
              "chain_data": [],
              "cert_body": "text"
            }
          }
        }
      ]
    }
    PUT /api/v4.0/conf/{config}/log-exporters/versions/{version}/revert HTTP/1.1
    Host: 
    Accept: */*
    
    {
      "message": "Successfully updated entry"
    }
    {
      "message": "Successfully updated entry"
    }
    {
      "message": "Successfully created entry"
    }
    {
      "data": {
        "results": [],
        "statistics": {}
      },
      "status": 1
    }
    GET /api/v4.0/data/logs HTTP/1.1
    Host: 
    Accept: */*