Part1.5——Linux系统中的权限管理

目录

一、权限查看及读取

1、权限查看

2、权限的读取

二、普通权限的类型及作用

1、用户对文件的身份

2、权限位

3、用户身份匹配

4、权限类型

三、设定普通权限的方法

chmod:设定文件权限

四、系统默认权限设定

1、为什么要设置默认权限?

2、umask:表示系统保留权力

 五、文件用户和用户组的管理

 六、特殊权限

 1、什么是特殊权限?

2、stickyid:粘制位

 3、sgid:强制位

4、suid:冒险位

 七、acl权限列表

 1、什么是acl权限列表?

2、acl列表开启标识

3、acl列表权限读取

4、acl列表的控制

5、acl权限优先级

6、acl列表的mask控制

 7、acl列表的默认权限

八、attr权限

九、总结


一、权限查看及读取

1、权限查看

ls -l file             #查看文件权限

ls -ld dir             #查看目录权限

2、权限的读取

文件的属性被称为文件的元数据(meta data),一种元数据用1个byte来记录内容。

ls -l a
>> -rw-rw-r--. 1 westos westos 0 Oct  5 11:03 a
ls -ld zzh/
>> drwxrwxr-x. 2 westos westos 6 Oct  5 11:04 zzh/

(1)文件权限信息:

-          rw-rw-r--       .     |     1     |    westos    |     westos    |    0    |     Oct  5 11:03     |    a

[1]             [2]              [3]        [4]             [5]                    [6]           [7]                 [8]                  [9]

(2)目录权限信息:

d        rwxrwxr-x       .         2       westos    |     westos    |   6       Oct  5 11:04     zzh/

[1]               [2]             [3]         [4]             [5]                 [6]             [7]                 [8]               [9]

(3)每一位代表含义:

[1]:文件类型

                < - >普通文件                <d>目录                <l>软连接                <b>块设备

                <c>字符设备                <s>socket套接字                <p>管道 |

[2]:用户权限        rw- |  r--  |  r-- 分别代表u(user)、g(group)、o(others)用户的权限。

[3]:系统的selinux开启

[4]:对于文件:文件内容被系统记录的次数(硬连接个数)

        对于目录:目录中子目录的个数

[5]:文件所有                

[6]:文件所有

[7]:对于文件:文件内容大小

        对于目录:目录中子文件的元数据大小             

[8]:文件内容被修改的时间

[9]:文件(或目录)名称

二、普通权限的类型及作用

1、用户对文件的身份

u:user,文件的所有者(也称拥有者)

g:group,文件的所有组(也称拥有组)

o:others,既不是拥有者也不是拥有组的其他用户的通称

2、权限位

  rxw     |     r--    |    r--

    u             g           o

3、用户身份匹配

user     group   >   other

4、权限类型

< - >:权限未开启

< r >:可读(read)

            对于文件:可以读取文件内容;对于目录,可以<ls>列出目录中的文件

< w >:可写(write)

            对于文件:可以更改文件内容;对于目录,可以在目录中新建或删除文件

< x >:可执行(execute)

             对于文件:可以用文件名称调用文件内记录的程序;对于目录:可以进入目录中

三、设定普通权限的方法

chmod:设定文件权限

(1)<chmod>复制权限

chmod --reference=/tmp /mnt/westosdir       
#复制/tmp目录的权限到/mnt/westosdir上

chmod -R  --reference=/tmp /mnt/westosdir        
#复制/tmp目录的权限到/mnt/westosdir及目录的子文件上,<-R>代表递归操作

chmod --reference=/tmp ./zzh      #复制/tmp目录的权限到./zzh上

这里可以看出,</tmp>目录的权限是<drwxrwxrwt>,新建的<zzh>文件夹的权限是<drwxr-xr-x>,使用此命令复制权限后,目录<zzh>的权限也变成了<drwxrwxrwt>,但是对目录下的文件的权限并没有改变。

chmod -R  --reference=/tmp ./zzh1        #复制/tmp目录的权限到./zzh1及目录的子文件上,<-R>代表递归操作

