Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1858205
  • 博文数量: 343
  • 博客积分: 10342
  • 博客等级: 上将
  • 技术积分: 2892
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-15 12:34
个人简介

你必须非常努力,才能看起来毫不费力!

文章存档

2012年(3)

2011年(5)

2010年(2)

2009年(40)

2008年(293)

分类: LINUX

2009-04-03 13:07:05

文件默认权限:umask

现在,我们知道如何建立或者是改变一个目录或文件的属性了,不过,你知道,当建立一个新的文件或目录时,它的默认属性是什么吗?那就与umask有关了。那么,umask是什么呢?基本上,umask就是指定“当前用户在建立文件或目录时候的属性默认值”。那么,如何得知或设置umask呢?它以下面的方式来指定条件:

[root@linux ~]# umask
0022
[root@linux ~]# umask -S
u=rwx,g=rx,o=rx

查看方式有两种,一种是直接输入umask,可以看到数字类型的权限设置分数,一种是加入 -S(Symbolic)参数,就会以符号类型的方式显示权限。奇怪的是,怎么umask会有4组数字啊?不是只有3组吗?没错。第一组是特殊权限用的,我们先不要理它,所以先看后面3组即可。
在默认权限的属性上,目录与文件是不一样的。由于我们不希望文件具有可执行的权力,默认情况中,文件是没有可执行(x)权限的。因此:
• 若用户建立为”文件”则默认“没有可执行(x)项目”,即只有rw这两个项目,也就是最大为666分,默认属性如下:
-rw-rw-rw-
• 若用户建立为”目录”,则由于x与是否可以进入此目录有关,因此默认为所有权限均开放,即为777分,默认属性如下:
drwxrwxrwx
umask指定的是“该默认值需要减掉的权限”。因为r、w、x分别是4、2、1,所以。也就是说,当要去掉能写的权限,就是输入2,而如果要去掉能读的权限,也就是4,那么要去掉读与写的权限,也就是6,而要去掉执行与写入的权限,也就是3。请问,5是什么?就是读与执行的权限。如果以上面的例子来说明的话,因为umask为022,所以user并没有被去掉属性,不过group与others的属性被去掉了2(也就是w这个属性),那么当用户:
• 建立文件时:(-rw-rw-rw-) – (-----w--w-) ==> -rw-r--r--
• 建立目录时:(drwxrwxrwx) – (d----w--w-) ==> drwxr-xr-x
我们来测试看看。

[root@linux ~]# umask
0022
[root@linux ~]# touch test1
[root@linux ~]# mkdir test2
[root@linux ~]# ll
-rw-r--r--  1 root root    0 Jul 20 00:36 test1
drwxr-xr-x  2 root root 4096 Jul 20 00:36 test2

看见了吧?确定属性是没有错的。假如要让与用户同用户组的人也可以存取文件呢?也就是说,假如dmtsai是users用户组的人,而dmtsai做的文件希望让users同用户组的人也可以存取,这也是在团队开发计划时常常会考虑到的权限问题。在这样的情况下,umask自然不能取消group的w权限,也就是说,我们希望制作出来的文件应该是 -rw-rw-r-- 的模样,所以,umask应该是002才好(仅去掉others的w权限)。如何设置umask呢?简单得很,直接在umask后面输入002。

[root@linux ~]# umask 002
[root@linux ~]# touch test3
[root@linux ~]# mkdir test4
[root@linux ~]# ll
-rw-rw-r--  1 root root    0 Jul 20 00:41 test3
drwxrwxr-x  2 root root 4096 Jul 20 00:41 test4

所以,这个umask对于文件与目录的默认权限是很有关系的。这个概念可以用在任何服务器上,尤其是将来在架设文件服务器(file server),比如SAMBA服务器或FTP服务器时,都很重要。这牵涉到用户是否能够将文件进一步利用的问题。不要等闲视之。

例题四:假设umask为003,请问使用该umask,建立的文件与目录权
限是什么?
答:
umask为003,所以去掉的属性为 --------wx,因此:
文件:(-rw-rw-rw-) - (--------wx) = -rw-rw-r--
目录:(drwxrwxrwx) - (--------wx) = drwxrwxr--

提示:有关umask与权限的计算方式中,教科书喜欢使用二进制方式来进行AND与NOT计算,不过,笔者比较喜欢使用符号方式计算,联想比较容易。但是,有的书籍或BBS上,有人喜欢使用文件默认属性666与目录默认属性777来与umask进行相减计算。这是不好的。以例题4来看,如果使用默认属性相加减,则文件变成:666-003=663,即 -rw-rw--wx,这是完全不对的。想想看,原本文件就已经去除x的默认属性了,怎么可能突然间冒出来了?所以,这个地方要特别小心。

