Chinaunix

标题: 类UNIX系统基础:文件安全与权限 [打印本页]

作者: wingger    时间: 2004-10-29 11:42
标题: 类UNIX系统基础:文件安全与权限
我正在看的一本书,自己也整理了一下
这里面可能用到用户管理方面的知识,可查看贴:
http://bbs.chinaunix.net/forum/viewtopic.php?p=2923303#2923303

主要有以下内容:
  1. 文件权限位
  2. 基本命令
  3. chmod
  4. suid/guid
  5. chown
  6. chgrp
  7. umask算法和用法
  8. 符号链接
复制代码


当创建一个文件的时候,系统保存了有关该文件的全部信息,包括:
" 文件的位置。
" 文件类型。
" 文件长度。
" 哪位用户拥有该文件,哪些用户可以访问该文件。
" i节点。
" 文件的修改时间。
" 文件的权限位。

让我们用touch命令创建一个文件:

  1. $ touch temp
复制代码


创建了一个空文件,现在用ls -l命令查看该目录下文件的属性(我这里用中文版):
如下:

  1. [root@Linux_chenwy temp]# ls -l
  2. 总用量 36
  3. -rw-r--r--    1 root     root        34890 10月 19 20:17 httpd.conf
  4. -rw-r--r--    1 root     root            0 10月 19 20:16 temp
复制代码


  1. 总用量 36:是ls所列出的入口占用空间的字节数(以K为单位)。
  2. 1该文件硬链接的数目。
  3. root:文件属主。
  4. root:文件属组(一般是文件属主所在的缺省组。)
  5. 34890:字节来表示的文件长度,记住,不是K字节!
  6. 10月 19 20:17:件的更新时间。
  7. temp or httd.conf :件名。
复制代码


原帖由 "sunsroad " 发表:

BTW:要检查该目录所有文件占用的空间应该用这个命令:du。
譬如说前面说的36是如何计算出来:
首先我们要先了解你所用的文件系统的IO BLOCK(中文叫作簇)为多少,在你所使用的这个文件系统的IO BLOCK大小是4096 Bytes。

他意义是文件系统最小的读写及分配单位,每次读写操作你都不能小于这个尺寸。即使你的文件是只有一个字节。而且文件在硬盘上的存储也是以这个为单位,就是说如果文件尺寸小于这个值,那么它在磁盘上占用的空间就是4096字节。

占用空间的具体算法是:(进一(文件尺寸/4096))×4096。根据这个你就可以计算出你所列举的例子中的文件的空间使用状况:34890除以4096,大约等于8.5,进一法取得为9,就是说文件在磁盘上占用了9个BLOCk,每个BLOCK为4K,所以这两个文件占用的空间就是36K。

这个规则也适合于目录,不过不会出现为0的目录,即使是空目录




-rw-r--r-- :这是该文件的权限位。

第一个横杠:指定文件类型,表示该文件是一个普通文件。(所创建的文件绝大多数都是普通文件或符号链接文件)。

除去最前面的横杠,一共是9个字符,他们分别对应9个权限位。通过这些权限位,可以设定用户对文件的访问权限。对这两个文件的精确解释是:

  1. rw-:前三位,文件属主可读、写
  2. r--:中间三位,组用户可读
  3. r--:最后三位,其他用户只可读
复制代码


在创建的时候并未给属主赋予执行权限,在用户创建文件时,系统不会自动地设置执行权限位。这是出于加强系统安全的考虑

