Linux用户的权限

  • 前言
  • 一、权限的一些基本概念
  • 1.权限的三类对象
  • 2.权限的三种类型
  • 3.更改权限的格式
  • 二、更改权限(chmod)
  • 1.通过符号的格式更改权限
  • 2.通过数字的格式更改权限
  • 三、更改属主、属组(chown)
  • 四、更改属组 (chgrp)
  • 五、ACL文件权限管理
  • 六、特殊权限
  • 1.特殊位 suid
  • 2.文件属性chattr
  • 3.进程掩码umask
  • 首先我们可以观察一下系统的默认掩码:
  • 尝试修改进程掩码:
  • 总结


前言

之前我们讨论了关于linux系统中用户和组的概念和管理,引入组的概念就是为了方便确定用户的各种权限,下面我们来讨论关于linux系统中用户的权限。

一、权限的一些基本概念

1.权限的三类对象

任何一个在linux系统中的文件,他都有相应的权限对应的三类对象,他们被称作UGO(uer,group,other)。

  • 属主:u
  • 属组:g
  • 其他人:o
  • 特殊对象:所有人a(u+g+o)

2.权限的三种类型

上面是权限的三种对象,接下来讨论关于权限的三种类型。他们分别是读、写、执行。

  • 读:r = 4
  • 写:w = 2
  • 执行: x = 1

3.更改权限的格式

更改权限有两种方法,

一种是利用字母rwx来进行加减

如果一个文件想让他的属主用户增加一个可以执行的权利,就可以:

u+x(表示属主的权利加上一个可执行的权利)。

相应的,可以减去:

u-r(表示属主不再拥有读的权利)。

也可以直接用赋值的方法进行授权

u=rwx(表示属主拥有全部的权限)。

另一种是直接用数字进行授权

比如 u = 7,这表示属主有读写执行的全部权限(7=4+2+1)。

二、更改权限(chmod)

修改一个文件的权限可以用chmod指令。

chmod的指令有三个部分:

命令

对象加减权限

文件或者目录

chmod

u+r

1.txt

如果要对文件夹的权限进行改变,要加上选项 -R。

命令

参数,对文件夹操作(递归操作)

对象加减权限

目录

chmod

-R

u+r

dir1

我们在文件夹中新建一个文件file1:

touch file1

我们可以用指令 ll (ls -l) 查看以下file1的详细信息。

-rw-rw-r--  1 william william    0 1月  13 10:24 file1

上面的一行是file1相关的一行,可以看到前面就是关于权限的信息。

具体的,这些信息的意思为:

类型和权限

链接

属主

属组

大小

创建时间

文件名

-rw-rw-r–

1

william

william

0B

1月 13 10:24

file1

其中,类型和权限一栏,我们去掉第一位(显示目录还是文件的一位),后面就是ugo的权限了,可以看到这个file1的权限为:

属主u = rw 属主有读写的权利。

属组g = rw 属组有读写的权利。

其他人o = r 其他用户有读的权利。

我们便可以通过上面的命令格式更改文件1的权限。

1.通过符号的格式更改权限

如果我们用这句命令进行权限更改:

chmod a=rwx file1

这样file1对所有用户都有全部的权限。

如果我们用这句命令进行权限更改:

chmod u-x file1

属主就会失去对file1执行的权利。

执行指令:

chmod g=--- file1

属组就会失去对file1的全部权限。

再执行指令:

chmod u+x file1

属主就会重新获得对file1执行的权利,其他的权利和权利的对象更改权利的方法以此类推。

2.通过数字的格式更改权限

通过数字的格式更改权限,我们先把刚才的file1删除,再新建一个新的file2。

rm -f file1
touch file2
ll

用ll指令可以看到file2的权限格式为:

rw-rw-r–

可以看到,属主为rw,4+2=6,属组同属主,其他人为r=4。

所以用数字的格式记录这个file2的权限即为664。

那么我们现在就可以用如下格式对file2进行权限更改:

命令

数字

对象

chmod

777

file2

执行这个指令之后:

chmod 777 file2

可以看到file2的权限格式变为:rwxrwxrwx。

执行这个指令:

chmod 007 file2

可以看到file2的权限格式变为:------rwx。

对于文件夹,如果加上-R参数,就会递归进行操作,把文件夹和文件夹内部的所有文件和文件夹都进行更改权限操作。

三、更改属主、属组(chown)

chwon即为change owner。

这个命令的格式如下:

命令

新的属主、属组

文件名

chown

user.group

file

这里的第二行要注意,属主和属组之间用 . 来进行分割。

比如在我们创建了一个文件之后,它的有关属主和属组的信息应该和创建这个文件的用户名一致:

-rw-r--r-- 1 root root 0 1月  13 10:57 file

可以看到文件file的属主和属组都是root,接下来我们执行命令:

chown aaa.bbb file
ll
-rw-r--r-- 1 aaa bbb 0 1月  13 10:57 file

可以看到属主变为aaa,属组变为bbb。同时我们也可以只对属主或只对属组进行更改:

chown root.root file
chown aaa	file
ll
-rw-r--r-- 1 aaa root 0 1月  13 10:57 file
chown .bbb file
ll
-rw-r--r-- 1 aaa bbb 0 1月  13 10:57 file

可以看到,后面的两句chown指令分别只更改属主和只更改属组。

和chmod一样,如果加上-R,也是递归操作文件夹内所有文件和文件夹。

四、更改属组 (chgrp)

这个指令的操作用chown也可以实现,只是更改一个文件的属组:

命令

新的属组

文件名

chgrp

groupname

filename

五、ACL文件权限管理

在上面的chmod指令中,只能对一个用户、一个组和其他人的权限进行更改,在一个文件需要对很多不同的用户和组有不同的权限操作的时候,就会捉襟见肘,我们可以用ACL文件权限管理的方法来解决这个问题。

ACL即为访问控制列表(access control list)。限制用户对文件的访问。

我们如果想要查看一个文件/目录的ACL,可以用指令getfacl:

命令

文件名

getfacl

filename

getfacl file1
# file: file1
# owner: root
# group: root
user::rw-
group::rw-
other::r--

由于我们还没指定其他用户或组的权限,所以只有ugo三个对象的权限。

更改一个文件的用户ACL的语法如下:

命令

参数

针对对象

文件名

setfacl

-m(设置) -d(删除)

u:用户名:权限

filename

更改一个文件的组ACL的语法如下:

命令

参数

针对对象

文件名

setfacl

-m(设置) -d(删除)

g:组名:权限

filename

更改一个文件的其他人ACL的语法如下:

命令

参数

针对对象

文件名

setfacl

-m(设置) -d(删除)

o::权限

filename

更改其他人的时候不需要输入名称。

我们运行指令:

setfacl -m u:aaa:rwx file1
getfacl file1
# file: file1
# owner: root
# group: root
user::rw-
user:aaa:rwx
group::rw-
mask::rwx
other::r--

可以看到用户aaa对文件file1有了rwx的权限。

当我们对一个文件有了acl相关操作之后,再用ll查看文件详细信息的时候,在权限一栏最后会有一个加号 + ,表示权限除了UGO还有其他权限。

-rw-rwxr--+ 1 root root 0 1月  13 11:07 file1

如果要删除一个用户或者组的ACL权限,可以用如下的命令:

命令

参数

针对对象

文件名

setfacl

-x

u:用户名

filename

这个时候不用输入权限。

参数-b可以移除所有扩展的命令权限(除了ugo以外的):

命令

参数

文件名

setfacl

-b

filename

六、特殊权限

1.特殊位 suid

suid为一个文件的属主的执行位,suid(guid)针对文件/程序时,具备临时提升权限。

suid为针对文件所设置的第一个特别的权限,使调用文件的用户,临时具备属主的能力。

如果我们想让其他用户可以像root一样用cat查看文件,可以现在root的身份下更改cat的权限:

chmod u+s /usr/bin/cat
ll /usr/bin/cat
-rwsr-xr-x 1 root root 54080 8月  20 2019 /usr/bin/cat

可以看到cat的属主的执行位置变成了s,当其他人调用这个文件的时候,就可以用cat查看root文件夹下的文件了。

注意:不要随意在系统中随便给一个文件添加suid!!!

请尝试过这个指令之后立即复原:

