I think the simples solution coule be:
- add fixed 0.5 second delay to any login
- add two optional fields to db.auth_user that locks an account for 15
minutes after 3 failed logins.
Field('last_login')
Field('failed_logins')

Massimo

On Aug 4, 9:56 am, Jonathan Lundell <jlund...@pobox.com> wrote:
> On Aug 4, 2009, at 6:01 AM, mdipierro wrote:
>
>
>
> > One issue is how to implement this.... if we use the
> > request.env.remote_addr then it does not work behind a proxy, if we
> > use request.env.http_x_if_forwarded_for, it works only on apache and
> > it can spoofed anyway.
>
> I don't think we should be looking at the remote IP anyway.
>
> The problem is that these days a brute force attack can (fairly)  
> easily be distributed across a lot of zombie machines.
>
> If we just have a timer, and don't actually disable the account, then  
> the burden on the real user won't be that high, and then only if she  
> tries to log in while the attack is going on.
>
> A minor advantage to using only the account name is that all we need  
> to implement it is another field or two in the user table.
>
>
>
> > Ideas?
>
> > Massimo
>
> > On Aug 4, 7:50 am, Pynthon <forumx...@gmail.com> wrote:
> >> Ah, nevermind then...
>
> >> On 4 aug, 14:47, mdipierro <mdipie...@cs.depaul.edu> wrote:
>
> >>> This can be added easily and it does not affect backward
> >>> compatibility.
>
> >>> Massimo
>
> >>> On Aug 4, 7:37 am, Rob Scheibel <robschei...@gmail.com> wrote:
>
> >>>> Very good points in this discussion. I would like to see the  
> >>>> addition
> >>>> of a processing delay added for numerous failed login attempts.  
> >>>> This
> >>>> is what the larger sites are doing now - it slows down the  
> >>>> dictionary
> >>>> attacks by adding 1/2 a second to each successive bad login attempt
> >>>> until you hit some max (i.e. 20 seconds) and then it resets (note  
> >>>> that
> >>>> it should be based on Host IP but also user account in case attacks
> >>>> are coming from multiple IPs). Using this method it will take a  
> >>>> LONG
> >>>> time to crack a relatively strong pass and most people give up  
> >>>> and go
> >>>> elsewhere. It's also nice because it isn't too much of a nuicance  
> >>>> to a
> >>>> user (they might be annoyed by a 20 second login delay, but they  
> >>>> can
> >>>> still get in vs being locked out).
>
> >>>> It's also pretty easy to implement. You add a table to track the  
> >>>> "bad
> >>>> IPs" and count/clear them based on timestamps. Then you add a  
> >>>> field to
> >>>> the users table to track successive failed login attempts on that
> >>>> account and clear it on each login.
>
> >>>> You could also always do like LiNode is doing and lock an account  
> >>>> by
> >>>> resetting the pass to a random value after x bad logins and  
> >>>> emailing
> >>>> the new pass to the user.
>
> >>>> just flat-out locking out users for a period of time can be used  
> >>>> to a
> >>>> person's advantage. Say you knew "bob" had an account on a  
> >>>> system, but
> >>>> you didn't want him to be able to access it. Then you'd just try a
> >>>> bunch of bad passwords using his login and he'd be locked out...
>
> >>>> Just my $0.02.
>
> >>>> Thanks for the all the great work on web2py - it's been a treat to
> >>>> work with!
>
> >>>> -rob
>
> >>>> On Aug 2, 6:57 pm, Jonathan Lundell <jlund...@pobox.com> wrote:
>
> >>>>> On Aug 2, 2009, at 3:10 PM, Jonathan Lundell wrote:
>
> >>>>>> On Aug 1, 2009, at 9:48 AM, mdipierro wrote:
>
> >>>>>>> Mind that none of this has anything to do with the ability of an
> >>>>>>> attacker to guess the passwords to access a web2py site. This is
> >>>>>>> about
> >>>>>>> protecting the users form the administrators who may decrypt  
> >>>>>>> their
> >>>>>>> hashed passords and access the users's account using their  
> >>>>>>> decrypted
> >>>>>>> passwords (of an attacker who is already in the system and can  
> >>>>>>> act as
> >>>>>>> the web2py administrator).  But mind that the administrator  
> >>>>>>> does not
> >>>>>>> even need to decrypt passwords to access them. He just log
> >>>>>>> request.vars.password from the model file to get the login  
> >>>>>>> passwords
> >>>>>>> before they are encrypted. This is true in web2py and in any  
> >>>>>>> other
> >>>>>>> web
> >>>>>>> based system.
>
> >>>>>>> I am much more concerned about a different issue: when an  
> >>>>>>> attacker
> >>>>>>> wants to enter a site and repeatedly guesses the password.
> >>>>>>> Perhaps there should be an option in auth that locks accounts  
> >>>>>>> after
> >>>>>>> many failed logins. We could have another system table to handle
> >>>>>>> that.
>
> >>>>>> How about a default STRONG as well as HMAC? If a developer  
> >>>>>> wants to
> >>>>>> allow weaker passwords, let the burden be in that direction.
>
> >>>>>> An account-locking policy is a good idea. If the table has a
> >>>>>> timestamp, the lock can be temporary, at least initially. Lock  
> >>>>>> the
> >>>>>> account for a n seconds after n failures. Or something like that.
>
> >>>>> One reason for a delay that simply imposes rate-limiting is that
> >>>>> permanent (or semi-permanent) locking makes for an easy DOS  
> >>>>> attack.
>
> >>>>> As for a system table, wouldn't auth_user be the logical place  
> >>>>> to put
> >>>>> the necessary fields?
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"web2py-users" group.
To post to this group, send email to web2py@googlegroups.com
To unsubscribe from this group, send email to 
web2py+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/web2py?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to