文件与目录的默认权限与隐藏权限:在《Linux文件属性》和《Linux --- 如何改变文件权限》里面我们可以知道一个文件有若干个属性,包括(r,w,x)等基本属性及是否为目录(d)和文件(-)或者是连结文件(l)等属性,其实Linux还可以设定其它的系统安全属性,使用 chattr 来设定,而以 lsattr 来查看,最重要的属性就是可设定其不可修改的特性!就连文件的拥有者都不可能进行修改!这个属性可是相当重要的,尤其是在安全机制上面(security)!
通过一个例子回顾一下:我的系统有一个普通用户 chd ,他的群组为 users ,他的家目录在 /home/chd ,(假设你是root)你想将你的~/hello 复制给他
如果我在 /tmp 下新建一个名为 hello 的目录,这个目录的拥有者是 chd ,群组为 users ,任何人都可以进入该目录浏览文件,不过除了 chd 之外,其他人都不能修改该目录下的文件。
上面例子中,如果你知道755那个数字怎么计算出来的,那你应该对于权限有一定的概念了,如果还不知道755怎么来的,可以看一下 chmod 命令的介绍部分。
umask 文件默认权限
当我们知道如何新建或者改变一个目录或文件的属性后, 它的默认属性就和 umask 有关了,umask 就是指定目前使用者在新建文件或者目录时的属性默认值,查看条件的方式有两种:①可以直接输入 umark 就可以看到数字形式的权限设定 ②另一种是加入 -S (Symbolic)这个参数就会以符号类型的方式来显示出权限了。
上面可以看到,输入 umask 命令后出现4组数字,其中第一组是用于特殊权限,我们先来了解后面3组
在默认权限的属性上,文件和目录是不一样的,在默认情况中文件是没有可执行权限的,因此:
①用户新建文件没有可执行(X)权限,所以只有 rw 这两个权限,也就是说最大值为 666 ()
②若用户新建的是目录,由于 x 与是否可以进入此目录有关,因此默认为所有权限都开放,即最大值为 777 ()
umask 指定的是该默认值需要减掉的权限,因为 r、w、x 分别是 4、2、1 ,当去掉写入的权限,就输入 2 ,如果去掉读取权限就输入 4 ,如果去掉写入和执行权限就输入 3 。上面的例子可以看出,umask 为 022 ,所以 user 并没有被去掉属性,group 与other 的属性被拿掉了 2 (也就是 w 属性)那么当用户:
①新建文件时:
②新建目录时:
假如 chd 是 users 这个群组的人,而用户 chd 的文件希望让 users 同群组的人也可以存取文件呢,也就是说,我们希望做出来的文件应该是这样的,直接在 umask 后面输入 002 就好了
这个 umask 对于文件和目录的预设权限时很有关系的,这牵涉到用户是否能够将文件进一步使用的问题
将前面的文件 text1 和目录 text2 删除,假设你的 umask 为 003 ,那么新建的文件和目录权限是多少呢?
文件:
目录:
chattr 设定文件隐藏属性
为了做一个对比,我将前面新建的文件 text1 删除,再用touch命令新建 text1 文件,使用 chattr -i 命令之后提示无法删除!
这个命令是很重要的,尤其是在系统的安全性上面!由于这是隐藏属性,所以需要用 lsattr 才能看到该属性,个人认为最重要的还是 -i 这个属性了,因为它可以让一个文件无法被改动。
lsattr 显示文件隐藏属性
参数: -a:将隐藏文件的属性显示出来
-R:连同子目录的数据也一起列出来
SUID/SGID/Sticky Bit 文件特殊权限
前面提到了关于文件的重要权限:rwx 这三个读、写、执行的权限。注意一下我们的 /tmp 和 /usr/bin/passwd 的权限有点奇怪
上面这两个文件不仅只有 rwx 权限,还有其它的特殊权限!要了解这几个特殊权限,必须先具有账号的 ID 概念,以及程序(process)的概念后,才能进一步了解这个特殊权限所代表的意义
Set UID
会制作出 s 与 t 的权限,是为了让一般用户在执行某些程序的时候,能够暂时的具有该程序拥有者的权限。例如我们知道账号和密码的存放文件是 /etc/passwd 和 /etc/shadow 。而 /etc/shadow 这个文件的权限是[ -r-------- ],且它的拥有者是 root ,在这个权限中,仅有 root 可以强制存储,其他人是无法查看的。如果使用 chd 这个用户去更新自己的密码时使用的/uer/bin/passwd这个程序却可以更新自己的密码,这就是 s 这个权限的作用,当 s 这个权限在 user 的 x 时,也就是类似于上面的 - rwsr- xr- x ,被称为 Set UID,简称为 SUID,这个 UID 代表的是 user 的 ID,而 user 代表的则是这个程序(/usr/bin/passwd)的拥有者(root)由此可知,当用户 chd 执行 /usr/bin/passwd 时,他会暂时得到文件拥有者 root 的权限。
SUID因为是程序在执行过程中拥有文件拥有者的权限,因此它仅可用于 二进制文件(binary file )上,不能用在批次文件(shell script) 上,这是因为 shell script 只是将很多的 binary 执行文档调用进来执行而已!所以 SUID 的权限部分,还是要看 shell script 调用进来的程序来设定,而不是 shell script 本身。需要注意的是:SUID对于目录也是无效的!
Set GID
如果 s 的权限是在 group 时,那么就是 Set GID,简称为 SGID。SGID 可以用在2个部分:
①文件:如果 SGID 是设定在 binary file 上,则使用者不论是谁,在执行程序时,他的有效群组(effective group)将会变成该程序的群组所有人(group id)
②目录:如果 SGID 是设定在目录上,则在该目录内所新建的文件或目录的 group 将会是此目录的group !
Sticky Bit
这个 Sticky Bit 目前只针对目录有效,对于文件已经没有效果了。SBit 对于目录的作用是:在具有 SBit 的目录下,用户若在该目录下具有 w 及 x 的权限,则用户在该目录下新建文件或目录时,只有文件拥有者与 root 才有权限删除。
例如我们的 /tmp 本身的权限是[ drwxrwxrwt ],在这个权限下,任何人都可以在 /tmp 内新增、修改文件,但仅有该文件/目录建立者与 root 能够删除自己的文件和目录。
SUID/SGID/SBIT 权限设定
上面介绍过 SUID 和 SGID 的功能,要想使文件具有 SUID 和 SGID 的权限,就需要刚刚的数字更改权限的方法了,数字型态更改权限的方式为3个数字的组合,在这三个数字之前再加上一个数字的话,那最前面的数字就代表这几个属性了!
假如要将一个文件属性改为[ -rwsr-xr-x ]时,由于 s 在使用者权限中,所以是 SUID,因此在原先的 755 之前还要加上 4,那就是 [ chmod 47755 filename ]来设定。此外,还有大 S 和大 T 的产生(记住:SUID 不是用在目录上的,SBIT不是用在文件上的)
因为 s 和 t 都是取代 x 这个参数的,我写的是 7666 也就是说:user、group、others都没有 x 这个可执行权限(因为是666),所以这个 S、T 代表的就是[ 空 ]。SUID 是表示该文件在执行的时候具有文件拥有者的权限,但是文件拥有者都无法执行了,哪里来的权限给其他人用呢,当然就是空了!