Slackware Snort Installation Guide
Copyright (c) 2007 Jeffrey Denton
http://www.cochiselinux.org/files/slackware-snort-0.2.txt

Written by Jeffrey Denton <[email protected]>
23 Sept 2007
Version - 0.2

This is written for:

$ cat /etc/slackware-version
Slackware 12.0.0

This document was originally based on the Snort Enterprise Install document by
Patrick Harper.

The following will be installed and/or configured:
       Snort
       Barnyard
       BASE
       Oinkmaster
       MySQL
       Apache with SSL
       ModSecurity
       OSSEC HIDS Server and Agent
       LogWatch
       NTOP
       Stunnel


--{ Required Reading ]--

The Snort Users Manual - http://www.snort.org/docs/snort_htmanuals/htmanual_2615
/
The Snort FAQ - http://www.snort.org/docs/faq/3Q06/
Oinkmaster README - http://oinkmaster.sourceforge.net/readme.shtml
Oinkmaster FAQ - http://oinkmaster.sourceforge.net/docs.shtml
How to stop Snort alerts from being generated / how to (not) ignore traffic -
       http://oinkmaster.sourceforge.net/avoiding_snort_alerts.txt
README files - located in the "doc" directory of the source code


--[ Resources ]--

Snort Website - http://www.snort.org
The Snort-users mailing list -
       http://lists.sourceforge.net/lists/listinfo/snort-users
Snort Forums - http://www.snort.org/reg-bin/forums.cgi
Bleeding Edge Threats - http://www.bleedingthreats.net
Bleeding Sigs mailing list -
       http://lists.bleedingthreats.net/cgi-bin/mailman/listinfo/bleeding-sigs
Base Forums - http://base.secureideas.net/support.php
OSSEC Users mailing list - http://www.ossec.net/ossec-list/
ModSecurity documentation - http://www.modsecurity.org/documentation/index.html
NTOP mailing list - http://listgateway.unipi.it/pipermail/ntop/
Safari Library (paid subscription required) - http://safari.oreilly.com


--[ Books ]--

Snort Intrusion Detection and Prevention Toolkit, by Jay Beale, Syngress
       Publishing, February 2007, ISBN - 1597490997

The Tao of Network Security Monitoring, by Richard Bejtlich, Addison-Wesley,
       July 2004,  ISBN - 0321246772

Extrusion Detection, by Richard Bejtlich, Addison-Wesley, November 2005,
       ISBN - 0321349962


--[ Bash Prompt ]--

In this document, the shell prompts are included as part of the commands
that I use.  The current working directory is listed to prevent readers
from getting lost in the directory tree while commands are being run.  I've
modified the default shell prompt for this document to list only the current
working directory without listing the entire path.  I made the change to
minimize the number of lines in the guide that wrap from one line to the next.

If you would like to use the same shell prompt, change the following to:

   root@darkstar:~# vi /etc/profile

       PS1='\u@\h:\w\$ '

To:

       PS1='\u@\h:\W\$ '

To have this change take effect, run the follow for each terminal:

   root@darkstar:~# source /etc/profile


--[ Snort Installation ]--

Create a downloads and a src directory.  The directories will be used to store
downloads and to compile source code.

   dentonj@darkstar:~$ mkdir downloads src
   dentonj@darkstar:~$ cd downloads
   dentonj@darkstar:downloads$ wget http://www.snort.org/dl/current/snort-2.7.0
1.tar.gz
   dentonj@darkstar:downloads$ wget http://www.snort.org/dl/current/snort-2.7.0
1.tar.gz.md5
   dentonj@darkstar:downloads$ md5sum -c snort-2.7.0.1.tar.gz.md5
   snort-2.7.0.1.tar.gz: OK

If this file does not exist, there is a more recent version of Snort available.
Check http://www.snort.org to determine which version of Snort is the latest.
If you would like to use the version of Snort listed above, replace the
"current" directory with "old".  Using an older version of Snort is generally
not recommended.

   dentonj@darkstar:downloads$ cd ../src
   dentonj@darkstar:src$ gzip -cd ../downloads/snort-2.7.0.1.tar.gz | tar xf -
   dentonj@darkstar:src$ cd snort-2.7.0.1
   dentonj@darkstar:snort-2.7.0.1$ ./configure --enable-dynamicplugins
       --enable-timestamps --enable-perfprofiling --enable-gre --with-mysql

If your network does not normally use GRE tunnels, you can remove the
"--enable-gre" option.

   dentonj@darkstar:snort-2.7.0.1$ make
   dentonj@darkstar:snort-2.7.0.1$ su
   root@darkstar:snort-2.7.0.1# make install

Create a user account that Snort will use while running.

   root@darkstar:snort-2.7.0.1# groupadd snort
   root@darkstar:snort-2.7.0.1# useradd -g snort snort -s /bin/false
   root@darkstar:snort-2.7.0.1# passwd -S snort

The newly created user account is locked by default.  Setting the shell to
"/bin/false" is an extra precaution.

Create the directories that are going to be used by Snort:

   root@darkstar:snort-2.7.0.1# mkdir -p /etc/snort/rules
   root@darkstar:snort-2.7.0.1# mkdir -p /var/log/snort/archive
   root@darkstar:snort-2.7.0.1# chown -R snort.snort /var/log/snort

Copy the configuration files to the configuration directory for Snort:

   root@darkstar:snort-2.7.0.1# cd etc
   root@darkstar:etc# cp * /etc/snort

Register as a user on http://www.snort.org.  Then download the month old VRT
Certified Rules.  The downloaded rules contained Shared Object rules that need
to be compiled.  To compile the Shared Object rules, extract the download in
the Snort source code directory.

   dentonj@darkstar:downloads$ ls snortrules-snapshot-CURRENT.tar.gz*
   snortrules-snapshot-CURRENT.tar.gz
   snortrules-snapshot-CURRENT.tar.gz.md5
   dentonj@darkstar:downloads$ md5sum -c snortrules-snapshot-CURRENT.tar.gz.md5
   snortrules-snapshot-CURRENT.tar.gz: OK
   dentonj@darkstar:downloads$ cd ../src/snort-2.7.0.1
   dentonj@darkstar:snort-2.7.0.1$ gzip -cd ../../downloads/snortrules-snapshot
-CURRENT.tar.gz | tar xf -
   dentonj@darkstar:snort-2.7.0.1$ cd so_rules
   dentonj@darkstar:so_rules$ make
   dentonj@darkstar:so_rules$ cat *.rules > so.rules
   dentonj@darkstar:so_rules$ su
   root@darkstar:so_rules# cp so.rules /etc/snort/rules
   root@darkstar:so_rules# mkdir /usr/local/lib/snort_dynamicrule
   root@darkstar:so_rules# cp *.so /usr/local/lib/snort_dynamicrule

Configure Snort to use the Shared Object rules:

   root@darkstar:so_rules# vi /etc/snort/snort.conf

       dynamicdetection directory /usr/local/lib/snort_dynamicrule/
       include $RULE_PATH/so.rules

Copy the rest of the rules to the rule configuration directory for Snort:

   root@darkstar:so_rules# cd ../rules
   root@darkstar:rules# cp * /etc/snort/rules

Bleeding Edge Threats provides Snort rules for the latest vulnerabilities and
computer security threats.  Download the rules:

   dentonj@darkstar:downloads$ wget http://www.bleedingthreats.net/rules/bleedi
ng.rules.tar.gz
   dentonj@darkstar:downloads$ su -
   root@darkstar:~# cd /etc/snort
   root@darkstar:snort# gzip -cd /home/dentonj/downloads/bleeding.rules.tar.gz
| tar xf -

Configure Snort to use the Bleeding Edge Threats rules:

   root@darkstar:snort# vi snort.conf

       include $RULE_PATH/bleeding.conf
       include $RULE_PATH/bleeding-attack_response.rules
       #include $RULE_PATH/bleeding-botcc-BLOCK.rules
       include $RULE_PATH/bleeding-botcc.excluded
       include $RULE_PATH/bleeding-botcc.rules
       #include $RULE_PATH/bleeding-compromised-BLOCK.rules
       include $RULE_PATH/bleeding-compromised.rules
       include $RULE_PATH/bleeding-dos.rules
       #include $RULE_PATH/bleeding-drop-BLOCK.rules
       #include $RULE_PATH/bleeding-drop.rules
       #include $RULE_PATH/bleeding-dshield-BLOCK.rules
       include $RULE_PATH/bleeding-dshield.rules
       include $RULE_PATH/bleeding-exploit.rules
       include $RULE_PATH/bleeding-game.rules
       include $RULE_PATH/bleeding-inappropriate.rules
       include $RULE_PATH/bleeding-malware.rules
       include $RULE_PATH/bleeding-p2p.rules
       include $RULE_PATH/bleeding-policy.rules
       include $RULE_PATH/bleeding-scan.rules
       #include $RULE_PATH/bleeding-storm-BLOCK.rules
       include $RULE_PATH/bleeding-storm.rules
       include $RULE_PATH/bleeding-virus.rules
       include $RULE_PATH/bleeding-voip.rules
       include $RULE_PATH/bleeding-web.rules
       include $RULE_PATH/bleeding-web_sql_injection.rules
       include $RULE_PATH/bleeding.rules

The Community Rules are available from http://www.snort.org.  A registered
user account on http://www.snort.org is not needed to download the rules.

   dentonj@darkstar:downloads$ wget http://www.snort.org/pub-bin/downloads.cgi/
Download/comm_rules/Community-Rules-CURRENT.tar.gz
   dentonj@darkstar:downloads$ wget http://www.snort.org/pub-bin/downloads.cgi/
Download/comm_rules/Community-Rules-CURRENT.tar.gz.md5
   dentonj@darkstar:downloads$ md5sum Community-Rules-CURRENT.tar.gz
   f236b8a4ac12e99d3e7bd81bf3b5a482
   dentonj@darkstar:downloads$ cat Community-Rules-CURRENT.tar.gz.md5
   f236b8a4ac12e99d3e7bd81bf3b5a482
   dentonj@darkstar:downloads$ su -
   root@darkstar:~# cd /etc/snort
   root@darkstar:snort# gzip -cd /home/dentonj/downloads/Community-Rules-CURREN
T.tar.gz | tar xf -

Configure Snort to use the Community Rules:

   root@darkstar:snort# vi snort.conf

       include $RULE_PATH/community-bot.rules
       #include $RULE_PATH/community-deleted.rules
       include $RULE_PATH/community-dos.rules
       include $RULE_PATH/community-exploit.rules
       include $RULE_PATH/community-ftp.rules
       include $RULE_PATH/community-game.rules
       include $RULE_PATH/community-icmp.rules
       include $RULE_PATH/community-imap.rules
       include $RULE_PATH/community-inappropriate.rules
       include $RULE_PATH/community-mail-client.rules
       include $RULE_PATH/community-misc.rules
       include $RULE_PATH/community-nntp.rules
       include $RULE_PATH/community-oracle.rules
       include $RULE_PATH/community-policy.rules
       include $RULE_PATH/community-sip.rules
       include $RULE_PATH/community-smtp.rules
       include $RULE_PATH/community-sql-injection.rules
       include $RULE_PATH/community-virus.rules
       include $RULE_PATH/community-web-attacks.rules
       include $RULE_PATH/community-web-cgi.rules
       include $RULE_PATH/community-web-client.rules
       include $RULE_PATH/community-web-dos.rules
       include $RULE_PATH/community-web-iis.rules
       include $RULE_PATH/community-web-misc.rules
       include $RULE_PATH/community-web-php.rules

