public inbox for gentoo-user@lists.gentoo.org
 help / color / mirror / Atom feed
* [gentoo-user] SSH brute force attacks and blacklist.py
@ 2008-02-27 17:51 Steve
  2008-02-27 18:09 ` [gentoo-user] " 7v5w7go9ub0o
                   ` (3 more replies)
  0 siblings, 4 replies; 12+ messages in thread
From: Steve @ 2008-02-27 17:51 UTC (permalink / raw
  To: gentoo-user

I can't believe that I'm the only person with this, so it's probably 
worth asking.

I'm one of the (many) people who has opportunists trying usernames and 
passwords against SSH... while every effort has been made to secure this 
service by configuration; strong passwords; no root login remotely etc.  
I would still prefer to block sites using obvious dictionary attacks 
against me.

I used to use DenyHosts - but that became annoying as it used rather a 
lot of resources (and relied upon tcp wrappers... which, I'm informed 
are somewhat old-fashioned)

I migrated to try using iptables as my firewall and using blacklist.py - 
which I got working after some minor config-tweaking.  I'm aware that 
there is configuration in the blacklist.py script for BLOCKING_PERIOD - 
but what I really miss the "blocked forever" nature of the DenyHosts 
alternative.... though I prefer every other aspect of the 
iptables/blacklist.py approach.

Has anyone else resolved this?  As far as I'm concerned, once I detect 
someone has attempted a brute force (which blaclist.py does 
fantastically well) what I want is for no further communication to be 
accepted from the IP address - even after I reboot etc.  While I don't 
know which sites I want to be accessible from in advance, I can be sure 
none of them would launch a brute force attack against me. :-)

Recommendations?

I'm looking for the neatest Gentoo way to do this... rather than 
recommendations for how to write something to do what I want from scratch...

Steve

-- 
gentoo-user@lists.gentoo.org mailing list



^ permalink raw reply	[flat|nested] 12+ messages in thread

* [gentoo-user] Re: SSH brute force attacks and blacklist.py
  2008-02-27 17:51 [gentoo-user] SSH brute force attacks and blacklist.py Steve
@ 2008-02-27 18:09 ` 7v5w7go9ub0o
  2008-02-27 18:14   ` 7v5w7go9ub0o
  2008-02-27 18:12 ` [gentoo-user] " Alan McKinnon
                   ` (2 subsequent siblings)
  3 siblings, 1 reply; 12+ messages in thread
From: 7v5w7go9ub0o @ 2008-02-27 18:09 UTC (permalink / raw
  To: gentoo-user

Steve wrote:
> I can't believe that I'm the only person with this, so it's probably 
> worth asking.
> 
> I'm one of the (many) people who has opportunists trying usernames and 
> passwords against SSH... while every effort has been made to secure this 
> service by configuration; strong passwords; no root login remotely etc.  
> I would still prefer to block sites using obvious dictionary attacks 
> against me.
> 
> I used to use DenyHosts - but that became annoying as it used rather a 
> lot of resources (and relied upon tcp wrappers... which, I'm informed 
> are somewhat old-fashioned)
> 
> I migrated to try using iptables as my firewall and using blacklist.py - 
> which I got working after some minor config-tweaking.  I'm aware that 
> there is configuration in the blacklist.py script for BLOCKING_PERIOD - 
> but what I really miss the "blocked forever" nature of the DenyHosts 
> alternative.... though I prefer every other aspect of the 
> iptables/blacklist.py approach.
> 
> Has anyone else resolved this?  As far as I'm concerned, once I detect 
> someone has attempted a brute force (which blaclist.py does 
> fantastically well) what I want is for no further communication to be 
> accepted from the IP address - even after I reboot etc.  While I don't 
> know which sites I want to be accessible from in advance, I can be sure 
> none of them would launch a brute force attack against me. :-)
> 
> Recommendations?

If this is a personal or low-user connection, consider fwknop - single 
packet authorization port knocking.

- works well for my home box
- the port simply drops pings, connection attempts, etc. 'til "opened"
- fwknop uses pcap to listen for authorization packets; when one comes 
through with the correct (encrypted) command, it'll send an iptables 
command to temporarily open the port for a designated period of time 
allowing you to connect. The encrypted packets include a time of day 
field to prevent replay attacks.


http://www.cipherdyne.org/fwknop/download/

> 
> I'm looking for the neatest Gentoo way to do this... rather than 
> recommendations for how to write something to do what I want from 
> scratch...

