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。
接下来我们将讨论有关进程管理的相关知识。