这里可以看出,此命令加上了参数<-R>,复制权限时也会让目录下的文件获得相同的权限

(2)<chmod>字符方式设定权限

chmod < a | u | g | o >< + | - | = >< r | w | x > file        #用字符方式设定权限

chmod   < a | u | g | o >< + | - | = >< r | w | x >   file        #用字符方式设定权限

例如:

chmod u-rw  ./test/test1                         #对文件<text1>的<u>位权限减去<rw>
chmod g+x ./test/test2                           #对文件<text2>的<g>位权限增加<x>
chmod o=wx ./test/test3                        #对文件<text3>的<o>位权限更改为<wx>
chmod a=rwx ./test/test4                       #对文件<text4>的所有位(即<u,g,o>位)权限更改为<rwx>
chmod u=rwx,g=---,o=rx ./test/test5     #对文件<text5>的<u>位权限更改为<rwx>、<g>位权限更改为<--->、<o>位权限更改为<rx>

chmod -R a=rx  ./test                    #对目录<test>及目录下所有文件的所有位(即<u,g,o>位)权限更改为<rx>

这里可以看出,经过此操作后,目录<test>和目录下的文件权限都更改为<r-xr-xr-x>

 chmod a=w  ./test                #对目录<test>的所有位(即<u,g,o>位)权限更改为<w>

这里因为没有设置参数<-R>,所以此操作仅对目录本身有效。

(3)<chmod>数字方式设定权限

权限布尔数(bool)指表示方式,即三位二进制数可以表示的范围,权限有则代表1,没有则代表0

rwx     = 111     = 7

rw-     = 110     = 6

r-x     = 101     = 5

r--     = 100     = 4        = r

-wx     = 011     = 3

-w-     = 010     = 2        = w

--x     = 001     = 1        =x

---     = 000     = 0

这样就可以把权限转化成相应的数字,可以更方便地进行权限管理。

这里先用<ls>命令查看<test>目录的属性,可以看出它的权限是<-w--w--w->,然后使用<chmod>命令把权限参数设置成<777>,意味着<u,g,o>都设置成了<rwx>,命令执行完后可以看到目录<test>的权限已经改为了<rwxrwxrwx>。

四、系统默认权限设定

1、为什么要设置默认权限?

答:系统本身存在的意义是共享资源,从安全角度讲系统共享的资源越少、开放的权力越小,系统的安全性就越高;因此既要保证系统安全,又要系统创造价值,就要把应该开放的权力默认开放,把不安全的权力默认保留。所以如何保留权力就需要系统管理人员设定。

2、umask:表示系统保留权力

(1)临时设定系统预留权力

umask                                #查看保留权力

umask 保留值                   #临时设定系统预留权力

注意:

目录默认权限 = 777 - <umask>

文件默认权限 = 777 - <umask> - 111(这里的111是内核设定值,记住就行)

这里先用<umask>查看系统预留权限是<0022>,第一位是特殊位,稍后会细讲,后三位“022”就是<u,g,o>分别预留的权限,所以预留的权限是<-,w,w>,使用<ls>命令查看新建的目录<testdir1> 的权限是<rwxr-xr-x>;接下来使用<umask 000>把系统保留权限设置为<000>,也就是说系统不再保留权限了,新建的目录<testdir2>的权限是<rwxrwxrwx>。

由于文件的默认权限要比目录的默认权限少<111>也就是三个位都缺少<xxx>,所以创建的文件<testfile1>的权限是<rw-r--r-->,修改保留权限为<000>后,创建的文件<testfile2>的权限是<rw-rw-rw->

 (2)永久更改系统预留权力

永久更改系统预留权力分为三步,涉及到对系统配置文件的更改,而且预留权力越大(也就是<umask>值越大,系统安全性越高),所以一般不轻易改变。这里简单介绍一下修改步骤。

第一步:更改shell系统配置文件

vim /etc/bashrc        #shell系统配置文件

使用<vim>命令更改配置文件</etc/bashrc>,定位到第74行左右,把if语句中else的值修改

74   if [ $UID -gt 199 ] && [ "`id -gn`" = "`id -un`" ]; then
75       umask 002                #普通用户的umask
76   else
77       umask 022                #root用户的umask
78   fi

这里改的是第77行:“<77       umask 022         #root用户的umask>”,把这一行的umask值从022改为其他值,修改后的值就是系统预留权力值。

第二步:更改系统环境配置文件

vim /etc/profile                #系统环境配置文件

使用<vim>命令更改配置文件</etc/profile>,定位到第60行左右,把if语句中else的值修改

59    if [ $UID -gt 199 ] && [ "`id -gn`" = "`id -un`" ]; then
60        umask 002             #普通用户的umask
61    else
62        umask 022             #root用户的umask
63    fi

这里改的是第62行:“<62      umask 022        #root用户的umask>”,把这一行的umask值从022改为其他值,修改后的值就是系统预留权力值。

第三步:重新加载以上两个文件
修改完成后,这里需要重新加载这两个文件才能生效。

source /etc/bashrc       

source /etc/profile

这里通过<vim>把以上两个配置文件的系统保留权力值改为<777>,也就是说系统保留了所有权力,然后重新加载这两个文件后使用<umask>查看“0777”,表示已经修改成功。新建一个目录<testdir2>,使用<ls>查看其权限可以看出,由于系统保留了所有权限,所以新建的这个目录显示没有任何权限<--- --- --->。

 五、文件用户和用户组的管理

chown username file                    #更改文件拥有者

chgrp groupname file                   #更改文件拥有组

chown username:groupname file          #同时更改文件的拥有者和拥有组

chown | chgrp -R username | groupname dir        
                                      #更改目录本身及目录中内容的拥有者或者拥有组

状态监视窗口显示目前系统中存在的用户及用户组,这里我在桌面上新建了三个文件和一个目录,可以看出新建的这些文件默认的用户是<root>默认的用户组也是<root>。

chown lee test1                                        #改变文件<test1>的用户为"lee"

chgrp linux test2                                       #改变文件<test2>的用户为“linux”

chown westoslee.westoslee test3        #改变文件<test3>的用户和用户组为“westoslee”

chown -R lee testdir        #更改目录<testdir >及其目录下所有文件的用户为“lee”

chgrp -R linux testdir        #更改目录<testdir>及其目录下所有文件的用户组为“linux”

这里分别执行了上述命令,从监控窗口可以看出,目录<testdir>及其目录下所有文件的用户已经改为“lee”,用户组改为“linux”。

 六、特殊权限

 1、什么是特殊权限?

答:特殊权限是直接控制<u,g,o>三位是否开启或关闭的符号位,与之前的“数字方式设置权限”类似,<u,g,o>三个位置的权限开启则表示1,关闭则表示0,所以<u,g,o>分别由<4,2,1>表示;特殊位是在普通位之前的那一位。

2、stickyid:粘制位

针对目录:如果一个目录的“stickyid”开启后,那么这个目录中的文件只能被所有人删除

(1)添加“stickyid”权限的方法:

chmod 1原始权限 dir

chmod o+t dir

(2)小实验:

第一步:先建立一个</pub>目录,然后使用<chmod>赋予<777>权限。接下来使用用户<lee>和用户<westos>分别在</pub>目录下创建文件<./leefile>和文件<./westosfile>。

第二步:

切换到用户<westos>下对文件执行删除操作,发现原本属于其他用户的文件<leefile>也可以被删除。

 第三步:

为了让每个用户只能删除自己的文件,我们对目录</pub>设置“stickyid”权限后(这里可以看到此目录的权限的“o”位已经由<rwx>变成了<rwt>),再次执行上述删除操作,可以看到汇报错显示“操作不被允许”,但是删除自己的文件还是可以的。

 3、sgid:强制位

针对目录:目录中新建的文件自动归属到目录的所属组中。

针对可执行文件:只针对二进制的可执行文件(c程序),当运行二进制可执行文件时都是用文件所有组身份运行,和执行用户无关

(1)对目录来说:

添加“sgid”权限的方法:

chmod 2原始权限 dir

chmod g+s dir

小实验:

第一步:这里先用<id>命令查看了用户<lee>的基本信息,可以看出此用户的所有组是<westoslee>,然后新建一个目录</pub>,并通过<chmod>命令查到其权限改为<rwxrwxrwx>,且此目录的所有人和所有组都是<root>。

第二步:先切换到用户<lee>下,在此目录中创建文件<leefile1>,可以看到这个文件所有人和所有组分别为<lee>和<westoslee>。也就是说,目录没有开启“sigid”的时候,哪个用户创建的文件就属于哪个用户所在的用户组。

第三步:切换到root下,对目录</pub>执行<chmod 2777 /pub>,可以看到此目录的权限已经改为<rwxrwsrwx>,<g>位的权限发生了变化,即目录的“sigid”权限已经开启,然后再切换到用户<lee>下,创建文件<leefile2>,可以看到新建的文件所有人和所有组分别为<lee>和<root>,和<leefile1>相比文件的所有组发生了改变。

第四步:再次切换到root下,使用<chgrp>命令将用户<lee>的所有组改为<westoslee>,然后切换到用户<lee>下,创建文件<testfile3>,可以看到新建的文件的所有人和所有组分别为<lee>和<westoslee>,和<leefile2>相比文件的所有组发生了变化。

注意:这里虽然文件<leefile1>和文件<leefile3>的所有组都属于<westoslee>,但两者有本质不同;文件<leefile1>是因为所在目录</pub>没有开启“sigid”权限,所以在这个目录中创建的文件的所有组与用户<lee>的所有组一致;文件<leefile3>是因为所在目录</pub>开启了“sigid”权限,所所以任何用户创建的文件都和目录的所有组保持一致。

(2)对可执行文件来说:

添加“sgid”权限的方法:

chmod 2原始权限 可执行文件

chmod g+s 可执行文件

chmod g+s /bin/cat         #修改此程序的<g>位,使得此文件以文件拥有组身份运行

小实验:以<cat>程序为例

