pam_cracklib module

摘要:
SimilarIsthenewpasswordtoomuchliketheoldone?Thisisprimarilycontrolledbyoneargument,difokwhichisanumberofcharactersthatifdifferentbetweentheoldandnewareenoughtoacceptthenewpassword,thisdefaultsto10or1/2thesizeofthenewpasswordwhicheverissmaller.Toavoidthelockupassociatedwithtryingtochangealongandcomplicatedpassword,difignoreisavailable.Thisargumentcanbeusedtospecifytheminimumlengthanewpasswordneedstobebeforethedifokvalueisignored.Thedefaultvaluefordifignoreis23.SimpleIsthenewpasswordtoosmall?Thisiscontrolledby5argumentsminlen,dcredit,ucredit,lcredit,andocredit.Seethesectionontheargumentsforthedetailsofhowtheseworkandtheredefaults.RotatedIsthenewpasswordarotatedversionoftheoldpassword?

pam_cracklib.so[...]

This module can be plugged into thepasswordstack of a given application to provide some plug-in strength-checking for passwords.

The action of this module is to prompt the user for a password and check its strength against a system dictionary and a set of rules for identifying poor choices.

The first action is to prompt for a single password, check its strength and then, if it is considered strong, prompt for the password a second time (to verify that it was typed correctly on the first occasion). All being well, the password is passed on to subsequent modules to be installed as the new authentication token.

The strength checks works in the following manner: at first theCracklibroutine is called to check if the password is part of a dictionary; if this is not the case an additional set of strength checks is done. These checks are:

Palindrome
Is the new password a palindrome of the old one?
Case Change Only
Is the new password the the old one with only a change of case?
Similar
Is the new password too much like the old one? This is primarily controlled by one argument,difokwhich is a number of characters that if different between the old and new are enough to accept the new password, this defaults to 10 or 1/2 the size of the new password whichever is smaller.

To avoid the lockup associated with trying to change a long and complicated password,difignoreis available. This argument can be used to specify the minimum length a new password needs to be before thedifokvalue is ignored. The default value fordifignoreis 23.

Simple
Is the new password too small? This is controlled by 5 argumentsminlen,dcredit,ucredit,lcredit, andocredit. See the section on the arguments for the details of how these work and there defaults.
Rotated
Is the new password a rotated version of the old password?
Already used
Was the password used in the past? Previously used passwords are to be found in/etc/security/opasswd.
This module with no arguments will work well for standard unix password encryption. With md5 encryption, passwords can be longer than 8 characters and the default settings for this module can make it hard for the user to choose a satisfactory new password. Notably, the requirement that the new password contain no more than 1/2 of the characters in the old password becomes a non-trivial constraint. For example, an old password of the form "the quick brown fox jumped over the lazy dogs" would be difficult to change... In addition, the default action is to allow passwords as small as 5 characters in length. For a md5 systems it can be a good idea to increase the required minimum size of a password. One can then allow more credit for different kinds of characters but accept that the new password may share most of these characters with the old password.

Options

debug

This option makes the module write information tosyslog(3) indicating the behavior of the module (this option does not write password information to the log file).
type=XXX
The default action is for the module to use the following prompts when requesting passwords: "New UNIX password: " and "Retype UNIX password: ". The default wordUNIXcan be replaced with this option.
retry=N
Prompt user at mostNtimes before returning with error. The default is1
difok=N
This argument will change the default of5for the number of characters in the new password that must not be present in the old password. In addition, if 1/2 of the characters in the new password are different then the new password will be accepted anyway.
difignore=N
How many characters should the password have before difok will be ignored. The default is23.
minlen=N
The minimum acceptable size for the new password (plus one if credits are not disabled which is the default). In addition to the number of characters in the new password, credit (of +1 in length) is given for each different kind of character (other,upper,loweranddigit). The default for this parameter is9which is good for a old style UNIX password all of the same type of character but may be too low to exploit the added security of a md5 system. Note that there is a pair of length limits inCracklibitself, a "way too short" limit of 4 which is hard coded in and a defined limit (6) that will be checked without reference tominlen. If you want to allow passwords as short as 5 characters you should not use this module.
dcredit=N
(N >= 0) This is the maximum credit for having digits in the new password. If you have less than orNdigits, each digit will count +1 towards meeting the currentminlenvalue. The default fordcreditis 1 which is the recommended value forminlenless than 10.

(N < 0) This is the minimum number of digits that must be met for a new password.

ucredit=N
(N >= 0) This is the maximum credit for having upper case letters in the new password. If you have less than orNupper case letters each letter will count +1 towards meeting the currentminlenvalue. The default forucreditis1which is the recommended value forminlenless than 10.

