From cbb595e1c9c46b83c443b3f3443f6e6138ce63fc Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Tue, 28 Nov 2023 08:20:36 +0000
Subject: [PATCH 001/154] deps/terraform: bump hashicorp/kubernetes in
/tests/terraform
Bumps [hashicorp/kubernetes](https://github.com/hashicorp/terraform-provider-kubernetes) from 2.23.0 to 2.24.0.
- [Release notes](https://github.com/hashicorp/terraform-provider-kubernetes/releases)
- [Changelog](https://github.com/hashicorp/terraform-provider-kubernetes/blob/main/CHANGELOG.md)
- [Commits](https://github.com/hashicorp/terraform-provider-kubernetes/compare/v2.23.0...v2.24.0)
---
updated-dependencies:
- dependency-name: hashicorp/kubernetes
dependency-type: direct:production
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot]
---
tests/terraform/providers.tf | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/tests/terraform/providers.tf b/tests/terraform/providers.tf
index 7f95ab487..746f0d728 100644
--- a/tests/terraform/providers.tf
+++ b/tests/terraform/providers.tf
@@ -10,7 +10,7 @@ terraform {
}
kubernetes = {
source = "hashicorp/kubernetes"
- version = "2.23.0"
+ version = "2.24.0"
}
}
}
\ No newline at end of file
From e9737dcf4dbb658cc5d456333e6041c48635905b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Th=C3=A9ophile=20Diot?=
Date: Fri, 8 Dec 2023 08:34:30 +0100
Subject: [PATCH 002/154] Update API endpoint URL of anonymous report
---
src/common/core/misc/jobs/anonymous-report.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/common/core/misc/jobs/anonymous-report.py b/src/common/core/misc/jobs/anonymous-report.py
index f163f77b2..aa8c5978c 100644
--- a/src/common/core/misc/jobs/anonymous-report.py
+++ b/src/common/core/misc/jobs/anonymous-report.py
@@ -45,7 +45,7 @@ try:
data["external_plugins"] = [plugin["id"] for plugin in db.get_plugins(external=True)]
response = post(
- "http://api:8080/data",
+ "https://api.bunkerweb.io/data",
json=data,
headers={"User-Agent": f"BunkerWeb/{data['version']}"},
allow_redirects=True,
From cb76d1c093932953d8c4b28f17aa1fd19ff9b05f Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Fri, 8 Dec 2023 08:37:04 +0000
Subject: [PATCH 003/154] deps/gha: bump github/codeql-action from 2.22.8 to
2.22.9
Bumps [github/codeql-action](https://github.com/github/codeql-action) from 2.22.8 to 2.22.9.
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/github/codeql-action/compare/407ffafae6a767df3e0230c3df91b6443ae8df75...c0d1daa7f7e14667747d73a7dbbe8c074bc8bfe2)
---
updated-dependencies:
- dependency-name: github/codeql-action
dependency-type: direct:production
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot]
---
.github/workflows/codeql.yml | 4 ++--
.github/workflows/scorecards-analysis.yml | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml
index e638fcdcb..18df4ebbf 100644
--- a/.github/workflows/codeql.yml
+++ b/.github/workflows/codeql.yml
@@ -35,12 +35,12 @@ jobs:
python -m pip install --no-cache-dir --require-hashes -r src/common/db/requirements.txt
echo "CODEQL_PYTHON=$(which python)" >> $GITHUB_ENV
- name: Initialize CodeQL
- uses: github/codeql-action/init@407ffafae6a767df3e0230c3df91b6443ae8df75 # v2.22.8
+ uses: github/codeql-action/init@c0d1daa7f7e14667747d73a7dbbe8c074bc8bfe2 # v2.22.9
with:
languages: ${{ matrix.language }}
config-file: ./.github/codeql.yml
setup-python-dependencies: false
- name: Perform CodeQL Analysis
- uses: github/codeql-action/analyze@407ffafae6a767df3e0230c3df91b6443ae8df75 # v2.22.8
+ uses: github/codeql-action/analyze@c0d1daa7f7e14667747d73a7dbbe8c074bc8bfe2 # v2.22.9
with:
category: "/language:${{matrix.language}}"
diff --git a/.github/workflows/scorecards-analysis.yml b/.github/workflows/scorecards-analysis.yml
index 979021677..be1aa521d 100644
--- a/.github/workflows/scorecards-analysis.yml
+++ b/.github/workflows/scorecards-analysis.yml
@@ -25,6 +25,6 @@ jobs:
results_format: sarif
publish_results: true
- name: "Upload SARIF results to code scanning"
- uses: github/codeql-action/upload-sarif@407ffafae6a767df3e0230c3df91b6443ae8df75 # v2.22.8
+ uses: github/codeql-action/upload-sarif@c0d1daa7f7e14667747d73a7dbbe8c074bc8bfe2 # v2.22.9
with:
sarif_file: results.sarif
From 5eb5625a273f47977f4a5d1a708cc4cf3d70db46 Mon Sep 17 00:00:00 2001
From: fl0ppy-d1sk
Date: Fri, 8 Dec 2023 11:43:19 +0100
Subject: [PATCH 004/154] docs - add basic info about bw panel
---
README.md | 51 +++++++++++++++++++++--------------
docs/index.md | 27 ++++++++++---------
docs/overrides/main.html | 4 +--
docs/professional-services.md | 29 ++++++++++++++++++++
mkdocs.yml | 1 +
5 files changed, 77 insertions(+), 35 deletions(-)
create mode 100644 docs/professional-services.md
diff --git a/README.md b/README.md
index e4b3840c7..e2ab87983 100644
--- a/README.md
+++ b/README.md
@@ -18,11 +18,13 @@
- π Website
+ π Website
|
- π Documentation
+ π Documentation
|
- π¨βπ» Demo
+ π¨βπ» Demo
+ |
+ π€ Panel
|
π‘οΈ Examples
|
@@ -30,9 +32,9 @@
|
π Forum
- βοΈ Configurator
+ βοΈ Configurator
|
- πΊοΈ Threatmap
+ πΊοΈ Threatmap
> π‘οΈ Make security by default great again !
@@ -51,25 +53,26 @@ BunkerWeb contains primary [security features](https://docs.bunkerweb.io/1.5.4/s
## Why BunkerWeb ?
-- **Easy integration into existing environments** : support for Linux, Docker, Swarm, Kubernetes, Ansible, Vagrant, ...
-- **Highly customizable** : enable, disable and configure features easily to meet your use case
-- **Secure by default** : offers out-of-the-box and hassle-free minimal security for your web services
-- **Awesome web UI** : keep control of everything more efficiently without the need of the CLI
-- **Plugin system** : extend BunkerWeb to meet your own use-cases
-- **Free as in "freedom"** : licensed under the free [AGPLv3 license](https://www.gnu.org/licenses/agpl-3.0.en.html)
+- **Easy integration into existing environments** : Seamlessly integrate BunkerWeb into various environments such as Linux, Docker, Swarm, Kubernetes and more. Enjoy a smooth transition and hassle-free implementation.
+- **Highly customizable** : Tailor BunkerWeb to your specific requirements with ease. Enable, disable, and configure features effortlessly, allowing you to customize the security settings according to your unique use case.
+- **Secure by default** : BunkerWeb provides out-of-the-box, hassle-free minimal security for your web services. Experience peace of mind and enhanced protection right from the start.
+- **Awesome web UI** : Take control of BunkerWeb more efficiently with the exceptional web user interface (UI). Navigate settings and configurations effortlessly through a user-friendly graphical interface, eliminating the need for the command-line interface (CLI).
+- **Plugin system** : Extend the capabilities of BunkerWeb to meet your own use cases. Seamlessly integrate additional security measures and customize the functionality of BunkerWeb according to your specific requirements.
+- **Free as in "freedom"** : BunkerWeb is licensed under the free [AGPLv3 license](https://www.gnu.org/licenses/agpl-3.0.en.html), embracing the principles of freedom and openness. Enjoy the freedom to use, modify, and distribute the software, backed by a supportive community.
+- **Professional services** : Get technical support, tailored consulting and custom development directly from the maintainers of BunkerWeb. Visit the [Bunker Panel](https://panel.bunkerweb.io/?utm_campaign=self&utm_source=github) for more information.
## Security features
-A non-exhaustive list of security features :
+Explore the impressive array of security features offered by BunkerWeb. While not exhaustive, here are some notable highlights:
-- **HTTPS** support with transparent **Let's Encrypt** automation
-- **State-of-the-art web security** : HTTP security headers, prevent leaks, TLS hardening, ...
-- Integrated **ModSecurity WAF** with the **OWASP Core Rule Set**
-- **Automatic ban** of strange behaviors based on HTTP status code
-- Apply **connections and requests limit** for clients
-- **Block bots** by asking them to solve a **challenge** (e.g. : cookie, javascript, captcha, hCaptcha or reCAPTCHA)
-- **Block known bad IPs** with external blacklists and DNSBL
-- And much more ...
+- **HTTPS** support with transparent **Let's Encrypt** automation : Easily secure your web services with automated Let's Encrypt integration, ensuring encrypted communication between clients and your server.
+- **State-of-the-art web security** : Benefit from cutting-edge web security measures, including comprehensive HTTP security headers, prevention of data leaks, and TLS hardening techniques.
+- Integrated **ModSecurity WAF** with the **OWASP Core Rule Set** : Enjoy enhanced protection against web application attacks with the integration of ModSecurity, fortified by the renowned OWASP Core Rule Set.
+- **Automatic ban** of strange behaviors based on HTTP status code : BunkerWeb intelligently identifies and blocks suspicious activities by automatically banning behaviors that trigger abnormal HTTP status codes.
+- Apply **connections and requests limit** for clients : Set limits on the number of connections and requests from clients, preventing resource exhaustion and ensuring fair usage of server resources.
+- **Block bots** with **challenge-based verification** : Keep malicious bots at bay by challenging them to solve puzzles such as cookies, JavaScript tests, captcha, hCaptcha, reCAPTCHA or Turnstile, effectively blocking unauthorized access.
+- **Block known bad IPs** with external blacklists and DNSBL : Utilize external blacklists and DNS-based blackhole lists (DNSBL) to proactively block known malicious IP addresses, bolstering your defense against potential threats.
+- **And much more...** : BunkerWeb is packed with a plethora of additional security features that go beyond this list, providing you with comprehensive protection and peace of mind.
Learn more about the core security features in the [security tuning](https://docs.bunkerweb.io/1.5.4/security-tuning/) section of the documentation.
@@ -81,6 +84,14 @@ Learn more about the core security features in the [security tuning](https://doc
A demo website protected with BunkerWeb is available at [demo.bunkerweb.io](https://demo.bunkerweb.io). Feel free to visit it and perform some security tests.
+## Professional services
+
+Get the most of BunkerWeb by getting professional services directly from the maintainers of the project. From technical support to tailored consulting and development, we are here to assist you in the security of your web services.
+
+You will find more information by visiting the [BunkerWeb Panel](https://panel.bunkerweb.io/?utm_campaign=self&utm_source=github), our dedicated platform for professional services.
+
+Don't hesitate to [contact us](https://panel.bunkerweb.io/contact.php?utm_campaign=self&utm_source=github) if you have any question, we will be more than happy to respond to your needs.
+
# Concepts
diff --git a/docs/index.md b/docs/index.md
index c5014802b..d653b7980 100644
--- a/docs/index.md
+++ b/docs/index.md
@@ -7,24 +7,15 @@
Make your web services secure by default !
-Introducing BunkerWeb, the **cutting-edge** and **open-source Web Application Firewall** (WAF) that will revolutionize your web security experience.
+BunkerWeb is a next-generation and open-source Web Application Firewall (WAF).
-With BunkerWeb, your web services are safeguarded by default, providing you with peace of mind and enhanced protection. Powered by [NGINX](https://nginx.org/), this comprehensive web server combines advanced features seamlessly, ensuring your online assets remain secure.
-
-BunkerWeb effortlessly integrates into your existing environments, whether it's [Linux](integrations.md#linux), [Docker](integrations.md#docker), [Swarm](integrations.md#swarm), [Kubernetes](integrations.md#kubernetes), or more. Its versatility allows for easy configuration to suit your specific requirements. Don't worry if you prefer a user-friendly interfaceβBunkerWeb offers an exceptional [web UI](web-ui.md) alongside the command-line interface (CLI), ensuring accessibility for all users.
-
-Experience the transformation in cybersecurity, where complexities and obstacles are a thing of the past. With BunkerWeb, fortifying your digital assets has never been more delightful and hassle-free.
-
-Furthermore, BunkerWeb boasts a comprehensive set of primary [security features](security-tuning.md) at its core. However, what sets it apart is its remarkable flexibility through an intuitive [plugin system](plugins.md). This ingenious design empowers you to effortlessly enhance BunkerWeb with additional security measures, ensuring a tailored and robust defense for your web applications.
-
-By seamlessly integrating new plugins into BunkerWeb, you can customize and expand its capabilities to address specific security requirements unique to your environment. Whether you need to strengthen authentication protocols, bolster threat detection, or implement specialized security measures, BunkerWeb's [plugin system](plugins.md) grants you the freedom to fortify your web infrastructure with ease.
-
-With BunkerWeb's dynamic [plugin system](plugins.md), security becomes an enjoyable journey of exploration and empowerment. Discover the endless possibilities and create a fortified web environment that perfectly aligns with your needs.
+Being a full-featured web server (based on [NGINX](https://nginx.org/) under the hood), it will protect your web services to make them "secure by default". BunkerWeb integrates seamlessly into your existing environments ([Linux](integrations.md#linux), [Docker](integrations.md#docker), [Swarm](integrations.md#swarm), [Kubernetes](integrations.md#kubernetes), β¦) and is fully configurable (don't panic, there is an [awesome web UI](web-ui.md) if you don't like the CLI) to meet your own use-cases . In other words, cybersecurity is no more a hassle.
+BunkerWeb contains primary [security features](security-tuning.md) as part of the core but can be easily extended with additional ones thanks to a [plugin system](plugins.md).
## Why BunkerWeb ?
-- **Easy integration into existing environments** : Seamlessly integrate BunkerWeb into various environments such as Linux, Docker, Swarm, Kubernetes, Ansible, Vagrant, and more. Enjoy a smooth transition and hassle-free implementation.
+- **Easy integration into existing environments** : Seamlessly integrate BunkerWeb into various environments such as Linux, Docker, Swarm, Kubernetes and more. Enjoy a smooth transition and hassle-free implementation.
- **Highly customizable** : Tailor BunkerWeb to your specific requirements with ease. Enable, disable, and configure features effortlessly, allowing you to customize the security settings according to your unique use case.
@@ -36,6 +27,8 @@ With BunkerWeb's dynamic [plugin system](plugins.md), security becomes an enjoya
- **Free as in "freedom"** : BunkerWeb is licensed under the free [AGPLv3 license](https://www.gnu.org/licenses/agpl-3.0.en.html), embracing the principles of freedom and openness. Enjoy the freedom to use, modify, and distribute the software, backed by a supportive community.
+- **Professional services** : Get technical support, tailored consulting and custom development directly from the maintainers of BunkerWeb. Visit the [BunkerWeb Panel](https://panel.bunkerweb.io/?utm_campaign=self&utm_source=doc) for more information.
+
## Security features
Explore the impressive array of security features offered by BunkerWeb. While not exhaustive, here are some notable highlights:
@@ -65,3 +58,11 @@ To delve deeper into the core security features, we invite you to explore the [s
A demo website protected with BunkerWeb is available at [demo.bunkerweb.io](https://demo.bunkerweb.io). Feel free to visit it and perform some security tests.
+
+## Professional services
+
+Get the most of BunkerWeb by getting professional services directly from the maintainers of the project. From technical support to tailored consulting and development, we are here to assist you in the security of your web services.
+
+You will find more information by visiting the [BunkerWeb Panel](https://panel.bunkerweb.io/?utm_campaign=self&utm_source=doc), our dedicated platform for professional services.
+
+Don't hesitate to [contact us](https://panel.bunkerweb.io/contact.php?utm_campaign=self&utm_source=doc) if you have any question, we will be more than happy to respond to your needs.
\ No newline at end of file
diff --git a/docs/overrides/main.html b/docs/overrides/main.html
index 1bec2b77c..f843612c6 100644
--- a/docs/overrides/main.html
+++ b/docs/overrides/main.html
@@ -8,8 +8,8 @@
{% endblock %}
{% block announce %}
- π’ Looking for tailored support, consulting or development for BunkerWeb ?
- Contact us at contact@bunkerity.com for enterprise offers !
+ π’ Looking for technical support, tailored consulting or custom development for BunkerWeb ?
+ Visit the BunkerWeb Panel for more information on our enterprise offers.
{% endblock %}
{% block libs %}
diff --git a/docs/professional-services.md b/docs/professional-services.md
new file mode 100644
index 000000000..bde5989c3
--- /dev/null
+++ b/docs/professional-services.md
@@ -0,0 +1,29 @@
+# Professional services
+
+## Why should I get professional services ?
+
+Since BunkerWeb is a free (as in freedom) software, you've the right to use it freely as long as you respect the [AGPLv3 license](https://www.gnu.org/licenses/agpl-3.0.en.html).
+
+But dedicating time to a specific technology may not be easy depending on your business priorities. Not mentioning that cybersecurity is complex domain where being both judge and jury is not recommended.
+
+Getting professional services in addition to the open-source solution is the ideal solution to cover your business needs. You can focus on your top priorities and rely on a trusted partner when it comes to web security.
+
+Please note that professionnal services are directly offered by [Bunkerity](https://www.bunkerity.com), the company maintaining the BunkerWeb project, through our [BunkerWeb Panel](https://panel.bunkerweb.io/?utm_campaign=self&utm_source=doc) online platform.
+
+## Which professional services do you offer ?
+
+We offer technical support around the BunkerWeb solution. By using this service, we will assist you on the technical issues (installation, configuration, false positive, ...).
+
+According to your needs you have the choice between "one time" and subscriptions offers.
+
+One important thing to note is that the support service is based on "credit" system where you pay for a number of support hours dedicated for you. Time passed on your requests will be deducted to your credit. In other words, you only pay for real time dedicated to your needs.
+
+In addition to the support service, we also offer custom services around the BunkerWeb solution to meet your specific needs :
+- Consulting : a dedicated expert will give you advices on your project
+- Development : if you need specific features in BunkerWeb, we can do it for you
+
+## How can I get more information ?
+
+You will find more information by visiting the [BunkerWeb Panel](https://panel.bunkerweb.io/?utm_campaign=self&utm_source=doc), our dedicated platform for professional services.
+
+Don't hesitate to [contact us](https://panel.bunkerweb.io/contact.php?utm_campaign=self&utm_source=doc) if you have any question, we will be more than happy to respond to your needs.
diff --git a/mkdocs.yml b/mkdocs.yml
index 34cc46cd3..df4fcd0bb 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -17,6 +17,7 @@ nav:
- Web UI: 'web-ui.md'
- Troubleshooting: 'troubleshooting.md'
- Plugins: 'plugins.md'
+ - Professional services: 'professional-services.md'
- About: 'about.md'
theme:
From 456b6a424486caa410210795a19d9317ea336bdb Mon Sep 17 00:00:00 2001
From: Jordan Blasenhauer
Date: Fri, 8 Dec 2023 15:57:04 +0100
Subject: [PATCH 005/154] update utm readme
---
README.md | 258 ++++++++++++++++++++++++++++++++++++++----------------
1 file changed, 183 insertions(+), 75 deletions(-)
diff --git a/README.md b/README.md
index e2ab87983..f85a29af1 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,5 @@
-
+
@@ -18,23 +18,39 @@
- π Website
+<<<<<<< Updated upstream
+ π Website
|
- π Documentation
+ π Documentation
|
- π¨βπ» Demo
+ π¨βπ» Demo
|
- π€ Panel
+ π‘οΈ Examples
+=======
+ π Website
+ |
+ π Documentation
+ |
+ π¨βπ» Demo
+ |
+ π€ Panel
|
π‘οΈ Examples
+>>>>>>> Stashed changes
|
π¬ Chat
|
π Forum
- βοΈ Configurator
+<<<<<<< Updated upstream
+ βοΈ Configurator
|
- πΊοΈ Threatmap
+ πΊοΈ Threatmap
+=======
+ βοΈ Configurator
+ |
+ πΊοΈ Threatmap
+>>>>>>> Stashed changes
> π‘οΈ Make security by default great again !
@@ -42,14 +58,28 @@
# BunkerWeb
-
+
BunkerWeb is a next-generation and open-source Web Application Firewall (WAF).
-Being a full-featured web server (based on [NGINX](https://nginx.org/) under the hood), it will protect your web services to make them "secure by default". BunkerWeb integrates seamlessly into your existing environments ([Linux](https://docs.bunkerweb.io/1.5.4/integrations/#linux), [Docker](https://docs.bunkerweb.io/1.5.4/integrations/#docker), [Swarm](https://docs.bunkerweb.io/1.5.4/integrations/#swarm), [Kubernetes](https://docs.bunkerweb.io/1.5.4/integrations/#kubernetes), β¦) and is fully configurable (don't panic, there is an [awesome web UI](https://docs.bunkerweb.io/1.5.4/web-ui/) if you don't like the CLI) to meet your own use-cases . In other words, cybersecurity is no more a hassle.
+<<<<<<< Updated upstream
+Being a full-featured web server (based on [NGINX](https://nginx.org/) under the hood), it will protect your web services to make them "secure by default". BunkerWeb integrates seamlessly into your existing environments ([Linux](https://docs.bunkerweb.io/1.5.3/integrations/#linux), [Docker](https://docs.bunkerweb.io/1.5.3/integrations/#docker), [Swarm](https://docs.bunkerweb.io/1.5.3/integrations/#swarm), [Kubernetes](https://docs.bunkerweb.io/1.5.3/integrations/#kubernetes), β¦) and is fully configurable (don't panic, there is an [awesome web UI](https://docs.bunkerweb.io/1.5.3/web-ui/) if you don't like the CLI) to meet your own use-cases . In other words, cybersecurity is no more a hassle.
-BunkerWeb contains primary [security features](https://docs.bunkerweb.io/1.5.4/security-tuning/) as part of the core but can be easily extended with additional ones thanks to a [plugin system](https://docs.bunkerweb.io/1.5.4/plugins/).
+BunkerWeb contains primary [security features](https://docs.bunkerweb.io/1.5.3/security-tuning/) as part of the core but can be easily extended with additional ones thanks to a [plugin system](https://docs.bunkerweb.io/1.5.3/plugins/).
+
+## Why BunkerWeb ?
+
+- **Easy integration into existing environments** : support for Linux, Docker, Swarm, Kubernetes, Ansible, Vagrant, ...
+- **Highly customizable** : enable, disable and configure features easily to meet your use case
+- **Secure by default** : offers out-of-the-box and hassle-free minimal security for your web services
+- **Awesome web UI** : keep control of everything more efficiently without the need of the CLI
+- **Plugin system** : extend BunkerWeb to meet your own use-cases
+- **Free as in "freedom"** : licensed under the free [AGPLv3 license](https://www.gnu.org/licenses/agpl-3.0.en.html)
+=======
+Being a full-featured web server (based on [NGINX](https://nginx.org/) under the hood), it will protect your web services to make them "secure by default". BunkerWeb integrates seamlessly into your existing environments ([Linux](https://docs.bunkerweb.io/1.5.4/integrations/#linux?utm_campaign=self&utm_source=github), [Docker](https://docs.bunkerweb.io/1.5.4/integrations/#docker?utm_campaign=self&utm_source=github), [Swarm](https://docs.bunkerweb.io/1.5.4/integrations/#swarm?utm_campaign=self&utm_source=github), [Kubernetes](https://docs.bunkerweb.io/1.5.4/integrations/#kubernetes?utm_campaign=self&utm_source=github), β¦) and is fully configurable (don't panic, there is an [awesome web UI](https://docs.bunkerweb.io/1.5.4/web-ui?utm_campaign=self&utm_source=github) if you don't like the CLI) to meet your own use-cases . In other words, cybersecurity is no more a hassle.
+
+BunkerWeb contains primary [security features](https://docs.bunkerweb.io/1.5.4/security-tuning?utm_campaign=self&utm_source=github) as part of the core but can be easily extended with additional ones thanks to a [plugin system](https://docs.bunkerweb.io/1.5.4/plugins?utm_campaign=self&utm_source=github).
## Why BunkerWeb ?
@@ -59,22 +89,27 @@ BunkerWeb contains primary [security features](https://docs.bunkerweb.io/1.5.4/s
- **Awesome web UI** : Take control of BunkerWeb more efficiently with the exceptional web user interface (UI). Navigate settings and configurations effortlessly through a user-friendly graphical interface, eliminating the need for the command-line interface (CLI).
- **Plugin system** : Extend the capabilities of BunkerWeb to meet your own use cases. Seamlessly integrate additional security measures and customize the functionality of BunkerWeb according to your specific requirements.
- **Free as in "freedom"** : BunkerWeb is licensed under the free [AGPLv3 license](https://www.gnu.org/licenses/agpl-3.0.en.html), embracing the principles of freedom and openness. Enjoy the freedom to use, modify, and distribute the software, backed by a supportive community.
-- **Professional services** : Get technical support, tailored consulting and custom development directly from the maintainers of BunkerWeb. Visit the [Bunker Panel](https://panel.bunkerweb.io/?utm_campaign=self&utm_source=github) for more information.
+- **Professional services** : Get technical support, tailored consulting and custom development directly from the maintainers of BunkerWeb. Visit the [Bunker Panel](https://panel.bunkerweb.io?utm_campaign=self&utm_source=github) for more information.
+>>>>>>> Stashed changes
## Security features
-Explore the impressive array of security features offered by BunkerWeb. While not exhaustive, here are some notable highlights:
+A non-exhaustive list of security features :
-- **HTTPS** support with transparent **Let's Encrypt** automation : Easily secure your web services with automated Let's Encrypt integration, ensuring encrypted communication between clients and your server.
-- **State-of-the-art web security** : Benefit from cutting-edge web security measures, including comprehensive HTTP security headers, prevention of data leaks, and TLS hardening techniques.
-- Integrated **ModSecurity WAF** with the **OWASP Core Rule Set** : Enjoy enhanced protection against web application attacks with the integration of ModSecurity, fortified by the renowned OWASP Core Rule Set.
-- **Automatic ban** of strange behaviors based on HTTP status code : BunkerWeb intelligently identifies and blocks suspicious activities by automatically banning behaviors that trigger abnormal HTTP status codes.
-- Apply **connections and requests limit** for clients : Set limits on the number of connections and requests from clients, preventing resource exhaustion and ensuring fair usage of server resources.
-- **Block bots** with **challenge-based verification** : Keep malicious bots at bay by challenging them to solve puzzles such as cookies, JavaScript tests, captcha, hCaptcha, reCAPTCHA or Turnstile, effectively blocking unauthorized access.
-- **Block known bad IPs** with external blacklists and DNSBL : Utilize external blacklists and DNS-based blackhole lists (DNSBL) to proactively block known malicious IP addresses, bolstering your defense against potential threats.
-- **And much more...** : BunkerWeb is packed with a plethora of additional security features that go beyond this list, providing you with comprehensive protection and peace of mind.
+- **HTTPS** support with transparent **Let's Encrypt** automation
+- **State-of-the-art web security** : HTTP security headers, prevent leaks, TLS hardening, ...
+- Integrated **ModSecurity WAF** with the **OWASP Core Rule Set**
+- **Automatic ban** of strange behaviors based on HTTP status code
+- Apply **connections and requests limit** for clients
+- **Block bots** by asking them to solve a **challenge** (e.g. : cookie, javascript, captcha, hCaptcha or reCAPTCHA)
+- **Block known bad IPs** with external blacklists and DNSBL
+- And much more ...
-Learn more about the core security features in the [security tuning](https://docs.bunkerweb.io/1.5.4/security-tuning/) section of the documentation.
+<<<<<<< Updated upstream
+Learn more about the core security features in the [security tuning](https://docs.bunkerweb.io/1.5.3/security-tuning/) section of the documentation.
+=======
+Learn more about the core security features in the [security tuning](https://docs.bunkerweb.io/1.5.4/security-tuning?utm_campaign=self&utm_source=github) section of the documentation.
+>>>>>>> Stashed changes
## Demo
@@ -82,23 +117,30 @@ Learn more about the core security features in the [security tuning](https://doc
-A demo website protected with BunkerWeb is available at [demo.bunkerweb.io](https://demo.bunkerweb.io). Feel free to visit it and perform some security tests.
+A demo website protected with BunkerWeb is available at [demo.bunkerweb.io](https://demo.bunkerweb.io?utm_campaign=self&utm_source=github). Feel free to visit it and perform some security tests.
+<<<<<<< Updated upstream
+=======
## Professional services
Get the most of BunkerWeb by getting professional services directly from the maintainers of the project. From technical support to tailored consulting and development, we are here to assist you in the security of your web services.
-You will find more information by visiting the [BunkerWeb Panel](https://panel.bunkerweb.io/?utm_campaign=self&utm_source=github), our dedicated platform for professional services.
+You will find more information by visiting the [BunkerWeb Panel](https://panel.bunkerweb.io?utm_campaign=self&utm_source=github), our dedicated platform for professional services.
Don't hesitate to [contact us](https://panel.bunkerweb.io/contact.php?utm_campaign=self&utm_source=github) if you have any question, we will be more than happy to respond to your needs.
+>>>>>>> Stashed changes
# Concepts
-
+
-You will find more information about the key concepts of BunkerWeb in the [documentation](https://docs.bunkerweb.io/1.5.4/concepts).
+<<<<<<< Updated upstream
+You will find more information about the key concepts of BunkerWeb in the [documentation](https://docs.bunkerweb.io/1.5.3/concepts).
+=======
+You will find more information about the key concepts of BunkerWeb in the [documentation](https://docs.bunkerweb.io/1.5.4/concepts?utm_campaign=self&utm_source=github).
+>>>>>>> Stashed changes
## Integrations
@@ -106,13 +148,23 @@ The first concept is the integration of BunkerWeb into the target environment. W
The following integrations are officially supported :
-- [Docker](https://docs.bunkerweb.io/1.5.4/integrations/#docker)
-- [Docker autoconf](https://docs.bunkerweb.io/1.5.4/integrations/#docker-autoconf)
-- [Swarm](https://docs.bunkerweb.io/1.5.4/integrations/#swarm)
-- [Kubernetes](https://docs.bunkerweb.io/1.5.4/integrations/#kubernetes)
-- [Linux](https://docs.bunkerweb.io/1.5.4/integrations/#linux)
-- [Ansible](https://docs.bunkerweb.io/1.5.4/integrations/#ansible)
-- [Vagrant](https://docs.bunkerweb.io/1.5.4/integrations/#vagrant)
+<<<<<<< Updated upstream
+- [Docker](https://docs.bunkerweb.io/1.5.3/integrations/#docker)
+- [Docker autoconf](https://docs.bunkerweb.io/1.5.3/integrations/#docker-autoconf)
+- [Swarm](https://docs.bunkerweb.io/1.5.3/integrations/#swarm)
+- [Kubernetes](https://docs.bunkerweb.io/1.5.3/integrations/#kubernetes)
+- [Linux](https://docs.bunkerweb.io/1.5.3/integrations/#linux)
+- [Ansible](https://docs.bunkerweb.io/1.5.3/integrations/#ansible)
+- [Vagrant](https://docs.bunkerweb.io/1.5.3/integrations/#vagrant)
+=======
+- [Docker](https://docs.bunkerweb.io/1.5.4/integrations/#docker?utm_campaign=self&utm_source=github)
+- [Docker autoconf](https://docs.bunkerweb.io/1.5.4/integrations/#docker-autoconf?utm_campaign=self&utm_source=github)
+- [Swarm](https://docs.bunkerweb.io/1.5.4/integrations/#swarm?utm_campaign=self&utm_source=github)
+- [Kubernetes](https://docs.bunkerweb.io/1.5.4/integrations/#kubernetes?utm_campaign=self&utm_source=github)
+- [Linux](https://docs.bunkerweb.io/1.5.4/integrations/#linux?utm_campaign=self&utm_source=github)
+- [Ansible](https://docs.bunkerweb.io/1.5.4/integrations/#ansible?utm_campaign=self&utm_source=github)
+- [Vagrant](https://docs.bunkerweb.io/1.5.4/integrations/#vagrant?utm_campaign=self&utm_source=github)
+>>>>>>> Stashed changes
## Settings
@@ -132,7 +184,7 @@ USE_GZIP=yes
USE_BROTLI=no
```
-You will find an easy to use settings generator at [config.bunkerweb.io](https://config.bunkerweb.io).
+You will find an easy to use settings generator at [config.bunkerweb.io](https://config.bunkerweb.io?utm_campaign=self&utm_source=github).
## Multisite mode
@@ -144,7 +196,11 @@ When multisite mode is enabled, BunkerWeb will serve and protect multiple web ap
## Custom configurations
-Because meeting all the use cases only using the settings is not an option (even with [external plugins](https://docs.bunkerweb.io/1.5.4/plugins)), you can use custom configurations to solve your specific challenges.
+<<<<<<< Updated upstream
+Because meeting all the use cases only using the settings is not an option (even with [external plugins](https://docs.bunkerweb.io/1.5.3/plugins)), you can use custom configurations to solve your specific challenges.
+=======
+Because meeting all the use cases only using the settings is not an option (even with [external plugins](https://docs.bunkerweb.io/1.5.4/plugins?utm_campaign=self&utm_source=github)), you can use custom configurations to solve your specific challenges.
+>>>>>>> Stashed changes
Under the hood, BunkerWeb uses the notorious NGINX web server, that's why you can leverage its configuration system for your specific needs. Custom NGINX configurations can be included in different [contexts](https://docs.nginx.com/nginx/admin-guide/basic-functionality/managing-configuration-files/#contexts) like HTTP or server (all servers and/or specific server block).
@@ -178,7 +234,7 @@ In other words, the scheduler is the brain of BunkerWeb.
## Docker
-
+
We provide ready to use prebuilt images for x64, x86, armv7 and arm64 platforms on [Docker Hub](https://hub.docker.com/u/bunkerity).
@@ -189,77 +245,103 @@ Docker integration key concepts are :
- **Scheduler** container to store configuration and execute jobs
- **Networks** to expose ports for clients and connect to upstream web services
-You will find more information in the [Docker integration section](https://docs.bunkerweb.io/1.5.4/integrations/#docker) of the documentation.
+<<<<<<< Updated upstream
+You will find more information in the [Docker integration section](https://docs.bunkerweb.io/1.5.3/integrations/#docker) of the documentation.
+=======
+You will find more information in the [Docker integration section](https://docs.bunkerweb.io/1.5.4/integrations/#docker?utm_campaign=self&utm_source=github) of the documentation.
+>>>>>>> Stashed changes
## Docker autoconf
-
+
The downside of using environment variables is that the container needs to be recreated each time there is an update which is not very convenient. To counter that issue, you can use another image called **autoconf** which will listen for Docker events and automatically reconfigure BunkerWeb in real-time without recreating the container.
Instead of defining environment variables for the BunkerWeb container, you simply add **labels** to your web applications containers and the **autoconf** will "automagically" take care of the rest.
-You will find more information in the [Docker autoconf section](https://docs.bunkerweb.io/1.5.4/integrations/#docker-autoconf) of the documentation.
+<<<<<<< Updated upstream
+You will find more information in the [Docker autoconf section](https://docs.bunkerweb.io/1.5.3/integrations/#docker-autoconf) of the documentation.
+=======
+You will find more information in the [Docker autoconf section](https://docs.bunkerweb.io/1.5.4/integrations/#docker-autoconf?utm_campaign=self&utm_source=github) of the documentation.
+>>>>>>> Stashed changes
## Swarm
-
+
To automatically configure BunkerWeb instances, a special service, called **autoconf** will listen for Docker Swarm events like service creation or deletion and automatically configure the **BunkerWeb instances** in real-time without downtime.
-Like the [Docker autoconf integration](https://docs.bunkerweb.io/1.5.4/integrations/#docker-autoconf), configuration for web services is defined using labels starting with the special **bunkerweb.** prefix.
+<<<<<<< Updated upstream
+Like the [Docker autoconf integration](https://docs.bunkerweb.io/1.5.3/integrations/#docker-autoconf), configuration for web services is defined using labels starting with the special **bunkerweb.** prefix.
-You will find more information in the [Swarm section](https://docs.bunkerweb.io/1.5.4/integrations/#swarm) of the documentation.
+You will find more information in the [Swarm section](https://docs.bunkerweb.io/1.5.3/integrations/#swarm) of the documentation.
+=======
+Like the [Docker autoconf integration](https://docs.bunkerweb.io/1.5.4/integrations/#docker-autoconf?utm_campaign=self&utm_source=github), configuration for web services is defined using labels starting with the special **bunkerweb.** prefix.
+
+You will find more information in the [Swarm section](https://docs.bunkerweb.io/1.5.4/integrations/#swarm?utm_campaign=self&utm_source=github) of the documentation.
+>>>>>>> Stashed changes
## Kubernetes
-
+
The autoconf acts as an [Ingress controller](https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/) and will configure the BunkerWeb instances according to the [Ingress resources](https://kubernetes.io/docs/concepts/services-networking/ingress/). It also monitors other Kubernetes objects like [ConfigMap](https://kubernetes.io/docs/concepts/configuration/configmap/) for custom configurations.
-You will find more information in the [Kubernetes section](https://docs.bunkerweb.io/1.5.4/integrations/#kubernetes) of the documentation.
+<<<<<<< Updated upstream
+You will find more information in the [Kubernetes section](https://docs.bunkerweb.io/1.5.3/integrations/#kubernetes) of the documentation.
+=======
+You will find more information in the [Kubernetes section](https://docs.bunkerweb.io/1.5.4/integrations/#kubernetes?utm_campaign=self&utm_source=github) of the documentation.
+>>>>>>> Stashed changes
## Linux
-
+
List of supported Linux distros :
-- Debian 12 "Bookworm"
+- Debian 11 "Bullseye"
- Ubuntu 22.04 "Jammy"
-- Fedora 39
-- RHEL 8.9
+- Fedora 38
+- RHEL 8.7
Repositories of Linux packages for BunkerWeb are available on [PackageCloud](https://packagecloud.io/bunkerity/bunkerweb), they provide a bash script to automatically add and trust the repository (but you can also follow the [manual installation](https://packagecloud.io/bunkerity/bunkerweb/install) instructions if you prefer).
-You will find more information in the [Linux section](https://docs.bunkerweb.io/1.5.4/integrations/#linux) of the documentation.
+<<<<<<< Updated upstream
+You will find more information in the [Linux section](https://docs.bunkerweb.io/1.5.3/integrations/#linux) of the documentation.
+=======
+You will find more information in the [Linux section](https://docs.bunkerweb.io/1.5.4/integrations/#linux?utm_campaign=self&utm_source=github) of the documentation.
+>>>>>>> Stashed changes
## Ansible
-
+
List of supported Linux distros :
-- Debian 12 "Bookworm"
+- Debian 11 "Bullseye"
- Ubuntu 22.04 "Jammy"
-- Fedora 39
-- RHEL 8.9
+- Fedora 38
+- RHEL 8.7
[Ansible](https://www.ansible.com/) is an IT automation tool. It can configure systems, deploy software, and orchestrate more advanced IT tasks such as continuous deployments or zero downtime rolling updates.
A specific BunkerWeb Ansible role is available on [Ansible Galaxy](https://galaxy.ansible.com/bunkerity/bunkerweb) (source code is available [here](https://github.com/bunkerity/bunkerweb-ansible)).
-You will find more information in the [Ansible section](https://docs.bunkerweb.io/1.5.4/integrations/#ansible) of the documentation.
+<<<<<<< Updated upstream
+You will find more information in the [Ansible section](https://docs.bunkerweb.io/1.5.3/integrations/#ansible) of the documentation.
+=======
+You will find more information in the [Ansible section](https://docs.bunkerweb.io/1.5.4/integrations/#ansible?utm_campaign=self&utm_source=github) of the documentation.
+>>>>>>> Stashed changes
## Vagrant
@@ -268,11 +350,19 @@ We maintain ready to use Vagrant boxes hosted on Vagrant cloud for the following
- virtualbox
- libvirt
-You will find more information in the [Vagrant section](https://docs.bunkerweb.io/1.5.4/integrations/#vagrant) of the documentation.
+<<<<<<< Updated upstream
+You will find more information in the [Vagrant section](https://docs.bunkerweb.io/1.5.3/integrations/#vagrant) of the documentation.
# Quickstart guide
-Once you have setup BunkerWeb with the integration of your choice, you can follow the [quickstart guide](https://docs.bunkerweb.io/1.5.4/quickstart-guide/) that will cover the following common use cases :
+Once you have setup BunkerWeb with the integration of your choice, you can follow the [quickstart guide](https://docs.bunkerweb.io/1.5.3/quickstart-guide/) that will cover the following common use cases :
+=======
+You will find more information in the [Vagrant section](https://docs.bunkerweb.io/1.5.4/integrations/#vagrant?utm_campaign=self&utm_source=github) of the documentation.
+
+# Quickstart guide
+
+Once you have setup BunkerWeb with the integration of your choice, you can follow the [quickstart guide](https://docs.bunkerweb.io/1.5.4/quickstart-guide?utm_campaign=self&utm_source=github) that will cover the following common use cases :
+>>>>>>> Stashed changes
- Protecting a single HTTP application
- Protecting multiple HTTP application
@@ -283,25 +373,35 @@ Once you have setup BunkerWeb with the integration of your choice, you can follo
# Security tuning
-BunkerWeb offers many security features that you can configure with [settings](https://docs.bunkerweb.io/1.5.4/settings). Even if the default values of settings ensure a minimal "security by default", we strongly recommend you to tune them. By doing so you will be able to ensure a security level of your choice but also manage false positives.
+<<<<<<< Updated upstream
+BunkerWeb offers many security features that you can configure with [settings](https://docs.bunkerweb.io/1.5.3/settings). Even if the default values of settings ensure a minimal "security by default", we strongly recommend you to tune them. By doing so you will be able to ensure a security level of your choice but also manage false positives.
-You will find more information in the [security tuning section](https://docs.bunkerweb.io/1.5.4/security-tuning) of the documentation.
+You will find more information in the [security tuning section](https://docs.bunkerweb.io/1.5.3/security-tuning) of the documentation.
+=======
+BunkerWeb offers many security features that you can configure with [settings](https://docs.bunkerweb.io/1.5.4/settings?utm_campaign=self&utm_source=github). Even if the default values of settings ensure a minimal "security by default", we strongly recommend you to tune them. By doing so you will be able to ensure a security level of your choice but also manage false positives.
+
+You will find more information in the [security tuning section](https://docs.bunkerweb.io/1.5.4/security-tuning?utm_campaign=self&utm_source=github) of the documentation.
+>>>>>>> Stashed changes
# Settings
-To help you tuning BunkerWeb we have made an easy to use settings generator tool available at [config.bunkerweb.io](https://config.bunkerweb.io).
+To help you tuning BunkerWeb we have made an easy to use settings generator tool available at [config.bunkerweb.io](https://config.bunkerweb.io?utm_campaign=self&utm_source=github).
As a general rule when multisite mode is enabled, if you want to apply settings with multisite context to a specific server you will need to add the primary (first) server name as a prefix like `www.example.com_USE_ANTIBOT=captcha` or `myapp.example.com_USE_GZIP=yes` for example.
When settings are considered as "multiple", it means that you can have multiple groups of settings for the same feature by adding numbers as suffix like `REVERSE_PROXY_URL_1=/subdir`, `REVERSE_PROXY_HOST_1=http://myhost1`, `REVERSE_PROXY_URL_2=/anotherdir`, `REVERSE_PROXY_HOST_2=http://myhost2`, ... for example.
-Check the [settings section](https://docs.bunkerweb.io/1.5.4/settings) of the documentation to get the full list.
+<<<<<<< Updated upstream
+Check the [settings section](https://docs.bunkerweb.io/1.5.3/settings) of the documentation to get the full list.
+=======
+Check the [settings section](https://docs.bunkerweb.io/1.5.4/settings?utm_campaign=self&utm_source=github) of the documentation to get the full list.
+>>>>>>> Stashed changes
# Web UI
-
+
@@ -315,13 +415,17 @@ The "Web UI" is a web application that helps you manage your BunkerWeb instance
- Monitor jobs execution
- View the logs and search pattern
-You will find more information in the [Web UI section](https://docs.bunkerweb.io/1.5.4/web-ui) of the documentation.
+<<<<<<< Updated upstream
+You will find more information in the [Web UI section](https://docs.bunkerweb.io/1.5.3/web-ui) of the documentation.
+=======
+You will find more information in the [Web UI section](https://docs.bunkerweb.io/1.5.4/web-ui?utm_campaign=self&utm_source=github) of the documentation.
+>>>>>>> Stashed changes
# Plugins
BunkerWeb comes with a plugin system to make it possible to easily add new features. Once a plugin is installed, you can manage it using additional settings defined by the plugin.
-Here is the list of "official" plugins that we maintain (see the [bunkerweb-plugins](https://github.com/bunkerity/bunkerweb-plugins) repository for more information) :
+Here is the list of "official" plugins that we maintain (see the [bunkerweb-plugins](https://github.com/bunkerity/bunkerweb-plugins?utm_campaign=self&utm_source=github) repository for more information) :
| Name | Version | Description | Link |
| :------------: | :-----: | :------------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------------: |
@@ -331,9 +435,13 @@ Here is the list of "official" plugins that we maintain (see the [bunkerweb-plug
| **Discord** | 1.2 | Send security notifications to a Discord channel using a Webhook. | [bunkerweb-plugins/discord](https://github.com/bunkerity/bunkerweb-plugins/tree/main/discord) |
| **Slack** | 1.2 | Send security notifications to a Slack channel using a Webhook. | [bunkerweb-plugins/slack](https://github.com/bunkerity/bunkerweb-plugins/tree/main/slack) |
| **VirusTotal** | 1.2 | Automatically scans uploaded files with the VirusTotal API and denies the request when a file is detected as malicious. | [bunkerweb-plugins/virustotal](https://github.com/bunkerity/bunkerweb-plugins/tree/main/virustotal) |
-| **WebHook** | 1.2 | Send security notifications to a custom HTTP endpoint using a Webhook. | [bunkerweb-plugins/slack](https://github.com/bunkerity/bunkerweb-plugins/tree/main/webhook) |
+| **WebHook** | 1.2 | Send security notifications to a custom HTTP endpoint using a Webhook. | [bunkerweb-plugins/slack](https://github.com/bunkerity/bunkerweb-plugins/tree/main/webhook) |
-You will find more information in the [plugins section](https://docs.bunkerweb.io/1.5.4/plugins) of the documentation.
+<<<<<<< Updated upstream
+You will find more information in the [plugins section](https://docs.bunkerweb.io/1.5.3/plugins) of the documentation.
+=======
+You will find more information in the [plugins section](https://docs.bunkerweb.io/1.5.4/plugins?utm_campaign=self&utm_source=github) of the documentation.
+>>>>>>> Stashed changes
# Support
@@ -341,10 +449,10 @@ You will find more information in the [plugins section](https://docs.bunkerweb.i
We offer professional services related to BunkerWeb like :
-* Consulting
-* Support
-* Custom development
-* Partnership
+- Consulting
+- Support
+- Custom development
+- Partnership
Please contact us at [contact@bunkerity.com](mailto:contact@bunkerity.com) if you are interested.
@@ -352,24 +460,24 @@ Please contact us at [contact@bunkerity.com](mailto:contact@bunkerity.com) if yo
To get free community support you can use the following media :
-* The #help channel of BunkerWeb in the [Discord server](https://discord.com/invite/fTf46FmtyD)
-* The help category of [GitHub discussions](https://github.com/bunkerity/bunkerweb/discussions)
-* The [/r/BunkerWeb](https://www.reddit.com/r/BunkerWeb) subreddit
-* The [Server Fault](https://serverfault.com/) and [Super User](https://superuser.com/) forums
+- The #help channel of BunkerWeb in the [Discord server](https://discord.com/invite/fTf46FmtyD)
+- The help category of [GitHub discussions](https://github.com/bunkerity/bunkerweb/discussions)
+- The [/r/BunkerWeb](https://www.reddit.com/r/BunkerWeb) subreddit
+- The [Server Fault](https://serverfault.com/) and [Super User](https://superuser.com/) forums
Please don't use [GitHub issues](https://github.com/bunkerity/bunkerweb/issues) to ask for help, use it only for bug reports and feature requests.
# License
-This project is licensed under the terms of the [GNU Affero General Public License (AGPL) version 3](https://github.com/bunkerity/bunkerweb/raw/v1.5.4/LICENSE.md).
+This project is licensed under the terms of the [GNU Affero General Public License (AGPL) version 3](https://github.com/bunkerity/bunkerweb/raw/v1.5.3/LICENSE.md).
# Contribute
-If you would like to contribute to the plugins you can read the [contributing guidelines](https://github.com/bunkerity/bunkerweb/raw/v1.5.4/CONTRIBUTING.md) to get started.
+If you would like to contribute to the plugins you can read the [contributing guidelines](https://github.com/bunkerity/bunkerweb/raw/v1.5.3/CONTRIBUTING.md) to get started.
# Security policy
-We take security bugs as serious issues and encourage responsible disclosure, see our [security policy](https://github.com/bunkerity/bunkerweb/raw/v1.5.4/SECURITY.md) for more information.
+We take security bugs as serious issues and encourage responsible disclosure, see our [security policy](https://github.com/bunkerity/bunkerweb/raw/v1.5.3/SECURITY.md) for more information.
# Stargazers over time
From 10f0ee7eef6d01dce41eb3efd76994516baa25b6 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Mon, 11 Dec 2023 08:08:31 +0000
Subject: [PATCH 006/154] deps/gha: bump rickstaa/action-create-tag from 1.7.1
to 1.7.2
Bumps [rickstaa/action-create-tag](https://github.com/rickstaa/action-create-tag) from 1.7.1 to 1.7.2.
- [Release notes](https://github.com/rickstaa/action-create-tag/releases)
- [Commits](https://github.com/rickstaa/action-create-tag/compare/861755f3fcbce1b21a65c17bad10e7d35c27b6d9...a1c7777fcb2fee4f19b0f283ba888afa11678b72)
---
updated-dependencies:
- dependency-name: rickstaa/action-create-tag
dependency-type: direct:production
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot]
---
.github/workflows/push-github.yml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/.github/workflows/push-github.yml b/.github/workflows/push-github.yml
index 43a92ba11..e463a7799 100644
--- a/.github/workflows/push-github.yml
+++ b/.github/workflows/push-github.yml
@@ -23,7 +23,7 @@ jobs:
with:
name: BunkerWeb_documentation_v${{ inputs.VERSION }}.pdf
# Create tag
- - uses: rickstaa/action-create-tag@861755f3fcbce1b21a65c17bad10e7d35c27b6d9 # v1.7.1
+ - uses: rickstaa/action-create-tag@a1c7777fcb2fee4f19b0f283ba888afa11678b72 # v1.7.2
name: Create tag
if: inputs.VERSION != 'testing'
with:
@@ -31,7 +31,7 @@ jobs:
message: "v${{ inputs.VERSION }}"
force_push_tag: true
# Create tag
- - uses: rickstaa/action-create-tag@861755f3fcbce1b21a65c17bad10e7d35c27b6d9 # v1.7.1
+ - uses: rickstaa/action-create-tag@a1c7777fcb2fee4f19b0f283ba888afa11678b72 # v1.7.2
name: Create tag
if: inputs.VERSION == 'testing'
with:
From de30a734f999c9cd21dc0034e35c544b417d86d0 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Mon, 11 Dec 2023 08:37:14 +0000
Subject: [PATCH 007/154] deps/ui: bump python in /src/ui
Bumps python from 3.12.0-alpine3.18 to 3.12.1-alpine3.18.
---
updated-dependencies:
- dependency-name: python
dependency-type: direct:production
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot]
---
src/ui/Dockerfile | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/ui/Dockerfile b/src/ui/Dockerfile
index 299b06be3..64b15011e 100644
--- a/src/ui/Dockerfile
+++ b/src/ui/Dockerfile
@@ -1,4 +1,4 @@
-FROM python:3.12.0-alpine3.18@sha256:f1d0d03700fb2d4480e89fb807e7346c14b88952f7bd58d56de54a24817cc2e8 AS builder
+FROM python:3.12.1-alpine3.18@sha256:af0d8da43677e3000ebdf4045508d891a87e7bd2d3ec87bc6e40403be97291b8 AS builder
# Install python dependencies
RUN apk add --no-cache --virtual .build-deps g++ gcc musl-dev jpeg-dev zlib-dev libffi-dev cairo-dev pango-dev gdk-pixbuf-dev openssl-dev cargo postgresql-dev file make
@@ -36,7 +36,7 @@ COPY src/common/helpers helpers
COPY src/ui ui
COPY src/VERSION VERSION
-FROM python:3.12.0-alpine3.18@sha256:f1d0d03700fb2d4480e89fb807e7346c14b88952f7bd58d56de54a24817cc2e8
+FROM python:3.12.1-alpine3.18@sha256:af0d8da43677e3000ebdf4045508d891a87e7bd2d3ec87bc6e40403be97291b8
# Set default umask to prevent huge recursive chmod increasing the final image size
RUN umask 027
From 0f2bf17a586db21f3425924f8dc317e81b5c15c2 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Mon, 11 Dec 2023 08:39:56 +0000
Subject: [PATCH 008/154] deps/scheduler: bump python in /src/scheduler
Bumps python from 3.12.0-alpine3.18 to 3.12.1-alpine3.18.
---
updated-dependencies:
- dependency-name: python
dependency-type: direct:production
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot]
---
src/scheduler/Dockerfile | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/scheduler/Dockerfile b/src/scheduler/Dockerfile
index 97e576f45..9d9d48e58 100644
--- a/src/scheduler/Dockerfile
+++ b/src/scheduler/Dockerfile
@@ -1,4 +1,4 @@
-FROM python:3.12.0-alpine3.18@sha256:f1d0d03700fb2d4480e89fb807e7346c14b88952f7bd58d56de54a24817cc2e8 AS builder
+FROM python:3.12.1-alpine3.18@sha256:af0d8da43677e3000ebdf4045508d891a87e7bd2d3ec87bc6e40403be97291b8 AS builder
# Install python dependencies
RUN apk add --no-cache --virtual .build-deps g++ gcc musl-dev jpeg-dev zlib-dev libffi-dev cairo-dev pango-dev gdk-pixbuf-dev openssl-dev cargo postgresql-dev
@@ -38,7 +38,7 @@ COPY src/common/utils utils
COPY src/scheduler scheduler
COPY src/VERSION VERSION
-FROM python:3.12.0-alpine3.18@sha256:f1d0d03700fb2d4480e89fb807e7346c14b88952f7bd58d56de54a24817cc2e8
+FROM python:3.12.1-alpine3.18@sha256:af0d8da43677e3000ebdf4045508d891a87e7bd2d3ec87bc6e40403be97291b8
# Set default umask to prevent huge recursive chmod increasing the final image size
RUN umask 027
From 8eff772fefba85818ea8cb8740b95777d5211c2c Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Mon, 11 Dec 2023 08:44:02 +0000
Subject: [PATCH 009/154] deps/autoconf: bump python in /src/autoconf
Bumps python from 3.12.0-alpine3.18 to 3.12.1-alpine3.18.
---
updated-dependencies:
- dependency-name: python
dependency-type: direct:production
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot]
---
src/autoconf/Dockerfile | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/autoconf/Dockerfile b/src/autoconf/Dockerfile
index b757f9031..65330ff4b 100644
--- a/src/autoconf/Dockerfile
+++ b/src/autoconf/Dockerfile
@@ -1,4 +1,4 @@
-FROM python:3.12.0-alpine3.18@sha256:f1d0d03700fb2d4480e89fb807e7346c14b88952f7bd58d56de54a24817cc2e8 AS builder
+FROM python:3.12.1-alpine3.18@sha256:af0d8da43677e3000ebdf4045508d891a87e7bd2d3ec87bc6e40403be97291b8 AS builder
# Copy python requirements
COPY src/deps/requirements.txt /tmp/requirements-deps.txt
@@ -34,7 +34,7 @@ COPY src/common/helpers helpers
COPY src/common/settings.json settings.json
COPY src/common/utils utils
-FROM python:3.12.0-alpine3.18@sha256:f1d0d03700fb2d4480e89fb807e7346c14b88952f7bd58d56de54a24817cc2e8
+FROM python:3.12.1-alpine3.18@sha256:af0d8da43677e3000ebdf4045508d891a87e7bd2d3ec87bc6e40403be97291b8
# Set default umask to prevent huge recursive chmod increasing the final image size
RUN umask 027
From e6c5df12dc7923b9711ad2b779c31fa7e34ea59a Mon Sep 17 00:00:00 2001
From: Jordan Blasenhauer
Date: Mon, 11 Dec 2023 17:36:26 +0100
Subject: [PATCH 010/154] add utm
---
docs/about.md | 2 +-
docs/concepts.md | 2 +-
docs/index.md | 4 ++--
docs/json2md.py | 2 +-
docs/professional-services.md | 3 ++-
docs/settings.md | 2 +-
6 files changed, 8 insertions(+), 7 deletions(-)
diff --git a/docs/about.md b/docs/about.md
index 91483092e..f972313a2 100644
--- a/docs/about.md
+++ b/docs/about.md
@@ -2,7 +2,7 @@
## Who maintains BunkerWeb ?
-BunkerWeb is maintained by [Bunkerity](https://www.bunkerity.com), a French π«π· company specialized in Cybersecurity π‘οΈ.
+BunkerWeb is maintained by [Bunkerity](https://www.bunkerity.com?utm_campaign=self&utm_source=doc), a French π«π· company specialized in Cybersecurity π‘οΈ.
## Do you offer professional services ?
diff --git a/docs/concepts.md b/docs/concepts.md
index d2ee98d4e..52252820e 100644
--- a/docs/concepts.md
+++ b/docs/concepts.md
@@ -48,7 +48,7 @@ USE_BROTLI=no
!!! info "Settings generator tool"
- To help you tune BunkerWeb, we offer an easy-to-use settings generator tool available at [config.bunkerweb.io](https://config.bunkerweb.io).
+ To help you tune BunkerWeb, we offer an easy-to-use settings generator tool available at [config.bunkerweb.io](https://config.bunkerweb.io?utm_campaign=self&utm_source=doc).
## Multisite mode
diff --git a/docs/index.md b/docs/index.md
index d653b7980..a09e870fb 100644
--- a/docs/index.md
+++ b/docs/index.md
@@ -57,7 +57,7 @@ To delve deeper into the core security features, we invite you to explore the [s
-A demo website protected with BunkerWeb is available at [demo.bunkerweb.io](https://demo.bunkerweb.io). Feel free to visit it and perform some security tests.
+A demo website protected with BunkerWeb is available at [demo.bunkerweb.io](https://demo.bunkerweb.io?utm_campaign=self&utm_source=doc). Feel free to visit it and perform some security tests.
## Professional services
@@ -65,4 +65,4 @@ Get the most of BunkerWeb by getting professional services directly from the mai
You will find more information by visiting the [BunkerWeb Panel](https://panel.bunkerweb.io/?utm_campaign=self&utm_source=doc), our dedicated platform for professional services.
-Don't hesitate to [contact us](https://panel.bunkerweb.io/contact.php?utm_campaign=self&utm_source=doc) if you have any question, we will be more than happy to respond to your needs.
\ No newline at end of file
+Don't hesitate to [contact us](https://panel.bunkerweb.io/contact.php?utm_campaign=self&utm_source=doc) if you have any question, we will be more than happy to respond to your needs.
diff --git a/docs/json2md.py b/docs/json2md.py
index 2a0fa478e..daf052292 100755
--- a/docs/json2md.py
+++ b/docs/json2md.py
@@ -39,7 +39,7 @@ doc = StringIO()
print("# Settings\n", file=doc)
print(
- '!!! info "Settings generator tool"\n\n To help you tune BunkerWeb, we have made an easy-to-use settings generator tool available at [config.bunkerweb.io](https://config.bunkerweb.io).\n',
+ '!!! info "Settings generator tool"\n\n To help you tune BunkerWeb, we have made an easy-to-use settings generator tool available at [config.bunkerweb.io](https://config.bunkerweb.io?utm_campaign=self&utm_source=doc).\n',
file=doc,
)
print(
diff --git a/docs/professional-services.md b/docs/professional-services.md
index bde5989c3..a5fde998c 100644
--- a/docs/professional-services.md
+++ b/docs/professional-services.md
@@ -8,7 +8,7 @@ But dedicating time to a specific technology may not be easy depending on your b
Getting professional services in addition to the open-source solution is the ideal solution to cover your business needs. You can focus on your top priorities and rely on a trusted partner when it comes to web security.
-Please note that professionnal services are directly offered by [Bunkerity](https://www.bunkerity.com), the company maintaining the BunkerWeb project, through our [BunkerWeb Panel](https://panel.bunkerweb.io/?utm_campaign=self&utm_source=doc) online platform.
+Please note that professionnal services are directly offered by [Bunkerity](https://www.bunkerity.com?utm_campaign=self&utm_source=doc), the company maintaining the BunkerWeb project, through our [BunkerWeb Panel](https://panel.bunkerweb.io/?utm_campaign=self&utm_source=doc) online platform.
## Which professional services do you offer ?
@@ -19,6 +19,7 @@ According to your needs you have the choice between "one time" and subscriptions
One important thing to note is that the support service is based on "credit" system where you pay for a number of support hours dedicated for you. Time passed on your requests will be deducted to your credit. In other words, you only pay for real time dedicated to your needs.
In addition to the support service, we also offer custom services around the BunkerWeb solution to meet your specific needs :
+
- Consulting : a dedicated expert will give you advices on your project
- Development : if you need specific features in BunkerWeb, we can do it for you
diff --git a/docs/settings.md b/docs/settings.md
index 95693794d..236421be1 100644
--- a/docs/settings.md
+++ b/docs/settings.md
@@ -2,7 +2,7 @@
!!! info "Settings generator tool"
- To help you tune BunkerWeb, we have made an easy-to-use settings generator tool available at [config.bunkerweb.io](https://config.bunkerweb.io).
+ To help you tune BunkerWeb, we have made an easy-to-use settings generator tool available at [config.bunkerweb.io](https://config.bunkerweb.io?utm_campaign=self&utm_source=doc).
This section contains the full list of settings supported by BunkerWeb. If you are not yet familiar with BunkerWeb, you should first read the [concepts](concepts.md) section of the documentation. Please follow the instructions for your own [integration](integrations.md) on how to apply the settings.
From 6ef1513d7c9bfbd53f7a5ca7aefa2bc5291b4895 Mon Sep 17 00:00:00 2001
From: Jordan Blasenhauer
Date: Mon, 11 Dec 2023 18:44:39 +0100
Subject: [PATCH 011/154] start adding banner
---
docker-compose.dev.yml | 54 ++++++++++++++++++++++++++++++
src/ui/static/js/global.js | 64 +++++++++++++++++++++++++++++++++---
src/ui/templates/banner.html | 64 ++++++++++++++++++++++++++++++++++++
src/ui/templates/base.html | 4 +--
4 files changed, 179 insertions(+), 7 deletions(-)
create mode 100644 docker-compose.dev.yml
create mode 100644 src/ui/templates/banner.html
diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml
new file mode 100644
index 000000000..230e5f453
--- /dev/null
+++ b/docker-compose.dev.yml
@@ -0,0 +1,54 @@
+version: "3.5"
+
+services:
+ bunkerweb:
+ image: bunkerity/bunkerweb:1.5.4
+ ports:
+ - 80:8080
+ - 443:8443
+ labels:
+ - "bunkerweb.INSTANCE=yes"
+ environment:
+ - SERVER_NAME=www.example.com
+ - API_WHITELIST_IP=127.0.0.0/8 10.20.30.0/24
+ networks:
+ - bw-universe
+ - bw-services
+
+ bw-scheduler:
+ image: bunkerity/bunkerweb-scheduler:1.5.4
+ depends_on:
+ - bunkerweb
+ - bw-docker
+ volumes:
+ - bw-data:/data
+ environment:
+ - DOCKER_HOST=tcp://bw-docker:2375
+ networks:
+ - bw-universe
+ - bw-docker
+
+ bw-docker:
+ image: tecnativa/docker-socket-proxy:nightly
+ volumes:
+ - /var/run/docker.sock:/var/run/docker.sock:ro
+ environment:
+ - CONTAINERS=1
+ - LOG_LEVEL=warning
+ networks:
+ - bw-docker
+
+volumes:
+ bw-data:
+
+networks:
+ bw-universe:
+ name: bw-universe
+ ipam:
+ driver: default
+ config:
+ - subnet: 10.20.30.0/24
+ bw-services:
+ name: bw-services
+ bw-docker:
+ name: bw-docker
diff --git a/src/ui/static/js/global.js b/src/ui/static/js/global.js
index a7b3df707..0c4353207 100644
--- a/src/ui/static/js/global.js
+++ b/src/ui/static/js/global.js
@@ -72,7 +72,7 @@ class News {
excerpt,
tags,
date,
- lastUpdate,
+ lastUpdate
);
let cleanHTML = DOMPurify.sanitize(cardHTML);
//add to DOM
@@ -191,7 +191,7 @@ class darkMode {
};
const send = await fetch(
`${location.href.split("/").slice(0, -1).join("/")}/darkmode`,
- data,
+ data
);
}
}
@@ -231,7 +231,7 @@ class FlashMsg {
flashEl.remove();
//update count
this.flashCount.textContent = document.querySelectorAll(
- "[data-flash-message]",
+ "[data-flash-message]"
).length;
}
} catch (err) {}
@@ -295,12 +295,64 @@ class Loader {
}
}
+class Banner {
+ constructor() {
+ this.bannerEl = document.getElementById("banner");
+ this.bannerItems = this.bannerEl.querySelectorAll('[role="listitem"]');
+ this.nextDelay = 9000;
+ this.transDuration = 700;
+ this.init();
+ }
+
+ init() {
+ setInterval(() => {
+ // Get current visible
+ let visibleEl;
+ this.bannerItems.forEach((item) => {
+ if (item.getAttribute("aria-hidden") === "false") {
+ visibleEl = item;
+ }
+ });
+
+ // Get next one to show (next index or first one)
+ let nextEl =
+ this.bannerEl.querySelector(
+ `[role="listitem"][data-id="${
+ +visibleEl.getAttribute("data-id") + 1
+ }"]`
+ ) || this.bannerEl.querySelector(`[role="listitem"][data-id="0"]`);
+
+ // Hide current one
+ visibleEl.classList.add("-left-full");
+ visibleEl.classList.remove("left-0");
+ visibleEl.setAttribute("aria-hidden", "true");
+ setTimeout(() => {
+ visibleEl.classList.remove("transition-all");
+ }, this.transDuration + 10);
+ setTimeout(() => {
+ visibleEl.classList.add("opacity-0");
+ }, this.transDuration + 20);
+ setTimeout(() => {
+ visibleEl.classList.remove("-left-full");
+ visibleEl.classList.add("left-full");
+ }, this.transDuration * 2);
+
+ // Show next one
+ nextEl.classList.remove("opacity-0");
+ nextEl.classList.add("transition-all");
+ nextEl.classList.add("left-0");
+ nextEl.classList.remove("left-full");
+ nextEl.setAttribute("aria-hidden", "false");
+ }, this.nextDelay);
+ }
+}
+
const setLoader = new Loader();
const setMenu = new Menu();
const setNewsSidebar = new Sidebar(
"[data-sidebar-info]",
"[data-sidebar-info-open]",
- "[data-sidebar-info-close]",
+ "[data-sidebar-info-close]"
);
const setCheckbox = new Checkbox();
@@ -311,8 +363,10 @@ const setDisabledPop = new DisabledPop();
const setFlashSidebar = new Sidebar(
"[data-flash-sidebar]",
"[data-flash-sidebar-open]",
- "[data-flash-sidebar-close]",
+ "[data-flash-sidebar-close]"
);
const setNews = new News();
const setDarkM = new darkMode();
const setFlash = new FlashMsg();
+
+const setBanner = new Banner();
diff --git a/src/ui/templates/banner.html b/src/ui/templates/banner.html
new file mode 100644
index 000000000..c14ddfbcc
--- /dev/null
+++ b/src/ui/templates/banner.html
@@ -0,0 +1,64 @@
+
+
+
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit.
+
+ link
+
+ Illo beatae dicta voluptate aperiam facilis ducimus culpa ad repudiandae
+ error, autem molestiae quisquam aliquam rem sunt dolorum qui rerum maxime
+ corporis.
+
+
+
+
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit.
+
+ link
+
+ Illo beatae dicta voluptate aperiam facilis ducimus culpa ad repudiandae
+ error, autem molestiae quisquam aliquam rem sunt dolorum qui rerum maxime
+ corporis.
+
+
+
+
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit.
+
+ link
+
+ Illo beatae dicta voluptate aperiam facilis ducimus culpa ad repudiandae
+ error, autem molestiae quisquam aliquam rem sunt dolorum qui rerum maxime
+ corporis.
+
+
+
diff --git a/src/ui/templates/base.html b/src/ui/templates/base.html
index b13077f68..e813bf662 100644
--- a/src/ui/templates/base.html
+++ b/src/ui/templates/base.html
@@ -16,13 +16,13 @@
{% include "menu.html" %} {% include "news.html" %} {% include "flashs.html"
- %}
+ %} {% include "banner.html" %}
From ea45f3c119158ff858a08f545dadc2c29702bc21 Mon Sep 17 00:00:00 2001
From: fl0ppy-d1sk
Date: Mon, 11 Dec 2023 18:48:08 +0100
Subject: [PATCH 012/154] docs - update logos
---
README.md | 67 ++++++++----------
docs/about.md | 2 +-
docs/assets/logo.png | Bin 4050 -> 4626 bytes
docs/concepts.md | 2 +-
docs/index.md | 2 +-
docs/json2md.py | 2 +-
docs/professional-services.md | 2 +-
docs/settings.md | 2 +-
.../images/BUNKERWEB-print-hd-blanc.png | Bin 30346 -> 49316 bytes
src/ui/static/images/BUNKERWEB-print-hd.png | Bin 39964 -> 54105 bytes
src/ui/static/images/favicon-white.ico | Bin
src/ui/static/images/favicon.ico | Bin
src/ui/static/images/logo-menu-2.png | Bin 30346 -> 49316 bytes
src/ui/static/images/logo-menu.png | Bin 39964 -> 54105 bytes
14 files changed, 37 insertions(+), 42 deletions(-)
mode change 100755 => 100644 src/ui/static/images/favicon-white.ico
mode change 100755 => 100644 src/ui/static/images/favicon.ico
diff --git a/README.md b/README.md
index e2ab87983..db928b743 100644
--- a/README.md
+++ b/README.md
@@ -47,9 +47,9 @@
BunkerWeb is a next-generation and open-source Web Application Firewall (WAF).
-Being a full-featured web server (based on [NGINX](https://nginx.org/) under the hood), it will protect your web services to make them "secure by default". BunkerWeb integrates seamlessly into your existing environments ([Linux](https://docs.bunkerweb.io/1.5.4/integrations/#linux), [Docker](https://docs.bunkerweb.io/1.5.4/integrations/#docker), [Swarm](https://docs.bunkerweb.io/1.5.4/integrations/#swarm), [Kubernetes](https://docs.bunkerweb.io/1.5.4/integrations/#kubernetes), β¦) and is fully configurable (don't panic, there is an [awesome web UI](https://docs.bunkerweb.io/1.5.4/web-ui/) if you don't like the CLI) to meet your own use-cases . In other words, cybersecurity is no more a hassle.
+Being a full-featured web server (based on [NGINX](https://nginx.org/) under the hood), it will protect your web services to make them "secure by default". BunkerWeb integrates seamlessly into your existing environments ([Linux](https://docs.bunkerweb.io/1.5.4/integrations/?utm_campaign=self&utm_source=github#linux), [Docker](https://docs.bunkerweb.io/1.5.4/integrations/?utm_campaign=self&utm_source=github#docker), [Swarm](https://docs.bunkerweb.io/1.5.4/integrations/?utm_campaign=self&utm_source=github#swarm), [Kubernetes](https://docs.bunkerweb.io/1.5.4/integrations/?utm_campaign=self&utm_source=github#kubernetes), β¦) and is fully configurable (don't panic, there is an [awesome web UI](https://docs.bunkerweb.io/1.5.4/web-ui/?utm_campaign=self&utm_source=github) if you don't like the CLI) to meet your own use-cases . In other words, cybersecurity is no more a hassle.
-BunkerWeb contains primary [security features](https://docs.bunkerweb.io/1.5.4/security-tuning/) as part of the core but can be easily extended with additional ones thanks to a [plugin system](https://docs.bunkerweb.io/1.5.4/plugins/).
+BunkerWeb contains primary [security features](https://docs.bunkerweb.io/1.5.4/security-tuning/?utm_campaign=self&utm_source=github) as part of the core but can be easily extended with additional ones thanks to a [plugin system](https://docs.bunkerweb.io/1.5.4/plugins/?utm_campaign=self&utm_source=github).
## Why BunkerWeb ?
@@ -74,7 +74,7 @@ Explore the impressive array of security features offered by BunkerWeb. While no
- **Block known bad IPs** with external blacklists and DNSBL : Utilize external blacklists and DNS-based blackhole lists (DNSBL) to proactively block known malicious IP addresses, bolstering your defense against potential threats.
- **And much more...** : BunkerWeb is packed with a plethora of additional security features that go beyond this list, providing you with comprehensive protection and peace of mind.
-Learn more about the core security features in the [security tuning](https://docs.bunkerweb.io/1.5.4/security-tuning/) section of the documentation.
+Learn more about the core security features in the [security tuning](https://docs.bunkerweb.io/1.5.4/security-tuning/?utm_campaign=self&utm_source=github) section of the documentation.
## Demo
@@ -82,7 +82,7 @@ Learn more about the core security features in the [security tuning](https://doc
-A demo website protected with BunkerWeb is available at [demo.bunkerweb.io](https://demo.bunkerweb.io). Feel free to visit it and perform some security tests.
+A demo website protected with BunkerWeb is available at [demo.bunkerweb.io](https://demo.bunkerweb.io/?utm_campaign=self&utm_source=github). Feel free to visit it and perform some security tests.
## Professional services
@@ -98,7 +98,7 @@ Don't hesitate to [contact us](https://panel.bunkerweb.io/contact.php?utm_campai
-You will find more information about the key concepts of BunkerWeb in the [documentation](https://docs.bunkerweb.io/1.5.4/concepts).
+You will find more information about the key concepts of BunkerWeb in the [documentation](https://docs.bunkerweb.io/1.5.4/concepts/?utm_campaign=self&utm_source=github).
## Integrations
@@ -106,13 +106,13 @@ The first concept is the integration of BunkerWeb into the target environment. W
The following integrations are officially supported :
-- [Docker](https://docs.bunkerweb.io/1.5.4/integrations/#docker)
-- [Docker autoconf](https://docs.bunkerweb.io/1.5.4/integrations/#docker-autoconf)
-- [Swarm](https://docs.bunkerweb.io/1.5.4/integrations/#swarm)
-- [Kubernetes](https://docs.bunkerweb.io/1.5.4/integrations/#kubernetes)
-- [Linux](https://docs.bunkerweb.io/1.5.4/integrations/#linux)
-- [Ansible](https://docs.bunkerweb.io/1.5.4/integrations/#ansible)
-- [Vagrant](https://docs.bunkerweb.io/1.5.4/integrations/#vagrant)
+- [Docker](https://docs.bunkerweb.io/1.5.4/integrations/?utm_campaign=self&utm_source=github#docker)
+- [Docker autoconf](https://docs.bunkerweb.io/1.5.4/integrations/?utm_campaign=self&utm_source=github#docker-autoconf)
+- [Swarm](https://docs.bunkerweb.io/1.5.4/integrations/?utm_campaign=self&utm_source=github#swarm)
+- [Kubernetes](https://docs.bunkerweb.io/1.5.4/integrations/?utm_campaign=self&utm_source=github#kubernetes)
+- [Linux](https://docs.bunkerweb.io/1.5.4/integrations/?utm_campaign=self&utm_source=github#linux)
+- [Ansible](https://docs.bunkerweb.io/1.5.4/integrations/?utm_campaign=self&utm_source=github#ansible)
+- [Vagrant](https://docs.bunkerweb.io/1.5.4/integrations/?utm_campaign=self&utm_source=github#vagrant)
## Settings
@@ -132,7 +132,7 @@ USE_GZIP=yes
USE_BROTLI=no
```
-You will find an easy to use settings generator at [config.bunkerweb.io](https://config.bunkerweb.io).
+You will find an easy to use settings generator at [config.bunkerweb.io](https://config.bunkerweb.io/?utm_campaign=self&utm_source=github).
## Multisite mode
@@ -144,7 +144,7 @@ When multisite mode is enabled, BunkerWeb will serve and protect multiple web ap
## Custom configurations
-Because meeting all the use cases only using the settings is not an option (even with [external plugins](https://docs.bunkerweb.io/1.5.4/plugins)), you can use custom configurations to solve your specific challenges.
+Because meeting all the use cases only using the settings is not an option (even with [external plugins](https://docs.bunkerweb.io/1.5.4/plugins/?utm_campaign=self&utm_source=github)), you can use custom configurations to solve your specific challenges.
Under the hood, BunkerWeb uses the notorious NGINX web server, that's why you can leverage its configuration system for your specific needs. Custom NGINX configurations can be included in different [contexts](https://docs.nginx.com/nginx/admin-guide/basic-functionality/managing-configuration-files/#contexts) like HTTP or server (all servers and/or specific server block).
@@ -189,7 +189,7 @@ Docker integration key concepts are :
- **Scheduler** container to store configuration and execute jobs
- **Networks** to expose ports for clients and connect to upstream web services
-You will find more information in the [Docker integration section](https://docs.bunkerweb.io/1.5.4/integrations/#docker) of the documentation.
+You will find more information in the [Docker integration section](https://docs.bunkerweb.io/1.5.4/integrations/?utm_campaign=self&utm_source=github#docker) of the documentation.
## Docker autoconf
@@ -201,7 +201,7 @@ The downside of using environment variables is that the container needs to be re
Instead of defining environment variables for the BunkerWeb container, you simply add **labels** to your web applications containers and the **autoconf** will "automagically" take care of the rest.
-You will find more information in the [Docker autoconf section](https://docs.bunkerweb.io/1.5.4/integrations/#docker-autoconf) of the documentation.
+You will find more information in the [Docker autoconf section](https://docs.bunkerweb.io/1.5.4/integrations/?utm_campaign=self&utm_source=github#docker-autoconf) of the documentation.
## Swarm
@@ -211,9 +211,9 @@ You will find more information in the [Docker autoconf section](https://docs.bun
To automatically configure BunkerWeb instances, a special service, called **autoconf** will listen for Docker Swarm events like service creation or deletion and automatically configure the **BunkerWeb instances** in real-time without downtime.
-Like the [Docker autoconf integration](https://docs.bunkerweb.io/1.5.4/integrations/#docker-autoconf), configuration for web services is defined using labels starting with the special **bunkerweb.** prefix.
+Like the [Docker autoconf integration](https://docs.bunkerweb.io/1.5.4/integrations/?utm_campaign=self&utm_source=github#docker-autoconf), configuration for web services is defined using labels starting with the special **bunkerweb.** prefix.
-You will find more information in the [Swarm section](https://docs.bunkerweb.io/1.5.4/integrations/#swarm) of the documentation.
+You will find more information in the [Swarm section](https://docs.bunkerweb.io/1.5.4/integrations/?utm_campaign=self&utm_source=github#swarm) of the documentation.
## Kubernetes
@@ -223,7 +223,7 @@ You will find more information in the [Swarm section](https://docs.bunkerweb.io/
The autoconf acts as an [Ingress controller](https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/) and will configure the BunkerWeb instances according to the [Ingress resources](https://kubernetes.io/docs/concepts/services-networking/ingress/). It also monitors other Kubernetes objects like [ConfigMap](https://kubernetes.io/docs/concepts/configuration/configmap/) for custom configurations.
-You will find more information in the [Kubernetes section](https://docs.bunkerweb.io/1.5.4/integrations/#kubernetes) of the documentation.
+You will find more information in the [Kubernetes section](https://docs.bunkerweb.io/1.5.4/integrations/?utm_campaign=self&utm_source=github#kubernetes) of the documentation.
## Linux
@@ -240,7 +240,7 @@ List of supported Linux distros :
Repositories of Linux packages for BunkerWeb are available on [PackageCloud](https://packagecloud.io/bunkerity/bunkerweb), they provide a bash script to automatically add and trust the repository (but you can also follow the [manual installation](https://packagecloud.io/bunkerity/bunkerweb/install) instructions if you prefer).
-You will find more information in the [Linux section](https://docs.bunkerweb.io/1.5.4/integrations/#linux) of the documentation.
+You will find more information in the [Linux section](https://docs.bunkerweb.io/1.5.4/integrations/?utm_campaign=self&utm_source=github#linux) of the documentation.
## Ansible
@@ -259,7 +259,7 @@ List of supported Linux distros :
A specific BunkerWeb Ansible role is available on [Ansible Galaxy](https://galaxy.ansible.com/bunkerity/bunkerweb) (source code is available [here](https://github.com/bunkerity/bunkerweb-ansible)).
-You will find more information in the [Ansible section](https://docs.bunkerweb.io/1.5.4/integrations/#ansible) of the documentation.
+You will find more information in the [Ansible section](https://docs.bunkerweb.io/1.5.4/integrations/?utm_campaign=self&utm_source=github#ansible) of the documentation.
## Vagrant
@@ -268,11 +268,11 @@ We maintain ready to use Vagrant boxes hosted on Vagrant cloud for the following
- virtualbox
- libvirt
-You will find more information in the [Vagrant section](https://docs.bunkerweb.io/1.5.4/integrations/#vagrant) of the documentation.
+You will find more information in the [Vagrant section](https://docs.bunkerweb.io/1.5.4/integrations/?utm_campaign=self&utm_source=github#vagrant) of the documentation.
# Quickstart guide
-Once you have setup BunkerWeb with the integration of your choice, you can follow the [quickstart guide](https://docs.bunkerweb.io/1.5.4/quickstart-guide/) that will cover the following common use cases :
+Once you have setup BunkerWeb with the integration of your choice, you can follow the [quickstart guide](https://docs.bunkerweb.io/1.5.4/quickstart-guide/?utm_campaign=self&utm_source=github) that will cover the following common use cases :
- Protecting a single HTTP application
- Protecting multiple HTTP application
@@ -283,19 +283,19 @@ Once you have setup BunkerWeb with the integration of your choice, you can follo
# Security tuning
-BunkerWeb offers many security features that you can configure with [settings](https://docs.bunkerweb.io/1.5.4/settings). Even if the default values of settings ensure a minimal "security by default", we strongly recommend you to tune them. By doing so you will be able to ensure a security level of your choice but also manage false positives.
+BunkerWeb offers many security features that you can configure with [settings](https://docs.bunkerweb.io/1.5.4/settings/?utm_campaign=self&utm_source=github). Even if the default values of settings ensure a minimal "security by default", we strongly recommend you to tune them. By doing so you will be able to ensure a security level of your choice but also manage false positives.
-You will find more information in the [security tuning section](https://docs.bunkerweb.io/1.5.4/security-tuning) of the documentation.
+You will find more information in the [security tuning section](https://docs.bunkerweb.io/1.5.4/security-tuning/?utm_campaign=self&utm_source=github) of the documentation.
# Settings
-To help you tuning BunkerWeb we have made an easy to use settings generator tool available at [config.bunkerweb.io](https://config.bunkerweb.io).
+To help you tuning BunkerWeb we have made an easy to use settings generator tool available at [config.bunkerweb.io](https://config.bunkerweb.io/?utm_campaign=self&utm_source=github).
As a general rule when multisite mode is enabled, if you want to apply settings with multisite context to a specific server you will need to add the primary (first) server name as a prefix like `www.example.com_USE_ANTIBOT=captcha` or `myapp.example.com_USE_GZIP=yes` for example.
When settings are considered as "multiple", it means that you can have multiple groups of settings for the same feature by adding numbers as suffix like `REVERSE_PROXY_URL_1=/subdir`, `REVERSE_PROXY_HOST_1=http://myhost1`, `REVERSE_PROXY_URL_2=/anotherdir`, `REVERSE_PROXY_HOST_2=http://myhost2`, ... for example.
-Check the [settings section](https://docs.bunkerweb.io/1.5.4/settings) of the documentation to get the full list.
+Check the [settings section](https://docs.bunkerweb.io/1.5.4/settings/?utm_campaign=self&utm_source=github) of the documentation to get the full list.
# Web UI
@@ -315,7 +315,7 @@ The "Web UI" is a web application that helps you manage your BunkerWeb instance
- Monitor jobs execution
- View the logs and search pattern
-You will find more information in the [Web UI section](https://docs.bunkerweb.io/1.5.4/web-ui) of the documentation.
+You will find more information in the [Web UI section](https://docs.bunkerweb.io/1.5.4/web-ui/?utm_campaign=self&utm_source=github) of the documentation.
# Plugins
@@ -333,20 +333,15 @@ Here is the list of "official" plugins that we maintain (see the [bunkerweb-plug
| **VirusTotal** | 1.2 | Automatically scans uploaded files with the VirusTotal API and denies the request when a file is detected as malicious. | [bunkerweb-plugins/virustotal](https://github.com/bunkerity/bunkerweb-plugins/tree/main/virustotal) |
| **WebHook** | 1.2 | Send security notifications to a custom HTTP endpoint using a Webhook. | [bunkerweb-plugins/slack](https://github.com/bunkerity/bunkerweb-plugins/tree/main/webhook) |
-You will find more information in the [plugins section](https://docs.bunkerweb.io/1.5.4/plugins) of the documentation.
+You will find more information in the [plugins section](https://docs.bunkerweb.io/1.5.4/plugins/?utm_campaign=self&utm_source=github) of the documentation.
# Support
## Professional
-We offer professional services related to BunkerWeb like :
+Get technical support directly from the BunkerWeb maintainers. You will find more information by visiting the [BunkerWeb Panel](https://panel.bunkerweb.io/?utm_campaign=self&utm_source=github), our dedicated platform for professional services.
-* Consulting
-* Support
-* Custom development
-* Partnership
-
-Please contact us at [contact@bunkerity.com](mailto:contact@bunkerity.com) if you are interested.
+Don't hesitate to [contact us](https://panel.bunkerweb.io/contact.php?utm_campaign=self&utm_source=github) if you have any question, we will be more than happy to respond to your needs.
## Community
diff --git a/docs/about.md b/docs/about.md
index f972313a2..63f4199e2 100644
--- a/docs/about.md
+++ b/docs/about.md
@@ -2,7 +2,7 @@
## Who maintains BunkerWeb ?
-BunkerWeb is maintained by [Bunkerity](https://www.bunkerity.com?utm_campaign=self&utm_source=doc), a French π«π· company specialized in Cybersecurity π‘οΈ.
+BunkerWeb is maintained by [Bunkerity](https://www.bunkerity.com/?utm_campaign=self&utm_source=doc), a French π«π· company specialized in Cybersecurity π‘οΈ.
## Do you offer professional services ?
diff --git a/docs/assets/logo.png b/docs/assets/logo.png
index 2b7bcf430f54ed1d12e2e5c4893cd629e8083733..b209e8c0a7e7db7eb7530e5e484ef4b627212d6d 100644
GIT binary patch
literal 4626
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
IM6N<$g5Q$@GXMYp
literal 4050
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
Eg8F8W6951J
diff --git a/docs/concepts.md b/docs/concepts.md
index 52252820e..ce25ca3d2 100644
--- a/docs/concepts.md
+++ b/docs/concepts.md
@@ -48,7 +48,7 @@ USE_BROTLI=no
!!! info "Settings generator tool"
- To help you tune BunkerWeb, we offer an easy-to-use settings generator tool available at [config.bunkerweb.io](https://config.bunkerweb.io?utm_campaign=self&utm_source=doc).
+ To help you tune BunkerWeb, we offer an easy-to-use settings generator tool available at [config.bunkerweb.io](https://config.bunkerweb.io/?utm_campaign=self&utm_source=doc).
## Multisite mode
diff --git a/docs/index.md b/docs/index.md
index a09e870fb..945c8838a 100644
--- a/docs/index.md
+++ b/docs/index.md
@@ -57,7 +57,7 @@ To delve deeper into the core security features, we invite you to explore the [s
-A demo website protected with BunkerWeb is available at [demo.bunkerweb.io](https://demo.bunkerweb.io?utm_campaign=self&utm_source=doc). Feel free to visit it and perform some security tests.
+A demo website protected with BunkerWeb is available at [demo.bunkerweb.io](https://demo.bunkerweb.io/?utm_campaign=self&utm_source=doc). Feel free to visit it and perform some security tests.
## Professional services
diff --git a/docs/json2md.py b/docs/json2md.py
index daf052292..7ea963260 100755
--- a/docs/json2md.py
+++ b/docs/json2md.py
@@ -39,7 +39,7 @@ doc = StringIO()
print("# Settings\n", file=doc)
print(
- '!!! info "Settings generator tool"\n\n To help you tune BunkerWeb, we have made an easy-to-use settings generator tool available at [config.bunkerweb.io](https://config.bunkerweb.io?utm_campaign=self&utm_source=doc).\n',
+ '!!! info "Settings generator tool"\n\n To help you tune BunkerWeb, we have made an easy-to-use settings generator tool available at [config.bunkerweb.io](https://config.bunkerweb.io/?utm_campaign=self&utm_source=doc).\n',
file=doc,
)
print(
diff --git a/docs/professional-services.md b/docs/professional-services.md
index a5fde998c..4f190c418 100644
--- a/docs/professional-services.md
+++ b/docs/professional-services.md
@@ -8,7 +8,7 @@ But dedicating time to a specific technology may not be easy depending on your b
Getting professional services in addition to the open-source solution is the ideal solution to cover your business needs. You can focus on your top priorities and rely on a trusted partner when it comes to web security.
-Please note that professionnal services are directly offered by [Bunkerity](https://www.bunkerity.com?utm_campaign=self&utm_source=doc), the company maintaining the BunkerWeb project, through our [BunkerWeb Panel](https://panel.bunkerweb.io/?utm_campaign=self&utm_source=doc) online platform.
+Please note that professionnal services are directly offered by [Bunkerity](https://www.bunkerity.com/?utm_campaign=self&utm_source=doc), the company maintaining the BunkerWeb project, through our [BunkerWeb Panel](https://panel.bunkerweb.io/?utm_campaign=self&utm_source=doc) online platform.
## Which professional services do you offer ?
diff --git a/docs/settings.md b/docs/settings.md
index 236421be1..6754f2af9 100644
--- a/docs/settings.md
+++ b/docs/settings.md
@@ -2,7 +2,7 @@
!!! info "Settings generator tool"
- To help you tune BunkerWeb, we have made an easy-to-use settings generator tool available at [config.bunkerweb.io](https://config.bunkerweb.io?utm_campaign=self&utm_source=doc).
+ To help you tune BunkerWeb, we have made an easy-to-use settings generator tool available at [config.bunkerweb.io](https://config.bunkerweb.io/?utm_campaign=self&utm_source=doc).
This section contains the full list of settings supported by BunkerWeb. If you are not yet familiar with BunkerWeb, you should first read the [concepts](concepts.md) section of the documentation. Please follow the instructions for your own [integration](integrations.md) on how to apply the settings.
diff --git a/src/ui/static/images/BUNKERWEB-print-hd-blanc.png b/src/ui/static/images/BUNKERWEB-print-hd-blanc.png
index 44f08f1f86ee8fe38ab0ddf42b426c6e22cef95c..7fca33ef3d28e141c9979b1664a5a880f2ce4fb7 100644
GIT binary patch
literal 49316
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