A small number of new features made it into 1.9 at the very last minute. Initially I intended to only review code after 1.9dev3 but, as I my review went along, I realized there were certain features that are needed to fulfil the spirit of the 1.9 release. Although 1.9 brings many improvements throughout, this release is about three things: support for real-time audit log aggregation, stateful operation (used in 1.9 for defense against Denial-of-Service attacks; more features will be available in the subsequent releases), and support for rule databases.
With the last improvement in mind, I changed a few things in 1.9dev4. First is the way per-rule actions are merged with the default actions in the configuration context (set via SecFilterDefaultActions). Before there was no merging - if you wanted to change only one thing about a rule you still had to specify (or specify again) every action that needs to happen. Any rule coming out of a rule database would make use of the meta-data actions (id, rev, msg, severity), which means all such rules would make use of the per-rule action list. This would mean rule database producers would have to embed other actions in their rules (whether to deny a rule or not, which status to use, etc), but that is simply not acceptable. You don't want other people to decide your policy for you. What if their rules are not as tight as you would have wanted?
Merging, introduced in 1.9dev4, allows meta-data actions to be used freely while the administrator is still able to retain the control. To reiterate this point further I introduced the SecFilterActionsRestricted directive. When this directive is set to "On", the subsequent rules are allowed to *only* use the meta-data actions. This makes it somewhat safer to use third-party rules on a system.
Another improvement makes it possible now to use SecFilterDefaultAction many times within the same configuration context. The action list specified in the directive will be applied until the next appearance of the same directive. This is another change that allows the user to move the actions out of the rules. Before you could have only one default action list per configuration, so every rule that wanted to do something differently (e.g. not reject the request) had to have a per-rule action list. Now you can simply have multiple occurrences of the SecFilterDefaultAction directive and group the rules according to how they behave.
Now that I look back at the blog entry I have just written I realize ModSecurity is no longer that simple tool it once was. Although it can still be used in a simple manner, if you decide to do so, there is a lot of support for advanced usage scenarios, ones that are often needed in real life.