fwknop is not Gentoo; but compiles cleanly.

HTH


-- 
gentoo-user@lists.gentoo.org mailing list



^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [gentoo-user] SSH brute force attacks and blacklist.py
  2008-02-27 17:51 [gentoo-user] SSH brute force attacks and blacklist.py Steve
  2008-02-27 18:09 ` [gentoo-user] " 7v5w7go9ub0o
@ 2008-02-27 18:12 ` Alan McKinnon
  2008-02-27 19:07 ` Justin
  2008-02-27 20:24 ` Remy Blank
  3 siblings, 0 replies; 12+ messages in thread
From: Alan McKinnon @ 2008-02-27 18:12 UTC (permalink / raw
  To: gentoo-user

On Wednesday 27 February 2008, Steve wrote:

> I migrated to try using iptables as my firewall and using
> blacklist.py - which I got working after some minor config-tweaking. 
> I'm aware that there is configuration in the blacklist.py script for
> BLOCKING_PERIOD - but what I really miss the "blocked forever" nature
> of the DenyHosts alternative.... though I prefer every other aspect
> of the
> iptables/blacklist.py approach.

blacklist.py seems to work well for you, so why not just set 
BLOCKING_PERIOD to it's maximum value?

I would imagine that even after say one week the vast majority of zombie 
bots would have given up and moved on



-- 
Alan McKinnon
alan dot mckinnon at gmail dot com

-- 
gentoo-user@lists.gentoo.org mailing list



^ permalink raw reply	[flat|nested] 12+ messages in thread

* [gentoo-user] Re: SSH brute force attacks and blacklist.py
  2008-02-27 18:09 ` [gentoo-user] " 7v5w7go9ub0o
@ 2008-02-27 18:14   ` 7v5w7go9ub0o
  0 siblings, 0 replies; 12+ messages in thread
From: 7v5w7go9ub0o @ 2008-02-27 18:14 UTC (permalink / raw
  To: gentoo-user

Sorry .... here's the link I should have posted:

http://www.cipherdyne.org/fwknop/
-- 
gentoo-user@lists.gentoo.org mailing list



^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [gentoo-user] SSH brute force attacks and blacklist.py
  2008-02-27 17:51 [gentoo-user] SSH brute force attacks and blacklist.py Steve
  2008-02-27 18:09 ` [gentoo-user] " 7v5w7go9ub0o
  2008-02-27 18:12 ` [gentoo-user] " Alan McKinnon
@ 2008-02-27 19:07 ` Justin
  2008-02-27 21:39   ` [gentoo-user] " Anno v. Heimburg
  2008-02-27 20:24 ` Remy Blank
  3 siblings, 1 reply; 12+ messages in thread
From: Justin @ 2008-02-27 19:07 UTC (permalink / raw
  To: gentoo-user



Steve schrieb:
> I can't believe that I'm the only person with this, so it's probably 
> worth asking.
>
> I'm one of the (many) people who has opportunists trying usernames and 
> passwords against SSH... while every effort has been made to secure 
> this service by configuration; strong passwords; no root login 
> remotely etc.  I would still prefer to block sites using obvious 
> dictionary attacks against me.
>
> I used to use DenyHosts - but that became annoying as it used rather a 
> lot of resources (and relied upon tcp wrappers... which, I'm informed 
> are somewhat old-fashioned)
>
> I migrated to try using iptables as my firewall and using blacklist.py 
> - which I got working after some minor config-tweaking.  I'm aware 
> that there is configuration in the blacklist.py script for 
> BLOCKING_PERIOD - but what I really miss the "blocked forever" nature 
> of the DenyHosts alternative.... though I prefer every other aspect of 
> the iptables/blacklist.py approach.
>
> Has anyone else resolved this?  As far as I'm concerned, once I detect 
> someone has attempted a brute force (which blaclist.py does 
> fantastically well) what I want is for no further communication to be 
> accepted from the IP address - even after I reboot etc.  While I don't 
> know which sites I want to be accessible from in advance, I can be 
> sure none of them would launch a brute force attack against me. :-)
>
> Recommendations?
>
> I'm looking for the neatest Gentoo way to do this... rather than 
> recommendations for how to write something to do what I want from 
> scratch...
>
> Steve
>

Try fail2ban. I started as newby on iptables and I still am, because it 
is very easy to configure and does it job perfect.

http://gentoo-wiki.com/HOWTO_fail2ban
http://www.fail2ban.org/wiki/index.php/Main_Page
-- 
gentoo-user@lists.gentoo.org mailing list



^ permalink raw reply	[flat|nested] 12+ messages in thread

* [gentoo-user]  Re: SSH brute force attacks and blacklist.py
  2008-02-27 17:51 [gentoo-user] SSH brute force attacks and blacklist.py Steve
                   ` (2 preceding siblings ...)
  2008-02-27 19:07 ` Justin
@ 2008-02-27 20:24 ` Remy Blank
  2008-02-27 23:01   ` Iain Buchanan
  2008-02-28  9:55   ` Etaoin Shrdlu
  3 siblings, 2 replies; 12+ messages in thread
From: Remy Blank @ 2008-02-27 20:24 UTC (permalink / raw
  To: gentoo-user

[-- Attachment #1: Type: text/plain, Size: 848 bytes --]

Steve wrote:
> I'm one of the (many) people who has opportunists trying usernames and 
> passwords against SSH... while every effort has been made to secure this 
> service by configuration; strong passwords; no root login remotely etc.  
> I would still prefer to block sites using obvious dictionary attacks 
> against me.

The best advice I can give is to use public key authentication only. 
This will defend against all dictionary-based attacks, which is what you 
describe.

The only remaining "problem" is that your log files will be filled with 
unsuccessful login attempts. A simple solution is to run sshd on a 
non-standard, high-numbered port, e.g. in the 30'000. Bots only ever try 
to connect on port 22. This will *not* improve the protection of your 
server, but it will avoid having your logs spammed.

-- Remy


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 189 bytes --]

^ permalink raw reply	[flat|nested] 12+ messages in thread

* [gentoo-user]  Re: SSH brute force attacks and blacklist.py
  2008-02-27 19:07 ` Justin
@ 2008-02-27 21:39   ` Anno v. Heimburg
  2008-02-28 16:31     ` Willie Wong
  0 siblings, 1 reply; 12+ messages in thread
From: Anno v. Heimburg @ 2008-02-27 21:39 UTC (permalink / raw
  To: gentoo-user

Justin wrote:

> Try fail2ban

Alternatively, you can use the builtin iptables connection rate limiter.

Excerpt from my home-grown firewall script:

------------
for port in $INPUT_LIMITER_TCPPORTS; do
        $IPT_IN -p tcp  --dport $port -m state --state NEW -m \
recent --name "limit-${port}" --set
        $IPT_IN -p tcp  --dport $port -m state --state NEW -m \
recent --name "limit-${port}" --rcheck --seconds
$INPUT_LIMITER_TIME --hitcount $INPUT_LIMITER_COUNT -j \
LOG --log-prefix "limit-rjct-${port} "
        $IPT_IN -p tcp  --dport $port -m state --state NEW -m \
recent --name "limit-${port}" --rcheck --seconds
$INPUT_LIMITER_TIME --hitcount $INPUT_LIMITER_COUNT -j REJECT \
        $IPT_IN -p tcp  --dport $port -m state --state NEW -j
LOG --log-level notice --log-prefix "limit-acpt-${port} " \
        $IPT_IN -p tcp  --dport $port -m state --state NEW -j ACCEPT
done
----------------

It limits the number of new connections on each port in
INPUT_LIMITER_TCPPORTS from any individual host to INPUT_LIMITER_COUNT
within INPUT_LIMITER_TIME.

More precisely, it does the following:

1. When a new connection is established by a previously unkown host, set a
mark (first rule).
2. When the number of marks from that host has exceeded the specified upper
connection limit, reject the connection (third rule), you could also drop.
3. Otherwise, accept the connection (fifth rule)

Rules numbers 2 and 4 are for logging purposes only, and have no impact on
functionality. By using --log-prefix, you can use your logging daemon's
filtering capabilities to sort these requests into new 

The count is reset after INPUT_LIMITER_TIME seconds have passed. Thus, after
exceeding INPUT_LIMITER_COUNT, you have to wait for $INPUT_LIMITER_SECONDS
before a new attempt.

Oh yeah, $IPT_IN is shorthand for "${IPTABLES} -t filter -A INPUT", where
${IPTABLES} points to the iptables executable, of course.

The advantage of this solution is that it does not rely on log files parsing
or any other magic, it simply counts the number of connections from each
host on a specific port. It it does very easy on CPU and very stable, it
continues working as long as your kernel works.

The disadvantage is that it does not rely on log files parsing or any other
magic, it simply counts the number of connections from each host on a
specific port. It cannot do anything clever. Also, your iptables -L output
gets a bit cluttered by adding five rules for every port you want to
rate-limit.

Anno.

-- 
gentoo-user@lists.gentoo.org mailing list



^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [gentoo-user]  Re: SSH brute force attacks and blacklist.py
  2008-02-27 20:24 ` Remy Blank
@ 2008-02-27 23:01   ` Iain Buchanan
  2008-02-28  9:55   ` Etaoin Shrdlu
  1 sibling, 0 replies; 12+ messages in thread
From: Iain Buchanan @ 2008-02-27 23:01 UTC (permalink / raw
  To: gentoo-user


On Wed, 2008-02-27 at 21:24 +0100, Remy Blank wrote:

>  A simple solution is to run sshd on a 
> non-standard, high-numbered port, e.g. in the 30'000. Bots only ever try 
> to connect on port 22. This will *not* improve the protection of your 
> server, but it will avoid having your logs spammed.

+1

I hosed my router, and had to go back to an old one that could only
forward port 22 to an internal machine port 22.  I got lots of brute
force attacks.  Well, most of them only tried about 5 passwords each, so
not exactly brute force...  Anyway, once I upgraded my router again and
forwarded port x0000 to port 22, I haven't seen one since.

HTH,
-- 
Iain Buchanan <iaindb at netspace dot net dot au>

Linux - because software problems should not cost money.

   -- Shlomi Fish

-- 
gentoo-user@lists.gentoo.org mailing list



^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [gentoo-user]  Re: SSH brute force attacks and blacklist.py
  2008-02-27 20:24 ` Remy Blank
  2008-02-27 23:01   ` Iain Buchanan
@ 2008-02-28  9:55   ` Etaoin Shrdlu
  2008-02-28 11:13     ` Steve
  1 sibling, 1 reply; 12+ messages in thread
From: Etaoin Shrdlu @ 2008-02-28  9:55 UTC (permalink / raw
  To: gentoo-user

On Wednesday 27 February 2008, Remy Blank wrote:

> Steve wrote:
> > I'm one of the (many) people who has opportunists trying usernames
> > and passwords against SSH... while every effort has been made to
> > secure this service by configuration; strong passwords; no root
> > login remotely etc. I would still prefer to block sites using
> > obvious dictionary attacks against me.
>
> The best advice I can give is to use public key authentication only.
> This will defend against all dictionary-based attacks, which is what
> you describe.
>
> The only remaining "problem" is that your log files will be filled
> with unsuccessful login attempts. A simple solution is to run sshd on
> a non-standard, high-numbered port, e.g. in the 30'000. Bots only ever
> try to connect on port 22. This will *not* improve the protection of
> your server, but it will avoid having your logs spammed.

Agreed. For me, changing the port SSH listens on alone eliminated 99% of 
brute force attempts.

I also agree on public key authentication. Depending on the OP's needs 
and context), he might also be interested in portknocking (no flames 
please :-)).
-- 
gentoo-user@lists.gentoo.org mailing list



^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [gentoo-user]  Re: SSH brute force attacks and blacklist.py
  2008-02-28  9:55   ` Etaoin Shrdlu
@ 2008-02-28 11:13     ` Steve
  2008-02-28 16:19       ` Willie Wong
  0 siblings, 1 reply; 12+ messages in thread
From: Steve @ 2008-02-28 11:13 UTC (permalink / raw
  To: gentoo-user

Thanks for all your suggestions...

I will look into fail2ban... that might be what I need...  While I could 
crank BLOCKING_PERIOD for blacklist.py to an absurdly high value, this 
(AFAIK) will not persist blocks when the server is powered down or rebooted.

I need to retain port 22 and can't easily do port-knocking - since some 
of the clients I require to connect to my server are in restrictive 
environments.  I've another idea too... I'm happy to entirely cut off 
all services from any IP that attempts to brute-force SSH passwords... 
as it is an unequivocal act of aggression that would not arise with any 
legitimate clients... Another aside is that in some restrictive 
environments it is hard to securely obtain my private key without first 
obtaining a secure off-site connection.  For this reason, I prefer to 
have the facility to log in using username/password - my compromise is 
to make my password extremely complex... plus using a non-obvious 
user-id, which again hampers attackers.

While interesting, I don't think the connection rate limiter is for 
me... I may want to legitimately make rapid connections at some time or 
other. :-)
-- 
gentoo-user@lists.gentoo.org mailing list



^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [gentoo-user]  Re: SSH brute force attacks and blacklist.py
  2008-02-28 11:13     ` Steve
@ 2008-02-28 16:19       ` Willie Wong
  0 siblings, 0 replies; 12+ messages in thread
From: Willie Wong @ 2008-02-28 16:19 UTC (permalink / raw
  To: gentoo-user

On Thu, Feb 28, 2008 at 11:13:10AM +0000, Penguin Lover Steve squawked:
> Thanks for all your suggestions...
> 
> I will look into fail2ban... that might be what I need...  While I could 
> crank BLOCKING_PERIOD for blacklist.py to an absurdly high value, this 
> (AFAIK) will not persist blocks when the server is powered down or rebooted.

Hum, that is interesting. I haven't played with blacklist.py, but if
it runs on top of iptables, the iptables init script *should* save the
current config when powering down. I sort of depended on that when I
cobbled together a perl script 2 years ago to parse the sshd log and 
ban sites using iptables.

Also, I would not suggest banning forever. I started with the same
mentality as you and coded as such. I switched quickly to banning for
1 hour when once, due to not noticing the caps-lock light, I banned my
work computer completely... After switching to the 1 hour ban, I did a
small experiment and saved about 2 months worth of logs. Not a single
ip address has been banned more than once (but there were several /24
in Korea, Taiwan, and Mexico that have many ip addresses banned).
Based on this, I don't think it is strictly necessary to ban forever.

Just my 2 cents.

W
-- 
Santa's helpers are subordinate clauses.
Sortir en Pantoufles: up 447 days, 14:37
-- 
gentoo-user@lists.gentoo.org mailing list



^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [gentoo-user]  Re: SSH brute force attacks and blacklist.py
  2008-02-27 21:39   ` [gentoo-user] " Anno v. Heimburg
@ 2008-02-28 16:31     ` Willie Wong
  0 siblings, 0 replies; 12+ messages in thread
From: Willie Wong @ 2008-02-28 16:31 UTC (permalink / raw
  To: gentoo-user

On Wed, Feb 27, 2008 at 10:39:15PM +0100, Penguin Lover Anno v. Heimburg squawked:
> It limits the number of new connections on each port in
> INPUT_LIMITER_TCPPORTS from any individual host to INPUT_LIMITER_COUNT
> within INPUT_LIMITER_TIME.

My experience suggests that finding the right INPUT_LIMITER_TIME would
be difficult. From my experience (by reading the logs after I cobbled
together a patch work solution to blacklist hosts), the typical
behaviour of a sshd bruteforce attack, after you start dropping
packets from it, is that it will begin to add a geometrically
increasing sleep time between attempts and continue for about 30
minutes to an hour. So if your time parameter is on the order of
several seconds, the attack will be like

  try, try, try, doh! connection timed out, wait a bit, try again,
  doh! still timed out, wait a bit longer, hey it works now, try, try
  , doh! time out again

rinse and repeat. 

But if you set the time parameter to minutes or tens of minutes, then
you risk banning yourself if you need multiple instances of ssh. (Yes,
screen is nice, but sometimes I like to keep two terminals open. And
there's always the case of "saving work, quitting, logging out; doh!
forgot to do something, log back in again" scenario.)

W
-- 
When a clock is hungry it goes back four seconds.
Sortir en Pantoufles: up 447 days, 14:54
-- 
gentoo-user@lists.gentoo.org mailing list



^ permalink raw reply	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2008-02-28 16:32 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-02-27 17:51 [gentoo-user] SSH brute force attacks and blacklist.py Steve
2008-02-27 18:09 ` [gentoo-user] " 7v5w7go9ub0o
2008-02-27 18:14   ` 7v5w7go9ub0o
2008-02-27 18:12 ` [gentoo-user] " Alan McKinnon
2008-02-27 19:07 ` Justin
2008-02-27 21:39   ` [gentoo-user] " Anno v. Heimburg
2008-02-28 16:31     ` Willie Wong
2008-02-27 20:24 ` Remy Blank
2008-02-27 23:01   ` Iain Buchanan
2008-02-28  9:55   ` Etaoin Shrdlu
2008-02-28 11:13     ` Steve
2008-02-28 16:19       ` Willie Wong

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox