diff --git a/security/crowdsec/+POST_DEINSTALL.post b/security/crowdsec/+POST_DEINSTALL.post index 536a32529..5934e52d4 100755 --- a/security/crowdsec/+POST_DEINSTALL.post +++ b/security/crowdsec/+POST_DEINSTALL.post @@ -41,8 +41,8 @@ function removeAlias($name) } } -removeAlias('crowdsec_blacklists'); -removeAlias('crowdsec6_blacklists'); +removeAlias('crowdsec_blocklists'); +removeAlias('crowdsec6_blocklists'); EOT diff --git a/security/crowdsec/Makefile b/security/crowdsec/Makefile index 7218bfb38..f61c6c0a0 100644 --- a/security/crowdsec/Makefile +++ b/security/crowdsec/Makefile @@ -1,5 +1,5 @@ PLUGIN_NAME= crowdsec -PLUGIN_VERSION= 1.0.9 +PLUGIN_VERSION= 1.0.10 PLUGIN_DEPENDS= crowdsec PLUGIN_COMMENT= Lightweight and collaborative security engine PLUGIN_MAINTAINER= marco@crowdsec.net diff --git a/security/crowdsec/pkg-descr b/security/crowdsec/pkg-descr index f7889b32d..c1410526b 100644 --- a/security/crowdsec/pkg-descr +++ b/security/crowdsec/pkg-descr @@ -8,6 +8,13 @@ WWW: https://crowdsec.net/ Plugin Changelog ================ +1.0.10 + * changed alias names crowdsec*blacklists -> crowdsec*blocklists + * added rules for outgoing connections too + * added enroll_key to settings for automatic enrollment + * option to disable rule generation (bring your own rules!) + * code cleanup, reformat, typing + 1.0.9 * Update rule reference ($ -> <>) for opnsense 25.1 diff --git a/security/crowdsec/src/etc/inc/plugins.inc.d/crowdsec.inc b/security/crowdsec/src/etc/inc/plugins.inc.d/crowdsec.inc index a1c149a1c..b226f424a 100644 --- a/security/crowdsec/src/etc/inc/plugins.inc.d/crowdsec.inc +++ b/security/crowdsec/src/etc/inc/plugins.inc.d/crowdsec.inc @@ -43,39 +43,69 @@ function crowdsec_firewall(Plugin $fw) $rules_tag = $general['rules_tag']; } - add_alias_if_not_exist('crowdsec_blacklists', 'CrowdSec (IPv4)', 'IPv4'); + add_alias_if_not_exist('crowdsec_blocklists', 'CrowdSec (IPv4)', 'IPv4'); + add_alias_if_not_exist('crowdsec6_blocklists', 'CrowdSec (IPv6)', 'IPv6'); // https://github.com/opnsense/core/blob/master/src/opnsense/mvc/app/library/OPNsense/Firewall/FilterRule.php - $fw->registerFilterRule( - 1, /* priority */ - array( - 'ipprotocol' => 'inet', - 'descr' => 'CrowdSec (IPv4)', - 'from' => '', - 'direction' => 'in', - 'type' => 'block', - 'log' => $rules_log_enabled, - 'tag' => $rules_tag, - 'quick' => true - ) - ); + // if missing, default to true + if (!isset($general['rules_enabled']) || $general['rules_enabled'] != 0) { + $fw->registerFilterRule( + 1, /* priority */ + array( + 'ipprotocol' => 'inet', + 'descr' => 'CrowdSec (IPv4) in', + 'from' => '', + 'direction' => 'in', + 'type' => 'block', + 'log' => $rules_log_enabled, + 'tag' => $rules_tag, + 'quick' => true + ) + ); - add_alias_if_not_exist('crowdsec6_blacklists', 'CrowdSec (IPv6)', 'IPv6'); + $fw->registerFilterRule( + 1, /* priority */ + array( + 'ipprotocol' => 'inet', + 'descr' => 'CrowdSec (IPv4) out', + 'to' => '', + 'direction' => 'out', + 'type' => 'block', + 'log' => $rules_log_enabled, + 'tag' => $rules_tag, + 'quick' => true + ) + ); - $fw->registerFilterRule( - 1, /* priority */ - array( - 'ipprotocol' => 'inet6', - 'descr' => 'CrowdSec (IPv6)', - 'from' => '', - 'direction' => 'in', - 'type' => 'block', - 'log' => $rules_log_enabled, - 'tag' => $rules_tag, - 'quick' => true - ) - ); + $fw->registerFilterRule( + 1, /* priority */ + array( + 'ipprotocol' => 'inet6', + 'descr' => 'CrowdSec (IPv6) in', + 'from' => '', + 'direction' => 'in', + 'type' => 'block', + 'log' => $rules_log_enabled, + 'tag' => $rules_tag, + 'quick' => true + ) + ); + + $fw->registerFilterRule( + 1, /* priority */ + array( + 'ipprotocol' => 'inet6', + 'descr' => 'CrowdSec (IPv6) out', + 'to' => '', + 'direction' => 'out', + 'type' => 'block', + 'log' => $rules_log_enabled, + 'tag' => $rules_tag, + 'quick' => true + ) + ); + } } function crowdsec_services() diff --git a/security/crowdsec/src/opnsense/mvc/app/controllers/OPNsense/CrowdSec/Api/AlertsController.php b/security/crowdsec/src/opnsense/mvc/app/controllers/OPNsense/CrowdSec/Api/AlertsController.php index 6aff27e81..eb11d2440 100644 --- a/security/crowdsec/src/opnsense/mvc/app/controllers/OPNsense/CrowdSec/Api/AlertsController.php +++ b/security/crowdsec/src/opnsense/mvc/app/controllers/OPNsense/CrowdSec/Api/AlertsController.php @@ -15,19 +15,19 @@ use OPNsense\Core\Backend; class AlertsController extends ApiControllerBase { /** - * retrieve list of alerts + * Retrieve list of alerts + * * @return array of alerts * @throws \OPNsense\Base\ModelException * @throws \ReflectionException */ public function getAction() { - $backend = new Backend(); - $bckresult = json_decode(trim($backend->configdRun("crowdsec alerts-list")), true); - if ($bckresult !== null) { + $result = json_decode(trim((new Backend())->configdRun("crowdsec alerts-list")), true); + if ($result !== null) { // only return valid json type responses - return $bckresult; + return $result; } - return array("message" => "unable to list alerts"); + return ["message" => "unable to list alerts"]; } } diff --git a/security/crowdsec/src/opnsense/mvc/app/controllers/OPNsense/CrowdSec/Api/BouncersController.php b/security/crowdsec/src/opnsense/mvc/app/controllers/OPNsense/CrowdSec/Api/BouncersController.php index 94de1a877..5fbc29524 100644 --- a/security/crowdsec/src/opnsense/mvc/app/controllers/OPNsense/CrowdSec/Api/BouncersController.php +++ b/security/crowdsec/src/opnsense/mvc/app/controllers/OPNsense/CrowdSec/Api/BouncersController.php @@ -15,19 +15,19 @@ use OPNsense\Core\Backend; class BouncersController extends ApiControllerBase { /** - * retrieve list of bouncers + * Retrieve list of bouncers + * * @return array of bouncers * @throws \OPNsense\Base\ModelException * @throws \ReflectionException */ public function getAction() { - $backend = new Backend(); - $bckresult = json_decode(trim($backend->configdRun("crowdsec bouncers-list")), true); - if ($bckresult !== null) { + $result = json_decode(trim((new Backend())->configdRun("crowdsec bouncers-list")), true); + if ($result !== null) { // only return valid json type responses - return $bckresult; + return $result; } - return array("message" => "unable to list bouncers"); + return ["message" => "unable to list bouncers"]; } } diff --git a/security/crowdsec/src/opnsense/mvc/app/controllers/OPNsense/CrowdSec/Api/DecisionsController.php b/security/crowdsec/src/opnsense/mvc/app/controllers/OPNsense/CrowdSec/Api/DecisionsController.php index 7421e74e4..e49754fa1 100644 --- a/security/crowdsec/src/opnsense/mvc/app/controllers/OPNsense/CrowdSec/Api/DecisionsController.php +++ b/security/crowdsec/src/opnsense/mvc/app/controllers/OPNsense/CrowdSec/Api/DecisionsController.php @@ -15,36 +15,35 @@ use OPNsense\Core\Backend; class DecisionsController extends ApiControllerBase { /** - * retrieve list of decisions + * Retrieve list of decisions + * * @return array of decisions * @throws \OPNsense\Base\ModelException * @throws \ReflectionException */ public function getAction() { - $backend = new Backend(); - $bckresult = json_decode(trim($backend->configdRun("crowdsec decisions-list")), true); - if ($bckresult !== null) { + $result = json_decode(trim((new Backend())->configdRun("crowdsec decisions-list")), true); + if ($result !== null) { // only return valid json type responses - return $bckresult; + return $result; } - return array("message" => "unable to list decisions"); + return ["message" => "unable to list decisions"]; } public function deleteAction($decision_id) { if ($this->request->isDelete()) { - $backend = new Backend(); - $bckresult = $backend->configdRun("crowdsec decisions-delete ${decision_id}"); - if ($bckresult !== null) { + $result = (new Backend())->configdRun("crowdsec decisions-delete ${decision_id}"); + if ($result !== null) { // why does the action return \n\n for empty output? - if (trim($bckresult) === '') { - return array("message" => "OK"); + if (trim($result) === '') { + return ["message" => "OK"]; } // TODO handle error - return array("message" => $bckresult); + return ["message" => result]; } - return array("message" => "OK"); + return ["message" => "OK"]; } else { $this->response->setStatusCode(405, "Method Not Allowed"); $this->response->setHeader("Allow", "DELETE"); diff --git a/security/crowdsec/src/opnsense/mvc/app/controllers/OPNsense/CrowdSec/Api/HubController.php b/security/crowdsec/src/opnsense/mvc/app/controllers/OPNsense/CrowdSec/Api/HubController.php index a8114ff2c..1bc0fcb89 100644 --- a/security/crowdsec/src/opnsense/mvc/app/controllers/OPNsense/CrowdSec/Api/HubController.php +++ b/security/crowdsec/src/opnsense/mvc/app/controllers/OPNsense/CrowdSec/Api/HubController.php @@ -15,19 +15,19 @@ use OPNsense\Core\Backend; class HubController extends ApiControllerBase { /** - * retrieve the registered hub items + * Retrieve the registered hub items + * * @return dictionary of items, by type * @throws \OPNsense\Base\ModelException * @throws \ReflectionException */ public function getAction() { - $backend = new Backend(); - $bckresult = json_decode(trim($backend->configdRun("crowdsec hub-items")), true); - if ($bckresult !== null) { + $result = json_decode(trim((new Backend())->configdRun("crowdsec hub-items")), true); + if ($result !== null) { // only return valid json type responses - return $bckresult; + return $result; } - return array("message" => "unable to list hub items"); + return ["message" => "unable to list hub items"]; } } diff --git a/security/crowdsec/src/opnsense/mvc/app/controllers/OPNsense/CrowdSec/Api/MachinesController.php b/security/crowdsec/src/opnsense/mvc/app/controllers/OPNsense/CrowdSec/Api/MachinesController.php index 617e43bf4..98e37400b 100644 --- a/security/crowdsec/src/opnsense/mvc/app/controllers/OPNsense/CrowdSec/Api/MachinesController.php +++ b/security/crowdsec/src/opnsense/mvc/app/controllers/OPNsense/CrowdSec/Api/MachinesController.php @@ -15,19 +15,19 @@ use OPNsense\Core\Backend; class MachinesController extends ApiControllerBase { /** - * retrieve list of registered machines + * Retrieve list of registered machines + * * @return array of machines * @throws \OPNsense\Base\ModelException * @throws \ReflectionException */ public function getAction() { - $backend = new Backend(); - $bckresult = json_decode(trim($backend->configdRun("crowdsec machines-list")), true); - if ($bckresult !== null) { + $result = json_decode(trim((new Backend())->configdRun("crowdsec machines-list")), true); + if ($result !== null) { // only return valid json type responses - return $bckresult; + return $result; } - return array("message" => "unable to list machines"); + return ["message" => "unable to list machines"]; } } diff --git a/security/crowdsec/src/opnsense/mvc/app/controllers/OPNsense/CrowdSec/Api/ServiceController.php b/security/crowdsec/src/opnsense/mvc/app/controllers/OPNsense/CrowdSec/Api/ServiceController.php index 477400418..eaa3a84d3 100644 --- a/security/crowdsec/src/opnsense/mvc/app/controllers/OPNsense/CrowdSec/Api/ServiceController.php +++ b/security/crowdsec/src/opnsense/mvc/app/controllers/OPNsense/CrowdSec/Api/ServiceController.php @@ -30,11 +30,12 @@ class ServiceController extends ApiControllerBase } } } - return array("status" => $status); + return ["status" => $status]; } /** - * retrieve status of crowdsec + * Retrieve status of crowdsec + * * @return array * @throws \Exception */ @@ -59,20 +60,9 @@ class ServiceController extends ApiControllerBase $firewall_status = "running"; } - return array( + return [ "crowdsec-status" => $status, "crowdsec-firewall-status" => $firewall_status, - ); - } - - /** - * return debug information - * @return array - */ - public function debugAction() - { - $backend = new Backend(); - $response = $backend->configdRun("crowdsec debug"); - return array("message" => $response); + ]; } } diff --git a/security/crowdsec/src/opnsense/mvc/app/controllers/OPNsense/CrowdSec/Api/VersionController.php b/security/crowdsec/src/opnsense/mvc/app/controllers/OPNsense/CrowdSec/Api/VersionController.php index d236c26f8..d6f09e0c1 100644 --- a/security/crowdsec/src/opnsense/mvc/app/controllers/OPNsense/CrowdSec/Api/VersionController.php +++ b/security/crowdsec/src/opnsense/mvc/app/controllers/OPNsense/CrowdSec/Api/VersionController.php @@ -15,14 +15,14 @@ use OPNsense\Core\Backend; class VersionController extends ApiControllerBase { /** - * retrieve version description + * Retrieve version description + * * @return version description * @throws \OPNsense\Base\ModelException * @throws \ReflectionException */ public function getAction() { - $backend = new Backend(); - return $backend->configdRun("crowdsec version"); + return (new Backend())->configdRun("crowdsec version"); } } diff --git a/security/crowdsec/src/opnsense/mvc/app/controllers/OPNsense/CrowdSec/forms/general.xml b/security/crowdsec/src/opnsense/mvc/app/controllers/OPNsense/CrowdSec/forms/general.xml index 45d9d3f24..849e04eba 100644 --- a/security/crowdsec/src/opnsense/mvc/app/controllers/OPNsense/CrowdSec/forms/general.xml +++ b/security/crowdsec/src/opnsense/mvc/app/controllers/OPNsense/CrowdSec/forms/general.xml @@ -27,6 +27,14 @@ packets from the attacking IP addresses. + + + general.enroll_key + + text + Click "Enroll command" on the the website and copy the key here. + + general.lapi_manual_configuration @@ -66,6 +74,16 @@ services. + + + general.rules_enabled + + checkbox + Generate block rules from the Crowdsec blocklists. + They are applied t all interfaces, ipv4/v6, ingress and egress. + If you disable this, you'll have to write your own rules to block anything. + + general.rules_log diff --git a/security/crowdsec/src/opnsense/mvc/app/models/OPNsense/CrowdSec/General.xml b/security/crowdsec/src/opnsense/mvc/app/models/OPNsense/CrowdSec/General.xml index 4208065f4..da4dbe0f9 100644 --- a/security/crowdsec/src/opnsense/mvc/app/models/OPNsense/CrowdSec/General.xml +++ b/security/crowdsec/src/opnsense/mvc/app/models/OPNsense/CrowdSec/General.xml @@ -1,7 +1,7 @@ //OPNsense/crowdsec/general CrowdSec general configuration - 1.0.9 + 1.0.10 @@ -37,6 +37,11 @@ N + + 1 + Y + + 0 Y @@ -47,6 +52,11 @@ A tag must only contain numbers and letters and must be between 1 and 63 characters. + + /^([0-9a-zA-Z]{1,63})$/u + The enrollment key can only contain numbers and letters and must be between 1 and 63 characters. Did you take it from app.crowdsec.net? + + 0 Y diff --git a/security/crowdsec/src/opnsense/mvc/app/views/OPNsense/CrowdSec/general.volt b/security/crowdsec/src/opnsense/mvc/app/views/OPNsense/CrowdSec/general.volt index c7ae96adf..be347ee53 100644 --- a/security/crowdsec/src/opnsense/mvc/app/views/OPNsense/CrowdSec/general.volt +++ b/security/crowdsec/src/opnsense/mvc/app/views/OPNsense/CrowdSec/general.volt @@ -3,7 +3,7 @@