]> git.ipfire.org Git - ipfire-2.x.git/blobdiff - html/cgi-bin/ids.cgi
ids.cgi: Show/Hide subscription code area dynamically.
[ipfire-2.x.git] / html / cgi-bin / ids.cgi
index f2362d2dc4c0dc032d9fb046f8b6bb5e5989cd87..6fbc0b7b79d9a38ad20b7b717538508574d03ef6 100644 (file)
@@ -49,44 +49,18 @@ my %ignored=();
 # the list of zones in an array.
 my @network_zones = &IDS::get_available_network_zones();
 
-# File where the used rulefiles are stored.
-my $idsusedrulefilesfile = "$IDS::settingsdir/suricata-used-rulefiles.yaml";
-
-# File where the addresses of the homenet are stored.
-my $idshomenetfile = "$IDS::settingsdir/suricata-homenet.yaml";
-
-# File which contains the enabled sids.
-my $enabled_sids_file = "$IDS::settingsdir/oinkmaster-enabled-sids.conf";
-
-# File which contains the disabled sids.
-my $disabled_sids_file = "$IDS::settingsdir/oinkmaster-disabled-sids.conf";
-
-# File which contains wheater the rules should be changed.
-my $modify_sids_file = "$IDS::settingsdir/oinkmaster-modify-sids.conf";
-
-# File which stores the configured IPS settings.
-my $idssettingsfile = "$IDS::settingsdir/settings";
-
-# File which stores the configured rules-settings.
-my $rulessettingsfile = "$IDS::settingsdir/rules-settings";
-
-# File which stores the configured settings for whitelisted addresses.
-my $ignoredfile = "$IDS::settingsdir/ignored";
-
-# File which contains the rules to whitelist addresses on suricata.
-my $whitelistfile = "$IDS::rulespath/whitelist.rules";
-
 my $errormessage;
 
 # Create files if they does not exist yet.
-unless (-f "$enabled_sids_file") { &IDS::create_empty_file($enabled_sids_file); }
-unless (-f "$disabled_sids_file") { &IDS::create_empty_file($disabled_sids_file); }
-unless (-f "$modify_sids_file") { &IDS::create_empty_file($modify_sids_file); }
-unless (-f "$idsusedrulefilesfile") { &IDS::create_empty_file($idsusedrulefilesfile); }
-unless (-f "$idssettingsfile") { &IDS::create_empty_file($idssettingsfile); }
-unless (-f "$rulessettingsfile") { &IDS::create_empty_file($rulessettingsfile); }
-unless (-f "$ignoredfile") { &IDS::create_empty_file($ignoredfile); }
-unless (-f "$whitelistfile" ) { &IDS::create_empty_file($whitelistfile); }
+&IDS::check_and_create_filelayout();
+
+# Hash which contains the colour code of a network zone.
+my %colourhash = (
+       'red' => $Header::colourred,
+       'green' => $Header::colourgreen,
+       'blue' => $Header::colourblue,
+       'orange' => $Header::colourorange
+);
 
 &Header::showhttpheaders();
 