(N > 0) This is the minimum number of upper case letters that must be met for a new password.

lcredit=N
(N >= 0) This is the maximum credit for having lower case letters in the new password. If you have less than orNlower case letters, each letter will count +1 towards meeting the currentminlenvalue. The default forlcreditis 1 which is the recommended value forminlenless than 10.

(N < 0) This is the minimum number of lower case letters that must be met for a new password.

ocredit=N
(N >= 0) This is the maximum credit for having other characters in the new password. If you have less than orNother characters, each character will count +1 towards meeting the currentminlenvalue. The default forocreditis 1 which is the recommended value forminlenless than 10.

(N < 0) This is the minimum number of other characters that must be met for a new password.

use_authtok
This argument is used toforcethe module to not prompt the user for a new password but use the one provided by the previously stackedpasswordmodule.
dictpath=/path/to/dict
Path to the cracklib dictionaries.

Module Services Provided

Only hepasswordservice is supported.

Return Values

PAM_SUCCESS

The new password passes all checks.
PAM_AUTHTOK_ERR
No new password was entered, the username could not be determined or the new password fails the strength checks.
PAM_AUTHTOK_RECOVERY_ERR
The old password was not supplied by a previous stackked module or got not requested from the user. The first error can happen ifuse_authtokis specified.
PAM_SERVICE_ERR
A internal error occured.

Examples

For an example of the use of this module, we show how it may be stacked with the password component ofpam_unix(8)

#
# These lines stack two password type modules. In this example the
# user is given 3 opportunities to enter a strong password. The
# "use_authtok" argument ensures that the pam_unix module does not
# prompt for a password, but instead uses the one provided by
# pam_cracklib.
#
passwd  password required       pam_cracklib.so retry=3
passwd  password required       pam_unix.so use_authtok
Another example (in the/etc/pam.d/passwdformat) is for the case that you want to use md5 password encryption:
#%PAM-1.0
#
# These lines allow a md5 systems to support passwords of at least 14
# bytes with extra credit of 2 for digits and 2 for others the new
# password must have at least three bytes that are not present in the
# old password
#
password  required pam_cracklib.so \
               difok=3 minlen=15 dcredit= 2 ocredit=2
password  required pam_unix.so use_authtok nullok md5
And here is another example in case you don't want to use credits:
#%PAM-1.0
#
# These lines require the user to select a password with a minimum
# length of 8 and with at least 1 digit number, 1 upper case letter,
# and 1 other character
#
password  required pam_cracklib.so \
               dcredit=-1 ucredit=-1 ocredit=-1 lcredit=0 minlen=8
password  required pam_unix.so use_authtok nullok md5

Old News

Linux Password Security with pam_cracklib

Enabling pam_cracklib

Thepam_cracklibmodule is enabled via the system's standard PAM configuration interface. On Debian systems, this is the/etc/pam.d/common-passwordfile (but it's/etc/pam.d/system-authon RedHat-derived systems--can't we all just get along?). The typical configuration looks something like this:

password required pam_cracklib.so retry=3 minlen=6 difok=3

password required pam_unix.so md5 use_authtok

The first line enables thepam_cracklibmodule and sets several module parameters. "retry=3" means that users get three chances to pick a good password before thepasswdprogram aborts. Users can always re-run thepasswdprogram and start over again, however. "minlen=6" sets the minimum number of characters in the password. Actually, since Linux systems generally use MD5 password hashes, which are not limited to 8 character passwords like the old DES56 hashes, you probably want to think about increasing the "minlen" parameter to something a bit longer. We'll come back to this notion a bit later in the article. "difok=3" sets the minimum number of characters that must be different from the previous password. If you increase "minlen", you may also want to increase this value as well.

The second line invokes the standardpam_unixmodule. The "md5" argument here is what enables standard Linux MD5 password hashes, though you have the option of using old-style DES56 hashes for backwards compatibility with legacy Unix systems. "use_authtok" tellspam_unixto not bother doing any of its own internal password checks, which duplicate many of the checks inpam_cracklib, but instead accept the password that the user inputs after it's been thoroughly checked bypam_cracklib.

Simple Checks

By default,pam_cracklibperforms a number of basic checks on the new password:

  • Is the new password just the old password with the letters reversed ("password" vs. "drowssap") or rotated ("password" vs. "asswordp")?
  • Does the new password only differ from the old one due to change of case ("password" vs. "Password")?
  • Are at least some minimum number of characters in the new password not present in the old password? This is where the "difok" parameter comes into play.

These are the same checks you get in thepam_unixmodule if you turn on the "obscure" flag, but since we're already usingpam_cracklibwe don't need to do this.

