Opened 17 years ago
Last modified 4 years ago
#3113 accepted enhancement
[patch] Add password policy
| Reported by: | rupert thurner | Owned by: | Ryan J Ollos |
|---|---|---|---|
| Priority: | normal | Component: | AccountManagerPlugin |
| Severity: | normal | Keywords: | password check quality |
| Cc: | Yasir Assam, sukender@… | Trac Release: | 0.12 |
Description
some companies have password policies in place, like:
- reset every X days/months
- have minimum 1 uppercase character
- have minimum 1 non-ascii character
- be minimum / exact X charachters long
setting/resetting a password should allow such policies.
Attachments (1)
Change History (17)
comment:1 Changed 17 years ago by
| Owner: | changed from Matt Good to John Hampton |
|---|---|
| Trac Release: | 0.10 → 0.11 |
comment:2 Changed 15 years ago by
| Keywords: | password check quality added |
|---|---|
| Summary: | password policy → Add password policy |
Replying to ThurnerRupert:
some companies have password policies in place, like:
- reset every X days/months
- have minimum 1 uppercase character
- have minimum 1 non-ascii character
- be minimum / exact X charachters long
setting/resetting a password should allow such policies.
I second John (pacopablo) in assuming that this would commonly achieved by central password management anyway. But still this might not be always true. Still patches welcome.
However now, in 2010, I wouldn't care about a feature restricting password length to exactly x chars, while the minimum char policy is perfectly valid IMHO.
comment:3 follow-up: 5 Changed 15 years ago by
Just to continue the password rules list:
- disallow username-identical passwords (example - admin:admin)
comment:4 Changed 15 years ago by
| Trac Release: | 0.11 → 0.12 |
|---|
comment:5 Changed 15 years ago by
Replying to dnedelchev:
Just to continue the password rules list:
- disallow username-identical passwords (example - admin:admin)
Nice ideas.
By chance, is someone able to back up these ideas with some real code? I'm interested to implement, but would like to have something to start with. Otherwise it'll take a lot more time, since resolving remaining defect tickets will certainly absorb my energy for some more months.
comment:6 Changed 15 years ago by
| Owner: | changed from John Hampton to Steffen Hoffmann |
|---|
comment:7 Changed 15 years ago by
Hasienda, see the code below for a starting point on implementing password complexity requirements*. This somewhat follows the Windows Active Directory "strong password complexity" check where 3 of 4 requirements need to be met. Please accept my apologies for not submitting a patch as I have not familiarized myself enough with the AccountManagerPlugin codebase (I've just come across this plugin, and would find having password complexity enforcement useful).
As far as tracking password history goes, this would require storing the password hash + nonce for N changes. The defined constants could be configuration options, and default to 0 if not specified.
This validation would have to be performed any time the password is changed, whether by the system, user or administrator. Perhaps down the line you can add administrator override of password complexity (though this is usually not desirable from an audit perspective).
- Note the following code does not support non-ASCII Unicode characters (while cute, non-ASCII passwords are impractical).
import string
MINIMUM_LOWER_ALPHA = 0
MINIMUM_UPPER_ALPHA = 1
MINIMUM_DIGITS = 3
MINIMUM_SPECIAL = 1
MINIMUM_LENGTH = 8
MINIMUM_CRITERIA_REQUIRED = 3
MINIMUM_SCORE = 13 # computed by summing length/upper/lower/digits/specials required
def validate_password(username, password, confirm_password):
if password != confirm_password:
return False
# Some sanity checks to keep users from using a combination of their
# username in their password
if username in password or password in username or password == username:
return False
upper = 0
lower = 0
digits = 0
special = 0
total = 0
score = 0
if len(password) < MINIMUM_LENGTH:
return False
score += 8
# Do not allow any non-printable ASCII characters (except 0x20)
if not all(map(lambda x: 31 < ord(x) < 127, password)):
return False
# pseudocode ahead:
#
# previous_passwords = get_previous_passwords_as_list_tuples()
# for oldhash, nonce in previous_passwords:
# if hashpass(password, nonce) == oldhash:
# return False
#
# return True # we passed historical requirement
for ch in password:
if MINIMUM_UPPER_ALPHA > 0 and ch in string.uppercase:
if upper >= MINIMUM_UPPER_ALPHA:
continue
upper += 1
if MINIMUM_LOWER_ALPHA > 0 and ch in string.lowercase:
if lower >= MINIMUM_LOWER_ALPHA:
continue
lower += 1
if MINIMUM_DIGITS > 0 and ch in string.digits:
if digits >= MINIMUM_DIGITS:
continue
digits += 1
if MINIMUM_SPECIAL > 0 and ch in string.punctuation + ' ':
if special >= MINIMUM_SPECIAL:
continue
special += 1
score += upper
score += lower
score += digits
score += special
if MINIMUM_SCORE > 0:
if score < MINIMUM_SCORE:
return False
if upper >= MINIMUM_UPPER_ALPHA:
total += 1
if lower >= MINIMUM_LOWER_ALPHA:
total += 1
if digits >= MINIMUM_DIGITS:
total += 1
if special >= MINIMUM_SPECIAL:
total += 1
if total >= MINIMUM_CRITERIA_REQUIRED:
return True
return False
comment:8 Changed 15 years ago by
| Status: | new → assigned |
|---|---|
| Summary: | Add password policy → [patch] Add password policy |
Thanks for taking your time to put down some code, pseudo-code and notes. Just some responses to randomly picked parts, I'll have to thinking through for some more time:
- limitation to ASCII chars: might be too harsh in some well administered, fully localized environments, but eliminating non-printable chars is certainly a good thing
- password quality scoring and x-out-of-y metrics: never thought about this in that detail before, but looks reasonable; other account admin experts to speak up here supporting this concept or proposing a different one?
- password history: biggest concerns so far, i.e. AFAIK this would require storing n previous password even in non-native form, as there's no way to see inside salted passwords and decide, if they're different enough, right? - definitely an optional component of the policy framework
I'm currently wondering, if we should move even various existing checks into such a dedicated checks/policy/validation module, especially the growing number of username validation tests inside the registration code.
comment:9 Changed 15 years ago by
| Cc: | Yasir Assam added; anonymous removed |
|---|
comment:10 Changed 15 years ago by
| Cc: | sukender@… added |
|---|
Hi there,
Maybe some resources you already know about, but :
- Python bindings for Cracklib:
- pypi.python.org/pypi/python-crack/0.5
- www.nongnu.org/python-crack
- You could find interesting code (MIT-licensed) at http://download.savannah.gnu.org/releases/python-crack/python-crack-0.5.1.tar.gz
- Some similar-looking code at:
comment:11 Changed 14 years ago by
| Cc: | Ryan J Ollos added |
|---|
comment:12 Changed 9 years ago by
| Owner: | Steffen Hoffmann deleted |
|---|---|
| Status: | assigned → new |
comment:13 Changed 9 years ago by
#13001 closed as a duplicate, requesting the ability to force a password change every X days.
comment:14 Changed 6 years ago by
| Cc: | Ryan J Ollos removed |
|---|
Changed 5 years ago by
| Attachment: | accountmanagerplugin_trunk_acct_mgr-0.6.0dev_ppolicy.patch added |
|---|
Patch for using cracklib
comment:15 Changed 5 years ago by
Hi,
I have added a patch for using cracklib to improve passwords. The dependencies are only cracklib, cracklib-dicts & cracklib-python
comment:16 Changed 5 years ago by
| Owner: | set to Ryan J Ollos |
|---|---|
| Status: | new → accepted |
Thanks, looks interesting. I'll give it a review.



Patches welcome here. I'm not sure where to begin on implementing that. Seems to me that companies that have such requirements will be plugging trac into their existing password stores, such as AD.