在默认的情况中,root的umask会去掉比较多的属性,root的umask默认是022,这是基于安全的考虑。一般身份用户通常的umask为002,即保留同用户组的写入权力。其实,关于默认umask的设置可以参考 /etc/bashrc文件的内容,不过,建议不要修改该文件,可以参考第11章提到的环境参数设置文件(~/.bashrc)的说明。

以上内容来自于:

 
Linux文件特殊权限 SUID/SGID/Sticky Bit

前面一直提到文件的重要权限,就是rwx这3个读、写、执行的权限。但是,怎么 /tmp权限有些奇怪?还有, /usr/bin/passwd也有些奇怪,怎么回事呢?

[root@linux ~]# ls -ld /tmp ; ls -l /usr/bin/passwd
drwxrwxrwt 5 root root 4096 Jul 20 10:00 /tmp
-r-s--x--x 1 root root 18840 Mar 7 18:06 /usr/bin/passwd

不是只有rwx吗?为什么还有其他的特殊权限呢?不要担心,我们这里先不谈这两个权限,只是先介绍一下而已。因为必须要有账号的ID概念,以及程序的进程(process)概念后,才能够进一步了解这些特殊权限所表示的意义。

Set UID

会创建s与t权限,是为了让一般用户在执行某些程序的时候,能够暂时具有该程序拥有者的权限。举例来说,我们知道,账号与密码的存放文件其实是 /etc/passwd与 /etc/shadow。而 /etc/shadow文件的权限是“-r--------”。它的拥有者是root。在这个权限中,仅有root可以“强制”存储,其他人是连看都不行的。

但是,偏偏笔者使用dmtsai这个一般身份用户去更新自己的密码时,使用的就是 /usr/bin/passwd程序,却可以更新自己的密码。也就是说,dmtsai这个一般身份用户可以存取 /etc/shadow密码文件。这怎么可能?明明 /etc/shadow就是没有dmtsai可存取的权限。这就是因为有s权限的帮助。当s权限在user的x时,也就是类似 -r-s--x--x,称为Set UID,简称为SUID,这个UID表示User的ID,而User表示这个程序(/usr/bin/passwd)的拥有者(root)。那么,我们就可以知道,当dmtsai用户执行 /usr/bin/passwd时,它就会“暂时”得到文件拥有者root的权限。

SUID仅可用在“二进制文件(binary file)”,SUID因为是程序在执行过程中拥有文件拥有者的权限,因此,它仅可用于二进制文件,不能用在批处理文件(shell脚本)上。这是因为shell脚本只是将很多二进制执行文件调进来执行而已。所以SUID的权限部分,还是要看shell脚本调用进来的程序设置,而不是shell脚本本身。当然,SUID对目录是无效的。这点要特别注意。

Set GID

进一步而言,如果s的权限是在用户组,那么就是Set GID,简称为SGID。SGID可以用在两个方面。

文件:如果SGID设置在二进制文件上,则不论用户是谁,在执行该程序的时候,它的有效用户组(effective group)将会变成该程序的用户组所有者(group id)。

目录:如果SGID是设置在A目录上,则在该A目录内所建立的文件或目录的用户组,将会是此A目录的用户组。

一般来说,SGID多用在特定的多人团队的项目开发上,在系统中用得较少。

Sticky Bit

这个Sticky Bit当前只针对目录有效,对文件没有效果。SBit对目录的作用是:“在具有SBit的目录下,用户若在该目录下具有w及x权限,则当用户在该目录下建立文件或目录时,只有文件拥有者与root才有权力删除”。换句话说:当甲用户在A目录下拥有group或other的项目,且拥有w权限,这表示甲用户对该目录内任何人建立的目录或文件均可进行“删除/重命名/移动”等操作。不过,如果将A目录加上了Sticky bit的权限,则甲只能够针对自己建立的文件或目录进行删除/重命名/移动等操作。

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

1. 以root登入系统,并且进入 /tmp中。

2. touch test,并且更改test权限成为777。

3. 以一般用户登入,并进入 /tmp。

4. 尝试删除test文件。

更多关于SUID/SGID/Sticky Bit的介绍,我们会在第11章中再次提及,当前,先有简单的概念即可。

SUID/SGID/SBIT权限设置

前面介绍过SUID与SGID的功能,那么,如何打开文件使其成为具有SUID与SGID的权限呢?这就需要使用数字更改权限了。现在应该知道,使用数字更改权限的方式为“3个数字”的组合,那么,如果在这3个数字之前再加上一个数字,最前面的数字就表示这几个属性了(注:通常我们使用chmod xyz filename的方式来设置filename的属性时,则是假设没有SUID、SGID及Sticky bit)。

