Linux:用户管理
在Linux的日常使用中,用户管理应该是最常见的操作。
通常我们以为用户管理只有简单的创建用户(useradd)、创建用户组(groupadd)、将特定的用户分配给需要的用户组(usermod),或者给某个文件与路径划分用户权限,…
其实,在Linux中,用户的管理不止于此。
下面的篇章中,我会结合我的本地的虚拟化环境中的代码,详细呈现这方面的技术细节,以及在不同的场景下,到底会发生什么样的现象。
——————————
创建测试用户:lucy
1 2 3 4 5 6 7 8 9 10 11 12 13 |
[root@oradg2 ~]# cat /etc/passwd | grep --color lucy [root@oradg2 ~]# cat /etc/shadow | grep --color lucy [root@oradg2 ~]# cat /etc/group | grep --color lucy [root@oradg2 ~]# [root@oradg2 ~]# useradd lucy [root@oradg2 ~]# [root@oradg2 ~]# cat /etc/passwd | grep --color lucy lucy:x:1103:1103::/home/lucy:/bin/bash [root@oradg2 ~]# cat /etc/shadow | grep --color lucy lucy:!!:16972:0:99999:7::: [root@oradg2 ~]# cat /etc/group | grep --color lucy lucy:x:1103: [root@oradg2 ~]# |
当前,对于【lucy】来说,我是没有设置密码的,所以她的密码状态如下:
1 2 3 |
[root@oradg2 ~]# passwd -S lucy lucy LK 2016-06-20 0 99999 7 -1 (Password locked.) [root@oradg2 ~]# |
这其实表明【lucy】的口令是锁定的状态。
虽然【lucy】账户被锁定了,但是不妨碍【root】的登录:
1 2 3 4 5 6 7 |
[root@oradg2 ~]# whoami root [root@oradg2 ~]# [root@oradg2 ~]# su - lucy [lucy@oradg2 ~]$ whoami lucy [lucy@oradg2 ~]$ |
然而,普通用户就没有【root】这么幸运了:
1 2 3 4 5 |
[root@oradg2 ~]# su - oracle [oracle@oradg2 ~]$ su - lucy 口令: su: 密码不正确 [oracle@oradg2 ~]$ |
这个时候,我并没有设置【lucy】的口令,当然不知道lucy的密码,于是上面的登录必然失败。
在没有设置密码的时候,给账户解锁起不到任何作用:
1 2 3 4 5 6 7 8 9 10 |
[root@oradg2 ~]# passwd -S lucy lucy LK 2016-06-20 0 99999 7 -1 (Password locked.) [root@oradg2 ~]# [root@oradg2 ~]# passwd -u lucy Unlocking password for user lucy. passwd: Unsafe operation (use -f to force). [root@oradg2 ~]# [root@oradg2 ~]# passwd -S lucy lucy LK 2016-06-20 0 99999 7 -1 (Password locked.) [root@oradg2 ~]# |
我们来为【lucy】设置第一组密码:
1 2 3 4 5 6 7 |
[root@oradg2 ~]# echo "hello@123" | passwd --stdin lucy Changing password for user lucy. passwd: all authentication tokens updated successfully. [root@oradg2 ~]# [root@oradg2 ~]# passwd -S lucy lucy PS 2016-06-20 0 99999 7 -1 (Password set, SHA512 crypt.) [root@oradg2 ~]# |
可以看到,密码设置完成后,【lucy】的口令锁定状态立即变掉了。
这时候,尝试普通用户登录【lucy】:
1 2 3 4 5 6 7 |
[oracle@oradg2 ~]$ whoami oracle [oracle@oradg2 ~]$ su - lucy 口令: [lucy@oradg2 ~]$ whoami lucy [lucy@oradg2 ~]$ |
然后,我们锁掉【lucy】,再看看普通用户是否可以依旧通过密码登录?
1 2 3 4 5 6 7 8 9 10 |
[root@oradg2 ~]# passwd -S lucy lucy PS 2016-06-20 0 99999 7 -1 (Password set, SHA512 crypt.) [root@oradg2 ~]# [root@oradg2 ~]# passwd -l lucy Locking password for user lucy. passwd: Success [root@oradg2 ~]# [root@oradg2 ~]# passwd -S lucy lucy LK 2016-06-20 0 99999 7 -1 (Password locked.) [root@oradg2 ~]# |
用户【lucy】已被锁定。
尝试普通用户登录:
1 2 3 4 5 6 |
[oracle@oradg2 ~]$ whoami oracle [oracle@oradg2 ~]$ su - lucy 口令: su: 密码不正确 [oracle@oradg2 ~]$ |
账户被锁定后,切换用户的时候会报错:密码不正确。
所以,下次看到密码不正确的时候,你如果确定你没有输错密码,那么可能用户被锁了。
关于账户口令的有效期:
先查看一下用户【lucy】的状态:
(为了显示公正,我将字符集切为:英文【en_US】)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
[root@oradg2 ~]# env | grep LANG LANG=zh_CN.UTF-8 [root@oradg2 ~]# [root@oradg2 ~]# export LANG=en_US [root@oradg2 ~]# [root@oradg2 ~]# chage -l lucy Last password change : Jun 20, 2016 Password expires : never Password inactive : never Account expires : never Minimum number of days between password change : 0 Maximum number of days between password change : 99999 Number of days of warning before password expires : 7 [root@oradg2 ~]# |
可以看到:
最近一次修改口令的时间是:Jun 20, 2016。
当前账户的密码保留的最大时间:99999,也就是用不过期的意思。
在距离到期还差几天的时候,系统开始提醒用户,口令即将过期?:7天。
让我们来做一个密码过期的验证,你就明白上面的这些是怎么在真实工作,并影响我们自然人的操作的。
查看下当前的时间,并修改【lucy】的口令,在8天后将过期,并提前5天发出告警:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
[root@oradg2 ~]# passwd lucy Changing password for user lucy. New UNIX password: BAD PASSWORD: it is based on a dictionary word Retype new UNIX password: passwd: all authentication tokens updated successfully. [root@oradg2 ~]# [root@oradg2 ~]# date Wed Jun 29 00:01:38 CST 2016 [root@oradg2 ~]# [root@oradg2 ~]# chage -l lucy Last password change : Jun 28, 2016 Password expires : Jul 06, 2016 Password inactive : never Account expires : never Minimum number of days between password change : 0 Maximum number of days between password change : 8 Number of days of warning before password expires : 5 [root@oradg2 ~]# |
可以看到:
当前时间,20160629
过期时间:20160706
开始告警时间:20160702
下面测试:
修改时间:
1 2 3 4 5 6 |
[root@oradg2 ~]# date Wed Jun 29 00:04:53 CST 2016 [root@oradg2 ~]# [root@oradg2 ~]# date -s "20160630" Thu Jun 30 00:00:00 CST 2016 [root@oradg2 ~]# |
依照上面的方式,修改系统时间,逼近过期点。
【lucy】的登录情况:
06-30:
1 2 3 4 5 6 |
[root@oradg2 ~]# date Wed Jun 29 00:04:53 CST 2016 [root@oradg2 ~]# [root@oradg2 ~]# date -s "20160630" Thu Jun 30 00:00:00 CST 2016 [root@oradg2 ~]# |
07-01:
1 2 3 4 5 6 |
[oracle@oradg2 ~]$ date 2016年 07月 01日 星期五 00:00:05 CST [oracle@oradg2 ~]$ [oracle@oradg2 ~]$ su - lucy 口令: [lucy@oradg2 ~]$ |
07-02:
1 2 3 4 5 6 |
[oracle@oradg2 ~]$ date 2016年 07月 02日 星期六 00:00:06 CST [oracle@oradg2 ~]$ [oracle@oradg2 ~]$ su - lucy 口令: [lucy@oradg2 ~]$ |
07-03:
1 2 3 4 5 6 7 |
[oracle@oradg2 ~]$ date 2016年 07月 03日 星期日 00:00:08 CST [oracle@oradg2 ~]$ [oracle@oradg2 ~]$ su - lucy 口令: 警告:您的密码将在 4 天后过期 [lucy@oradg2 ~]$ |
07-06:
1 2 3 4 5 6 7 |
[oracle@oradg2 ~]$ date 2016年 07月 06日 星期三 00:00:17 CST [oracle@oradg2 ~]$ [oracle@oradg2 ~]$ su - lucy 口令: 警告:您的密码将在 1 天后过期 [lucy@oradg2 ~]$ |
07-07:
1 2 3 4 5 6 |
[oracle@oradg2 ~]$ date 2016年 07月 07日 星期四 00:00:06 CST [oracle@oradg2 ~]$ su - lucy 口令: 警告:您的密码将在 0 天后过期 [lucy@oradg2 ~]$ |
07-08:
1 2 3 4 5 6 7 8 9 10 11 |
[oracle@oradg2 ~]$ date 2016年 07月 08日 星期五 00:01:26 CST [oracle@oradg2 ~]$ [oracle@oradg2 ~]$ su - lucy 口令: 您需要立即更改口令(口令过期) Changing password for lucy (当前)UNIX 口令: 新的 UNIX 口令: 重新输入新的 UNIX 口令: [lucy@oradg2 ~]$ |
————————————
Done。
直接修改过期时间: chage -E 6/30/2014 -m 5 -M 90 -I 30 -W 14 lucy
chage -E 08/31/2016 lucy
直接修改过期日期。
延长Linux用户的过期时间。