Linux下的用户和用户组

一、用户和用户组

1、Linux下的用户分类

  • 超级用户:拥有对系统的最高管理权限,默认是root用户。
  • 普通用户:只能对自己目录下的文件进行访问和修改,具有登录到系统的权限。
  • 虚拟用户:这类用户最大的特点是不能登录系统,它们的存在主要是方便系统管理,满足相应的系统进程对文件属主的要求。例如系统默认的bin、adm、nobody用户等,一般运行的web服务,默认就是使用的nobody用户,但是nobody用户是不能登录系统的。

2、用户组的概念

用户组是具有相同特征用户的逻辑集合,又是我们需要让多个用户具有相同的权限,比如查看、修改某一文件的权限,一种方法是对多个用户进行访问授权,如果有10个用户的话,就需要授权10次,显然这种方法不太合理;另一种方法是建立一个组,让这个组具有查看、修改此文件的权限,然后将所有需要访问此文件的用户放入这个组中,那么所有用户就具有了和组一样的权限。这就是用户组,将用户分组是Linux 系统中对用户进行管理及控制访问权限的一种手段,通过定义用户组,在很大程度上简化了管理工作。

3、用户和用户组的关系

  • 一对一:一个用户存在一个组中,即用户是组的唯一成员
  • 一对多:一个用户可以存在多个用户组中,此用户有多个组的共同权限
  • 多对一:多个用户组可以存在一个组中,这些用户具有和组共同的权限
  • 多对多:多个用户可以存在多个组中,即上述关系的扩展

二、配置文件

1、用户和组的配置文件

(1)/etc/passwd文件

系统用户信息文件,记录了每个用户的基本属性。

格式:“用户名:口令:用户标识号:组标识号:注释描述:主目录:默认shell”

含义

  • 用户名:是代表用户账号的字符串。
  • 口令:存放着加密后的用户口令,这个字段存放的只是用户口令的加密串,不是明文,但是由于/etc/passwd文件对所有用户都可读,所以这仍是一个安全隐患。因此,现在许多Linux 版本都使用了shadow技术,把真正加密后的用户口令存放到/etc/shadow文件中,而在/etc/passwd文件的口令字段中只存放一个特殊的字符,例如用“x”或者“*”来表示。
  • 用户标识号:就是用户的UID,每个用户都有一个UID,并且是唯一的,通常UID号的取值范围是0~65535,0是超级用户root的标识号,1~99由系统保留,作为管理账号,普通用户的标识号从100开始。而在Linux系统中,普通用户UID默认从500开始。UID是linux下确认用户权限的标志,用户的角色和权限都是通过UID来实现的,因此多个用户公用一个UID是非常危险的,会造成系统权限和管理的混乱,例如将普通用户的UID设置为0后,这个普通用户就具有了root用户的权限,这是极度危险的操作。因此要尽量保持用户UID的唯一性。
  • 组标识号:就是组的GID,与用户的UID类似,这个字段记录了用户所属的用户组。它对应着/etc/group文件中的一条记录。
  • 注释性描述:字段是对用户的描述信息,比如用户的住址、电话、姓名等等。
  • 主目录:也就是用户登录到系统之后默认所处的目录。
  • 默认shell:用户登录系统后默认使用的命令解释器,shell是用户和linux内核之间的接口,用户所作的任何操作,都是通过shell传递给系统内核的。linux下常用的shell有sh、bash、csh等,管理员可以根据用户的习惯,为每个用户设置不同的shell。

例子:

root:x:0:0:root:/root:/bin/bash 
bin:x:1:1:bin:/bin:/sbin/nologin 
admin1:x:500:500::/home/admin1:/bin/bash 
admin2:x:501:500::/home/admin2:/bin/bash 
ftp1:x:502:50::/var/ftp/ftp1:/sbin/nologin 
ftp2:x:503:50::/var/ftp/ftp2:/sbin/nologin

(2)/etc/shadow文件

用户加密咨询文件。由于/etc/passwd文件是所有用户都可读的,这样就导致了用户的密码容易出现泄露,因此,linux将用户的密码信息从/etc/passwd中分离出来,单独的放到了一个文件中,这个文件就是/etc/shadow,该文件只有root用户拥有读权限,从而保证了用户密码的安全性。

格式:“用户名:加密口令:最后一次修改时间:最小时间间隔:最大时间间隔:警告时间:不活动时间:失效时间:保留字段”

