第七章 文件与目录的默认权限与隐藏权限

[size=large][b]文件与目录的默认权限与隐藏权限[/b][/size]

由第六章 Linux文件权限的内容我们可以知道一个文件有若干个属性,包括读写运行(r, w, x)等基本权限,及是否为目录 (d) 与文件 (-) 或者是连结档 (l) 等等的属性! 要修改属性的方法在前面也约略提过了([color=red]chgrp, chown, chmod[/color]) ,本小节会再加强补充一下!

除了基本r, w, x权限外,在Linux的Ext2/Ext3文件系统下,我们还可以配置其他的系统隐藏属性, [color=red]这部分可使用 chattr 来配置,而以 lsattr 来查看,最重要的属性就是可以配置其不可修改的特性![/color]让连文件的拥有者都不能进行修改! 这个属性可是相当重要的,尤其是在安全机制上面 (security)!

首先,先来复习一下上一章谈到的权限概念,将底下的例题看一看先:



例题:
你的系统有个一般身份使用者 dmtsai,他的群组属於 users,他的家目录在 /home/dmtsai, 你是root,你想将你的 ~/.bashrc 复制给他,可以怎么作?
答:
由上一章的权限概念我们可以知道 root 虽然可以将这个文件复制给 dmtsai,不过这个文件在 dmtsai 的家目录中却可能让 dmtsai 没有办法读写(因为该文件属於 root 的嘛!而 dmtsai 又不能使用 chown 之故)。 此外,我们又担心覆盖掉 dmtsai 自己的 .bashrc 配置档,因此,我们可以进行如下的动作喔:
复制文件: cp ~/.bashrc ~dmtsai/bashrc
修改属性: chown dmtsai:users ~dmtsai/bashrc





例题:
我想在 /tmp 底下创建一个目录,这个目录名称为 chapter7_1 ,并且这个目录拥有者为 dmtsai, 群组为 users ,此外,任何人都可以进入该目录浏览文件,不过除了 dmtsai 之外,其他人都不能修改该目录下的文件。
答:
因为除了 dmtsai 之外,其他人不能修改该目录下的文件,所以整个目录的权限应该是 drwxr-xr-x 才对! 因此你应该这样做:
创建目录: mkdir /tmp/chapter7_1
修改属性: chown -R dmtsai:users /tmp/chapter7_1
修改权限: chmod -R 755 /tmp/chapter7_1



在上面这个例题当中,如果你知道 755 那个分数是怎么计算出来的,那么你应该对於权限有一定程度的概念了。 如果你不知道 755 怎么来的?那么...赶快回去前一章看看 chmod 那个命令的介绍部分啊!这部分很重要喔!你得要先清楚的了解到才行~否则就进行不下去罗~ 假设你对於权限都认识的差不多了,那么底下我们就要来谈一谈,『新增一个文件或目录时,默认的权限是什么?』这个议题!

[size=large][b]文件默认权限:umask[/b][/size]

OK!那么现在我们知道如何创建或者是改变一个目录或文件的属性了,不过, 你知道当你创建一个新的文件或目录时,他的默认权限会是什么吗?呵呵!那就与 umask 这个玩意儿有关了!那么 umask 是在搞什么呢?基本上, [color=red]umask 就是指定 『目前使用者在创建文件或目录时候的权限默认值』[/color], 那么如何得知或配置 umask 呢?他的指定条件以底下的方式来指定:

[code="Linux"]
# umask
0022 <==与一般权限有关的是后面三个数字!
# umask -S
u=rwx,g=rx,o=rx
[/code]

查阅的方式有两种,一种可以直接输入 umask ,就可以看到数字型态的权限配置分数, 一种则是加入 -S (Symbolic) 这个选项,就会以符号类型的方式来显示出权限了! 奇怪的是,怎么 umask 会有四组数字啊?不是只有三组吗?是没错啦。 [color=red]第一组是特殊权限用的[/color],我们先不要理他,所以先看后面三组即可。

在默认权限的属性上,目录与文件是不一样的。从第六章我们知道 x 权限对於目录是非常重要的! 但是一般文件的创建则不应该有运行的权限,因为一般文件通常是用在於数据的记录嘛!当然不需要运行的权限了。 因此,默认的情况如下:


