Repository navigation
Add Botstopper pre-policy examples page #540
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Open
hnyasingunaydin
wants to merge
2
commits into
ByteInternet:master
Choose a base branch
from
hnyasingunaydin:botstopper-pre-policy-examples
base: master
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
Changes from all commits
Commits
Show all changes
2 commits
Select commit
Hold shift + click to select a range
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
308 changes: 308 additions & 0 deletions
308
docs/hypernode-platform/botstopper/pre-policy-examples-for-botstopper.md
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,308 @@ | ||
| --- | ||
| myst: | ||
| html_meta: | ||
| description: Ready-to-use Botstopper pre-policy examples for Hypernode, to allow | ||
| trusted bots, monitoring tools, and integrations before the standard rules run. | ||
| title: Pre-Policy Examples for Botstopper | Hypernode | ||
| --- | ||
|
|
||
| # Pre-Policy Examples for Botstopper | ||
|
|
||
| This page contains ready-to-use pre-policy rules for Botstopper. Pre-policy rules run before most of the standard Hypernode deny and challenge rules. Use them to allow trusted traffic, such as monitoring tools, SEO tools, and integrations, or to block very specific traffic early. | ||
|
|
||
| For an explanation of how Botstopper works and how policies are evaluated, see [How to Use Botstopper on Hypernode](./how-to-use-botstopper.md). | ||
|
|
||
| ## How to Add a Pre-Policy | ||
|
|
||
| Pre-policy rules go in `/data/web/botstopper/pre.policy.yml`. This file contains a YAML list of policy rules. | ||
|
|
||
| 1. Open the file as the `app` user: | ||
|
|
||
| ```bash | ||
| sensible-editor /data/web/botstopper/pre.policy.yml | ||
| ``` | ||
|
|
||
| 1. Copy the rule you want to use from the examples below and add it to the list. If the file only contains `[]`, replace it with the rule. | ||
|
|
||
| 1. Save the file and restart Botstopper: | ||
|
|
||
| ```bash | ||
| hypernode-servicectl restart techaro-botstopper@default | ||
| ``` | ||
|
|
||
| 1. Test the result to confirm the rule behaves as expected. | ||
|
|
||
| When you combine multiple rules, make sure the file stays a single valid YAML list. Each rule starts with `- name:`. | ||
|
|
||
| ```{warning} | ||
| Pre-policy rules run before the standard Hypernode rules. A broad `DENY` rule in `pre.policy.yml` can block good crawlers or integrations that the standard policy would otherwise allow. Keep your rules as specific as possible and always test them before using them in production. | ||
| ``` | ||
|
|
||
| ## Examples | ||
|
|
||
| The examples below come from the [Botstopper policy snippets repository](https://github.com/TimVNL/hypernode-botstopper-policies). Each rule is a list item that you can copy into `pre.policy.yml`. | ||
|
|
||
| ```{note} | ||
| The rules below don't include IP addresses, because providers change them regularly. Where a rule uses `remote_addresses`, copy the current IP addresses from the page of the provider that we link to. If a provider doesn't publish its IP addresses, contact that provider to ask which IP addresses they use. | ||
| ``` | ||
|
|
||
| ### Search Engines and SEO Tools | ||
|
|
||
| The standard Hypernode policy already allows known search engine crawlers when they are verified by IP ranges or reverse DNS. Use these rules when you want to make sure a crawler or SEO tool is never challenged. | ||
|
|
||
| #### Google crawlers | ||
|
|
||
| Allows requests with common Google crawler user agents, such as `Googlebot`, `AdsBot-Google`, `Storebot-Google`, `Google-InspectionTool`, and `Google-Site-Verification`. | ||
|
|
||
| ```{note} | ||
| This rule only checks the user agent, which can be spoofed. Bots that pretend to be Googlebot are also allowed. The standard policy already allows Google crawlers that are verified by IP range or reverse DNS, so only use this rule if you notice that a Google service is being challenged. | ||
| ``` | ||
|
|
||
| ```yaml | ||
| - name: allow-all-google-temp | ||
| action: ALLOW | ||
| expression: | ||
| all: | ||
| - userAgent.matches("(?i:(googlebot|adsbot-google|mediapartners-google|apis-google|googleother|feedfetcher-google|storebot-google|google-inspectiontool|google-extended|Google-Apps-Script|Google-Site-Verification))") | ||
| ``` | ||
|
|
||
| #### Ahrefs | ||
|
|
||
| Allows `AhrefsBot` and `AhrefsSiteAudit` from the [IP ranges published by Ahrefs](https://ahrefs.com/robot). Add the current IP addresses from that page under `remote_addresses` before you use the rule. | ||
|
|
||
| ```yaml | ||
| - name: allow-ahrefs-bots | ||
| action: ALLOW | ||
| expression: | ||
| all: | ||
| - userAgent.matches("(?i:(ahrefsbot|ahrefssiteaudit))") | ||
| remote_addresses: | ||
| # Add the current IP addresses from the provider here, for example: | ||
| - 192.0.2.0/24 | ||
| ``` | ||
|
|
||
| #### Semrush Site Audit | ||
|
|
||
| Allows the Semrush `SiteAuditBot` from the [IP range published by Semrush](https://www.semrush.com/kb/681-site-audit-troubleshooting#allowlist-bot). Add the current IP addresses from that page under `remote_addresses` before you use the rule. | ||
|
|
||
| ```yaml | ||
| - name: allow-SiteAuditBot | ||
| action: ALLOW | ||
| user_agent_regex: SiteAuditBot | ||
| remote_addresses: | ||
| # Add the current IP addresses from the provider here, for example: | ||
| - 192.0.2.0/24 | ||
| ``` | ||
|
|
||
| ### AI Retrieval Bots | ||
|
|
||
| #### AI retrieval and citation bots | ||
|
|
||
| Allows known AI retrieval and citation bots, so answer engines and assistant-triggered fetchers can access your shop. This rule allows `PerplexityBot`, `Perplexity-User`, `OAI-SearchBot`, `ChatGPT-User`, and `ClaudeBot`. | ||
|
|
||
| ```{note} | ||
| This rule runs before the configured AI policy, so these bots are allowed regardless of your `botstopper_ai_policy` setting. The rule only checks the user agent, which can be spoofed. | ||
| ``` | ||
|
|
||
| ```yaml | ||
| - name: allow-retrieval-citation-bots | ||
| action: ALLOW | ||
| expression: | ||
| all: | ||
| - userAgent.matches("(?i:(PerplexityBot|Perplexity-User|OAI-SearchBot|ChatGPT-User|ClaudeBot))") | ||
| ``` | ||
|
|
||
| ### Uptime Monitoring | ||
|
|
||
| Uptime monitoring tools request your shop at short intervals. If Botstopper challenges these requests, the monitoring tool reports your shop as down. | ||
|
|
||
| #### HetrixTools | ||
|
|
||
| Allows HetrixTools uptime monitoring from the [IP addresses published by HetrixTools](https://docs.hetrixtools.com/uptime-monitoring-ip-addresses/). Add the current IP addresses from that page under `remote_addresses` before you use the rule. | ||
|
|
||
| ```yaml | ||
| - name: allow-hetrixtools-uptime | ||
| action: ALLOW | ||
| user_agent_regex: HetrixTools | ||
| remote_addresses: | ||
| # Add the current IP addresses from the provider here, for example: | ||
| - 192.0.2.0/24 | ||
| ``` | ||
|
|
||
| #### Oh Dear | ||
|
|
||
| Allows Oh Dear monitoring from the [IP addresses published by Oh Dear](https://ohdear.app/docs/faq/what-ips-does-oh-dear-monitor-from). Add the current IP addresses from that page under `remote_addresses` before you use the rule. | ||
|
|
||
| ```yaml | ||
| - name: allow-ohdear.app | ||
| action: ALLOW | ||
| user_agent_regex: OhDear | ||
| remote_addresses: | ||
| # Add the current IP addresses from the provider here, for example: | ||
| - 192.0.2.0/24 | ||
| ``` | ||
|
|
||
| #### Pingdom | ||
|
|
||
| Allows Pingdom monitoring checks from the [probe server IP addresses published by SolarWinds](https://documentation.solarwinds.com/en/success_center/pingdom/content/topics/pingdom-probe-servers-ip-addresses.htm). Add the current IP addresses from that page under `remote_addresses` before you use the rule. | ||
|
|
||
| ```yaml | ||
| - name: allow-pingdom | ||
| action: ALLOW | ||
| expression: | ||
| all: | ||
| - userAgent.matches("(?i:Pingdom)") | ||
| remote_addresses: | ||
| # Add the current IP addresses from the provider here, for example: | ||
| - 192.0.2.0/24 | ||
| ``` | ||
|
|
||
| #### UptimeRobot | ||
|
|
||
| Allows UptimeRobot monitoring from the [IP addresses published by UptimeRobot](https://uptimerobot.com/help/locations/). Add the current IP addresses from that page under `remote_addresses` before you use the rule. | ||
|
|
||
| ```yaml | ||
| - name: allow-uptimerobot-monitoring | ||
| action: ALLOW | ||
| user_agent_regex: UptimeRobot | ||
| remote_addresses: | ||
| # Add the current IP addresses from the provider here, for example: | ||
| - 192.0.2.0/24 | ||
| ``` | ||
|
|
||
| #### Uptime Kuma | ||
|
|
||
| Allows [Uptime Kuma](https://github.com/louislam/uptime-kuma/wiki), a self-hosted monitoring tool. Because Uptime Kuma runs on your own server, there is no fixed IP range. If you know the IP address of your Uptime Kuma server, add it under `remote_addresses` to make the rule more specific. | ||
|
|
||
| ```yaml | ||
| - name: allow-uptime-kuma | ||
| action: ALLOW | ||
| user_agent_regex: Uptime-Kuma | ||
| ``` | ||
|
|
||
| ### Cookie Consent Scanners | ||
|
|
||
| Cookie consent tools scan your shop to detect which cookies it sets. If Botstopper challenges the scanner, the cookie overview of your consent banner can become incomplete. | ||
|
|
||
| #### Cookiebot | ||
|
|
||
| Allows the Cookiebot scanner from the [IP addresses published by Cookiebot](https://support.cookiebot.com/hc/en-us/articles/360003824153-Whitelisting-the-Cookiebot-scanner). Add the current IP addresses from that page under `remote_addresses` before you use the rule. | ||
|
|
||
| ```yaml | ||
| - name: allow-cookiebot-scanner | ||
| action: ALLOW | ||
| user_agent_regex: Cookiebot | ||
| remote_addresses: | ||
| # Add the current IP addresses from the provider here, for example: | ||
| - 192.0.2.0/24 | ||
| ``` | ||
|
|
||
| #### CookieYes | ||
|
|
||
| Allows the [CookieYes scanner](https://www.cookieyes.com/documentation/cookieyesbot/), `CookieYesbot`. | ||
|
|
||
| ```yaml | ||
| - name: allow-CookieYesbot-scanner | ||
| action: ALLOW | ||
| user_agent_regex: CookieYesbot | ||
| ``` | ||
|
|
||
| ### WordPress Tools | ||
|
|
||
| #### BlogVault | ||
|
|
||
| Allows the BlogVault WordPress backup service from the [IP addresses published by BlogVault](https://app.blogvault.net/api/bv_bots). Add the current IP addresses from that page under `remote_addresses` before you use the rule. | ||
|
|
||
| ```yaml | ||
| - name: allow-blogvault | ||
| action: ALLOW | ||
| remote_addresses: | ||
| # Add the current IP addresses from the provider here, for example: | ||
| - 192.0.2.0/24 | ||
| ``` | ||
|
|
||
| #### InfiniteWP | ||
|
|
||
| Allows [InfiniteWP](https://infinitewp.com), a dashboard to manage multiple WordPress sites. | ||
|
|
||
| ```yaml | ||
| - name: allow-infinitewp | ||
| action: ALLOW | ||
| user_agent_regex: InfiniteWP | ||
| ``` | ||
|
|
||
| #### WP Rocket | ||
|
|
||
| Allows the WP Rocket SaaS service from the [IP ranges published by WP Rocket](https://docs.wp-rocket.me/article/1628-which-ip-do-i-need-to-allow-for-wp-rocket). Add the current IP addresses from that page under `remote_addresses` before you use the rule. | ||
|
|
||
| ```yaml | ||
| - name: allow-wprocket | ||
| action: ALLOW | ||
| user_agent_regex: WP-Rocket-SaaS | ||
| remote_addresses: | ||
| # Add the current IP addresses from the provider here, for example: | ||
| - 192.0.2.0/24 | ||
| ``` | ||
|
|
||
| ### Other Integrations | ||
|
|
||
| #### Sendcloud | ||
|
|
||
| Allows the Sendcloud shipping platform from the [IP addresses published by Sendcloud](https://cdn.sendcloud.com/global-media/public-ips.txt). Add the current IP addresses from that page under `remote_addresses` before you use the rule. | ||
|
|
||
| ```yaml | ||
| - name: allow-sendcloud | ||
| action: ALLOW | ||
| user_agent_regex: (?i)sendcloud | ||
| remote_addresses: | ||
| # Add the current IP addresses from the provider here, for example: | ||
| - 192.0.2.0/24 | ||
| ``` | ||
|
|
||
| #### SleakBot | ||
|
|
||
| Allows `SleakBot`, the crawler of the [Sleak](https://sleak.chat) AI chat assistant. | ||
|
|
||
| ```yaml | ||
| - name: allow-sleakbot | ||
| action: ALLOW | ||
| user_agent_regex: SleakBot | ||
| ``` | ||
|
|
||
| ### Country-Based Rules | ||
|
|
||
| These rules use the `X-Country-Code` header, which contains the country of the visitor's IP address. | ||
|
|
||
| #### Allow visitors from the Benelux | ||
|
|
||
| Allows all traffic from the Netherlands, Belgium, and Luxembourg without a challenge. | ||
|
|
||
| ```{warning} | ||
| This rule allows all traffic from these countries before any other check, including bad bots and scrapers that run from Dutch, Belgian, or Luxembourg IP addresses. | ||
| ``` | ||
|
|
||
| ```yaml | ||
| - name: allow-benelux-without-challenge | ||
| action: ALLOW | ||
| expression: | ||
| all: | ||
| - '"X-Country-Code" in headers' | ||
| - 'headers["X-Country-Code"] in ["NL", "BE", "LU"]' | ||
| ``` | ||
|
|
||
| #### Block visitors from outside the EU, UK, and US | ||
|
|
||
| Blocks all requests from countries outside the EU/EEA, Switzerland, the United Kingdom and its Crown Dependencies, and the United States. Visitors from other countries receive an HTTP `403` response. | ||
|
|
||
| ```{warning} | ||
| This rule runs before the standard Hypernode allow rules. It also blocks crawlers, payment providers, and integrations that connect from other countries. Add trusted services to the WAF allowlist, or add `ALLOW` rules above this rule in `pre.policy.yml`. | ||
| ``` | ||
|
|
||
| ```yaml | ||
| - name: deny-non-eu-uk-us | ||
| action: DENY | ||
| expression: | ||
| all: | ||
| - '"X-Country-Code" in headers' | ||
| - '!(headers["X-Country-Code"] in ["AT", "BE", "BG", "HR", "CY", "CZ", "DK", "EE", "FI", "FR", "DE", "GR", "HU", "IE", "IT", "LV", "LT", "LU", "MT", "NL", "PL", "PT", "RO", "SK", "SI", "ES", "SE", "IS", "LI", "NO", "CH", "GB", "GG", "JE", "IM", "US"])' | ||
| ``` | ||
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.