浅谈文件权限
Linux系统中的每个文件和目录都有访问许可权限,用他来确定谁能通过何种方式对文件和目录进行访问和操作。
文件权限:
文件或目录的访问权限分为只读,只写和可执行三种。
文件的权限主要针对三类对象进行定义:
owner: 属主, u
group: 属组, g
other: 其他, o
每个文件针对每类访问者都定义了三种权限:
r: Readable 可读
w: Writable 可写
x: eXcutable 可执行
ls -l 查看文件属性:
[xiaoshui@localhost data]$ ls -l total 16 -rw-rw-r-- 1 xiaoshui root 4 Aug 4 16:25 f1
可以看出文件属性信息一共被空格分为7个字段,第一个字段就是文件的类型和权限
如上图所示,第一个-为文件的类型,如果为-,则表示为普通文件,后面以三个为一组,前三个为文件所有者的权限,中间三个为文件所属组用户的权限,后面三个对应其他用户的权限。
可读可写可执行对目录和文件有什么作用
文件:
r: 可使用文件查看类工具获取其内容
w: 可修改其内容
x: 可以把此文件提请内核启动为一个进程
目录:
r: 可以使用ls查看此目录中文件列表
w: 可在此目录中创建文件,也可删除此目录中的文件
x: 可以使用ls -l查看此目录中文件列表,可以cd进入此
权限匹配:
(1)判断进程的属主,是否为被访问的文件属主;如果是,则应用属主的权限;否则进入第2步;
(2)判断进程的属主,是否属于被访问的文件属主;如果是,则应用属组的权限;否则进入第3步;
(3)应用other的权限;
chmod:
chmod[OPTION]… OCTAL-MODE FILE…
-R: 递归修改权限
chmod[OPTION]… MODE[,MODE]… FILE…
MODE:
修改一类用户的所有权限:
u= g= o= ug= a= u=,g=
修改一类用户某位或某些位权限
u+ u-g+ g-o+ o-a+ a-+ –
chmod[OPTION]… –reference=RFILE FILE…
参考RFILE文件的权限,将FILE的修改为同RFILE;
r=读取属性 //值=4
w=写入属性 //值=2
x=执行属性 //值=1
[root@localhost testdir]# chmod u+x,g+w file //为文件file属主加上x,属组加上w [root@localhost testdir]# chmod u=rwx,g=rw,o=r file //设置文件属主权限rwx,组权限rw,其他人r [root@localhost testdir]# chmod 764 file //为文件设置属主rwx,组权限rw,其他人r [root@localhost testdir]# chmod a+x file //为文件属主属组和其他人全都加上x
注意:X:只给目录x权限,不给文件x权限,如果使用-R递归,目录中的目录则会附加x权限,目录中的文件有x权限,则会生效,如果没有,则保持不变。
[root@localhost test2]# ll total 0 -rwxrw-rw- 1 root root 0 Aug 5 08:34 f1 -rw-rw-rw- 1 root root 0 Aug 5 08:35 f2 -rw-rw-rw- 1 root root 0 Aug 5 08:35 f3 [root@localhost data]# chmod -R g=rwX test2 [root@localhost data]# cd test2 [root@localhost test2]# ll total 0 -rwxrwxrw- 1 root root 0 Aug 5 08:34 f1 -rw-rw-rw- 1 root root 0 Aug 5 08:35 f2 -rw-rw-rw- 1 root root 0 Aug 5 08:35 f3
权限练习:
当用户xiaoming对/testdir 目录无执行权限时,意味着无法做哪些操作?
drwxr-xrw- 16 root root 4096 Aug 4 09:18 testdir drwxrwxrwt. 27 root root 4096 Aug 4 19:20 tmp drwxr-xr-x. 13 root root 4096 Jul 25 20:07 usr drwxr-xr-x. 21 root root 4096 Aug 4 16:45 var [xiaoming@localhost /]$ [xiaoming@localhost /]$ cd testdir/ -bash: cd: testdir/: Permission denied [xiaoming@localhost /]$ ls testdir/ ls: cannot access testdir/dir1: Permission denied ls: cannot access testdir/dir2: Permission denied ls: cannot access testdir/dir3: Permission denied ls: cannot access testdir/dir4: Permission denied ls: cannot access testdir/dir5: Permission denied ls: cannot access testdir/user4: Permission denied ls: cannot access testdir/user5: Permission denied ls: cannot access testdir/user6: Permission denied ls: cannot access testdir/user7: Permission denied ls: cannot access testdir/user8: Permission denied ls: cannot access testdir/user9: Permission denied ls: cannot access testdir/user10: Permission denied ls: cannot access testdir/mytest: Permission denied ls: cannot access testdir/hello: Permission denied dir1 dir3 dir5 mytest user4 user6 user8 dir2 dir4 hello user10 user5 user7 user9
因为xiaoming不属于root组,所以匹配other,对testdir目录有rw权限,但是没有x权限,可以看出不可cd至此目录,可ls查看文件列表,但不可ls -l 查看文件属性。
当用户xiaoming对/testdir 目录无读权限时,意味着无法做哪些操作?
drwxr-x-wx 16 root root 4096 Aug 4 09:18 testdir drwxrwxrwt. 27 root root 4096 Aug 4 19:29 tmp drwxr-xr-x. 13 root root 4096 Jul 25 20:07 usr drwxr-xr-x. 21 root root 4096 Aug 4 16:45 var [xiaoming@localhost /]$ [xiaoming@localhost /]$ cd testdir/ [xiaoming@localhost testdir]$ ls ls: cannot open directory .: Permission denied [xiaoming@localhost testdir]$ ls -l ls: cannot open directory .: Permission denied [xiaoming@localhost testdir]$ touch file1 [xiaoming@localhost testdir]$ touch file2 [xiaoming@localhost testdir]$ rmdir file1
[root@localhost testdir]# ls dir1 dir3 dir5 hello user10 user5 user7 user9 dir2 dir4 file2 mytest user4 user6 user8
可以看出当xiaoming对testdir拥有wx,无r时,可cd至此目录,不可查看目录内的文件列表与文件属性,可创建和删除文件,可查看文件的内容。
当用户xiaoming对/testdir 目录无写权限时,该目录下的只读文件file1是否可修改和删除?
drwxr-xr-x 16 root root 4096 Aug 4 19:31 testdir drwxrwxrwt. 27 root root 4096 Aug 4 19:36 tmp drwxr-xr-x. 13 root root 4096 Jul 25 20:07 usr drwxr-xr-x. 21 root root 4096 Aug 4 16:45 var [xiaoming@localhost /]$ [xiaoming@localhost testdir]$ ll total 8 drwxrwxr-x+ 4 root root 22 Jul 28 14:27 dir1 drwxrwxr-x+ 4 root root 22 Jul 28 14:28 dir2 drwxrwxr-x+ 2 root root 6 Jul 28 14:29 dir3 drwxrwxr-x+ 2 root root 6 Jul 28 14:29 dir4 drwxrwxr-x+ 4 root root 28 Jul 28 14:29 dir5 -rw-r--r-- 1 root root 0 Aug 4 19:41 file [xiaoming@localhost testdir]$ rm file rm: remove write-protected regular empty file ‘file’? y rm: cannot remove ‘file’: Permission denied [root@localhost testdir]# echo hello > file [xiaoming@localhost testdir]$ cat file hello [xiaoming@localhost testdir]$ echo 1 > file -bash: file: Permission denied
可以看出,因为xiaoming对testdir无w权限,所以不能删除file, 因为拥有可读权限,所以可以查看文件内容,没有w权限,所以不可修改文件内容。
Linux文件系统上的特殊权限
SUID:
默认情况下:用户发起的进程,进程的属主是其发起者;因此,其以发起者的身份在运行;
SUID的功用:用户运行程序时,如果此程序拥有SUID权限,那么程序运行为进程时,进程的属主不再是发起者,而是程序文件本身的属主;
管理文件的SUID权限:
chmod u+|-s file…
展示位置:属主的执行权限位
如果属主原本有执行权限,显示为小写s
否则,显示为大写S;
[root@localhost data]# chmod u+s /usr/bin/nano [root@localhost data]# ll /usr/bin/nano -rwsr-xr-x. 1 root root 205904 Jun 10 2014 /usr/bin/nano [xiaoming@localhost testdir]$ nano /etc/shadow user1:$5$JHmiPG4G$yolBfbwVY1RGXI2fJUzXoBgZupX1H9.hSn9HUELjjW0:0:0:999$ user2:!!:17016:0:99999:7::: user3:!!:17016:0:99999:7::: 12:!!:17016:0:99999:7::: jane:$5$hG95UcdW$3yv0tgu6Z1vI3asDrzbCbI4CgjhAh.YfZ5Kuu7G8BJ0:17017:0:$ lilei:!!:17017:0:99999:7::: tomre:$5$aYH1hhNZ$lYgaK6Euqap7JmiLsAIENM4TkYBJOwlN.sfrLFyBZ17:17017:0$ tomch:!!:17017:0:99999:7::: jixingshui:$5$H7neghml$pW3z37zBxWVDDux7SKKLbgVB/jS5qBR.dr/Ca77uIq8:17$ xiaosming:!!:17017:0:99999:7::: xiaoming::17017:0:99999:7::: [ Wrote 67 lines ] ^G Get Help^O WriteOut^R Read Fil^Y Prev Pag^K Cut Text^C Cur Pos ^X Exit ^J Justify ^W Where Is^V Next Pag^U UnCut Te^T To Spell
将/usr/bin/nano的文件设为suid权限,此时普通用户运行nano进程时,普通用户会继承root的权限,然后写入/etc/shadow文件,将xiaoming用户设为空密码,然后就可登录了。
经上实验,suid是一个非常危险的权限,所以一定要慎重赋予
SGID:
功用:当用户属组有写权限,且有SGID权限时,那么所有属于此目录的属组,且以属组身份在此目录中新建文件或目录时,新文件的属组不是用户的基本组,而是此目录的属组;
展示位置:属组的执行权限位
如果属组原有执行权限,显示为小写s;
否则,显示为大写S
[root@localhost data]# chmod g+s testdir/ [root@localhost data]# ll total 0 drwxrwsrwx 2 root root 24 Aug 4 20:44 testdir [xiaoshui@localhost data]$ cd testdir/ [xiaoshui@localhost testdir]$ touch f2 [xiaoshui@localhost testdir]$ ll total 0 -rw-rw-r-- 1 xiaoming root 0 Aug 4 20:43 f1 -rw-rw-r-- 1 xiaoshui root 0 Aug 4 20:44 f2 [xiaoshui@localhost testdir]$ id uid=1001(xiaoshui) gid=1001(xiaoshui) groups=1001(xiaoshui)
当testdir目录上附加了sgid权限的时候,普通用户在其下创建文件时候文件的属组会自动变为此目录的属组
STICKY:
功用:对于属组或全局可写的目录,组内的所有用户或系统上的所有用户对在此目录中都能创建新文件或者删除所有的已有文件;如果此目录设置为Sticky权限,则每个用户能创建新文件,且只能删除自己的文件
管理文件的Sticky权限:
chmod o+|-t FILE
展示位置:其他用户的执行权限位
如果其他用户原有执行权限,显示为小写t;
否则,显示为大写T
系统上的/tmp和/var/tmp目录默认均有sticky权限
facl:file access control lists
文件的额外赋权机机制:
在原来的ugo之外,另一层让普通用户能够控制赋权给另外的用户或组的赋权机制。
getfacl命令:
getfacl FILE…
user:USERNAME:mode
group:GROUPNAME:MODE
setfacl命令:
赋权给用户:
setfacl -m u:USERNAME:MODE
赋权给组:
setfacl -m g:GROUPNAME:MODE
撤销赋权:
setfacl -x u:USERNAME file…
setfacl -x u:GROUPNAME file…
[root@localhost testdir]# ll total 4 -rw-rw---- 1 xiaoshui root 14 Aug 4 20:58 f1 -rw-rw-r-- 1 xiaoshui root 0 Aug 4 20:44 f2 [xiaoshui@localhost testdir]$ cat f1 cat: f1: Permission denied [root@localhost testdir]# setfacl -m u:xiaoshui:r f1 [xiaoshui@localhost testdir]$ cat f1 kdhjfkfhhjhkj [xiaoxiao@localhost testdir]$ cat f1 cat: f1: Permission denied
本来文件f1对其他用户无权限,所以xiaoshui用户当然也查看不了,root使用setfacl给f1设置xiaoshui用户可读,所以xiaoshui便可以访问了。使用其他普通用户依然无法查看f1.
ACL文件上的group权限是mask 值(自定义用户, 自定义组,拥有组的最大权限),而非传统的组权限,mask只影响除所有者和other的之外的人和组的最大权限,需要与用户的权限进行逻辑与运算后,才能变成有限的权限(Effective Permission)
原创文章,作者:我的滑板鞋,如若转载,请注明出处:http://www.178linux.com/28962
评论列表(1条)
文章的层次结构清晰明了,内容丰满,有理论有实践。