+-----------------------------------------------------+
|            IF-MAP-Client Version 0.1.6.1            |
+-----------------------------------------------------+

Content:
========
1) Credits

2) License

3) Usage

4) Setup/Installation

   a) Snort installation & setup
   
   b) Nagios installation & setup
   
   c) IP-Tables installation & setup
   
   d) FreeRadius installation & setup
   
   e) configuring IF-MAP-Client
   
   f) running IF-MAP-Client
   
   g) certificate-based authentication
   
5) changelog



1) Credits:
===========
Developed within the ESUKOM-Project in 2011 by Decoit GmbH (http://www.decoit.de/)
Uses the ifmapj-library developed by Trust, FH Hannover (http://trust.inform.fh-hannover.de/) 
Based on the irondhcp-0.1.0 developed by Trust, FH Hannover (http://trust.inform.fh-hannover.de/)

Additional libraries used in current version: 
- Google Guava (http://code.google.com/p/guava-libraries/)
- Apache Commons Exec (http://commons.apache.org/exec/)

more Information can be found on the ESUKOM-Project Homepage (http://www.esukom.de/)



2) License:
===========
Licensed to the Apache Software Foundation (ASF) under one   
or more contributor license agreements.  See the NOTICE file  
distributed with this work for additional information         
regarding copyright ownership.  The ASF licenses this file    
to you under the Apache License, Version 2.0 (the            
"License"); you may not use this file except in compliance    
with the License.  You may obtain a copy of the License at    
                                                               
http://www.apache.org/licenses/LICENSE-2.0                   
                                                               
Unless required by applicable law or agreed to in writing,    
software distributed under the License is distributed on an  
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY        
KIND, either express or implied.  See the License for the     
specific language governing permissions and limitations       
under the License.                



3) Usage:
=========
The IfMapClient in general can be used to observe log-files from different applications (snort/nagios/iptables/radius), 
process these entries, map them to IFMapEvents and send them to a Map-Server. Furthermore, it can subscribe to
some Client-Identifiers and poll for new results (currently only used inside the ip-tables-component).

Currently, the IfMapClient holds different components for working with IPTables, Snort, Radius and Nagios. In the current 
release, only one of the components can be active at a time, so you effectively need one instance of the IfMapClient
for every component you want to observe (this may change in future releases). At current State, the different components 
performs the following tasks:

Snort-Component:    Read out Snort-Alert from logfile or database, map them to IFMAP-Events and send them to the MAP-Server
                 
Nagios-Component:   Receive Nagios-Events over a specific port, map them to IFMAP-Events and send them to the MAP-Server

IPTables-Component: Read out ULOG-File for new Datastreams, maps them to IFMAP-Events and send them to the MAP-Server. 
                    After an initial Datastream is detected, the IfMapClient will eventually perform some checks in order to
                    decide if the client should be unblocked (allowed) or not. These Checks will be done by searching the 
                    current IF-MAP-Metadatagraph for the presence (or absence) of specific Metadata.If a predefined event is 
                    detected for an unblocked (or allowed) client (e.g. a specific snort-alarm), the IfMapClient will block this
                    client via IPTables.

Radius-Component:	Read out Radius-Logfiles for new authentications- and accounting-data. Currently, it recognizes only events 
                    that occur after the start of the client.
 
A more detailed guide on setting up the IfMapClient and its components can be found under section 4d and 4e. 

There are also so called "Stand-Alone-Versions", that are available at the ESUKOM Project-Website (www.esukom.de). These Versions 
comes mostly pre-configured for one of the available Components.                                                                               



4) Setup/Installation:
======================
a) Snort installation & setup:

   If there is no existing Snort Installation, begin with installing and configuring
   the Snort IDS first (http://www.snort.org/). The IfMapClient has currently
   been tested with the following versions:
   
   - Snort 2.9.0.3 under Windows 7 
   - snort 2.8.5.2 under Debian 6
   
   Some Snort-Installation-Guides can be found here:
   
   Win7    : http://www.snort.org/assets/151/Installing_Snort_2.8.6.1_on_Windows_7.pdf
   Debian 6: http://www.snort.org/assets/167/deb_snort_howto.pdf
   more    : http://www.snort.org/docs
   
   A simple and quick way is to use the packet-manager (e.g. Synaptic under Debian) to install snort
   and its components, but in most cases you wont get the latest version

   Next, configure Snorts logging options. Currently there are two logging-modes supported
   by the IfMapClient (in terms that the Client can read the logged messages from Snort):
   
   - read log messages from ASCII-Log-File or Barnyard-Log-Files  (faster, mostly stable)
   - read log messages from Database (MYSQL) (slower, unstable)
   
   To activate ASCII-File_Logging enter add the following line to /etc/snort/snort.conf (section 4, output plugins)
   
   - output alert_full: alertlog
   
   after restarting snort (or reloading the configuration) the log-file will be written to /etc/var/log/snort/alertlog
   
   Take a look at the Snort-Documentation on further information about how to activate the different 
   logging methods within snort-configuration-file.
   
   To enable Portscan detection in Snort, just change the following lines inside snort.conf
   (usually located at /etc/snort/snort.conf):

   ...
   # Portscan detection.  For more information, see README.sfportscan
   preprocessor sfportscan: proto  { all } memcap { 10000000 } sense_level { low } logfile { /var/log/snort/portscan.log }
   ...
   
   After this, restart the Snort Daemon (e.g. /etc/init.d/snortbarn restart)
   
   Additionally, there are some example-files that are distributed with the IfMapClient:
   
   - examples/snort_files/Snortstart(Win7).bat	   -> Batch-File for executing Snort under Windows 7
   - examples/snort_files/create_snort_tables      -> SQL-Statement for creating the snort database scheme
   - examples/snort_files/clear_snort_tables	   -> SQL-Statement for clearing the snort database
   - examples/snort_files/alertlog_dump/alertlog   -> Example Snort-ASCII_Log-File
   - examples/snort_files/db_dump/snort_alerts.sql -> Example Snort-SQL-Dump
   
  
b) Nagios installation & setup:

   Get Nagios from http://www.nagios.org/ or use the packet-manager to install Nagios. Currently,
   the IfMapClient has been tested with Version 3.2.3 (3.10.2010) running under Debian 6.
   
   In order to receive messages from Nagios, the IfMapClient listens to a specific socket-port
   and receives messages from this port. Therefore, Nagios needs a way to send Host/Service
   Information over this port. To accomplish that, we use Nagios-Makros 
   (http://nagios.sourceforge.net/docs/3_0/macros.html) that will be processed and send out 
   by some additional event-handler scripts (http://nagios.sourceforge.net/download/contrib/documentation/german/1_0/eventhandlers.htm). 
   To accomplish this, the following Steps has to be taken:
   
   - inside the nagios.cfg (usually /etc/nagios/) we have to define the location of the
     object-config-file for every host we want to monitor. These files are usually placed
     within the "objects" subfolder. For example, it should look something similar to this:
     
     ...
     cfg_file=/etc/nagios//objects/host1.cfg
     cfg_file=/etc/nagios//objects/host2.cfg
     ...
     
     Some example configuration-files can be found within the example files distributed with this package
     under examples/nagios_files/etc/nagios
     
   - next, we have to define some commands inside commands.cfg (usually /etc/nagios/objects). 
     A command usually contains a command-name and a command-line definition. The important part
     is the command-line definition, where we enter the path to our script that will handle this
     command and the Nagios-Makros that will be passed in to our "eventhandler"-script. Again, you 
     can take a look at the example-files, important for our example are the commands "show-service" and "show-host".
     
   - the next step is to define our eventhandler-scripts. These will be usually placed inside
     the Nagios-"libexec/eventhandler"-folder (e.g. /usr/local/nagios/libexec). Just copy the example-files 
     from the "nagios-files" directory inside this folder (hellohost.sh, helloservice.sh). Within these 
     script you must enter the Address/Port of the IfMapClient that will receive the messages
    
   For further Information and Documentation on Nagios in general take a look at http://www.nagios.org/documentation 
   
   
c) IPTables installation & setup:

   In order to work with IPTables, ULOG has to be installed on the machine. If it is not, just use the 
   packet-manager to install it.


d) FreeRadius installation & setup
	
   Install FreeRadius as described at http://freeradius.org/doc/ . The example folder contains configuration 
   examples for radius. Most important for logging is the log section in the radiusd.conf file. Otherwise
   you can configure the radius server with you own configuration that you find appropriate. The most important
   file is clients.conf. Add all clients which should authenticate with the radius server here.
   If you use a MySQL database for logging and user management you should read the site wiki.freeradius.org/SQL-HOWTO.
   This site explain some basics regarding sql and freeradius. 


e) configuring the IF-MAP-Client:

   to use the IfMapClient you first have to configure it by editing the config files inside the
   "config" folder. The config folder holds two config files and four subfolders
   
   - config.properties: 
     This is the main configuration file for the IfMapClient. Beside some "general" options, the activation
     of the different components can be done here inside the "POLLING/MAPPING CONFIGURATION"-section.
     You can take a look at the comments to get information on how to configure the different components.
     Please Note that only one of the components can be active at a time, so you have to run one instance of
     of the client for each component you want to use.    
     
   - logging.properties:
     Contains properties for application logging (log-level and so on)
   
   - iptables-folder:
     contains the following configuration files for the IPTables component:
     
     - file_polling.properties    -> defines options for observing logfile
     - mapping.properties         -> defines mapping options for converting read in entries to IFMAP-Events
     - enforcement.properties     -> defines options for enforcement via IPTables
   
   - snort-folder:
     contains the following configuration files for the Snort component:
     
     - db_polling.properties      -> defines options for connecting to snort-log sql-database
     - file_polling.properties    -> defines options for observing logfile
     - mapping.properties         -> defines options for converting read in entries to IFMAP-Events
    
   - nagios folder:
     contains the following configuration files for the Nagios component:
     
     - socket_polling.properties  -> defines options for receiving Nagios messages over a specific port
     - mapping.properties defines -> options for mapping Nagios-Events to IFMAP-Events
	 
   - radius folder:
  	 contains the following configuration files for the FreeRadius component:
  	 
  	 - file_polling.properties    -> defines the location of the log-files
  	 - mapping.properties         -> not used a.t.m
   
   
f) running the IF-MAP-Client:
   There are 3 ways of starting the IfMapClient. The First one is using the start.bat or start.sh file which is
   contained in the Main-Folder. If you use these files, the IfMapClient will start with the component that is configured
   inside the main config-file (config/config.properties).
   
   The second option is to use one of the "quickstart"-files. These Files will automatically start the IfMapClient
   using the desired component, so you don�t have to configure the Mapping/Polling Parameters. 
   
   The third way is starting the IfMapClient Jar-File manually. If you choose this way, you can pass an additional
   option for automatically starting one of the components. These additional Options include:
   
   - snort-ascii
   - snort-barnyard
   - snort-sql
   - nagios
   - iptables
   
   If you don�t pass in any parameters, the IfMapClient will start with the component configured in the main config-file
 
 