Create the startup script for Snort.

   root@darkstar:~# vi /etc/rc.d/rc.snort

       #!/bin/sh
       #
       # Start/Stop/Restart Snort NIDS
       #

       # Specify network interface
       INTERFACE="eth1"
       CONF="/etc/snort/snort.conf"

       snort_start() {
         if ! /sbin/ifconfig $INTERFACE | grep "RUNNING" 1> /dev/null; then
           echo "Bringing up interface $INTERFACE..."
           /sbin/ifconfig $INTERFACE up -arp
           /usr/bin/touch /var/run/snort.$INTERFACE
         fi
         echo "Starting Snort..."
         /usr/local/bin/snort -u snort -g snort -i $INTERFACE -c $CONF \
           -D -F /etc/snort/excludes.conf
       }

       snort_stop() {
         echo "Stopping Snort..."
         /bin/killall snort
         if [ -e /var/run/snort.$INTERFACE ]; then
           echo "Shutting down interface $INTERFACE..."
           /sbin/ifconfig $INTERFACE down
           /usr/bin/rm -f /var/run/snort.$INTERFACE
         fi
       }

       snort_restart() {
         snort_stop
         /usr/bin/sleep 2
         snort_start
       }

       case "$1" in
       'start')
         snort_start
         ;;
       'stop')
         snort_stop
         ;;
       'restart')
         snort_restart
         ;;
       *)
         echo "usage $0 start|stop|restart"
       esac


--[ Configure Snort ]--

Unless otherwise specified, the configurations are for the file
/etc/snort/snort.conf.

Snort has a habit of using relative paths in snort.conf.  In my experience, the
relative paths tend to do nothing but cause problems.  The relative paths
assume that Snort is being started from /etc/snort.  But if Snort is restarted
after editing a rule and the current working directory is /etc/snort/rules or
$HOME, then the startup may encounter problems.  Yes, running the command
"cd /etc/snort" as part of the startup script could fix some of the problems.
But this assumes that Snort is always going to be started using rc.snort.
Starting Snort from the commandline with a current working directory anywhere
in the filesystem other than /etc/snort may cause problems.  An example
problem is Snort reading the threshold.conf file in /etc/snort/rules instead of
/etc/snort.  Use absolute paths to keep from wasting time tracking down weird
startup problems.

   root@darkstar:~# vi /etc/snort/snort.conf

       var RULE_PATH /etc/snort/rules
       include /etc/snort/classification.config
       include /etc/snort/reference.conf
       include /etc/snort/threshold.conf

Snort sets HOME_NET to "any" by default.  HOME_NET is used to specify the IPs
that are used by the network that you are trying to protect.  HOME_NET can
either be left as "any", or it can be set.  If the Snort sensor is located
near a firewall or border router, set HOME_NET to list the IP subnets that are
used on the LAN.  If the Snort sensor is located in a DMZ or a single subnet on
the LAN, then set HOME_NET to the traffic the sensor can see.  Setting
HOME_NET to something other than "any" can potentially reduce the number of
false positive alerts generated by Snort.  To determine the network subnets the
Snort sensor can see, look at the ARP traffic.

   root@darkstar:~# tcpdump -ni eth0 'arp'

       var HOME_NET [192.168.0.0/16,172.16.0.0/12,10.0.0.0/8]

Set the DNS_SERVERS variable to list the DNS servers used by the network.

       var DNS_SERVERS [192.168.2.3,172.18.2.4,10.1.1.5]

Set the SMTP_SERVERS variable to list the servers or bridge heads that will
be generating SMTP traffic. Setting this can cause problems with false
positives on networks that have Digital Senders if they are not listed in the
variable.  Setting this variable can help detect mass-mailing worms that have
infected clients.

       var SMTP_SERVERS [192.168.5.21,192.168.5.22]

If there are dedicated SQL servers on the network, set the SQL_SERVERS
variable.  Setting this to list specific IPs can prevent alerts from being
generated by unauthorized SQL servers or SQL servers not listed in the
variable, such as the Snort sensor.  I prefer to leave this variable set to
$HOME_NET.

       var SQL_SERVERS $HOME_NET

I generally the variables TELNET_SERVERS and SNMP_SERVERS set to $HOME_NET.

Add a variable for multicast traffic and modify an existing rule to reduce
the number of false positives.

       var MULTICAST_NET 224.0.0.0/4

Enable alerting on oversized lengths.  Read the Snort Manual for more
information.

       config enable_decode_oversized_alerts

Configure the detection engine.  By default, the detection engine that is used
is "ac".  With the configuration and rulesets that I use, the "ac" detection
engine can cause the Snort process to consume over 2 GB of memory.  If the
system contains anything less than 4 GB of memory, use the "ac-bnfa" detection
engine.

       config detection: search-method ac-bnfa

Configure the order that rules are processed.  Set pass rules to be processed
first.

       config order: pass alert log activation

Configure performance profiling to locate poorly performing rules.  Poorly
written rules can increase the time it takes to process each packet.  This
configuration will list the top 10 rules that take the most time when
evaluating a packet.  The list wll be generated in /var/log/messages when
Snort is shutdown.  Read the file README.PertProfiling for more information.

       config profile_rules: print 10, sort total_ticks

Increase the tagged packet limit from 256 to 512.

       config tagged_packet_limit: 512

Configure the target-based frag3 preprocessor.  The frag3 preprocessor defines
how fragmented packets are reassembled.  Different operating systems do not
reassemble fragmented packets the same way.  If most of the computers on the
network are Windows systems, use the policy "windows".  If you have the systems
on your network separated on different subnets, such as Linux servers on one
subnet and Windows clients on another subnet, use the "bind_to" option to set
multiple policies.  I'd suggest reading the README.frag3 file, but it is not
up to date.  Read the following paper for more information,
"http://www.snort.org/reg/docs/target_based_frag.pdf".

       preprocessor frag3_global: max_frags 65536, prealloc_frags 65536
       preprocessor frag3_engine: policy windows detect_anomalies

Configure the target-based Stream5 preprocessor.  As with the frag3 preprocessor
, configure the policy to match the computers on the network.  Read the file
READEME.stream5 for more information.

       preprocessor stream5_global: max_tcp 8192, track_tcp yes, track_udp yes
       preprocessor stream5_tcp: policy windows, detect_anomalies
       preprocessor stream5_udp:

Configure capturing of performance statistics.  Read the Snort Manual for more
information.

       preprocessor perfmonitor: time 300 file /var/log/snort/snort.stats \
           pktcnt 10000

Configure the arpspoof preprocessor to watch the default gateway.  To get the
MAC address, either ping the gateway or do a DNS query.  Then run the "arp"
command.

   root@darkstar:~# route -n | grep UG
   0.0.0.0         192.168.1.1     0.0.0.0       UG    0      0        0 eth0
   root@darkstar:~# host google.com
   root@darkstar:~# arp
   Address                HWtype  HWaddress           Flags Mask         Iface
   192.168.1.1            ether   00:00:DE:AD:BE:EF   C                  eth0

       preprocessor arpspoof
       preprocessor arpspoof_detect_host: 192.168.1.1 00:00:DE:AD:BE:EF

Configure the SSH preprocessor.  The protocol mismatch and payload size
detection tend to cause a large number of false positives.  Read the file
README.ssh for more information.

       preprocessor ssh: server_ports { 22 } \
           max_client_bytes 19600 \
           max_encrypted_packets 20 \
           disable_protomismatch \
           disable_paysize

Configure the DCERPC preprocessor.  Read the file README.dcerpc for more
information.

       preprocessor dcerpc: \
           ports smb { 139 445 } ports dcerpc { 135 } \
           max_frag_size 3000 \
           memcap 100000 \
           alert_memcap

Configure the DNS preprocessor.  Read the file README.dns for more information.

       preprocessor dns: \
           ports { 53 } \
           enablerdata_overflow \
           enable_obsolete_types \
           enable_experimental_types

Configure the Snort output for Barnyard.

       output log_unified: filename snort.log, limit 512

Add a file for IP exclusions.  The rc.snort file needs to have the "-F" option
added to use the exclusions.  IP exclusions can be used to ignore IP addresses
that generate a large number of false positives.  An example of a system that
create a large number of false positive are the systems used to scan the
network for vulnerabilities and to verify patch compliance.  Backup servers also
tend to generate a large number of alerts.

   root@darkstar:~# touch /etc/snort/excludes.conf
   root@darkstar:~# vi /etc/snort/excludes.conf

       not src host 192.168.15.234 and
       not src host 192.168.17.27

Add the classification "local" for use on custom rules.  The addition makes it
easier for BASE to list the custom rules.

   root@darkstar:~# vi /etc/snort/classification.config

       config classification: local,Local custom rules,1

Custom rules can be added to the local.rules file.  An example rule is a
Blackhole IP Address.  This is a rule that looks for network traffic going to
an IP address that is not being used.  Network traffic will not originate from
it, and as such, legitimate network traffic should not go to the IP address.
Anyone scanning the network for live hosts or running services will trigger the
rule and generate an alert.  Read the Snort man page for more information.

   root@darkstar:~# vi /etc/snort/rules/local.rules

       alert ip any any -> 192.168.3.127 any (msg:"Blackhole IP Address"; class
type:local; sid:1000001; rev:1;)

Network monitoring utilities can cause the Blackhole IP Address rule to
generate alerts.  These alerts are false positives, meaning the traffic the
rule is detecting is valid network traffic coming from a known host.  To
suppress alerts that are known to be false positives, add a suppress rule.
Add a comment to the suppress rule to serve as a reminder six months from now.

   root@darkstar:~# vi /etc/snort/threshold.conf

       # Blackhole IP Address, Network Monitor
       suppress gen_id 1, sig_id 1000001, track by_src, ip 192.168.5.34

Snort can have problems with dropping packets.  A Snort sensor configured
to use all of the preprocessors and a large ruleset on a congested network will
more than likely drop packets.  If the Snort sensor has problems with dropping
packets, disable some of the preprocessors and reduce the size of the ruleset.
Read the documentation on the Snort website and the books mentioned in the
Resources section for more information on optimizing Snort.

Snort generates and logs statistics while shutting down.

   root@darkstar:~# grep Dropped /var/log/messages*
   root@darkstar:~# zgrep Dropped /var/log/messages*.gz

If the preprocessor perfmonitor is configured, Snort will periodically insert
statistics into the file snort.stats.  Each line of this file contains 52
fields.  A listing of information contained in each field is listed in the
Snort Manual.  The "Drop Rate" is listed in the second field.  Yes, the Snort
Manual does not explain what all of the fields are for.  Ask the developers or
look at the source code.
http://www.snort.org/docs/snort_htmanuals/htmanual_2615/node59.html

   root@darkstar:~# tail -n 1 /var/log/snort/snort.stats | awk -F, '{print NF}'
   root@darkstar:~# less /var/log/snort/snort.stats

