高性能Linux服务器运维实战:shell编程、监控告警、性能优化与实战案例
上QQ阅读APP看书,第一时间看更新

3.1 Linux用户权限管理

3.1.1 用户与用户组管理

1.用户与角色分类

在Linux下用户是根据角色定义的,具体分为3种角色。

➢ 超级用户:拥有对系统的最高管理权限,默认是root用户。

➢ 普通用户:只能对自己目录下的文件进行访问和修改,具有登录系统的权限,例如,WWW用户、FTP用户等。

➢ 虚拟用户:也叫“伪”用户,这类用户最大的特点是不能登录系统,它们的存在主要是方便系统管理,满足相应的系统进程对文件属主的要求。例如,系统默认的bin、adm、nobody用户等

2.用户和组以及关系

Linux是一个多用户多任务的分时操作系统,如果要使用系统资源,就必须向系统管理员申请一个账户,然后通过这个账户进入系统。这个账户和用户是一个概念,通过建立不同属性的用户,一方面可以合理地利用和控制系统资源,另一方面也可以帮助用户组织文件,提供对用户文件的安全性保护。

每个用户都有一个唯一的用户名和用户口令,在登录系统时,只有正确输入了用户名和密码,才能进入系统和自己的主目录。

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

用户和用户组的对应关系有:一对一、一对多、多对一和多对多,如图3-1所示。

图3-1 用户和用户组的对应关系

➢ 一对一:即一个用户可以存在一个组中,也可以是组中的唯一成员。

➢ 一对多:即一个用户可以存在多个用户组中,此用户具有多个组的共同权限。

➢ 多对一:多个用户可以存在一个组中,这些用户具有和组相同的权限。

➢ 多对多:多个用户可以存在多个组中,其实就是上面3个对应关系的扩展。

3.用户和组相关的配置文件

(1)/etc/passwd文件

/etc/passwd文件是系统用户配置文件,是用户管理中最重要的一个文件。这个文件记录了Linux系统中每个用户的一些基本属性,并且对所有用户可读。/etc/passwd中每一行记录对应一个用户,每行记录又被冒号分割,其格式和具体含义如下:

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

/etc/passwd文件的部分输出如下:

/etc/passwd每个字段的详细含义如下所述。

➢ 用户名:是代表用户账号的字符串。

➢ 口令:存放着加密后的用户口令,虽然这个字段存放的只是用户口令的加密串,不是明文,但是由于/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。

(2)/etc/shadow文件

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

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

/etc/shadow文件的部分输出如下:

/etc/shadow每个字段的详细含义如下所述。

➢ 用户名:与/etc/passwd文件中的用户名有相同的含义。

➢ 加密口令:存放的是加密后的用户口令字串,如果此字段是*、!、x等字符,则对应的用户不能登录系统。

➢ 最后一次修改时间:表示从某个时间起,到用户最近一次修改口令的间隔天数。可以通过passwd来修改用户的密码,然后查看/etc/shadow中此字段的变化。

➢ 最小时间间隔:表示两次修改密码之间的最小时间间隔。

➢ 最大时间间隔:表示两次修改密码之间的最大时间间隔,这个设置能增强管理员管理用户的时效性。

➢ 警告时间:表示从系统开始警告用户到密码正式失效之间的天数。

➢ 不活动时间:此字段表示用户口令作废多少天后,系统会禁用此用户,也就是说系统不再让此用户登录,也不会提示用户过期,是完全禁用。

➢ 失效时间:表示该用户的账号生存期,超过这个设定时间,账号失效,用户就无法登录系统了。如果这个字段的值为空,账号永久可用。

➢ 保留字段:Linux的保留字段,目前为空,以备Linux日后发展之用。

(3)/etc/group文件

/etc/group文件是用户组配置文件,用户组的所有信息都存放在此文件中。/etc/group文件内容的格式:

组名:口令:组标识号:组内用户列表

/etc/group的部分输出如下:

/etc/group每个字段的详细含义如下所述。

➢ 组名:是用户组的名称,由字母或数字构成。与/etc/passwd中的用户名一样,组名不能重复。

➢ 口令:存放的是用户组加密后的口令字串,密码默认设置在/etc/gshadow文件中,而在这里用x代替。Linux系统下默认的用户组都没有口令,可以通过gpasswd来给用户组添加密码。

➢ 组标识号:就是GID,与/etc/passwd中的组标识号对应。

➢ 组内用户列表:显示属于这个组的所有用户,多个用户之间用逗号分隔。

(4)/etc/login.defs文件

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

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

(5)/etc/default/useradd文件

当通过useradd命令不加任何参数创建一个用户后,用户默认的主目录一般位于/home下,默认使用的shell是/bin/bash,这是为什么呢?看看/etc/default/useradd这个文件的内容就完全明白了。

/etc/default/useradd文件定义了新建用户的一些默认属性,如用户的主目录、使用的shell等,通过更改此文件,可以改变创建新用户的默认属性值。

改变此文件有两种方法,一种是通过文本编辑器方式更改,另一种是通过useradd命令来更改。这里介绍一下第2种方法。

Useradd命令加-D参数就可以修改配置文件/etc/default/useradd了,使用的一般格式为:

每个选项详细含义如下所述。

➢ -g default_group:表示新建用户的起始组名或者GID,组名必须为已经存在的用户组名称,GID也必须是已经存在的用户组GID。与/etc/default/useradd文件中GROUP行对应。

➢ -b default_home:指定新建用户主目录的上级目录,也就是所有新建用户都会在此目录下创建自己的主目录。与/etc/default/useradd文件中HOME行对应。

➢ -s default_shell:指定新建用户默认使用的shell,与/etc/default/useradd文件中SHELL行对应。

➢ -f default_inactive:指定用户账号过期多长时间后就永久停用,与/etc/default/useradd文件中INACTIVE行对应。

➢ -e default_expire_date:指定用户账号的过期时间。与/etc/default/useradd文件中EXPIRE行对应。

举例如下。

useradd-D不加任何参数时,显示/etc/default/useradd文件的当前设置:

如果要修改添加用户时的默认shell为/bin/csh,可以如下操作:

(6)/etc/skel目录

在创建一个新用户后,会在新用户的主目录下看到类似.bash_profile、.bashrc、.bash_logout等文件,这些文件是怎么来的呢?如果想让新建立的用户在主目录下默认拥有自己指定的配置文件,该如何设置呢?

/etc/skel目录解决了这个问题。/etc/skel目录定义了新建用户在主目录下默认的配置文件,更改/etc/skel目录下的内容就可以改变新建用户默认主目录的配置文件信息。

3.1.2 添加、切换和删除用户组命令groupadd/newgrp/groupdel 1.groupadd命令

groupadd命令用来新建一个用户组。语法格式为:

各个选项具体含义如下所述。

➢ -g:指定新建用户组的GID号,该GID号必须唯一,不能和其他用户组的GID号重复。

➢ -o:一般与-g选项同时使用,表示新用户组的GID可以与系统已有用户组的GID相同。

例如,创建一个linuxfans的用户组和一个fanslinux用户组,GID分别为1020和1030。

2.newgrp命令

如果一个用户同时属于多个用户组,那么用户可以在用户组之间切换,以便具有其他用户组的权限。newgrp主要用于在多个用户组之间进行切换,语法格式为:

下面通过实例讲述newgrp的用法。

首先建立了3个用户组group1、group2和group3。

下面创建了一个用户user1,同时指定user1的主用户组为group1,附加用户组为group2和group3。

对用户user1设置密码。

切换到user1用户下,通过newgrp切换用户组进行的一系列操作,从中可以看出newgrp的作用。

3.groupdel命令

groupdel命令表示删除用户组,语法格式为:

当需要从系统上删除用户组时,可用groupdel命令来完成这项工作。如果该用户组中仍包括某些用户,则必须先删除这些用户后,才能删除用户组。

例如,删除linuxfans这个用户组。

3.1.3 添加、修改和删除用户命令useradd/usermod/userdel

1.useradd建立用户的过程

useradd不加任何参数创建用户时,系统首先读取添加用户配置文件/etc/login.defs和/etc/default/useradd,根据这两个配置文件中定义的规则添加用户。然后会向/etc/passwd和/etc/group文件添加用户和用户组记录,同时/etc/passwd和/etc/group对应的加密文件也会自动生成记录。接着系统会自动在/etc/default/useradd文件设定的目录下建立用户主目录。最后复制/etc/skel目录中的所有文件到新用户的主目录中,这样一个新的用户就建立完成了。

2.useradd的使用语法

useradd语法的一般格式为:

各个选项具体含义如下所述。

➢ -u uid:即用户标识号,此标识号必须唯一。

➢ -g group:指定新建用户登录时所属的默认组,或者叫主组。此群组必须已经存在。

➢ -G group:指定新建用户的附加组,此群组必须已经存在。附加组是相对于主组而言的,当一个用户同时是多个组中的成员时,登录时的默认组称为主组,而其他组称为附加组。

➢ -d home:指定新建用户的默认主目录,如果不指定,系统会在/etc/default/useradd文件指定的目录下创建用户主目录。

➢ -s shell:指定新建用户使用的默认shell,如果不指定,系统以/etc/default/useradd文件中定义的shell作为新建用户的默认shell。

➢ -c comment:对新建用户的说明信息。

➢ -f inactive:指定账号过期多长时间后永久停用。当值为0时账号则立刻被停权;而当值为-1时则关闭此功能。预设值为-1。

➢ -e expire:指定用户的账号过期时间,日期的指定格式为MM/DD/YY。

➢ name:指定需要创建的用户名。

3.usermod的使用语法

usermod用来修改用户的账户属性信息,使用语法如下:

各个选项具体含义如下所述。

➢ -u uid:指定用户新的UID值,此值必须为唯一的ID值,除非用-o选项。

➢ -g group:修改用户所属的组名为新的用户组名,此用户组名必须已经存在。

➢ -G group:修改用户所属的附加组。

➢ -d主目录:修改用户登录时的主目录。

➢ -s shell:修改用户登录系统后默认使用的shell。

➢ -c注释:修改用户的注释信息。

➢ -l新名称:修改用户账号为新的名称。

➢ -f失效日:账号过期多少天后永久禁用。

➢ -e过期日:增加或修改用户账户的过期时间。

➢ -L:锁定用户密码,使密码无效。

➢ -U:解除密码锁定。

➢ Name:要修改属性的系统用户。

4.userdel的使用语法

userdel用来删除一个用户,若指定-r参数不但删除用户,同时删除用户的主目录以及目录下的所有文件。语法格式为:

5.应用举例

1)添加一个用户mylinux,指定所属的主用户组为fanslinux,附加用户组为linuxfans,同时指定用户的默认主目录为/opt/mylinux。

2)添加一个用户test_user,指定UID为686,默认的shell为/bin/csh,让其归属为用户组linuxfans和fanslinux,同时添加对此用户的描述。

3)修改用户test_user的主用户组为新建的组test_group1,同时修改test_user的附加组为linuxfans和root,最后修改test_user的默认登录shell为/bin/bash。

4)如何锁定、解除用户密码。

首先对test_user和mylinux用户设置密码:

下面的操作是通过su命令切换到mylinux用户下,然后在mylinux下再次切换到test_user用户下。这里的切换用户是为了说明一个问题:从超级用户root切换到普通用户下,是不需要输入普通用户密码的,系统也不会去验证密码。但普通用户之间切换是需要密码验证的。

接下来,在root用户下执行usermod锁定test_user的密码,测试test_user是否还能登录,从下面可以看出,密码锁定后,出现登录失败。

最后对test_user解除密码锁定,登录正常。

3.1.4 文件的权限属性解读

所谓的文件权限是指对文件的访问权限,包括对文件的读、写、删除、执行等。在Linux下,每个用户都具有不同的权限,普通用户只能在自己的主目录下进行写操作,而在主目录之外,普通用户只能进行查找、读取操作。如何处理好文件权限和用户之间的关系是本节讲述的重点。

在Linux中常见的几种文件类型如下所述。

➢ 普通文件(-表示)。

➢ 目录(d表示)。

➢ 字符设备文件(c)。

➢ 块设备文件(b)。

➢ 套接字文件(s)。

➢ 管道(p)。

➢ 符号链接文件(l)。

➢ .代表当前目录。

➢ ..代表上级目录。

使用ls命令就可以查看文件以及目录的权限信息。不带任何参数的ls命令只显示文件名称,通过ls-al可以显示文件或者目录的权限信息,看下面的输出:

为了能更详细的介绍上面输出中每个属性的含义,图3-2列出了oradata文档每列代表的含义。

图3-2 文档属性图

下面通过具体的实例讲述每列代表的含义。

1)第1列显示文档类型与权限,由10个字符组成,分为4个部分,下面将文档oradata权限分解,如图3-3所示。

图3-3 文档类型与权限结构图

接着对每个部分解释如下。

➢ 文档类型部分:当为d时,表示目录;当为l时表示软链接;当为-时表示文件;当为c时表示串行端口字符设备文件;当为b时表示可供存储的块设备文件。由此可知,oradata是一个目录。

在接下来的3个部分中,3个字符为一组,每个字符的含义为:r表示只读,即read;w表示可写,即write;x表示可执行,即execute;-表示无此权限,即为空。

➢ User部分:第2部分是对文档所有者(User)权限的设定,rwx表示用户对oradata目录有读、写和执行的所有权限。

➢ Group部分:第3部分是对文档所属用户组(Group)权限的设定,r-x表示用户组对oradata目录有读和执行的权限,但是没有写的权限。

➢ Others部分:第4部分是对文档拥有者之外的其他用户权限的设定,r--表示其他用户或用户组对oradata目录只有读的权限。

文档的操作权限是可以指定和更改的,通过chmod命令即可更改文件或者目录的权限。