g) certificate-based authentication:
   the self signed certificate for this map-client (both in .pem and .der format) as well as the map-client's
   keystore are located in the "/keystore" folder. For certificate-based authentication both the map-client and
   the map-server have to contain the relating certificate inside their keystore. The following commands may
   be helpful when dealing with certificates. Both the Java-Keytool and openssl have to be installed on your system
   in order to execute these commands:
   
   - create new keystore: 
     keytool -keystore foo.jks -genkeypair -alias foo
   
   - convert existing keystore to pkcs12 format:
     keytool -importkeystore -srckeystore foo.jks -destkeystore foo.p12 -srcstoretype jks -deststoretype pkcs12
   
   - export certificate from keystore in .pem format using openssl: 
     openssl pkcs12 -in foo.p12 -out foo.pem
   
   - convert certificate to .der format using openssl:
     openssl x509 -outform der -in foo.pem -out foo.der
   
   - import .der-certificate into target keystore:
     keytool -import -alias foo -keystore foo.jks -storepass targetstorepass -file ".der file to import"
     
   - show all certificates in targer keystore:
     keytool -list -keystore foo.jks
     


6) changelog:
=============

changes from Version 0.1.0 to 0.1.1:

-> some small changes inside SnortFilePoller and corresponding Mapping Factory:

   - the client does not crash anymore if there is a IPv6 Address (but still no
     support for IPv6 in this Version...the corresponding entries will just be skipped)
   - the client does not crash if there is no classification inside snort-logfile but will
     use the message-type "other" as fallback. Normally, it should not happen that the
     Classification is missing inside log-file, but in some rare cases it might happen...
     
