Jarvinen: User-Agents mit in die Darstellung aufnehmen

Jarvinen zeigt im Standard keinen Useragent an. Das ist aber bei vielen Alerts oder Entries gut zu wissen. Will man diese Feld mit angezeigt bekommen muss man zuerst die Datenbank um eine entsprechende Spalte erweitern. Dann gilt es das Import Script so anzupassen, das es die Logfiles nach diesem Wert auch auswertet. Zum Schluss muss man natürlich die PHP Anwendung erweitern das dieser neue Wert auch angezeigt wird.

1. Sichern der Datenbank

Natürlich zuerst ein Backup der Datenbank.

mysqldump --user=modsecuser --password=geheim msaudit | gzip > msaudit.sql.gz

2. Erweiterung der Datenbank

Die Datenbank msaudit hat zwei Tabellen. Eine für Alerts und eine für Entries. In beide Tabellen muss eine neue Spalte eingefügt werden.

# mysql -u modsecuser -p msaudit
Enter password:

mysql> ALTER TABLE alerts ADD ua VARCHAR(400);
Query OK, 716 rows affected (0.14 sec)
Records: 716  Duplicates: 0  Warnings: 0

mysql> show columns from alerts;
+------------------+------------------+------+-----+---------+-------+
| Field            | Type             | Null | Key | Default | Extra |
+------------------+------------------+------+-----+---------+-------+
| entries_uniqueid | varchar(45)      | NO   | MUL |         |       |
| generalmsg       | varchar(200)     | NO   |     |         |       |
| technicalmsg     | text             | NO   |     | NULL    |       |
| ruleid           | int(10) unsigned | NO   |     | 0       |       |
| msg              | varchar(255)     | NO   |     |         |       |
| severity         | varchar(45)      | NO   |     |         |       |
| ua               | varchar(400)     | YES  |     | NULL    |       |
+------------------+------------------+------+-----+---------+-------+
7 rows in set (0.00 sec)

mysql> ALTER TABLE entries ADD ua VARCHAR(400);
Query OK, 2254 rows affected (0.21 sec)

mysql> show columns from entries;
+-------------+------------------+------+-----+------------+----------------+
| Field       | Type             | Null | Key | Default    | Extra          |
+-------------+------------------+------+-----+------------+----------------+
| id          | int(20) unsigned | NO   | PRI | NULL       | auto_increment |
| srcip       | varchar(45)      | NO   |     |            |                |
| srcport     | int(10) unsigned | NO   |     | 80         |                |
| dstip       | varchar(45)      | NO   |     |            |                |
| dstport     | int(10) unsigned | NO   |     | 80         |                |
| uniqueid    | varchar(45)      | NO   |     |            |                |
| httpmethod  | varchar(20)      | NO   |     | GET        |                |
| uri         | text             | NO   |     | NULL       |                |
| httpversion | varchar(10)      | NO   |     | HTTP/1.1   |                |
| host        | varchar(100)     | YES  |     | NULL       |                |
| date        | date             | NO   |     | 0000-00-00 |                |
| time        | time             | NO   |     | 00:00:00   |                |
| ua          | varchar(400)     | YES  |     | NULL       |                |
+-------------+------------------+------+-----+------------+----------------+
13 rows in set (0.00 sec)

3. Erweiteren des Python Scripts um das durchsuchen der User-Agents

Innerhalb des Python Scripts muss zuerst eine Zeile eingefügt werden damit die Useragent Zeile ausgewertet wird. Dann wird dieses neue Feld in die Aufrufe für das Einfügen der Einträge in die MySQL Datenbank angehägt. Diese Aufrufe müssen dann ebenfalls noch erweitert werden.

Diese Diff File enthält die Änderungen. jarvinen.py-user-agent-erweiterung-diff

4. Anpassung der PHP Anwendung

Defaultmässig werden alle Spalten der Tabelle angezeigt. Es fehlt also nur noch Feldbezeichnung. In der Datei QueryStr.php ist dazu für die Entries folgende Änderung notwendig

 $query = sprintf("select * from alerts where entries_uniqueid='%s'", $value) ;
    
-    $headings = array("entries_uniqueid","generalmsg","technicalmsg","ruleid","msg","severity") ;
+    $headings = array("entries_uniqueid","generalmsg","technicalmsg","ruleid","msg","severity","ua") ;
    
-    $headStr = array("Entries Unique ID", "General Message", "General Message", "Rule ID", "Message", "Severity") ;
+    $headStr = array("Entries Unique ID", "General Message", "General Message", "Rule ID", "Message", "Severity","User-Agent") ;

und für die Alerts hinter der Zeile

 $query = sprintf("select * from entries where uniqueid='%s'", $value) ; 
 
-    $headStr = array("Entry ID", "Source IP", "Source Port", "Destination IP", "Destination Port", "Unique ID", "HTTP Method","Uri", "HTTP Version", "Host", "Date","Time") ;  // Tablo deger basliklari
+    $headStr = array("Entry ID", "Source IP", "Source Port", "Destination IP", "Destination Port", "Unique ID", "HTTP Method","Uri", "HTTP Version", "Host", "Date","Time","User-Agent") ;

5. Ergebnis

201006-jarvinen-ua.png