Length and Strength

While the "minlen" parameter controls the minimum password length, things are not as simple as they might appear. This is becausepam_cracklibcombines the notion of password length with password "strength" (the use of mixed-case and non-letter characters).

"minlen" is actually the minimum required length for a password consisting of all lower-case letters. But users get "length credits" for using upper- and lower-case letters, numbers, and non-alphanumeric characters. The default is normally that you can only get a maximum of "1 credit" for each type of character. So if the administrator sets "minlen=12", a user could still have an 8 character password if they used all four types of characters. Actually, since using a lower-case letter gets you a credit, the real minimum length for an all lower-case password isminlen-1.

The maximum credit for any particular class of characters is actually customizable. The four parameters "lcredit", "ucredit", "dcredit", and "ocredit" are used to set the maximum credit for lower-case, upper-case, numeric (digit), and non-alphanumeric (other) characters, respectively. For example, you could add the following parameters on thepam_cracklibline in the/etc/pam.d/common-passwordfile:

lcredit=0 ucredit=1 dcredit=1 ocredit=2

In other words, lower-case characters aren't special at all, so you get no credit there. On the other hand we give extra credit if the user puts two or more non-alphanumeric characters in their password. One point is still the max credit for upper-case characters and numbers. Note that no matter what you set "minlen" to and no matter how many "credits" you give to your users,pam_cracklibwill never let users pick passwords with less than six characters--this is a hard-coded internal minimum.

Play around with these values and find something that makes sense for your site, but as a starting point I might recommend "minlen=12 difok=4" for machines using MD5 password hashes. This means that the smallest password a user could have is 8 characters, and that's only if they use all four character sets.

Dictionary Checks