The snort.conf configuration file:

   root@darkstar:~# grep -v "^#" /etc/snort/snort.conf | grep -v "^$"

       var HOME_NET [192.168.0.0/16,172.16.0.0/12,10.0.0.0/8]
       var EXTERNAL_NET any
       var DNS_SERVERS [192.168.2.3,172.18.2.4,10.1.1.5]
       var SMTP_SERVERS [192.168.5.21,192.168.5.22]
       var HTTP_SERVERS $HOME_NET
       var SQL_SERVERS $HOME_NET
       var TELNET_SERVERS $HOME_NET
       var SNMP_SERVERS $HOME_NET
       var HTTP_PORTS 80
       var SHELLCODE_PORTS !80
       var ORACLE_PORTS 1521
       var MULTICAST_NET 224.0.0.0/4
       var AIM_SERVERS [64.12.24.0/23,64.12.28.0/23,64.12.161.0/24,64.12.163.0/
24,64.12.200.0/24,205.188.3.0/24,205.188.5.0/24,205.188.7.0/24,205.188.9.0/24,20
5.188.153.0/24,205.188.179.0/24,205.188.248.0/24]
       var RULE_PATH /etc/snort/rules
       config enable_decode_oversized_alerts
       config detection: search-method ac-bnfa
       config order: pass alert log activation
       config profile_rules: print 10, sort total_ticks
       dynamicpreprocessor directory /usr/local/lib/snort_dynamicpreprocessor/
       dynamicengine /usr/local/lib/snort_dynamicengine/libsf_engine.so
       dynamicdetection directory /usr/local/lib/snort_dynamicrule/
       preprocessor frag3_global: max_frags 65536, prealloc_frags 65536
       preprocessor frag3_engine: policy windows detect_anomalies
       preprocessor stream5_global: max_tcp 8192, track_tcp yes, \
                                    track_udp yes
       preprocessor stream5_tcp: policy windows, detect_anomalies
       preprocessor stream5_udp:
       preprocessor perfmonitor: time 300 file /var/log/snort/snort.stats \
           pktcnt 10000
       preprocessor http_inspect: global \
           iis_unicode_map unicode.map 1252
       preprocessor http_inspect_server: server default \
           profile all ports { 80 8080 8180 } oversize_dir_length 500
       preprocessor rpc_decode: 111 32771
       preprocessor bo
       preprocessor ftp_telnet: global \
          encrypted_traffic yes \
          inspection_type stateful
       preprocessor ftp_telnet_protocol: telnet \
          normalize \
          ayt_attack_thresh 200
       preprocessor ftp_telnet_protocol: ftp server default \
          def_max_param_len 100 \
          alt_max_param_len 200 { CWD } \
          cmd_validity MODE < char ASBCZ > \
          cmd_validity MDTM < [ date nnnnnnnnnnnnnn[.n[n[n]]] ] string > \
          chk_str_fmt { USER PASS RNFR RNTO SITE MKD } \
          telnet_cmds yes \
          data_chan
       preprocessor ftp_telnet_protocol: ftp client default \
          max_resp_len 256 \
          bounce yes \
          telnet_cmds yes
       preprocessor smtp: \
         ports { 25 } \
         inspection_type stateful \
         normalize cmds \
         normalize_cmds { EXPN VRFY RCPT } \
         alt_max_command_line_len 260 { MAIL } \
         alt_max_command_line_len 300 { RCPT } \
         alt_max_command_line_len 500 { HELP HELO ETRN } \
         alt_max_command_line_len 255 { EXPN VRFY }
       preprocessor arpspoof
       preprocessor arpspoof_detect_host: 192.168.1.27 00:00:DE:AD:BE:EF
       preprocessor ssh: server_ports { 22 } \
               max_client_bytes 19600 \
               max_encrypted_packets 20 \
               disable_protomismatch \
               disable_paysize
       preprocessor dcerpc: \
               ports smb { 139 445 } ports dcerpc { 135 } \
               max_frag_size 3000 \
               memcap 100000 \
               alert_memcap
       preprocessor dns: \
           ports { 53 } \
           enable_rdata_overflow \
           enable_obsolete_types \
           enable_experimental_types
       output log_unified: filename snort.log, limit 512
       include /etc/snort/classification.config
       include /etc/snort/reference.config
       include $RULE_PATH/local.rules
       include $RULE_PATH/bad-traffic.rules
       include $RULE_PATH/exploit.rules
       include $RULE_PATH/scan.rules
       include $RULE_PATH/finger.rules
       include $RULE_PATH/ftp.rules
       include $RULE_PATH/telnet.rules
       include $RULE_PATH/rpc.rules
       include $RULE_PATH/rservices.rules
       include $RULE_PATH/dos.rules
       include $RULE_PATH/ddos.rules
       include $RULE_PATH/dns.rules
       include $RULE_PATH/tftp.rules
       include $RULE_PATH/web-cgi.rules
       include $RULE_PATH/web-coldfusion.rules
       include $RULE_PATH/web-iis.rules
       include $RULE_PATH/web-frontpage.rules
       include $RULE_PATH/web-misc.rules
       include $RULE_PATH/web-client.rules
       include $RULE_PATH/web-php.rules
       include $RULE_PATH/sql.rules
       include $RULE_PATH/x11.rules
       include $RULE_PATH/icmp.rules
       include $RULE_PATH/netbios.rules
       include $RULE_PATH/misc.rules
       include $RULE_PATH/attack-responses.rules
       include $RULE_PATH/oracle.rules
       include $RULE_PATH/mysql.rules
       include $RULE_PATH/snmp.rules
       include $RULE_PATH/smtp.rules
       include $RULE_PATH/imap.rules
       include $RULE_PATH/pop2.rules
       include $RULE_PATH/pop3.rules
       include $RULE_PATH/nntp.rules
       include $RULE_PATH/other-ids.rules
       include $RULE_PATH/web-attacks.rules
       include $RULE_PATH/backdoor.rules
       include $RULE_PATH/shellcode.rules
       include $RULE_PATH/policy.rules
       include $RULE_PATH/porn.rules
       include $RULE_PATH/info.rules
       include $RULE_PATH/icmp-info.rules
       include $RULE_PATH/virus.rules
       include $RULE_PATH/chat.rules
       include $RULE_PATH/multimedia.rules
       include $RULE_PATH/p2p.rules
       include $RULE_PATH/spyware-put.rules
       include $RULE_PATH/specific-threats.rules
       include $RULE_PATH/experimental.rules
       include $RULE_PATH/so.rules
       include $RULE_PATH/bleeding.conf
       include $RULE_PATH/bleeding-attack_response.rules
       include $RULE_PATH/bleeding-botcc.rules
       include $RULE_PATH/bleeding-compromised.rules
       include $RULE_PATH/bleeding-dos.rules
       include $RULE_PATH/bleeding-drop.rules
       include $RULE_PATH/bleeding-dshield.rules
       include $RULE_PATH/bleeding-exploit.rules
       include $RULE_PATH/bleeding-game.rules
       include $RULE_PATH/bleeding-inappropriate.rules
       include $RULE_PATH/bleeding-malware.rules
       include $RULE_PATH/bleeding-p2p.rules
       include $RULE_PATH/bleeding-policy.rules
       include $RULE_PATH/bleeding-scan.rules
       include $RULE_PATH/bleeding-storm.rules
       include $RULE_PATH/bleeding-virus.rules
       include $RULE_PATH/bleeding-voip.rules
       include $RULE_PATH/bleeding-web.rules
       include $RULE_PATH/bleeding-web_sql_injection.rules
       include $RULE_PATH/bleeding.rules
       include $RULE_PATH/community-bot.rules
       include $RULE_PATH/community-deleted.rules
       include $RULE_PATH/community-dos.rules
       include $RULE_PATH/community-exploit.rules
       include $RULE_PATH/community-ftp.rules
       include $RULE_PATH/community-game.rules
       include $RULE_PATH/community-icmp.rules
       include $RULE_PATH/community-imap.rules
       include $RULE_PATH/community-inappropriate.rules
       include $RULE_PATH/community-mail-client.rules
       include $RULE_PATH/community-misc.rules
       include $RULE_PATH/community-nntp.rules
       include $RULE_PATH/community-oracle.rules
       include $RULE_PATH/community-policy.rules
       include $RULE_PATH/community-sip.rules
       include $RULE_PATH/community-smtp.rules
       include $RULE_PATH/community-sql-injection.rules
       include $RULE_PATH/community-virus.rules
       include $RULE_PATH/community-web-attacks.rules
       include $RULE_PATH/community-web-cgi.rules
       include $RULE_PATH/community-web-client.rules
       include $RULE_PATH/community-web-dos.rules
       include $RULE_PATH/community-web-iis.rules
       include $RULE_PATH/community-web-misc.rules
       include $RULE_PATH/community-web-php.rules
       include /etc/snort/threshold.conf


--[ Configure MySQL ]--

MySQL should be installed during the installation of Slackware.  To check to
see if MySQL is installed:

   dentonj@darkstar:~$ /usr/libexec/mysqld --version
   usr/libexec/mysqld  Ver 5.0.37 for slackware-linux-gnu on i486 (Source distr
ibution)

By default, MySQL will not start in Slackware.  The mysql database must first
be created.

   dentonj@darkstar:~$ su -
   root@darkstar:~# su - mysql
   mysql@darkstar:~$ mysql_install_db
   mysql@darkstar:~$ exit

Slackware prevents MySQL from accepting network connections by default.
Comment out the following line:

   root@darkstar:~# vi /etc/rc.d/rc.mysqld

       #SKIP="--skip-networking"

Change the permissions on the RC file and start MySQL:

   root@darkstar:~# chmod 700 /etc/rc.d/rc.mysqld
   root@darkstar:~# /etc/rc.d/rc.mysqld start

Secure MySQL before continuing. Run the following command and answer the
questions as follows:

   root@darkstar:~# mysql_secure_installation

       Set root password? Y
       Remove anonymous users? Y
       Disallow root login remotely? Y
       Remove test database and access to it? Y
       Reload privilege tables now? Y

Create the tables for the snort database:

   root@darkstar:~# mysql -p < /home/dentonj/src/snort-2.7.0.1/schemas/create_m
ysql snort

Check the tables:

   root@darkstar:~# mysql -p
   mysql> show databases;
   +--------------------+
   | Database           |
   +--------------------+
   | information_schema |
   | mysql              |
   | snort              |
   +--------------------+
   3 rows in set (0.01 sec)

   mysql> use snort;
   mysql> show tables;
   +------------------+
   | Tables_in_snort  |
   +------------------+
   | data             |
   | detail           |
   | encoding         |
   | event            |
   | icmphdr          |
   | iphdr            |
   | opt              |
   | reference        |
   | reference_system |
   | schema           |
   | sensor           |
   | sig_class        |
   | sig_reference    |
   | signature        |
   | tcphdr           |
   | udphdr           |
   +------------------+
   16 rows in set (0.01 sec)

   mysql> exit

The mysql client logs all commands to a history file.  Any commands that set
passwords will be saved in the history file.  If the idea of passwords to MySQL
being present in the history file bothers you, overwrite the file.

   root@darkstar:~# less .mysql_history
   root@darkstar:~# cat /dev/null > .mysql_history

There are four example my.cnf files in the /etc directory.  The differences
between them is how much memory is configured for use by MySQL.  Copy the
appropriate configuration file to /etc/my.cnf.

   root@darkstar:~# cp /etc/my-huge.cnf /etc/my.cnf

From "man mysqld", "To avoid a possible security hole where a user adds a
--user=root option to a my.cnf file (thus causing the server to run as root),
mysqld uses only the first --user option specified and produces a warning if
there are multiple --user options. Options in /etc/my.cnf and
$MYSQL_HOME/my.cnf are processed before command-line options, so it is
recommended that you put a --user option in /etc/my.cnf and specify a value
other than root."  Add the following the the "[mysqld]" section of the
configuration file:

   root@darkstar:~# vi /etc/my.cnf

       user = mysql

The Snort sensor is not going to have any entries in a DNS server.  Hostnames
do not need to be resolved.  All grant statements must be an IP address or
localhost.  A slight performance increase may be gained by not resolving
hostnames.  Add the following in the "[mysqld]" section of the configuration
file:

   root@darkstar:~# vi /etc/my.cnf

       skip-name-resolve

There is only going to be one instance of mysqld running on the Snort sensor.
The snort database is not going to be shared with any other process.  External
locking can be disabled to gain a slight performance boost.  Add the following
in the "[mysqld]" section of the configuration file:

   root@darkstar:~# vi /etc/my.cnf

       skip-external-locking

Do not allow authentication to mysqld for accounts that use old (pre-4.1)
passwords.  Prevent the mysql client from connecting to a server that requires
a password in the old format.  Add the following in the "[mysqld]" and
"[mysql]" sections of the configuration file:

   root@darkstar:~# vi /etc/my.cnf

       secure-auth

The MySQL storage engine that is used by default is MyISAM.  The InnoDB storage
engine can be disabled.  Add the following:

   root@darkstar:~# vi /etc/rc.d/rc.mysqld

       SKIP="--skip-innodb"

Restart MySQL so the configuration changes take effect:

   root@darkstar:~# /etc/rc.d/rc.mysqld restart


--[ BASE Installation ]--

