Linux用户和权限——用户和用户组管理
摘要:本文主要介绍了Linux系统中的用户和用户组管理。
用户和用户组
含义
在使用Linux系统时,虽然输入的是自己的用户名和密码,但其实Linux并不认识用户名称,它只认识用户名对应的ID号(也就是一串数字)。Linux系统将所有用户的名称与ID的对应关系都存储在/etc/passwd文件中。说白了,用户名并无实际作用,仅是为了方便用户的记忆而已。
Linux系统中,每个用户的ID细分为2种,分别是用户ID(UserID,简称UID)和组ID(GroupID,简称GID),这与文件有拥有者和拥有群组两种属性相对应。
每个文件都有自己的拥有者ID和群组ID,当显示文件属性时,系统会根据/etc/passwd和/etc/group文件中的内容,分别找到UID和GID对应的用户名和群组名,然后显示出来。
忘记密码怎么办
对于普通账户的密码遗失,可以通过root账户解决,它会重新给你配置好指定账户的密码,而不需知道你原有的密码(利用root的身份使用passwd命令即可)。
如果root账号的密码遗失,则需要重新启动进入单用户模式,系统会提供root权限的bash接口,此时可以用passwd命令修改账户密码;也可以通过挂载根目录,修改/etc/shadow,将账户的root密码清空的方法,此方式可使用root无法密码即可登陆,建议登陆后使用passwd命令配置root密码。
保存用户数据的/etc/passwd文件
Linux系统中的/etc/passwd文件,是系统用户配置文件,存储了系统中所有用户的基本信息,并且所有用户都可以对此文件执行读操作。
首先我们来打开这个文件,看看到底包含哪些内容,执行命令如下:
1 [root@localhost ~]# cat /etc/passwd 2 root:x:0:0:root:/root:/bin/bash 3 bin:x:1:1:bin:/bin:/sbin/nologin 4 ... 5 [root@localhost ~]#
可以看到,/etc/passwd文件中的内容非常规律,每行记录对应一个用户。
这些用户中的绝大多数是系统或服务正常运行所必需的用户,这种用户通常称为系统用户或伪用户。系统用户无法用来登录系统,但也不能删除,因为一旦删除,依赖这些用户运行的服务或程序就不能正常执行,会导致系统问题。
不仅如此,每行用户信息都以“:”作为分隔符,划分为七个字段:
1 用户名:密码:UID(用户ID):GID(组ID):描述性信息:主目录:默认Shell
用户名
用户名,就是一串代表用户身份的字符串,用户名仅是为了方便用户记忆,Linux系统是通过UID来识别用户身份,分配用户权限的。/etc/passwd文件中就定义了用户名和UID之间的对应关系。
密码
“x”表示此用户设有密码,但不是真正的密码,真正的密码保存在/etc/shadow文件中,此文件只有root用户可以浏览和操作,这样就最大限度地保证了密码的安全。
需要注意的是,虽然“x”并不表示真正的密码,但也不能删除,如果删除了“x”,那么系统会认为这个用户没有密码,从而导致只输入用户名而不用输入密码就可以登陆(只能在使用无密码登录,远程是不可以的),除非特殊情况(如破解用户密码),这当然是不可行的。
UID
全称“User ID”,也就是用户ID。每个用户都有唯一的一个UID,Linux系统通过UID来识别不同的用户。
实际上,UID就是一个0~65535之间的数,不同范围的数字表示不同的用户身份:
1)0:超级用户。UID为0就代表这个账号是管理员账号。在Linux中,只需把其他用户的UID修改为0就可以了,这一点和Windows是不同的,不过不建议建立多个管理员账号。
2)1~499:系统用户(伪用户)。也就是说,此范围的UID保留给系统使用。其中,1~99用于系统自行创建的账号,100~499分配给有系统账号需求的用户。其实,除了0之外,其他的UID并无不同,这里只是默认500以下的数字给系统作为保留账户,只是一个公认的习惯而已。
3)500~65535:普通用户。通常这些UID已经足够用户使用了。但不够用也没关系,2.6.x内核之后的Linux系统已经可以支持232个UID了。
GID
全称“Group ID”,也就是组ID,表示用户初始组的组ID号。这里需要解释一下初始组和附加组的概念。
初始组,指用户登陆时就拥有这个用户组的相关权限。每个用户的初始组只能有一个,通常就是将和此用户的用户名相同的组名作为该用户的初始组。比如说,我们手工添加用户sam,在建立用户sam的同时,就会建立sam组作为sam用户的初始组。
附加组,指用户可以加入多个其他的用户组,并拥有这些组的权限。每个用户只能有一个初始组,除初始组外,用户再加入其他的用户组,这些用户组就是这个用户的附加组。附加组可以有多个,而且用户可以有这些附加组的权限。
举例来说,刚刚的sam用户除属于初始组sam外,我又把它加入了users组,那么sam用户同时属于sam组和users组,其中sam是初始组,users是附加组。
当然,初始组和附加组的身份是可以修改的,但是我们在工作中不修改初始组,只修改附加组,因为修改了初始组有时会让管理员逻辑混乱。
需要注意的是,在/etc/passwd文件的第四个字段中看到的ID是这个用户的初始组。
描述性信息
这个字段并没有什么重要的用途,只是用来解释这个用户的意义而已。
主目录
也就是用户登录后有操作权限的访问目录,通常称为用户的主目录。
例如,root超级管理员账户的主目录为/root,普通用户将在/home/目录下建立和用户名相同的目录作为主目录,如sam用户的主目录就是/home/sam/目录。
默认的Shell
Shell就是Linux的命令解释器,是用户和Linux内核之间沟通的桥梁。
我们知道,用户登陆Linux系统后,通过使用Linux命令完成操作任务,但系统只认识类似0101的机器语言,这里就需要使用命令解释器。也就是说,Shell命令解释器的功能就是将用户输入的命令转换成系统可以识别的机器语言。
通常情况下,Linux系统默认使用的命令解释器是bash(/bin/bash),当然还有其他命令解释器,例如sh、csh等。
在/etc/passwd文件中,大家可以把这个字段理解为用户登录之后所拥有的权限。如果这里使用的是bash命令解释器,就代表这个用户拥有权限范围内的所有权限。
sam用户使用的是bash命令解释器,那么这个用户就可以使用普通用户的所有权限,例如:
1 [root@localhost ~]# vim /etc/passwd 2 sam:x:502:502::/home/sam:/bin/bash
如果sam用户的Shell命令解释器是/sbin/nologin,那么,这个用户就不能登录了,因为/sbin/nologin就是禁止登录的Shell,例如:
1 [root@localhost ~]# vim /etc/passwd 2 sam:x:502:502::/home/sam:/sbin/nologin
保存用户密码的/etc/shadow文件
/etc/shadow文件,用于存储Linux系统中用户的密码信息,又称为“影子文件”。
前面介绍了/etc/passwd文件,由于该文件允许所有用户读取,易导致用户密码泄露,因此Linux系统将用户的密码信息从/etc/passwd文件中分离出来,并单独放到了此文件中。
/etc/shadow文件只有root用户拥有读权限,其他用户没有任何权限,这样就保证了用户密码的安全性。注意,如果这个文件的权限发生了改变,则需要注意是否是恶意攻击。
介绍此文件之前,先打开看看,执行如下命令:
1 [root@localhost ~]# cat /etc/shadow 2 root:$6$yZkTv2VHvJfZft5s$XaKB9Jp6cRNEsdFKsYvQlmwmckbhvEDcFN/dDY1MpHLsx2w99Xn5lYvoQbkh6GU/DTx8ewq0xns1CQRbOXU1j/::0:99999:7::: 3 bin:*:16659:0:99999:7::: 4 ... 5 [root@localhost ~]#
同/etc/passwd文件一样,文件中每行代表一个用户,同样使用“:”作为分隔符,不同之处在于,每行用户信息被划分为九个字段。每个字段的含义如下:
1 用户名:加密密码:最后一次修改时间:最小修改时间间隔:密码有效期:密码需要变更前的警告天数:密码过期后的宽限时间:账号失效时间:保留字段
用户名
同/etc/passwd文件的用户名有相同的含义。
加密密码
这里保存的是真正加密的密码。目前Linux的密码采用的是SHA512散列加密算法,原来采用的是MD5或DES加密算法。SHA512散列加密算法的加密等级更高,也更加安全。
注意,这串密码产生的乱码不能手工修改,如果手工修改,系统将无法识别密码,导致密码失效。
所有伪用户的密码都是“!!”或“*”,代表没有密码是不能登录的。当然,新创建的用户如果不设定密码,那么它的密码项也是“!!”,代表这个用户没有密码,不能登录。
最后一次修改时间
此字段表示最后一次修改密码的时间。Linux计算日期的时间是以1970年1月1日作为1不断累加得到的时间。
最小修改时间间隔
最小修改间隔时间,也就是说,该字段规定了从第三个字段(最后一次修改密码的日期)起,多长时间之内不能修改密码。如果是0,则密码可以随时修改,如果是10,则代表密码修改后10天之内不能再次修改密码。
此字段是为了针对某些人频繁更改账户密码而设计的。
密码有效期
经常变更密码是个好习惯,为了强制要求用户变更密码,这个字段可以指定距离第三个字段(最后一次更改密码)多长时间内需要再次变更密码,否则该账户密码进行过期阶段。
该字段的默认值为99999,也就是273年,可认为是永久生效。如果改为90,则表示密码被修改90天之后必须再次修改,否则该用户即将过期。管理服务器时,通过这个字段强制用户定期修改密码。
密码需要变更前的警告天数
与第5字段相比较,当账户密码有效期快到时,系统会发出警告信息给此账户,提醒用户“再过n天你的密码就要过期了,请尽快重新设置你的密码!”。
该字段的默认值是7,也就是说,距离密码有效期的第7天开始,每次登录系统都会向该账户发出“修改密码”的警告信息。
密码过期后的宽限天数
也称为“口令失效日”,简单理解就是,在密码过期后,用户如果还是没有修改密码,则在此字段规定的宽限天数内,用户还是可以登录系统的,如果过了宽限天数,系统将不再让此账户登陆,也不会提示账户过期,是完全禁用。
比如说,此字段规定的宽限天数是10,则代表密码过期10天后失效;如果是0,则代表密码过期后立即失效;如果是-1,则代表密码永远不会失效。
账号失效时间
同第3个字段一样,使用自1970年1月1日以来的总天数作为账户的失效时间。该字段表示,账号在此字段规定的时间之外,不论你的密码是否过期,都将无法使用。
该字段通常被使用在具有收费服务的系统中。
保留
这个字段目前没有使用,等待新功能的加入。
保存用户组数据的/ect/group文件
/ect/group文件是用户组配置文件,即用户组的所有信息都存放在此文件中。此文件是记录组ID(GID)和组名相对应的文件。
/etc/group文件的内容可以通过Vim看到:
1 [root@localhost ~]# cat /etc/group 2 root:x:0: 3 bin:x:1: 4 ... 5 [root@localhost ~]#
可以看到,此文件中每一行各代表一个用户组。
各用户组中,还是以“:”作为字段之间的分隔符,分为四个字段,每个字段对应的含义为:
1 组名:密码:GID(组ID):该用户组中的用户列表
组名
也就是是用户组的名称,有字母或数字构成。同/etc/passwd中的用户名一样,组名也不能重复。
组密码
和/etc/passwd文件一样,这里的“x”仅仅是密码标识,真正加密后的组密码默认保存在/etc/gshadow文件中。
用户设置密码是为了验证用户的身份,用户组密码主要是用来指定组管理员的,由于系统中的账号可能会非常多,root用户可能没有时间进行用户的组调整,这时可以给用户组指定组管理员,如果有用户需要加入或退出某用户组,可以由该组的组管理员替代root进行管理。但是这项功能目前很少使用,也很少设置组密码。如果需要赋予某用户调整某个用户组的权限,则可以使用sudo命令代替。
GID
就是群组的ID号,Linux系统就是通过GID来区分用户组的,同用户名一样,组名也只是为了便于管理员记忆。
这里的组GID与/etc/passwd文件中第四个字段的GID相对应,实际上,/etc/passwd文件中使用GID对应的群组名,就是通过此文件对应得到的。
组中的用户
此字段列出每个群组包含的所有用户。需要注意的是,如果该用户组是这个用户的初始组,则该用户不会写入这个字段,可以这么理解,该字段显示的用户都是这个用户组的附加用户。
一般情况下,用户的初始组就是在建立用户的同时建立的和用户名相同的组。
保存用户组密码的/etc/gshadow文件
前面讲过,/etc/passwd文件存储用户基本信息,同时考虑到账户的安全性,将用户的密码信息存放另一个文件/etc/shadow中。本节要将的/etc/gshadow文件也是如此,组用户信息存储在/etc/group文件中,而将组用户的密码信息存储在/etc/gshadow文件中。
首先,我们借助Vim命令查看一下此文件中的内容:
1 [root@localhost ~]# cat /etc/gshadow 2 root::: 3 bin::: 4 ... 5 [root@localhost ~]#
文件中,每行代表一个组用户的密码信息,各行信息用“:”作为分隔符分为四个字段,每个字段的含义如下:
1 组名:加密密码:组管理员:组附加用户列表
组名
同/etc/group文件中的组名相对应。
组密码
对于大多数用户来说,通常不设置组密码,因此该字段常为空,但有时为“!”,指的是该群组没有组密码,也没有群组管理员。
组管理员
从系统管理员的角度来说,该文件最大的功能就是创建群组管理员。
考虑到Linux系统中账号太多,而超级管理员root可能比较忙碌,因此当有用户想要加入某群组时,root或许不能及时作出回应。这种情况下,如果有群组管理员,那么他就能将用户加入自己管理的群组中,也就免去麻烦root了。
不过,由于目前有sudo之类的工具,因此群组管理员的这个功能已经很少使用了。
组中的附加用户
该字段显示这个用户组中有哪些附加用户,和/etc/group文件中附加组显示内容相同。