Author: eelco
Date: Thu May 17 18:19:48 2012
New Revision: 34157
URL: https://nixos.org/websvn/nix/?rev=34157&sc=1

Log:
* Make the fail2ban module configurable.

Modified:
   nixos/trunk/modules/services/security/fail2ban.nix

Modified: nixos/trunk/modules/services/security/fail2ban.nix
==============================================================================
--- nixos/trunk/modules/services/security/fail2ban.nix  Thu May 17 16:07:03 
2012        (r34156)
+++ nixos/trunk/modules/services/security/fail2ban.nix  Thu May 17 18:19:48 
2012        (r34157)
@@ -4,38 +4,76 @@
 
 let
 
-  fail2banConf = pkgs.writeText "fail2ban.conf"
-    ''
-      [Definition]
-      loglevel  = 3
-      logtarget = SYSLOG
-      socket    = /var/run/fail2ban/fail2ban.sock
-    '';
+  cfg = config.services.fail2ban;
+
+  fail2banConf = pkgs.writeText "fail2ban.conf" cfg.daemonConfig;
 
   jailConf = pkgs.writeText "jail.conf"
-    ''
-      [DEFAULT]
-      bantime  = 120
-      findtime = 120
-      maxretry = 3
-      backend  = auto
-    
-      [ssh-iptables]
-      enabled  = true
-      filter   = sshd
-      action   = iptables[name=SSH, port=ssh, protocol=tcp]
-      logpath  = /var/log/warn
-      maxretry = 5
-    '';
+    (concatStringsSep "\n" (attrValues (flip mapAttrs cfg.jails (name: def:
+      optionalString (def != "") 
+        ''
+          [${name}]
+          ${def}
+        ''))));
 
 in
-    
+
 {
 
   ###### interface
 
   options = {
 
+    services.fail2ban = {
+
+      daemonConfig = mkOption {
+        default =
+          ''
+            [Definition]
+            loglevel  = 3
+            logtarget = SYSLOG
+            socket    = /var/run/fail2ban/fail2ban.sock
+          '';
+        type = types.string;
+        description =
+          ''
+            The contents of Fail2ban's main configuration file.  It's
+            generally not necessary to change it.
+          '';
+      };
+
+      jails = mkOption {
+        default = { };
+        example =
+          { "apache-nohome-iptables" =
+              ''
+                # Block an IP address if it accesses a non-existent
+                # home directory more than 5 times in 10 minutes,
+                # since that indicates that it's scanning.
+                filter   = apache-nohome
+                action   = iptables-multiport[name=HTTP, port="http,https"]
+                logpath  = /var/log/httpd/error_log*
+                findtime = 600
+                bantime  = 600
+                maxretry = 5
+              '';
+          };
+        type = types.attrsOf types.string;
+        description =
+          ''
+            The configuration of each Fail2ban “jail”.  A jail
+            consists of an action (such as blocking a port using
+            <command>iptables</command>) that is triggered when a
+            filter applied to a log file triggers more than a certain
+            number of times in a certain time period.  Actions are
+            defined in <filename>/etc/fail2ban/action.d</filename>,
+            while filters are defined in
+            <filename>/etc/fail2ban/filter.d</filename>.
+          '';
+      };
+      
+    };
+
   };
 
   
@@ -69,6 +107,8 @@
         
         preStart =
           ''
+            # FIXME: this won't detect changes to
+            # /etc/fail2ban/{filter.d,action.d}.
             # ${fail2banConf} ${jailConf}
             mkdir -p /var/run/fail2ban -m 0755
           '';
@@ -79,10 +119,28 @@
           ''
             fail2ban-client reload
           '';
-        
-        respawn = false;
       };
-  
+
+    # Add some reasonable default jails.  The special "DEFAULT" jail
+    # sets default values for all other jails.
+    services.fail2ban.jails.DEFAULT =
+      ''
+        ignoreip = 127.0.0.1/8
+        bantime  = 600
+        findtime = 600
+        maxretry = 3
+        backend  = auto
+      '';
+
+    # Block SSH if there are too many failing connection attempts.
+    services.fail2ban.jails."ssh-iptables" =
+      ''
+        filter   = sshd
+        action   = iptables[name=SSH, port=ssh, protocol=tcp]
+        logpath  = /var/log/warn
+        maxretry = 5
+      '';
+    
   };
 
 }
_______________________________________________
nix-commits mailing list
[email protected]
http://lists.science.uu.nl/mailman/listinfo/nix-commits

Reply via email to