Before we can install BASE, some prerequisits for PHP must first be installed.
The command "pear" is used to download and install packages from the PHP
Extension and Application Repository.

   dentonj@darkstar:~$ su -
   root@darkstar:~# pear install --alldeps Image_Graph-alpha
       Image_Canvas-alpha Image_Color Numbers_Roman
   root@darkstar:~# pear list
   Installed packages, channel pear.php.net:
   =========================================
   Package          Version State
   Archive_Tar      1.3.2   stable
   Console_Getopt   1.2.2   stable
   Image_Canvas     0.3.1   alpha
   Image_Color      1.0.2   stable
   Image_Graph      0.7.2   alpha
   Numbers_Roman    0.2.0   stable
   Numbers_Words    0.15.0  beta
   PEAR             1.5.4   stable
   Structures_Graph 1.0.2   stable

ADODB is a database abstraction library for PHP.  It is required by BASE.
Download ADODB and BASE:

   dentonj@darkstar:~/downloads$ wget http://easynews.dl.sourceforge.net/source
forge/adodb/adodb480.tgz
   dentonj@darkstar:~/downloads$ wget http://easynews.dl.sourceforge.net/source
forge/secureideas/base-1.3.8.tar.gz

Check http://base.secureideas.net to determine which verson of BASE is the
latest.  Note:  base-1.3.8 was not listed on the home page when this was
written.  Check the "Downloads" link.

Extract ADODB:

   dentonj@darkstar:downloads$ su -
   root@darkstar:~# cd /var/www
   root@darkstar:www# tar xvf /home/dentonj/downloads/adodb480.tgz

ADODB is nice enough to be distributed with world writable files.  Fix this
problem:

   root@darkstar:www# chmod -R o-w adodb

Extract BASE:

   root@darkstar:www# cd htdocs
   root@darkstar:htdocs# tar zxf /home/dentonj/downloads/base-1.3.8.tar.gz
   root@darkstar:htdocs# mv base-1.3.8 frontend

It's common to rename the base-1.3.8 directory to base or create a symlink.  I
rename the directory to something that is not so obvious and is not checked by
Nikto to provide some obfuscation.

Configure BASE:

   root@darkstar:htdocs# cd frontend
   root@darkstar:frontend# cp base_conf.php.dist base_conf.php
   root@darkstar:frontend# vi base_conf.php

       $BASE_urlpath = '/frontend';
       $DBlib_path = '/var/www/adodb';
       $DBtype = 'mysql';
       $alert_dbname = 'snort';
       $alert_host = 'localhost';
       $alert_port = '';
       $alert_user = 'snort';
       $alert_password = 'mysqlsnortpassword';
       $show_rows = 90;
       $show_expanded_query = 1;
       $colored_alerts = 1;

Change the following line from:

       $priority_colors = array('FF0000','FFFF00','FF9900','999999','FFFFFF','0
06600');

To:

       $priority_colors = array('000000','FF0000','FF9900','FFFF00','999999');

Snort uses the priorities 1 through 4.  The array starts counting from zero.  I
also changed the order of the colors and remove the excess.

Some of the Snort rules are documented to explain what the rule is looking for.
BASE is setup to create links to this documentation.  Copy the rule
documentation directory into the BASE directory.

   root@darkstar:frontend# cd /home/dentonj/src/snort-2.7.0.1/doc
   root@darkstar:doc# cp -r signatures /var/www/htdocs/frontend


--[ Configure the web server ]--

BASE should only be accessed using SSL.  The Apache web server needs to be
configured to use SSL.  Apache also needs to be locked down a little bit.

Enable loading of the SSL modules and the configuration file for SSL.
Uncomment the following lines:

   root@darkstar:~# vi /etc/httpd/httpd.conf

       LoadModule ssl_module lib/httpd/modules/mod_ssl.so
       Include /etc/httpd/extra/httpd-ssl.conf

Set the server's name to localhost and add a line to slow down fingerprinting
of the server.  Add the following:

   root@darkstar:~# vi /etc/httpd/httpd.conf

       ServerName localhost
       ServerSignature Off

Configure the Pseudo Random Number Generator.  Uncomment the following lines:

   root@darkstar:~# vi /etc/httpd/extra/httpd-ssl.conf

       SSLRandomSeed startup file:/dev/urandom 512
       SSLRandomSeed connect file:/dev/urandom 512

The web server needs a server certificate and a server private key to use SSL.
The keys are going to be created without a passphrase.  If a passphrase is
used, that passphrase must be entered everytime the web server starts.

   root@darkstar:~# openssl genrsa -out server.key 2048
   root@darkstar:~# openssl req -new -key server.key -out server.csr
   root@darkstar:~# openssl x509 -reg -days 1095 -in server.csr -signkey server
key -out server.crt

Copy the server certificate and the server private key into /etc/httpd:

   root@darkstar:~# cp server.key /etc/httpd
   root@darkstar:~# cp server.crt /etc/httpd
   root@darkstar:~# chmod 400 /etc/httpd/server.*

There are a number of files and directories in /var/www/htdocs that can be
used to identify the web server.  We are not going to use a local search
engine, so htdig can be removed from the system.  The Apache manual can be
moved to another location so that it is still available if needed.  The rest
of the files can be deleted.

   root@darkstar:~# removepkg htdig
   root@darkstar:~# mv /var/www/htdocs/manual /var/www
   root@darkstar:~# rm /var/www/htdocs/apache_pb*

Create an empty index.html file.

   root@darkstar:~# cat /dev/null > /var/www/htdocs/index.html

Restrict access to the BASE directory to authorized users.  Create the password
file and configure the users that will be allowed to access BASE.

   root@darkstar:~# mkdir /var/www/passwords
   root@darkstar:~# htpasswd -c /var/www/passwords/passwords dentonj
   root@darkstar:~# htpasswd /var/www/passwords/passwords baseuser
   root@darkstar:~# chmod -R o-rwx /var/www/passwords

Configure the BASE directory to only allow access to authorized users.
Slackware follows the Filesystem Hierarchy Standard.  Because of this standard,
the directory /srv is the location for data for services provided by the
system.  While the directory /srv contains a symlink to /var/www, the directive
DocumentRoot is set to /srv/httpd/htdocs.  Basic authentication is OK when used
with SSL.  I have not been able to get BASE to work properly with Digest
authentication.  Add the following:

   root@darkstar:~# vi /etc/httpd/httpd.conf

       <Directory "/srv/httpd/htdocs/frontend">
         AuthType Basic
         AuthName "Authentication"
         AuthUserFile /srv/httpd/passwords/passwords
         Require user dentonj baseuser
       </Directory>

Most of the Apache modules are not needed.  Comment out the following:

   root@darkstar:~# vi /etc/httpd/httpd.conf

       #LoadModule authn_dbm_module lib/httpd/modules/mod_authn_dbm.so
       #LoadModule authn_anon_module lib/httpd/modules/mod_authn_anon.so
       #LoadModule authn_dbd_module lib/httpd/modules/mod_authn_dbd.so
       #LoadModule authn_default_module lib/httpd/modules/mod_authn_default.so
       #LoadModule authn_alias_module lib/httpd/modules/mod_authn_alias.so
       #LoadModule authz_groupfile_module lib/httpd/modules/mod_authz_groupfile
so
       #LoadModule authz_dbm_module lib/httpd/modules/mod_authz_dbm.so
       #LoadModule authz_owner_module lib/httpd/modules/mod_authz_owner.so
       #LoadModule authnz_ldap_module lib/httpd/modules/mod_authnz_ldap.so
       #LoadModule authz_default_module lib/httpd/modules/mod_authz_default.so
       #LoadModule auth_digest_module lib/httpd/modules/mod_auth_digest.so
       #LoadModule file_cache_module lib/httpd/modules/mod_file_cache.so
       #LoadModule cache_module lib/httpd/modules/mod_cache.so
       #LoadModule disk_cache_module lib/httpd/modules/mod_disk_cache.so
       #LoadModule mem_cache_module lib/httpd/modules/mod_mem_cache.so
       #LoadModule dbd_module lib/httpd/modules/mod_dbd.so
       #LoadModule dumpio_module lib/httpd/modules/mod_dumpio.so
       #LoadModule ext_filter_module lib/httpd/modules/mod_ext_filter.so
       #LoadModule include_module lib/httpd/modules/mod_include.so
       #LoadModule filter_module lib/httpd/modules/mod_filter.so
       #LoadModule deflate_module lib/httpd/modules/mod_deflate.so
       #LoadModule ldap_module lib/httpd/modules/mod_ldap.so
       #LoadModule log_forensic_module lib/httpd/modules/mod_log_forensic.so
       #LoadModule logio_module lib/httpd/modules/mod_logio.so
       #LoadModule env_module lib/httpd/modules/mod_env.so
       #LoadModule cern_meta_module lib/httpd/modules/mod_cern_meta.so
       #LoadModule expires_module lib/httpd/modules/mod_expires.so
       #LoadModule headers_module lib/httpd/modules/mod_headers.so
       #LoadModule ident_module lib/httpd/modules/mod_ident.so
       #LoadModule usertrack_module lib/httpd/modules/mod_usertrack.so
       #LoadModule version_module lib/httpd/modules/mod_version.so
       #LoadModule proxy_module lib/httpd/modules/mod_proxy.so
       #LoadModule proxy_connect_module lib/httpd/modules/mod_proxy_connect.so
       #LoadModule proxy_ftp_module lib/httpd/modules/mod_proxy_ftp.so
       #LoadModule proxy_http_module lib/httpd/modules/mod_proxy_http.so
       #LoadModule proxy_ajp_module lib/httpd/modules/mod_proxy_ajp.so
       #LoadModule proxy_balancer_module lib/httpd/modules/mod_proxy_balancer.s
o
       #LoadModule dav_module lib/httpd/modules/mod_dav.so
       #LoadModule status_module lib/httpd/modules/mod_status.so
       #LoadModule autoindex_module lib/httpd/modules/mod_autoindex.so
       #LoadModule asis_module lib/httpd/modules/mod_asis.so
       #LoadModule info_module lib/httpd/modules/mod_info.so
       #LoadModule cgi_module lib/httpd/modules/mod_cgi.so
       #LoadModule dav_fs_module lib/httpd/modules/mod_dav_fs.so
       #LoadModule vhost_alias_module lib/httpd/modules/mod_vhost_alias.so
       #LoadModule negotiation_module lib/httpd/modules/mod_negotiation.so
       #LoadModule imagemap_module lib/httpd/modules/mod_imagemap.so
       #LoadModule actions_module lib/httpd/modules/mod_actions.so
       #LoadModule userdir_module lib/httpd/modules/mod_userdir.so
       #LoadModule alias_module lib/httpd/modules/mod_alias.so
       #LoadModule rewrite_module lib/httpd/modules/mod_rewrite.so

Change the permissions of the startup script and start the web server:

   root@darkstar:~# chmod 700 /etc/rc.d/rc.httpd
   root@darkstar:~# /etc/rc.d/rc.httpd start

To test SSL on the web server, run the following command.  When the cursor is
sitting on a blank line, type "GET /frontend".

   dentonj@darkstar:~$ openssl s_client -connect localhost:443
       GET /frontend
       <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
       <html><head>
       <title>401 Authorization Required</title>
       </head><body>
       <h1>Authorization Required</h1>
       <p>This server could not verify that you
       are authorized to access the document
       requested.  Either you supplied the wrong
       credentials (e.g., bad password), or your
       browser doesn't understand how to supply
       the credentials required.</p>
       </body></html>
       closed

When running the above command, ensure the following is seen:

       New, TLSv1/SSLv3, Cipher is DHE-RSA-AES256-SHA
       Server public key is 2048 bit


--[ Configure PHP ]--

PHP must be configured before BASE will function.

   root@darkstar:~# vi /etc/httpd/httpd.conf

       Include /etc/httpd/mod_php.conf

Change the DirectoryIndex directive to allowing loading of PHP index files.

   root@darkstar:~# vi /etc/httpd/httpd.conf

Modify the following line from:
       DirectoryIndex index.html
To:
       DirectoryIndex index.html index.php


Secure PHP a bit by changing the following:

   root@darkstar:~# vi /etc/httpd/php.ini

       safe_mode = On
       all_url_fopen = Off
       allow_url_fopen = Off
       file_uploads = Off
       open_basedir = /var/www
       disable_functions = system,exec,shell_exec,eval,include,require,include_
once,require_once
       expose_php = Off
       error_log = /var/log/httpd/php_error_log

Create the php_error_log and restart the web server so the configuration
changes take effect:

   root@darkstar:~# touch /var/log/httpd/php_error_log
   root@darkstar:~# /etc/rc.d/rc.httpd restart


--[ Configure the firewall ]--

The startup script /etc/rc.d/rc.inet2 will start the file /etc/rc.d/rc.firewall
if it exists.  The file rc.firewall does not exist by default.  Create the file
and add the following:

   root@darkstar:~# vi /etc/rc.d/rc.firewall

       # rc.firewall
       #

       firewall_start() {
         echo "Starting Iptables..."
         /usr/sbin/iptables -P INPUT DROP
         /usr/sbin/iptables -P FORWARD DROP

         /usr/sbin/iptables -A INPUT -i lo -j ACCEPT
         /usr/sbin/iptables -A INPUT -p icmp --icmp-type any -j DROP
         /usr/sbin/iptables -A INPUT -m state --state ESTABLISHED,RELATED -j AC
CEPT
         /usr/sbin/iptables -A INPUT -m state --state NEW -m tcp -p tcp -s 192.
168.1.0/24 --dport 22 -j ACCEPT
         /usr/sbin/iptables -A INPUT -m state --state NEW -m tcp -p tcp -s 192.
168.1.0/24 --dport 443 -j ACCEPT
         /usr/sbin/iptables -A INPUT -m state --state NEW -m tcp -p tcp -s 192.
168.1.0/24 --dport 3001 -j ACCEPT
         /usr/sbin/iptables -A INPUT -m state --state NEW -m tcp -p tcp -s 192.
168.1.0/24 --dport 3307 -j ACCEPT
         # Drop broadcasts before logging
         /usr/sbin/iptables -A INPUT -d 192.168.1.255 -j DROP
         /usr/sbin/iptables -A INPUT -j LOG --log-ip-options --log-tcp-options
         #/usr/sbin/iptables -A INPUT -j REJECT --reject-with icmp-host-prohibi
ted
         /usr/sbin/iptables -A INPUT -j DROP
       }

       firewall_stop() {
         echo "Stopping Iptables..."
         /usr/sbin/iptables -P INPUT ACCEPT
         /usr/sbin/iptables -P FORWARD ACCEPT
         /usr/sbin/iptables -F
       }

       firewall_restart() {
         firewall_stop
         /usr/bin/sleep 2
         firewall_start
       }

       case "$1" in
       'start')
         firewall_start
         ;;
       'stop')
         firewall_stop
         ;;
       'restart')
         firewall_restart
         ;;
       *)
         echo "usage $0 start|stop|restart"
       esac