含义

  • 用户名:与/etc/passwd文件中的用户名有相同的含义。
  • 加密口令:存放的是加密后的用户口令字串,如果此字段是“*”、“!”、“x”等字符,则对应的用户不能登录系统。
  • 最后一次修改时间:表示从某个时间起,到用户最近一次修改口令的间隔天数。可以通过passwd 来修改用户的密码,然后查看/etc/shadow中此字段的变化。
  • 最小时间间隔:表示两次修改密码之间的最小时间间隔。
  • 最大时间间隔:表示两次修改密码之间的最大时间间隔,这个设置能增强管理员管理用户的时效性。
  • 警告时间:表示从系统开始警告用户到密码正式失效之间的天数。
  • 不活动时间:此字段表示用户口令作废多少天后,系统会禁用此用户,也就是说系统不再让此用户登录,也不会提示用户过期,是完全禁用。
  • 失效时间:表示该用户的帐号生存期,超过这个设定时间,帐号失效,用户就无法登录系统了。如果这个字段的值为空,帐号永久可用。
  • 保留字段:linux的保留字段,目前为空,以备linux日后发展之用。

例子:

root:$6$I7qDSp4rrR2ptx3n$Io8gSanh6ekWXufjCfNYP9qIrav2BebLtwElGAsBSH8USUhGD7HS7rcIwZIMq3MZ9rUj74RQfD6VAd5Zp9z9T.:15445:0:99999:7::: 
bin:*:15240:0:99999:7::: 
admin1:$6$KBSNBizW$YD2/.eej7mvFbka/cl8MwMUaEgzE9JG216T4gBHAanP9r8XQe7mbveoMM3rtIGa/LKGSqNAVqOEfs8d7RpeGF/:15446:0:99999:7:::

(3)/etc/group文件

用户组信息文件,保存用户组的信息

格式:“组名:口令:组标识号:组内用户列表”

含义

组名:是用户组的名称,由字母或数字构成。与/etc/passwd中的用户名一样,组名不能重复。 
口令:存放的是用户组加密后的口令字串,密码默认设置在/etc/gshadow文件中,而在这里用“x”代替,linux系统下默认的用户组都没有口令,可以通过gpasswd来给用户组添加密码。 
组标识号:就是GID,与/etc/passwd中的组标识号对应。 
组内用户列表: 显示属于这个组的所有用户,多个用户之间用逗号分隔。

例子

root:x:0:root 
bin:x:1:root,bin,daemon 
admin:x:500:

(4)/etc/gshadow

用户组加密资讯文件,保存了用户组密码一类的信息。。/etc/gshadow和/etc/group是互补的两个文件;对于大型服务器,针对很多用户和组,定制一些关系结构比较复杂的权限模型,设置用户组密码是极有必要的。比如我们不想让一些非用户组成员永久拥有用户组的权限和特性,这时我们可以通过密码验证的方式来让某些用户临时拥有一些用户组特性,这时就要用到用户组密码。

格式:“组名:口令:组管理者:组成员”

含义

组名:用户组名称

口令:存放的是用户组密码的加密口令,如果是空的或者是!表示没有密码。

用户组管理者:也可以为空,如果有多个管理这,之间用','隔开。

组成员:如果有多个成员用','隔开。

例子

bin:::root,bin,daemon 
admin:!::

2、其他目录和文件

(1)etc/login.defs文件

用来定义创建一个用户时的默认设置,比如指定用户的UID和GID的范围,用户的过期时间、是否需要创建用户主目录等等。

下面是rhel5下的/etc/login.defs文件,简单介绍如下:

MAIL_DIR /var/spool/mail 
当创建用户时,同时在目录/var/spool/mail中创建一个用户mail文件 
PASS_MAX_DAYS 99999 
#指定密码保持有效的最大天数 
PASS_MIN_DAYS 0 
表示自从上次密码修改以来多少天后用户才被允许修改口令 
PASS_MIN_LEN 5 
指定密码的最小长度 
PASS_WARN_AGE 7 
表示在口令到期前多少天系统开始通知用户口令即将到期 
UID_MIN 500 
指定最小UID为500 ,也就是说添加用户时,用户的UID 从500开始 
UID_MAX 60000 
指定最大UID为60000 
GID_MIN 500 
指定最小GID为500,也就是添加组时,组的GID从500开始。 
GID_MAX 60000 
指定最大GID为60000 
CREATE_HOME yes 
此项是指定是否创建用户主目录,yes为创建,no为不创建。

(2)/etc/skel目录

/etc/skel目录定义了新建用户在主目录下默认的配置文件,更改/etc/skel目录下的内容就可以改变新建用户默认主目录的配置文件信息,例如创建一个新用户后,会在新用户的主目录下看到类似.bash_profile, .bashrc, .bash_logout等文件,这些文件就是存在于/etc/skel目录下的。

(3)/etc/default/useradd文件

useradd 添加用户时的规则文件,当我们通过useradd命令不加任何参数创建一个用户后,用户默认的主目录一般位于/home下,默认使用的shell是/bin/bash,这些都是在/etc/default/useradd文件中定义的。更改此文件可以更改添加用户的默认配置,除此方法外还可以通过adduser命令的参数来实现。

内容如下:

GROUP=100 
HOME=/home :把用户的家目录建在/home中 
INACTIVE=-1 :是否启用帐号过期停权,-1表示不启用 
EXPIRE= :帐号终止日期,不设置表示不启用 
SHELL=/bin/bash :所用SHELL的类型 
SKEL=/etc/skel :默认添加用户的目录默认文件存放位置;也就是说,当我们用adduser添加用户时,用户家目录下的文件,都是从这个目录中复制过去的

三、用户和用户组的管理

1、用户的管理命令

  • useradd :添加用户
  • adduser :添加用户
  • passwd :为用户设置密码
  • usermod :修改用户命令,可以通过usermod 来修改登录名、用户的家目录等等
  • pwcov :同步用户从/etc/passwd 到/etc/shadow
  • pwck :pwck是校验用户配置文件/etc/passwd 和/etc/shadow 文件内容是否合法或完整
  • pwunconv :是pwcov 的立逆向操作,是从/etc/shadow和 /etc/passwd 创建/etc/passwd ,然后会删除 /etc/shadow 文件
  • finger :查看用户信息工具
  • id :查看用户的UID、GID及所归属的用户组
  • chfn :更改用户信息工具
  • su :用户切换工具
  • sudo :sudo 是通过另一个用户来执行命令(execute a command as another user),su 是用来切换用户,然后通过切换到的用户来完成相应的任务,但sudo 能后面直接执行命令,比如sudo 不需要root 密码就可以执行root 赋与的执行只有root才能执行相应的命令;但得通过visudo 来编辑/etc/sudoers来实现
  • visudo :visodo 是编辑 /etc/sudoers 的命令;也可以不用这个命令,直接用vi 来编辑 /etc/sudoers 的效果是一样的
  • sudoedit :和sudo 功能差不多

2、用户组管理命令

  • groupadd :添加用户组
  • groupdel :删除用户组
  • groupmod :修改用户组信息
  • groups :显示用户所属的用户组
  • grpck :检查/etc/group文件和/etc/gshadow文件,检查数据是否正确存放
  • grpconv :通过/etc/group和/etc/gshadow 的文件内容来同步或创建/etc/gshadow ,如果/etc/gshadow 不存在则创建
  • grpunconv :通过/etc/group 和/etc/gshadow 文件内容来同步或创建/etc/group ,然后删除gshadow文件

四、linux的超级用户

1、超级用户概念与重要性

在所有Linux系统中,系统都是通过UID来区分用户权限级别的,而UID为0的用户被系统约定为是具有超级权限。超级用户具有在系统约定的最高权限范围内操作,所以说超级用户可以完成系统管理的所有工作。我们可以通过/etc/passwd 来查得UID为0的用户是root,而且只有root对应的UID为0,从这一点来看,root用户在系统中是无可替代的至高地位和无限制权限。root用户在系统中就是超级用户。

在系统中,每个文件、目录和进程,都归属于某一个用户,没有用户许可其它普通用户是无法操作的,但对root除外。root用户的特权性还表现在root可以超越任何用户和用户组来对文件或目录进行读取、修改或删除(在系统正常的许可范围内);对可执行程序的执行、终止;对硬件设备的添加、创建和移除等;也可以对文件和目录进行属主和权限进行修改,以适合系统管理的需要(因为root是系统中权限最高的特权用户)。

与超级用户相对的就是普通用户和虚拟(也被称为伪装用户),普通和伪装用户都是受限用户,但为了完成特定的任务,普通用户和伪装用户也是必须的。Linux是一个多用户、多任务的操作系统,多用户主要体现在用户的角色的多样性,不同的用户所分配的权限也不同,这也是Linux系统比Windows系统更为安全的本质所在。

由于超级权限在系统管理中的不可缺少的重要作用,为了完成系统管理任务,我们必须用到超级权限;在一般情况下,为了系统安全,对于一般常规级别的应用,不需要root用户来操作完成,root用户只是被用来管理和维护系统之用;比如系统日志的查看、清理,用户的添加和删除。