4为SUID

2为SGID

1为Sticky bit

假设要将一个文件属性改为“-rwsr-xr-x”,由于s在用户权限中,所以是SUID,因此,在原先的755之前还要加上4,也就是使用“chmod 4755 filename”来设置。此外,还有大S与大T的产生。参考下面的范例(注意:下面的范例只是练习而已,所以笔者使用同一个文件来设置,必须知道,SUID不是用在目录上,SBIT不是用在文件上)。

[root@linux ~]# cd /tmp
[root@linux tmp]# touch test
[root@linux tmp]# chmod 4755 test; ls -l test
-rwsr-xr-x 1 root root 0 Jul 20 11:27 test
[root@linux tmp]# chmod 6755 test; ls -l test
-rwsr-sr-x 1 root root 0 Jul 20 11:27 test
[root@linux tmp]# chmod 1755 test; ls -l test
-rwxr-xr-t 1 root root 0 Jul 20 11:27 test
[root@linux tmp]# chmod 7666 test; ls -l test
-rwSrwSrwT 1 root root 0 Jul 20 11:27 test

# 这个例子要特别小心。怎么会出现大写的S与T呢?不都是小写的吗?

# 因为s与t都是取代x参数的,但是,我们是使用

# 7666。也就是说,user、group以及others都没有x这个可执行的标志

# (因为666)。所以,S、T表示“空的”。

# SUID是表示“该文件在执行时,具有文件拥有者的权限”,但文件

# 拥有者都无法执行了,哪里来的权限给其他人使用呢?当然就是空的

文件隐藏属性

文件有隐藏属性,隐藏属性对系统有很大的帮助。尤其是在系统安全(Security)方面,非常重要。下面我们就来谈一谈如何设置与检查这些隐藏的属性。

chattr(设置文件隐藏属性)

[root@linux ~]# chattr [+-=][ASacdistu] 文件或目录名

参数:

+ : 增加某个特殊参数,其他原本存在的参数不动。

- : 删除某个特殊参数,其他原本存在的参数不动。

= : 设置一定,且仅有后面接的参数

A : 当设置了A属性时,这个文件(或目录)的存取时间atime(access)将不可被修改,可避免例如手提电脑有磁盘I/O错误的情况发生。

S : 这个功能有点类似sync。就是将数据同步写入磁盘中。可以有效地避免数据流失。

a : 设置a之后,这个文件将只能增加数据,而不能删除,只有root才能设置这个属性。

c : 这个属性设置之后,将会自动将此文件“压缩”,在读取的时候将会自动解压缩,但在存储的时候,将会先进行压缩后再存储(对于大文件有用)。

d : 当执行dump(备份)程序的时候,设置d属性将可使该文件(或目录)具有转储功效。

i : i的作用很大。它可以让一个文件“不能被删除、改名、设置连接,也无法写入或新增数据”。对于系统安全性有相当大的帮助。

j : 当使用ext3文件系统格式时,设置j属性将会使文件在写入时先记录在journal中。但是,当文件系统设置参数为data=journalled时,由于已经设置日志了,所以这个属性无效。

s : 当文件设置了s参数时,它将会从这个硬盘空间完全删除。

u : 与s相反,当使用u来设置文件时,则数据内容其实还存在磁盘中,可以用来还原删除.

注意:这个属性设置上,比较常见的是a与i的设置值,而且很多设置值必须要root才能设置。

范例:

[root@linux ~]# cd /tmp
[root@linux tmp]# touch attrtest
[root@linux tmp]# chattr +i attrtest
[root@linux tmp]# rm attrtest
rm: remove write-protected regular empty file `attrtest'? y
rm: cannot remove `attrtest': Operation not permitted

# 看到了吗?连root也没有办法删除这个文件。赶紧解除设置。

[root@linux tmp]# chattr -i attrtest

这个命令很重要,尤其是在系统的安全性方面。由于这些属性是隐藏的,所以需要用lsattr才能看到。笔者认为,最重要的是 +i属性,因为它可以让一个文件无法被更改,对于需要很高系统安全性的人来说,相当重要。还有相当多的属性是需要root才能设置的。此外,如果是登录文件,就更需要 +a参数,使之可以增加但不能修改与删除原有的数据。将来提到登录文件时,我们再来介绍如何设置它。

lsattr(显示文件的隐藏属性)

[root@linux ~]# lsattr [-aR] 文件或目录

参数:

-a : 将隐藏文件的属性也显示出来。

-R : 连同子目录的数据也一并列出来。

范例:

[root@linux tmp]# chattr +aij attrtest

[root@linux tmp]# lsattr

----ia---j--- ./attrtest

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

文章出处:DIY部落

阅读(2051) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~