2)第2列显示的是文档的连接数,这个连接数就是硬链接的概念,即多少个文件指向同一个索引节点,举例如下:

从上面可以看出,install.log文件原始的连接数是1,然后做了两个硬链接操作,install.log文件的连接数变为3,这就是连接数的含义。

3)第3列显示了文档所属的用户和用户组,也就是文档是属于哪个用户以及哪个用户组所有。例如,上面的oradata目录,所属的用户为oracle,所属的组为oinstall组。文件所属的用户和组是可以更改的,通过chown命令就可以修改文档的用户属性。

4)第4列显示的是文档的大小,默认显示的是以bytes为单位,但是也可以通过命令的参数修改显示的单位。例如,可以通过ls-sh组合人性化地显示文档的大小。对于目录,通常只显示文件系统默认block的大小。

5)第5列显示文档最后一次的修改日期,通常以月、日、时、分的方式显示,如果文档修改时间距离现在已经很远了,会使用月、日、年的方式显示。

6)第6列显示的是文档名称,Linux下以.开头的文件是隐藏文件,同理以.开头的目录是隐藏目录,隐藏文档只有通过ls命令的-a选项才能显示。例如,上例中的.createtablespace.pl文件就是一个隐藏文件。

3.1.5 利用chown改变属主和属组

chown就是change owner的意思,主要作用就是改变文件或者目录的所有者,而所有者包含用户和用户组,其实chown就是对文件所属的用户和用户组进行的一系列设置。

chown使用的一般语法为:

参数说明如下。

-R:进行递归式的权限更改,也就是将目录下的所有文件、子目录都更新成为指定的用户组权限。常常用于变更某一目录的情况。

注意,在执行操作前,确保指定的用户以及用户组在系统中是存在的。

例如,修改隐藏文件.createtablespace.pl的所属用户为oracle,所属的用户组为oinstall,操作如下:

注意,这里要确保oracle用户和oinstall组已经存在。

修改oradata目录以及目录下的所有文件的所属用户为root,用户组为dba组,操作过程如下:

3.1.6 利用chmod改变访问权限

chmod用于改变文件或目录的访问权限。该命令有两种用法。一种是包含字母和操作符表达式的字符设定法;另一种是包含数字的数字设定法。

1.字符设定法

字符设定法的使用语法为:

命令中各选项的含义如下所述。

1)who表示操作对象,可以是下面字母中的任何一个或者它们的组合。

➢ u:表示用户(user),即文件或目录的所有者。

➢ g:表示用户组(group),即文件或目录所属的用户组。

➢ o:表示其他(others)用户。

➢ a:表示所有(all)用户。它是系统默认值。

2)操作符号含义如下所述。

➢ +:表示添加某个权限。

➢ -:表示取消某个权限。

➢ =:表示赋予给定的权限,同时取消文档以前的所有权限。

3)mode表示可以执行的权限,可以是r(只读)、w(可写)和x(可执行),以及它们的组合。

4)文件名可以是以空格分开的文件列表,支持通配符。

例如,修改install.log文件,使其所有者具有所有权限,用户组和其他用户具有只读权限:

修改/etc/fstab文件的权限,使其所有者具有读写权限,用户组和其他用户没有任何权限:

2.数字设定法

首先了解一下用数字表示属性的含义。0表示没有任何权限;1表示有可执行权限,与上面字符表示法中的x有相同的含义;2表示有可写权限,与w对应;4表示有可读权限,对应与r。

如果想让文件的属主拥有读和写的权限,可以通过4(可读)+2(可写)=6(可读可写)的方式来实现,那么用数字6就表示拥有读写权限。

使用语法:

数字设定法的实现原理如图3-4所示。

图3-4 数字设定法的实现原理

从图中可以清晰地看出,755组合的代表含义。第1个7显示了文件所有者的权限,是通过4(r)+2(w)+1(x)=7(rwx)而得到的;第2个5显示了文件所属组的权限,是通过4(r)+0(-)+1(x)=5(rx)而得到的;同理最后一个5也有类似的含义。

例如,某个文件mysqltuner.pl的默认权限为600,即-rw-------,表示只有此文件的所有者(User)拥有读写权限,其他用户(Others)和组(Group)没有对此文件访问的任何权限。

首先修改此文件的权限为644,即-rw-r--r--,表示此文件的所有者(User)拥有读写权限,而其他用户(Others)和组(Group)仅仅拥有读的权限,操作如下:

然后修改mysqltuner.pl文件的权限为755,即-rwxr-xr-x,表示此文件的所有者(User)拥有读写执行权限,而其他用户(Others)和组(Group)拥有对此文件的读和执行权限。