chmod u-s /usr/bin/cat

2.文件属性chattr

lsattr可以用来列出一个文件的属性。

chattr可以用更开某个文件的属性,拒绝被修改等等。

可以增加i属性,防止文件被移动,重命名和删除,格式如下:

命令

属性更改

文件名

chattr

+i

file

可以用lsattr查看file的文件属性列表,不能再删除和移动、重命名这个文件。

同理,可以通过-i剪掉这个属性。

chattr还有很多其他可以更改的属性,比如a属性,a属性只允许在文件中进行追加操作,不能覆盖。

比如我们一般在日志文件中加上这个属性,一般日志只能附加,不能覆盖原有的日志。

c属性:如果一个文件被存储到磁盘之后,将会被压缩。

最常用的还是-i属性,如果想要获取更多属性可以google一下。

chattr设置的文件属性作用范围非常广阔, root用户也会被影响。

3.进程掩码umask

新建文件、目录的默认权限会受到umask的影响,umask表示要剪掉的权限。

首先我们可以观察一下系统的默认掩码:
umask
0022

掩码就是四位数字(这里用root用户查看是0022),权限其实是四位,我们的chmod可以这样更改文件的权限:

chmod 7777 file

我们一般说的UGO是后三位。

在了解umask之前,我们需要再就刚才的suid讨论一下,如果一个文件,我们在给属主加上suid之前,如果这个文件属主有执行权:

ll
-rwxr--r-- 1 root root    0 1月  14 01:26 file999

那么我们执行增加suid之后,属主的执行位会变成s,和上面一致:

chmod u+s file999
ll
-rwsr--r-- 1 root root    0 1月  14 01:26 file999

如果这个文件一开始属主并没有执行权:

ll
-rw-r--r-- 1 root root    0 1月  14 01:26 file999

那么我们执行增加suid之后,属主的执行位会变为S,和上面的s进行区分。

chmod u+s file999
ll
-rwSr--r-- 1 root root    0 1月  14 01:26 file999

回到我们的掩码中,如果我们给一个文件进行4位的权限更改:

chmod 7777 file999
-rwsrwsrwt 1 root root 0 1月  14 01:33 file999
chmod 6777 file999
-rwsrwsrwx 1 root root 0 1月  14 01:33 file999
chmod 5777 file999
-rwsrwxrwt 1 root root 0 1月  14 01:33 file999
chmod 4777 file999
-rwsrwxrwx 1 root root 0 1月  14 01:33 file999
chmod 3777 file999
-rwxrwsrwt 1 root root 0 1月  14 01:33 file999
chmod 2777 file999
-rwxrwsrwx 1 root root 0 1月  14 01:33 file999
chmod 1777 file999
-rwxrwxrwt 1 root root 0 1月  14 01:33 file999
chmod 0777 file999
-rwxrwxrwx 1 root root 0 1月  14 01:33 file999

目前理解第一位为特殊为即可,至于里面s和t是什么意思后续再谈。


那么回到我们的掩码,当我们创建一个目录的时候,默认的权限是怎么来的呢,就是0777减去我们的掩码值

0777-0022=0755

所以系统在创建文件夹的时候,权限是755。

创建文件的时候,其实实际上创建的权限最终也是755,只是系统为了保护自己,把新创建的文件所有的对象的执行权限都删去, 所以是644。

尝试修改进程掩码:

可以在umak后面添加四位数字修改进程掩码:

umask 0000

这样修改umak就会变为0000,这样我们创建文件夹和文件之后,他们的权限如下:

drwxrwxrwx 2 root root 4096 1月  14 01:44 dir1
-rw-rw-rw- 1 root root    0 1月  14 01:45 file1

我们可以看到目录变为了777,文件变成了666。

总结

本文我们讨论了一些关于文件和目录对于用户、组和其他人的权限问题,我们讨论了关于经典的UGO权限更改和ACL文件访问控制列表的权限修改。

接着讨论了如何更改一个文件的属主和属组(chown 都可以更改,chgrp只能更改属组)。

接着我们学习了一些特殊的权限,特殊位suid、添加文件的属性chattr和指定默认权限的进程掩码umask。

接下来我们将讨论有关进程管理的相关知识。