理解Linux文件权限

作者: 分类: *nix 时间: 2016-10-19 评论: 暂无评论

0x00 基础内容

先来看一张图:

preview.png

再来看一张图:

file.png

ls -l之后显示的内容所代表的含义分别就是这样:

其中我们主要说文件类型和文件权限,等下详细说。

接下去是硬链接(Hard Links)个数,在linux里,软连接(ln -s)类似于windows下的快捷方式,而硬链接则不同,两个硬链接之间靠一个叫做inode(ls -i可查看)的数据结构来联系起来,相当于是两个一模一样的文件,但是删除任何一个文件,另外一个文件不会失效,也就是系统中只要存在一个此inode的文件,那么这个文件就一直在,不会因为最初的文件被删除而失效。下面演示一下吧:

inode.png

之后是所属的用户(User)和组(Group),文件大小,最后修改时间,文件名

0x01 文件类型

我们回头来看下文件类型(File Type),在linux下有这么几个文件类型:

-: 普通文件(Regular file)
d: 目录(Directory files)
b: 块文件(Block file)
c: 字符设备文件(Character device file)
p: (命名)管道文件(Named pie file or just a pipe file)
l: 符号连接文件(Symbolic link file)
s: socket文件(Socket file)

其中最常见的是-``d``l

0x02 文件权限

一个文件的权限如下

rwxr-xr--

总共是9位,r表示读,w表示写,x表示执行,其中每三位一组分别对应

文件所属用户User的权限,所属组Group的权限,其他用户Other的权限

file_permission.png

文件权限用12个二进制位表示,0表示不设置,1表示设置,比如下面这个对应二进制就是这样:

SGTrwxr-xr--
000111101100

SGT分别对应SUID,SGID,Sticky,我们下节再讲。现在我们抽出中间这组来看下,rwx对应111,那么转化成8进制就是

r->4
w->2
x->1

所以rwx也可以表示成7,所以rwxr-xr--对应754

perms.png

因此在linux下我们可以有如下的方式来设置权限(其中u,g,o,a分别对应user,group,other,all)

chmod 755 file #权限设置为rwxr-xr-x
chmod -R 755 directory #递归给目录里的文件(夹)设置权限
chmod u+x file #给file的属主增加执行权限
chmod u=rwx,g=rx,o=rx #同第一例
chmod a=r file #为所有用户分配读权限,即r--r--r--
chmod a-wx,a+r #同上例

0x03 SUID,SGID,StickyBit

最后一部分了,这部分就说SUID(Set User ID),SGID(Set Group ID)和StickyBit

linux内核是根据进程的运行用户的(有效)ID,包括user id和group id来确定一个进程对资源的访问权限。用id命令可以看到当前的uid和gid。

除了一般的user id和group id外,还有两个称之为effective的id,就是有效id。其实内核主要是根据euid和egid来判断的。

一个进程如果没有设置SUID或者SGID,那么euid=uid,egid=gid。比如现在有两个用户:

用户A:uid=100,gid=100
用户B:uid=200,gid=200

现在有个文件file属于用户A

  1. 此时没有设置SUID也没有设置SGID,用户B运行后,则euid=uid=200,egid=gid=200。
  2. 此时设置了SUID,用户B运行后,则euid=100,egid=100

SUID的作用就是让本来没有相应权限的用户运行了这个程序后能有权限访问他没有权限访问的资源。

SUID的优先级比SGID高,当一个可执行程序设置了SUID,则SGID会自动变成相应的egid。

SUID

简单举个例子吧。比如有一个文件:

-rwsr-xrw- 1 jack jack 17 10月 16 19:06 test

jack拥有这个文件,现在mike执行了这个文件,那么可以临时获得jack的权限。

最常见的就是passwd这个命令了,我们可以看一下

$ ls -lh /usr/bin/passwd
-rwsr-xr-x 1 root root 46K  1月 27  2016 /usr/bin/passwd

可以看到,属于root用户,但是设置了SUID,所以我们以非root用户执行passwd修改密码的时候就能暂时获得root权限,进而修改密码。

设置SUID的方法是:

#set:
chmod u+s file
#unset:
chmod u-s file

SGID

SGID有对于文件和目录两个方面:

  • 文件:和SUID类似,只不过只是改变所属组(egid),不改变所属用户(euid)
  • 目录:如果SGID是设置在A目录上,则在改目录下所建立的文件和目录的用户组都将是A目录的用户组

设置SGID方法:

#set:
chmod g+s file
#unset:
chmod g-s file

Sticky Bit

可以这么理解,就是在一个777的目录里,所有人都有权限进行新建/修改/删除文件的权限,这样用户A新建的文件,可以被用户B删除。

如果加了StickyBit之后,用户B可以增加文件,也可以修改属于A的文件,但是却不能删除属于A的文件。

最典型的例子就是/tmp目录:

$ ls -l / | grep tmp
drwxrwxrwt   8 root root  180 Oct 18 16:24 tmp

设置StickyBit的方法:

#set
chmod o+t dict
#unset
chmod o-t dict

0x04 总结

还记得第二节的这个吗

SGTrwxr-xr--
000111101100

我们可以扩展设置权限的命令如下:

chmod 6767 file #相当于rwsrwSrwx(大写S表示无执行权限却设置了SUID或者SGID)
chmod 7777 dict #相当于rwsrwsrwt

关于文件权限这个东西,比如nebula这套练习系统里会涉及。玩这套系统的过程中就会有更深的体会。

参考资料:

Learn 3 Important Bits - StickyBit, SUID & SGID in Linux with Examples

关于UNIX和Linux系统下SUID、SGID的解析

文件特殊权限:SUID/SGID/Sticky Bit

标签: none

声明:文章基本原创,允许转载,但转载时必须以超链接的形式标明文章原始出处及作者信息。

添加新评论