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

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

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

一、文件都有的三种权限

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

[root@localhost~]#touch/tmp/testfile[root@localhost~]#ll/tmp/testfile-rw-r--r--.1rootroot0Aug308: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@localhosttestdir]$lltotal4dr--r--r--.2rootroot4096Aug309:08test
[nieda@localhosttestdir]$lstest/ls:cannotaccesstest/config-3.10.0-327.el7.x86_64:Permissiondeniedls:cannotaccesstest/initramfs-0-rescue-9987c5b50f134797b202165f43b10443.img:Permissiondeniedls:cannotaccesstest/initramfs-3.10.0-327.el7.x86_64.img:Permissiondeniedls:cannotaccesstest/initramfs-3.10.0-327.el7.x86_64kdump.img:Permissiondeniedls:cannotaccesstest/initrd-plymouth.img:Permissiondeniedls:cannotaccesstest/symvers-3.10.0-327.el7.x86_64.gz:Permissiondeniedls:cannotaccesstest/System.map-3.10.0-327.el7.x86_64:Permissiondeniedls:cannotaccesstest/vmlinuz-0-rescue-9987c5b50f134797b202165f43b10443:Permissiondeniedls:cannotaccesstest/vmlinuz-3.10.0-327.el7.x86_64:Permissiondeniedconfig-3.10.0-327.el7.x86_64initramfs-0-rescue-9987c5b50f134797b202165f43b10443.imginitramfs-3.10.0-327.el7.x86_64.imginitramfs-3.10.0-327.el7.x86_64kdump.imginitrd-plymouth.imgsymvers-3.10.0-327.el7.x86_64.gzSystem.map-3.10.0-327.el7.x86_64vmlinuz-0-rescue-9987c5b50f134797b202165f43b10443vmlinuz-3.10.0-327.el7.x86_64

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

[nieda@localhosttestdir]$lltotal4d-w--w--w-.2rootroot4096Aug309:08test
[nieda@localhosttestdir]$rm-ftest/config-3.10.0-327.el7.x86_64rm:cannotremove‘test/config-3.10.0-327.el7.x86_64’:Permissiondenied[nieda@localhosttestdir]$mvtestaaamv:cannotmove‘test’to‘aaa’:Permissiondenied[nieda@localhosttestdir]$mkdirtest/aaamkdir:cannotcreatedirectory‘test/aaa’:Permissiondenied[nieda@localhosttestdir]$cdtest/bash:cd:test/:Permissiondenied[nieda@localhosttestdir]$lltest/ls:cannotopendirectorytest/:Permissiondenied

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

[nieda@localhosttestdir]$lltotal4d--x--x--x.2rootroot4096Aug309:08test
[nieda@localhosttest]$llls:cannotopendirectory.:Permissiondenied[nieda@localhosttest]$lsconfig-3.10.0-327.el7.x86_64-l-rw-r--r--.1rootroot126426Aug309:08config-3.10.0-327.el7.x86_64

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

[nieda@localhosttestdir]$lltotal4d-wx-wx-wx.2rootroot4096Aug309:08test
[nieda@localhosttestdir]$rm-rftest/config-3.10.0-327.el7.x86_64[nieda@localhosttestdir]$lltest/config-3.10.0-327.el7.x86_64ls:cannotaccesstest/config-3.10.0-327.el7.x86_64:Nosuchfileordirectory
[nieda@localhosttestdir]$echoaaa test/config-3.10.0-327.el7.x86_64[nieda@localhosttestdir]$cattest/config-3.10.0-327.el7.x86_64[nieda@localhosttestdir]$touchtest/abc[nieda@localhosttestdir]$lltest/abc-rw-rw-r--.1niedanieda0Aug309:40test/abc

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

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

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

[root@localhosttestdir]#lltotal0drwxr-xr-x.3rootroot26Aug309:53test[root@localhosttestdir]#lltest/total0drwxr-xr-x.2rootroot6Aug309:53dir1-rw-r--r--.1rootroot0Aug309:53f1
[root@localhosttestdir]#chmod+Xtest[root@localhosttestdir]#lltotal0drwxr-xr-x.3rootroot26Aug309:53test[root@localhosttestdir]#lltest/total0drwxr-xr-x.2rootroot6Aug309:53dir1-rw-r--r--.1rootroot0Aug309:53f1

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

[root@localhosttest]#lltotal0-rw-r--r--.1rootroot0Aug309:57f1[root@localhosttest]#chmod+Xf1[root@localhosttest]#lltotal0-rw-r--r--.1rootroot0Aug309:57f1
[root@localhosttest]#chmodg+xf1[root@localhosttest]#lltotal0-rw-r-xr--.1rootroot0Aug309:57f1[root@localhosttest]#chmod+Xf1[root@localhosttest]#lltotal0-rwxr-xr-x.1rootroot0Aug309:57f1

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

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

选项:

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

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

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

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

[root@localhosttestdir]#llf1-rw-r--r--.1rootroot0Aug310:54f1[root@localhosttestdir]#chownnieda:f1[root@localhosttestdir]#llf1-rw-r--r--.1niedanieda0Aug310:54f1
[root@localhosttestdir]#chown:rootf1[root@localhosttestdir]#llf1-rw-r--r--.1niedaroot0Aug310:54f1

如上所示:

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

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

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

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

[root@localhosttestdir]#umask0022

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

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

[root@localhosttestdir]#umask135[root@localhosttestdir]#umask[root@localhosttestdir]#touchfile[root@localhosttestdir]#llfile-rw-r---w-.1rootroot0Aug311:12file[root@localhosttestdir]#mkdirdir[root@localhosttestdir]#ll-ddirdrw-r---w-.2rootroot6Aug311:13dir

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

