在linux系统管理员的工作中,相当重要的一环就是管理账号!因为整个系统都是你在管理的, 并且所有一般用户的账号申请,都必须要透过你的协助才行!所以要了解一下如何管理好一个朋务器主机的账号! 在管理 Linux 主机的账号时,我们必须先了解一下 Linux 到底是如何增删每一个使用者!
一、使用者标识符: UID 和 GID
虽然登入 Linux 主机时,输入的是我们的账号,但是其实 Linux 主机开机会直接识别到你账号名称的,他仅认识 数字ID (ID 就是一组号码)。
因为计算机尽认识0 和 1;至于账号是为了讥人们容易让忆而已。 而你的 ID 与账号的对应就在 /etc/passwd 文件中。
每个登入的使用者至少都会取得两个 ID ,一个是使用者 ID (User ID ,简称 UID)、一个是群组 ID (Group ID ,简称 GID)。那么文档如何判断他的拥有者和群组呢?其实就是利用 UID 和 GID !每一个档案都会有所谓的拥有者 ID 和拥有群组 ID ,当我们有要显示文件属性的需求时,系统会依据 /etc/passwd 和 /etc/group的内容, 找出 UID / GID 对应的账号和组名再显示出来!我们可以作个小实验,你可以用 root 的身份vi /etc/passwd ,然后将你的一般身份的使用者的ID 随便改一个号码,然后再到你的一般身份的目录
下看看原先该账号拥有的档案,你会发现该档案的拥有人变成了数字!
示例:
# 1. 先察看一下,系统里面有没有一个名为 dmtsai 的用户?
以上例子仅是在说明 UID 与账号的对应性,在一部正常运作的 Linux 主机环境下,上面的动作不可随便进行,这是因为系统上已经有很多的数据被建立存在了,随意修改系统上某些账号的 UID 很可能会导致某些程序无法运行,这将导致系统无法顺利运作的结果。 因为权限的问题啊!
二、使用者账号
Linux 系统上面的用户如果需要登入主机以取得 shell 的环境来工作时,他需要如何运行呢? 首先,他必须要在计算机前面调用 tty1~tty7 的终端机提供的 login 接口,并输入账号与密码后才能够登入。 如果是透过网络的话,那至少使用者就得要学习 ssh 这个功能了 。 那当你输入账号、密码后,系统帮你处理了什举呢?
1. 先找寻 /etc/passwd 里面是否有你输入的账号?如果没有则跳出,如果有的话则将该账号对应的
UID 与 GID (在 /etc/group 中) 读出来,另外,该账号的家目录与 shell 设定也一并读出;
2. 其次则是核对密码表!这时 Linux 会进入 /etc/shadow 里面找出对应的账号与 UID,然后核对一下你刚刚输入的密码与里头的密码是否相符?
3. 如果一切都 OK 的话,将进入 Shell 控管的阶段!
下面介绍一下/etc/passwd、/etc/shadow。
三、 /etc/passwd 档案结构
这个档案的构造是这样的:每一行都代表一个账号,有几行就代表有几个账号在你的系统中! 不过需要特别留意的是,里头很多账号本来就是系统正常运作所必须要的,可以简称他为系统账号, 例如bin, daemon, adm, nobody 等等,这些账号请不要随意的杀掉他! 这个档案的内容有点像这样
先来看一下每个 Linux 系统都会有的第一行,就是 root 这个系统管理员那一行好了,可以明显的看出的,每一行使用『:』分隔开,共有七个部分,分别是:
1. 账号名称:
就是账号!用来对应 UID 。例如 root 的 UID 对应就是 0 (第三字段);
2. 密码:
早期 Unix 系统的密码就是放在这字段上!但是因为这个档案的特性是所有的程序都能够读取,这样一来很容易造成密码数据被窃取, 因此后来就将这个字段的密码数据给他改放到/etc/shadow 中了。所以这里你会看到一个 * !
3. UID:
这个就是使用者标识符!通常 Linux 对于UID 有几个限限制需要说给您了解一下:
示例:id 范围 该 ID 使用者特性
0(系统管理员)
当UID 是 0 时,代表这个账号是系统管理员! 所以当你要让其他的账号名称也具有 root 的权限时,将该账号的UID 改为 0 即可。 这也就是说,一部系统上面的系统管理员不见得叧有 root ! 不过,不建议有多个账号的UID 是 0 。
1~499(系统账号)
保留给系统使用的 ID,其实除了 0 之外,其他的 UID 权限与特性并没有丌一样。默认 500 以下的数字只给系统作为保留账号只是一个习惯。由于系统上面启动的服务希望使用较小的权限去运作,因此不希望使用 root 的身份去执行这些服务, 所以我们就得要提供这些运行中程序的拥有者账号才行。这些系统账号通常是不可登入的, 所以才会有
/sbin/nologin 这个特殊的 shell 存在。
根据系统账号的由来,通常系统账号又约略被区分为两种:
1~99:由 distributions 自行建立的系统账号;
100~499:若用户有系统账号需求时,可以使用的账号 UID。
500~65535
(可登入账号)
给一般使用者用的。事实上,目前的 linux 核心 (2.6.x 版)已经可以支持到4294967295 (2^32-1) UID!
4. GID:
这个与 /etc/group 有关!其实 /etc/group 与 /etc/passwd 差不多,只是他是用来规范组名与 GID 的对应而已!
6. 用户信息说明栏:
这个字段基本上幵没有什举重要用递,叧是用杢解释这个账号的意丿而已!丌过,如果您提供使用 finger 的功能时, 这个字段可以提供徆多的讨息呢!本章后面的 chfn 挃令会杢解释这里的说明。
7. 家目录:
这是用户的家目录,以上面为例, root 的家目录在 /root ,所以当 root 登入之后,就会立刻跑到 /root 目录里头。
8. Shell:
当用户登入系统后就会取得一个 Shell 来与系统的核心沟通,以进行用户的操作任务。那为何默认 shell 会使用 bash 呢?就是在这个字段指定的! 这里比较需要注意的是,有一个 shell 可以用来替代成让账号无法取得 shell 环境的登入动作!那就是/sbin/nologin 这个东西!这也可以用来制作纯 pop 邮件账号者的数据呢!
四、 /etc/shadow 档案结构
我们知道徆多程序的运作都不权限有关,而权限不 UID/GID 有关!因此各程序弼然需要读取/etc/passwd 杢了解丌同账号的权限。 因此 /etc/passwd 的权限需训定为 -rw-r--r-- 这样的情况, 虽然早期的密码也有加密过,但即放置到 /etc/passwd 的第二个字段上!这样一来很容易被有心人士所窃取的, 加密过的密码也能够透过暴力破解法去 try and error (试探) 找出来!因为这样的关系,所以后来发展出将密码存放到 /etc/shadow 这个档案分隔开来的技术, 而且还加入很多的密码限令参数在 /etc/shadow 里头呢!在这里,我们先来了解一下这个档案的构造吧!
/etc/shadow 档案有点像这样:
基本上, shadow 同样以『:』作为分隔符,共有九个字段,这九个字段的用途是这样的:
1. 账号名称:
由于密码也需要与账号对应,因此,这个档案的第一栏就是账号,必须要与/etc/passwd 相同才行!
2. 密码:
这个字段内的数据才是真正的密码,而且是经过编码的密码 (加密) !
3. 最近更改密码的日期:
这个字段记录了更改密码那一天的日期,不过,这个是计算 Linux 日期的时间是以 1970 年 1 月 1 日作为 1 而累加的日期,
1971 年 1 月 1 日则为 366 !上述的 14126 指的就是 2008-09-04
那一天! 而想要了解该日期可以使用 chage 指令的帮忙!至亍想要知道某个日期的累积日数, 可使用如下的程序计算:
4. 密码不可被更动的天数:(与第 3 字段相比)
第四个字段记录了这个账号的密码在最近一次被更改后需要经过几天才可以再被变更!如果是
0 的话, 表示密码随时可以更改。这的限令是为了怕密码被某些人一改再改而设计的!如
果训定为 20 天的话,那么当你训定了密码之后, 20 天内都无法改变这个密码!
5. 密码需要重新变更的天数:(与第 3 字段相比)
6. 密码需要变更期限前的警告天数:(与第 5 字段相比)
7. 密码过期后的账号宽限时间(密码失效日):(与第 5 字段相比)
密码有效日期为『更新日期(第 3 字段)』+『重新变更日期(第 5 字段)』,过了该期限后用户依旧
没有更新密码,那该密码就算过期了。 虽然密码过期但是该账号还是可以用来进行行其他工作,
包括登入系统取得 bash 。不过如果密码过期了, 那当你登入系统时,系统会强令要求你必须要
重新设定密码才能登入继续使用,这就是密码过期特性。
8. 账号失效日期:
这个日期跟第三个字段一样,都是使用 1970 年以杢的总日数设定。这个字段表示: 这个账号在
此字段规定的日期之后,将无法再使用。 就是所谓的『账号失效』,此时无论你的密码是否有过
期,这个『账号』都不能再被使用! 这个字段会被使用通常应该是在『收费服务』的系统中,你
可以设定一个日期让该账号不能再使用!
9. 保留:
最后一个字段是保留的,看以后有没有新功能加入。
示例:
假如我的 dmtsai 这个用户的密码栏如下所示:
dmtsai:$1$vyUuj.eX$omt6lKJvMcIZHx4H7RI1V.:14299:5:60:7:5:14419:
注意 14299 是 2009/02/24 。所以 dmtsai 这个用户的密码相关意义是:
由于密码几乎仅能单向运算(由明码计算成为密码,无法由密码反推回明码),因此由上表的数据我们无法得知 dmstai 的实际密码明文;
此账号最近一次更动密码的日期是 2009/02/24 (14299);
能够再次修改密码的时间是 5 天以后,也就是 2009/03/01 以前 dmtsai 不能修改自己的密码;
如果用户还是尝试要更动自己的密码,系统就会出现这样的消息:
You must wait longer to change your password
passwd: Authentication token manipulation error
返回的消息中告诉我们:你必须要等待更久的时间才能够变更密码!
由亍密码过期日期定为 60 天后,累积日数为: 14299+60=14359,经过计算得到此日数代表日期为 2009/04/25。 这表示:使用者必须要在 2009/03/01 到 2009/04/25 之间的
60 天限内内去修改自己的密码,若 2009/04/25 之后还是没有变更密码时,该密码就宣告为过期!
? 警告日期设为 7 天,即是密码过期日前的7 天,在本例中则代表 2009/04/19 ~ 2009/04/25
这七天。 如果用户一直没有更改密码,那么在这 7 天中,只要 dmtsai 登入系统就会发现如下的消息:
Warning: your password will expire in 5 days
如果该账号一直到 2009/04/25 都没有更改密码,那么密码就过期了。但是由亍有 5 天的宽限天数, 因此 dmtsai 在 2009/04/30 前都还可以使用旧密码登入主机。 不过登入时会出现强制更改密码的情况,画面有点像底下这样:
You are required to change your password immediately (password aged)
WARNING: Your password has expired.
You must change your password now and login again!
Changing password for user dmtsai.
Changing password for dmtsai
(current) UNIX password:
必须要输入一次旧密码以及两次新密码后,才能够开始使用系统的各项资源。
如果你是在2009/04/30 以后尝试以 dmtsai 登入的话,那举就会出现如下的错误消息并且无法登陆系统,因为此时你的密码失效去了、
Your account has expired; please contact your system administrator
如果使用者在 2009/04/25 以前变更过密码,那么第 3 个字段的那个 14299 的天数就会跟着改变,因此, 所有的限令日期也会跟着相对变!