摘要:本文主要介绍了Linux系统中的用户和用户组管理。算法
在使用Linux系统时,虽然输入的是本身的用户名和密码,但其实Linux并不认识用户名称,它只认识用户名对应的ID号(也就是一串数字)。Linux系统将全部用户的名称与ID的对应关系都存储在/etc/passwd文件中。说白了,用户名并没有实际做用,仅是为了方便用户的记忆而已。vim
Linux系统中,每一个用户的ID细分为2种,分别是用户ID(UserID,简称UID)和组ID(GroupID,简称GID),这与文件有拥有者和拥有群组两种属性相对应。安全
每一个文件都有本身的拥有者ID和群组ID,当显示文件属性时,系统会根据/etc/passwd和/etc/group文件中的内容,分别找到UID和GID对应的用户名和群组名,而后显示出来。bash
对于普通帐户的密码遗失,能够经过root帐户解决,它会从新给你配置好指定帐户的密码,而不需知道你原有的密码(利用root的身份使用passwd命令便可)。服务器
若是root帐号的密码遗失,则须要从新启动进入单用户模式,系统会提供root权限的bash接口,此时能够用passwd命令修改帐户密码;也能够经过挂载根目录,修改/etc/shadow,将帐户的root密码清空的方法,此方式可以使用root没法密码便可登录,建议登录后使用passwd命令配置root密码。工具
Linux系统中的/etc/passwd文件,是系统用户配置文件,存储了系统中全部用户的基本信息,而且全部用户均可以对此文件执行读操做。加密
首先咱们来打开这个文件,看看到底包含哪些内容,执行命令以下:spa
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文件中的内容很是规律,每行记录对应一个用户。设计
这些用户中的绝大多数是系统或服务正常运行所必需的用户,这种用户一般称为系统用户或伪用户。系统用户没法用来登陆系统,但也不能删除,由于一旦删除,依赖这些用户运行的服务或程序就不能正常执行,会致使系统问题。code
不只如此,每行用户信息都以“:”做为分隔符,划分为七个字段:
1 用户名:密码:UID(用户ID):GID(组ID):描述性信息:主目录:默认Shell
用户名,就是一串表明用户身份的字符串,用户名仅是为了方便用户记忆,Linux系统是经过UID来识别用户身份,分配用户权限的。/etc/passwd文件中就定义了用户名和UID之间的对应关系。
“x”表示此用户设有密码,但不是真正的密码,真正的密码保存在/etc/shadow文件中,此文件只有root用户能够浏览和操做,这样就最大限度地保证了密码的安全。
须要注意的是,虽然“x”并不表示真正的密码,但也不能删除,若是删除了“x”,那么系统会认为这个用户没有密码,从而致使只输入用户名而不用输入密码就能够登录(只能在使用无密码登陆,远程是不能够的),除非特殊状况(如破解用户密码),这固然是不可行的。
全称“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了。
全称“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就是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文件,用于存储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文件是用户组配置文件,即用户组的全部信息都存放在此文件中。此文件是记录组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命令代替。
就是群组的ID号,Linux系统就是经过GID来区分用户组的,同用户名同样,组名也只是为了便于管理员记忆。
这里的组GID与/etc/passwd文件中第四个字段的GID相对应,实际上,/etc/passwd文件中使用GID对应的群组名,就是经过此文件对应获得的。
此字段列出每一个群组包含的全部用户。须要注意的是,若是该用户组是这个用户的初始组,则该用户不会写入这个字段,能够这么理解,该字段显示的用户都是这个用户组的附加用户。
通常状况下,用户的初始组就是在创建用户的同时创建的和用户名相同的组。
前面讲过,/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文件中附加组显示内容相同。