Linux权限管理:普通文件权限、特殊权限及ACL

安全一直计算机领域的热点话题,Linux系统有非常完善的权限控制来保证文件系统的安全。为了更加安全的存储文件,Linux设置了不同层次的权限访问控制方式。

文件权限就是的文件的访问权限,具体包括对文件的读、写、删除和执行等。在Linux中每个用户有不同的权限,普通用户在自己的家目录里对于自己创建的文件有所有的权限,在家目录之外则可能仅有读权限。分配好每一个Linux用户的权限是我们开展工作的第一步,下面我们来看看Linux是怎样来管理用户权限的吧。


一、文件都有的三种权限

在Linux中每个文件对应三类用户都有三种权限:

[root@localhost ~]# touch /tmp/testfile
[root@localhost ~]# ll /tmp/testfile
-rw-r--r--. 1 root root 0 Aug  3 08:45 /tmp/testfile

我们来依次看看每一部分代表什么意思吧

-:第一个-代表文件类型,常见的文件类型有普通文件(-),目录(d),软链接(l),sockets文件(s),管道文件(p)等等

rw-r--r--:第二部分有9个字符,将它依次分成三分分别对应属主(u)、属组(g)和其他用户(o)的权限,每组有r,w,x三种权限。对于文件:r表示可读(cat,more,less,tail等查看文本内容的命令);w表示可写和删除(可用nano,vim等编辑工具更改内容,可用echo追加和覆盖);x表示可执行。

对于目录:

r:只能通过ls来查看目录下的文件,其他操作无法执行

[nieda@localhost testdir]$ ll
total 4
dr--r--r--. 2 root root 4096 Aug  3 09:08 test
[nieda@localhost testdir]$ ls test/
ls: cannot access test/config-3.10.0-327.el7.x86_64: Permission denied
ls: cannot access test/initramfs-0-rescue-9987c5b50f134797b202165f43b10443.img: Permission denied
ls: cannot access test/initramfs-3.10.0-327.el7.x86_64.img: Permission denied
ls: cannot access test/initramfs-3.10.0-327.el7.x86_64kdump.img: Permission denied
ls: cannot access test/initrd-plymouth.img: Permission denied
ls: cannot access test/symvers-3.10.0-327.el7.x86_64.gz: Permission denied
ls: cannot access test/System.map-3.10.0-327.el7.x86_64: Permission denied
ls: cannot access test/vmlinuz-0-rescue-9987c5b50f134797b202165f43b10443: Permission denied
ls: cannot access test/vmlinuz-3.10.0-327.el7.x86_64: Permission denied
config-3.10.0-327.el7.x86_64
initramfs-0-rescue-9987c5b50f134797b202165f43b10443.img
initramfs-3.10.0-327.el7.x86_64.img
initramfs-3.10.0-327.el7.x86_64kdump.img
initrd-plymouth.img
symvers-3.10.0-327.el7.x86_64.gz
System.map-3.10.0-327.el7.x86_64
vmlinuz-0-rescue-9987c5b50f134797b202165f43b10443
vmlinuz-3.10.0-327.el7.x86_64

w:单独的w权限什么都不能执行

[nieda@localhost testdir]$ ll 
total 4
d-w--w--w-. 2 root root 4096 Aug  3 09:08 test
[nieda@localhost testdir]$ rm -f test/config-3.10.0-327.el7.x86_64
rm: cannot remove ‘test/config-3.10.0-327.el7.x86_64’: Permission denied
[nieda@localhost testdir]$ mv test aaa
mv: cannot move ‘test’ to ‘aaa’: Permission denied
[nieda@localhost testdir]$ mkdir test/aaa
mkdir: cannot create directory ‘test/aaa’: Permission denied
[nieda@localhost testdir]$ cd test/
bash: cd: test/: Permission denied
[nieda@localhost testdir]$ ll test/
ls: cannot open directory test/: Permission denied

