Linux用户与权限管理

由于Linux是多用户、多任务系统,出于一些需要,当我们创建的文件希望对一部分用户开放,对一部分用户隐藏的时候应该怎么办呢?这样的话,就需要涉及到Linux系统中对用户以及对文件权限的管理。

一、相关文件

Linux中,一切配置文件都是以文本文档的方式来保存的,同样用户的信息也保存在系统的一些文件中,其位置为/etc/passwd。此文件只有root用户具有查看与修改权限,以保证用户信息的安全性。下面介绍一下passwd文件中的一些具体内容。

  

passwd.PNG

从上图中可以看到,文件中的每一行都代表系统中的一个用户,而且每一行都具有相同的格式,包含7个字段,每个字段的具体含义如下图所示:

  

-etc-passwd文件结构.PNG

在第二列中存放的为账号的密码,但可以看到每个账户都是x,这是由于系统处于安全考虑,将用户密码单独存放在/etc/shadow文件中,打开shadow文件,可以看到以下信息。

blob.png

我们以root的密码行来看一下shadow文件中的每一行都包含什么内容。

-etc-shadow文件结构.PNG

在内容中,包含很多与密码有关的时间概念,我们来详细叙述一下:

    • 最近一次修改密码的时间:以上一次修改密码的时间距离197011日的天数来表示;

    • 密码最短使用期限:表示密码修改完成后,在此期限内不得修改密码;

    • 密码最长使用期限:即为到达此期限后,需要修改密码;

    • 警告时间:在密码到期前的此期限内,会提示用户修改密码;

    • 密码失效日期:超出密码最长使用期限后,用户在此期限内登录系统时,系统会强制用户更改密码,但此期限内账户不会被锁定;

    • 账号失效日期:以距离197011日的天数来表示,到达此期限后,用户账号将失效;

了解了passwd中第二字段密码的相关内容后,在第三字段表示的是用户的UID。在Linux中,对用户的识别是依靠UID来完成的,系统对于不同用户的UID有不同的划分。管理员的UID0,也就是说,只要用户的UID0,其便拥有root权限。在CentOS7中,系统用户的UID1999,普通用户为100065535

GIDpasswd文件中第四字段的内容,其代表用户的基本组。组在Linux权限管理中是一个重要的概念,当我们需要一类用户具有一些相同的权限时,可以将这些用户划分为一个用户组,统一管理。对于同一个用户,其可以属于多个组,但在这些组中,只有一个是属于用户的基本组,其余组我们称为用户的附属组。系统中用户的组的信息存放在/etc/group文件中,文件内容包含组名称、组密码、GID、以此组为附属组的用户列表四部分。除了/etc/group外,还有文件/etc/gshadow同样存放着用户组的信息,包含组名称、组密码、组管理员、以此组为附属组的用户列表四项内容。

二、用户管理

介绍了用户与用户组的相关概念后,那么具体我们应该如何在系统中创建一个新的用户呢?可以使用useradd命令,其具体用法如下:

useradd [options] LOGIN

       我们对命令中一些比较重要的选项做一下介绍:

  -u,–uid UID:直接指定一个特定的UID给此账号

  -o:配合-u选项,不检查UID的唯一性

  -g,–gid GROUP:直接指定用户的基本组

  -G,–groups GROUP1[,GROUP2][,GROUP3]…[,GROUPN]:指定用户的(一个或多个)附加组

  -m,–creat-home:强制!要创建用户主文件夹(一般账号默认值)

  -M,–no-create-home:强制!不要创建用户主文件夹(系统账号默认值)

  -N:不创建私有组做基本组,使用users组做主组

  -c,–comment COMMENT:给定用户的注释内容(/etc/passwd文件中第五列)

  -d,–home-dir HOME_DIR:指定用户的主文件夹(必须使用绝对路径),不使用默认值

  -r,–system:创建一个系统账号

  -s,–shell SHELL:指定用户的shell

  -e,–expiredate EXPIRE_DATE:后面接一个日期,格式为"YYYY-MM-DD",此选项可写入/etc/shadow第八字段,即账号失效日期的设置

  -f,–inactive INACTIVE:设置密码过期后的账号宽限时间(/etc/shadow第七字段),0为过期后立刻失效,-1为过期后永不失效(密码只会过期而强制与登录时重新设置而已)

了解了useradd的语法与相关选项后,我们使用此命令创建一个如下要求的用户:用户名为centosUID=1500,基本组为g1,附属组为g2g3,账号注释信息为centos7.2,用户shell/bin/csh,账号失效日期为201711日。

useradd.PNG

 除了我们单独定义的一些选项,那么在创建新用户时,系统又会使用哪些默认配置呢?我们可以通过useradd –D来进行查看。

useradd-D.PNG

同样的,对于新建用户的密码,系统同样有一些默认配置保存在文件/etc/login.defs中,可以自行查看。

在创建了用户后,我们一般需要对密码进行一些设置,这时,我们一般使用到的命令为passwd,下面对此命令做一些介绍:

passwd [-k] [-l] [-u [-f]] [-d] [-e] [-n mindays] [-x maxdays] [-w warndays] [-i inactivedays] [-S] [–stdin] [username]

–stdin:可以通过来自前一个管道的数据,作为密码输入

-l,–lock:锁定用户,会在/etc/shadow第二列最前面加上!使密码失效

-u,–unlock:解锁锁定用户

-S:列出密码相关参数,即/etc/shadow文件内的大部分信息

-n,–minimum DAYS:后面接天数,密码的最短使用期限;/etc/shadow中第4字段

-x,–maximum DAYS:后面接天数,密码的最长使用期限;/etc/shadow中第5字段

-w,–warning DAYS:后面接天数,密码过期前的警告天数;/etc/shadow中第6字段

-i,–inactive DAYS:后面接天数,密码的失效日期;/etc/shadow中第7字段

-e,–expire:令密码失效,即用户下次登录时强制更改密码

现在,我们对centos用户的密码进行如下设置:密码为centos7,最短使用期限为3天,最长使用期限为60天,在密码过期前5天发出警告,超出密码最长使用期限后将在10天后失效。

passwd-1.PNG

有些时候,我们需要对用户的一些设置进行更改,如shell类型、家目录等。那么,我们就需要使用usermod命令来进行这些更改,此命令的具体用法如下:

    usermod [options] LOGIN

-c,–comment COMMENT:后接账号的说明,即/etc/passwd第五列的说明,可以加入一些账号的说明

-d,–home HOME_DIR:后面接账号的主文件夹,即修改/etc/passwd的第六列

-e,–expiredate EXPIRE_DATE:后面接日期,格式是YYYY-MM-DD,也就是在/etc/shadow内的第八个字段数据(账号失效日期)

-f,–inactive INACTIVE:后面接天数,为shadow的第七字段(密码失效日期)

-g,–gid GROUP:后面接用户基本组(可以为组名,也可为GID),修改/etc/passwd的第四个字段,即GID字段

-G,–groups GROUP1[,GROUP2][,GROUP3]…[,GROUPN]:后面接用户附加组,可修改用户的附加组

-a,–append:与-G结合使用,可增加用户的附加组而非修改

-l,–login NEW_LOGIN:后面接账号名称以修改用户名称

-L,–lock:锁定用户密码,使其无法登陆(即在/etc/shadow的密码前加!

-U,–unlock:解锁锁定用户(即将/etc/shadow中密码前的!去掉)

-s,–shell SHELL:修改用户的shell类型

-u,–uid UID:修改用户的UID

下面我们用此命令来对centos用户进行一些修改,将其用户名更改为centos7UID=1600,默认shell/bin/bash,注释信息更改为Linux centos7,家目录为/testdir/centos7,增加附属组root,并将账号失效日期设为201761日。

usermod.PNG

       当我们出于需要需删除一些用户时,就要使用到userdel命令了,其用法如下:

userdel [options] LOGIN

-r,–remove:连同用户的主文件夹一并删除

三、用户组管理

在上面我们介绍到用户属组的概念,每个用户可以属于多个组,但当我们新建一个文件时,此文件的属组应该属于用户的哪个组呢?在这里就要涉及到用户有效组了。

当用户创建文件时,文件的属组其实是用户当前的有效组,默认情况下,用户的基本组即为用户的有效组,但我们可以通过chgrp命令来切换用户的基本组。

blob.png

但在此,需要注意用户切换的有效组只能是用户的属组,而且通过mewgrp命令切换有效组是通过重新开启一个shell来提供的,所以在回到原来环境时,需要输入exit推出。

了解了用户有效组后,下面来看一下在系统内对用户组的相关操作。在新建用户组时,我们通过groupadd命令来实现,并可以在创建时定义相关属性。使用groupmod命令修改用户组的相关属性;在删除用户组时使用groupdel命令;下面看一下三个命令的相关内容。

groupadd [options] group

-g,–gid GID:后面接某个特定的GID,用来指明GID

-r,–system:新建系统用户组

groupmod [options] GROUP

-g,–gid GID:修改用户组的GID

-n,–new-name NEW_NAME:修改用户组的组名

groupdel [options] GROUP

我们通过实际应用来看一下这三个命令在系统中的具体实现,

group.PNG

但需要注意的是,通过groupdel命令是不可以删除用户的基本组的。

我们知道用户组是用来管理具有相同权限的一类用户的,那么对于对组内用户的管理便应该成为组管理的重点。我们通过gpasswd命令来对用户组的成员与密码进行管理。

gpasswd [option] group

-a,–add USER:将某位用户加入到用户组中(组管理员可用)

-d,–delete USER:将某位用户移出用户组(组管理员可用)

-A,–adeministrators USER,…:设置有管理权限的用户列表(用户组管理员,用户组管理员可以不属于此用户组)

-M,–members USER,…:将某些账号加入到用户组当中

-r,–remove-password:删除用户组的密码

-R,–restrict:使用户组的密码失效

现在,我们要通过此命令实现如下的功能,将用户myuser2加入到组grouptest中,将用户myuser3从组中移除,并将myuser1设为组管理员;

gpasswd.PNG

四、文件权限管理

设置用户与组的目的是为了更好的管理权限,那么在了解了系统中组和用户的管理后,我们来看一下对文件权限的一些管理。当我们用ls查看文件属性时,可以看到如下的内容,每段内容均有其对应的含义。

       

文件属性示意图.PNG

对于文件来说,用户分为属主,属组与其他用户三类,对于每类用户分别分配不同的权限。从上图可以看到,每类用户分别有三位权限位,分别为:r(read)w(write)x(execute)。需要注意的是,此三类权限对于文件与目录的意义是不完全一样的。

对于文件来说,

r:可读取此文件的实际内容

w:可以编辑、新增或者是修改该文件的内容(但不含删除该文件)

x:该文件具有可以被系统执行的权限

对于目录而言,

r–read contents in directory:具有读取目录结构列表的权限,但无法获取目录内文件的详细信息;

w–modify contents of directory:具有更改目录结构列表的权限,包括:新建新的文件和目录;删除已经存在的文件或目录(不论该文件的权限如何);将已存在的文件或目录重命名;转移该目录内的文件、目录位置;

x–access directory:具有进入该目录成为工作目录的权限;如果用户对某目录不具有x权限,那么就无法切换到该目录下,也就无法执行该目录下的任何命令,即使具有该目录的r权限;

假如对于权限位按照二进制进行标定,具有相应权限位的权限标定为1,不具有相应权限位的权限标定为0,则每类用户的权限都只有以下八种,我们可以用八进制数来分表代表每一类用户权限:

       

八进制权限.PNG

了解了以上权限相关内容,下面来看如何对文件权限进行管理,涉及到一个比较重要的命令——chmod,来看一下其具体用法:

chmod [OPTION]… MODE[,MODE]… FILE…

chmod [OPTION]… OCTAL-MODE FILE…

chmod [OPTION]… –reference=RFILE FILE…

-R,–recursive:进行递归的持续修改,即连同子目录下的所有文件都会更改

上面我们介绍了权限的各种表示方法,那么同样,对于权限的修改,我们也有以下几种表达方式:

Ø  直接对某类用户进行赋权

  u=[r][w][x],g=[r][w][x],o=[r][w][x],ug=[r][w][x],uo=[r][w][x],go=[r][w][x],a=[r][w][x]

Ø  对某类用户的权限位进行更改

  u[+-][s][r][w][x],g[+-][s][r][w][x],o[+-][s][r][w][x],ug[+-][s][r][w][x],uo[+-][s][r][w][x],go[+-][s][r][w][x],a[+-][s][r][w][x]

其中在给用户赋予x权限时,可使用大写X,其代表特定意义:只给目录执行权限,不给文件执行权限,在递归修改目录的权限时比较有用,避免赋予目录下的文件执行权限

Ø  数字赋权

  xyzx–用八进制数字表示的属主权限;y–用八进制数字表示的属组权限;z–用八进制数字表示的其他用户权限;

注:在使用+更改权限的情况下,只要是没有被指定到的选项,则该权限不会变动;[]代表其内的内容可选;其中s代表特殊权限,后面详述;

现在加入需要对文件赋予644的权限,我们可以使用以下方法:

chmod.PNG

五、umask

了解了权限更改,那么对于新建文件,系统默认会赋予什么样的权限呢,这里就牵涉到umask的概念了。我们先通过umask命令查看一下root用户的umask

       

umask.PNG

那么umask具体代表什么含义呢?我么就以rootumask=022来讨论(第一位0对应为特殊权限,在此先不讨论)。前面我们说了可以以八进制数据来表示,那么022代表的就是—-w–w-。当我们创建新文件时,就将最大权限的相应权限位去除即为系统默认权限。需要注意的是,由于普通文件默认是没有执行权限的,所以新建文件时的最大权限是666rw-rw-rw-),目录为777rwxrwxrwx)。因此新建文件的默认权限就应该为rw-r–r–=644,新建目录的默认权限应为rwxr-xr-x=755,我们来看一下:

umask默认权限.PNG

了解了umask的作用机制后,我们来看一下如何查看与设定用户的umask

umask [-p] [-S] [mode]

-p:输出可被调用,比如可被管道命令作为标准输入使用

-S:以符号形式显示默认权限

umask:以数字形式显示umask

umask 数字形式的umask:直接设定umask

umask -S 符号形式的默认权限:直接设定默认权限

六、文件属主与属组

在理解了文件的基础权限后,我们看一下文件的属主与属组,其在上述文件属性的第三与第四字段。我们已经知道文件的权限分配分为属主权限,属组权限与其他用户权限。那么又该如何管理文件的属主与属组呢?有以下两个命令:

chgrp – change group ownership 改变文件所属用户组

chgrp [OPTION]… –reference=RFILE FILE…

-R,–recursive:进行递归持续更改,即连同目录下的所有文件与子目录

chown – change file owner and group 改变文件所有者与所有组

chown [OPTION]… [OWNER][:[GROUP]] FILE…

chown [OPTION]… –reference=RFILE FILE..

-R,–recursive:进行递归的持续更改,即连同目录下的所有文件与子目录

注:chown OWNER: FILE 修改文件的所有者,并将文件的所有组修改为与属主同名的组;chown :GROUP FILE 只修改文件的所有组

现在我们将属主与属组皆为root的文件更改为属主为centos7,属组为group1

       

chown.PNG

七、特殊权限

Linux系统中,任何一个可执行程序文件能不能启动为进程,取决于发起者对程序文件是否拥有执行权限;启动为进程之后,其进程的属主为进程发起者,进程的属组为为进程发起者的属组;进程访问文件时的权限,取决于进程的发起者,进程的发起者,同文件的属主,则应用文件属主权限;若属于文件属组,则应用文件属组权限;其他情况,应用文件的其他用户权限。那么假如一些文件只对属主或属组有权限,但又需要其他用户在执行某些命令时能够对该文件具有属主或属组的权限应该怎么办呢?这里就需要能够了解文件的特殊权限——SUIDSGIDSTICKY

       

blob.png

当我们查看某些目录或文件时,会看到权限位有非rwx-的字符,这些就是文件的特殊权限。先来看一下SUID

SUID仅对二进制程序有效,首先要求执行者对于该程序需要具有x可执行权限,当赋予特殊权限时执行者将具有该程序所有者的权限,但特殊权限仅在执行该程序的过程中有效。SUID目录是无效的而且不能够用在shell script上面,因为shell script只是将很多的二进制执行文件调进来执行而已。所以SUID的权限部分,还是要看shell script调用进来的程序的设置,而不是shell script本身。

SUID不同,SGID针对文件和目录都可使用。但对两者使用的意义不完全一样。

当对文件使用时,其同样只对二进制程序有效,而且执行者对于该程序需要具有x的执行权限,满足上述条件后,那么执行者在执行的过程中将会获得该程序所属用户组的权限。

当对目录使用时,若用户对于此目录具有rx的权限时,该用户能够进入此目录,用户在此目录下的有效用户组将会变成该目录的用户组,若用户在此目录下还具有w的权限,则用户所创建的新文件的用户组与此目录的用户组相同。

而对于STIKY,其仅对目录有效,其作用效果为,当用户对此目录具有wx权限时,用户在该目录下创建的文件或目录,仅有自己与root才有权利删除该文件。

对于特殊权限,我们同样可以使用八进制数来表示

       八进制特殊权限位.PNG

了解了特殊权限后,那么该如何设置特殊权限呢?有两种方法:

第一种是直接赋权:chmod [u+s] [g+s] [o+t] FILE

第二种是数字赋权:chmod abcd FILE

    其中,a代表特殊权限位的八进制数字,bcd代表标准权限位的八进制数字。

八、ACL

现在,我们知道,对于文件而言,权限的分配分为属主,属组与其他用户三类;假如需要让一些用户拥有除属主,属组,其他人之外的一些权限,这时候就需要用到ACL——访问控制列表了。那么如何设置与查看ACL呢,主要用到以下两个命令:

setfacl – set file access control lists 设置文件访问控制列表

setfacl [-bkndRLPvh] [{-m|-x} acl_spec] [{-M|-X} acl_file] file …

setfacl –restore=file

-m,–modify:设置后续的acl参数给文件使用,不可与-x合用

-x,–remove:删除后续的acl参数,不可与-m合用

-b:删除所有的ACL设置参数

-k:删除默认的ACL参数

-R:递归设置ACL,亦即包括子目录都会被设置起来

-d:设置默认的ACL参数,只对目录有效,在该目录新建的数据会引用此默认值

复制file1ACL权限给file2

getfacl file1 | setfacl –restore=file2

ACL参数格式:

针对特定用户的方式: u:[用户账号列表]:[r][w][x];当无用户账号列表时,代表设置该文件所有者;

针对特定用户组的方式: g:[用户组列表]:[r][w][x];当无用户组列表时,代表设置该文件所属组;

针对有效权限mask的设置方式: m:[r][w][x]

针对默认权限的设置方式: d:[ug]:用户|用户组列表:[r][w][x];对目录进行默认权限设置后,可以让这些属性继承到子目录下面;

需要注意的是:ACL文件上存在的mask值,其影响除所有者和other的之外的人和组的最大权限,mask与用户的权限进行逻辑与运算后,才能变成有效的权限(effective permission)也就是说用户或组的设置必须存在于mask权限设定范围内才会生效。

getfacl – get file access control lists 查看文件访问控制列表

getfacl [-aceEsRLPtpndvh] file …

getfacl [-aceEsRLPtpndvh] –

现在假如我们需要对新建目录dir进行权限分配为rwxr-x—,使其本身与其下新建的文件属组均为group1,而且要求group2的成员对此目录及其内的文件具有rwx权限。

setfacl.PNG

原创文章,作者:luoliumeng,如若转载,请注明出处:http://www.178linux.com/29106

评论列表(1条)

  • 马哥教育
    马哥教育 2016-08-08 21:00

    文章整体结构层次清晰,有理论有实践,图文并貌。

联系我们

400-080-6560

在线咨询

工作时间:周一至周五,9:30-18:30,节假日同时也值班

QR code