linux中shadowpasswd
关于shadow⽂件
/etc/shadow ⽂件,⽤于存储 Linux 系统中⽤户的密码信息,⼜称为“影⼦⽂件”。
前⾯介绍了 /etc/passwd ⽂件,由于该⽂件允许所有⽤户读取,易导致⽤户密码泄露,因此 Linux 系统将⽤户的密码信息从
科技公司网页设计素材/etc/passwd ⽂件中分离出来,并单独放到了此⽂件中。
/etc/shadow ⽂件只有 root ⽤户拥有读权限,其他⽤户没有任何权限,这样就保证了⽤户密码的安全性。
strlen函数空格算吗注意,如果这个⽂件的权限发⽣了改变,则需要注意是否是恶意攻击。
介绍此⽂件之前,我们先打开看看,执⾏如下命令:
[root@localhost ~]#vim /etc/shadow
root: $6$9w5Td6lg
$bgpsy3olsq9WwWvS5Sst2W3ZiJpuCGDY.4w4MRk3ob/i85fl38RH15wzVoom ff9isV1 PzdcXmixzhnMVhMxbvO:15775:0:99999:7:::
bin:*:15513:0:99999:7:::
daemon:*:15513:0:99999:7:::
…省略部分输出…
同 /etc/passwd ⽂件⼀样,⽂件中每⾏代表⼀个⽤户,同样使⽤ “:” 作为分隔符,不同之处在于,每⾏⽤户信息被划分为 9 个字段。每个字段的含义如下:
⽤户名:加密密码:最后⼀次修改时间:最⼩修改时间间隔:密码有效期:密码需要变更前的警告天数:密码过期后的宽限时间:账号失效时间:保留字段
接下来,给⼤家分别介绍这 9 个字段。
⽤户名
同 /etc/passwd ⽂件的⽤户名有相同的含义。
加密密码
这⾥保存的是真正加密的密码。⽬前 Linux 的密码采⽤的是 SHA512 散列加密算法,原来采⽤的是 MD5 或 DES 加密算法。SHA512 散列加密算法的加密等级更⾼,也更加安全。
注意,这串密码产⽣的乱码不能⼿⼯修改,如果⼿⼯修改,系统将⽆法识别密码,导致密码失效。很多软件透过这个功能,在密码串前加上“!”、"*" 或 “x” 使密码暂时失效。
所有伪⽤户的密码都是 “!!” 或 “*”,代表没有密码是不能登录的。当然,新创建的⽤户如果不设定密码,那么它的密码项也是 “!!”,代表这个⽤户没有密码,不能登录。
最后⼀次修改时间
此字段表⽰最后⼀次修改密码的时间,可是,为什么 root ⽤户显⽰的是 15775 呢?
这是因为,Linux 计算⽇期的时间是以 1970 年 1 ⽉ 1 ⽇作为 1 不断累加得到的时间,到 1971 年 1 ⽉ 1 ⽇,则为 366 天。这⾥显⽰ 15775天,也就是说,此 root 账号在 1970 年 1 ⽉ 1 ⽇之后的第 15775 天修改的 root ⽤户密码。
那么,到底 15775 代表的是哪⼀天呢?可以使⽤如下命令进⾏换算:
[root@localhost ~]# date -d “1970-01-01 15775 days”
2013年03⽉11⽇星期⼀ 00:00:00 CST
可以看到,通过以上命令,即可将其换算为我们习惯的系统⽇期。
最⼩修改时间间隔
最⼩修改间隔时间,也就是说,该字段规定了从第 3 字段(最后⼀次修改密码的⽇期)起,多长时间之内不能修改密码。如果是 0,则密码可以随时修改;如果是 10,则代表密码修改后 10 天之内不能再次修改密码。
此字段是为了针对某些⼈频繁更改账户密码⽽设计的。
成长手册内容密码有效期
经常变更密码是个好习惯,为了强制要求⽤户变更密码,这个字段可以指定距离第 3 字段(最后⼀次更改密码)多长时间内需要再次变更密码,否则该账户密码进⾏过期阶段。
该字段的默认值为 99999,也就是 273 年,可认为是永久⽣效。如果改为 90,则表⽰密码被修改 90 天之后必须再次修改,否则该⽤户即将过期。管理服务器时,通过这个字段强制⽤户定期修改密码。
密码需要变更前的警告天数
与第 5 字段相⽐较,当账户密码有效期快到时,系统会发出警告信息给此账户,提醒⽤户 “再过 n 天你的密码就要过期了,请尽快重新设置你的密码!”。
该字段的默认值是 7,也就是说,距离密码有效期的第 7 天开始,每次登录系统都会向该账户发出 “修改密码” 的警告信息。
密码过期后的宽限天数
也称为“⼝令失效⽇”,简单理解就是,在密码过期后,⽤户如果还是没有修改密码,则在此字段规定的宽限天数内,⽤户还是可以登录系统的;如果过了宽限天数,系统将不再让此账户登陆,也不会提⽰账户过期,是完全禁⽤。
⽐如说,此字段规定的宽限天数是 10,则代表密码过期 10 天后失效;如果是 0,则代表密码过期后⽴即失效;如果是 -1,则代表密码永远不会失效。
账号失效时间
同第 3 个字段⼀样,使⽤⾃ 1970 年 1 ⽉ 1 ⽇以来的总天数作为账户的失效时间。该字段表⽰,账号在此字段规定的时间之外,不论你的密码是否过期,都将⽆法使⽤!
该字段通常被使⽤在具有收费服务的系统中。
保留
这个字段⽬前没有使⽤,等待新功能的加⼊。
忘记密码怎么办
经常有读者会忘记⾃⼰的账户密码,该怎么处理呢?
对于普通账户的密码遗失,可以通过 root 账户解决,它会重新给你配置好指定账户的密码,⽽不需知道你原有的密码(利⽤ root 的⾝份使⽤ passwd 命令即可)。
如果 root 账号的密码遗失,则需要重新启动进⼊单⽤户模式,系统会提供 root 权限的 bash 接⼝,此时可以⽤ passwd 命令修改账户密码;也可以通过挂载根⽬录,修改 /etc/shadow,将账户的 root 密码清空的⽅法,此⽅式可使⽤ root ⽆法密码即可登陆,建议登陆后使⽤passwd 命令配置 root 密码。
关于passwd⽂件
Linux 系统中的 /etc/passwd ⽂件,是系统⽤户配置⽂件,存储了系统中所有⽤户的基本信息,并且所
有⽤户都可以对此⽂件执⾏读操作。⾸先我们来打开这个⽂件,看看到底包含哪些内容,执⾏命令如下:
[root@localhost ~]# vi /etc/passwd
\#查看⼀下⽂件内容
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
...省略部分输出...
可以看到,/etc/passwd ⽂件中的内容⾮常规律,每⾏记录对应⼀个⽤户。
读者可能会问,Linux 系统中默认怎么会有这么多的⽤户?这些⽤户中的绝⼤多数是系统或服务正常运⾏所必需的⽤户,这种⽤户通常称为系统⽤户或伪⽤户。系统⽤户⽆法⽤来登录系统,但也不能删除,
因为⼀旦删除,依赖这些⽤户运⾏的服务或程序就不能正常执⾏,会导致系统问题。
不仅如此,每⾏⽤户信息都以 “:” 作为分隔符,划分为 7 个字段,每个字段所表⽰的含义如下:
⽤户名:密码:UID(⽤户ID):GID(组ID):描述性信息:主⽬录:默认Shell
接下来,给⼤家逐个介绍这些字段。
⽤户名
⽤户名,就是⼀串代表⽤户⾝份的字符串。
前⾯讲过,⽤户名仅是为了⽅便⽤户记忆,Linux 系统是通过 UID 来识别⽤户⾝份,分配⽤户权限的。/etc/passwd ⽂件中就定义了⽤户名和 UID 之间的对应关系。
密码
“x” 表⽰此⽤户设有密码,但不是真正的密码,真正的密码保存在 /etc/shadow ⽂件中(下⼀节做详细介绍)。
在早期的 UNIX 中,这⾥保存的就是真正的加密密码串,但由于所有程序都能读取此⽂件,⾮常容易
造成⽤户数据被窃取。
虽然密码是加密的,但是采⽤暴⼒破解的⽅式也是能够进⾏破解的。
因此,现在 Linux 系统把真正的加密密码串放置在 /etc/shadow ⽂件中,此⽂件只有 root ⽤户可以浏览和操作,这样就最⼤限度地保证了密码的安全。
需要注意的是,虽然 “x” 并不表⽰真正的密码,但也不能删除,如果删除了 “x”,那么系统会认为这个⽤户没有密码,从⽽导致只输⼊⽤户名⽽不⽤输⼊密码就可以登陆(只能在使⽤⽆密码登录,远程是不可以的),除⾮特殊情况(如破解⽤户密码),这当然是不可⾏的。
UID朱姓
UID,也就是⽤户 ID。每个⽤户都有唯⼀的⼀个 UID,Linux 系统通过 UID 来识别不同的⽤户。
实际上,UID 就是⼀个 0~65535 之间的数,不同范围的数字表⽰不同的⽤户⾝份,具体如表 1 所⽰。
UID 范围⽤户⾝份
0超级⽤户。UID 为 0 就代表这个账号是管理员账号。在 Linux 中,如何把普通⽤户升级成管理员呢?
只需把其他⽤户的 UID 修改为 0 就可以了,这⼀点和 Windows 是不同的。不过不建议建⽴多个管理员账号。
1~499系统⽤户(伪⽤户)。也就是说,此范围的 UID 保留给系统使⽤。其中,1~99 ⽤于系统⾃⾏创建的账号;100~499 分配给有系统账号需求的⽤户。其实,除了 0 之外,其他的 UID 并⽆不同,这⾥只是默认 500 以下的数字给系统作为保留账户,只是⼀个公认的习惯⽽已。
500~65535普通⽤户。通常这些 UID 已经⾜够⽤户使⽤了。但不够⽤也没关系,2.6.x 内核之后的 Linux 系统已经可以⽀持 232 个 UID 了。
GID
全称“Group ID”,简称“组ID”,表⽰⽤户初始组的组 ID 号。这⾥需要解释⼀下初始组和附加组的概念。
初始组,指⽤户登陆时就拥有这个⽤户组的相关权限。每个⽤户的初始组只能有⼀个,通常就是将和此⽤户的⽤户名相同的组名作为该⽤户的初始组。⽐如说,我们⼿⼯添加⽤户 lamp,在建⽴⽤户 lamp 的同时,就会建⽴ lamp 组作为 lamp ⽤户的初始组。
附加组,指⽤户可以加⼊多个其他的⽤户组,并拥有这些组的权限。每个⽤户只能有⼀个初始组,除
视的组词初始组外,⽤户再加⼊其他的⽤户组,这些⽤户组就是这个⽤户的附加组。附加组可以有多个,⽽且⽤户可以有这些附加组的权限。
举例来说,刚刚的 lamp ⽤户除属于初始组 lamp 外,我⼜把它加⼊了 users 组,那么 lamp ⽤户同时属于 lamp 组和 users 组,其中 lamp 是初始组,users 是附加组。
当然,初始组和附加组的⾝份是可以修改的,但是我们在⼯作中不修改初始组,只修改附加组,因为修改了初始组有时会让管理员逻辑混乱。
需要注意的是,在 /etc/passwd ⽂件的第四个字段中看到的 ID 是这个⽤户的初始组。
描述性信息
这个字段并没有什么重要的⽤途,只是⽤来解释这个⽤户的意义⽽已。
主⽬录
也就是⽤户登录后有操作权限的访问⽬录,通常称为⽤户的主⽬录。
例如,root 超级管理员账户的主⽬录为 /root,普通⽤户的主⽬录为 /home/yourIDname,即在 /home/ ⽬录下建⽴和⽤户名相同的⽬录作为主⽬录,如 lamp ⽤户的主⽬录就是 /home/lamp/ ⽬录。
默认的Shell
Shell 就是 Linux 的命令解释器,是⽤户和 Linux 内核之间沟通的桥梁。
我们知道,⽤户登陆 Linux 系统后,通过使⽤ Linux 命令完成操作任务,但系统只认识类似 0101 的机器语⾔,这⾥就需要使⽤命令解释器。也就是说,Shell 命令解释器的功能就是将⽤户输⼊的命令转换成系统可以识别的机器语⾔。
通常情况下,Linux 系统默认使⽤的命令解释器是 bash(/bin/bash),当然还有其他命令解释器,例如 sh、csh 等。
在 /etc/passwd ⽂件中,⼤家可以把这个字段理解为⽤户登录之后所拥有的权限。如果这⾥使⽤的是 bash 命令解释器,就代表这个⽤户拥有权限范围内的所有权限。例如:
[root@localhost ~]# vi /etc/passwd
lamp:x:502:502::/home/lamp:/bin/bash
我⼿⼯添加了 lamp ⽤户,它使⽤的是 bash 命令解释器,那么这个⽤户就可以使⽤普通⽤户的所有权限。
如果我把 lamp ⽤户的 Shell 命令解释器修改为 /sbin/nologin,那么,这个⽤户就不能登录了,例如:
[root@localhost ~]# vi /etc/passwd
lamp:x:502:502::/home/lamp:/sbin/nologinlinux修改口令的命令
因为 /sbin/nologin 就是禁⽌登录的 Shell。同样,如果我在这⾥放⼊的系统命令,如 /usr/bin/passwd,例如:
[root@localhost ~]#vi /etc/passwd
lamp:x:502:502::/home/lamp:/usr/bin/passwd
那么这个⽤户可以登录,但登录之后就只能修改⾃⼰的密码。但是,这⾥不能随便写⼊和登陆没有关系的命令(如 ls),系统不会识别这些命令,同时也就意味着这个⽤户不能登录。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论