@@ -119,7 +93,7 @@ if (($cgiparams{'WHITELIST'} eq $Lang::tr{'add'}) || ($cgiparams{'WHITELIST'} eq
                my $new_entry_remark = $cgiparams{'IGNORE_ENTRY_REMARK'};
 
                # Read-in ignoredfile.
-               &General::readhasharray($ignoredfile, \%ignored);
+               &General::readhasharray($IDS::ignored_file, \%ignored);
 
                # Check if we should edit an existing entry and got an ID.
                if (($cgiparams{'WHITELIST'} eq $Lang::tr{'update'}) && ($cgiparams{'ID'})) {
@@ -154,10 +128,10 @@ if (($cgiparams{'WHITELIST'} eq $Lang::tr{'add'}) || ($cgiparams{'WHITELIST'} eq
                $ignored{$id} = ["$new_entry_address", "$new_entry_remark", "$status"];
 
                # Write the changed ignored hash to the ignored file.
-               &General::writehasharray($ignoredfile, \%ignored);
+               &General::writehasharray($IDS::ignored_file, \%ignored);
 
                # Regenerate the ignore file.
-               &GenerateIgnoreFile();
+               &IDS::generate_ignore_file();
        }
 
        # Check if the IDS is running.
@@ -181,7 +155,7 @@ if (($cgiparams{'WHITELIST'} eq $Lang::tr{'add'}) || ($cgiparams{'WHITELIST'} eq
                undef($cgiparams{'ID'});
 
                # Read-in ignoredfile.
-               &General::readhasharray($ignoredfile, \%ignored);
+               &General::readhasharray($IDS::ignored_file, \%ignored);
 
                # Grab the configured status of the corresponding entry.
                my $status = $ignored{$id}[2];
@@ -197,10 +171,10 @@ if (($cgiparams{'WHITELIST'} eq $Lang::tr{'add'}) || ($cgiparams{'WHITELIST'} eq
                $ignored{$id} = ["$ignored{$id}[0]", "$ignored{$id}[1]", "$status"];
 
                # Write the changed ignored hash to the ignored file.
-               &General::writehasharray($ignoredfile, \%ignored);
+               &General::writehasharray($IDS::ignored_file, \%ignored);
 
                # Regenerate the ignore file.
-               &GenerateIgnoreFile();
+               &IDS::generate_ignore_file();
 
                # Check if the IDS is running.
                if(&IDS::ids_is_running()) {
@@ -215,7 +189,7 @@ if (($cgiparams{'WHITELIST'} eq $Lang::tr{'add'}) || ($cgiparams{'WHITELIST'} eq
        my %ignored = ();
 
        # Read-in ignoredfile.
-       &General::readhasharray($ignoredfile, \%ignored);
+       &General::readhasharray($IDS::ignored_file, \%ignored);
 
        # Drop entry from the hash.
        delete($ignored{$cgiparams{'ID'}});
@@ -224,10 +198,10 @@ if (($cgiparams{'WHITELIST'} eq $Lang::tr{'add'}) || ($cgiparams{'WHITELIST'} eq
        undef($cgiparams{'ID'});
 
        # Write the changed ignored hash to the ignored file.
-       &General::writehasharray($ignoredfile, \%ignored);
+       &General::writehasharray($IDS::ignored_file, \%ignored);
 
        # Regenerate the ignore file.
-       &GenerateIgnoreFile();
+       &IDS::generate_ignore_file();
 
        # Check if the IDS is running.
        if(&IDS::ids_is_running()) {
@@ -251,7 +225,6 @@ if (-e $IDS::storederrorfile) {
         unlink($IDS::storederrorfile);
 }
 
-
 ## Grab all available snort rules and store them in the idsrules hash.
 #
 # Open snort rules directory and do a directory listing.
@@ -284,9 +257,9 @@ closedir(DIR);
 # Gather used rulefiles.
 #
 # Check if the file for activated rulefiles is not empty.
-if(-f $idsusedrulefilesfile) {
+if(-f $IDS::used_rulefiles_file) {
        # Open the file for used rulefile and read-in content.
-       open(FILE, $idsusedrulefilesfile) or die "Could not open $idsusedrulefilesfile. $!\n";
+       open(FILE, $IDS::used_rulefiles_file) or die "Could not open $IDS::used_rulefiles_file. $!\n";
 
        # Read-in content.
        my @lines = <FILE>;
@@ -325,7 +298,7 @@ if ($cgiparams{'RULESET'} eq $Lang::tr{'save'}) {
        my %oldsettings;
 
        # Read-in current (old) IDS settings.
-       &General::readhash("$rulessettingsfile", \%oldsettings);
+       &General::readhash("$IDS::rules_settings_file", \%oldsettings);
 
        # Prevent form name from been stored in conf file.
        delete $cgiparams{'RULESET'};
@@ -341,7 +314,7 @@ if ($cgiparams{'RULESET'} eq $Lang::tr{'save'}) {
        # Go on if there are no error messages.
        if (!$errormessage) {
                # Store settings into settings file.
-               &General::writehash("$rulessettingsfile", \%cgiparams);
+               &General::writehash("$IDS::rules_settings_file", \%cgiparams);
        }
 
        # Check if the the automatic rule update hass been touched.
@@ -374,8 +347,8 @@ if ($cgiparams{'RULESET'} eq $Lang::tr{'save'}) {
        # This will be done by calling the read_enabled_disabled_sids_file function two times
        # and merge the returned hashes together into the enabled_disabled_sids hash.
        %enabled_disabled_sids = (
-               &read_enabled_disabled_sids_file($disabled_sids_file),
-               &read_enabled_disabled_sids_file($enabled_sids_file));
+               &read_enabled_disabled_sids_file($IDS::disabled_sids_file),
+               &read_enabled_disabled_sids_file($IDS::enabled_sids_file));
 
        # Loop through the hash of idsrules.
        foreach my $rulefile (keys %idsrules) {
@@ -414,10 +387,10 @@ if ($cgiparams{'RULESET'} eq $Lang::tr{'save'}) {
        }
 
        # Open enabled sid's file for writing.
-       open(ENABLED_FILE, ">$enabled_sids_file") or die "Could not write to $enabled_sids_file. $!\n";
+       open(ENABLED_FILE, ">$IDS::enabled_sids_file") or die "Could not write to $IDS::enabled_sids_file. $!\n";
 
        # Open disabled sid's file for writing.
-       open(DISABLED_FILE, ">$disabled_sids_file") or die "Could not write to $disabled_sids_file. $!\n";
+       open(DISABLED_FILE, ">$IDS::disabled_sids_file") or die "Could not write to $IDS::disabled_sids_file. $!\n";
 
        # Write header to the files.
        print ENABLED_FILE "#Autogenerated file. Any custom changes will be overwritten!\n";
@@ -448,29 +421,8 @@ if ($cgiparams{'RULESET'} eq $Lang::tr{'save'}) {
        # Close file for disabled_sids after writing.
        close(DISABLED_FILE);
 
-       # Open file for used rulefiles.
-       open (FILE, ">$idsusedrulefilesfile") or die "Could not write to $idsusedrulefilesfile. $!\n";
-
-       # Write yaml header to the file.
-       print FILE "%YAML 1.1\n";
-       print FILE "---\n\n";
-
-       # Write header to file.
-       print FILE "#Autogenerated file. Any custom changes will be overwritten!\n";
-
-       # Allways load the whitelist.
-       print FILE " - whitelist.rules\n";
-
-       # Check if the enabled_rulefiles array contains any entries.
-       if (@enabled_rulefiles) {
-               # Loop through the array of rulefiles which should be loaded and write them to the file.
-               foreach my $file (@enabled_rulefiles) {
-                       print FILE " - $file\n";
-               }
-       }
-
-       # Close file after writing.
-       close(FILE);
+       # Call function to generate and write the used rulefiles file.
+       &IDS::write_used_rulefiles_file(@enabled_rulefiles);
 
        # Lock the webpage and print message.
        &working_notice("$Lang::tr{'snort working'}");
@@ -535,7 +487,7 @@ if ($cgiparams{'RULESET'} eq $Lang::tr{'save'}) {
        my $monitored_zones = 0;
 
        # Read-in current (old) IDS settings.
-       &General::readhash("$idssettingsfile", \%oldidssettings);
+       &General::readhash("$IDS::ids_settings_file", \%oldidssettings);
 
        # Prevent form name from been stored in conf file.
        delete $cgiparams{'IDS'};
@@ -568,26 +520,25 @@ if ($cgiparams{'RULESET'} eq $Lang::tr{'save'}) {
        # Go on if there are no error messages.
        if (!$errormessage) {
                # Store settings into settings file.
-               &General::writehash("$idssettingsfile", \%cgiparams);
+               &General::writehash("$IDS::ids_settings_file", \%cgiparams);
        }
 
        # Generate file to store the home net.
-       &generate_home_net_file();
-
-       # Open modify sid's file for writing.
-       open(FILE, ">$modify_sids_file") or die "Could not write to $modify_sids_file. $!\n";
+       &IDS::generate_home_net_file();
 
-       # Write file header.
-       print FILE "#Autogenerated file. Any custom changes will be overwritten!\n";
+       # Temporary variable to set the ruleaction.
+       # Default is "drop" to use suricata as IPS.
+       my $ruleaction="drop";
 
        # Check if the traffic only should be monitored.
-       unless($cgiparams{'MONITOR_TRAFFIC_ONLY'} eq 'on') {
-               # Tell oinkmaster to switch all rules from alert to drop.
-               print FILE "modifysid \* \"alert\" \| \"drop\"\n";
+       if($cgiparams{'MONITOR_TRAFFIC_ONLY'} eq 'on') {
+               # Switch the ruleaction to "alert".
+               # Suricata acts as an IDS only.
+               $ruleaction="alert";
        }
 
-       # Close file handle.
-       close(FILE);
+       # Write the modify sid's file and pass the taken ruleaction.
+       &IDS::write_modify_sids_file($ruleaction);
 
        # Check if "MONITOR_TRAFFIC_ONLY" has been changed.
        if($cgiparams{'MONITOR_TRAFFIC_ONLY'} ne $oldidssettings{'MONITOR_TRAFFIC_ONLY'}) {
@@ -627,8 +578,8 @@ if ($cgiparams{'RULESET'} eq $Lang::tr{'save'}) {
 }
 
 # Read-in idssettings and rulesetsettings
-&General::readhash("$idssettingsfile", \%idssettings);
-&General::readhash("$rulessettingsfile", \%rulessettings);
+&General::readhash("$IDS::ids_settings_file", \%idssettings);
+&General::readhash("$IDS::rules_settings_file", \%rulessettings);
 
 # If no autoupdate intervall has been configured yet, set default value.
 unless(exists($rulessettings{'AUTOUPDATE_INTERVAL'})) {
@@ -661,6 +612,22 @@ $selected{'AUTOUPDATE_INTERVAL'}{$rulessettings{'AUTOUPDATE_INTERVAL'}} = "selec
 ### Java Script ###
 print <<END
 <script>
+       // JQuery function to show/hide the text input field for
+       // Oinkcode/Subscription code.
+       \$(function() {
+               \$('#RULES').change(function(){
+                       if(\$('#RULES').val() == 'registered') {
+                               \$('#code').show();
+                       } else if(\$('#RULES').val() == 'subscripted') {
+                               \$('#code').show();
+                       } else if(\$('#RULES').val() == 'emerging_pro') {
+                               \$('#code').show();
+                       } else {
+                               \$('#code').hide();
+                       }
+               });
+       });
+
        // Tiny java script function to show/hide the rules
        // of a given category.
        function showhide(tblname) {
@@ -781,13 +748,22 @@ foreach my $zone (@network_zones) {
        # Convert current zone name to upper case.
        my $zone_upper = uc($zone);
 
+       # Set zone name.
+       my $zone_name = $zone;
+
+       # Dirty hack to get the correct language string for the red zone.
+       if ($zone eq "red") {
+               $zone_name = "red1";
+       }
+
        # Grab checkbox status from settings hash.
        if ($idssettings{"ENABLE_IDS_$zone_upper"} eq "on") {
                $checked_input = "checked = 'checked'";
        }
 
        print "<td class='base' width='25%'>\n";
-       print "<input type='checkbox' name='ENABLE_IDS_$zone_upper' $checked_input>$Lang::tr{$zone}\n";
+       print "<input type='checkbox' name='ENABLE_IDS_$zone_upper' $checked_input>\n";
+       print "&nbsp$Lang::tr{'enabled on'}<font color='$colourhash{$zone}'> $Lang::tr{$zone_name}</font>\n";
        print "</td>\n";
 }
 
@@ -820,7 +796,7 @@ print <<END
                </tr>
 
                <tr>
-                       <td><select name='RULES'>
+                       <td><select name='RULES' id='RULES'>
                                <option value='emerging' $selected{'RULES'}{'emerging'} >$Lang::tr{'emerging rules'}</option>
                                <option value='community' $selected{'RULES'}{'community'} >$Lang::tr{'community rules'}</option>
                                <option value='registered' $selected{'RULES'}{'registered'} >$Lang::tr{'registered user rules'}</option>
@@ -838,14 +814,11 @@ print <<END
                </tr>
 
                <tr>
-                       <td colspan='2'>
-                               <br>$Lang::tr{'ids rules license'} <a href='https://www.snort.org/subscribe' target='_blank'>www.snort.org</a>$Lang::tr{'ids rules license1'}</br>
-                               <br>$Lang::tr{'ids rules license2'} <a href='https://www.snort.org/account/oinkcode' target='_blank'>Get an Oinkcode</a>, $Lang::tr{'ids rules license3'}</br>
-                       </td>
+                       <td colspan='2'><br><br></td>
                </tr>
 
-               <tr>
-                       <td colspan='2' nowrap='nowrap'>Oinkcode:&nbsp;<input type='text' size='40' name='OINKCODE' value='$rulessettings{'OINKCODE'}'></td>
+               <tr style='display:none' id='code'>
+                       <td colspan='2'>Oinkcode:&nbsp;<input type='text' size='40' name='OINKCODE' value='$rulessettings{'OINKCODE'}'></td>
                </tr>
 
                <tr>
@@ -1248,135 +1221,6 @@ sub get_memory_usage($) {
        return;
 }
 
-#
-## Function to generate the file which contains the home net information.
-#
-sub generate_home_net_file() {
-       my %netsettings;
-
-       # Read-in network settings.
-       &General::readhash("${General::swroot}/ethernet/settings", \%netsettings);
-
-       # Get available network zones.
-       my @network_zones = &IDS::get_available_network_zones();
-
-       # Temporary array to store network address and prefix of the configured
-       # networks.
-       my @networks;
-
-       # Loop through the array of available network zones.
-       foreach my $zone (@network_zones) {
-               # Skip the red network - It never can be part to the home_net!
-               next if($zone eq "red");
-
-               # Convert current zone name into upper case.
-               $zone = uc($zone);
-
-               # Generate key to access the required data from the netsettings hash.
-               my $zone_netaddress = $zone . "_NETADDRESS";
-               my $zone_netmask = $zone . "_NETMASK";
-
-               # Obtain the settings from the netsettings hash.
-               my $netaddress = $netsettings{$zone_netaddress};
-               my $netmask = $netsettings{$zone_netmask};
-
-               # Convert the subnetmask into prefix notation.
-               my $prefix = &Network::convert_netmask2prefix($netmask);
-
-               # Generate full network string.
-               my $network = join("/", $netaddress,$prefix);
-
-               # Check if the network is valid.
-               if(&Network::check_subnet($network)) {
-                       # Add the generated network to the array of networks.
-                       push(@networks, $network);
-               }
-       }
-
-       # Format home net declaration.
-       my $line = "\"\[";
-
-       # Loop through the array of networks.
-       foreach my $network (@networks) {
-               # Add the network to the line.
-               $line = "$line" . "$network";
-
-               # Check if the current network was the last in the array.
-               if ($network eq $networks[-1]) {
-                       # Close the line.
-                       $line = "$line" . "\]\"";
-               } else {
-                       # Add "," for the next network.
-                       $line = "$line" . "\,";
-               }
-       }
-
-       # Open file to store the addresses of the home net.
-       open(FILE, ">$idshomenetfile") or die "Could not open $idshomenetfile. $!\n";
-
-       # Print yaml header.
-       print FILE "%YAML 1.1\n";
-       print FILE "---\n\n";
-
-       # Print notice about autogenerated file.
-       print FILE "#Autogenerated file. Any custom changes will be overwritten!\n";
-
-       # Print the generated and required HOME_NET declaration to the file.
-       print FILE "HOME_NET:\t$line\n";
-
-       # Close file handle.
-       close(FILE);
-
-}
-
-#
-## Function to generate the rules file with whitelisted addresses.
-#
-sub GenerateIgnoreFile() {
-       my %ignored = ();
-
-       # SID range 1000000-1999999 Reserved for Local Use
-       # Put your custom rules in this range to avoid conflicts
-       my $sid = 1500000;
-
-       # Read-in ignoredfile.
-       &General::readhasharray($ignoredfile, \%ignored);
-
-       # Open ignorefile for writing.
-       open(FILE, ">$whitelistfile") or die "Could not write to $whitelistfile. $!\n";
-
-       # Config file header.
-       print FILE "# Autogenerated file.\n";
-       print FILE "# All user modifications will be overwritten.\n\n";
-
-       # Add all user defined addresses to the whitelist.
-       #
-       # Check if the hash contains any elements.
-       if (keys (%ignored)) {
-               # Loop through the entire hash and write the host/network
-               # and remark to the ignore file.
-               while ( (my $key) = each %ignored) {
-                       my $address = $ignored{$key}[0];
-                       my $remark = $ignored{$key}[1];
-                       my $status = $ignored{$key}[2];
-
-                       # Check if the status of the entry is "enabled".
-                       if ($status eq "enabled") {
-                               # Check if the address/network is valid.
-                               if ((&General::validip($address)) || (&General::validipandmask($address))) {
-                                       # Write rule line to the file to pass any traffic from this IP
-                                       print FILE "pass ip $address any -> any any (msg:\"pass all traffic from/to $address\"\; sid:$sid\;)\n";
-
-                                       # Increment sid.
-                                       $sid++;
-                               }
-                       }
-                }
-       }
-
-       close(FILE);
-}
-
 #
 ## Function to read-in the given enabled or disables sids file.
 #