A 若使用者创建为『文件』则默认『没有可运行( x )权限[/color]』,亦即只有 rw 这两个项目,也就是最大为 666 分,默认权限如下:

-rw-rw-rw- 666

B 若使用者创建为『目录』,则由於 x 与是否可以进入此目录有关,因此[color=red]创建目录默认为所有权限均开放,亦即为 777 分[/color],默认权限如下:

drwxrwxrwx 777



要注意的是,[color=red]umask 的分数指的是『该默认值需要减掉的权限!』[/color]因为 r、w、x 分别是 4、2、1 分,所以罗!也就是说,当要拿掉能写的权限,就是输入 2 分,而如果要拿掉能读的权限,也就是 4 分,那么要拿掉读与写的权限,也就是 6 分,而要拿掉运行与写入的权限,也就是 3 分,这样了解吗?请问你, 5 分是什么?呵呵! 就是读与运行的权限啦!

如果以上面的例子来说明的话,因为 umask 为 022 ,所以 user 并没有被拿掉任何权限,不过 group 与 others 的权限被拿掉了 2 (也就是 w 这个权限),那么当使用者:

[color=red]
创建文件时:(-rw-rw-rw-) - (-----w--w-) ==> -rw-r--r--
创建目录时:(drwxrwxrwx) - (d----w--w-) ==> drwxr-xr-x[/color]
不相信吗?我们就来测试看看吧!

[code="Linux"]
# umask
0022
# touch test1
# mkdir test2
# ll
-rw-r--r-- 1 root root 0 Sep 27 00:25 test1
drwxr-xr-x 2 root root 4096 Sep 27 00:25 test2
[/code]

呵呵!瞧见了吧!确定新建文件的权限是没有错的。

[size=small][b]umask的利用与重要性:专题制作[/b][/size]

想像一个状况,如果你跟你的同学在同一部主机里面工作时,因为你们两个正在进行同一个专题, 老师也帮你们两个的帐号创建好了相同群组的状态,并且将 /home/class/ 目录做为你们两个人的专题目录。 想像一下,有没有可能你所制作的文件你的同学无法编辑?果真如此的话,那就伤脑筋了!

这个问题很常发生啊!举上面的案例来看就好了,你看一下 test1 的权限是几分? 644 呢!意思是『如果 umask 订定为 022 ,那新建的数据只有使用者自己具有 w 的权限, 同群组的人只有 r 这个可读的权限而已,并无法修改喔!』这样要怎么共同制作专题啊!您说是吧!

所以,当我们需要新建文件给同群组的使用者共同编辑时,那么 umask 的群组就不能拿掉 2 这个 w 的权限! 所以罗, umask 就得要是 002 之类的才可以!这样新建的文件才能够是 -rw-rw-r-- 的权限模样喔! 那么如何配置 umask 呢?简单的很,[color=red]直接在 umask 后面输入 002 就好了![/color]

[code="Linux"]
# umask 002
# touch test3
# mkdir test4
# ll
-rw-rw-r-- 1 root root 0 Sep 27 00:36 test3
drwxrwxr-x 2 root root 4096 Sep 27 00:36 test4
[/code]

所以说,这个 umask 对於新建文件与目录的默认权限是很有关系的!这个概念可以用在任何服务器上面, 尤其是未来在你架设文件服务器 (file server) ,举例来说, SAMBA Server 或者是 FTP server 时, 都是很重要的观念!这牵涉到你的使用者是否能够将文件进一步利用的问题喔!不要等闲视之!


例题:
假设你的 umask 为 003 ,请问该 umask 情况下,创建的文件与目录权限为?
答:
umask 为 003 ,所以拿掉的权限为 --------wx,因此:
文件: (-rw-rw-rw-) - (--------wx) = -rw-rw-r--
目录: (drwxrwxrwx) - (--------wx) = drwxrwxr--


在默认的情况中, root 的 umask 会拿掉比较多的属性,root 的 umask 默认是 022 , 这是基於安全的考量啦~至於一般身份使用者,通常他们的 umask 为 002 ,亦即保留同群组的写入权力! 其实,关於默认 umask 的配置可以参考[color=red] /etc/bashrc[/color] 这个文件的内容,不过,不建议修改该文件, 你可以参考第十一章 bash shell 提到的环境参数配置档 (~/.bashrc) 的说明!

