视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
Linux中特殊的权限
2025-09-29 03:00:45 责编:小OO
文档
特殊的权限

   文件权限除了r、w、x外还有s、t、i、a权限:

s:文件属主和组设置SUID和GUID,文件在被设置了s权限后将以root身份执行。在设置s权限时文件属主、属组必须先设置相应的x权限,否 则s权限并不能正真生效(c h m o d命令不进行必要的完整性检查,即使不设置x权限就设置s权限,chmod也不会报错,当我们ls -l时看到rwS,大写S说明s权限未生效)。Linux修改密码的passwd便是个设置了SUID的程序,普通用户无读写/etc/shadow文件 的权限确可以修改自己的密码。

ls -al /usr/bin/passwd

-rwsr-xr-x 1 root root 32988 2008-12-08 17:17 /usr/bin/passwd

我们可以通过字符模式设置s权限:chmod a+s filename,也可以使用绝对模式进行设置:

设置s u i d:将相应的权限位之前的那一位设置为4;

设置g u i d:将相应的权限位之前的那一位设置为2;

两者都置位:将相应的权限位之前的那一位设置为4+2=6。

如:chmod 47 filename   //设置SUID

t :设置粘着位,一个文件可读写的用户并一定相让他有删除此文件的权限,如果文件设置了t权限则只有文件所有者和root有删除文件的权限,通过chmod +t filename 来设置t权限。

i:不可修改权限   例:chattr u+i filename 则filename文件就不可修改,无论任何人,如果需要修改需要先删除i权限,用chattr -i filename就可以了。查看文件是否设置了i权限用lsattr filename。

a:只追加权限, 对于日志系统很好用,这个权限让目标文件只能追加,不能删除,而且不能通过编辑器追加。可以使用chattr +a设置追加权限。

    Drwx rws --t  abc1 abc  (abc1可做任何操作,abc组可添加)

 

为什么普通用户无法运行mount命令

Mount命令其实已经有s权限,只是普通用户对硬件设备没权限。可用chmod命令赋予其权限。

前面一直提到文件的重要权限,就是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的属性去掉即可。下载本文

显示全文
专题