(整理自《鸟哥的linux私房菜》书籍)
1.文件默认权限:umask
你知道当你建立一个新的文件或目录时,他的默认权限会是什么吗?那就与 umask 有关了。基本上, umask 就是指定 『目前用户在建立文件或目录时候的权限默认值』, 那么如何得知或设定 umask 呢?他的指定条件以底下的方式来指定:
查阅的方式有两种,一种可以直接输入 umask ,就可以看到数字型态的权限设定分数, 一种则是加入 -S (Symbolic) 这个选项,就会以符号类型的方式来显示出权限了。第一组是特殊权限用的,我们先不要理他,先看后面三组即可。
在默认权限的属性上,目录与文件是不一样的。一般文件的建立则不应该有执行的权限,因为一般文件通常是用在于数据的记录,当然不需要执行的权限了。 因此,预设的情况如下:
• 若使用者建立为『文件』则预设『没有可执行( x )权限』,也就是最大为 666 ,预设权限如下:
-rw-rw-rw-
• 若用户建立为『目录』,则由于 x 与是否可以进入此目录有关,因此默认为所有权限均开放,亦即为 777 ,预设权限如下: drwxrwxrwx
要注意的是,umask 的分数指的是『该默认值需要减掉的权限』!因为 r、w、x 分别是 4、2、1 分,也就是说,当要拿掉能写的权限,就是输入 2 分,而如果要拿掉能读的权限,也就是 4 分,那么要拿掉读与写的权限,也就是 6 分,而要拿掉执行与写入的权限,也就是 3 分。
因为 umask 为 022 ,所以 user 并没有被拿掉任何权限,不过 group 与 others 的权限被拿掉了 2 (也就是 w 这个权限),那么当使用者:
• 建立文件时:(-rw-rw-rw-) - (-----w--w-) ==> -rw-r--r--
• 建立目录时:(drwxrwxrwx) - (d----w--w-) ==> drwxr-xr-x
2.文件隐藏属性:chattr与lsattr
要先强调的是,底下的 chattr 指令只能在Ext2/Ext3/Ext4 的 Linux 传统文件系统上面完整生效。
§ chattr (配置文件案隐藏属性)
这个指令是很重要的,尤其是在系统的数据安全上面!由于这些属性是隐藏的性质,所以需要以 lsattr 才能看到该属性。其中,个人认为最重要的当属 +i 与 +a 这两个属性。
§ lsattr (显示文件隐藏属性)
使用 chattr 设定后,可以利用 lsattr 来查阅隐藏的属性。
3.文件特殊权限: SUID, SGID, SBIT
首先看看:
不是应该只有 rwx 吗?还有其他的特殊权限( s 跟 t )啊?这与SUID、SGID、SBIT有关。
§ Set UID(SUID)
当 s 这个标志出现在文件拥有者的 x 权限上时,例如刚刚提到的 /usr/bin/passwd 这个文件的权限状态:『-rwsr-xr-x』,此时就被称为 Set UID,简称为 SUID 的特殊权限。
SUID 有这样的限制与功能:
• SUID 权限仅对二进制程序(binary program)有效;
• 执行者对于该程序需要具有 x 的可执行权限;
• 本权限仅在执行该程序的过程中有效 (run-time);
• 执行者将具有该程序拥有者 (owner) 的权限。
我们举个例子来说明:所有账号的密码都记录在 /etc/shadow 这个文件里面,这个文件的权限为:『---------- 1 root root』,意思是这个文件仅有 root 可读且仅有 root 可以强制写入而已。 既然这个文件仅有 root 可以修改,那么一般账号使用者dmtsai能否自行修改自己的密码呢? 使用这个一般账号输入『passwd』这个指令来看看,一般用户可以修改自己的密码。藉由上述的功能说明,我们可以知道:
1. dmtsai 对于 /usr/bin/passwd 这个程序来说是具有 x 权限的,表示 dmtsai 能执行 passwd;
2. passwd 的拥有者是 root 这个账号;
3. dmtsai 执行 passwd 的过程中,会『暂时』获得 root 的权限;
4. /etc/shadow 就可以被 dmtsai 所执行的 passwd 所修改。
用一张图说明:
另外,SUID 仅可用在 binary program 上, 不能够用在 shell script 上面!这是因为 shell script 只是将很多的 binary 执行档叫进来执行而已!所以 SUID 的权限部分,还是得要看 shell script 呼叫进来的程序的设定, 而不是 shell script 本身。而且,SUID 对于目录也是无效的。
§ Set GID(SGID)
当 s 标志在文件拥有者的 x 项目为 SUID,那 s 在群组的 x 时则称为 Set GID, SGID。举例来说,你可以用底下的指令来观察到具有 SGID 权限的文件:
与 SUID 不同的是,SGID 可以针对文件或目录来设定!如果是对文件来说, SGID 有如下的功能:
• SGID 对二进制程序有用;
• 程序执行者对于该程序来说,需具备 x 的权限;
• 执行者在执行的过程中将会获得该程序群组的支持!
举例来说,上面的 /usr/bin/locate 这个程序可以去搜寻 /var/lib/mlocate/mlocate.db 这个文件的内容, mlocate.db 的权限如下:
与 SUID 非常的类似,若我使用 dmtsai 这个账号去执行 locate 时,那 dmtsai 将会取得 slocate 群组的支持, 因此就能够去读取 mlocate.db。
除了 binary program 之外,事实上 SGID 也能够用在目录上,这也是非常常见的一种用途! 当一个目录设定了 SGID 的权限后,他将具有如下的功能:
• 用户若对于此目录具有 r 与 x 的权限时,该用户能够进入此目录;
• 用户在此目录下的有效群组(effective group)将会变成该目录的群组;
• 用途:若用户在此目录下具有 w 的权限(可以新建文件),则使用者所建立的新文件,该新文件的群组与此目录的群组相同。
§ Sticky Bit(SBIT)
这个 Sticky Bit, SBIT 目前只针对目录有效,对于文件已经没有效果了。SBIT 对于目录的作用是:
• 当用户对于此目录具有 w, x 权限,亦即具有写入的权限时;
• 当用户在该目录下建立文件或目录时,仅有自己与 root 才有权力删除该文件
换句话说:当甲这个用户于 A 目录是具有群组或其他人的身份,并且拥有该目录 w 的权限, 这表示甲用户对该目录内任何人建立的目录或文件均可进行 "删除/更名/搬移" 等动作。 不过,如果将 A 目录加上了 SBIT 的权限项目时, 则甲只能够针对自己建立的文件或目录进行删除/更名/移动等动作,而无法删除他人的文件。
举例来说,我们的 /tmp 本身的权限是『drwxrwxrwt』, 在这样的权限内容下,任何人都可以在 /tmp 内新增、修改文件,但仅有该文件/目录建立者与 root 能够删除自己的目录或文件。这个特性也是挺重要的!
§ SUID/SGID/SBIT 权限设定
• 4 为 SUID
• 2 为 SGID
• 1 为 SBIT
假设要将一个文件权限改为『-rwsr-xr-x』时,由于 s 在用户权力中,所以是 SUID ,因此, 在原先的 755 之前还要加上 4 ,也就是:『 chmod 4755 filename 』来设定!此外,还有大 S 与大 T 的产生。
除了数字法之外,你也可以透过符号法来处理,其中 SUID 为 u+s ,而 SGID 为 g+s ,SBIT 则是 o+t 。来看看如下的范例: