Linux账号管理

Posted ericz2j

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux账号管理相关的知识,希望对你有一定的参考价值。

(整理自《鸟哥的Linux私房菜》基础篇)

 

1.Linux 的账号与群组

1.1 使用者标识符: UID 与 GID

每个登入的使用者至少都会取得两个 ID ,一个是使用者 ID (User ID ,简称 UID)、一个是群组 ID (Group ID ,简称 GID)。当我们有要显示文件属性的需求时,系统会依据 /etc/passwd 与/etc/group 的内容, 找到 UID / GID 对应的账号与组名再显示出来。作个小实验,你可以用 root 的身份 vim /etc/passwd ,然后将你的一般身份的使用者的 ID 随便改一个号码,然后再到你的一般身份的目录下看看原先该账号拥有的文件,你会发现该文件的拥有人变成了数字:

 技术图片

 

 

 上面的例子仅是在说明 UID 与账号的对应性,在一部正常运作的 Linux 主机环境下,上面的动作不可随便进行, 这是因为系统上已经有很多的数据被建立存在了,随意修改系统上某些账号的 UID 很可能会导致某些程序无法进行,这将导致系统无法顺利运作的结果, 因为权限的问题。

 

1.2使用者账号

当我们在登录时输入账号密码后,系统帮你处理了什么:

1.     先找寻 /etc/passwd 里面是否有你输入的账号?如果没有则跳出,如果有的话则将该账号对应的 UID 与GID (在 /etc/group 中) 读出来,另外,该账号的家目录与 shell 设定也一并读出;

2.     再来则是核对密码表啦!这时 Linux 会进入 /etc/shadow 里面找出对应的账号与 UID,然后核对一下你刚刚输入的密码与里头的密码是否相符;

3.     如果一切都 OK 的话,就进入 Shell 控管的阶段。

所以当我们要登入你的 Linux 主机的时候,那个 /etc/passwd 与 /etc/shadow 就必须要让系统读取。

 §      /etc/passwd 文件结构

每一行都代表一个账号,有几行就代表有几个账号在你的系统中! 不过需要特别留意的是,里面很多账号本来就是系统正常运作所必须要的,我们可以简称他为系统账号,例如 bin, daemon, adm, nobody 等等,这些账号请不要随意的杀掉他。

 技术图片

 

 

 每一行使用『:』分隔开,共有七个字段,分别是:

1.     账号名称:用来提供给对数字不太敏感的人类使用来登入系统的!需要用来对应 UID 。例如 root 的UID 对应就是 0 (第三字段);

2.     密码:

早期 Unix 系统的密码就是放在这字段上!但是因为这个文件的特性是所有的程序都能够读取,这样一来很容易造成密码数据被窃取, 因此后来就将这个字段的密码数据给他改放到 /etc/shadow 中了。所以这里你会看到一个『 x 』,

3.     UID:

这个就是使用者标识符!通常 Linux 对于 UID 有几个限制需要说给您了解一下:

id 范围

该 ID 使用者特性

0

(系统管理员)

当 UID 是 0 时,代表这个账号是『系统管理员』! 所以当你要让其他的账号名称也具有 root 的权限时,将该账号的 UID 改为 0 即可。 不过,很不建议有多个账号的 UID 是 0 。

1~999

(系统账号)

保留给系统使用的 ID,其实除了 0 之外,其他的 UID 权限与特性并没有不一样。

默认 1000 以下的数字让给系统作为保留账号只是一个习惯。

 

根据系统账号的由来,通常这类账号又约略被区分为两种:

o   1~200:由 distributions 自行建立的系统账号;

o   201~999:若用户有系统账号需求时,可以使用的账号 UID。

1000~60000

(可登入账号)

给一般使用者用的。事实上,目前的 linux 核心 (3.10.x 版)已经可以支持到

4294967295 (2^32-1) 这么大的 UID 号码!

4.     上面这样说明可以了解了吗?是的, UID 为 0 的时候,就是 root !所以请特别留意一下你的

/etc/passwd 文件!

5.     GID:这个与 /etc/group 有关!其实 /etc/group 的观念与 /etc/passwd 差不多,只是他是用来规范组名与 GID 的对应而已!

6.     用户信息说明栏:这个字段基本上并没有什么重要用途,只是用来解释这个账号的意义而已!

7.     家目录:这是用户的家目录,以上面为例, root 的家目录在 /root ,所以当 root 登入之后,就会立刻跑到 /root 目录里头!如果你有个账号的使用空间特别的大,你想要将该账号的家目录移动到其他的硬盘去该怎么办?可以在这个字段进行修改!默认的用户家目录在 /home/yourIDname

8.     Shell:当用户登入系统后就会取得一个 Shell 来与系统的核心沟通以进行用户的操作任务。那为何预设 shell 会使用 bash 呢?就是在这个字段指定的! 这里比较需要注意的是,有一个 shell 可以用来替代成让账号无法取得 shell 环境的登入动作!那就是 /sbin/nologin 这个东西!这也可以用来制作纯 pop 邮件账号者的数据!

§      /etc/shadow 文件结构

 技术图片

 

 

 shadow 同样以『:』作为分隔符,如果数一数,会发现共有九个字段,这九个字段的用途是这样的:

1.     账号名称:由于密码也需要与账号对应,因此,这个文件的第一栏就是账号,必须要与 /etc/passwd 相同才行!

2.     密码:这个字段内的数据才是真正的密码,而且是经过编码的密码 (加密) ! 需要特别留意的是,虽然这些加密过的密码很难被解出来, 但是很难不等于不会,所以,这个文件的预设权限是『-rw-------』或者是『----------』,亦即只有 root 才可以读写!另外,在此字段前加上 ! 或 * 改变密码字段长度,就会让密码暂时失效了。  

3.     最近更动密码的日期:这个字段记录了『更新密码那一天』的日期,这个是以 1970 年 1 月 1 日作为 1 而累加的日期,1971 年 1 月 1 日则为 366 ! 上述的 16559 指的就是 2015-05-04 那一天。

4.     密码不可被更动的天数:(与第 3 字段相比) 第四个字段记录了这个账号的密码在最近一次被更改后需要经过几天才可以再被变更!如果是 0 的话,表示密码随时可以更动的意思。

5.     密码需要重新变更的天数:(与第 3 字段相比) 为了强制要求用户变更密码,这个字段可以指定在最近一次更改密码后, 在多少天数内需要再次的变更密码才行。你必须要在这个天数内重新设定你的密码,否则这个账号的密码将会『变为过期特性』。 而如果像上面的 99999 (计算为 273 年) 的话,那就表示密码的变更没有强制性之意。

6.     密码需要变更期限前的警告天数:(与第 5 字段相比) 当账号的密码有效期限快要到的时候 (第 5 字段),系统会依据这个字段的设定,发出『警告』言论给这个账号,提醒他再过 n 天你的密码就要过期了,请尽快重新设定你的密码!

7.     密码过期后的账号宽限时间(密码失效日):(与第 5 字段相比) 密码有效日期为『更新日期(第 3 字段)』+『重新变更日期(第 5 字段)』,过了该期限后用户依旧没有更新密码,那该密码就算过期了。 虽然密码过期但是该账号还是可以用来进行其他工作的,包括登入系统取得 bash 。不过如果密码过期了, 那当你登入系统时,系统会强制要求你必须要重新设定密码才能登入继续使用喔,这就是密码过期特性。

8.     账号失效日期:这个日期跟第三个字段一样,都是使用 1970 年以来的总日数设定。这个字段表示: 这个账号在此字段规定的日期之后,将无法再使用。 就是所谓的『账号失效』,此时不论你的密码是否有过期,这个『账号』都不能再被使用。 这个字段会被使用通常应该是在『收费服务』的系统中 。

9.     保留:最后一个字段是保留的,看以后有没有新功能加入。

 

如果出现『我的密码忘记了』, 或者是『我的密码不晓得被谁改过,跟原先的不一样了』,这个时候怎么办?