在不涉及系统管理的工作的环境下,普通用户足可以完成,比如编写一个文件,听听音乐;用gimp 处理一个图片等...... 基于普通应用程序的调用,大多普通用户就可以完成。

当我们以普通权限的用户登录系统时,有些系统配置及系统管理必须通过超级权限用户完成,比如对系统日志的管理,添加和删除用户。而如何才能不直接以root登录,却能从普通用户切换到root用户下才能进行操作系统管理需要的工作,这就涉及到超级权限管理的问题。

获取超级权限的过程,就是切换普通用户身份到超级用户身份的过程;这个过程主要是通过su和sudo来解决。

2、超级用户在系统管理中的作用

(1)对任何文件、目录或进程进行操作

但这种操作是在系统最高许可范围内的操作,有些操作就是具有超级权限的root也无法完成。比如/proc 目录,/proc 是用来反应系统运行的实时状态信息的,因此即便是root也无法对其进行写操作。

(2)对于涉及系统全局的系统管理

硬件管理、文件系统管理、用户管理以及涉及到的系统全局配置等等......如果执行某个命令或工具时,提示无权限,大多是需要超级权限来完成,比如用adduser来添加用户,这个只能用通过超级权限的用户来完成。

3、超级用户的授权

(1)su命令

su命令就是切换用户的工具。比如我们以普通用户beinan登录的,但要添加用户任务,执行useradd ,beinan用户没有这个权限,而这个权限恰恰由root所拥有。解决办法无法有两个,一是退出beinan用户,重新以root用户登录,但这种办法并不是最好的;二是我们没有必要退出beinan用户,可以用su来切换到root下进行添加用户的工作,等任务完成后再退出root。我们可以看到当然通过su 切换是一种比较好的办法。通过su可以在用户之间切换,如果超级权限用户root向普通或虚拟用户切换不需要密码;而普通用户切换到其它任何用户都需要密码验证。

su 在不加任何参数,默认为切换到root用户,但没有转到root用户家目录下,也就是说这时虽然是切换为root用户了,但并没有改变root登录环境;用户默认的登录环境,可以在/etc/passwd 中查得到,包括家目录,SHELL定义等。

(2)sudo命令

su 的确为管理带来方便,通过切换到root下,能完成所有系统管理工具,只要把root的密码交给任何一个普通用户,他都能切换到root来完成所有的系统管理工作,但通过su切换到root后,也有不安全因素;比如系统有10个用户,而且都参与管理。如果这10个用户都涉及到超级权限的运用,做为管理员如果想让其它用户通过su来切换到超级权限的root,必须把root权限密码都告诉这10个用户;如果这10个用户都有root权限,通过root权限可以做任何事,这在一定程度上就对系统的安全造成了威协,我们绝对不能保证这10个用户都能按正常操作流程来管理系统,其中任何一人对系统操作的重大失误,都可能导致系统崩溃或数据损失,所以su 工具在多人参与的系统管理中,并不是最好的选择,su只适用于一两个人参与管理的系统,毕竟su并不能让普通用户受限的使用,这时最好是针对每个管理员的技术特长和管理范围,并且有针对性的下放给权限,并且约定其使用哪些工具来完成与其相关的工作,这时我们就有必要用到 sudo。

通过sudo,我们能把某些超级权限有针对性的下放,并且不需要普通用户知道root密码,所以sudo 相对于权限无限制性的su来说,还是比较安全的,所以sudo 也能被称为受限制的su ,另外sudo 是需要授权许可的,所以也被称为授权许可的su。

sudo 执行命令的流程是当前用户切换到root(或其它指定切换到的用户),然后以root(或其它指定的切换到的用户)身份执行命令,执行完成后,直接退回到当前用户,而这些的前提是要通过sudo的配置文件/etc/sudoers来进行授权。

(3)编写/etc/sudoers文件

sudo的配置文件是/etc/sudoers ,我们可以用他的专用编辑工具visodu ,此工具的好处是在添加规则不太准确时,保存退出时会提示给我们错误信息。配置好后,可以用切换到授权的用户下,通过sudo -l 来查看哪些命令是可以执行或禁止的。

/etc/sudoers 文件中每行算一个规则,前面带有#号可以当作是说明的内容,并不执行;如果规则很长,一行列不下时,可以用\号来续行,这样看来一个规则也可以拥有多个行。

/etc/sudoers 的规则可分为两类;一类是别名定义,另一类是授权规则;别名定义并不是必须的,但授权规则是必须的。

具体使用可以查看man sudoers。

猜你喜欢

转载自shiguanghui.iteye.com/blog/1991899