x:可以切换进入目录,也可以ls查看文件信息,但必须写文件全名

[nieda@localhost testdir]$ ll
total 4
d--x--x--x. 2 root root 4096 Aug  3 09:08 test
[nieda@localhost test]$ ll
ls: cannot open directory .: Permission denied
[nieda@localhost test]$ ls config-3.10.0-327.el7.x86_64 -l
-rw-r--r--. 1 root root 126426 Aug  3 09:08 config-3.10.0-327.el7.x86_64

对于w的权限,其必须和x搭配使用才能够发挥作用

[nieda@localhost testdir]$ ll
total 4
d-wx-wx-wx. 2 root root 4096 Aug  3 09:08 test
[nieda@localhost testdir]$ rm -rf test/config-3.10.0-327.el7.x86_64
[nieda@localhost testdir]$ ll test/config-3.10.0-327.el7.x86_64
ls: cannot access test/config-3.10.0-327.el7.x86_64: No such file or directory
[nieda@localhost testdir]$ echo aaa >> test/config-3.10.0-327.el7.x86_64
[nieda@localhost testdir]$ cat test/config-3.10.0-327.el7.x86_64
aaa
[nieda@localhost testdir]$ touch test/abc
[nieda@localhost testdir]$ ll test/abc
-rw-rw-r--. 1 nieda nieda 0 Aug  3 09:40 test/abc

在Linux中,rwx可以用八进制来表示,r用4来表示,w是2,x是1

还有一个比较特殊的权限X

对于目录,加上X权限,目录里的子目录都将有x的权限,里面的文件如果原来有执行的权限(无论那类用户)+X后所有的用户都将有x的权限,否则文件的权限将不做任何的改变:

[root@localhost testdir]# ll
total 0
drwxr-xr-x. 3 root root 26 Aug  3 09:53 test
[root@localhost testdir]# ll test/
total 0
drwxr-xr-x. 2 root root 6 Aug  3 09:53 dir1
-rw-r--r--. 1 root root 0 Aug  3 09:53 f1
[root@localhost testdir]# chmod +X test
[root@localhost testdir]# ll
total 0
drwxr-xr-x. 3 root root 26 Aug  3 09:53 test
[root@localhost testdir]# ll test/
total 0
drwxr-xr-x. 2 root root 6 Aug  3 09:53 dir1
-rw-r--r--. 1 root root 0 Aug  3 09:53 f1

对于文件,如果原来没有用户有执行的权限,则不受X的影响,否则+X后所有的用户都将有x的权限:

[root@localhost test]# ll
total 0
-rw-r--r--. 1 root root 0 Aug  3 09:57 f1
[root@localhost test]# chmod +X f1
[root@localhost test]# ll
total 0
-rw-r--r--. 1 root root 0 Aug  3 09:57 f1
[root@localhost test]# chmod g+x f1
[root@localhost test]# ll
total 0
-rw-r-xr--. 1 root root 0 Aug  3 09:57 f1
[root@localhost test]# chmod +X f1
[root@localhost test]# ll
total 0
-rwxr-xr-x. 1 root root 0 Aug  3 09:57 f1

权限及文件拥有者的管理命令:chmod、chown和chgrp

chmod:更改文件的模式位,可以接多个文件或目录

选项:

-R:对于目录,可以递归改变其里面的文件模式

--reference=RFILE FILE...... 参照RFILE的权限,更改后面的文件


chown:更改文件的属主和属组,可以接多个文件

常用-R选项,和chmod的-R选项相同

[root@localhost testdir]# ll f1
-rw-r--r--. 1 root root 0 Aug  3 10:54 f1
[root@localhost testdir]# chown nieda: f1
[root@localhost testdir]# ll f1
-rw-r--r--. 1 nieda nieda 0 Aug  3 10:54 f1
[root@localhost testdir]# chown :root f1
[root@localhost testdir]# ll f1
-rw-r--r--. 1 nieda root 0 Aug  3 10:54 f1