目录权限:777减去umask

umask主要有两个选项:

[root@localhosttestdir]#umask-pumask0135[root@localhosttestdir]#umask-p /etc/bashrc[root@localhosttestdir]#tail-1/etc/bashrcumask0135

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

[root@localhosttestdir]#umask-Su=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@localhosttestdir]$cat/etc/shadowcat:/etc/shadow:Permissiondenied[nieda@localhosttestdir]$exit[root@localhosttestdir]#chmodu+s/bin/cat[root@localhosttestdir]#ll/bin/cat-rwsr-xr-x.1rootroot54048Nov202015/bin/cat[root@localhosttestdir]#sunieda\ ^C[root@localhosttestdir]#sunieda[nieda@localhosttestdir]$cat/etc/shadowroot:$6$iSEtT1x0P2vdmDZQ$2CHo49CSt/wXeTRT/hL1Mp3UwaUSYuPzTgKHRBmbgy6FJDU4e/63T8sq9iNrc2wJKmI/7oq5/ks58LXRTdqc./::0:99999:7:::

………

[root@localhosttestdir]#chmodu-s/bin/cat[root@localhosttestdir]#ll/bin/cat-rwxr-xr-x.1rootroot54048Nov202015/bin/cat

可执行文件的SGID权限

对于二进制可执行文件:

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

对于目录:

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

[root@localhosttestdir]#mkdirdir1/dir[root@localhosttestdir]#touchdir1/f1[root@localhosttestdir]#lldir1/total0drw-r---w-.2rootroot6Aug312:41dir-rw-r---w-.1rootroot0Aug312:41f1[root@localhosttestdir]#chmodg+sxdir1/[root@localhosttestdir]#ll-ddir1drw-r-s-w-.3rootnieda25Aug312:41dir1[root@localhosttestdir]#mkdirdir1/dir1[root@localhosttestdir]#touchdir1/f2[root@localhosttestdir]#lldir1/total0drw-r---w-.2rootroot6Aug312:41dirdrw-r-S-w-.2rootnieda6Aug312:41dir1-rw-r---w-.1rootroot0Aug312:41f1-rw-r---w-.1rootnieda0Aug312:41f2[root@localhosttestdir]#ll-ddir1/drw-r-s-w-.4rootnieda45Aug312:41dir1/

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

Sticky位

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

[root@localhosttestdir]#lltotal0drw-r---wx.2rootroot6Aug312:58dir[root@localhosttestdir]#touchdir/f{1..5}[root@localhosttestdir]#lldir/total0-rw-r---w-.1rootroot0Aug312:58f1-rw-r---w-.1rootroot0Aug312:58f2-rw-r---w-.1rootroot0Aug312:58f3-rw-r---w-.1rootroot0Aug312:58f4-rw-r---w-.1rootroot0Aug312:58f5[root@localhosttestdir]#sunieda[nieda@localhosttestdir]$rm-fdir/*#如果目录没有读权限,*将失去作用[nieda@localhosttestdir]$exit[root@localhosttestdir]#lldir/total0-rw-r---w-.1rootroot0Aug312:58f1-rw-r---w-.1rootroot0Aug312:58f2-rw-r---w-.1rootroot0Aug312:58f3-rw-r---w-.1rootroot0Aug312:58f4-rw-r---w-.1rootroot0Aug312:58f5[root@localhosttestdir]#sunieda[nieda@localhosttestdir]$rmdir/f{1..5}[nieda@localhosttestdir]$exit[root@localhosttestdir]#lldir/total0
[root@localhosttestdir]#chmodo+tdir[root@localhosttestdir]#lltotal0drwxr---wt.5niedanieda84Aug314:09dir[root@localhosttestdir]#lldir/total0drwxr---w-.2niedanieda6Aug314:09dir1drwxr---w-.2niedanieda6Aug314:09dir2drwxr---w-.2niedanieda6Aug314:09dir3-rw-r---w-.1rootroot0Aug313:02f1-rw-r---w-.1rootroot0Aug313:02f2-rw-r---w-.1rootroot0Aug313:02f3-rw-r---w-.1rootroot0Aug313:02f4-rw-r---w-.1rootroot0Aug313:02f5
[root@localhosttestdir]#sunieda[nieda@localhosttestdir]$rm-rfdir/f1[nieda@localhosttestdir]$rm-rfdir/dir1[nieda@localhosttestdir]$exit[root@localhosttestdir]#sumage[mage@localhosttestdir]$rm-fdir/f2rm:cannotremove‘dir/f2’:Operationnotpermitted[mage@localhosttestdir]$rm-rfdir/dir2rm:cannotremove‘dir/dir2’:Operationnotpermitted

其他特殊权限:

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@localhosttestdir]#getfacl/etc/issuegetfacl:Removingleading'/'fromabsolutepathnames#file:etc/issue#owner:root#group:rootuser::rw-group::r--other::r--

对一个文件设置ACL

[root@localhosttestdir]#lltotal0-rw-r--r--.1rootroot0Aug314:58file
[root@localhosttestdir]#setfacl-mu:mage:rwxfile[root@localhosttestdir]#echoxxx file[root@localhosttestdir]#catfile[root@localhosttestdir]#getfaclfile#file:file#owner:root#group:rootuser::rw-user:mage:rwxgroup::r--mask::rwxother::r--[root@localhosttestdir]#llfile-rw-rwxr--+1rootroot4Aug315:01file

可以看到设置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信息

累死累活不说,走马观花反而少了真实体验,

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

相关文章:

你感兴趣的文章:

标签云: