安全一直计算机领域的热点话题,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信息
累死累活不说,走马观花反而少了真实体验,