•        一般用户的密码忘记:请系统管理员帮忙, 他会重新设定好你的密码而不需要知道你的旧密码!利用 root 的身份使用 passwd 指令来处理即可。

•        root 密码忘记了:你无法使用 root 的身份登入了! 但我们知道 root 的密码在/etc/shadow 当中,因此你可以使用各种可行的方法开机进入 Linux 再去修改。 例如重新启动进入单人维护模式后,系统会主动的给予 root 权限的 bash 接口, 此时再以 passwd 修改密码即可;或以Live CD 开机后挂载根目录去修改 /etc/shadow,将里面的 root 的密码字段清空, 再重新启动后 root 将不用密码即可登入!登入后再赶快以 passwd 指令去设定 root 密码即可。

1.3 关于群组: 有效与初始群组、groups, newgrp

§      /etc/group 文件结构

 技术图片

 

 

 这个文件每一行代表一个群组,也是以冒号『:』作为字段的分隔符,共分为四栏,每一字段的意义是:

1.     组名:同样用来给人类使用的,基本上需要与第三字段的 GID 对应。

2.     群组密码:通常不需要设定,这个设定通常是给『群组管理员』使用的,目前很少有这个机会设定群组管理员! 同样的,密码已经移动到 /etc/gshadow 去,因此这个字段只会存在一个『x』而已;

3.     GID:就是群组的 ID 。我们 /etc/passwd 第四个字段使用的 GID 对应的群组名,就是由这里对应出来的!

4.     此群组支持的账号名称:我们知道一个账号可以加入多个群组,那某个账号想要加入此群组时,将该账号填入这个字段即可。 举例来说,如果我想要让 dmtsai 与 alex 也加入 root 这个群组,那么在第一行的最后面加上『dmtsai,alex』,注意不要有空格, 使成为『 root:x:0:dmtsai,alex 』就可以了。

 

我们可以使用一个简单的图示来了解一下 UID /GID 与密码之间的关系, 图示如下:

 技术图片

 

 

 其实重点是 /etc/passwd ,其他相关的数据都是根据这个文件的字段去找寻出来的。 root 的 UID 是 0 ,而 GID 也是 0 ,去找 /etc/group 可以知道 GID 为 0 时的组名就是 root 。 至于密码的寻找中,会找到 /etc/shadow 与 /etc/passwd 内同账号名称的那一行,就是密码相关数据。

 

假如我同时加入多个群组,那么我在作业的时候,到底是以那个群组为准?这就涉及到有效群组的概念。

§ 有效群组(effective group)与初始群组(initial group)

还记得每个使用者在他的 /etc/passwd 里面的第四栏有所谓的 GID 吧?那个 GID 就是所谓的初始群组 。

 技术图片

 

 

 在读取/写入/执行文件时,针对群组部分,只要是 users, wheel 与 dmtsai 这三个群组拥有的功能, 我 dmtsai 这个使用者都能够拥有!不过,这是针对已经存在的文件而言, 如果今天我要建立一个新的文件或者是新的目录,新文件的群组是 dmtsai, wheel 还是 users ?这就得要检查一下当时的有效群组了 。可以这样:

 技术图片

 

 

 排在第一个的就是有效群组,所以我们新建的文件或目录所拥有的功能就是第一个群组有关,这里就是dmtsai。

§      newgrp: 有效群组的切换

 技术图片

 

 

 这里需要注意的是newgrp命令会重新开启一个shell,所以最后我们要exit关闭这个新的shell。

§      /etc/gshadow

 技术图片

 

 

 这四个字段的意义为:

1.     组名

2.     密码栏,同样的,开头为 ! 表示无合法密码,所以无群组管理员

3.     群组管理员的账号 ( gpasswd )

4.     有加入该群组支持的所属账号 (与 /etc/group 内容相同!)

 

2.账号管理

2.1 新增与移除使用者: useradd, 相关配置文件, passwd, usermod, userdel

§      useradd

我们可以简单的使用『 useradd 账号 』来建立使用者。 CentOS 这些默认值主要会帮我们处理几个项目:

•        在 /etc/passwd 里面建立一行与账号相关的数据,包括建立 UID/GID/家目录等;