-> new Polling-Thread and Mapping-Factory for processing snort-portscan-log-files:

   - since snort uses an own file and format for logging detected portscans, there is now
     a separate Poller/Mapper for parsing and mapping portscan-alerts from snort
   - this component has been tested with "nmap" on Win 7 and "overlook Fing" on Android
     "nmap" detection works correct, but it can happen that some scans from "overlook Fing"
     will not always be detected (depending on the snort.conf) 
   
   
changes from Version 0.1.1 to 0.1.2:

-> added "experimental" IP6-support
-> snort-logfiles and portscan-logfiles are now monitored simultaneously
-> corrected parsing of snort-event-names
-> uses the ifmapj-library developed by Trust/FHH for communication with the MAP-server
   insteadt of building communcation on Axis
-> some minor bugfixes 


changes from Version 0.1.2 to 0.1.3:

-> added subscribe and poll functionality
-> added IPTables Component
-> refactored/extended apllication-architecture
-> some minor bugfixes


changes from Version 0.1.3 to 0.1.3.2:

-> added experimental FreeRadius Component
-> extended capabilities of ip-tables-component: more search operations for enforcement/allowance added
-> some major bugfixes in ip-tables component: under some circumstances, the client has skipped some enforcement entries.
   this behaviour has been fixed
-> refactored/extended application-architecture (Polling-Threads)
-> some minor bugfixes
   

changes from Version 0.1.3.2 to 0.1.4:  

-> now uses version 0.1.3 of the ifmapj library
-> added extended enforcement- and allowance-check possibilities for the ip-tables component
-> Snort-Portcan-Polling is now activated at default, so you dont longer have to activate it inside the 
   config-properties file (...also the relating section has been removed, so you cant do it anyhow)
-> fixed a Bug inside the IP-Tables component that could lead to crashes of the client under some
   circumstances when analyzing an incoming Poll-Result
-> fixed the timestamp-format in all components
-> Bugfix in SnortEventMappingFactory and IPTablesMappingFactory that could cause a crash of the client
-> added new certificates
-> introduced some basic mapping-parameters for ip-tables-component
-> added "timedelay" mapping option for iptables component for comparing datastream-events by their time
   using a tolerance-value
-> some minor Bugfixes
-> some cleanup and code-optimizing
-> added quickstart functionality 
-> changed and extended documentation and (this) README
   
   
changes from Version 0.1.4 to 0.1.5:   

-> added esukom-project specific mode to iptables and snort-component  
   
   
changes from Version 0.1.5 to 0.1.5.1:      

-> added gateway-mode for iptables-component
-> changed allowance-mapping for iptables-component in esukom-mode
-> option for enabling/disabling "datastream-detected"-events in iptables-default-mode


changes from Version 0.1.5.1 to 0.1.5.2:      
   
-> bugfix for allowance-checking in iptables-component running in esukom-mode, should
   now work reliable
       
   
(c) 2012 ESUKOM-Project (http://www.esukom.de/)