如上所示:

当只有nieda: 时将同时改变属主和属组,其中冒号可以用.(点号)代替,如果只写:root将只会改变属组。目录也是同样的效果。

chgrp:更改组所有权,后接多个目录。-R选项

可以看到,chmod、chown、chgrp的选项几乎相同,-R和--reference的用法一样,chmod主要用于更改用户的权限位,chown改变属主和属组,chgrp只能改变属组

新建文件和目录的默认权限:umask

[root@localhost testdir]# umask
0022

系统默认的umask值是022,可以才/etc/bashrc中设置

Linux默认创建文件的权限是644,目录是755。Linux为了安全将不允许新建的文件有可执行的权限,即其八进制不允许是奇数,如果是奇数则权限加一。

[root@localhost testdir]# umask 135
[root@localhost testdir]# umask
0135
[root@localhost testdir]# touch file
[root@localhost testdir]# ll file 
-rw-r---w-. 1 root root 0 Aug  3 11:12 file
[root@localhost testdir]# mkdir dir
[root@localhost testdir]# ll -d dir
drw-r---w-. 2 root root 6 Aug  3 11:13 dir

文件权限:666减去umask,如上所示将得到531,都是奇数有执行权限必须加一,得到642的权限

目录权限:777减去umask

umask主要有两个选项:

[root@localhost testdir]# umask -p
umask 0135
[root@localhost testdir]# umask -p >> /etc/bashrc
[root@localhost testdir]# tail -1 /etc/bashrc
umask 0135

-p选项方便加入到环境变量的配置文件

[root@localhost testdir]# umask -S
u=rw,g=r,o=w

-S选项,以ugo的方式显示,umask也可以用ugo的方式修改


二、文件系统的特殊权限

Linux中普通用户有很多无法执行的操作,而且生产环境中,root也会被禁止登录系统,如果系统出现问题怎样修复呢?为了让普通用户可以临时执行只有管理员才能执行的命令,Linux设置了特殊权限的机制,总的来说就是u+s,g+s,o+t。

sst:SUID、SGID、Sticky

Linux中的进程权限访问控制叫做进程的安全上下文:

进程有属主和属组,进程对应的可执行二进制文件命令也有属主和属组。

进程的属主和属组是发起该进程的用户及其所在的主组

1、任何一个可执行程序文件能不能发起为进程,取决于发起者是否对该文件有执行权限

2、进程启动之后,属主为发起用户,属组为该用户所在的组

3、进程访问文件的权限取决于它的发起者

  • 如果被访问文件的属主是该发起者,进程对该文件有属主权限

  • 如果被访问文件的属组是该发起者,进程对该文件有属组权限

  • 如果发起者是文件的other用户,进程对该文件有other的权限


可执行文件的SUID权限

当给一个可执行文件赋予u+s的权限,普通用户执行该命令时,启动的进程属主将变为该二进制文件的属主

注意:SUID只对可执行的二进制文件有效,对于目录没有意义

[nieda@localhost testdir]$ cat /etc/shadow
cat: /etc/shadow: Permission denied
[nieda@localhost testdir]$ exit
exit
[root@localhost testdir]# chmod u+s /bin/cat
[root@localhost testdir]# ll /bin/cat
-rwsr-xr-x. 1 root root 54048 Nov 20  2015 /bin/cat
[root@localhost testdir]# su nieda\
> ^C
[root@localhost testdir]# su nieda
[nieda@localhost testdir]$ cat /etc/shadow
root:$6$iSEtT1x0P2vdmDZQ$2CHo49CSt/wXeTRT/hL1Mp3UwaUSYuPzTgKHRBmbgy6FJDU4e/63T8sq9iNrc2wJKmI/7oq5/ks58LXRTdqc./::0:99999:7:::

.........

[root@localhost testdir]# chmod u-s /bin/cat
[root@localhost testdir]# ll /bin/cat
-rwxr-xr-x. 1 root root 54048 Nov 20  2015 /bin/cat

可执行文件的SGID权限

对于二进制可执行文件:

普通用户发起进程后,进程属组变为二进制文件的属组,方法同SUID

对于目录:

默认情况下,用户创建的文件其属组是用户的基本组,当给所在目录加g+s的权限后,所有用户在该目录下创建的文件其属组将继承该目录的属组。

[root@localhost testdir]# mkdir dir1/dir
[root@localhost testdir]# touch dir1/f1
[root@localhost testdir]# ll dir1/
total 0
drw-r---w-. 2 root root 6 Aug  3 12:41 dir
-rw-r---w-. 1 root root 0 Aug  3 12:41 f1
[root@localhost testdir]# chmod g+sx dir1/
[root@localhost testdir]# ll -d dir1
drw-r-s-w-. 3 root nieda 25 Aug  3 12:41 dir1
[root@localhost testdir]# mkdir dir1/dir1
[root@localhost testdir]# touch dir1/f2
[root@localhost testdir]# ll dir1/
total 0
drw-r---w-. 2 root root  6 Aug  3 12:41 dir
drw-r-S-w-. 2 root nieda 6 Aug  3 12:41 dir1
-rw-r---w-. 1 root root  0 Aug  3 12:41 f1
-rw-r---w-. 1 root nieda 0 Aug  3 12:41 f2
[root@localhost testdir]# ll -d dir1/
drw-r-s-w-. 4 root nieda 45 Aug  3 12:41 dir1/

注意:如果目录原来的group没有执行权限,当g+s后目录的group权限为S,即该组的成员没有x的权限,及无法cd进入该目录,u+s和o+t同样适用该准则。加g+s后如果默认创建额目录组没有x权限,那么在该目录下的子目录组权限是S。

Sticky位

通常如果用户对一个目录如果有写权限(也要加上x的权限啊),那么该用户可以删除该目录下的任何文件。如果将目录设置o+t的权限,只有文件的所有者和root可删除文件,Sticky设置在文件上无意义。