pam_cracklibalso checks the user's password against it's own internal dictionaries of easily guessed passwords. On Debian systems,pam_cracklib's dictionaries live in/var/cache/crackliband are rebuilt nightly by the
/usr/sbin/update-cracklibscript. Other Linux distros may have other mechanisms for updating the dictionaries (as far as I can tell, RedHat doesn't provide any tools for doing this).

Theupdate-cracklibscript searches a number of directories for input files, including/usr/local/dictand/usr/local/share/dict. So adding your own words is as easy as putting them in a file in one of these directories and runningupdate-cracklibor waiting forcronto do it for you. Note that if you want to add other directories toupdate-cracklib's search path, you can do this by modifying the/etc/cracklib/cracklib.conffile (at least on Debian systems).

Password "History"

pam_cracklibis capable of consulting a user's password "history" and not allowing them to re-use old passwords. However, the functionality for actually storing the user's old passwords is enabled via thepam_unixmodule.

The first step is to make sure to create an empty/etc/security/opasswdfile for storing old user passwords. If you forget to do this before enabling the history feature in the PAM configuration file, then all user password updates willfailbecause thepam_unixmodule will constantly be returning errors from the password history code due to the file being missing.

Treat youropasswdfile like your/etc/shadowfile because it will end up containing user password hashes (albeit for old user passwords that are no longer in use):

touch /etc/security/opasswd

chown root:root /etc/security/opasswd

chmod 600 /etc/security/opasswd

Once you've got theopasswdfile set up, enable password history checking by adding the option "remember=<x>" to thepam_unixconfiguration line in the/etc/pam.d/common-passwordfile. Here's how I have things set up on my Knoppix machine:

password required pam_cracklib.so retry=3 minlen=12 difok=4

password required pam_unix.so md5 remember=12 use_authtok

The value of the "remember" parameter is the number of old passwords you want to store for a user. It turns out that there's an internal maximum of 400 previous passwords, so values higher than 400 are all equivalent to 400. Before you complain about this limit, consider that even if your site forces users to change passwords every 30 days, 400 previous passwords representsover30 yearsof password history. This is probably sufficient for even the oldest of legacy systems.

Once you've enabled password history, theopasswdfile starts filling up with user entries that look like this:

hal:1000:<n>:<hash1>,<hash2>,...,<hashn>

The first two fields are the username and user ID. The<n>in the third field represents the number of old passwords currently being stored for the user--this value is incremented by one every time a new hash is added to the user's password history until<n>ultimately equals the value of the "remember" parameter set on thepam_unixconfiguration line.<hash1>,<hash2>,...,<hashn>are actually the MD5 password hashes for the user's old passwords.

Password Expiration

At this point you may be wondering how to get the system to automatically force users to change their password after some period of time. This is not actually the job ofpam_cracklib. Instead, these parameters are set in the/etc/login.defsfile on most Linux systems.PASS_MAX_DAYSis how often users have to change their passwords.PASS_MIN_DAYSis how long a user is forced to live with their new password before their allowed to change it again.PASS_WARN_AGEis the number of days before the password expiration date that the user is warned that their password is about to expire. The choice of values for these parameters is entirely dependent on site policy.

Note that these parameters are only applied to new accounts created with the default systemuseraddprogram. If you use some other mechanism for creating accounts on the system, then you'll have to use thechagecommand (this is not a typo) to manually set these parameters on your user accounts. And if you use a naming service such as LDAP or NIS for account management, then you're completely on your own.

By the way, if you've ever wondered what all those extra fields in the/etc/shadowfile were for, the answer is that they store the password expiration/aging information for the user.

Linux check passwords against a dictionary attack

Dictionary attack is used for detecting password.

Wikipedia defines:
A dictionary attack is a technique for defeating a cipher or authentication mechanism by trying to determine its decryption key or passphrase by searching a large number of possibilities.

A dictionary attack also exploits the tendency of people to choose weak passwords, and is related to the previous attack. Password cracking programs usually come equipped with "dictionaries", or word lists, with thousands or even millions of entries of several kinds, including:
=> Words in various languages
=> names of people
=> Places
=> Commonly used passwords etc

However you can use the existence of these dictionary attack tools demonstrates the relative strengths of different password choices against such attacks.

Check user passwords against a dictionary attack

You can be configured to verify that passwords (read as weak password) cannot be guessed easily using Linux PAM module called pam_cracklib.so. It will check the passwd against dictionary words. User is not allowed to set new password until and unless conditions satisfied (i.e. weak password is not allowed).

Open password configuration file according to your Linux distribution. And make modification as follows.

Redhat/Fedora/CentOS Linux

cracklib PAM module is installed by default so no need to install anything. Just open config file:
# vi /etc/pam.d/system-auth
Append/modify as follows:
password required /lib/security/pam_cracklib.so retry=2 minlen=10 difok=6

Debian or Ubentu Linux

First install libpam-cracklib PAM module to enable cracklib support.
# apt-get install libpam-cracklib
or
$ sudo install libpam-cracklib
Now open config file:
# vi /etc/pam.d/system-auth
Append/modify as follows:
password required pam_cracklib.so retry=2 minlen=10 difok=6

Save and close the file

Where,

  • retry=2: Prompt user at most 2 times before returning with error
  • minlen=10: minimum length allowed for an account password is set to 10 characters. This is the minimum simplicity count for a good password. And you are allowed only 2 times using retry option.
  • difok=6: How many characters can be the same in the new password relative to the old. User will see error - BAD PASSWORD: is too similar to the old one
  • You can also apply following options to compute the 'unsimplicity' of the password.
    • dcredit=N : Digits characters
    • ucredit=N : Upper characters
    • lcredit=N : Lower characters
    • ocredit=N : Other characters

Please note that restrictions are only applied to normal users (not to root user).

免责声明:文章转载自《pam_cracklib module》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇HP-UX查看版本TCP输入 之 tcp_queue_rcv下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

docsify制作在线说明文档的轻量级神器

我找到了一个使用html处理和加载md文件的网站。创建一个漂亮的在线描述文档(工件docsify)非常简单,nav可以删除--˃ENChinese加载window$docsify={el:'#main',//配置节点loadSidebar:true,//设置是否加载sidebarsubMaxLevel:2,//设置最大目录级别coverpage:true;/...

Json 的日期格式转化(时区标准化)

在JavaScript中,这无疑可以通过初始化Data()对象//converttomsecsinceJan11970localTime=d轻松完成。获取时间();步骤2:接下来,通过Data()对象的getTimezoneOffset()方法//obtainlocalUTCoffsetandconverttomseclocalOffset=d找出本地时间偏...

如何控制el-image预览图片的大小

Src=“scope.row.carlouseUrl”:1。从“element-ui/packages/image/src/image-viewer”2导入图像查看器importerImageViewer。寄存器组件:3。使用组件&lt;El table columnlabel=“旋转图表”width=“220px”&gt;...

uniapp安卓真机调试提示检测不到手机【解决办法】

以下是具体的解决方案:步骤1:打开、查找、单击并单击7次或更多次,以允许开发人员进行选择。...

文件(夹)对比利器WinMerge

IDE中自带的svn功能较弱,还好有winMerge弥补了它的缺陷,它可以对比文件、文件夹,使用起来还是较为方便,界面也是中文。“开始”菜单,弹出对话框中选择需要进行对比的文件夹或文件然后选择一个过滤器,它自带就可以过滤掉svn目录,如需要过滤其它一些指定的目录,则需要自己修改过滤器的规则了,也很简单。...