•        在 /etc/shadow 里面将此账号的密码相关参数填入,但是尚未有密码;

•        在 /etc/group 里面加入一个与账号名称一模一样的组名;

•        在 /home 底下建立一个与账号同名的目录作为用户家目录,且权限为 700.

§      useradd 参考文件

 技术图片

 

 

 §      passwd

使用 useradd 建立了账号之后,在预设的情况下,该账号是暂时被封锁的, 也就是说,该账号是无法登入的,你可以去瞧一瞧 /etc/shadow 内的第二个字段就晓得了~ 那该如何是好?直接给他设定新密码就好了。

§      chage

chage可以更详细的密码参数显示。

§  usermod

进行账号相关数据的微调、修改

§  userdel

目的在删除用户的相关数据,而用户的数据有:

•        用户账号/密码相关参数:/etc/passwd, /etc/shadow

•        使用者群组相关参数:/etc/group, /etc/gshadow

•        用户个人文件数据: /home/username, /var/spool/mail/username..

2.2 用户功能:id、finger、chfn、chsh

§  id

查询某人或自己的相关 UID/GID 等等的信息

§  finger(需要安装)

finger 可以查阅很多用户相关的信息! 大部分都是在 /etc/passwd 这个文件里面的信息:

 技术图片

 

 

 列出的信息说明如下:

•        Login:为使用者账号,亦即 /etc/passwd 内的第一字段;

•        Name:为全名,亦即 /etc/passwd 内的第五字段(或称为批注);

•        Directory:就是家目录;

•        Shell:就是使用的 Shell 文件所在;

•        Never logged in.:figner 还会调查用户登入主机的情况!

•        No mail.:调查 /var/spool/mail 当中的信箱资料;

•        No Plan.:调查 ~vbird1/.plan 文件,并将该文件取出来说明!

§  chfn

即change finger,就是改变finger的意思。

§  chsh

change shell,即改变shell。

2.3 新增与移除群组:groupadd、groupmod、groupdel、gpasswd

§  groupadd

添加分组

§  groupmod

修改分组

§  groupdel

 删除分组

如果有某个账号 (/etc/passwd) 的 initial group 使用该群组的话,那么该群组就不能通过groupdel直接删除。

§      gpasswd

群组管理员功能

2.4 账号管理实例

任务一:单纯的完成上头交代的任务,假设我们需要的账号数据如下,你该如何操作?

账号名称

账号全名

支援次要群组

是否可登入主机

密码

myuser1

1st user

mygroup1

可以

password

myuser2

2nd user

mygroup1

可以

password

myuser3

3rd user

无额外支持

不可以

password

处理的方法如下所示:

 技术图片

 

 

任务二:我的使用者 pro1, pro2, pro3 是同一个项目计划的开发人员,我想要让这三个用户在同一个目录底下工作, 但这三个用户还是拥有自己的家目录与基本的私有群组。假设我要让这个项目计划在 /srv/projecta 目录下开发, 可以如何进行?

 技术图片

 

 但接下来有个困扰的问题发生了!假如任务一的 myuser1 是 projecta 这个项目的助理,他需要这个项目的内容, 但是他不可以修改项目目录内的任何数据!那该如何是好?你或许可以这样做:

•        将 myuser1 加入 projecta 这个群组的支持,但是这样会让 myuser1 具有完整的 /srv/projecta 的权限, myuser1 是可以删除该目录下的任何数据的!这样是有问题的;

•        将 /srv/projecta 的权限改为 2775 ,让 myuser1 可以进入查阅数据。但此时会发生所有其他人均可进入该目录查阅的困扰! 这也不是我们要的环境。

怎么办呢?传统的 Linux 权限无法针对某个个人设定专属的权限吗?其实是可以,这就跟ACL权限有关了。

以上是关于Linux账号管理的主要内容,如果未能解决你的问题,请参考以下文章

Linux 系统管理04--账号管理

Linux账号权限管理

Linux账号与权限管理

linux-账号与权限管理--用户账号和组账号权限及归属

Linux账号权限管理

08-Linux账号管理学习