[size=large][b]文件隐藏属性:[/b][/size]

什么?文件还有隐藏属性?光是那九个权限就快要疯掉了,竟然还有隐藏属性,真是要命~ 但是没办法,就是有文件的隐藏属性存在啊!不过,这些隐藏的属性确实对於系统有很大的帮助的~ 尤其是在系统安全 (Security) 上面,重要的紧呢!不过要先强调的是,底下的chattr命令只能在Ext2/Ext3的文件系统上面生效, 其他的文件系统可能就无法支持这个命令了。底下我们就来谈一谈如何配置与检查这些隐藏的属性吧!

[size=small][b]chattr (配置文件隐藏属性)[/b][/size]

[code="Linux"]
# chattr [+-=][ASacdistu] 文件或目录名称
选项与参数:
+ :添加某一个特殊参数,其他原本存在参数则不动。
- :移除某一个特殊参数,其他原本存在参数则不动。
= :配置一定,且仅有后面接的参数

A :当配置了 A 这个属性时,若你有存取此文件(或目录)时,他的存取时间 atime
将不会被修改,可避免I/O较慢的机器过度的存取磁碟。这对速度较慢的计算机有帮助
S :一般文件是非同步写入磁碟的(原理请参考第五章sync的说明),如果加上 S 这个
属性时,当你进行任何文件的修改,该更动会『同步』写入磁碟中。

a :当配置 a 之后,这个文件将只能添加数据,而不能删除也不能修改数据,只有root
才能配置这个属性。

c :这个属性配置之后,将会自动的将此文件『压缩』,在读取的时候将会自动解压缩,
但是在储存的时候,将会先进行压缩后再储存(看来对於大文件似乎蛮有用的!)
d :当 dump 程序被运行的时候,配置 d 属性将可使该文件(或目录)不会被 dump 备份

i :这个 i 可就很厉害了!他可以让一个文件『不能被删除、改名、配置连结也无法
写入或新增数据!』对於系统安全性有相当大的助益!只有 root 能配置此属性

s :当文件配置了 s 属性时,如果这个文件被删除,他将会被完全的移除出这个硬盘
空间,所以如果误删了,完全无法救回来了喔!
u :与 s 相反的,当使用 u 来配置文件时,如果该文件被删除了,则数据内容其实还
存在磁碟中,可以使用来救援该文件喔!
注意:属性配置常见的是 a 与 i 的配置值,而且很多配置值必须要身为 root 才能配置

范例:请尝试到/tmp底下创建文件,并加入 i 的参数,尝试删除看看。
# cd /tmp
# touch attrtest <==创建一个空文件
# chattr +i attrtest <==给予 i 的属性
# rm attrtest <==尝试删除看看
rm: remove write-protected regular empty file `attrtest'? y
rm: cannot remove `attrtest': Operation not permitted <==操作不许可
# 看到了吗?呼呼!连 root 也没有办法将这个文件删除呢!赶紧解除配置!

范例:请将该文件的 i 属性取消!
# chattr -i attrtest
[/code]

这个命令是很重要的,尤其是在系统的数据安全上面!由於这些属性是隐藏的性质,所以需要以 lsattr 才能看到该属性呦![color=red]其中,个人认为最重要的当属 +i 与 +a 这个属性了。[/color]+i 可以让一个文件无法被更动,对於需要强烈的系统安全的人来说, 真是相当的重要的!里头还有相当多的属性是需要 root 才能配置的呢!

此外,如果是 log file 这种的登录档,[color=red]就更需要 +a 这个可以添加,但是不能修改旧有的数据与删除的参数了![/color]怎样?很棒吧! 未来提到登录档 (十九章) 的认知时,我们再来聊一聊如何配置他吧!

[size=small][b]lsattr (显示文件隐藏属性)[/b][/size]

[code="Linux"]
# lsattr [-adR] 文件或目录
选项与参数:
-a :将隐藏档的属性也秀出来;
-d :如果接的是目录,仅列出目录本身的属性而非目录内的档名;
-R :连同子目录的数据也一并列出来!

