centOS中的账号管理是一个比较复杂的流程。这里我们来演示一下怎么添加用户及用户分组和切换。
以下内容摘自鸟哥的linux私房菜:
• /etc/passwd
这个档案的构造是这样的:每一行都代表一个账号, 有几行就代表有几个账号在你的系统中!不过需要特别留意的是, 里头 很多账号本来就是系统中必须要的,我们可以简称他为系统账号, 例如 bin, daemon, adm, nobody 等等,这些账号是系统正常运作时所需要的,请不要随意的杀掉他呢! 这个档案的内容有点像这样:
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
我们先来看一下每个 Linux 系统都会有的第一行,就是 root 这个系统管理员那一行好了, 你可以明显的看出来,每一行使用『:』分隔开,共有七个咚咚,分别是:
1. 账号名称:就是账号名称啦!对应 UID 用的!例如 root 就是预设的系统管理员的账号名称;
2. 密码:早期的 Unix 系统的密码是放在这个档案中的, 但是因为这个档案的特性是所有的程序都能够读取,所以,这样一来很容易造成数据的被窃取, 因此后来就将这个字段的密码数据给他改放到 /etc/shadow 中了,关于 /etc/shadow 这一部份等一下再说。而这里你会看到一个 x ,呵呵!别担心,这表示密码已经被移动到 shadow 这个加密过后的档案啰;
3. UID:这个就是使用者识别码 (ID) 啰!通常 Linux 对于 UID 有几个限制需要说给您了解一下:
4. 上面这样说明可以了解了吗?是的, UID 为 0 的时候,就是 root 呦!所以请特别留意一下你的 /etc/passwd 档案!
5. GID:这个与 /etc/group 有关!其实 /etc/group 的观念与 /etc/passwd 差不多,只是他是用来规范 group 的而已!
6. 使用者信息说明栏:这个字段基本上并没有什么重要用途, 只是用来解释这个账号的意义而已!不过,如果您提供使用 finger 的功能时, 这个字段可以提供很多的讯息呢!底下的 chfn 可以解释一下啰!
7. 家目录:这是使用者的家目录,以上面为例, root 的家目录在 /root ,所以当 root 登入之后,就会立刻跑到 /root 里头啦!呵呵! 如果你有个账号的使用空间特别的大,你想要将该账号的家目录移动到其它的硬盘去, 没有错!可以在这里进行修改呦!预设的使用者家目录在 /home/yourIDname
8. Shell:所谓的 shell 是用来沟通人类下达的指令与硬件之间真正动作的界面!我们通常使用 /bin/bash 这个 shell 来进行指令的下达!嘿嘿!发现了吧?我们在 bash 章节里面提到很多次,登入 Linux 时为何预设是 bash 呢?就是这里设定的啦~ 这里比较需要注意的是,有一个 shell 可以用来替代成让账号无法登入的指令!那就是 /sbin/nologin 这个东西!这也可以用来制作纯 pop 邮件账号者的数据呢!
• /etc/shadow
上面约略提到,由于每个程序都需要取得 uid 与 gid 来判断权限的问题,所以, /etc/passwd 的权限必须要设定成为 -rw-r--r-- 这样的权限,在这样的情况下, 使用者的密码不就任何人都可以看到吗?即使这个档案内的密码栏是加密的, 坏心肠的朋友也可能利用暴力破解法去 try and error 找出您的密码数据...... 因为这样的关系,所以后来发展出将密码移动到 /etc/shadow 这个档案分隔开来的技术, 而且还加入很多的密码限制参数在 /etc/shadow 里头呢!我们先来了解一下这个档案的构造吧! 我的 /etc/shadow 档案有点像这样:
root:$1$i9Ejldjfjio389u9sjl$jljsoi45QE/:12959:0:99999:7:::
bin:*:12959:0:99999:7:::
daemon:*:12959:0:99999:7:::
adm:*:12959:0:99999:7:::
基本上, shadow 同样以『:』作为分隔符,如果数一数,会发现共有九个字段啊, 这九个字段的用途是:
1. 账号名称:由于密码也需要与账号对应啊~因此, 这个档案的第一栏就是账号,必须要与 /etc/passwd 相同才行!
2. 密码:这个才是真正的密码,而且是 经过编码过的密码啦! 你只会看到有一些特殊符号的字母就是了!需要特别留意的是, 虽然这些加密过的密码很难被解出来,但是『很难』不等于『不会』,所以, 这个档案的预设属性是『-rw-------』或者是『-r--------』,亦即只有 root 才可以读写就是了!你得随时注意,不要不小心更动了这个档案的属性呢!另外, 如果是在密码栏的第一个字符为『 * 』或者是『 ! 』,表示这个账号并不会被用来登入的意思。 所以万一哪一天你的某个使用者不乖时,可以先在这个档案中,将他的密码字段的最前面多加一个 * !嘿嘿!他就无法使用该账号啰!直到他变乖了,再给他启用啊!
3. 最近更动密码的日期:这个字段记录了『更动密码的那一天』的日期, 不过,很奇怪呀!在我的例子中怎么会是 12959 呢?呵呵,这个是因为计算 Linux 日期的时间是以 1970 年 1 月 1 日作为 1 ,而 1971 年 1 月 1 日则为 366 啦! 所以这个日期是累加的呢!得注意一下这个资料呦!那么最近的 2005 年 1 月 1 日就是 12784 啦,了解了吗?
4. 密码不可被更动的天数: 第四个字段记录了这个账号的密码需要经过几天才可以被变更!如果是 0 的话, 表示密码随时可以更动的意思。这的限制是为了怕密码被某些人一改再改而设计的!如果设定为 20 天的话,那么当你设定了密码之后, 20 天之内都无法改变这个密码呦!
5. 密码需要重新变更的天数: 由于害怕密码被某些『有心人士』窃取而危害到整个系统的安全,所以有了这个字段的设计。 你必须要在这个时间之内重新设定你的密码,否则这个账号将会暂时失效。 而如果像上面的 99999 的话,那就表示,呵呵,密码不需要重新输入啦! 不过,如果是为了安全性,最好可以设定一段时间之后,严格要求使用者变更密码呢!
6. 密码需要变更期限前的警告期限:当账号的密码失效期限快要到的时候, 就是上面那个『必须变更密码』的那个时间时, 系统会依据这个字段的设定,发出『警告』言论给这个账号,提醒他『再过 n 天你的密码就要失效了,请尽快重新设定你的密码呦!』,如上面的例子,则是密码到期之前的 7 天之内,系统会警告该用户。
7. 密码过期的恕限时间:如果用户过了警告期限没有重新输入密码, 使得密码失效了,也就是说,你在『必须变更密码的期限前,并没有变更你的密码!』 那么该组密码就称为『失效的密码』啰~怎么办?没关系,还有这个字段的天数设计啊~ 意思就是说,当密码失效后,你还可以用这个密码在 n 天内进行登入的意思。 而如果在这个天数后还是没有变更密码,呵呵!那么您的账号就失效了!无法登入!
8. 账号失效日期:这个日期跟第三个字段一样,都是使用 1970 年以来的总日数设定。这个字段表示: 这个账号在此字段规定的日期之后,将无法再使用。 这个字段会被使用通常应该是在『收费服务』的系统中, 你可以规定一个日期让该账号不能再使用啦!
9. 保留:最后一个字段是保留的,看以后有没有新功能加入。
举个例子来说好了,假如我的 dmtsai 这个使用者的密码栏如下所示:
dmtsai:$1$8zdAKdfC$XDa8eSus2I7nQL7UjRsIy/:13025:5:60:7:2:13125:
这表示什么呢?要注意的是, 13025 是 2005/08/30 ,所以, dmtsai 这个使用者他的密码相关意义是:
• 最近一次更动密码的日期是 2005/08/30 (13025);
• 能够修改密码的时间是 5 天以后,也就是 2005/09/04 以前 dmtsai 不能修改自己的密码; 如果使用者还是尝试要更动自己的密码,系统就会出现这样的讯息:
You must wait longer to change your password
passwd: Authentication token manipulation error
• 使用者必须要在 2005/09/04 到 2005/10/29 之间的 60 天限制内去修改自己的密码,若 2005/10/29 之后还是没有变更密码时,该账号就会宣告失效;
• 如果使用者一直没有更改密码,那么在 2005/10/29 之前的 7 天内,系统会警告 dmtsai 应该修改密码的相关信息;例如当 dmtsai 登入时,系统会主动提示如下的信息:
Warning: your password will expire in 5 days
• 如果该账号一直到 2005/10/29 都没有更改密码,由于还有两天的恕限时间,因此, dmtsai 还是可以在 2005/10/31 以前继续登入;
• 如果使用者在 2005/10/29 以前变更过密码,那么那个 13025 的日期就会跟着改变,因此, 所有的限制日期也会跟着相对变动喔!^_^
• 无论使用者如何动作,到了 13125 ,大约是 2005/12/8 左右,该账号就失效了。
关于群组: 有效与初始群组、groups, newgrp
认识了账号相关的两个档案 /etc/passwd 与 /etc/shadow 之后,您或许还是会觉得奇怪, 那么群组的设定档在哪里?还有,在 /etc/passwd 的第四栏不是所谓的 GID 吗?那又是啥? 呵呵~此时就需要了解 /etc/group 与 /etc/gshadow 啰~
• /etc/group
这个档案就是在记录 GID 与群组名称的对应了~我的 /etc/group 内容有点像这样:
root:x:0:root
bin:x:1:root,bin,daemon
daemon:x:2:root,bin,daemon
sys:x:3:root,bin,adm
也是以冒号『:』作为字段的分隔符,共分为四栏,每一字段的意义是:
1. 群组名称:就是群组名称啦!
2. 群组密码:通常不需要设定,因为我们很少使用到群组登入! 不过,同样的,密码也是被纪录在 /etc/gshadow 当中啰!
3. GID:就是群组的 ID 啊~
4. 支持的账号名称:加入这个群组里面的所有的账号, 我们知道,一个使用者是可以加入多个群组的。举例来说,如果我想要让 dmtsai 也加入 root 这个群组,那么在第一行的最后面加上『,dmtsai』,注意不要有空格, 使成为『 root:x:0:root,dmtsai』就可以
有效群组(effective group)与初始群组(initial group)
还记得每个使用者在他的 /etc/passwd 里面的第四栏有所谓的 GID 吧?那个 GID 就是所谓的『初始群组 ( initial group ) 』了!也就是说,当使用者一登入系统,立刻就拥有这个群组的相关权限的意思。 举例来说,我们上面提到 dmtsai 这个使用者的 /etc/passwd 与 /etc/group 还有 /etc/gshadow 相关的内容如下:
[root@linux ~]# grep dmtsai /etc/passwd /etc/group /etc/gshadow
/etc/passwd:dmtsai:x:501:501::/home/dmtsai:/bin/bash
/etc/group:users:x:100:dmtsai
/etc/group:dmtsai:x:501:
/etc/gshadow:users:::dmtsai
/etc/gshadow:dmtsai:!::
仔细看到上面这个表格,在 /etc/passwd 里面,dmtsai 这个使用者所属的群组为 GID=501 , 也就是 /etc/group 里头 dmtsai 那个群组啦~因为这是 initial group ,所以, 使用者一登入就会主动取得,不需要在 /etc/group 的第四个字段写入该账号的! 但是非 initial group 的其它群组可就不同了。举上面这个例子来说,我将 dmtsai 加入 users 这个群组当中,由于 users 这个群组并非是 dmtsai 的初始群组,因此, 我必须要在 /etc/group 这个档案中,找到 users 那一行,并且将 dmtsai 这个账号加入第四栏, 这样 dmtsai 才能够支持 users 这个群组啊。 那么在这个例子当中,因为我的 dmtsai 这个账号同时支持 dmtsai 与 users 这两个群组, 因此,在读取/写入/执行档案时,针对群组部分,只要是 users 与 dmtsai 这两个群组拥有的功能, 我 dmtsai 这个使用者都能够拥有喔!这样瞭呼?不过,这是针对已经存在的档案而言, 如果今天我要建立一个新的档案或者是新的目录,请问一下,新档案的群组是 dmtsai 还是 users ? 呵呵!这就得要检查一下当时的有效群组了 (effective group)。 如果我以 dmtsai 这个使用者的身份登入后,该如何知道我所有支持的群组呢? 很简单啊,直接输入 groups 就可以了!注意喔,是 groups 有加 s 呢!结果像这样:
[dmtsai@linux ~]$ groups
dmtsai users
在这个输出的讯息中,我知道我同时属于 dmtsai 及 users 这个两个群组,而且, 第一个输出的群组即为有效群组 (effective group) 了。 也就是说,我的有效群组为 dmtsai 啦~此时,如果我以 touch 去建立一个新档,例如: touch test ,那么这个档案的拥有者为 dmtsai ,而且群组也是 dmtsai 的啦。