Linux文件系统上的权限

首先我们来看一下如何修改文件的属主和属组

修改文件的属主:chown

chown [OPTION]... [OWNER][:[GROUP]]FILE...

用法

OWNER修改属主

OWNER:GROUP修改属主:属组

:GROUP修改属组

命令中的冒号可以用.替换

-R:递归


chowen [OPTION]... --reference=RFILE FILE...

参考RFILE文件的权限,将FILE文件的权限修改为与RFILE文件权限相同


修改文件的属组:chgrp

chgrp[OPTION]... GROUP FILE...

chgrp[OPTION]... --reference=RFILE FILE...


-R:递归


下面我们来说一下在Linux系统中,文件的权限

文件系统中文件的权限是指文件系统上文件和目录的权限,文件系统上的权限主要针对三类对象进行定义:

owner:属主,u

group:属组,g

other:其他,o


每个文件都针对每类访问者定义了三种权限:

r:readable

w:writable

x:excutable


权限针对文件和目录还有不同的含义:

文件:

r:可使用文件查看类工具获取其内容

w:可修改其内容

x:可以把此文件提请内核启动为一个进程


目录:

r:可以使用ls查看此目录中文件列表

w:可以在此目录中创建文件,也可以删除此目录中的文件

x:可以使用ls-l查看此目录中文件列表,可以cd进入此目录

这里,我们补充一个X

X:只给目录权限,不给文件x权限


这里,非常有必要说一下Linux文件系统中,权限应用模型:

以ls -l /etc/issue为例

-rw-r--r--. 1 root root 112 Jul 25 09:24 /etc/issue

然后执行 cat /etc/issue

1.首先看命令的发起者是否是文件的属主既左三位的权限,如果是则应用左三位的权限,否则

2.查看命令的发起者是否是文件的属组既中三位的权限,如果是则应用中三位的权限,否则

3.是使用右三位的权限


上面讲到我们可以用rwx来表示权限,这里我们讲一下另外一种表示方法

权限、二进制、八进制表示对应的表示方法

---000 0

--x 001 1

-w-010 2

-wx 011 3

r--100 4

r-x 101 5

rw-110 6

rwx 111 7

例如:

640: rw-r-----

rwxr-xr-x: 755


知道什么是文件权限,我们来说一下如何修改文件权限

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;


注意:仅管理员可修改文件的属主和属组;


文件或目录创建时的遮罩码:umask

umask:文件的权限反向掩码,遮罩码;

    文件:

    666-umask

    目录:

    777-umask


    注意:之所以文件用666去减,表示文件默认不能拥有执行权限:如果减得的结果中有执行权限,则需要将其加1;

    umask:023

    666-023=644

    777-023=754


    umask命令:

    umask:查看当前umask

    umask MASK:设置umask

    新建DIR权限: 777-umask

非特权用户umask是002

root的umask是022

umask–S 模式方式显示

umask–p 输出可被调用

全局设置:/etc/bashrc用户设置:~/.bashrc


    注意:此类设定仅对当前shell进程有效;



Linux文件系统上的特殊权限

在Linux文件系统上有三个特殊权限:SUID,GUID,Sticky

首先我们再次强调一下Linux权限模型是由mode和owner组成

mode:rwx

owner:ugo


这里我们有必要说一下安全上下文:

前提:进程有属主和属组;文件有属主和属组

1) 任何一个可执行程序文件能不能启动为进程:取决发起者对程序文件是否拥有执行权限

2) 启动为进程之后,其进程的属主为发起者;进程的属组为发起者所属的组

3) 进程访问文件时的权限,取决于进程的发起者

a) 进程的发起者,同文件的属主:则应用文件属主权限

b) 进程的发起者,属于文件属组;则应用文件属组权限

c) 应用文件“其它”权限


SUID:Set UID

前提:此类文件为有可执行权限的命令

任何一个可执行程序文件能不能启动为进程:取决发起者对程序文件是否拥有执行权限

启动为进程之后,其进程的属主为原程序文件的属主(此进程的有效身份不是发起者,而是命令文件自身的属主)

SUID只对二进制可执行程序有效

SUID设置在目录上无意义

权限设定:

chmodu+s FILE...

chmodu-s FILE...

使用ls-l查看时,此s可能显示为大写或小写两种形式之一;

属主原有执行权限时,显示为小写;

属主原无执行权限时,显示为大写;


SGID:Set GID

可执行文件上SGID权限:(当SGID作用于文件时)

任何一个可执行程序文件能不能启动为进程:取决发起者对程序文件是否拥有执行权限

启动为进程之后,其进程的属主为原程序文件的属组

权限设定:

chmodg+s FILE...

chmodg-s FILE...

目录上的SGID权限:(当SGID作用于目录时)

默认情况下,用户创建文件时,其属组为此用户所属的主组

一旦某目录被设定了SGID,则对此目录有写权限的用户在此目录中创建的文件所属的组为此目录的属组

通常用于创建一个协作目录

权限设定:

chmodg+sDIR...

chmodg-s DIR...


Sticky:沾滞位

具有写权限的目录通常用户可以删除该目录中的任何文件,无论该文件的权限或拥有权

在目录设置Sticky 位,只有文件的所有者或root可以删除该文件

sticky 设置在文件上无意义

权限设定:

chmodo+t DIR...

chmodo-t DIR...

例如:

ls-ld/tmpdrwxrwxrwt12rootroot4096Nov215:44/tmp


刚才在前面我们讲了权限数字法,同样,

三个特殊位也组成一组权限,既suidsgidsticky,可表示为;

SUID SGID STICKY

000 0

001 1

010 2

011 3

100 4

101 5

110 6

111 7

例:chmod4777 /tmp/a.txt

权限位映射

SUID: user,占据属主的执行权限位

s: 属主拥有x权限

S:属主没有x权限

SGID: group,占据属组的执行权限位

s: group拥有x权限

S:group没有x权限

Sticky: other,占据other的执行权限位

t: other拥有x权限

T:other没有x权限


设定文件特定属性:

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

chattr +a 只能增加

lsattr 显示特定属性


访问控制列表

ACL:Access Control List,实现灵活的权限管理

除了文件的所有者,所属组和其它人,可以对更多的用户设置权限

CentOS7.0默认创建的xfs和ext4文件系统有ACL功能。

CentOS7.X之前版本,默认手工创建的ext4文件系统无ACL功能。需手动增加:

tune2fs –o acl/dev/sdb1

mount –o acl/dev/sdb1 /mnt

ACL生效顺序:所有者,自定义用户,自定义组,其他人

为多用户或者组的文件和目录赋予访问权限rwx

mount -o acl /directory

getfacl file |directory

setfacl -m u:wang:rwx file|directory

setfacl -Rm g:sales:rwX directory

setfacl -M file.acl file|directory

setfacl -m g:salesgroup:rw file| directory

setfacl -m d:u:wang:rx directory

setfacl -x u:wang file |directory

setfacl -X file.acl directory


ACL文件上的group权限是mask 值(自定义用户,自定义组,拥有组的最大权限),而非传统的组权限

getfacl可看到特殊权限:flags

默认ACL权限给了x,文件也不会继承x权限。

base ACL 不能删除

setfacl-k dir 删除默认ACL权限

setfacl-b file1清除所有ACL权限

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


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

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

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

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

setfacl --set u::rw,u:wang:rw,g::r,o::-file1


备份和恢复ACL

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

#getfacl -R /tmp/dir1 > acl.txt

#setfacl -R -b /tmp/dir1

#setfacl -R --set-file=acl.txt /tmp/dir1

#getfacl -R /tmp/dir1