Try and install crwodsec on nginx
This commit is contained in:
parent
6ec54454a2
commit
126dd2cf53
5 changed files with 93 additions and 104 deletions
56
flake.lock
generated
56
flake.lock
generated
|
@ -61,6 +61,27 @@
|
||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"crowdsec": {
|
||||||
|
"inputs": {
|
||||||
|
"flake-utils": "flake-utils_2",
|
||||||
|
"nixpkgs": [
|
||||||
|
"nixpkgs"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1742920128,
|
||||||
|
"narHash": "sha256-VPjnjtAksihLezhc+ZmnqGu18mHr4QVKa1kSZQ8rJL4=",
|
||||||
|
"ref": "refs/heads/main",
|
||||||
|
"rev": "40e937689d318ee85b1d9763189a65e6f0b4028d",
|
||||||
|
"revCount": 40,
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://codeberg.org/kampka/nix-flake-crowdsec.git"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://codeberg.org/kampka/nix-flake-crowdsec.git"
|
||||||
|
}
|
||||||
|
},
|
||||||
"darwin": {
|
"darwin": {
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"nixpkgs": [
|
"nixpkgs": [
|
||||||
|
@ -106,6 +127,23 @@
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"systems": "systems_3"
|
"systems": "systems_3"
|
||||||
},
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1694529238,
|
||||||
|
"narHash": "sha256-zsNZZGTGnMOf9YpHKJqMSsa0dXbfmxeoJ7xHlrt+xmY=",
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "flake-utils",
|
||||||
|
"rev": "ff7b65b44d01cf9ba6a71320833626af21126384",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"id": "flake-utils",
|
||||||
|
"type": "indirect"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"flake-utils_3": {
|
||||||
|
"inputs": {
|
||||||
|
"systems": "systems_4"
|
||||||
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1731533236,
|
"lastModified": 1731533236,
|
||||||
"narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
|
"narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
|
||||||
|
@ -165,7 +203,7 @@
|
||||||
},
|
},
|
||||||
"microvm": {
|
"microvm": {
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"flake-utils": "flake-utils_2",
|
"flake-utils": "flake-utils_3",
|
||||||
"nixpkgs": [
|
"nixpkgs": [
|
||||||
"nixpkgs"
|
"nixpkgs"
|
||||||
],
|
],
|
||||||
|
@ -220,6 +258,7 @@
|
||||||
"root": {
|
"root": {
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"agenix": "agenix",
|
"agenix": "agenix",
|
||||||
|
"crowdsec": "crowdsec",
|
||||||
"home-manager": "home-manager_2",
|
"home-manager": "home-manager_2",
|
||||||
"microvm": "microvm",
|
"microvm": "microvm",
|
||||||
"nixpkgs": "nixpkgs_2"
|
"nixpkgs": "nixpkgs_2"
|
||||||
|
@ -306,6 +345,21 @@
|
||||||
"repo": "default",
|
"repo": "default",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"systems_4": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1681028828,
|
||||||
|
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
|
||||||
|
"owner": "nix-systems",
|
||||||
|
"repo": "default",
|
||||||
|
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nix-systems",
|
||||||
|
"repo": "default",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"root": "root",
|
"root": "root",
|
||||||
|
|
30
flake.nix
30
flake.nix
|
@ -11,6 +11,10 @@
|
||||||
url = "github:astro/microvm.nix";
|
url = "github:astro/microvm.nix";
|
||||||
inputs.nixpkgs.follows = "nixpkgs";
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
};
|
};
|
||||||
|
crowdsec = {
|
||||||
|
url = "git+https://codeberg.org/kampka/nix-flake-crowdsec.git";
|
||||||
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
|
};
|
||||||
agenix.url = "github:yaxitech/ragenix";
|
agenix.url = "github:yaxitech/ragenix";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -20,12 +24,14 @@
|
||||||
home-manager,
|
home-manager,
|
||||||
microvm,
|
microvm,
|
||||||
agenix,
|
agenix,
|
||||||
|
crowdsec,
|
||||||
...
|
...
|
||||||
}: let
|
}: let
|
||||||
system = "x86_64-linux";
|
system = "x86_64-linux";
|
||||||
username = "tbarnouin";
|
username = "tbarnouin";
|
||||||
proxy_host = "192.168.1.40";
|
proxy_host = "192.168.1.40";
|
||||||
pgsql_host = "192.168.1.13";
|
pgsql_host = "192.168.1.13";
|
||||||
|
pkgs = import nixpkgs {inherit system;};
|
||||||
in {
|
in {
|
||||||
nixosConfigurations = {
|
nixosConfigurations = {
|
||||||
nixmox-curiosity = nixpkgs.lib.nixosSystem {
|
nixmox-curiosity = nixpkgs.lib.nixosSystem {
|
||||||
|
@ -63,6 +69,17 @@
|
||||||
inherit system;
|
inherit system;
|
||||||
modules = [
|
modules = [
|
||||||
agenix.nixosModules.default
|
agenix.nixosModules.default
|
||||||
|
crowdsec.nixosModules.crowdsec-firewall-bouncer
|
||||||
|
({ pkgs, lib, ... }: {
|
||||||
|
nixpkgs.overlays = [crowdsec.overlays.default];
|
||||||
|
services.crowdsec-firewall-bouncer = {
|
||||||
|
enable = true;
|
||||||
|
settings = {
|
||||||
|
api_key = "secret_api_key";
|
||||||
|
api_url = "http://localhost:8080";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
})
|
||||||
"${inputs.nixpkgs}/nixos/modules/virtualisation/proxmox-lxc.nix"
|
"${inputs.nixpkgs}/nixos/modules/virtualisation/proxmox-lxc.nix"
|
||||||
"${inputs.self}/systems/minimalLXCConfig.nix"
|
"${inputs.self}/systems/minimalLXCConfig.nix"
|
||||||
"${inputs.self}/services"
|
"${inputs.self}/services"
|
||||||
|
@ -120,6 +137,19 @@
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
systemd.services.crowdsec.serviceConfig = {
|
||||||
|
ExecStartPre = let
|
||||||
|
script = pkgs.writeScriptBin "register-bouncer" ''
|
||||||
|
#!${pkgs.runtimeShell}
|
||||||
|
set -eu
|
||||||
|
set -o pipefail
|
||||||
|
|
||||||
|
if ! cscli bouncers list | grep -q "my-bouncer"; then
|
||||||
|
cscli bouncers add "my-bouncer" --key "secret_api_key"
|
||||||
|
fi
|
||||||
|
'';
|
||||||
|
in ["${script}/bin/register-bouncer"];
|
||||||
|
};
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,102 +0,0 @@
|
||||||
{
|
|
||||||
config,
|
|
||||||
pkgs,
|
|
||||||
lib,
|
|
||||||
...
|
|
||||||
}: let
|
|
||||||
cfg = config.services.crowdsec-firewall-bouncer;
|
|
||||||
format = pkgs.formats.yaml {};
|
|
||||||
configFile = format.generate "crowdsec.yaml" cfg.settings;
|
|
||||||
|
|
||||||
pkg = cfg.package;
|
|
||||||
|
|
||||||
backend =
|
|
||||||
if config.networking.nftables.enable
|
|
||||||
then "nftables"
|
|
||||||
else "iptables";
|
|
||||||
|
|
||||||
defaultSettings = with lib; {
|
|
||||||
log_mode = "stdout";
|
|
||||||
|
|
||||||
mode = mkDefault backend;
|
|
||||||
ipset_type = mkDefault "nethash";
|
|
||||||
update_frequency = mkDefault "10s";
|
|
||||||
deny_action = mkDefault "DROP";
|
|
||||||
blacklists_ipv4 = mkDefault "crowdsec-blacklists";
|
|
||||||
blacklists_ipv6 = mkDefault "crowdsec6-blacklists";
|
|
||||||
iptables_chains = mkDefault ["INPUT"];
|
|
||||||
};
|
|
||||||
in {
|
|
||||||
options.services.crowdsec-firewall-bouncer = with lib; {
|
|
||||||
enable = mkEnableOption "CrowSec Firewall Bouncer";
|
|
||||||
package = mkPackageOption pkgs "crowdsec-firewall-bouncer" {};
|
|
||||||
settings = mkOption {
|
|
||||||
description = ''
|
|
||||||
Settings for CrowdSec Firewall Bouncer. Refer to <https://docs.crowdsec.net/u/bouncers/firewall/#configuration-directives> for details.
|
|
||||||
'';
|
|
||||||
type = format.type;
|
|
||||||
default = {};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
config = lib.mkIf (cfg.enable) {
|
|
||||||
services.crowdsec-firewall-bouncer.settings = defaultSettings;
|
|
||||||
|
|
||||||
systemd.packages = [pkg];
|
|
||||||
systemd.services = {
|
|
||||||
crowdsec-firewall-bouncer = {
|
|
||||||
description = "Crowdsec Firewall Bouncer";
|
|
||||||
|
|
||||||
path = [pkg pkgs.ipset pkgs.iptables pkgs.nftables];
|
|
||||||
|
|
||||||
wantedBy = ["multi-user.target"];
|
|
||||||
partOf = ["firewall.service"];
|
|
||||||
|
|
||||||
serviceConfig = with lib; {
|
|
||||||
Type = "notify";
|
|
||||||
Restart = "on-failure";
|
|
||||||
RestartSec = 10;
|
|
||||||
|
|
||||||
LimitNOFILE = mkDefault 65536;
|
|
||||||
|
|
||||||
MemoryDenyWriteExecute = mkDefault true;
|
|
||||||
|
|
||||||
CapabilityBoundingSet = mkDefault ["CAP_NET_ADMIN" "CAP_NET_RAW"];
|
|
||||||
|
|
||||||
NoNewPrivileges = mkDefault true;
|
|
||||||
LockPersonality = mkDefault true;
|
|
||||||
RemoveIPC = mkDefault true;
|
|
||||||
|
|
||||||
ProtectSystem = mkDefault "strict";
|
|
||||||
ProtectHome = mkDefault true;
|
|
||||||
|
|
||||||
PrivateTmp = mkDefault true;
|
|
||||||
PrivateDevices = mkDefault true;
|
|
||||||
ProtectHostname = mkDefault true;
|
|
||||||
ProtectKernelTunables = mkDefault true;
|
|
||||||
ProtectKernelModules = mkDefault true;
|
|
||||||
ProtectControlGroups = mkDefault true;
|
|
||||||
|
|
||||||
ProtectProc = mkDefault "invisible";
|
|
||||||
ProcSubset = mkDefault "pid";
|
|
||||||
|
|
||||||
RestrictNamespaces = mkDefault true;
|
|
||||||
RestrictRealtime = mkDefault true;
|
|
||||||
RestrictSUIDSGID = mkDefault true;
|
|
||||||
|
|
||||||
SystemCallFilter = mkDefault ["@system-service" "@network-io"];
|
|
||||||
SystemCallArchitectures = ["native"];
|
|
||||||
SystemCallErrorNumber = mkDefault "EPERM";
|
|
||||||
|
|
||||||
ExecPaths = ["/nix/store"];
|
|
||||||
NoExecPaths = ["/"];
|
|
||||||
|
|
||||||
ExecStartPost = "${pkgs.coreutils}/bin/sleep 0.2";
|
|
||||||
|
|
||||||
ExecStart = "${pkg}/bin/cs-firewall-bouncer -c ${configFile}";
|
|
||||||
ExecStartPre = ["${pkg}/bin/cs-firewall-bouncer -t -c ${configFile}"];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
{inputs, ...}: {
|
{inputs, ...}: {
|
||||||
imports = [
|
imports = [
|
||||||
./crowdsec.nix
|
./crowdsec.nix
|
||||||
./cs-firewall-bouncer.nix
|
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
|
@ -123,6 +123,14 @@ in {
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
{
|
||||||
|
job_name = "nginx";
|
||||||
|
static_configs = [
|
||||||
|
{
|
||||||
|
targets = ["${cfg.proxy_ip}:6060"];
|
||||||
|
}
|
||||||
|
];
|
||||||
|
}
|
||||||
{
|
{
|
||||||
job_name = "redis";
|
job_name = "redis";
|
||||||
static_configs = [
|
static_configs = [
|
||||||
|
|
Loading…
Add table
Reference in a new issue