文章整理自参考书《鸟哥的LINUX私房菜基础学习篇(第四版)》以及网上资料,仅作学习交流以及知识树立使用,侵删
¶Linux用户与用户组大体概念
Linux用户身份与用户组记录的文件:
在Linux系统当中,牧人情况下,所有系统上的帐号与一般身份用户,以及root的相关信息,都记录在/etc/passwd这个文件内,至于个人的密码姿势记录在/etc/shadow这个文件内。此外,Linux所有的组名都记录在/etc/group中。这三个文件可以说时Linux系统里面帐号、密码、用户组信息的集中地。
¶文件拥有者
Linux的“用户与用户组”的功能是一个健全且好用的安全防护措施。由于Linux是一个多人多任务的系统,因此可能常常会有多人同时使用这台主机进行工作的情况发生,为了考虑每个人的隐私权以及每个人喜好的工作环境,因此,这个文件拥有者的角色就非常重要了。
例如把你的email情书存在home目录下而又不希望别人看到,可以适当修改权限使得别人无法看到。
¶用户组概念
用户组是最有用的功能之一,就是当你在团队进行协同工作的时候。书中以一家人举例:
假设有一家人,家里只有三兄弟:王大毛,王二毛与王三毛,这个家庭等级在王大毛名下。这三个人都有自己的房间,并且共同拥有一个客厅,那么:
- 用户的意义:由于王家三人各自有自己的房间,所以王二毛虽然可以进入王三毛的房间,但是二毛不能翻三毛的东西。
- 用户组的概念:由于共同拥有客厅,所以客厅的东西三兄弟都可以使用。
¶其他人概念
如果今天又有一个人,名叫张小猪,它是张小猪家的人,与王家没有关系。这个时候,除非王家认识张小猪,然后开门让张小猪来王家,否则张小猪永远没办法进入王家,更不要说进入王三毛的空间。不过,如果张小猪通过关系认识了三毛,并且根三毛成为好朋友,那么张小猪就可以通过三毛进入王家。这个张小猪就是所谓的“其他人(others)”
¶小结
因此我们可以知道,在Linux系统中,任何一个文件都具有用户(User)、所属群组(Group)、其他人(Others)三种身份的个别权限。
¶Linux的帐号与用户组
管理员工作中,相当重要的一环就是【管理帐号】。因为整个系统都是管理员在管理,并且所有一般用户的帐号申请,都必须要通过管理员的协助才行。因此必须要了解如何管利好一个服务器主机的帐号。在管理Linux主机的帐号时,我们必须吸纳来了解Linux到底时如何判别每一个用户的。
¶用户标识符:UID与GID
虽然我们登录Linux主机时用的时我们自己的帐号,但是其实Linux主机并不会直接认识你的【帐号名称】,它仅认识ID。帐号知识为了让人们容易记忆而已,而你的ID与帐号的对应就在/etc/passwd中
-
每个登录用户至少都会获取两个ID,一个是用户ID(User ID, UID),一个是用户组ID(Group ID, GID)
-
文件如何判断它的拥有者与用户组的呢?
每一个文件都会有所谓的拥有者ID与拥有人组ID,当我们有要显示文件属性的需求时,系统会根据/etc/passwd与/etc/group的内容,找到UID与GID对应的帐号与组名再显示出来。
¶用户帐号
Linux系统上面的用户如果需要登录主机以获取shell的环境来工作时,它需要如何进行呢?首先,它必须要在计算机前面利用tty1~tty6的终端提供的登录接口,并输入帐号与密码后才能够登录。如果时网络的化,那至少用户就得要学习ssh这个功能。那么你输入帐号密码后,系统帮你处理了什么呢?
- 先查找/etc/passwd里面是否有你输入的帐号,若没有则退出,如果有的话则将该帐号对应的UID与GID(在/etc/group中)读出来,另外,该帐号的家目录与shell设置也一并读出。
- 再来则是核对密码表。这是Linux会进入/etc/shadow里面找出对应的帐号与UID,然后核对一下你刚刚输入的密码与里面的密码是否相符
- 如果一切OK,进入shell管理阶段
大致情况就像上面这样,所以当你要登录你的Linux主机的时候,哪个/etc/passwd与/etc/shadow就必须要让系统读取(这也是很多攻击者会将特殊帐号写到/etc/passwd里面的缘由)。所以,如果你要备份Linux系统的帐号的话,那么这两个文件就一定要备份才行
由上面的流程我们也知道,跟用户帐号有关的有两个非常重要的文件,一个时管理用户UID与GID重要参数的/etc/passwd,另一个则是专门管理密码相关数据的/etc/shadow。下面会简单介绍这两个文件,详细的说明可参考man 5 passwd及man 5 shadow
-
/etc/passwd文件结构
这个文件的构造是这样的:
没一行都代表一个帐号,有几行就代表有几个帐号在你的系统中。不过需要特别留意的是,里面很多帐号本来就是系统正常运行所必须的,我们可以简称它为系统帐号。例如bin、daemon、adm、nobody等,这些帐号请不要随意删除-
帐号名称
就是帐号,提供给对数字不大敏感的人类来登录系统的,需要用来对应UID,例如root的UID对应的就是0(第三字段) -
密码
早期UNIX系统的密码就是放在这字段上,但是因为这个文件的特性是所有的程序都能够读取,这样一来很容易造成密码数据被窃取,因此后来就将这个字段的密码数据改放到/etc/shadow中了,所以这里会看到一个x -
UID
用户标识符。通常Linux对于UID有几个限制需要说明ID范围 该ID用户特性 0
(系统管理员)当UID是0时,代表这个帐号是系统管理员,所以当你要让其他的帐号名称也具有root权限时,将该帐号的UID改为0即可。因此,一台系统上面的系统管理员不见得只有root,不过,不建议有多个帐号的UID是0,容易让系统管理员混乱 1~999
(系统帐号)保留给系统使用的ID,其实除了0之外,其他的UID权限与特性并没有不一样。默认1000以下的数字留给系统作为保留帐号只是一个习惯。
由于系统上面启动的网络服务或后台服务希望使用较小的权限运行,因此不希望使用root的身份去执行这些服务,所以我们就得要提供这些运行中程序的拥有者帐号才行。这些系统帐号通常是不可登录的,所以才会有书中第10章提到的/sbin/nologin这个特殊的shell存在。
根据系统帐号的由来,通常这类帐号又大概被区分为两种:
- 1~200:由Linux发行版自行建立的系统帐号
- 201~999:若用户有系统帐号需求时,可以使用的帐号UID1000~60000
(可登录帐号)给一般用户使用。事实上,目前的Linux内核(3.10.x版)已经可以支持到4294967295(2^32-1)这么大的UID号码 -
GID
这个与/etc/group有关,其实/etc/group的概念与/etc/passwd差不多,只是它是用来规范组名与GID的对应而已。 -
用户信息说明栏
这个字段基本上并没有什么重要用途,只是用来解释这个帐号的意义而已。不过,如果您提供使用finger的功能时,这个字段可以提供很多的信息。书中后面的chfn命令会解释这里的说明 -
家目录
这是用户的家目录,以上面为例,root的家目录在/root,所以当root登录之后,就会立刻跑到/root目录里面。如果你有个帐号的使用空间特别大,你想要将该帐号的家目录移动到其他的硬盘该怎么做?没错,可以在这个字段进行修改。 -
shell
书中第10章BASH中多次提到,当用户登录系统后就会获取一个shell来与系统的内核沟通以进行用户的操作任务。那为何默认shell会使用bash呢?就是这个字段指定的。这里比较需要注意的是,有一个shell可以使帐号在登录时无法获得shell环境,那就是/sbin/nologin。这也可以用来制作纯pop邮件帐号的数据
-
-
/etc/shadow文件结构
我们知道很多程序的运行都与权限有关,而权限与UID和GID有关。因此各程序当然需要读取/etc/passwd来了解不同帐号的权限,因此/etc/passwd的权限需设置为-rw-r--r--这样的情况。虽然早期的密码也有加密过,但却放置到/etc/passwd的第二个字段上,这样一来很容易被有心人士窃取,加密过得密码也能通过暴力破解法去trial and error(试误)找出来。
因为这样的关系,后来发展出将密码移动到/etc/shadow这个文件分割开来的技术,而且还加入很多的密码限制参数在/etc/shadow里面。
基本上,shadow文件同样以:作为分隔符,如果数一数,会发现共有九个字段,这九个字段的用途如下:- 帐号名称
由于密码也需要与帐号对应,因此,这个文件的第一栏就是帐号,必须要与/etc/passwd相同才行。 - 密码
这个字段内的数据才是真正的密码,而且是经过编码的密码(摘要)。你只会看到有一些特殊符号的字母。需要特别留意的是,虽然这些加密过的密码很难被破解,但是很难不等于不会,所以这个文件的默认权限是-rw-------或是----------,即只有root才可以读写。你得随时注意,不要不小心修改了这个文件的权限。
另外,由于各种密码的编码的技术不一样,因此不同的编码系统会造成这个字段的长度不相同。举例来说,旧式的DES、MD5摘要算法产生的密码长度就与目前常用的SHA不同。SHA的密码长度明细那比较长些。由于固定的摘要算法产生的密码是特定的,因此当你修改这个字段后,该密码就会失效(算不出来)。很多软件通过这个功能,在此字段前加上!或*修改密码字段,就会让密码暂时失效 - 最近修改密码的日期
这个字段记录了修改密码那一天的日期,这里日期以1970年1月1日作为1而累加的日期。 - 密码不可被修改的天数(与第三字段相比)
第四个字段记录了这个帐号的密码在最近一次被更改后需要经过几天才可以再被修改。如果是0的话,表示密码随时可以修改,这个限制是为了怕密码被某些人一改再改而设计的。如果设置为20天的话,那么但那给你设置了密码之后,20天之内都无法再修改这个密码。 - 密码需要重新修改的天数(与第三字段相比)
经常修改密码是个好习惯。为了强制要求用户修改密码,这个字段可以指定在最近一次更改密码后,在多少天内需要再次修改密码才行。你必须要在这个天数内重新设置你的密码,否则这个帐号的密码将会变为过期特性。而如果像上面的99999(计算为273年)的话,那就表示密码的修改没有强制性之意。 - 密码需要修改期限前的警告天数(与第五字段相比)
当帐号的密码有效期限快要到的时候(第五字段),系统会根据这个字段的设置,发出警告信息给这个帐号,提醒它再过n天你的密码就要过期了,请尽快重新设置你的密码。 - 密码过期后帐号的宽限时间(密码失效日)(与第五字段相比)
密码有效日期为更新日期(第三字段)+重新修改日期(第五字段),过了该期限后用户依旧没有更新密码,那该密码就算过期了。虽然密码过期但是该帐号还是可以用来执行其他任务,包括登录系统获取bash。不过如果密码过期了,那当你登录系统是,系统会强制要求你必须要重新设置密码才能登录继续使用。 - 帐号失效日期
这个日期跟第三个字段一样,都是后使用1970年以来的总天数。这个字段表示:这个帐号在此字段规定的日期之后,将无法再使用。就是所谓的帐号失效,此时不论你的密码是否过期,这个帐号都不能再被使用。这个字段会被使用通常应该是在收费服务的系统中,你可以规定一个日期让该帐号不能再使用。 - 保留
最后一个字段是保留的
- 帐号名称