UNPKG

express-jail

Version:

Express middleware which add malicious actors into a Fail2Ban jail

99 lines (66 loc) 4.57 kB
express-jail ============ Express middleware which add malicious actors into a [Fail2Ban](https://www.fail2ban.org) jail. **Notes:** * This NPM requires `fail2ban` at version `0.11.1` or later to be installed and running to work correctly. * This module does include a testkit but, due to the way that localhost blocking works on Linux, you will need to use an external facing IP to test it ```javascript var port = 8080; var express = require('express'); var expressJail = require('express-jail'); app = express(); app.use(expressJail({ // Options, if any })); // Route setup app.use('/api/foo', (req, res) => res.send({string:'Foo!'})); server = app.listen(port); ``` API === expressJail(options) - Main Middleware -------------------------------------- The main middleware factory function of the module. Called as `(options)` where options is an object which can override the defaults. Returns an [@momsfriendlydevco/eventer](https://github.com/MomsFriendlyDevCo/eventer) EventEmitter(-like) instance which emits the following: | Event | Emitted as | Description | |------------|------------------------|------------------------------------------------------------------------------------------------------------------------------------------------| | `ban` | `(ip, req?, res?)` | Emitted _before_ the ban cycle concludes can return an async function which could eventually return boolean `false` which will prevent the ban | | `banned` | `(ip, req?, res?)` | Emitted _after_ the ban cycle concludes | | `unban` | `(ip)` | Emitted when calling `expressJail.unban(ip)`, can return an (eventual) boolean `false` to abort | | `unbanned` | `(ip)` | Emitted when `expressJail.unban(ip)` concluded | All emitters can optionally return async Promisables which will be waited on. expressJail.defaults -------------------- The default options structure. Can be overridden in each middleware init stage as needed. | Option | Type | Default | Description | |----------------|-----------------|------------|---------------------------------------------------------------------| | `paths` | `Array<String>` | See notes | List of path components to consider malicious | | `responseCode` | `Number` | `404` | Initial response code to send before blocking | | `clientBinary` | `Array<Sring>` | See notes | Prefix exec paths to access `fail2ban-client` | | `jail` | `String` | `"www"` | Jail name to use within F2B to collect the ban list | | `minVersion` | `String` | `"0.11.1"` | Minimum Semver version of F2B to work with, set to falsy to disable | **Notes:** * `paths` are pre-populated from a standard list of malicious scans. If you have any to add please file a PR * `clientBinary` is set to `['/usr/bin/sudo', '/usr/bin/fail2ban-client']` by default. Each argument part should be its own part of the array to be correctly escaped * `jail` is created before launch if it does not already exist expressJailInstance.ban(ip) --------------------------- Can be called manually to ban an IP address. Returns a Promise which will resolve when the operation has completed. expressJailInstance.unban(ip) ----------------------------- Can be called manually to unban an IP address. Returns a Promise which will resolve when the operation has completed. expressJailInstance.bans() -------------------------- Returns a promise which will resolve to a collection of all existing bans in the form `{ip: String, from: Date, time: Number, to: Date}`. expressJailInstance.hasBan(ip) ------------------------------ Convenience wrapper for `expressJailInstance.bans()` which queries a specific IP address. Returns a promise which will resolve to a boolean if the provided IP is in the ban list. expressJailInstance.setup() --------------------------- Setup and configure the Fail2Ban ruleset. This function is automatically run on initialization. Returns a promise which will resolve when the operation has completed.