Linux|系统管理|WEB开发

关注Linux,系统管理,WEB开发以及开源世界

为什么修改了login.defs也不管用?

| Comments

在网上可以看到很多人转发帖子说可以采用下的方法来提高密码长度:
修改/etc/login.defs文件中PASS_MIN_LEN参数,设置为你所需要的长度,默认是5

有的还加上一些修改/etc/pam.d/passwd的方法,加上cracklib.so库。

但是实际上,这个方法并不奏效,原来是什么样子,现在还是什么样子,为什么呢?

这是因为采用pam机制后,/etc/login.defs中的配置不起作用,而pam中 pam_cracklib.so 的参数minlen=9也是个假参数,因为他内部调用的函数pam_sm_chauthtok 调用的FascistCheck(位于 cracklib.so独立于pam之外)对密码长度分析时并不理踩minlen这个值,而是内部写死的,\ 所以,要使得原来的/etc/login.defs配置有效,必须等patch。
可以看这个代码片段(cracklib/cracklib,2.7/cracklib/fascist.c):其中的MINLEN):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#define MINLEN 6

char *
FascistLook(pwp, instring)
PWDICT *pwp;
char *instring;
{
int ii;
char *ptr;
char *jptr;
char junk[STRINGSIZE];
char *password;
char rpassword[STRINGSIZE];
int32 notfound;

notfound = PW_WORDS(pwp);
/* already truncated if from FascistCheck() */
/* but pretend it wasn't … */
strncpy(rpassword, instring, TRUNCSTRINGSIZE);
rpassword[TRUNCSTRINGSIZE - 1] = '';
password = rpassword;

if (strlen(password) < 4)
{
return ("it's WAY too short");
}
if (strlen(password) < MINLEN)
{
return ("it is too short");
}

jptr = junk;
*jptr = '';

for (ii = 0; ii < STRINGSIZE && password[ii]; ii++)
{
if (!strchr(junk, password[ii]))
{
*(jptr++) = password[ii];
*jptr = '';
}
}

if (strlen(junk) < MIND

Comments