From 344d809b4a977ceb1270e6aca23b5b75760e9c03 Mon Sep 17 00:00:00 2001 From: Roussange Alexandre Date: Thu, 6 Mar 2025 10:59:03 +0100 Subject: [PATCH] feat(remediation-component): :memo: NodeJS Bouncer doc --- crowdsec-docs/sidebarsUnversioned.js | 17 +++-- .../bouncer/nodejs/screenshots/ban-wall.png | Bin 0 -> 21030 bytes .../nodejs/screenshots/captcha-wall.png | Bin 0 -> 27202 bytes .../unversioned/bouncers/node-js.mdx | 61 ++++++++++++++++++ 4 files changed, 73 insertions(+), 5 deletions(-) create mode 100644 crowdsec-docs/static/img/bouncer/nodejs/screenshots/ban-wall.png create mode 100644 crowdsec-docs/static/img/bouncer/nodejs/screenshots/captcha-wall.png create mode 100644 crowdsec-docs/unversioned/bouncers/node-js.mdx diff --git a/crowdsec-docs/sidebarsUnversioned.js b/crowdsec-docs/sidebarsUnversioned.js index d0843e2b6..2a82e63bc 100644 --- a/crowdsec-docs/sidebarsUnversioned.js +++ b/crowdsec-docs/sidebarsUnversioned.js @@ -213,11 +213,13 @@ module.exports = { type: "doc", id: "console/decisions/decisions_intro", }, - items: [{ - type: "doc", - id: "console/decisions/decisions_management", - label: "Decisions Management 🏅" - }], + items: [ + { + type: "doc", + id: "console/decisions/decisions_management", + label: "Decisions Management 🏅", + }, + ], }, { type: "category", @@ -313,6 +315,11 @@ module.exports = { label: "Nginx", id: "bouncers/nginx", }, + { + type: "doc", + label: "Node.js", + id: "bouncers/node-js", + }, { type: "doc", label: "OpenResty", diff --git a/crowdsec-docs/static/img/bouncer/nodejs/screenshots/ban-wall.png b/crowdsec-docs/static/img/bouncer/nodejs/screenshots/ban-wall.png new file mode 100644 index 0000000000000000000000000000000000000000..4911dea7bdaa0fdc6c1a4209b41936ea50922cb1 GIT binary patch literal 21030 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 + Crowdsec Bouncer logo +

+ +## Overview +This bouncer allows you to protect your Node.js application from IPs that have been detected by CrowdSec. Depending on the decision taken by CrowdSec, user will either get denied (403) or have to fill a captcha (401). + +It supports ban and captcha remediation, and all decisions with Ip or Range scope. + +## Requirements + +- `Node.js >= 20` + +## Installation + +```bash +npm install @crowdsec/nodejs-bouncer +``` + +## Features + +- CrowdSec Local API support + + - Handle `ip` and `range` scoped decisions + - `Live mode` or `Stream mode` + +- Support IpV4 and Ipv6 (Ipv6 range decisions are yet only supported in `Live mode`) + +## Usage + +When a user is suspected by CrowdSec to be malevolent, the bouncer would either display a captcha to resolve or +simply a page notifying that access is denied. If the user is considered as a clean user, the page will be accessible +as normal. + +A ban wall could look like: + +Ban wall + +A captcha wall could look like: + +Captcha wall + +With the provided bouncer, it is possible to customize all the colors of these pages so that they integrate +best with your design. + +On the other hand, all texts are also fully customizable. This will allow you, for example, to present translated pages +in your users' language. + +## Resources + +- [GitHub Repository](https://github.com/crowdsecurity/nodejs-cs-bouncer) +- [Complete User Guide](https://github.com/crowdsecurity/nodejs-cs-bouncer/blob/main/docs/USER_GUIDE.md) +- [Developer Guide](https://github.com/crowdsecurity/nodejs-cs-bouncer/blob/main/docs/DEVELOPER.md) \ No newline at end of file