[root@localhost testdir]# ll
total 0
drw-r---wx. 2 root root 6 Aug  3 12:58 dir
[root@localhost testdir]# touch dir/f{1..5}
[root@localhost testdir]# ll dir/
total 0
-rw-r---w-. 1 root root 0 Aug  3 12:58 f1
-rw-r---w-. 1 root root 0 Aug  3 12:58 f2
-rw-r---w-. 1 root root 0 Aug  3 12:58 f3
-rw-r---w-. 1 root root 0 Aug  3 12:58 f4
-rw-r---w-. 1 root root 0 Aug  3 12:58 f5
[root@localhost testdir]# su nieda
[nieda@localhost testdir]$ rm -f dir/*   #如果目录没有读权限,*将失去作用
[nieda@localhost testdir]$ exit
exit
[root@localhost testdir]# ll dir/
total 0
-rw-r---w-. 1 root root 0 Aug  3 12:58 f1
-rw-r---w-. 1 root root 0 Aug  3 12:58 f2
-rw-r---w-. 1 root root 0 Aug  3 12:58 f3
-rw-r---w-. 1 root root 0 Aug  3 12:58 f4
-rw-r---w-. 1 root root 0 Aug  3 12:58 f5
[root@localhost testdir]# su nieda 
[nieda@localhost testdir]$ rm dir/f{1..5}
[nieda@localhost testdir]$ exit
exit
[root@localhost testdir]# ll dir/
total 0
[root@localhost testdir]# chmod o+t dir
[root@localhost testdir]# ll
total 0
drwxr---wt. 5 nieda nieda 84 Aug  3 14:09 dir
[root@localhost testdir]# ll dir/
total 0
drwxr---w-. 2 nieda nieda 6 Aug  3 14:09 dir1
drwxr---w-. 2 nieda nieda 6 Aug  3 14:09 dir2
drwxr---w-. 2 nieda nieda 6 Aug  3 14:09 dir3
-rw-r---w-. 1 root  root  0 Aug  3 13:02 f1
-rw-r---w-. 1 root  root  0 Aug  3 13:02 f2
-rw-r---w-. 1 root  root  0 Aug  3 13:02 f3
-rw-r---w-. 1 root  root  0 Aug  3 13:02 f4
-rw-r---w-. 1 root  root  0 Aug  3 13:02 f5
[root@localhost testdir]# su nieda
[nieda@localhost testdir]$ rm -rf dir/f1
[nieda@localhost testdir]$ rm -rf dir/dir1
[nieda@localhost testdir]$ exit
exit
[root@localhost testdir]# su mage
[mage@localhost testdir]$ rm -f dir/f2
rm: cannot remove ‘dir/f2’: Operation not permitted
[mage@localhost testdir]$ rm -rf dir/dir2
rm: cannot remove ‘dir/dir2’: Operation not permitted

其他特殊权限:

chattr :设置特殊权限

+i:不能删除,改名,更改

+a:只能增加

lsatttr:查看特殊权限

 

三、访问控制列表

ACL:Access Control List,可以实现灵活的权限控制

以上说的权限控制其实将所有用户分成了ugo三类,对于u和g我们可以精确指定,但other的定义太过于宽泛,那么如何更细致的管理权限呢?在linux里我们可以通过ACL来管理某个文件及其特定的用户和用户组权限,简单来说ACL只需掌握三个命令即可:setfacl,getfacl,chacl

https://wiki.archlinux.org/index.php/Access_Control_Lists

centos7默认创建的ext4和xfs有acl的功能,在7之前手动创建的ext4文件系统需要手工添加:
acl生效顺序:所有者——自定义用户——自定义组——其他人

setfacl:设置ACL

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

setfacl --restore=file

getfacl:获取文件的ACL

chacl:更改文件或目录的ACL

[root@localhost testdir]# getfacl /etc/issue
getfacl: Removing leading '/' from absolute path names
# file: etc/issue
# owner: root
# group: root
user::rw-
group::r--
other::r--

对一个文件设置ACL

[root@localhost testdir]# ll
total 0
-rw-r--r--. 1 root root 0 Aug  3 14:58 file
[root@localhost testdir]# setfacl -m u:mage:rwx file 
[root@localhost testdir]# echo xxx > file
[root@localhost testdir]# cat file
xxx
[root@localhost testdir]# getfacl file
# file: file
# owner: root
# group: root
user::rw-
user:mage:rwx
group::r--
mask::rwx
other::r--
[root@localhost testdir]# ll file
-rw-rwxr--+ 1 root root 4 Aug  3 15:01 file

可以看到设置ACL以后在其权限位的最后面有个+

setfacl的参数

-m 修改指定文件的acl,不能和-x混合使用

-x 删除后续参数

-b 删除所有acl设定参数

-k 移除预设的acl参数

-R 递归设置acl参数

-d 预设目录的acl参数

ACL中的mask值是自定义的最大权限,默认acl有x的权限,其中新建的文件也不会有x的权限

getfaclfile1 | setfacl--set-file=-file2 复制file1的acl权限给file2

mask只影响除了所有者和other之外的用户和组的最大权限

Mask需要与用户的权限进行逻辑与运算后,才能变成有限的权限

用户或组的设置必须存在于mask权限设定范围内才会生效。

--set选项会把原有的ACL项都删除,用新的替代,需要注意的是一定要包含UGO的设置,不能象-m一样只是添加ACL就可以.

主要的文件操作命令cp和mv都支持ACL,只是cp命令需要加上-p 参数。但是tar等常见的备份工具是不会保留目录和文件的ACL信息








發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章