这里需要使用监测程序的命令:(这个命令是监测程序运行时的用户用户组以及程序名称

watch -n 1 "ps ax -o user,group,comm | grep cat"

 这里第一步:先用<ls>命令查看程序</bin/cat>的属性,可以看到此程序的所有人和所有组都为<root>,后台开了一个<cat>的进程,通过监控窗口可以看到,此程序运行时的所有组为<root>。

第二步:用<chmod>命令将程序</bin/cat>的所有人和所有组都改为用户<lee>,再次运行发现程序的所有组还是<root>;这是由于我们并没有打开此程序的“sgid”权限。

第三步:使用<chmod>命令打开此程序的“sigid”权限,然后可以看到<cat>程序的权限由<rwxr-xr-x>变为了<rwxr-sr-x>,再次运行cat程序,可以看到新运行的cat所有组变为了<lee>。

4、suid:冒险位

对可执行文件:只针对二进制可执行文件(c程序),当运行二进制可执行文件是都是以文件拥有者身份运行,和执行用户无关。

(1)添加“suid”权限的方法:

chmod 4原属性 可执行文件
chmod u+s 可执行文件

chmod u+s /bin/cat         #修改此程序的<u>位,使得此文件以文件拥有者身份运行

小实验:以<cat>程序为例

在上个实验的基础上,通过<chmod>使得程序</bin/cat>的<u>位增加<s>权限,即开启了此文件的“suid”权限,这就可以使这个程序运行时以文件的拥有者身份运行,通过<ls>命令可以看到,程序<cat>的文件拥有者是<lee>,所以再次运行此程序时,监测窗口可以看到此程序的是以用户<lee>身份运行的。

 七、acl权限列表

 1、什么是acl权限列表?

答:acl(Aiccess Control Lists,访问控制列表),功能是在列表中可以设定特殊用户对于特殊文件的特殊权限

2、acl列表开启标识

-rw-rw-r--. 1 westos westos 0 Oct  7 08:58 testfile
          ^

这里是< . >表示acl列表没有开启

-rw-rw-r--+ 1 westos westos 0 Oct  7 08:58 testfile
          ^  

这里是< + >表示acl列表已开启

测试:这里先创建了一个文件<testfile>,通过<getfacl>命令可以看出目前还都是默认用户及用户组的权限;接下来通过<setfacl>命令加入用户<lee>的“rw”权限,在监测窗口可以看到特殊用户那一栏已经新增了用户<lee>及“rw”权限,<umask>值也变成了<rw->,表示赋予特殊用户和特殊用户组的最大权限。

注意:从< . >到< + >的转变过程,是因为先通过<setfacl>命令设置了此文件的acl列表,设置了以后就意味着打开了acl列表,如果要关闭的话,再次执行<setfacl -b testfile>,就关闭了此文件的acl列表,< + >会变成< . >。

3、acl列表权限读取

getfacl testfile                #读取acl权限列表

显示内容分析:

#file: testfile                         #文件名称

#owner: root                        #文件拥有者

#group: root                         #文件拥有组

user : : rw-                            #文件拥有者权限

user : lee : rw-                     #特殊指定用户权限

group : : r--                           #文件拥有组权限

group : westos : --              #特殊指定的用户组的权限

mask : : rw-                         #能够赋予特殊用户和特殊用户组的最大权限阈值

other : : r--                           #其他人的权限

注意:当acl权限列表没有开启时,<getfacl>命令将不会显示上表中阴影部分的内容,使用<setfacl>命令设置了哪个权限上表中就会显示出哪个权限。

4、acl列表的控制

注意:当文件权限列表开启后,不要用<ls -l>的方式读取文件的权限,因为读不完整,这里要用专门的<getfacl>命令来读。

setfacl -m u:lee:rw testfile                        #设定特殊用户<lee>的权限

setfacl -m g:westos:rw testfile                #设定特殊用户组<westos>的权限

setfacl -m u: :rwx testfile                         #设定文件所有人的权限

setfacl -m g: :0 testfile                             #设定文件所有组的权限

setfacl -x u:lee testfile                             #删除列表中的用户<lee>

setfacl -b  testfile                                     #关闭acl列表

这里分为以下几步:

第一步:先创建一个文件<testfile>,通过<setfacl>命令使用户<lee>拥有对此文件的<rw>权限,从监测窗口可以看到acl权限列表新增了<user:lee:rw->一栏。

第二步:通过<setfacl>命令使用户组<westosadmin>拥有对此文件的<x>权限,从监测窗口可以看到acl权限列表新增了<group:westosadmin:--x>一栏。

第三步:通过<setfacl>命令使文件所有人拥有对此文件的< --- >权限,从监测窗口可以看到acl权限列表的<user>那栏从之前的<rw->变成了< --- >。

第四步:通过<setfacl>命令使文件所有组拥有对此文件的<r-x>权限,从监测窗口可以看到acl权限列表的<group>那栏从之前的<r-->变成了<r-x>。

 第五步:通过<setfacl>命令执行删除用户<lee>的操作,在监窗口可以看到上一步中新增的用户<lee>已经消失了。

第六步:通过<setfacl>命令执行恢复文件默认权限的操作,在监窗口可以看到此文件的特殊用户权限都没有了,acl权限列表也恢复到了默认状态。

5、acl权限优先级

拥有者 > 特殊指定用户 > 权限多的组 > 权限少的组 > 其他

6、acl列表的mask控制

mask是能够赋予指定用户权限的最大阈值

注意:

(1)当设定完毕文件的acl列表后用<chmod>命令缩小了文件拥有组的权力,mask值会发生变化。

(2)恢复之前的权限:setfacl -m m:权限 文件  。(这里的权限是指mask值。也就是说重置mask值。要改变文件的权限还是得通过<chmod>命令来设置)

这里先用以上命令恢复了此文件的文件拥有组的权限,当出入参数为0时,文件的mask值为< --- >,然后重新通过<setfacl>命令设置用户<lee>的权限为<rx>,mask值也随之变为<r-x>,再次使用上述命令设置mask值为0,通过监测窗口可以看到mask值已经变为< --- >,相应的特殊用户<lee>以及文件所属用户组的权限都失效了

 7、acl列表的默认权限

setfacl -m u:lee:rwx /mnt/leedir                   #只对于/mnt/leedir目录本身生效

setfacl -Rm u:lee:rwx /mnt/leedir                #对于/mnt/leedir目录及目录下所有已存在文件生效

setfacl -m d:u:lee:rwx /mnt/leedir                #对于/mnt/leedir目录中新建的文件生效

这里先创建目录</mnt/testdir>,然后对目录赋予<777>权限,切换到用户“lee”下创建文件<testfile1>,可以看到此文件的权限为<rw-rw-r-->;接着通过命令<setfacl>的<-m> 参数改变此用户对目录的权限,从监视窗口可以看到新增一行<user:lee:rwx>,证明此用户对此目录拥有<rwx>权限,但是对新建的文件<testfile2>的权限并没有任何影响;然后通过命令<setfacl>的<-Rm> 参数设置权限“对目录和目录中已存在的内容生效”,可以看到文件<testfile1>和<testfile2>的权限都以变为<rw-rwxr-->,接着创建文件<testfile3>,文件权限和最初的一样,可见<-Rm>参数并不会对新建的内容生效。

 这里更改<setfacl>的设置,新加上了符号“d”,这将使指定用户权限对此目录中新建的内容生效;执行此命令后,从监控窗口可以看到此目录新增5行“默认权限”,接着创建文件<testfile4>,可以看到此文件的权限为<rw-rw-rw->,理论上来讲,权限应该和文件<testfile1>一致,但是这里并不一样,具体原因还在思考中。

八、attr权限

1、什么是attr权限?

答:attr权限可以限制所有用户,包括超级用户root。这是为了防止拥有超级用户的权限后,对很重要的文件或文件夹误操作,导致数据丢失等等不可逆问题。

2、attr权限的参数及使用

#参数
i        #不能作任何更改
a        #能添加不能删除

lsattr dir | file #查看attr权限

chattr +i | -i | +a | -a   dir|file        #设定文件/目录的attr权限

lsattr file                                       #查看文件的attr权限
lsattr -d dir                                    #查看目录的attr权限
chattr   +i | -i | +a | -a   dir|file             #设定文件/目录的attr权限

这里以一个文件为例,创建完成后输入字符,可以编辑,然后通过<chattr>命令的参数<+i>改变此文件的权限,再次编辑显示此文件“只读“,编辑失败。

接着对文件<testfile>的attr权限设置参数为<+a>,由于无法更改文件内容,所以不管添加或是删除都不被允许。(这个参数对文件夹的效果应该会更明显

这里测试attr权限对文件夹的影响。先在文件夹中创建一个文件<testfile1>,测试参数<+i>,可以看到,在执行此命令后,目录的本身的<lsattr>属性新增了“i”,这意味着此文件夹被“保护起来”了,接下来执行删除或新建命令都无法执行。

接下来测试参数<a>,可以看到,在执行此命令后,目录的本身的<lsattr>属性新增了“a”,尝试删除文件或文件夹都显示不可执行。

九、总结

1、mask值的理解:在没有设置mask值时,mask值随着操作者赋予此文件(或目录)的特殊用户的特殊权限的变化而变化,当权限设定完成后,再次去设置mask值,这时候就可以看到,之前设置的那些权限会在这次设置的mask值范围内生效,超过mask值的范围,那些权限也就失效了。

2、对“acl权限列表”可以简单理解为“设定特殊用户对特殊文件的特殊权限”,可以有效防止<chmod>或<visudo>等权限操作命令对用户或用户组下放的权限过多。

3、如果想保护系统或用户的重要文件,可以通过设置<attr>权限限制所有用户对此文件/目录的操作。

おすすめ

転載: blog.csdn.net/Zhaohui_Zhang/article/details/120609236
おすすめ