Tools
Built to Sort Through Snort
Kristy Westphal
Snort, the lightweight network intrusion detection system, is
already a great tool for any security-conscious network (see "Snort
-- A Look Inside," Sys Admin, September 2000). The
latest version of Snort, 1.7, has many new features above and beyond
1.6, including dynamic rules (rules that can turn on other rules),
statistical anomaly detection preprocessor, improved IP defragmentation
preprocessor, and a TCP stream reassembly preprocessor. New features
and functions are continuously added.
This article will examine four add-ons for Snort that assist the
Snort user in making logging and reading Snort data easier. The
add-ons include:
- Logging alerts to a MySQL database
- Utilizing the Web GUI ACID as a live console for Snort data
- A Perl script that reports Snort data to Big Brother (a network
monitoring tool)
- SnortSnarf, another handy Perl script that converts your alerts
file to html pages.
Throughout the various tools mentioned, I am using the gcc as my compiler
on an HP-UX 10.20 server.
Logging Snort to a MySQL Database
The required ingredients for the MySQL/Snort recipe include the
latest version of MySQL (http://www.mysql.com), installed
before installing Snort. The version used in this article is 3.23.32.
There are security issues with versions of MySQL prior to 3.23.31.
If you have an older version, you may want to think about upgrading.
After I completed my installation, version 3.23.33 was released,
which fixed many of the security holes that existed in prior versions.
I recommend either upgrading or starting out with the latest version.
MySQL also has excellent documentation on their Web site that may
provide answers to issues not covered here.
You have a choice when installing MySQL -- either compile
it yourself or use a precompiled tarball available for various operating
systems. After much anguish of trying to compile on my HP-UX box,
I tried one of the binary tarballs for my OS. Before loading MySQL,
ensure that both a MySQL user and group exist on your system. Then,
install your MySQL distribution in your chosen method. In my case,
I took the precompiled binary and unzipped and untarred it into
a directory ($MYSQLDIR). Once complete, cd into the $MYSQLDIR/scripts
directory and run the mysql_install_db script. Run the following
commands to get MySQL owned by the proper person and running:
chown -R mysql $MYSQLDIR/mysql
chgrp -R mysql $MYSQLDIR/mysql
$MYSQLDIR/bin/safe_mysqld --user=mysql &
To ensure that your database is running correctly, try the following
commands:
$MYSQLDIR/bin/mysqladmin version
$MYSQLDIR/bin/mysqladmin variables
These commands will tell you whether you can communicate with the
database. If you run into any problems here, I suggest consulting
the documentation at:
http://www.mysql.com
Please note that at this stage, your root user for the database has
no password. You can remedy this situation by issuing the following
command:
$MYSQLDIR/bin/mysqladmin -u root -p password 'new-password'
When it prompts you for a password, hit enter (because your original
password is blank), and then your password will be set. There are
other instructions to secure your database on the MySQL homepage,
and I recommend following them before proceeding. A final note on
MySQL initial installation -- don't forget to add it to your
startup scripts. The script you want to use is:
$MYSQLDIR/support-files/mysql.server
In my case, I copied it into the /sbin/init.d directory, then
made a link to it in the /sbin/rc3.d directory. (As always,
check your permissions to make sure the script is executable.)
Now that MySQL is running, you are ready to set up the database
to log Snort alerts. We will be using Snort 1.7 in order to be compatible
with ACID and MySQL. Snort 1.7 will log the full packet payload
in addition to the headers, which previously was not possible. There
are guidelines to using databases with Snort at:
http://www.incident.org/snortdb/
a site maintained by Jed Pickel, as well as in the README.database
file in the Snort distribution. These instructions cover how to log
to Oracle, unixodbc, and postgresql databases as well, so MySQL is
not your only choice. Per the incident.org site's excellent
instructions, the first step is to create the Snort database:
echo "CREATE DATABASE snort;" | mysql -u root -p
Then create a user with INSERT and SELECT privileges (other than root)
in the system's /etc/passwd file. Give them this privilege
once you have fired up the MySQL client:
$MYSQLDIR/bin/mysql
grant INSERT, SELECT on snort.* to kristyw@localhost;
In this case, my user's name is "kristyw".
At this point you need to create some tables for Snort to log
to. The collaborators of Snort have made this easy by providing
a script under their distribution's contrib directory
called create_mysql. You can run it from the Snort source
directory:
$MYSQLDIR/bin/mysql -D snort -u root -p < ./contrib/create_mysql
We are ready to compile Snort! When you run the configure script,
in addition to any of the other options you want to use, make sure
you include -with-mysql=$DBHOME. Then the configure script
will know to test your installation and make sure that it works properly
with Snort, which you will see when it tests for the various databases,
and MySQL returns a "yes". Then proceed to make and
make install as normal.
Once this is done, you will need to configure your rules database
to include the database plugin. If you are upgrading, don't
forget to customize your ruleset to utilize your existing tweaks
and customizations. Download the latest ruleset from:
www.snort.org
If you are installing this for the first time, then you need to make
sure that you change the network options to fit your environment.
Specifically for this plugin, you will want to add an output rule
to your rules database. Generally, there are two ways to do this.
The first way is to update the snort.conf by unremarking and
customizing the output rule that specifies:
output database: log, mysql, user=kristyw dbname=snort host=localhost password=password encoding=hex detail=full
Where "log" is the type of output going to the database,
"Mysql" is the type of database, the "user" is
who will be inserting the data, name of the database, what host it
is on, password, "encoding" is what format to log in, and
"detail" is how much you would like to log.
The second way is to add this line to the single database file
that you have downloaded from the snort.org site. Then you
can start Snort and watch the logging take place! I started Snort
with the following options:
$SNORT_HOME/snort -D -c /$SNORT_HOME/rules.file -e -i /dev/diag/lan0
To check that data is actually getting into your database the way
you want it to, you can check the table contents with the following
MySQL commands. Enter the MySQL client:
$DBHOME/bin/mysql -u root -p -D snort
You will be prompted for a password.
Show the tables in the database:
mysql> show tables;
+-----------------+
| Tables_in_snort |
+-----------------+
| data |
| detail |
| encoding |
| event |
| icmphdr |
| iphdr |
| opt |
| sensor |
| tcphdr |
| udphdr |
+-----------------+
10 rows in set (0.00 sec)
Show the data in the selected table:
mysql> select * from event;
+-----+-----+-----------------------+---------------------+
| sid | cid | signature | timestamp |
+-----+-----+-----------------------+---------------------+
| 1 | 1 | IDS152 - Ping BSDtype | 2001-01-31 09:09:53 |
| 1 | 2 | IDS152 - Ping BSDtype | 2001-01-31 09:09:54 |
| 1 | 3 | IDS152 - Ping BSDtype | 2001-01-31 09:09:55 |
| 1 | 4 | IDS152 - Ping BSDtype | 2001-01-31 09:09:56 |
| 1 | 5 | IDS152 - Ping BSDtype | 2001-01-31 09:09:57 |
[snip]
| 1 | 30 | ICMP Unknown Type | 2001-01-31 09:18:19 |
| 1 | 31 | ICMP Unknown Type | 2001-01-31 09:28:19 |
| 1 | 32 | ICMP Unknown Type | 2001-01-31 09:38:19 |
| 1 | 33 | ICMP Unknown Type | 2001-01-31 09:48:19 |
Once you are satisfied with the setup of your database, you can either
leave it as is, or set up ACID, if you would like to have a front-end
console for Snort. You also have the option at this point to run the
snortdb-extra script, which adds some extra tables that the
original script does not include. The snortdb-extra script
can be found in the Snort contrib directory as a gzip file.
If you unzip the file and read it, it says to use it by running zcat.
This only works with compressed files, so you should first gunzip
it, then compress it, then run it by using the following:
zcat snortdb-extra | mysql -D snort -u root -p
I recommend adding these tables because they provide more depth in
the entries that you log to your database.
ACID: Analysis Console for Intrusion Databases
Now you have invested all this time and sweat into configuring
your Snort to log to a database, but without getting deeply imbedded
in SQL statements, how do you get any information out of it? That
is where ACID comes in. ACID is "a PHP-based analysis engine
to search and process a database of incidents generated by security-related
software such as IDSes and firewalls (e.g., Snort, ipchains --
see Resources at end). ACID is also great for logging several disparate
sensors into one console. The extra ingredients needed for this
setup (in addition to Snort 1.7 and MySQL) are the Apache Web server
with PHP 4:
http://www.apache.org
or:
http://www.php.net
ACID:
http://www.cert.org/acid/
or:
http://acidlab.sourceforge.net/
and ADODB v0.93+ if you are using ACID v.0.9.6b2+ (php.weblogs.com/ADODB).
For my installation, I am using Apache 1.3.17, php 4.0.4pl1, and ACID
0.9.6b1.
To get everything to work properly together, I found it best to
install these packages in the order suggested by the Apache README.configure
file (Apache, PHP, and ACID. You also need flex to complete this
install; it's also a requirement for Snort so if you are compiling
on the same server, then you should be set). There are other packages
required, depending on what you are doing overall with this distribution,
so be sure to read the README files closely. The steps to do this
are:
1. Untar the Apache distribution ($APACHEDIR).
2. Cd into this directory and run the configure script
(default installation goes to /usr/local/apache), using any
options you might need for your site, then make and make
install.
3. Untar the PHP distribution in a separate directory ($PHPDIR).
4. Configure PHP with ./configure -with-apache=path_to_apache
-with-mysql=/$MYSQLDIR; make; and make install.
5. For some reason, the correct lib file did not get copied
to my Apache directory during this process, so I manually copied
/$PHPDIR/libs/libphp4.a to /$APACHEDIR/src/modules/php4.
6. Then, go back to the Apache directory and run ./configure
-activate-module=src/modules/php4/libphp4.a.
7. Fire up your Apache server with /usr/local/apache/bin/ \
apachectl start and make sure it starts up.
One hitch that I ran into on HP-UX was that Apache would not start
right away. After some digging through the Apache FAQ a bit, I discovered
that HP will not allow you to run a server like this with nobody/nogroup
as owner and group. I needed to create a WWW user (or whatever you
prefer), and a WWW group with WWW as a member. I changed my httpd.conf
file accordingly, and everything came up fine. Also, make sure that
the PHP plugins are unremarked in your httpd.conf file before
starting up the Apache server. The two lines to look for are:
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
To set up ACID, untar the distribution in a designated place. I set
up a virtual host through Apache in order to reach the PHP files for
ACID. To do this, I turned once again to the httpd.conf file
and added near the end of the file:
<VirtualHost Ipaddress>
ServerAdmin mymail@mycompany.com
DocumentRoot $ACIDDIR
ServerName acid
ErrorLog /var/log/httpd/error-log
</VirtualHost>
The ServerName can be whatever URL you would like to call it. I then
restarted the Apache server and went to my ACID URL, and up comes
the acid_main.php page. There is more configuration, however,
to properly point it to your database. Editing the acid_conf.php
file is in order, updating the following variables:
$alert_dbname: MySQL database name where the alerts are stored
$alert_host: host where the database is stored
$alert_port: port where the database is stored
$alert_user: username for the database
$alert_password: password for the username
See Figures 1 and 2 for snapshots of ACID.
After ACID is set up and running, you can use it for many things.
You can search for incidents based on specific criteria, or complex
combinations of criteria. ACID can also be used for alerting, statistical
analysis, and graphical reporting. Items like these (especially
reporting) help to show management why you have perimeter security
in place.
Snort and Big Brother
Say that you don't have the resources for the scenario that
we have just built utilizing a database, Snort, and an Apache/PHP
Web server. But you already have an Apache Web server running Big
Brother (a free, Web-based monitoring and reporting tool for networks
and servers) that runs all of your network monitoring. Snort to
Big Brother, written by Mattias Sandstrom, is the tool for you.
The Snort to Big Brother link is:
http://www.ffoff.org/~mattis/linux/snort2bb/
I am using snort2bb-000831.tar.gz for this article. Big Brother
can be found at:
http://bb4.com/
This section assumes that you already have Big Brother set up. (See
March 1997 and September 1998 issues of Sys Admin for articles
about Big Brother.)
Snort to Big Brother is a Perl script that parses your Snort log
and sends reports to Big Brother. Advantages to this include that
Big Brother can be set for a certain level of notifications and
then page you and update the central Big Brother console, which
gives a visual alert. The key ingredients to make this script work
include: your Snort machine, Perl v.500503 or later, and the Big
Brother client. For Perl, you will need the File::Tail module, which
needs the Time::HiRes module. Both modules can be downloaded at:
http://www.cpan.org/modules/index.html
The first issue to tackle is the Perl module installations. After
downloading the required modules (Time-HiRes-01.20.tar.gz and
File-Tail-0.98.tar.gz), gunzip and untar them in a secured
location:
Cd /tmp
gunzip Time-HiRes-01.20.tar.gz ; tar xvf ./Time-HiRes-01.20.tar
gunzip File-Tail-0.98.tar.gz ; tar xvf ./File-Tail-0.98.tar
cd Time-HiRes-01.20
perl ./Makefile.pl
make
make test
make install
cd into the File-Tail-0.98 directory and repeat the same process.
Install the Big Brother client next to get your Snort box to talk
to the Big Brother server. First, add a bb user to your Snort
server. To do the client installation, there are two possibilities.
If your Big Brother server is running on the same platform as your
Snort box, then you can go into the Big Brother install directory
and run the bbclient script with the host name of your Snort server
-- bbclient snortserver. This will create a tar
file of the files that you will need to run the Big Brother client
on your Snort server. If, however, your Snort server runs on a separate
platform, then you will need to compile the Big Brother code on
this platform. To do so, download the latest code from bb4.com,
untar the distribution, cd into the install directory and
run bbconfig $OSNAME (where $OSNAME is the name of
the OS on which you are installing).
After a running through a brief and intuitive installation script,
you will need to cd into the src directory:
cd ../src
make; make install
Then, change the ownership of the Big Brother directory to be owned
by the bb user. Double check that the bb-hosts file
in your etc directory has the correct BBDISPLAY variable for
your Big Brother server.
Now we are ready to fix up the snort2bb.pl file to read
Snort alert files and to send reports to the Big Brother server.
Untar the snort2bb-version.tar in a directory, then cd
into the snort2bb directory. You need to edit the snort2bb.pl
script, specifically the $bbhost and $localhost variables
to point to the Big Brother server and the hostname of your Snort
server. You also need to make sure you change the $snort_file
and $snort_file_type variables. The former is the name of
the file to which Snort is logging alerts, and the latter is either
the default (which looks to /var/log/secure) or you can change
it to a 1 to indicate that the log is in the "-A" fast
option for Snort, you need to log Snort this way or snort2bb
will not work! I also had to modify the path for Perl as I had it
installed in /opt/perl5/bin, not /usr/bin as the script
mentions.
There are other options that you may want to tweak, specifically
the $WARN and $PANIC variables, which will tell Big
Brother when to notify you (either by pager or to the console).
After tweaking, you are ready to run the snort2bb.pl script.
If you experience problems, there is a verbose mode (using -v)
so that you can see what is beginning.
Snortsnarf
There is also a tool called Snortsnarf written by Jim Hoagland
and Stuart Staniford of Silicon Defense that helps sort through
Snort logs with relative ease. You can find Snortsnarf at:
http://www.silicondefense.com/snortsnarf/
Snortsnarf is essentially a Perl script that parses through your Snort
alert file and creates a clean set of html files that you can review
to see what is going on with your Snort sensor. It also includes links
to look-up hosts that cause source traffic through ARIN, RIPE, APNIC,
or Geektools, as well as links to the whitehats.com signature
database to obtain more information on the type of alert you are seeing.
See Figures 3 and 4 for a more detailed look at Snortsnarf.
Another great feature of Snortsnarf is that it is easy and quick
to set up. You will need Perl on your system, then download the
latest version (which was SnortSnarf-011601.1.tar.gz when
I wrote this). Gunzip and untar the distribution:
gunzip SnortSnarf-011601.1.tar.gz; tar xvf SnortSnarf-011601.1.tar
then grab your snort.alert file (put it wherever you would
like to keep a sizable amount of data) and run:
$PATHTOSNARF/snortsnarf.pl snort.alert
This will generate the necessary html files. Depending on how fancy
you want to get, you can open a browser local to the snortserver and
then open up the index.html file and be on your way. I set
up a virtual server on an existing Apache Web server on the network.
I wrote a script to grab the previous day's alert file, delete
the old html files, run Snortsnarf, and then check my Web site. This
approach has made it easier to read the Snort alerts and understand
exactly what I am being hit with. It also helps weed out rules that
may be causing a lot of false positives, or that you don't necessarily
want to track, so you can remove them.
To summarize, the Snort project has really grown. Not only in
having more rich features itself, but also in additional projects
that can assist you in making sense of your data. There are numerous
tools that were not mentioned here, and the best source to find
something that would work for you is the snort.org site.
It is updated constantly with the latest accompaniments for Snort.
The other key source of information is the Snort users mailing list,
which can be joined on the snort.org site. This list is maintained
by Martin Roesch and the key Snort developers. The information gained
through this list is invaluable and often not documented anywhere
else.
Resources
http://acidlab.sourceforge.net/ -- ACID readme and
homepage
http://www.snort.org
http://www.incident.org/snortdb/
http://www.bb4.com
http://www.ffoff.org/~mattis/linux/snort2bb/
http://www.silicondefense.com/snortsnarf/
Kristy Westphal is a versatile network administrator, skilled
in troubleshooting and process analysis. She is knowledgeable in
UNIX and NT, as well as project management and security/disaster
recovery planning with more than 7 years of experience in the IS
field. She can be reached at: ckwestphal@home.com.
|