[TriLUG] defense against dictionary attacks?

Aaron S. Joyner aaron at joyner.ws
Fri Jun 25 20:37:15 EDT 2004


Jon Carnes wrote:

>You could expand the earlier script and add a nospamdb file (using ip's
>that should be ignored by the script. To do so, simply add a line to
>exit the script if the ip is in your nospamdb file:
>  if (`grep -wq $BADIP nospamdb`); then exit; fi
>
>Also, with a bit of trial and error you can gauge just how many entries
>will be in your info file after a minute of being attacked, and instead
>of grepping the whole file, you can simply grep the end of the file. To
>grep the last 200 entries:
>  tail -200 $INFO |grep $ENTRIES |grep " 550 " | ...
>
>This is extremely fast and makes the script take under a second to
>execute.
>
>Jon
>
Disclaimer: This rant is my opinion.  Take it with a grain of salt.

Part of my point was that yes, this concept is entirely possible.  It's 
just one of those projects that would start as a simple script and then 
consume your entire life as you tried to properly implement it.  :)  As 
a suggested improvement on the theme, your script should be run as a 
daemon (to avoid startup costs) and you should open the log file for 
reading directly in PERL.  Sleep for 60 seconds, then read from your 
current point in the file to the end of file.  Sleep for another 60 
seconds, repeat.  Also by keeping a single running process, this allows 
you to easily keep a hash of the senders, and how often they've sent in 
the past 5 mins, or hour, or how ever long you prefer.  You can keep a 
separate hash of senders who've sent you more than X messages in the 
past 24 hours, and each 24 hour period that person has sent you more 
than 5 valid messages, you bump the count on their domain - this way you 
can naturally develop a "learned" white list.  Anyone in that 24 hour 
hash who's value is more than 5 (they've sent you more than 5 valid 
messages on 5 separate days) is considered to be a safe sender.  You can 
of course tune those values to be appropriate for your domain.  Don't 
forget to write them out to a file every X hours so that you won't loose 
your learned white list every time you restart.

Since you don't have the overhead of start-up costs, you can even check 
the log file more often, say every 15 seconds.  This would allow you to 
respond more quickly to bursts of traffic (the whole purpose of the 
script to start with).  By the time you've gotten this far, you've begun 
to realize how much faster (yet less flexible) this program would be in 
C, as opposed to PERL.  Once you've fully explored the problem domain 
(and worked out all of the problem-specific bugs), you begin to rewrite 
it in C, for performance.  Then, and only then, have you reached a point 
where you're saving cpu cycles as well as bandwidth by running the 
daemon.  Of course, then as things settle, you look around, upgrade 
Postfix, and realize that months ago anvil(8) stabilized, and it's a 
better implementation (as it doesn't have to use the log file and the 
file system as intermediate steps) which solves the same problem.  :)  
At this point, you realize that if only you could share this information 
with others, you'd be one up on anvil(8) again.  All that work would not 
have been in vain.  If only you could provide the information as a 
blacklist - perhaps through DNS!  Then hopefully, before you implement 
pushing the block-data out to zone files, you realize that you'd be 
writing yet-another DNS blacklist based on tracking zombies.  :)

Can you tell that I've been down this road (with 
similar-yet-not-the-same projects) before?  :)  I don't entirely want to 
discourage anyone from it, as it can be a very useful learning 
experience, and a great way to learn PERL and C if you don't know them 
already.  But the particular situation (gah, block the bastards from 
storming me with mail!) is a very natural knee-jerk response, yet 
frequently not the best response, in my experiences.

Aaron S. Joyner



More information about the TriLUG mailing list