If you regularly VPN into your network, remember to add that subnet to allow
access.

Change the permissions and start the firewall script:

   root@darkstar:~# chmod 700 /etc/rc.d/rc.firewall
   root@darkstar:~# /etc/rc.d/rc.firewall start
   root@darkstar:~# iptables -L -nv


--[ Create the BASE tables ]--

With a web browser:
       - Go to https://<sensor ip>/frontend
       - Click on the "Setup page" link
       - Click on the "Create BASE AG" button
       - Click on the "Main Page" link


--[ Create the archive database]--

There probably is a better way to do this, but it works.  Unfortunately, the
setup page for BASE is not able to create the BASE specific tables in the Snort
archive database.  Copy the snort database and name the copy snort_archive.

   root@darkstar:~# /etc/rc.d/rc.mysqld stop
   root@darkstar:~# cd /var/lib/mysql
   root@darkstar:mysql# cp -pr snort snort_archive
   root@darkstar:mysql# /etc/rc.d/rc.mysqld start

Configure the permissions in MySQL:

   root@darkstar:~# mysql -p
   mysql> show databases;
   +--------------------+
   | Database           |
   +--------------------+
   | information_schema |
   | mysql              |
   | snort              |
   | snort_archive      |
   +--------------------+
   4 rows in set (0.00 sec)
   mysql> grant create,insert,select,delete,update on snort_archive.* to snort@
localhost;
   mysql> grant create,insert,select,delete,update on snort_archive.* to snort;
   mysql> flush privileges;
   mysql> use snort;
   mysql> show tables;
   +------------------+
   | Tables_in_snort  |
   +------------------+
   | acid_ag          |
   | acid_ag_alert    |
   | acid_event       |
   | acid_ip_cache    |
   | base_roles       |
   | base_users       |
   | data             |
   | detail           |
   | encoding         |
   | event            |
   | icmphdr          |
   | iphdr            |
   | opt              |
   | reference        |
   | reference_system |
   | schema           |
   | sensor           |
   | sig_class        |
   | sig_reference    |
   | signature        |
   | tcphdr           |
   | udphdr           |
   +------------------+
   22 rows in set (0.00 sec)
   mysql> exit

Configure BASE to use the archive database:

   root@darkstar:~# vi /var/www/htdocs/frontend/base_conf.php

       $archive_exists = 1;
       $archive_dbname = 'snort_archive';
       $archive_host = 'localhost';
       $archive_port = '';
       $archive_user = 'snort';
       $archive_password = 'mysqlsnortpassword';


--[ Barnyard Installation ]--

Barnyard is used to separate Snort from the database.  Snort uses a single
process for all packet processing and logging.  Logging directory from Snort
into a database is slow and can potentially cause Snort to start dropping
packets.  The solution is to have Snort log to files and use Barnyard to take
the alerts in the files and stuff them into the database.

   dentonj@darkstar:downloads$ wget http://www.snort.org/dl/barnyard/barnyard-0
2.0.tar.gz
   dentonj@darkstar:downloads$ wget http://www.snort.org/dl/barnyard/barnyard-0
2.0.tar.gz.md5
   dentonj@darkstar:downloads$ md5sum barnyard-0.2.0.tar.gz
   be3283028cf414b52b220308ceb411e9  barnyard-0.2.0.tar.gz
   dentonj@darkstar:downloads$ cat barnyard-0.2.0.tar.gz.md5
   md5  : be3283028cf414b52b220308ceb411e9  barnyard-0.2.0.tar.gz
   sha1 : 4adfcabb2702def5a9a6c68cbde1b90a70f7e67a  barnyard-0.2.0.tar.gz
   dentonj@darkstar:downloads$ cd ../src
   dentonj@darkstar:src$ gzip -cd ../downloads/barnyard-0.2.0.tar.gz | tar xf -
   dentonj@darkstar:src$ cd barnyard-0.2.0
   denotnj@darkstar:barnyard-0.2.0$ ./configure --enable-mysql
   dentonj@darkstar:barnyard-0.2.0$ make
   dentonj@darkstar:barnyard-0.2.0$ su
   root@darkstar:barnyard-0.2.0# make install

Barnyard does not insert an entry into the sensor table in the snort database.
Not having an entry in this table will prevent BASE from updating its tables
and prevent alerts from being displayed through the BASE interface in the web
browser.  Manually add an entry into the snort.sensor table:

   root@darkstar:~# mysql -p
   mysql>  use snort;
   mysql> insert into snort.sensor (sid,hostname,interface,filter,detail,encodi
ng,last_cid) values (1,"localhost","eth1","",1,0,0);
   mysql> select * from snort.sensor;
   mysql> exit

The commands used to troubleshoot this problem:

   root@darkstar:~# mysql -p
   mysql> use snort;
   mysql> select count(*) from event;
   +----------+
   | count(*) |
   +----------+
   |     4561 |
   +----------+
   1 row in set (0.00 sec)
   mysql> select count(*) from acid_event;
   +----------+
   | count(*) |
   +----------+
   |        0 |
   +----------+
   1 row in set (0.00 sec)
   mysql> select * from sensor;
   Empty set (0.00 sec)

Barnyard uses a file to keep track of the alerts that have been inserted into
the database.  Create this file:

   root@darkstar:~# vi /var/log/snort/barnyard.waldo

       /var/log/snort
       snort.log
       0
       0

Configure Barnyard:

   root@darkstar:~# vi /etc/snort/barnyard.conf

       config daemon
       config localtime
       config hostname: localhost
       config interface: eth0
       config filter: not src host 192.168.15.234 and \
           not src host 192.168.17.27
       config sid-msg-map: /etc/snort/sid-msg.map
       config gen-msg-map: /etc/snort/gen-msg.map
       config class-file: /etc/snort/classification.config
       output log_acid_db: mysql, sensor_id 1, database snort, server localhost
, user snort, detail full, password mysqlsnortpassword

Create the startup script used to start Barnyard:

   root@darkstar:~# vi /etc/rc.d/rc.barnyard

       #!/bin/sh
       #
       # Start/Stop/Restart Barnyard
       #

       CONF="/etc/snort/barnyard.conf"

       barnyard_start() {
         echo "Starting Barnyard..."
         /usr/local/bin/barnyard -v -c $CONF \
           -d /var/log/snort \
           -f snort.log \
           -w /var/log/snort/barnyard.waldo \
           -a /var/log/snort/archive \
           -X /var/run/barnyard.pid
       }

       barnyard_stop() {
         echo "Stopping Barnyard..."
         /bin/killall barnyard
       }

       barnyard_restart() {
         barnyard_stop
         /usr/bin/sleep 2
         barnyard_start
       }

       case "$1" in
       'start')
         barnyard_start
         ;;
       'stop')
         barnyard_stop
         ;;
       'restart')
         barnyard_restart
         ;;
       *)
         echo "usage $0 start|stop|restart"
       esac

Change the permissions for the startup script:

   root@darkstar:~# chmod 700 /etc/rc.d/rc.barnyard


--[ Oinkmaster Installation ]--

Oinkmaster is used to manage the rules used by Snort.  Oinkmaster can download
and update new rules.  It can also enable, disable, and modify rules after
each update.

   dentonj@darkstar:downloads$ wget http://easynews.dl.sourceforge.net/sourcefo
rge/oinkmaster/oinkmaster-2.0.tar.gz
   dentonj@darkstar:downloads$ cd ../src
   dentonj@darkstar:src$ gzip -cd ../downloads/oinkmaster-2.0.tar.gz | tar xf -
   dentonj@darkstar:src$ cd oinkmaster-2.0
   dentonj@darkstar:oinkmaster-2.0$ su
   root@darkstar:oinkmaster-2.0# cp oinkmaster.pl /usr/local/sbin
   root@darkstar:oinkmaster-2.0# cp oinkmaster.conf /etc
   root@darkstar:oinkmaster-2.0# cp oinkmaster.1 /usr/local/man/man1
   root@darkstar:oinkmaster-2.0# cd contrib
   root@darkstar:contrib# cp *.pl /usr/local/sbin

Configure Oinkmaster to update the rules.  If you have registered as a user on
the Snort website, then get the Oink Code to download the VRT rules.  The Oink
Code can be obtained on the user preference page on the Snort website.  Setup
Oinkmaster to download the VRT rules, the latest Bleeding Threats rules, and
the Community rules.

   root@darkstar:~# vi /etc/oinkmaster.conf

       url = http://www.snort.org/pub-bin/oinkmaster.cgo/GetYourOwnCode012345ab
cde6789fg0123456789/snortrules-snapshot-CURRENT.tar.gz
       url = http://www.bleedingthreats.net/rules/bleeding.rules.tar.gz
       url = http://www.snort.org/pub-bin/downloads.cgi/
Download/comm_rules/Community-Rules-CURRENT.tar.gz
       path = /bin:/usr/bin:/usr/local/bin
       update_files = \.rules$|\.txt$|\.map$
       skipfile local.rules
       skipfile snort.conf
       skipfile threshold.conf
       skipfile classification.config
       skipfile reference.config

When updating the rules, run a check first.  The only problem with this is the
Snort website only allows downloads of the VRT rules once every 15 minutes.  If
this annoys you too, download the VRT rules separately and configure Oinkmaster
with , "url = file///home/dentonj/downloads/snortrules-snapshot-CURRENT.tar.gz".

   root@darkstar:~# oinkmaster.pl -c -o /etc/snort/rules > oinktest

15 minutes later....

   root@darkstar:~# oinkmaster.pl -o /etc/snort/rules

Each rules contains a unique Snort rule ID (SID).  The file sid-msg.map
contains the mapping of alert messages to SIDs.  Since Barnyard does not read
the rules files, the sid-msg.map file is used when feeding alerts into MySQL.
If the file is out of date, meaning there are SIDs in the rules files that are
not listed in the sid-msg.map file, Barnyard will not be able to insert the
alert message into MySQL.  The result will be seen in BASE with an alert such
as "Snort Alert [1:1948:15]".  Everytime the rules are updated or a new rule is
added, the sid-msg.map file needs to be recreated.

   root@darkstar:~# create-sidmap.pl /etc/snort/rules > /etc/snort/sid-msg.map

There are over 3600 rules disabled by default in the VRT rules.  There are
over 400 rules disabled by default in the Bleeding Threat rules.  The rules
are disabled by default for various reasons.

 - The rules could generate a large number of false positive either generally
       or in certain environments.

 - The rules are only useful in specific environments, so it's not worth
       making Snort work harder unless your environment has the specific
       thing the rule is looking for.

 - The rules are performance hogs and should be enabled only if you are
       really concerned about what the rule is looking for.

Spend some time going through the rules files to determine if there is anything
that needs to be enabled.  To generate a list of the disabled SIDs:

   root@darkstar:~# makesidex.pl /etc/snort/rules > /etc/snort/disablesid.conf

To enable a rule, uncomment the rule itself in the appropriate file.  To ensure
that Oinkmaster does not disable the rule when rules are updated, add an
"enablesid" line to the Oinkmaster configuration file.

   root@darkstar:~# cd /etc/snort/rules
   root@darkstar:rules# grep -n "DNS zone transfer" *
   dns.rules:23:# alert tcp $EXTERNAL_NET any -> $HOME_NET 53 (msg:"DNS zone tr
ansfer TCP"; flow:to_server,established; content:"|00 00 FC|"; offset:15; metada
ta:service dns; reference:arachnids,212; reference:cve,1999-0532; reference:ness
us,10595; classtype:attempted-recon; sid:255; rev:15;)
   dns.rules:24:# alert udp $EXTERNAL_NET any -> $HOME_NET 53 (msg:"DNS zone tr
ansfer UDP"; content:"|00 00 FC|"; offset:14; metadata:service dns; reference:ar
achnids,212; reference:cve,1999-0532; reference:nessus,10595; classtype:attempte
d-recon; sid:1948; rev:8;)

Uncomment lines 23 and 24.

   root@darkstar:rules# vi +23 dns.rules

Configure Oinkmaster to enable the rules during every update.  Oinkmaster uses
the SID to determine which rules should be enabled.  Add a comment to each
entry to help identify the SID.  I list the revision of the rule when I create
the entry.  The rule may change at a later date.  The revision information may
help troubleshoot any possible problems with an updated rule.  It's a good
idea to review the enablesid and disablesid entries every month or so.  If a
rule was disabled because of false positives, a new revision of that rule may
have eliminated the problem.

   root@darkstar:rules# vi /etc/oinkmaster.conf

       enablesid 255 # DNS zone transfer TCP, rev 15
       enablesid 1948 # DNS zone transfer UDP, rev 8

If the "MULTICAST_NET" variable was added to snort.conf, modify the follow rule
during updates.

   root@darkstar:~# vi /etc/oinkmaster.conf

       modifysid 2189 "->\s*any" | "-> !\$MULTICAST_NET" # IP Proto 103, rev 4

To disable rules, comment out the rule in the appropriate file.  To ensure
Oinkmaster does not enable the rule when rules are updated, add a "disablesid"
line to the Oinkmaster configuration file.

   root@darkstar:~# vi /etc/oinkmaster.conf

       disablesid 376 # ICMP PING Microsoft Windows, rev 7

An alternative to editing the oinkmaster.conf file is to run makesidex.pl
everytime a rules is disabled.

   root@darkstar:~# makesidex.pl /etc/snort/rules > /etc/snort/disablesid.conf
   root@darkstar:~# oinkmaster.pl -C /etc/oinkmaster.conf \
       -C /etc/snort/disablesid.conf -o /etc/snort/rules

To enable all of the rules, even the ones that are disabled by default:

   root@darkstar:~# oinkmaster.pl -e -o /etc/snort/rules


--[ Configure SSH ]--

Make a few changes to the SSH server:

   root@darkstar:~# vi /etc/ssh/sshd_config

       Protocol 2
       PermitRootLogin no

The following are already set by default.  If it makes you feel better, add
them to the configuration file:

       PermitEmptyPasswords no
       UsePrivilegeSeparation yes
       StrictMode yes
       SyslogFacility AUTH
       LogLevel INFO

Restart SSH so the changes take effect:

   root@darkstar:~# /etc/rc.d/rc.sshd restart


--[ mod_security Installation ]--

From the webpage for ModSecurity, "ModSecurity is a web application firewall
that can work either embedded or as a reverse proxy. It provides protection
from a range of attacks against web applications and allows for HTTP traffic
monitoring, logging and real-time analysis."

   dentonj@darkstar:downloads$ wget http://www.modsecurity.org/download/modsecu
rity-apache_2.1.1.tar.gz
   dentonj@darkstar:downloads$ wget http://www.modsecurity.org/download/modsecu
rity-apache_2.1.1.tar.gz.md5
   dentonj@darkstar:downloads$ wget http://www.modsecurity.org/download/modsecu
rity-core-rules_2.1-1.4.tar.gz
   dentonj@darkstar:downloads$ md5sum modsecurity-apache_2.1.1.tar.gz
   ab74ed5f320ffc4ed9f56487bf17c670  modsecurity-apache_2.1.1.tar.gz
   dentonj@darkstar:downloads$ cat modsecurity-apache_2.1.1.tar.gz.md5
   ab74ed5f320ffc4ed9f56487bf17c670  /home/ivanr/work/mod_security/build/modsec
urity-apache_2.1.1.tar.gz
   dentonj@darkstar:downloads$ echo "Hi ivanr"
   dentonj@darkstar:downloads$ cd ../src
   dentonj@darkstar:src$ gzip -cd ../downloads/modsecurity-apache_2.1.1.tar.gz
| tar xf -
   dentonj@darkstar:src$ cd modsecurity_2.1.1/apache2

Before compiling ModSecurity, change the following:

   dentonj@darkstar:apache2$ vi Makefile

       top_dir = /usr/lib/httpd
       #DEFS = -DWITH_LIBXML2

   dentonj@darkstar:apache2$ make
   dentonj@darkstar:apache2$ su
   root@darkstar:apache2# make install
   root@darkstar:apache2# mkdir /etc/httpd/modsecurity
   root@darkstar:apache2# cd /etc/httpd/modsecurity
   root@darkstar:modsecurity# gzip -cd /home/dentonj/downloads/modsecurity-core
-rules_2.1-1.4.tar.gz | tar xf -

Change the configuration file for the web server to load the ModSecurity
module and the ModSecurity configuration files:

   root@darkstar:rules# vi /etc/httpd/httpd.conf

       LoadModule security2_module lib/httpd/modules/mod_security2.so
       Include /etc/httpd/modsecurity/*.conf

One of the features is to mask the server identify.  Before this feature can
work, the ServerTokens directive for Apache needs to be set to Full.  Add the
following:

   root@darkstar:~# vi /etc/httpd/httpd.conf

       ServerTokens Full

Restart the web server so the configuration changes take effect:

   root@darkstar:~# /etc/rc.d/rc.httpd restart

Configure and create the log files for ModSecurity.  Logrotate is setup to look
for "/var/log/httpd/*_log".

   root@darkstar:rules# vi modsecurity_crs_10_config.conf

       SecAuditLog /var/log/httpd/modsec_audit_log
       SecDebugLog /var/log/httpd/modsec_debug_log

   root@darkstar:rules# touch /var/log/httpd/modsec_audit_log
   root@darkstar:rules# touch /var/log/httpd/modsec_debug_log

Since a DNS entry is not going to be configured for the Snort sensor, the web
browser will have to use the IP address when connecting to the web server.  One
of the ModSecurity rules will trigger when this happens.  Comment out the
following to prevent this alert from filling up the logs:

   root@darkstar:rules# cd /etc/httpd/modsecurity
   root@darkstar:modsecurity# vi modsecurity_crs_21_protocol_anomalies.conf

       #SecRule REQUEST_HEADERS:Host "^[\d\.]+$" "deny,log,auditlog,status:400,
msg:'Host header is a numeric IP address', severity:'2',id:'960017'"
       id:'960015'


--[ OSSEC Installation ]--

From the webpage for OSSEC, "OSSEC is an Open Source Host-based Intrusion
Detection System. It performs log analysis, integrity checking, Windows
registry monitoring, rootkit detection, real-time alerting and active
response."

   dentonj@darkstar:downloads$ wget http://www.ossec.net/files/ossec-hids-1.3.t
ar.gz
   dentonj@darkstar:downloads$ cd ../src
   dentonj@darkstar:src$ gzip -cd ../downloads/ossec-hids-1.3.tar.gz | tar xf -
   dentonj@darkstar:src$ cd ossec-hids-1.3
   dentonj@darkstar:ossec-hids-1.3$ su
   root@darkstar:ossec-hids-1.3# ./install.sh

       For installation in English, choose [en].  en
       Press ENTER to continue
       What kind of installation do you want?  server
       Choose where to install the OSSEC HIDS:  /var/ossec
       Do you want e-mail notifications? y
       What's your e-mail address?  root@localhost
       We found your SMTP server as: 127.0.0.1 Do you want to use it? y
       Do you want to run the integrity check daemon? y
       Do you want to run the rootkit detection engine? y
       Do you want to enable active response? y
       Do you want to enable remote syslog? y

Configure OSSEC to monitor the PHP, ModSecurity, and SSL log files.  Add the
following:

   root@darkstar:~# vi /var/ossec/etc/ossec.conf

         <localfile>
           <log_format>syslog</log_format>
           <location>/var/log/httpd/php_error_log</location>
         </localfile>
         <localfile>
           <log_format>syslog</log_format>
           <location>/var/log/httpd/modsec_audit_log</location>
         </localfile>
         <localfile>
           <log_format>syslog</log_format>
           <location>/var/log/httpd/modsec_debug_log</location>
         </localfile>
         <localfile>
           <log_format>apache</log_format>
           <location>/var/log/httpd/ssl_request_log</location>
         </localfile>

OSSEC will parse syslog files looking for key words.  One of the words that it
looks for, "bad", can be displayed by Snort during startup.  An example message
is "Bad Payload Size Alert: ENABLED".  To prevent Snort from triggering this
alert in OSSEC, change the following from:

   root@darkstar:~# vi /var/ossec/rules/syslog_rules.xml

         <rule id="1002" level="7">
           <match>$BAD_WORDS</match>
           <description>Unknown problem somewhere in the system.</description>
         </rule>

To:

         <rule id="1002" level="7">
           <regex>$BAD_WORDS</regex>
           <if_matched_regex>!snort</if_matched_regex>
           <description>Unknown problem somewhere in the system.</description>
         </rule>

OSSEC will look for network interfaces that go into promiscuous mode.  Snort
will place the listening interface in promiscuous mode everytime is starts.  To
prevent Snort from triggering this alert in OSSEC, change the following from:

   root@darkstar:~# vi /var/ossec/rules/syslog_rules.xml

         <rule id="5104" level="8">
           <if_sid>5100</if_sid>
           <regex>Promiscuous mode enabled|</regex>
           <regex>device \S+ entered promiscuous mode</regex>
           <description>Interface entered in promiscuous(sniffing) mode.</descr
iption>
           <group>promisc,</group>
         </rule>

To:

         <!-- <rule id="5104" level="8">
           <if_sid>5100</if_sid>
           <regex>Promiscuous mode enabled|</regex>
           <regex>device \S+ entered promiscuous mode</regex>
           <description>Interface entered in promiscuous(sniffing) mode.</descr
iption>
           <group>promisc,</group>
         </rule> -->

Add an agent to be monitored.  An encryption key will be created to encrypt
communications between the OSSEC server and the agent.

   root@darkstar:~# /var/ossec/bin/manage_agents

       ****************************************
       * OSSEC HIDS v1.3 Agent manager.       *
       * The following options are available: *
       ****************************************
          (A)dd an agent (A).
          (E)xtract key for an agent (E).
          (L)ist already added agents (L).
          (R)emove an agent (R).
          (Q)uit.
       Choose your action: A,E,L,R or Q: a

       - Adding a new agent (use '\q' to return to the main menu).
         Please provide the following:
          * A name for the new agent: linuxclient
          * The IP Address of the new agent: 192.168.1.27
          * An ID for the new agent[001]:
       Agent information:
          ID:001
          Name:linuxclient
          IP Address:192.168.1.27

       Confirm adding it?(y/n): y
       Agent added.

       ****************************************
       * OSSEC HIDS v1.3 Agent manager.       *
       * The following options are available: *
       ****************************************
          (A)dd an agent (A).
          (E)xtract key for an agent (E).
          (L)ist already added agents (L).
          (R)emove an agent (R).
          (Q)uit.
       Choose your action: A,E,L,R or Q: e

       Available agents:
          ID: 001, Name: linuxclient, IP: 192.168.1.27
       Provide the ID of the agent to extract the key (or '\q' to quit): 001

       Agent key information for '001' is:
       GetYourOwnKeyMDAxIGRlYXRoc5MDk1NA==

       ** Press ENTER to return to the main menu.

       ****************************************
       * OSSEC HIDS v1.3 Agent manager.       *
       * The following options are available: *
       ****************************************
          (A)dd an agent (A).
          (E)xtract key for an agent (E).
          (L)ist already added agents (L).
          (R)emove an agent (R).
          (Q)uit.
       Choose your action: A,E,L,R or Q: q

       ** You must restart the server for your changes to have effect.


Install the OSSEC agent on a computer that is going to be monitored.

   nick@linuxclient:downloads$ wget http://www.ossec.net/files/ossec-hids-1.3.t
ar.gz
   nick@linuxclient:downloads$ cd ../src
   nick@linuxclient:src$ gzip -cd ../downloads/ossec-hids-1.3.tar.gz | tar xf -
   nick@linuxclient:src$ cd ossec-hids-1.3
   nick@linuxclient:ossec-hids-1.3$ su
   root@linuxclient:ossec-hids-1.3# ./install.sh

       For installation in English, choose [en].  en
       Press ENTER to continue
       What kind of installation do you want?  server
       Choose where to install the OSSEC HIDS:  /var/ossec
       What's the IP Address of the OSSEC HIDS server? 192.168.1.2
       Do you want to run the integrity check daemon? y
       Do you want to run the rootkit detection engine? y
       Do you want to enable active response? y

Import the key generated by the server:

   root@linuxclient:~# /var/ossec/bin/manage_agents

       ****************************************
       * OSSEC HIDS v1.3 Agent manager.       *
       * The following options are available: *
       ****************************************
          (I)mport key from the server (I).
          (Q)uit.
       Choose your action: I or Q: i

       * Provide the Key generated by the server.
       * The best approach is to cut and paste it.
       *** OBS: Do not include spaces or new lines.

       Paste it here (or '\q' to quit): GetYourOwnKeyMDAxIGRlYXRoc5MDk1NA==

       Agent information:
          ID:001
          Name:linuxclient
          IP Address:192.168.1.27

       Confirm adding it?(y/n): y
       Added.
       ** Press ENTER to return to the main menu.

Restart the OSSEC server and agent.

   root@darkstar:~# /var/ossec/bin/ossec-control restart
   root@linuxclient:~# /vaar/ossec/bin/ossec-control restart

Check the status of the agent.

   root@darkstar:~# /var/ossec/bin/list_agents -a
   linuxclient-192.168.1.27 is available.


--[ LogWatch Installation ]--

Install LogWatch to monitor the system and the logs for abnormal behavior.
Yes, OSSEC is installed for this purpose.  Yes, installing LogWatch is
redundant.  It's a good idea anyways.

   dentonj@darkstar:downloads$ wget ftp://ftp.kaybee.org/pub/linux/logwatch-7.3
6.tar.gz
   dentonj@darkstar:downloads$ cd ../src
   dentonj@darkstar:src$ gzip -cd ../downloads/logwatch-7.3.6.tar.gz | tar xf -
   dentonj@darkstar:src$ cd logwatch-7.3.6
   dentonj@darkstar:logwatch-7.3.6$ su
   root@darkstar:logwatch-7.3.6# chmod 700 install_logwatch.sh
   root@darkstar:logwatch-7.3.6# ./install_logwatch.sh

       Enter the path to the Logwatch BaseDir:  Use Default
       Enter the path for the Logwatch ConfigDir:  Use Default
       Enter the dir name to be used for temp files:  Use Default
       Enter the location of perl:  Use Default
       Enter the dir name to used for the manpage:  /usr/man

Configure LogWatch:

   root@darkstar:~# cd /usr/share/logwatch/default.conf
   root@darkstar:default.conf# cp -R * /etc/logwatch/conf
   root@darkstar:default.conf# cd ../scripts
   root@darkstar:scripts# cp -R * /etc/logwatch/scripts
   root@darkstar:scripts# vi /etc/logwatch/conf/logwatch.conf

       Print = No
       Detail = High
       #Service = "-zz-network"
       #Service = "-zz-sys"
       #Service = "-eximstats"

--[ Increase system log retention ]--

By default, system logs are only maintained for 4 weeks.  Login logs are only
retained for an extra month.  Change the log retention to one year:

   root@darkstar:~# vi /etc/logrotate.conf

       compress
       rotate 52
       /var/log/wtmp {
               monthly
               create 0664 root utmp
               rotate 12
       }
       /var/log/btmp {
               monthly
               create 0600 root root
               rotate 12
       }

   root@darkstar:~# vi /etc/logrotate.d/httpd

       rotate 52

--[ Keep the system clock synced ]--

   root@darkstar:~# vi /etc/cron.daily/ntpdate

       #!/bin/sh
       /usr/sbin/ntpdate clock.via.net && /sbin/hwclock --systohc

   root@darkstar:~# chmod 700 /etc/cron.daily/ntpdate


--[ Optimize the kernel ]--

The file /etc/sysctl.conf is called by /etc/rc.d/rc.S.  However, the file does
not exist by default.  Create the file and add the following:

   root@darkstar:~# vi /etc/sysctl.conf

       net.core.netdev_max_backlog = 2500
       net.core.rmem_max = 16777216
       net.core.wmem_max = 16777216
       net.ipv4.tcp_rmem = 4096 87380 16777216
       net.ipv4.tcp_wmem = 4096 87380 16777216
       net.ipv4.tcp_no_metrics_save = 1

Look at http://www-didc.lbl.gov/TCP-tuning/linux.html for more information.


--[ Optimize the network interface ]--

Change the rx ring parameters for the interface.  Run the following to get the
current settings.

   root@darkstar:~# ethtool -g eth0

Look at the "RX" settings.  If the current setting is lower than the pre-set
maximum, run the following command, replacing 512 with the maximum:

   root@darkstar:~# ethtool -G eth0 rx 512
   root@darkstar:~# vi /etc/rc.d/rc.local

       /usr/sbin/ethtool -G eth0 rx 512


--[ Optimizing MySQL ]--

Some of the configuration changes that have already been made were to increase
the performance of MySQL.  On busy networks, the tables in the Snort database
can quickly become fragmented.  I run the following SQL script once a week to
optimize the tables.  Since a password is require, I do not use cron to run
this script.

   root@darkstar:~# vi optimize_snort.sql

       optimize table acid_ag;
       optimize table acid_ag_alert;
       optimize table acid_event;
       optimize table acid_ip_cache;
       optimize table base_roles;
       optimize table base_users;
       optimize table data;
       optimize table detail;
       optimize table encoding;
       optimize table event;
       optimize table icmphdr;
       optimize table iphdr;
       optimize table opt;
       optimize table reference;
       optimize table reference_system;
       optimize table schema;
       optimize table sensor;
       optimize table sig_class;
       optimize table sig_reference;
       optimize table signature;
       optimize table tcphdr;
       optimize table udphdr;

   root@darkstar:~# mysql -p snort < optimize_snort.sql


--[ Start Snort and Barnyard ]--

Start Snort and Barnyard:

   root@darkstar:~# /etc/rc.d/rc.snort start
   root@darkstar:~# /etc/rc.d/rc.barnyard start

Verify Snort and Barnyard are running:

   root@darkstar:~# ps auxww | grep snort
   root@darkstar:~# ps auxww | grep barnyard

If either one is not running, check the logs to determine the problem:

   root@darkstar:~# less /var/log/messages
   root@darkstar:~# less /var/log/syslog

If Barnyard seems to start, but then exits without an error, comment out the
"config daemon" line in the configuration file.  Start Barnyard and look for
any errors.

After everything is working properly, change rc.local so Snort and Barnyard
starts during bootup:

   root@darkstar:~# vi /etc/rc.d/rc.local

       if [ -x /etc/rc.d/rc.snort ]; then
         /etc/rc.d/rc.snort start
       fi

       if [ -x /etc/rc.d/rc.barnyard ]; then
         /etc/rc.d/rc.barnyard start
       fi


--[ NTOP Installation ]--

From the webpage for ntop, "ntop is a network traffic probe that shows the
network usage, similar to what the popular top Unix command does."

Before ntop can be installed, rrdtool must be installed.

   dentonj@darkstar:downloads$ wget http://oss.oetiker.ch/rrdtool/pub/rrdtool-1
2.23.tar.gz
   dentonj@darkstar:downloads$ cd ../src
   dentonj@darkstar:src$ gzip -cd ../downloads/rrdtool-1.2.23.tar.gz | tar xf -
   dentonj@darkstar:src$ cd rrdtool-1.2.23
   dentonj@darkstar:rrdtool-1.2.23$ ./configure
   dentonj@darkstar:rrdtool-1.2.23$ make
   dentonj@darkstar:rrdtool-1.2.23$ su
   root@darkstar:rrdtool-1.2.23# make install
   root@darkstar:rrdtool-1.2.23# cd /usr/local
   root@darkstar:local# ln -s rrdtool-1.2.23 rrdtool

Download and install ntop.

   dentonj@darkstar:downloads$ wget http://easynews.dl.sourceforge.net/sourcefo
rge/ntop/ntop-3.3.tar.gz
   dentonj@darkstar:downloads$ cd ../src
   dentonj@darkstar:src$ gzip -cd ../downloads/ntop-3.3.tar.gz | tar xf -
   dentonj@darkstar:src$ cd ntop-3.3
   dentonj@darkstar:ntop-3.3$ ./autogen.sh
   dentonj@darkstar:ntop-3.3$ make
   dentonj@darkstar:ntop-3.3$ su
   root@darkstar:ntop-3.3# make install

Create a user account that ntop will use while running.

   root@darkstar:ntop-3.3# groupadd ntop
   root@darkstar:ntop-3.3# useradd -g ntop ntop -s /bin/false
   root@darkstar:ntop-3.3# chown -R ntop.ntop /usr/local/share/ntop

Copy files that will need to be used by ntop to the configuration directory.

   root@darkstar:ntop-3.3# mkdir /etc/ntop
   root@darkstar:ntop-3.3# cp etter.finger.os.gz /etc/ntop
   root@darkstar:ntop-3.3# cp oui.txt.gz /etc/ntop
   root@darkstar:ntop-3.3# cp specialMAC.txt.gz /etc/ntop
   root@darkstar:ntop-3.3# cp ntop-cert.pem /etc/ntop
   root@darkstar:ntop-3.3# cp p2c.opt.table.gz /etc/ntop
   root@darkstar:ntop-3.3# mkdir /var/ntop
   root@darkstar:ntop-3.3# cp packages/debian.official/protocol.list /usr/local
/share/ntop/
   root@darkstar:ntop-3.3# cp ntop.8 /usr/local/man/man8/

Copy the configuration file for ntop to the configuration directory.

   root@darkstar:ntop-3.3# cp packages/RedHat/ntop.conf.sample /etc/ntop.conf

Configure ntop:

   root@darkstar:ntop-3.3# vi /etc/ntop.conf

       --interface eth0
       --https-server 3001
       #--daemon
       --use-syslog=daemon
       --no-mac

Set a password for ntop:

   root@darkstar:ntop-3.3# /usr/local/bin/ntop @/etc/ntop.conf -A

Configure ntop to run in daemon mode:

   root@darkstar:ntop-3.3# vi /etc/ntop.conf

       --daemon

Create the startup script to start ntop:

   root@darkstar:ntop-3.3# vi /etc/rc.d/rc.ntop

       #!/bin/sh
       #
       # Start/Stop/Restart NTOP
       #

       # Basic checks
       [ -x "/usr/local/bin/ntop" ] || exit 1
       [ -r "/etc/ntop.conf" ] || exit 1
       [ -r "/var/ntop/ntop_pw.db" ] || exit 1

       ntop_start() {
         echo "Starting NTOP..."
         /usr/local/bin/ntop -d -L @/etc/ntop.conf
       }

       ntop_stop() {
         echo "Stopping NTOP..."
         /bin/killall ntop
       }

       ntop_restart() {
         ntop_stop
         /usr/bin/sleep 2
         ntop_start
       }

       case "$1" in
       'start')
         ntop_start
         ;;
       'stop')
         ntop_stop
         ;;
       'restart')
         ntop_restart
         ;;
       *)
         echo "usage $0 start|stop|restart"
       esac

   root@darkstar:ntop-3.3# chmod 700 /etc/rc.d/rc.ntop
   root@darkstar:ntop-3.3# /etc/rc.d/rc.ntop start

Change rc.local so NTOP starts during bootup:

   root@darkstar:ntop-3.3# vi /etc/rc.d/rc.local

       if [ -x /etc/rc.d/rc.ntop ]; then
         /etc/rc.d/rc.ntop start
       fi


--[ Stunnel ]--

Stunnel should already be installed with Slackware.  To verify Stunnel is
installed:

   root@darkstar:~# stunnel -version

On the server (the system running MySQL):

Create the Stunnel configuration file:

   root@darkstar:~# vi /etc/stunnel/stunnel.conf
       ;
       ; stunnel.conf
       ;
       cert = /etc/stunnel/stunnel.pem
       pid = /var/run/stunnel.pid
       client = no

       [3306]
       accept = 3307
       connect = 3306

Generate a new stunnel.pem key.  Answer the question appropriately:

   root@darkstar:~# cd /etc/stunnel && ./generate-stunnel-key.sh
       Generating a 1024 bit RSA private key
       .....++++++
       ............................++++++
       writing new private key to 'stunnel.pem'
       -----
       You are about to be asked to enter information that will be incorporated
       into your certificate request.
       What you are about to enter is what is called a Distinguished Name or
       a DN.
       There are quite a few fields but you can leave some blank
       For some fields there will be a default value,
       If you enter '.', the field will be left blank.
       -----
       Country Name (2 letter code) [PL]:US
       State or Province Name (full name) [Some-State]:Arizona
       Locality Name (eg, city) []:Sierra Vista
       Organization Name (eg, company) []: Cochiselinux
       Organizational Unit Name (eg, section) []:
       Common Name (FQDN of your server) [localhost]:
       subject= /C=US/ST=Arizona/L=Sierra Vista/O=Cochiselinux/CN=localhost
       notBefore=Aug 23 14:14:21 2007 GMT
       notAfter=Aug 22 14:14:21 2008 GMT
       SHA1 Fingerprint=A0:CA:38:AA:B4:5E:2E:7C:A2:F9:82:24

Modify the sensor table in the snort database:

   root@darkstar:~# mysql -p
   mysql> insert into snort.sensor (sid,hostname,interface,filter,detail,encodi
ng,last_cid) values (2,"192.168.1.27","eth1","",1,0,0);
   mysql> select * from snort.sensor;
   +-----+--------------+-----------+--------+--------+----------+----------+
   | sid | hostname     | interface | filter | detail | encoding | last_cid |
   +-----+--------------+-----------+--------+--------+----------+----------+
   |   1 | localhost    | eth1      |        |      1 |        0 |     2969 |
   |   2 | 192.168.1.27 | eth1      |        |      1 |        0 |        0 |
   +-----+--------------+-----------+--------+--------+----------+----------+
   2 rows in set (0.00 sec)

Create the startup script for Stunnel:

   root@darkstar:~# vi /etc/rc.d/rc.stunnel

       #!/bin/sh
       #
       # Stop/Restart Stunnel
       #
       stunnel_start() {
         echo "Starting stunnel..."
         /usr/sbin/stunnel /etc/stunnel/stunnel.conf
       }

       stunnel_stop() {
         echo "Stopping stunnel..."
         /bin/killall stunnel
       }

       stunnel_restart() {
         stunnel_stop
         /usr/bin/sleep 2
         stunnel_start
       }

       case "$1" in
       'start')
         stunnel_start
         ;;
       'stop')
         stunnel_stop
         ;;
       'restart')
         stunnel_restart
         ;;
       *)
         echo "usage $0 start|stop|restart"
       esac

   root@darkstar:~# chmod 700 /etc/rc.d/rc.stunnel
   root@darkstar:~# vi /etc/rc.d/rc.local

       if [ -x /etc/rc.d/rc.stunnel ]; then
         /etc/rc.d/rc.stunnel start
       fi

   root@darkstar:~# /etc/rc.d/rc.stunnel start

On the client:

   Install and configure Snort
   Install and configure Barnyard
   Install and configure Oinkmaster
   Install and configure Logwatch
   Configure the firewall
   Configure the kernel
   Configure Logrotate
   Install and configure OSSEC Agent

Create the Stunnel configuration file:

   root@snortsensor:~# vi /etc/stunnel/stunnel.conf

       ;
       ; stunnel.conf
       ;
       pid = /var/run/stunnel.pid
       client = yes

       [3307]
       accept = 3306
       connect = 192.168.1.2:3307

Create the startup script for Stunnel:

   root@snortsensor:~# vi /etc/rc.d/rc.stunnel

       Use the same file as the server.

   root@darkstar:~# chmod 700 /etc/rc.d/rc.stunnel
   root@darkstar:~# vi /etc/rc.d/rc.local

       if [ -x /etc/rc.d/rc.stunnel ]; then
         /etc/rc.d/rc.stunnel start
       fi

Test the Stunnel connection:

   root@snortsensor:~# openssl s_client -connect 192.168.1.2:3307

       CONNECTED(00000003)
       depth=0 /C=US/ST=Arizona/L=Sierra Vista/O=Cochiselinux/CN=localhost
       verify error:num=18:self signed certificate
       verify return:1
       depth=0 /C=US/ST=Arizona/L=Sierra Vista/O=Cochiselinux/CN=localhost
       verify return:1
       ---
       Certificate chain
        0 s:/C=US/ST=Arizona/L=Sierra Vista/O=Cochiselinux/CN=localhost
          i:/C=US/ST=Arizona/L=Sierra Vista/O=Cochiselinux/CN=localhost
       ---
       Server certificate
       -----BEGIN CERTIFICATE-----
       MIICaTCCAdKgAwIBAgIJAONNMRMSpxQqMA0GCSqGSIb3DQEBBQUAMGsxCzAJBgNV
       BAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRUwEwYDVQQHEwxTaWVycmEgVmlzdGEx
       HzAdBgNVBAoTFlN0dW5uZWwgRGV2ZWxvcGVycyBMdGQxEjAQBgNVBAMTCWxvY2Fs
       -----END CERTIFICATE-----
       subject=/C=US/ST=Arizona/L=Sierra Vista/O=Cochiselinux/CN=localhost
       issuer=/C=US/ST=Arizona/L=Sierra Vista/O=Cochiselinux/CN=localhost
       ---
       No client certificate CA names sent
       ---
       SSL handshake has read 783 bytes and written 316 bytes
       ---
       New, TLSv1/SSLv3, Cipher is AES256-SHA
       Server public key is 1024 bit
       Compression: NONE
       Expansion: NONE
       SSL-Session:
           Protocol  : TLSv1
           Cipher    : AES256-SHA
           Session-ID: E42CFF92027106F3FE0344EBFC9ED51800AB
           Session-ID-ctx:
           Master-Key: 7280027DEC46FF305EBECDA8225B43E191D2
           Key-Arg   : None
           Start Time: 1190554391
           Timeout   : 300 (sec)
           Verify return code: 18 (self signed certificate)
       ---
       8
       5.0.37-log=Ui1U<j!c,OB=LG_&@MCI%closed

Ensure that MySQL is not running on the client and start Stunnel:

   root@snortsensor:~# /etc/rc.d/rc.mysql stop
   root@snortsensor:~# chmod 600 /etc/rc.d/rc.mysql
   root@snortsensor:~# /etc/rc.d/rc.stunnel start

Configure the output for Barnyard.  Specify the IP that the client is using
with the "server" entry.  Using "localhost" will cause Barnyard to attempt to
connect to "/var/run/mysql/mysql.sock".  Since MySQL is not running on the
client, Barnyard will exit with an error.

   root@snortsensor:~# vi /etc/snort/barnyard.conf

       output log_acid_db: mysql, sensor_id 2, database snort, server 192.168.2
27, user snort, detail full, password mysqlsnortpassword

If the line "config daemon" is commented out from "/etc/snort/barnyard.conf",
the following should be seen when starting Barnyard:

   root@snortsensor:~# /etc/rc.d/rc.snort start
   root@snortsensor:~# /etc/rc.d/rc.barnyard start
       Starting Barnyard...
       Barnyard Version 0.2.0 (Build 32)
       Starting data processing using information from bookmark file
       Opened spool file '/var/log/snort/snort.log.1190549663'
       OpAcidDB configured
       Database Flavour: mysql
         Database Server: 192.168.1.27
         Database User: snort
       SensorID: 2
       Next CID: 1
       Waiting for new data

Use IPTraf to verify the Stunnel connection.

   root@snortsensor:~# iptraf

       192.168.1.2:3307                      =   50205   7118351 -PA-   eth0
       192.168.1.27:54356                    =   50696  18768688 --A-   eth0
       192.168.1.27:54355                    =  101379  30158512 --A-   lo
       192.168.1.27:3306                     =  100345   7899016 -PA-   lo

On the server, verify the client is inserting entries in the snort database:

   root@darkstar:~# mysql -p
   mysql> select * from snort.sensor;
   +-----+--------------+-----------+--------+--------+----------+----------+
   | sid | hostname     | interface | filter | detail | encoding | last_cid |
   +-----+--------------+-----------+--------+--------+----------+----------+
   |   1 | localhost    | eth1      |        |      1 |        0 |    64338 |
   |   2 | 192.168.1.27 | eth1      |        |      1 |        0 |    11002 |
   +-----+--------------+-----------+--------+--------+----------+----------+
   2 rows in set (0.00 sec)

To add another Snort sensor, repeat the above.


--[ When You Are Done ]--

Join the irc channel #slackware on irc.oftc.net and talk about everything
but Slackware.