BTW:文件的属主组并不一定就是所有者所在的缺省组,而可以是任何一个跟该文件所有者无关的用户组。为了方便,还是统称属主,属组和其它
作者: 寂寞烈火    时间: 2004-10-29 12:08
标题: 类UNIX系统基础:文件安全与权限
用stat可以查看一个文件的比较详细的信息
作者: wingger    时间: 2004-10-29 12:27
标题: 类UNIX系统基础:文件安全与权限
[quote]原帖由 "寂寞烈火"]用stat可以查看一个文件的比较详细的信息[/quote 发表:


    


现在分开详细说明:

文件类型

前面提到的第一条横杠,表示该文件是普通文件型
文件类型有七种,它可以从ls -l命令所列出的结果的第一位看出.

七种类型:

  1. d 目录。
  2. l 符号链接(指向另一个文件)。
  3. s 套接字文件。
  4. b 块设备文件。
  5. c 字符设备文件。
  6. p 命名管道文件。
  7. - 普通文件,或者更准确地说,不属于以上几种类型的文件。
复制代码



文件的权限位中中每一组字符中含有三个权限位:

  1. r 读权限
  2. w 写/更改权限
  3. x 执行该脚本或程序的权限
复制代码



如:
  1. r-- --- --- 文文件属主可读,但不能写或执行
  2. r-- r-- --- 文文件属主和属组用户(一般来说,是文件属主所在的缺省组)可读
  3. r-- r-- r- - 文任何用户都可读,但不能写或执行
  4. rwx r-- r- - 文文件属主可读、写、执行,属组用户和其他用户只可读
  5. rwx r-x --- 文文件属主可读、写、执行,属组用户可读、执
  6. rwx r-x r- x 文文件属主可读、写、执行,属组用户和其他用户可读、执行
  7. rw- rw- --- 文文件属主和属组用户可读、写
  8. rw- rw- r- - 文文件属主和属组用户可读、写,其他用户可读
  9. rw- rw- --- 文文件属主和属组用户及其他用户读可以读、写,慎用这种权限
  10. 设置,因为任何用户都可以写入该文件
复制代码


[quote]原帖由 "sunsroad"]文件的所有者组并非是文件所有者所在的缺省组,而可以是任何一个跟该文件所有者无关的用户组。[/quote 发表:

作者: wingger    时间: 2004-10-29 12:44
标题: 类UNIX系统基础:文件安全与权限
使用chmod来改变权限位

这一命令有符号模式和绝对模式。

符号模式

chmod命令的一般格式为:

chmod [who] operator [permission] filename

w h o的含义是:

  1. u 文件属主权限。
  2. g 属组用户权限。
  3. o 其他用户权限。
  4. a 所有用户(文件属主、属组用户及其他用户)。
复制代码


o p e r a t o r的含义:

  1. + 增加权限。
  2. - 取消权限。
  3. = 设定权限。
复制代码


p e r m i s s i o n的含义:

  1. r 读权限。
  2. w 写权限。
  3. x 执行权限。
  4. s 文件属主和组set-ID。
  5. t 粘性位*。
  6. l 给文件加锁,使其他用户无法访问。
  7. u,g,o 针对文件属主、属组用户及其他用户的操作。

  8. *在列文件或目录时,有时会遇到“ t”位。“t”代表了粘性位。如果在一个目录上出现“t”位,这就意味着该目录中的文件只有其属主才可以删除,即使某个属组用户具有和属主同等的权限。不过有的系统在这一规则上并不十分严格。

  9. 如果在文件列表时看到“ t”,那么这就意味着该脚本或程序在执行时会被放在交换区(虚存)。
复制代码



对"t"还没弄清楚这是"sunsroad"的解释:

原帖由 "sunsroad"]"t"权限用在文件上面是没有意义的,不是什么在交换区的概念,它跟文件的执行没有关系,而主要是为了文件共享设置的。 [/quote 发表:


[quote]原帖由 "风流涕淌" 发表:
1,t 权限是粘着位,例:TMP目录下,任何人都有读写执行权限,但是不是任何人对里边的可写权限的文件就可以删除呢,当然不是了,这个就是粘着位的做用,只有所有者才有权删除自已的文件,当然,ROOT除外
2,关于文件安全的另一种权限,
i权限 也就是不可修改权限  例:chattr u+i aaa 则aaa文件就不可修改,无论任何人,如果删除就用u-i就好了
a权限 也就是只追加权限, 对于日志系统很好用,这个权限让目标文件只能追加,不能删除,而且不能通过编辑器追加。方法和i权限一样加
如果想要看某个文件是不是有这个权限,用lsattr filename就行了

谢谢风流涕淌的分享


例如


  1. chmod a-x temp //rw- rw- rw- 收回所有用户的执行权限
  2. chmod og-w temp //rw- r-- r- - 收回属组用户和其他用户的写权限
  3. chmod g+w temp //rw- rw- r- - 赋予属组用户写权限
  4. chmod u+x temp //rwx rw- r- - 赋予文件属主执行权限
  5. chmod go+x temp //rwx rwx r- x 赋予属组用户和其他用户执行权限
复制代码


举如

当创建temp文件时,它具有这样的权限:

  1. -rw-r--r--    1 root     root            0 10月 19 20:16 temp
复制代码


如果要使属主和属组用户具有有执行权限,并取消其他用户(所有其他用户)的写权限,可以用:

  1. $ chmod ug+x temp
  2. $ chmod o-w temp
复制代码


这样,该文件的权限变为:

  1. -rwxr--r--    1 root     root            0 10月 19 20:16 temp
复制代码


现在已经使文件属主对temp文件具有读、写执行的权限,属组用户真有读写权限,其它用户没有权限了。
作者: temin    时间: 2004-10-29 13:27
标题: 类UNIX系统基础:文件安全与权限
继续
作者: wingger    时间: 2004-10-29 14:42
标题: 类UNIX系统基础:文件安全与权限
绝对模式

chm d命令绝对模式的一般形式为:

chmod [mode] file

其中m o d e是一个八进制数。
在绝对模式中,权限部分有着不同的含义。每一个权限位用一个八进制数来代表,如

  1. 0 4 0 0 文件属主可读
  2. 0 2 0 0 文件属主可写
  3. 0 1 0 0 文件属主可执行

  4. 0 0 4 0 属组用户可读
  5. 0 0 2 0 属组用户可写
  6. 0 0 1 0 属组用户可执行

  7. 0 0 0 4 其他用户可读
  8. 0 0 0 2 其他用户可写
  9. 0 0 0 1 其他用户可执行
复制代码


在设定权限的时候,只需按照上面查出与文件属主、属组用户和其他用户所具有的权限相对应的数字,并把它们加起来,就是相应的权限表示。
可以看出,文件属主、属组用户和其他用户分别所能够具有的最大权限值就是7。

再来看看前面举的例子:

  1. -rwxr--r--  1   root            0 10月 19 20:16 temp
复制代码


相应的权限是:

  1. rwx-:0400 + 0200 +0100 (文件属主可读、写、执行) = 0 7 0 0
  2. r--:0 0 4 0 (属组用户可读) = 0 0 4 0
  3. r--:0 0 4 0 (属组用户可读) = 0 0 4 0
  4. 0 7 4 4
复制代码


有一个计算八进制权限表示的更好办法,如下:

  1. 文件属主:r w x:4 + 2 + 1
  2. 属组用户:r w x:4 + 2 + 1
  3. 其他用户:r w x:4 + 2 + 1
复制代码


这上面这相,更容易地计算出相应的权限值,只要分别针对文件属主、属组用户和其他用户把相应权限下面的数字加在一起就可以了。

temp文件具有这样的权限:

  1. r w x     r - - r - -
  2. 4+2+1  4     4
复制代码


把相应权限位所对应的值加在一起,就是7 4 4。

如:

  1. chmod 666 rw- rw- rw- 赋予所有用户读和写的权限
  2. chmod 644 rw- r-- r- - 赋予所有文件属主读和写的权限,所有其他用户读权限
  3. chmod 744 rwx r-- r- - 赋予文件属主读、写和执行的权限,所有其他用户读的权限
  4. chmod 664 rw- rw- r- - 赋予文件属主和属组用户读和写的权限,其他用户读权限
  5. chmod 700 rwx --- --- 赋予文件属主读、写和执行的权限
  6. chmod 444 r-- r-- r- - 赋予所有用户读权限
复制代码


下面举一个例子,假定有一个名为temp的文件,具有如下权限:

  1. -rw-rw-r--  1   root            0 10月 19 20:16 test1
复制代码


现在希望对该文件可读、写和执行, root组用户对该文件只读,可以键入:

  1. $chmod 740 test1
  2. $ls -l
  3. -rwxr-----  1   root            0 10月 19 20:16 test1
复制代码


如果文件可读、写和执行,对其他所有用户只读,用:

  1. $chmod 744 test1
  2. $ls -l
  3. -rwxr--r--  1   root            0 10月 19 20:16 test1
复制代码


如果希望一次设置目录下所有文件的权限,可以用:

  1. $chmod 664*
  2. $ls -l
  3. -rw-r--r--  1   root            0 10月 19 20:16 test1
复制代码


这将使文件属主和属组用户都具有读和写的权限,其他用户只具有读权限。

还可以通过使用- R选项连同子目录下的文件一起设置:

  1. chmod -R 664 /temp/*
复制代码


这样就可以一次将/ temp目录下的所有文件连同各个子目录下的文件的权限全部设置为文件属主和属组用户可读和写,其他用户只读。使用- R选项一定要谨慎,只有在需要改变目录树下全部文件权限时才可以使用。
作者: wingger    时间: 2004-10-29 14:48
标题: 类UNIX系统基础:文件安全与权限
先来这些,明天继续
作者: maowei    时间: 2004-10-29 14:53
标题: 类UNIX系统基础:文件安全与权限
系统默认情况下建立文件与目录的权限是:
#vi /etc/bashrc 可以看到一般用户是002  root用户是022
说明:一般用户默认建立文件权限是666-002=664   建立目录权限是777-002=775

root默认建立文件的权限就是666-022=644   建立的目录权限就是777-022=755
大家可以在机器上试试。也可以去改一下这个bashrc文件。看看有什么变化。
我这里补充一下。楼主是否同意。

msn:maowei6@hotmail.com
作者: wingger    时间: 2004-10-29 15:00
标题: 类UNIX系统基础:文件安全与权限
原帖由 "maowei" 发表:
系统默认情况下建立文件与目录的权限是:
#vi /etc/bashrc 可以看到一般用户是002  root用户是022
说明:一般用户默认建立文件权限是666-002=664   建立目录权限是777-002=775

root默认建立文件的权限就是666-0..........


    

目录和文件有一点点不同,明天继续
作者: 寂寞烈火    时间: 2004-10-29 15:02
标题: 类UNIX系统基础:文件安全与权限
good!!!
作者: netocool    时间: 2004-10-29 15:32
标题: 类UNIX系统基础:文件安全与权限
一个目录可以属于多个用户吗?

因为现在是要求某个目录可以使属主同组的部分用户可以读写,但是同组的部分用户不能写

这个要求怎么实现呢?
作者: hew    时间: 2004-10-29 21:01
标题: 类UNIX系统基础:文件安全与权限
建一个新的用户组。
作者: wingger    时间: 2004-10-29 21:44
标题: 类UNIX系统基础:文件安全与权限
原帖由 "netocool" 发表:
一个目录可以属于多个用户吗?

因为现在是要求某个目录可以使属主同组的部分用户可以读写,但是同组的部分用户不能写

这个要求怎么实现呢?


再分组,看具体,这个和win有些不同
作者: wingger    时间: 2004-11-01 09:51
标题: 类UNIX系统基础:文件安全与权限
目录

目录的权限位和文件有所不同。目录的读权限位意味着可以列出其中的内容。写权限位意味着可以在该目录中创建文件,如果不希望其他用户在你的目录中创建文件,可以取消相应的写权限位。执行权限位则意味着搜索和访问该目录.

  1. r :可以列出该目录中的文件
  2. w:可以在该目录中创建或删除文件
  3. x:可以搜索或进入该目录
复制代码



权限文件属主属组用户其他用户

  1. drwx rwx r- x ( 775 ) 属主读、写、执行,属组读、写、执行,其它组读、执行
  2. drwx r-x r- - ( 754 ) 属主读、写、执行,属组读、执行,其它组读
  3. drwx r-x r- x ( 755 ) 属主读、写、执行,属组读、执行,其它组读、执行
复制代码



如果把属组用户或其他用户针对某一目录的权限设置为- - x,那么他们将无法列出该目录中的文件。如果该目录中有一个执行位置位的脚本或程序,只要用户知道它的路径和文件名,仍然可以执行它。用户不能够进入该目录并不妨碍他的执行。

目录的权限将会覆盖该目录中文件的权限。例如,如果目录temp具有如下的权限:

  1. drwxr--r--  1   admin            0 10月 19 20:16 temp
复制代码


而目录下的文件myfile的权限为:

  1. -rwxrwxrwx  1   admin           0 10月 19 20:16 myfile
复制代码


那么admin组的用户将无法编辑该文件,因为它所属的目录不具有这样的权限。

该文件对任何用户都可读,但由于它所在的目录并未给admin组的用户赋予执行权限,所以该组的用户都将无法访问该目录,他们将会得到“访问受限”的错误消息。
作者: wingger    时间: 2004-11-01 09:52
标题: 类UNIX系统基础:文件安全与权限
目录

目录的权限位和文件有所不同。目录的读权限位意味着可以列出其中的内容。写权限位意味着可以在该目录中创建文件,如果不希望其他用户在你的目录中创建文件,可以取消相应的写权限位。执行权限位则意味着搜索和访问该目录.

  1. r :可以列出该目录中的文件
  2. w:可以在该目录中创建或删除文件
  3. x:可以搜索或进入该目录
复制代码



权限文件属主属组用户其他用户

  1. drwx rwx r- x ( 775 ) 属主读、写、执行,属组读、写、执行,其它组读、执行
  2. drwx r-x r- - ( 754 ) 属主读、写、执行,属组读、执行,其它组读
  3. drwx r-x r- x ( 755 ) 属主读、写、执行,属组读、执行,其它组读、执行
复制代码



如果把属组用户或其他用户针对某一目录的权限设置为- - x,那么他们将无法列出该目录中的文件。如果该目录中有一个执行位置位的脚本或程序,只要用户知道它的路径和文件名,仍然可以执行它。用户不能够进入该目录并不妨碍他的执行。

目录的权限将会覆盖该目录中文件的权限。例如,如果目录temp具有如下的权限:

  1. drwxr--r--  1   admin            0 10月 19 20:16 temp
复制代码


而目录下的文件myfile的权限为:

  1. -rwxrwxrwx  1   admin           0 10月 19 20:16 myfile
复制代码


那么admin组的用户将无法编辑该文件,因为它所属的目录不具有这样的权限。

该文件对任何用户都可读,但由于它所在的目录并未给admin组的用户赋予执行权限,所以该组的用户都将无法访问该目录,他们将会得到“访问受限”的错误消息。
作者: netocool    时间: 2004-11-01 10:16
标题: 类UNIX系统基础:文件安全与权限
其实可以使用setfacl来设置文件的权限
作者: xdrxsp492    时间: 2004-11-02 09:00
标题: 类UNIX系统基础:文件安全与权限
如果我想对LINUX做审核,例如说要记录某个文件在什么时候被什么人访问了,等等,该如何设置呢?
作者: wingger    时间: 2004-11-02 09:48
标题: 类UNIX系统基础:文件安全与权限
[quote]原帖由 "xdrxsp492"]如果我想对LINUX做审核,例如说要记录某个文件在什么时候被什么人访问了,等等,该如何设置呢?[/quote 发表:


审记俺还没有研究过   
作者: sunsroad    时间: 2004-11-02 14:26
标题: 类UNIX系统基础:文件安全与权限
原帖由 "wingger" 发表:

代码:
$ touch temp
创建了一个空文件,现在用ls -l命令查看该目录下文件的属性(我这里用中文版):
如下:

代码:
[root@Linux_chenwy temp]# ls -l
总用量 36
-rw-r--r--    1 root     root        34890 10月 19 20:17 httpd.conf
-rw-r--r--    1 root     root            0 10月 19 20:16 temp



代码:
总用量 36:这一行告诉我们该目录中所有文件所占的空间。
1该文件硬链接的数目。
root文件的属主。
root文件的属主r o o t所在的缺省组(也叫做r o o t )。
34890用字节来表示的文件长度,记住,不是K字节!
10月 19 20:17文件的更新时间。
temp or httd.conf 文件名。



-rw-r--r-- :这是该文件的权限位。

第一个横杠:指定文件类型,表示该文件是一个普通文件。(所创建的文件绝大多数都是普通文件或符号链接文件)。

除去最前面的横杠,一共是9个字符,他们分别对应9个权限位。通过这些权限位,可以设定用户对文件的访问权限。对这两个文件的精确解释是:

代码:
rw-:前三位,文件属主可读、写
r--:中间三位,同组用户可读
r--:最后三位,其他用户只可读


temp在创建的时候并未给属主赋予执行权限,在用户创建文件时,系统不会自动地设置执行权限位。这是出于加强系统安全的考虑


你的观点中有一些错误,首先在下面的说法中:

总用量 36:这一行告诉我们该目录中所有文件所占的空间。
1该文件硬链接的数目。
root文件的属主。
root文件的属主r o o t所在的缺省组(也叫做r o o t )。
34890用字节来表示的文件长度,记住,不是K字节!
10月 19 20:17文件的更新时间。
temp or httd.conf 文件名。


这里36绝不是该目录中所有文件占用的空间。而是ls所列出的入口占用空间的字节数(以K为单位)。如果要检查该目录所有文件占用的空间应该用另外一个命令:du。你用另外一个命令:ls -al也可以看出这种说法的错误————你会发现,同一个目录下面两个命令的输出是不同的,这也可以佐证。

另外一个问题是:文件的所有者组并非是文件所有者所在的缺省组,而可以是任何一个跟该文件所有者无关的用户组。这个问题牵涉到文件的共享,因此一定要搞明白。因此在你接下来的论述中,与此相关的问题,大多都会存在一定的问题。

另外:
如果在文件列表时看到“ t”,那么这就意味着该脚本或程序在执行时会被放在交换区(虚存)。

"t"权限用在文件上面是没有意义的,不是什么在交换区的概念,它跟文件的执行没有关系,而主要是为了文件共享设置的。

关于文件系统,有很多的东西我们需要去认真的了解。譬如说前面说的36是如何计算出来:
首先我们要先了解你所用的文件系统的IO BLOCK(中文叫作簇)为多少,在你所使用的这个文件系统的IO BLOCK大小是4096 Bytes。他意义是文件系统最小的读写及分配单位,每次读写操作你都不能小于这个尺寸。即使你的文件是只有一个字节。而且文件在硬盘上的存储也是以这个为单位,就是说如果文件尺寸小于这个值,那么它在磁盘上占用的空间就是4096字节。占用空间的具体算法是:(进一(文件尺寸/4096))×4096。根据这个你就可以计算出你所列举的例子中的文件的空间使用状况:34890除以4096,大约等于8.5,进一法取得为9,就是说文件在磁盘上占用了9个BLOCk,每个BLOCK为4K,所以这两个文件占用的空间就是36K。
这个规则也适合于目录,不过不会出现为0的目录,即使是空目录。

有很多的关于文件系统的细节我也没有完全搞清楚,因此这里只是抛砖引玉,希望各位都能够把自己的心得些出来,大家共同进步。

同时在这里我想强调一下自个的一个观点:希望各位在整理自个的心得的时候,能够尽量本着负责的态度,将确定正确的资料整理出来。因为在bbs上的影响是比较广泛的,特别是象CU这样的论坛,一个错误的观点一旦散布出去,造成的影响是很大的,这一点我在很多地方都有很深的体会。

当然我这里并不是说上面的资料毫无用处,很多的说法还是很有参考意义的,只是希望大家以后共同努力,尽量的减少错误观点的影响。
作者: wingger    时间: 2004-11-02 15:08
标题: 类UNIX系统基础:文件安全与权限
原帖由 "sunsroad" 发表:

"t"权限用在文件上面是没有意义的,不是什么在交换区的概念,它跟文件的执行没有关系,而主要是为了文件共享设置的。

关于文件系统,有很多的东西我们需要去认真的了解。譬如说前面说的36是如何计算出来:
首先..........


这是我正在学习的资料,晕!我以为是正确的,不好意思。我去查查其它的,找到再更正,谢谢     
作者: wingger    时间: 2004-11-02 15:16
标题: 类UNIX系统基础:文件安全与权限
原帖由 "sunsroad" 发表:

同时在这里我想强调一下自个的一个观点:希望各位在整理自个的心得的时候,能够尽量本着负责的态度,将确定正确的资料整理出来。因为在bbs上的影响是比较广泛的,特别是象CU这样的论坛,一个错误的观点一旦散布出去,造成的影响是很大的,这一点我在很多地方都有很深的体会。


明白,呵呵,我这也是从其它地方来的资料,想不到这么多错,汗!!!一定更正
作者: wingger    时间: 2004-11-02 16:10
标题: 类UNIX系统基础:文件安全与权限
已改正,欢迎XDJM们来一起讨论,呵呵
作者: sunsroad    时间: 2004-11-02 22:27
标题: 类UNIX系统基础:文件安全与权限
原帖由 "wingger" 发表:


明白,呵呵,我这也是从其它地方来的资料,想不到这么多错,汗!!!一定更正


绝对没有针对谁的意思,我只是就这种现象的一种建议。

补充一下:
[quote]这个规则也适合于目录,不过不会出现为0的目录,即使是空目录。[/quote]
对于空目录及所有入口占用的空间小于一个block的目录来说,他的空间以一个block的大小来计算。

另外,在-rwxrwxrwx中,红色的一组是指属于文件所有者组的用户对文件所拥有的权限,但是这个组并不必蓝色的权限中文件的所有者所在的组。它们可以是一个,也可以是不同的,甚至可以和这个文件的所有者没有任何的关系。譬如说你新建一个test组,而让root用户不属于test这个组的话,你照样可以用chown :test filename这个命令让该文件的所有者组为test组,一切的访问照样合用。

最后对于文件的访问你还可以利用setfacl来进行更加详细的限定,这种情况下,文件将占用2个inode,这是跟以前的内容有所区别的地方。
作者: wingger    时间: 2004-11-02 22:39
标题: 类UNIX系统基础:文件安全与权限
-rwxrwxrwx

9个权限位换成这样是不是更容易理解呢?

如:

  1. -rwxrw-r-- 1 root admin 34890 10月 19 20:17 httpd.conf
复制代码

  1. 前三位:rwx:它的所有者是root,即就是文件所有者,它对httpd.conf这个文件的权限是读写执行;
  2. 中间三位:rw-:表示admin组对这个文件的权限是读写
  3. 后面位:r--:就是即不是所有者,也不是属组的对文件的权限是读
复制代码

作者: wingger    时间: 2004-11-02 22:54
标题: 类UNIX系统基础:文件安全与权限
看来前面还是有错误,明天再来改了     
作者: wingger    时间: 2004-11-07 22:11
标题: 类UNIX系统基础:文件安全与权限
suid/guid


1、为什么要使用这种类型的脚本?

例如有几个着几个大型的数据库系统,对它们进行备份需要有系统管理权限。可以写几个脚本,并设置了它们的g u i d,这样就可以指定的一些用户来执行这些脚本就能够完成相应的工作,而无须以数据库管理员的身份登录,以免不小心破坏了数据库服务器。通过执行这些脚本,他们可以完成数据库备份及其他管理任务,但是在这些脚本运行结束之后,他们就又回复到他们作为普通用户的权限。


2、查找suid/guid命令

有相当一些U N I X命令也设置了s u i d和g u i d。如果想找出这些命令,可以进入/ b i n或/ s b i n目录,执行下面的命令:

  1. $ ls -l | grep '^...s'
复制代码

上面的命令是用来查找s u i d文件的;

  1. $ ls -l | grep '^...s..s'
复制代码

上面的命令是用来查找s u i d和g u i d的。


3、设置UID

  1. 设置s u i d:将相应的权限位之前的那一位设置为4;
  2. 设置g u i d:将相应的权限位之前的那一位设置为2;
  3. 两者都置位:将相应的权限位之前的那一位设置为4+2=6。
复制代码


设置了这一位后x的位置将由s代替。
记住:在设置s u i d或g u i d的同时,相应的执行权限位必须要被设置。
例如,如果希望设置g u i d,那么必须要让该用户组具有执行权限。

如果想要对文件l o g i n[它当前所具有的权限为rwx rw- r-- (741)]设置s u i d,,可在使用c h m o d命令时在该权限数字的前面加上一个4,即chmod 4741,这将使该文件的权限变为r w s rw- r - -。

  1. $ chmod 4741 login
复制代码


设置suid/guid的例子

  1.       命令          结果        含义
  2. chmod 4755   rws r-x r- x   文件被设置了s u i d,文件属主具有读、写和执行的权限,其他用户具有读和执行的权限
  3. chmod 6711   rws --s --x    文件被设置了s u i d和g u i d,文件属主具有读、写和执行的权限,其他用户具有执行的权限
  4. chmod 4764   rws rw- r- -   文件被设置了s u i d,文件属主具有读、写和执行的权限,属组用户具有读和执行的权限,用户具有读权限
复制代码



4、还可以使用符号方式来设置s u i d / g u i d。如果某个文件具有这样的权限: rwx r-x r- x,那么可以这样设置其s u i d:

  1. chmod u+s <filename>;
复制代码


于是该文件的权限将变为: rws r-x r-x

在查找设置了s u i d的文件时,没准会看到具有这样权限的文件:rwS r-x r- x,其中S为大写。
它表示相应的执行权限位并未被设置,这是一种没有什么用处的s u i d设置,可以忽略它的存在。

注意,c h m o d命令不进行必要的完整性检查,可以给某一个没用的文件赋予任何权限,但chmod 命令并不会对所设置的权限组合做什么检查。因此,不要看到一个文件具有执行权限,就认为它一定是一个程序或脚本。
作者: 双眼皮的猪    时间: 2004-11-08 00:08
标题: 类UNIX系统基础:文件安全与权限
原帖由 "wingger" 发表:


    

目录和文件有一点点不同,明天继续


这些知识还8错,鼓励....

目录可以到7,文件最高到6...

这个在计算umask的时候有些不同...

btw:我怎么觉得你这些资料都是Linux/Unix shell编程指南里的一样,似曾相识
作者: wingger    时间: 2004-11-08 08:37
标题: 类UNIX系统基础:文件安全与权限
原帖由 "双眼皮的猪" 发表:


这些知识还8错,鼓励....

目录可以到7,文件最高到6...

这个在计算umask的时候有些不同...

btw:我怎么觉得你这些资料都是Linux/Unix shell编程指南里的一样,似曾相识


好像是叫这个,书我下了N年了,前几天才开始看,我觉得做成贴子,更容易查找和学习,这本错误不少,

是否需要把某些失误的地方一一指出来呢???
作者: wingger    时间: 2004-11-08 15:12
标题: 类UNIX系统基础:文件安全与权限
chown和chgrp

当你创建一个文件时,你就是该文件的属主。一旦你拥有某个文件,就可以改变它的所有权,把它的所有权交给另外一个/ e t c / p a s s w d文件中存在的合法用户。可以使用用户名或用户I D号来完成这一操作。

在改变一个文件的所有权时,相应的s u i d也将被清除,这是出于安全性的考虑。只有文件的属主和系统管理员可以改变文件的所有权。一旦将文件的所有权交给另外一个用户,就无法再重新收回它的所有权。如果真的需要这样做,那么就只有求助于系统管理员了。

1、c h o w n命令的一般形式为:

  1. chmod -R -h owner file
复制代码

- R选项意味着对所有子目录下的文件也都进行同样的操作。
- h选项意味着在改变符号链接文件的属主时不影响该链接所指向的目标文件。


2、chown举例

  1. 如:
  2. # ls -l
  3. drwxrwxr-x    2 sam      sam          4096 10月 26 19:48 sam
  4. # chown gem sam
  5. # ls -l
  6. drwxrwxr-x    2 gem      sam          4096 10月 26 19:48 sam
复制代码


文件sam的所有权现在由用户sam交给了用户gem。


3、chgrp举例

c h g r p命令和c h o w n命令的格式差不多,下面给出一个例子。


  1. # ls -l
  2. drwxrwxr-x    2 gem      sam          4096 10月 26 19:48 sam
  3. # chgrp group sam
  4. # ls -l
  5. drwxrwxr-x    2 gem      group        4096 10月 26 19:48 sam
复制代码


现在把该文件sam所属的组由sam变为group。


4、找出你所属于的用户组

如果你希望知道自己属于哪些用户组,可以用ID这个命令:

  1. # su sam
  2. $ id
  3. uid=506(sam) gid=4(adm) groups=4(adm)
复制代码



5、找出其他用户所属于的组


  1. # id
  2. uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel)
  3. 查看当前用户所属组

  4. # id gem
  5. uid=507(gem) gid=507(group) groups=507(group),0(root),4(adm)
  6. 查看其它用户所用组:#id 用户名

  7. # su sam
  8. $ id gem
  9. uid=507(gem) gid=507(group) groups=507(group),0(root),4(adm)
  10. 查看其它用户所属组
复制代码


这里书上用group,但我试过不能使
BTW:可以用#cat /etc/passwd和#cat /etc/group直接查看用户和组

作者: wingger    时间: 2004-11-08 22:08
标题: 类UNIX系统基础:文件安全与权限
umask

当最初登录到系统中时, u m a s k命令确定了你创建文件的缺省模式。这一命令实际上和c h m o d命令正好相反。你的系统管理员必须要为你设置一个合理的u m a s k值,以确保你创建的文件具有所希望的缺省权限,防止其他非同组用户对你的文件具有写权限。

在已经登录之后,可以按照个人的偏好使用u m a s k命令来改变文件创建的缺省权限。相应的改变直到退出该s h e l l或使用另外的u m a s k命令之前一直有效。

一般来说,u m a s k命令是在/ e t c / p r o f i l e文件中设置的,每个用户在登录时都会引用这个文件,所以如果希望改变所有用户的u m a s k,可以在该文件中加入相应的条目。如果希望永久性地设置自己的u m a s k值,那么就把它放在自己$ H O M E目录下的. p r o f i l e或. b a s h _ p r o f i l e文件中。
作者: wingger    时间: 2004-11-08 22:28
标题: 类UNIX系统基础:文件安全与权限
如何计算umask值


u m a s k命令允许你设定文件创建时的缺省模式,对应每一类用户(文件属主、属组、其他用户)存在一个相应的u m a s k值中的数字。对于文件来说,这一数字的最大值分别是6。系统不允许你在创建一个文本文件时就赋予它执行权限,必须在创建后用c h m o d命令增加这一权限。目录则允许设置执行权限,这样针对目录来说, u m a s k中各个数字最大可以到7。
该命令的一般形式为:

  1. umask nnn
复制代码


其中n n n为u m a s k置0 0 0 - 7 7 7。

计算u m a s k值:

可以有几种计算u m a s k值的方法,通过设置u m a s k值,可以为新创建的文件和目录设置缺省权限。

与权限位相对应的u m a s k值。

  1. umask                文件                目录
  2. 0                6                7
  3. 1                 6                6                           
  4. 2                4                5
  5. 3                4                4
  6. 4                2                3
  7. 5                2                2
  8. 6                0                1
  9. 7                0                0
复制代码


在计算u m a s k值时,可以针对各类用户分别按上面那张表中按照所需要的文件/目录创建缺省权限查找对应的u m a s k值。
例如,u m a s k值
  1. 0       6    7
  2. 0       6    7
  3. 2       4    5
复制代码

所以002所对应的文件和目录创建缺省权限分别为6 6 4和7 7 5。

还有另外一种计算u m a s k值的方法。我们只要记住u m a s k是从权限中“拿走”相应的位即可。


  1. umask                文件                目录
  2. 0                6                7
  3. 1                 6                6                           
  4. 2                4                5
  5. 3                4                4
  6. 4                2                3
  7. 5                2                2
  8. 6                0                1
  9. 7                0                0
复制代码


例如,对于u m a s k值0 0 2,相应的文件和目录缺省创建权限是什么呢?

第一步,我们首先写下具有全部权限的模式,即7 7 7 (所有用户都具有读、写和执行权限)。
第二步,在下面一行按照u m a s k值写下相应的位,在本例中是0 0 2。
第三步,在接下来的一行中记下上面两行中没有匹配的位。这就是目录的缺省创建权限。
稍加练习就能够记住这种方法。
第四步,对于文件来说,在创建时不能具有文件权限,只要拿掉相应的执行权限比特即可。


这就是上面的例子,其中u m a s k值为0 0 2:

1) 文件的最大权限rwx rwx rwx (777)
2) umask值为0 0 2 - - - - - - -w-
3) 目录权限rwx rwx r-x (775) 这就是目录创建缺省权限
4) 文件权限rw- rw- r-- (664) 这就是文件创建缺省权限


下面是另外一个例子,假设这次u m a s k值为0 2 2:

1) 文件的最大权限rwx rwx rwx (777)
2 ) u m a s k值为0 2 2 - - - -w- -w-
3) 目录权限rwx r-x r-x (755) 这就是目录创建缺省权限
4) 文件权限rw- r-- r-- (644) 这就是文件创建缺省权限



如果想知道当前的umask 值,可以使用u m a s k命令:

  1. #su sam    /*切换到sam用户玩境下
  2. #umask    /*查看sam的umask
  3. 0022
  4. 前面多了个0,是suid/guid的
复制代码


  1. $ touch file1
  2. $ mkdir file2
  3. $ ls -l
  4. 总用量 8
  5. -rw-r--r--    1 sam      adm             0 10月 30 19:27 file1
  6. drwxr-xr-x    2 sam      adm          4096 10月 30 19:28 file2
复制代码

新建文件file1和目录file2,查看新建文件和目录的默认权限,umask为022时
目录权限rwx r-x r-x (755)
文件权限rw- r-- r-- (644)


更改umask默认值由022至002


  1. $ umask 002
  2. $ touch file3
  3. $ ls -l
  4. 总用量 12
  5. -rw-r--r--    1 sam      adm             0 10月 30 19:27 file1
  6. drwxr-xr-x    2 sam      adm          4096 10月 30 19:28 file2
  7. -rw-rw-r--    1 sam      adm             0 10月 30 19:34 file3
  8. drwxrwxr-x    2 sam      adm          4096 10月 30 19:34 file4
复制代码

可以看到,新建文件和目录的默认权限改变了,umask为002时
目录权限rwx rwx r-x (775)
文件权限rw- rw- r-- (664)


可以看见,$ umask 002已生效
作者: 明月清风    时间: 2004-11-09 09:30
标题: 类UNIX系统基础:文件安全与权限
原帖由 "netocool" 发表:
一个目录可以属于多个用户吗?

因为现在是要求某个目录可以使属主同组的部分用户可以读写,但是同组的部分用户不能写

这个要求怎么实现呢?

可以做到,使用ACL文件许可权扩展设置
作者: 明月清风    时间: 2004-11-09 09:44
标题: 类UNIX系统基础:文件安全与权限
[quote]原帖由 "xdrxsp492"]如果我想对LINUX做审核,例如说要记录某个文件在什么时候被什么人访问了,等等,该如何设置呢?[/quote 发表:

用find可以查找什么时候被访问过,至于被谁访问过,是不是要结合last、fuser或审计日志了
作者: wingger    时间: 2004-11-09 10:33
标题: 类UNIX系统基础:文件安全与权限
原帖由 "明月清风" 发表:

用find可以查找什么时候被访问过,至于被谁访问过,是不是要结合last、fuser或审计日志了


在这里看到你,呵呵

  1. 补充umask的另一种用法,书上没有的,我觉得这个比较方便
复制代码


先说一下umask在不同玩境下的不同

  1. 1、bash
  2. umask [-p] [-S] [mode]

  3. 2、tcsh
  4. umask [value]
复制代码



说明

    当新增文件或目录时,预设的使用权限,由 umask 这个内设值所规定的。
    一般情况下,umask 会被设定在 shell 的启始档案中。

    对 bash 的使用者来说,个人的启始档案是 $HOME/.bashrc,使用者可以将 umask 设定在其中。像 RedHat 9 是放 /etc 之下,档名为 bashrc。
    当使用者没有自行设定,umask 设定值便来自于此系统的默认设定。

    tcsh 的个人启始档案为 ~/.tcshrc,系统设定文件在 /etc/csh.cshrc。

  1. linux 操作系统的角度,完整的权限设定值是四位数字。
  2. 第一位数,代表档案或目录的特殊属性。 4 代表 "suid"﹔2 代表 "sgid"﹔1 代表 "粘滞位 - save text image"。
  3. 后三位数,依序代表 "user-档案拥有者","group-群组","other-其它"。
  4. 每一位数,代表三种权限的叠加,4-读(r),2-写(w),1-执行(x)。
  5. 被禁止的权限则以 0 带入。
复制代码

    对 umask 来说,有效的设定值只有后三位数。在 bash 中,虽然可带入四位数字,但第一个数字,必须为 0。这点请注意。

  1. 指令 umask 的设定值以三个八进位的数字“nnn”代表。
  2. 第一个设定数字给使用者自己(owner user),
  3. 第二个则是设定给用使用者所属的群体(group),
  4. 第三个给不属于同群体的其它使用者(other)。
  5. 每一位数字的设定值都是三项不同权限的数值加总,read 权限数值为 4;write 权限数值为 2;execute 权限数值为 1。
  6. 结合了前三者的权限数值,单一的数字可设定的范围是 0 ~ 7;整体的可设定范围是 000 ~ 777。
复制代码


umask 的设定值,对目录,与对档案的实质作用是有差别的。


  1. 注意:

  2. 当我们设定为 000 时,会得到完全开放的目录权限 777,以及文件权限 666。为何文件只得到 666 呢?因为文件权限中的 execute 权限已被程序移除,因此,不管你设定什么 umask 数值,文件都不会出现 execute 权限。
复制代码



umask 语法如下:

  1. umask who operator permissions
复制代码


其中,参数的含义如下:

  1. who:表示下列字符中的一个、两个或全部:

  2. u(表示用户权限)
  3. g(表示组用户权限)
  4. o(表示其他用户权限)
  5. a (ugo 的缩写形式)
复制代码


如果忽略了字符 who,operator 和 permissions 将适用于所有类(等同于 a 或 ugo)。

  1. operator:字符 +、- 或 = 之一:

  2. + 增加权限。
  3. - 取消权限。
  4. = 设定权限。
复制代码

  1. permissions:字符或字符组合 r、w、x、rx、wx、rw 或 rwx 之一,用于为相应的 who 和 operator 指定读、写和(或)执行(搜索)权限。

  2. 如果未指定 permissions,则相应的 who 中的现有文件创建模式掩码不会发生更改。
复制代码



如果在 shell 提示符下设置 umask,它将只适用于当前登录会话中的 shell 和 subshell。但不适用于以后登录的会话。要在登录时自动应用 umask 设置,请将 umask 命令添加到 .profile 文件(对于 POSIX 和 Bourne Shell 用户)或 .login 文件中(对于 C Shell 用户)。
作者: wingger    时间: 2004-11-09 10:45
标题: 类UNIX系统基础:文件安全与权限
选项说明

  1. bash

  2.           -S

  3. 以 "u=rwx,g=rx,o=rx" 这种较人性的格式取代数字显示。
复制代码


  1. -p

  2. 当使用 -p 选项,但 mode 省略,输出格式为 umask mode (可以做为下 umask 指令使用)。当模式改变成功,或 mode 参数被省略,执行的状态值为 0。否则状态值为 1。
复制代码



实例说明

bash

首先,让我们先显示目前环境的 umask 设定情况

  1. # umask
  2. 0022
  3. #
复制代码


得到的数值为 "0022"。所以,建立新档案的预设权限是 644,目录则是755。如果不习惯看数字,我们可以使用 -S 选项来显示设定值

  1. # umask -S
  2. u=rwx,g=rx,o=rx
  3. #
复制代码


实际建个档案与目录看看

  1. # ls >; fileA
  2. # mkdir dirB
  3. # ls -l
  4. 总计 8
  5. drwxr-xr-x    2 root     root         4096 12月 21 16:42 dirB
  6. -rw-r--r--    1 root     root            6 12月 21 16:42 fileA
  7. #
复制代码


可以看到文件和目录的不同

  1. tcsh

  2. $ umask
  3. 22
  4. $
  5. $ umask 000
  6. $ umask
  7. 0
  8. $  
复制代码


从以上,我们可以知道,tcsh 简单到连 0 都懒的显示...

要设置 umask 值,使文件所有者具有读写执行权限,属组的其他用户具有只读权限,除此之外的其他用户没有访问权限 (-rw-r-------),请输入以下内容:


  1. $ umask u=rwx,g=r,o=r
  2. $ touch file5
  3. $ mkdir file6
  4. $ ls -l
  5. 总用量 16
  6. -rw-r--r--    1 sam      adm             0 10月 30 19:48 file5
  7. drwxr--r--    2 sam      adm          4096 10月 30 19:48 file6
复制代码



要确定当前的 umask 设置,请键入:


  1. $ umask -S
  2. u=rwx,g=r,o=r
复制代码

作者: wingger    时间: 2004-11-09 15:57
标题: 类UNIX系统基础:文件安全与权限
符号链接

存在两种不同类型的链接,软链接和硬链接。修改其中一个,硬连接指向的是节点(inode),而软连接指向的是路径(path)



软链接文件

  软链接又叫符号链接,这个文件包含了另一个文件的路径名。可以是任意文件或目录,可以链接不同文件系统的文件。和win下的快捷方式差不多。链接文件甚至可以链接不存在的文件,这就产生一般称之为"断链"的问题(或曰“现象",链接文件甚至可以循环链接自己。类似于编程语言中的递归。

命令格式:
  1. ln [-s] source_path target_path
复制代码


硬链接文件

  info ln 命令告诉您,硬链接是已存在文件的另一个名字,硬连接的命令是

  1. ln -d existfile newfile
复制代码

硬链接文件有两个限制

  1、不允许给目录创建硬链接;
  2、只有在同一文件系统中的文件之间才能创建链接。


  对硬链接文件进行读写和删除操作时候,结果和软链接相同。但如果我们删除硬链接文件的源文件,硬链接文件仍然存在,而且保留了愿有的内容。这时,系统就“忘记”了它曾经是硬链接文件。而把他当成一个普通文件。修改其中一个,与其连接的文件同时被修改

举例 说明:
作者: wingger    时间: 2004-11-09 16:29
标题: 类UNIX系统基础:文件安全与权限
  1. $umask 022
  2. $ cp /etc/httpd/conf/httpd.conf /usr/sam
复制代码

原来前面做的试验,改变了系统默认的umask值,现在改回来为022,
举个httpd.conf文件做例 子

  1. $ ln httpd.conf httpd1.conf
  2. $ ln -s httpd.conf httpd2.conf
复制代码


第一条为硬链接,第二条为软链接

  1. $ ls -li
复制代码
  1. 总用量 80
  2. 1077669   -rw-r--r--    2 sam      adm         34890 10月 31 00:57 httpd1.conf
  3. 1077668  lrwxrwxrwx    1 sam      adm            10 10月 31 00:58 httpd2.conf ->; httpd.conf
  4. 1077669  -rw-r--r--    2 sam      adm         34890 10月 31 00:57 httpd.conf
复制代码


可以看到,使用ls -li,软连接只产生了10字节的快捷而已,硬连接却实实在在的的拷贝。最前面的inode硬链接和源文件是一样的,而软链接不一样,具体看一下回复这话有误,但先这么理解,具体请看下面的回复

对http1.conf进行编辑,可以发现httpd.conf也发生了一样的变化

  1. $ rm httpd.conf
复制代码


现在删除链接的源文件,来比较不同之处

  1. $ ls -l
  2. 总用量 44
  3. drw-r--r--    2 sam      adm          4096 10月 30 20:14 file6
  4. -rw-r--r--    1 sam      adm         34890 10月 31 00:57 httpd1.conf
  5. lrwxrwxrwx    1 sam      adm            10 10月 31 00:58 httpd2.conf ->; httpd.conf
复制代码


发现,httpd2.conf实际已经不存在了,是断链,而httpd1.conf变也了普通文件
作者: wingger    时间: 2004-11-09 16:51
标题: 类UNIX系统基础:文件安全与权限
终于看完以上内容了,第三页的和书上大有出入哦,

主要有以上内容:
  1. 文件权限位
  2. 基本命令
  3. chmod
  4. suid/guid
  5. chown
  6. chgrp
  7. umask算法和用法
  8. 符号链接
复制代码


同时谢谢各位的帮助,呵呵,建议补学都看看,大有益处!!!
                  
作者: 明月千里寄相思    时间: 2004-11-09 16:52
标题: 类UNIX系统基础:文件安全与权限
可以说具体点吗?看不懂啊
作者: wingger    时间: 2004-11-09 16:56
标题: 类UNIX系统基础:文件安全与权限
[quote]原帖由 "明月千里寄相思"]可以说具体点吗?看不懂啊[/quote 发表:


这这这,俺学得已经说得好简单了耶!!!!!

最好装一个系统,边看边练,就容易多了,我也是这么过来的,都看明白了我
作者: wingger    时间: 2004-11-09 19:47
标题: 类UNIX系统基础:文件安全与权限
转一个:更好理解

索引节点、硬连接和连接计数

索引节点inode:

Linux为每个文件分配一个称为索引节点的号码inode,可以将inode简单理解成一个指针,它永远指向本文件的具体存储位置。系统是通过索引节点(而不是文件名)来定位每一个文件。


例如:

假设我们在硬盘当前目录下建立了一个名为mytext文本文件,其内容只有一行:

  1. This is my file.
复制代码

  1. 1、当然这行文字一定是存储在磁盘数据区某个具体位置里(物理上要通过磁头号、柱面号和扇区号来描述,在本例中假设分别是1、20、30)。

  2. 2、假设其inode是262457,那么系统通过一段标准程序,就能将这个inode转换成存放此文件的具体物理地址(1磁头、20柱面、30扇区),最终读出文件的内容:“This is my file.”

  3. 3、所以inode是指向一个文件数据区的指针号码,一个inode对应着系统中唯一的一片物理数据区,而位于两个不同物理数据区的文件必定分别对应着两个不同的inode号码。
复制代码


文件拷贝命令与硬链接的区别:

  1. # cp /home/zyd/mytext newfile
复制代码


在当前工作目录建立了一个新文件newfile,其实际操作主要包括如下三步:

1、在当前目录中增加一个目录项,其文件名域填入newfile,并分配了一个新的inode,假设是262456。
2、将原文件(在1磁头、20柱面、30扇区)的内容复制了一份到新的空闲物理块(假设是1磁头、20柱面、31扇区)。
3、填写一些其他关键信息,使系统通过这些信息及inode号码可以完成物理地址的转换。


所以文件复制要分配新的inode和新的数据区,虽然两个文件的内容是一样的。


硬连接hardlink:

我们实际使用文件时一般是通过文件名来引用的。通过上面的讨论,我们知道:

1个inode号码肯定和一片完全属于一个文件的数据区一一对应。那么一个文件系统中两个或更多个不同的文件名能否对应同一个文件呢?答案是肯定的。

我们知道inode号码是记录在文件名对应的目录项中的,我们可以使两个或多个文件的目录项具有相同的inode值,实际上就使它们对应着同一个文件。

有几个目录项具有相同的inode号,我们就说这个文件有几个硬连接(hardlink),

对于普通文件,ls -l命令的连接计数count域的数值就是本文件拥有的硬连接数。硬连接可以通过ln命令建立,


例如:

  1. # ln /home/zyd/mytext hardlink_mytext
复制代码


就建立了一个新的文件hardlink_mytext,这个文件的inode同样是262457。建立硬连接实际上只是增加了一个目录项,但并复制文件数据区,原文件的数据区由两个文件共享。这一方面能够节约大量磁盘空间,同时可以保证两个文件能同步更新。

  1. 'ls -il'可以显示文件的inode(在下面最左边):

  2. 262456 -rw-rw-r-- 1 zyd zyd 17 Nov 3 14:52 newfile
  3. 262457 -rw-rw-r-- 2 zyd zyd 17 Nov 3 14:50 hardlink_mytext
  4. 262457 -rw-rw-r-- 2 zyd zyd 17 Nov 3 14:50 mytext
复制代码



连接计数count:

前面我们介绍了,文件的连接计数域表明本系统中共有几个文件目录项的inode和本文件相同,也就是本文件共有几个硬连接。如上面的例子中hardlink_mytext和mytext文件的count值都是2。

那么对于目录,其count域的含义是什么呢?目录的count同样表示共有多少个目录项指向此目录,不过要详细说明必须进一步解释VFS文件系统的结构,为简单起见,只要这样理解就行了:(count-2)等于本目录包含的直接子目录数(就是只包括儿子,不包括孙子啦!)。

  1. 例如:如果一个目录/abc的count域为5,那么/abc目录一定包含3个子目录。
复制代码



进一步说明:

硬连接文件实际上并不是一种新的文件类型,两个文件互为对方的硬连接。它们应该都是普通文件(谁能告诉我:其它类型的文件可以硬连接吗?)。两个文件除了名称或/和文件目录不同外,其它部分完全相同,更改了一个文件,另一个的文件长度、内容、更改时间等都将相应发生变化,更改了一个文件的权限位mode,另一个也会发生同样的变化。

注意连接计数字段count,互为硬连接的两个文件的count值都是2,表明有两个inode指向同一文件的inode。

当我们删除其中一个文件时,系统首先将(count-1)->;count,如果结果是零,就将其目录项和数据区都删除,否则只将本目录项删除,数据区仍然保留,仍然可以通过另外的文件名访问。根据这个特性,可以通过为重要的文件建立硬连接的方法来防止其被误删除。


一个文件系统允许的inode节点数是有限的,如果文件数量太多,即使每个文件都是0字节的空文件,系统最终也会因为节点空间耗尽而不能再创建文件。所以当发现不能建立文件时首先要考虑硬盘数据区是否还有空间(可通过du命令),其次还得检查节点空间。

互为硬连接的多个文件必须位于同一个文件系统上。根设备及任何一个需要mount才能挂接进来的分区、软盘、NFS、光驱等都是一个独立的文件系统,每个文件系统有一个相应的设备号,不同文件系统中具有相同inode节 点的文件间没有任何联系。系统则通过设备号和inode号的组合唯一确定一个文件。


Linux之所以能支持多种文件系统,其实是由于Linux提供了一个虚拟文件系统VFS,VFS作为实际文件系统的上层软件,掩盖了实际文件系统底层的具体结构差异,为系统访问位于不同文件系统的文件提供了一个统一的接 口。

实际上许多文件系统并不具备inode结构,其目录结构也和以上的讨论不同,但通过VFS,系统均为其提供了虚拟一致的inode和目录项结构。

所以,'ls -il'命令实际显示的inode应该是VFS inode,也就是说,inode是存在于内存中的数据结构,而不一定是实际的硬盘结构。

但为Linux量身定做的ext2文件系统具备实际的inode和连接型目录项结构,所以,对于ext2文件系统,可以认为我们上面讨论的关于硬连接的概念是完全正确的。
作者: 牙齿晒太阳    时间: 2004-11-09 22:31
标题: 类UNIX系统基础:文件安全与权限
save
作者: hb12112    时间: 2004-11-10 01:22
标题: 类UNIX系统基础:文件安全与权限
好东西,收藏
作者: 阿骁    时间: 2004-11-10 07:49
标题: 类UNIX系统基础:文件安全与权限
wingger 真用功的说! 呵呵~
作者: prowoo    时间: 2004-11-10 10:18
标题: 类UNIX系统基础:文件安全与权限
有这样的代码???
drwxr--r--  1   admin            0 10月 19 20:16 temp
作者: wingger    时间: 2004-11-10 12:57
标题: 类UNIX系统基础:文件安全与权限
原帖由 "prowoo" 发表:
有这样的代码???
drwxr--r--  1   admin            0 10月 19 20:16 temp


#或$后的才是代码,后面的都是执行完的结果
作者: aerfa    时间: 2004-11-10 20:13
标题: 类UNIX系统基础:文件安全与权限

作者: gavy    时间: 2004-11-11 09:53
标题: 类UNIX系统基础:文件安全与权限
好东西   收了
作者: wang52114978    时间: 2004-11-12 10:50
标题: 类UNIX系统基础:文件安全与权限
恩,不错,辛苦了!
作者: samshan    时间: 2004-11-12 11:39
提示: 作者被禁止或删除 内容自动屏蔽
作者: beetleleo    时间: 2004-11-17 21:22
标题: 类UNIX系统基础:文件安全与权限
顶!好写的不错呀,以前看了还有点 不明白了,现在终于明白了,而且是彻底的明白了!谢谢
作者: ryan_bj    时间: 2004-11-18 09:52
提示: 作者被禁止或删除 内容自动屏蔽
作者: NeTmAiL    时间: 2004-11-21 05:10
提示: 作者被禁止或删除 内容自动屏蔽
作者: wingger    时间: 2004-11-21 09:05
标题: 类UNIX系统基础:文件安全与权限
你能不能把修改后的也贴上来看看

umask不一定得管理员
作者: NeTmAiL    时间: 2004-11-21 18:33
提示: 作者被禁止或删除 内容自动屏蔽
作者: falalala    时间: 2004-11-22 16:48
标题: 类UNIX系统基础:文件安全与权限
我的一个实际问题。帮忙看看,最好是具体一点。
我有5位开发人员。其中 aaa bbb ccc ddd eee  (为方便说明)
需要到相同的服务器去管理自己的程序。
如 aaa   做的 /usr/local/tomcat/webapps/app1
   bbb    做的 /usr/local/tomcat/webapps/app2
   .............................
    eee  做的 /usr/local/tomcat/webapp/app3
我现在的问题是:
1、aaa 只能操作(rwx)app1
     bbb 只能操作(rwx)app2
如何更方便的设置?
2、我将这5个帐号用分在同组(pda)。
   那么这个组对整个webapps 有操作权限。
   我做了chown -R  root:pda webapps
     可是aaa 还是不能对app1有写的权限,为什么?
3、如果觉得我说的不太明白,请就我这问题,给一个具体的(命令设置)方案。
   现在每个人都知道root的口令,很危险的。
4、还有让给个人都能/etc/init.d/httpd restart ,如何设置?
谢谢!
作者: ilsac    时间: 2004-12-20 15:13
标题: 类UNIX系统基础:文件安全与权限
好东西呀,看了以后让我对这些代码有了重新的认识呀,但是其中还有不少尚没能完全理解,看来学习的路还很长呀,哈哈
作者: kf701    时间: 2004-12-26 23:06
标题: 类UNIX系统基础:文件安全与权限
原帖由 "falalala" 发表:
我的一个实际问题。帮忙看看,最好是具体一点。
我有5位开发人员。其中 aaa bbb ccc ddd eee  (为方便说明)
需要到相同的服务器去管理自己的程序。
如 aaa   做的 /usr/local/tomcat/webapps/app1
   bbb    做..........

1,2个问题:chmod 777 -R /usr/local/tomcat/webapp
这样大家都能写了,不过要是有其它的东西,就不太安全,
如果把他们分在pda里面,
则:chgrp -R pda /usr/local/tomcat/webapp
    chmod -R 770 /usr/local/tomcat/webapp
作者: sunnysfg    时间: 2004-12-31 10:56
标题: 类UNIX系统基础:文件安全与权限
好铁
作者: winson_zhou958    时间: 2005-01-12 23:29
标题: 类UNIX系统基础:文件安全与权限
,基础性的东西,说得很好哎,支持!!!!!!
作者: zozo-8    时间: 2005-02-17 09:05
标题: 类UNIX系统基础:文件安全与权限
我很菜,可是愿意学
作者: 網中人    时间: 2005-02-17 14:20
标题: 类UNIX系统基础:文件安全与权限
關於 permission mode, 我這裡想補充一下:

permission mode 是存在於 inode block 裡的 12 個 bit.
當 bit 為 0 時表示關, 1 表示開, 如:
110111101101

若這 12 bit 分開4組的話, 分別為如下內容:
1) suid, sgid, sticky_bit
2) owner_read, owner_write, owner_exectue
3) group_read, group_write, group_exectue
4) others_read, others_write, others_exectue
按前例來算的, 被打開的 permission 有:
suid, sgid (110)
owner_read, owner_write, owner_exectue (111)
group_read, group_exectue (101)
others_read, others_exectue (101)

不過, 在操作上, 我們不不會用 2 進位啦, 一般(視程式而別)可使用 8 進位或 text mode :

110111101101換算為 8 進位就是 6755 了.
這個相對簡單多了, 我們可用 bc 來算算看:
echo "obase=8;ibase=2;110111101101" | bc
echo "obase=2;ibase=8;6755" | bc
如果手頭上沒有 bc 或其它工具可用, 那也可用如下的換算表來對照:
000|0
001|1
010|2
011|3
100|4
101|5
110|6
111|7
分別將 12 bit 拆四組來算就是了...(考筆試時最好用了!)

然而, 換算成 text mode 就沒那麼輕鬆了.
是因為 text mode 上只能用 9 個字母去表示 12 個 bit .
需花些心思還是可以的.
可先從最簡單的右邊 9 個 bit 來算起:
111101101
rwxr-xr-x
不難發現每組都是 rwx , 1 對著就寫相應的 text, 0 就寫 - 了.
再下來分別找到那三個 x 的位置, 因為:
suid 若為 1 會修改 owner_x: 以 s 代替 x, 以 S 代替 - .
sgid 若為 1 會修改 group_x: 以 s 代替 x, 以 S 代替 - .
sticky_bit 若為 1 會改 others_x: 以 t 代替 x, 以 T 代替 - .
簡單來說, 若原來的 x 為 1 , 就是小寫, 為 0 則是大寫.
以上例來說, 最後結果將是:
110111101101
rwsr-sr-x

至於 umask 運算, 也是可從 permission bit 來運算的.
先抓出 directory 的 default mode: 0777
及 file 的 default mode: 0666
然後將 umask bit 的 1 所對的位置設為 0 就是了.
以 umask 0123 為例吧, 換為 2 進為就是:
000001010011
對應 new file 的 0666:
000110110110
結果, 凡是 umask 1 的位置都設為 0, 得:
000110100100
再轉回 8 進位就是:
0644

若你簡單用減法來算的話, 是不對的:
0666
-0123
-------
0543 (000101100011)

真的公式可參考這個:
(bitwise_NOT umask) AND default_mode = new_permission
上例:
(bitwise_NOT 0123) AND 0666 = 0644

計算過程如下:
000001010011
bitwise_NOT 得:
111110101100
AND
000110110110
得:
000110100100
換算為 8 進位, 就是:
0644

用 2 進位來算是最接近電腦思維的方法, 也是最準確的.
只是人們一般不習慣 2 進位思維而已, 一旦熟悉之後就萬變不離其宗了!

至於 file 與 directory 在 rwx 及 suid,sgid, sitcky_bit 上的差異,
可先參考前面 wingger 版主與相關資料.
若還是理解不來的話, 我們日後再來慢慢討論好了.
作者: 剑心通明    时间: 2005-02-20 17:33
标题: 类UNIX系统基础:文件安全与权限
[quote]原帖由 "wingger"]文件的属主组并不一定就是所有者所在的缺省组,而可以是任何一个跟该文件所有者无关的用户组。为了方便,还是统称属主,属组和其它[/quote 发表:

有点迷糊,能不能详细些?
作者: 剑心通明    时间: 2005-02-20 17:38
标题: 类UNIX系统基础:文件安全与权限
[quote]原帖由 "wingger"]文件的所有者组并非是文件所有者所在的缺省组,而可以是任何一个跟该文件所有者无关的用户组。[/quote 发表:

这个也不太清楚,望高手给解释一下,多谢!
作者: wingger    时间: 2005-02-20 17:47
标题: 类UNIX系统基础:文件安全与权限
原帖由 "剑心通明" 发表:

这个也不太清楚,望高手给解释一下,多谢!


如下面的文件,文件属主是root,文件属组是admin,root和admin中没有必然的联系,也就是root可以属于admin组,也可以不属于admin组
  1. -rwxrw-r-- 1 root admin 34890 10月 19 20:17 httpd.conf
复制代码

作者: jsc_flying    时间: 2005-02-20 18:00
标题: 类UNIX系统基础:文件安全与权限
i am a liunx beginner,24044461
作者: 剑心通明    时间: 2005-02-20 18:49
标题: 类UNIX系统基础:文件安全与权限
明白了,谢谢!
作者: 網中人    时间: 2005-02-20 21:03
标题: 类UNIX系统基础:文件安全与权限
我的理解是:
user(owner), group, others 這三組 permission ,
是三選一的關系, 優先次順從左至右.

簡單來說, 可用如下兩個命令來比對 file 的 owner 與 group:
whoami
groups

若 whoami 的結果與 file 的 onwer 一至, 那就屬 user permission.
若不一至, 再看 groups 的結果, 只要其一與 file 的 group 一至, 那就屬 group permission.
若前兩者都不是, 那就屬 others permission .

p.s.
root 其實是不受 permission 限制的(file execute 例外).
作者: 海之蓝    时间: 2005-03-19 10:05
标题: 类UNIX系统基础:文件安全与权限
这个帖子真好,看之后终于明白以前混淆的东西了
作者: bluejesica    时间: 2005-03-20 10:05
标题: 类UNIX系统基础:文件安全与权限
很好,谢谢
作者: bluejesica    时间: 2005-03-20 10:09
标题: 类UNIX系统基础:文件安全与权限
举如
当创建temp文件时,它具有这样的权限:
代码:
-rw-r--r--    1 root     root            0 10月 19 20:16 temp
如果要使属主和属组用户具有有执行权限,并取消其他用户(所有其他用户)的写权限,可以用:
代码:
$ chmod ug+x temp
$ chmod o-w temp
这样,该文件的权限变为:
代码:
-rwxr--r--    1 root     root            0 10月 19 20:16 temp
---------------------------------
以上是否错误?应该是
-rwxr-xr--    1 root    root             0 10月 19 20:16 temp
作者: Godfatherwang    时间: 2005-03-25 15:25
标题: 类UNIX系统基础:文件安全与权限
RT!
作者: deeperpurple    时间: 2005-04-02 18:13
标题: 类UNIX系统基础:文件安全与权限
恩~~MM真乖,好学上进; 给你奖励个棒棒糖吃 ^_^
作者: lovestar5121    时间: 2005-04-29 17:16
标题: 类UNIX系统基础:文件安全与权限
无限崇拜wingger大侠、以及各位高人中
小弟新手。。学习中。。
作者: luo1110    时间: 2005-05-09 10:11
标题: 类UNIX系统基础:文件安全与权限
法师写得很详细啊!you are really doing a great job!






// perl 资料学习大全推荐 http://www.eyelong.com/learn/web/cgi.htm
作者: 253086580    时间: 2005-05-17 10:37
标题: 类UNIX系统基础:文件安全与权限
好东西,非常适合初学者!
作者: JohnBull    时间: 2005-05-17 12:19
标题: 类UNIX系统基础:文件安全与权限
不仅限于Linux,标题应该是《类UNIX系统基础》才对

作为Linux主题,最好还应该介绍ext2/3文件系统的特有的属性。
man chattr
作者: ruochen    时间: 2005-05-19 21:42
标题: 类UNIX系统基础:文件安全与权限
[quote]原帖由 "wingger"][/quote 发表:


groups和id命令也很有意思!~
作者: YGC    时间: 2005-05-23 15:29
标题: 类UNIX系统基础:文件安全与权限
很详细。。。。。
作者: wolf0403    时间: 2005-05-23 18:32
标题: 类UNIX系统基础:文件安全与权限
关于 sticky bits 的作用,在 APUE 里面的说法是:
如果一个目录权限具有 sticky bit 则是表示文件共享方面的控制:只有属主可以删除文件
如果一个文件具有 sticky bit 则表示文件始终被保持在内存中(这样反复加载的时候可以速度加快)
作者: kingdragonfish    时间: 2005-05-23 20:10
标题: 类UNIX系统基础:文件安全与权限
谢谢楼上的
作者: 網中人    时间: 2005-05-24 07:29
标题: 类UNIX系统基础:文件安全与权限
原帖由 "wolf0403" 发表:
如果一个文件具有 sticky bit 则表示文件始终被保持在内存中(这样反复加载的时候可以速度加快)

這個在 linux 系統中, 已經不實作了.
原因或要了解 linux 的 cache 機制.
作者: jiaxirui    时间: 2005-05-28 17:07
标题: 类UNIX系统基础:文件安全与权限
我是菜鸟,感谢各位老大能把自己的精华给我们这些刚出窝的候鸟。十分感谢,谢谢楼主!
作者: bridge_1979    时间: 2005-06-08 16:23
标题: 类UNIX系统基础:文件安全与权限
如何知道 IO Block的大小呢?
作者: 網中人    时间: 2005-06-08 16:48
标题: 类UNIX系统基础:文件安全与权限
用 tune2fs 或 dumpe2fs 來查 partition 就知道. 如:

dumpe2fs /dev/hda1 | more
作者: 风流涕淌    时间: 2005-06-14 17:15
标题: 类UNIX系统基础:文件安全与权限
原帖由 "JohnBull" 发表:
不仅限于Linux,标题应该是《类UNIX系统基础》才对

作为Linux主题,最好还应该介绍ext2/3文件系统的特有的属性。
man chattr


非常支持楼上的,b也谢谢楼主,为了报答,也说一点建功议点建议:
1,t 权限是粘着位,例:TMP目录下,任何人都有读写执行权限,但是不是任何人对里边的可写权限的文件就可以删除呢,当然不是了,这个就是粘着位的做用,只有所有者才有权删除自已的文件,当然,ROOT除外
2,关于文件安全的另一种权限,
  i权限 也就是不可修改权限  例:chattr u+i aaa 则aaa文件就不可修改,无论任何人,如果删除就用u-i就好了
  a权限 也就是只追加权限, 对于日志系统很好用,这个权限让目标文件只能追加,不能删除,而且不能通过编辑器追加。方法和i权限一样加
如果想要看某个文件是不是有这个权限,用lsattr filename就行了

个人关点,希望大家指教
作者: 风流涕淌    时间: 2005-06-14 17:18
标题: 类UNIX系统基础:文件安全与权限
能看到我这个贴的可能会很少人,我也很想帮助人,希望楼主加到开始的贴子中
作者: hj0001278    时间: 2005-07-27 11:05
标题: 类UNIX系统基础:文件安全与权限
不错,辛苦了
作者: sinboy2002    时间: 2005-08-16 11:32
标题: 类UNIX系统基础:文件安全与权限
收藏,谢谢版主
作者: lijietz    时间: 2005-08-19 16:46
标题: 类UNIX系统基础:文件安全与权限
原帖由 "wingger" 发表:

发现,httpd2.conf实际已经不存在了,是断链,而httpd1.conf变也了普通文件


不能说硬连接是拷贝...如果是拷贝inode就不同.
inode相同,其实就是同一个文件.
作者: Linuxcn.com    时间: 2005-08-19 17:05
标题: 类UNIX系统基础:文件安全与权限
学习了
作者: goodcjh2005    时间: 2005-08-21 10:43
标题: 类UNIX系统基础:文件安全与权限
good!!!
作者: haoyufu    时间: 2005-08-21 12:42
标题: 类UNIX系统基础:文件安全与权限
very good
作者: nwyb    时间: 2005-10-08 21:32
标题: 类UNIX系统基础:文件安全与权限
好东西
作者: c11v11    时间: 2005-10-09 20:40
标题: 类UNIX系统基础:文件安全与权限
不错啊
觉得还是挺基础的呀
我想一天看一章呀
这样每天才充实一些呀
不然过的太乏味了
作者: 一碟子酸白菜    时间: 2005-10-28 20:37
标题: 类UNIX系统基础:文件安全与权限
Controlling File Access
After you have established login restrictions, you need to control access to the data on the  system. Some users only need to look at files; others need the ability to change or delete files. You might have data that you do not want anyone else to see. You control data access by assigning permission levels to a file or directory.
Three levels of access permission are assigned to a UNIX file to control access by the  owner, the group, and all others. Display permissions with the ls -la command. The following example shows the use of the ls -la command to display permissions on files in the /users directory:
ls -la /users

The system responds with this:

drwxr-xr-x 2 bill staff 512 Sep 23 07:02 .
drwxr-xr-x 3 root other 512 Sep 23 07:02 ..
-rw-r—r— 1 bill staff 124 Sep 23 07:02 .cshrc
-rw-r—r— 1 bill staff 575 Sep 23 07:02 .login

The first column of information displays the type of file and its access permissions for the user, group, and others. The r, w, and x are described in Table 6-6. The third column displays the owner of the file—usually the user who created the file. The owner of a file (and superuser) can decide who has the right to read it, to write to it, or—if it is a command—to execute it. The fourth column displays the group to which this file belongs—normally the owner’s primary group.
---------------------------------------------------------------------------------

Table 6-6 File Access Permissions
Symbol Permission Means That Designated Users...
r   Read Can open and read the contents of a file.
w   Write Can write to the file (modify its contents), add to it, or Delete it.
x   Execute Can execute the file (if it is a program or shell script).
-   Denied Cannot read, write to, or execute the file.
---------------------------------------------------------------------------------

When listing the permissions on a directory, all columns of information are the same as for a file, with one exception. The r, w, and x found in the first column are treated slightly differently
---------------------------------------------------------------------------------

than for a file. They are described in Table 6-7.
Table 6-7 Directory Access Permissions Symbol Permission Means That Designated Users...

r Read Can list files in the directory.
w Write Can add or remove files or links in the directory.
x Execute Can open or execute files in the directory. Also can make the directory and the directories beneath it current.
- Denied Do not have read, write, or execute privileges.
---------------------------------------------------------------------------------

Use the commands listed in Table 6-8 to modify file access permissions and ownership, but remember that only the owner of the file or root can assign or modify these values.

---------------------------------------------------------------------------------
Table 6-8 File Access Commands
Command Description
chmod Changes access permissions on a file. You can use either  ymbolic mode (letters and symbols) or absolute mode (octal  umbers) to change permissions on a file. chown Changes the ownership of a file. chgrp Changes the group ownership of a file.
---------------------------------------------------------------------------------


Default umask
When a user creates a file or directory, the default file permissions  ssigned to the file or directory are controlled by the user mask. The user mask should be set by the umask command in a user initialization file such as /etc/profile or .cshrc. You can display the current value of the user mask by typing umask and pressing Enter.
The user mask is set with a three-digit octal value such as 022. The first digit sets permissions for the user, the second sets  ermissions for the group, and the third sets permissions for others. To set the umask to 022, type umask 022
By default, the system sets the permissions on a file to 666,  ranting read and write permission to the user, group, and others. The system sets the default permissions on a directory or executable file to 777, or rwxrwxrwx. The value assigned by umask is subtracted from the default. To determine the umask value you want to set, subtract the value of the permissions you want from 666 (for a file) or 777 (for a directory). The remainder is the value to use with the umask command. For example, suppose you want to change the default mode for files to 644 (rw-r--r--). The difference between 666 and 644 is 022, which is the value you would use as an argument to the umask command.
Setting the umask value has the effect of granting or denying permissions in the same way chmod grants them. For example, the command chmod 022 grants write permission to group and others, and umask 022 denies write permission to group and others.

Sticky Bit
The sticky bit is a permission bit that protects the files within a directory. If the directory has the sticky bit set, a file can be deleted by only the owner of the file, the owner of the directory,
or root. This prevents a user from deleting other users’ files from public directories.
A t or T in the access permissions column of a file listing indicates that the sticky bit has been set:

drwxrwxrwt 2 uucp uucp 512 Feb 12  7:32 /var/spool/uucppublic

Use the chmod command to set the sticky bit. The symbols for setting the sticky bit by using the chmod command in symbolic mode are listed in Table 6-9.
------------------------------------------------------------------------------------
Table 6-9 Sticky Bit Modes
Symbol Description
t Sticky bit is on; execution bit for others is on.
T Sticky bit is on; execution bit for others is off.
------------------------------------------------------------------------------------


Access Control Lists (ACLs)
ACLs (pronounced “ackls”) can provide greater control over file permissions when the traditional UNIX file protection in the Solaris operating system is not enough. The traditional UNIX file protection provides read, write, and execute permissions for the three user
classes: owner, group, and other. An ACL provides better file security by allowing you to define file permissions for the owner, owner’s group, others, specific users and groups, and default permissions for each of these categories.
For example, assume you have a file you want everyone in a group to be able to read. To give everyone access, you would give  group” read permissions on that file. Now, assume you want only one person in the group to be able to write to that file. Standard UNIX doesn’t  let you set that up; however, you can set up an ACL to give only one person in the group write permissions on the file. ACL entries are the way to define an ACL on a file, and they
are set through the ACL commands. ACL entries consist of the following fields, separated by colons:

entry_type:uid | gid:perms
ACL entries are defined in Table 6-10.

------------------------------------------------------------------------------------

Table 6-10 ACL Entries
ACL Field Description
entry_type The type of ACL entry on which to set file permissions.
For example, entry_type can be user (the owner of a file) or mask (the ACL mask).
uid The user name or identification number.
gid The group name or identification number.
perms Represents the permissions set on entry_type. Permissions are indicated by the symbolic characters rwx or an octal number as used with the chmod command.

------------------------------------------------------------------------------------

The ACL mask entry indicates the maximum permissions allowed for users, other than the owner, and for groups. The mask is a quick  ay to change permissions on all users and groups. For example, the mask:r-- mask entry indicates that users and groups cannot have more than read permissions, even though they might have  rite/execute permissions.
Setting ACL Entries
Set ACL entries on a file by using the setfacl command:
$ setfacl -s user::perms,group::perms,other:perms,mask:perms,acl_entry_list filename ...
The -s option replaces the entire ACL with the new ACL entries, if  n ACL already exists on the file.
The following example sets the user permissions to read/write,  roup permissions to readonly, and other permissions to none on the txt1.doc file. In addition, the user bill is given read/write permissions on the file, and the ACL mask permissions are set to read/write, which means that no user or group can have execute permissions.
$ setfacl -s user::rw-,group::r--,other:---,mask:rw-, user:bill:rw- txt1.doc
Checking the New File Permissions Check the new file permissions with the ls -l command. The plus sign (+) to the right of the mode field indicates that the file has an ACL:
$ ls -l
total 210
-rw-r-----+ 1 mike sysadmin 32100 Sep 11 13:11 txt1.doc
-rw-r--r-- 1 mike sysadmin 1410 Sep 11 13:11 txt2.doc
-rw-r--r-- 1 mike sysadmin 1700 Sep 11 13:11 labnotes

Verifying ACL Entries
To verify which ACL entries were set on the file, use the getfacl command:
$ getfacl txt1.doc
The system responds with this:
# file: txt1.doc
# owner: mike
# group: sysadmin
user::rwuser:
bill:rw- #effective:rwgroup::
r-- #effective:r--
mask:rwother:---


Copying a File’s ACL to Another File
Copy a file’s ACL to another file by redirecting the getfacl output as follows:
getfacl <filename1>;: | setfacl -f - <filename2>;
In the following example, I copy the ACL from file1 to file2:
getacl file1 | setfacl -f - file2
Issuing the getfacl command, I can verify that the change has been made:
getfacl file*
# file: file1
# owner: root
# group: other
user::rwuser:
bcalkins:rw- #effective:rwgroup::
r-- #effective:r--
mask:rwother:---
# file: file2
# owner: root
# group: other
user::rwuser:
bcalkins:rw- #effective:rwgroup::
r-- #effective:r--
mask:rwother:---
Modifying ACL Entries on a File
Modify ACL entries on a file by using the setfacl command:
setfacl -m <acl_entry_list>; <filename1>; [filename2 ...]
The arguments for the setfacl command are described in Table 6-11.
-----------------------------------------------------------------------------------
Table 6-11 setfacl Arguments
Argument Description
-m Modifies the existing ACL entry.
<acl_entry_list>; Specifies the list of one or more ACL entries to modify on the file or directory.
You can also modify default ACL entries on a directory. (See Table 6-12 for the list of ACL entries.)
<filename>; Specifies the file or directory.
------------------------------------------------------------------------------------
The ACL entries that can be specified with the setfacl command are described in Table 6-12.
------------------------------------------------------------------------------------
Table 6-12 ACL Entries for Files
ACL Entry Description
u[ser]::<perms>; File owner permissions.
g[roup]::<perms>; File group permissions.
o[ther]:<perms>; Permissions for users other than the file owner or members of the file group.
m[ask]:<perms>; The ACL mask. The mask entry indicates the maximum permissions allowed for users (other than the owner) and for groups. The mask is a quick way to change permissions on all the users and groups. For example, the mask:r-- mask entry indicates that users and groups cannot have more than read permissions, even though they may have write/execute permissions.
u[ser]:uid:<perms>; Permissions for a specific user. For uid, you can specify either a user name or a numeric UID.
g[roup]:gid:<perms>; Permissions for a specific group. For gid, you can specify either a group name or a numeric GID.
------------------------------------------------------------------------------------

Deleting ACL Entries from a File
To delete an ACL entry from a file, use the setfacl -d <acl_entry_list>; command. The following
example illustrates how to remove an ACL entry for user bcalkins on file1 and file2:
setfacl -d u:bcalkins file1 file2
Use the getfacl command, described earlier, to verify that the  ntries have been deleted.
In addition to the ACL entries for files, you can set default ACL entries on a directory that apply to files created within the directory.
Setting the Correct Path
Setting your path variable correctly is important; otherwise, you might accidentally run a program introduced by someone else that harms the data or your system. This kind of program, which creates a security hazard, is called a “Trojan horse.” For example, a substitute su program could be placed in a public directory where you, as system administrator, might run it. Such a script would look just like the regular su command. The script would remove itself after execution, and you’d have trouble knowing that you actually ran a Trojan horse.
The path variable is automatically set at login time through the startup files .login, .profile, and .cshrc. Setting up the user search path so that the current directory (.) comes last prevents you or your users from running this type of Trojan horse. The path variable for superuser should not include the current directory (.) at all.
N O T E . Solaris provides a utility called ASET (Automated Security Enhancement Tool) that examines the startup files to ensure that the path variable is set up correctly and does not contain a dot (.) entry for the current directory. ASET is discussed later in this chapter.

The setuid and setgid Programs
When set-user identification (setuid) permission is set on an executable file, a process that runs this file is granted access based on the file’s owner (usually root) rather than the user who created the process. This allows a user to access files and irectories that normally are available only to the owner. For example, the setuid permission on the passwd command makes it possible for a user to edit the /etc/passwd file to change passwords. When a user executes the passwd command, that user assumes the permissions of the root ID, which is UID 0. The setuid permission can be identified by using the ls -l command. The -s in the permissions field of the following example indicates the use of setuid:
ls -l /etc/passwd
-r-sr-sr-x 1 root sys 10332 May 3 08:23 /usr/bin/passwd
Many executable programs have to be run as root (that is, as superuser) to work properly.
These executables run with the user ID set to 0 (setuid=0). Anyone running these programs runs them with the root ID, which creates a potential security problem if the programs are not written with security in mind.
On the other hand, the use of setuid on an executable program presents a security risk. A determined user can usually find a way to maintain the permissions granted to him by the setuid process, even after the process has finished executing. For example, a particular command might grant root privileges through the setuid. If a user can break out of this command, he could still have the root privileges granted by the setuid on that file. Any intruder who accesses a system will look for any files that have the setuid. Except for the executables shipped with Solaris that have their setuid to root, you should disallow the use of setuid programs—or at least restrict and keep them to a minimum.
T I P. To find files that have setuid permissions, become superuser. Then use the find command to find files that have setuid permissions set:
# find [directory] -user root -perm -4000 -exec ls -ldb {}\; >;/tmp/filename

The set-group identification (setgid) permission is similar to setuid, except that the process’s effective GID is changed to the group owner of the file, and a user is granted access based on permissions granted to that group. Using the ls -l command, you can see that the file /usr/bin/mail has setgid permissions:
-r-x--s--x 1 bin mail 64376 Jul 16 1997 /usr/bin/mail
The following example illustrates how to set the UID on an executable file named myprog1:
chmod 4744 myprog1
Verify the change by typing
ls -l myprog1
The system responds with this:
-rwsr--r-- 1 root other 25 Mar 6 11:52 myprog
The following example illustrates how to set the GID on an executable file named myprog1:
chmod 2070 myprog1
Verify the change by typing
ls -l myprog1
The system responds with this:
----rws--- 1 root other 25 Mar 6 11:58 myprog
Any user can set the UID or GID permission for any file he owns.
作者: ramboo    时间: 2005-11-03 22:58
好东西啊。
作者: biaohu1981    时间: 2005-11-07 18:22
有收获的说!
呵呵,谢谢楼主及发言人啊!
作者: yinxiaofeng    时间: 2005-11-12 15:03
硬链接和软链接的一些问题

$ umask
0022
$ touch my_text
$ ls -li
2513361 -rw-r--r--    1 root     root            0 11月 12 14:33 my_text
$ ln my_text hard_my_text
$ ln -s my_text soft_my_text
$ ls -li
2513361 -rw-r--r--    2 root     root            0 11月 12 14:33 hard_my_text
2513361 -rw-r--r--    2 root     root            0 11月 12 14:33 my_text
2513395 lrwxrwxrwx    1 root     root            7 11月 12 14:34 soft_my_text -> my_text


现在是没有问题,作为硬链接的 hard_my_text 和 原文件 my_text 的 inode 是一样的, 现在我写入一些数据到原文件中
$ echo TEST > my_text
$ ls -li
2513361 -rw-r--r--    2 root     root            5 11月 12 14:36 hard_my_text
2513361 -rw-r--r--    2 root     root            5 11月 12 14:36 my_text
2513395 lrwxrwxrwx    1 root     root            7 11月 12 14:34 soft_my_text -> my_text


经过原文件被写入数据后, 原文件的 inode 和 硬链接 hard_my_text 还是一样的, 我又用 vi my_text 工具测试写入到原文件 数据后, 两个文件(my_text 和 hard_my_text), 它们的 inode 还是一样, 但是我用emacs写入一些数据后,发现有一个小问题

$ ls -li
2513361 -rw-r--r--    2 root     root           17 11月 12 14:38 hard_my_text
2513582 -rw-r--r--    1 root     root           28 11月 12 14:39 my_text
2513361 -rw-r--r--    2 root     root           17 11月 12 14:38 my_text~
2513395 lrwxrwxrwx    1 root     root            7 11月 12 14:34 soft_my_text -> my_text


发现了用 emacs 编辑的原文件 my_text~ 还是和 hard_my_text 硬链接文件是一样的, 但是, 我又发现,原来 my_text 这个名字的文件的 inode 值就被改了, 为了测试, 我又写了一些东西到 my_text, 发现

$ ls -li
2513361 -rw-r--r--    1 root     root           17 11月 12 14:38 hard_my_text
2513613 -rw-r--r--    1 root     root           41 11月 12 14:40 my_text
2513582 -rw-r--r--    1 root     root           28 11月 12 14:39 my_text~
2513395 lrwxrwxrwx    1 root     root            7 11月 12 14:34 soft_my_text -> my_text


这样, 我才发现, 作为硬链接的 hard_my_text 和 原来的文件 my_text 的 inode 值跟本就没有什么关系了, 两个的数据根本就不一样.

那我们现在来看看 hard_my_text , my_text, my_text~ 这三个文件
$ more hard_my_text
TEST
TEST1
TEST2

$ more my_text
TEST
TEST1
TEST2
TEST_Emacs!
TEST2_emacs!

$ more my_text~
TEST
TEST1
TEST2
TEST_Emacs!


这时,我们会发现, 这三个文件的 inode 不一样, 而且内容也不一样了, hard_my_text 的内容也不知道从哪里来的, 请高手指点!

[ 本帖最后由 yinxiaofeng 于 2005-11-12 15:12 编辑 ]
作者: covterycom    时间: 2005-11-15 11:00
ding




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2