# chattr +aij attrtest
# lsattr attrtest
----ia---j--- attrtest
[/code]

使用 chattr 配置后,可以利用 lsattr 来查阅隐藏的属性。不过, 这两个命令在使用上必须要特别小心,否则会造成很大的困扰。例如:某天你心情好,突然将 /etc/shadow 这个重要的密码记录文件给他配置成为具有 i 的属性,那么过了若干天之后, 你突然要新增使用者,却一直无法新增!别怀疑,赶快去将 i 的属性拿掉吧!

[size=large][b]文件特殊权限: SUID, SGID, SBIT[/b][/size]

我们前面一直提到关於文件的重要权限,那就是 rwx 这三个读、写、运行的权限。 但是,眼尖的朋友们在第六章的目录树章节中, 一定注意到了一件事,那就是,怎么我们的 /tmp 权限怪怪的? 还有,那个 /usr/bin/passwd 也怪怪的?怎么回事啊?看看先:

[code="Linux"]
# ls -ld /tmp ; ls -l /usr/bin/passwd
drwxrwxrwt 7 root root 4096 Sep 27 18:23 /tmp
-rwsr-xr-x 1 root root 22984 Jan 7 2007 /usr/bin/passwd
[/code]

不是应该只有 rwx 吗?还有其他的特殊权限( s 跟 t )啊?啊.....头又开始昏了~ @_@ 因为 s 与 t 这两个权限的意义与[color=red]系统的帐号[/color] (第十四章)及系统的程序(process, 第十七章)较为相关, 所以等到后面的章节谈完后你才会比较有概念!底下的说明先看看就好,如果看不懂也没有关系, 先知道s放在哪里称为SUID/SGID以及如何配置即可,等系统程序章节读完后,再回来看看喔!

[size=small][b]Set UID[/b][/size]

当 s 这个标志出现在文件拥有者的 x 权限上时,例如刚刚提到的 /usr/bin/passwd 这个文件的权限状态:『-rwsr-xr-x』,此时就被称为 Set UID,简称为 SUID 的特殊权限。 那么SUID的权限对於一个文件的特殊功能是什么呢?基本上SUID有这样的限制与功能:

[color=red]SUID 权限仅对二进位程序(binary program)有效;[/color]
运行者对於该程序需要具有 x 的可运行权限;
本权限仅在运行该程序的过程中有效 (run-time);
运行者将具有该程序拥有者 (owner) 的权限。

讲这么硬的东西你可能对於 SUID 还是没有概念,没关系,我们举个例子来说明好了。 我们的 Linux 系统中,所有帐号的密码都记录在 /etc/shadow 这个文件里面,这个文件的权限为:『-r-------- 1 root root』,意思是这个文件仅有root可读且仅有root可以强制写入而已。 既然这个文件仅有 root 可以修改,那么鸟哥的 vbird 这个一般帐号使用者能否自行修改自己的密码呢? 你可以使用你自己的帐号输入『passwd』这个命令来看看,嘿嘿!一般使用者当然可以修改自己的密码了!

唔!有没有冲突啊!明明 /etc/shadow 就不能让 vbird 这个一般帐户去存取的,为什么 vbird 还能够修改这个文件内的密码呢? 这就是 SUID 的功能啦!藉由上述的功能说明,我们可以知道

vbird 对於 /usr/bin/passwd 这个程序来说是具有 x 权限的,表示 vbird 能运行 passwd;
passwd 的拥有者是 root 这个帐号;
[color=red]vbird 运行 passwd 的过程中,会『暂时』获得 root 的权限;[/color]
/etc/shadow 就可以被 vbird 所运行的 passwd 所修改。
但如果 vbird 使用 cat 去读取 /etc/shadow 时,他能够读取吗?[color=red]因为 cat 不具有 SUID 的权限,所以 vbird 运行 『cat /etc/shadow』 时,是不能读取 /etc/shadow 的。[/color]我们用一张示意图来说明如下:


[img]http://dl2.iteye.com/upload/attachment/0099/6515/1359c8de-3e4f-367d-b231-e11939c9f7db.gif[/img]

另外,[color=red]SUID 仅可用在binary program 上[/color], 不能够用在 shell script 上面!这是因为 shell script 只是将很多的 binary 运行档叫进来运行而已!所以 SUID 的权限部分,还是得要看 shell script 呼叫进来的程序的配置, 而不是 shell script 本身。[color=red]当然,SUID 对於目录也是无效的[/color]~这点要特别留意。

[size=small][b]Set GID[/b][/size]

当 s 标志在文件拥有者的 x 项目为 SUID,[color=red]那 s 在群组的 x 时则称为 Set GID[/color], SGID 罗!是这样没错!^_^。 举例来说,你可以用底下的命令来观察到具有 SGID 权限的文件喔:

[code="Linux"]
# ls -l /usr/bin/locate
-rwx--s--x 1 root slocate 23856 Mar 15 2007 /usr/bin/locate
[/code]

与 SUID 不同的是,[color=red]SGID 可以针对文件或目录来配置![/color]如果是对文件来说, SGID 有如下的功能:

[color=red]SGID 对二进位程序有用;[/color]
[color=red]程序运行者对於该程序来说,需具备 x 的权限;[/color]
[color=red]运行者在运行的过程中将会获得该程序群组的支持![/color]

举例来说,上面的 /usr/bin/locate 这个程序可以去搜寻 /var/lib/mlocate/mlocate.db 这个文件的内容 (详细说明会在下节讲述), mlocate.db 的权限如下:

[code="Linux"]
# ll /usr/bin/locate /var/lib/mlocate/mlocate.db
-rwx--s--x 1 root slocate 23856 Mar 15 2007 /usr/bin/locate
-rw-r----- 1 root slocate 3175776 Sep 28 04:02 /var/lib/mlocate/mlocate.db
[/code]

与 SUID 非常的类似,[color=red]若我使用 vbird 这个帐号去运行 locate 时,那 vbird 将会取得 slocate 群组的支持, 因此就能够去读取 mlocate.db 啦![/color]非常有趣吧!

除了 binary program 之外,[color=red]事实上 SGID 也能够用在目录上[/color],这也是非常常见的一种用途! 当一个目录配置了 SGID 的权限后,他将具有如下的功能:

使用者若对於此目录具有 r 与 x 的权限时,该使用者能够进入此目录;
使用者在此目录下的有效群组(effective group)将会变成该目录的群组;
用途:若使用者在此目录下具有 w 的权限(可以新建文件),则使用者所创建的新文件,该新文件的群组与此目录的群组相同。

SGID 对於专案开发来说是非常重要的!因为这涉及群组权限的问题,您可以参考一下本章后续情境模拟的案例,应该就能够对於 SGID 有一些了解的!^_^

[size=small][b]Sticky Bit[/b][/size]
这个 Sticky Bit,[color=red] SBIT 目前只针对目录有效[/color],对於文件已经没有效果了。 SBIT 对於目录的作用是:


当使用者对於此目录具有 w, x 权限,亦即具有写入的权限时;

当使用者在该目录下创建文件或目录时,仅有自己与 root 才有权力删除该文件。


换句话说:当甲这个使用者於 A 目录是具有群组或其他人的身份,并且拥有该目录 w 的权限, 这表示『甲使用者对该目录内任何人创建的目录或文件均可进行 "删除/更名/搬移" 等动作。』 不过,如果将 A 目录加上了 SBIT 的权限项目时, 则甲只能够针对自己创建的文件或目录进行删除/更名/移动等动作,而无法删除他人的文件。

举例来说,我们的 /tmp 本身的权限是『drwxrwxrwt』, 在这样的权限内容下,任何人都可以在 /tmp 内新增、修改文件,但仅有该文件/目录创建者与 root 能够删除自己的目录或文件。这个特性也是挺重要的啊!你可以这样做个简单的测试:

以 root 登陆系统,并且进入 /tmp 当中;
touch test,并且更改 test 权限成为 777 ;
以一般使用者登陆,并进入 /tmp;
尝试删除 test 这个文件!

由於 SUID/SGID/SBIT 牵涉到程序的概念,因此再次强调,这部份的数据在您读完第十七章关於程序方面的知识后,要再次的回来瞧瞧喔! 目前,你先有个简单的基础概念就好了!文末的参考数据也建议阅读一番喔!

[size=small][b]SUID/SGID/SBIT 权限配置[/b][/size]

前面介绍过 SUID 与 SGID 的功能,那么如何配置文件使成为具有 SUID 与 SGID 的权限呢? 这就需要第六章的数字更改权限的方法了! 现在你应该已经知道数字型态更改权限的方式为『三个数字』的组合, 那么如果在这三个数字之前再加上一个数字的话,[color=red]最前面的那个数字就代表这几个权限了![/color]

[color=red]4 为 SUID
2 为 SGID
1 为 SBIT[/color]

假设要将一个文件权限改为『-rwsr-xr-x』时,由於 s 在使用者权限中,所以是 SUID ,因此, 在原先的 755 之前还要加上 4 ,也就是:『 chmod 4755 filename 』来配置!此外,还有大 S 与大 T 的产生喔!参考底下的范例啦!

[code="Linux"]
# cd /tmp
# touch test <==创建一个测试用空档
# chmod 4755 test; ls -l test <==加入具有 SUID 的权限
-rwsr-xr-x 1 root root 0 Sep 29 03:06 test
# chmod 6755 test; ls -l test <==加入具有 SUID/SGID 的权限
-rwsr-sr-x 1 root root 0 Sep 29 03:06 test
# chmod 1755 test; ls -l test <==加入 SBIT 的功能!
-rwxr-xr-t 1 root root 0 Sep 29 03:06 test
# chmod 7666 test; ls -l test <==具有空的 SUID/SGID 权限
-rwSrwSrwT 1 root root 0 Sep 29 03:06 test
[/code]

最后一个例子就要特别小心啦!怎么会出现大写的 S 与 T 呢?不都是小写的吗? 因为 s 与 t 都是取代 x 这个权限的,但是你有没有发现阿,我们是下达 7666 喔!也就是说, user, group 以及 others 都没有 x 这个可运行的标志( 因为 666 嘛 ),[color=red]所以,这个 S, T 代表的就是『空的』啦![/color]怎么说? [color=red]SUID 是表示『该文件在运行的时候,具有文件拥有者的权限』[/color],但是文件 拥有者都无法运行了,哪里来的权限给其他人使用?当然就是空的啦! ^_^

而除了数字法之外,你也可以透过符号法来处理喔!其中 SUID 为 u+s ,而 SGID 为 g+s ,SBIT 则是 o+t 罗!来看看如下的范例:

[code="Linux"]
# 配置权限成为 -rws--x--x 的模样:
# chmod u=rwxs,go=x test; ls -l test
-rws--x--x 1 root root 0 Aug 18 23:47 test

# 承上,加上 SGID 与 SBIT 在上述的文件权限中!
# chmod g+s,o+t test; ls -l test
-rws--s--t 1 root root 0 Aug 18 23:47 test
[/code]

[size=large][b]观察文件类型:file[/b][/size]

如果你想要知道某个文件的基本数据,例如是属於 ASCII 或者是 data 文件,或者是 binary , 且其中有没有使用到动态函式库 (share library) 等等的资讯,就可以利用 file 这个命令来检阅喔! 举例来说:

[code="Linux"]
# file ~/.bashrc
/root/.bashrc: ASCII text <==告诉我们是 ASCII 的纯文字档啊!
# file /usr/bin/passwd
/usr/bin/passwd: setuid ELF 32-bit LSB executable, Intel 80386, version 1
(SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), for
GNU/Linux 2.6.9, stripped
# 运行档的数据可就多的不得了!包括这个文件的 suid 权限、兼容於 Intel 386
# 等级的硬件平台、使用的是 Linux 核心 2.6.9 的动态函式库连结等等。
# file /var/lib/mlocate/mlocate.db
/var/lib/mlocate/mlocate.db: data <== 这是 data 文件!
[/code]

透过这个命令,我们可以简单的先判断这个文件的格式为何喔!

转自:[url]http://vbird.dic.ksu.edu.tw/linux_basic/0220filemanager_4.php[/url]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值