Total Pageviews

Tuesday 30 July 2024

Linux下,文件默认权限详解之umask命令

 当我们新建一个新的文件或目录时,我们很少会去了解它的默认权限是什么。Linux下,默认权限涉及到umask这个命令,umask就是指定目前使用者在创建文件或目录时需要减去的权限默认值。可以用底下的方式来得知umask:

[root@lmode ~]# umask
0022   《= 和一般权限有关的是后面三个数字
[root@lmode ~]# umask -S
u=rwx,g=rx,o=rx
第一种查阅方式就是直接输入umask,便可以看到数字型态的权限配置分数,另一种是加入-S(Symbolic)这个选项,就会以符号类型的方式来显示出权限。第一种umask 的四个数字有点特殊,第一个是特殊权限用的。我们先了解后面三个数字。

在默认权限的属性上,目录与文件是不一样的。x权限对目录是非常重要的,但是一般文件的创建则不应该有运行的权限,因为一般文件通常是用在数据的记录,当然不需要运行的权限了。因此,默认情况如下:
若使用者创建为文件则默认没有可运行( x )权限,只有 rw 这两个权限,用权限数字表示最大为666,默认权限如下:
-rw-rw-rw-
若使用者创建为目录,则由于 x 与是否可以进入此目录有关,因此默认为所有权限均开放,用权限数字即777,默认权限如下:
drwxrwxrwx
要注意的是,umask 的那组数字的后三个指的是该默认值需要减掉的权限。因为 r、w、x 权限分别对应的是 4、2、1 分,所以,也就是说,当要拿掉写的权限,umask那组数字相对应的要写上2,而如果要拿掉能读的权限,就要写上4,那么要拿掉读与写的权限,就要写上6,依次类推。

上面的例子中,umask后三位为022,所以user并没有被拿掉任何权限,不过group与others的权限被拿掉了2(也就是 w 这个权限),那么当使用者:
创建文件时:(-rw-rw-rw-) - (-----w--w-) ==> -rw-r--r--
创建目录时:(drwxrwxrwx) - (d----w--w-) ==> drwxr-xr-x
上面例子的含义是,当创建文件时,该文件被创建后的默认权限是666-022=644。(其中022为mask默认后三位)而创建目录时,目录被创建后的默认权限是777-022=755。我们可以验证一下:
[root@lmode ~]# umask
0022
[root@lmode ~]# touch test1
[root@lmode ~]# mkdir test2
[root@lmode ~]# ll
-rw-r--r--  1 root root     0 Nov 26 22:51 test1
drwxr-xr-x  2 root root  4096 Nov 26 22:51 test2

umask的利用与修改
umask值设定的多少,影响着你新建文件或目录最终的权限属性。配置umask很简单,直接在umask后面输入相应的一组值即可。比如你要将umask设定为002,那么直接这么操作:

[root@iZ94aucqfjcZ ~]# umask 002
[root@iZ94aucqfjcZ ~]# touch test3
[root@iZ94aucqfjcZ ~]# mkdir test4
[root@iZ94aucqfjcZ ~]# ll
total 48
-rw-rw-r--  1 root root     0 Nov 26 23:01 test3
drwxrwxr-x  2 root root  4096 Nov 26 23:01 test4
实例:假设你的umask为 003 ,请问该umask情况下,创建的文件与目录权限是多少?
umask 为 003 ,所以拿掉的权限为 ——–wx,因此:

文件: (-rw-rw-rw-) - (--------wx) = -rw-rw-r--
目录: (drwxrwxrwx) - (--------wx) = drwxrwxr--
像上面的例子如果使用文件默认属性 666 与目录默认属性 777 来与 umask 进行相减的计算则很容易出错,以上面例题来看,如果使用默认属性相加减,则文件变成:666-003=663,亦即是 -rw-rw–wx ,这可是完全不对的。因为原本文件就已经去除 x 的默认属性了,而直接相减计算完则多了个x属性,很显然是错误的。所以,切忌直接将权限进行相加减。

在默认的情况中,root 的umask会拿掉比较多的属性,root 的 umask 默认是 022 ,这是基于安全的考量。至于一般身份使用者,通常他们的 umask 为 002 ,亦即保留同群组的写入权力。关于默认 umask 的配置可以参考 /etc/bashrc 这个文件的内容,不建议修改该文件,感兴趣可以去了解下。

-----------

Linux下,文件的隐藏属性

Linux下,单单ugo(user,group,others)合起来的九个权限就已经够让人抓狂了,又多了一个隐藏属性,对初学者来说很容易焦头烂额。不过,文件的隐藏属性对系统有很大的帮助。那么如何配置和检查这些隐藏的属性?

chattr(配置文件隐藏属性命令)

chattr命令只能在Ext2/Ext3的文件系统生效,其他文件系统可能无法支持这个命令。chattr命令的用法和参数如下:

[root@lmode ~]# 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 才能配置。

实例:创建一个新文件,并加入i参数

[root@lmode ~]# cd /tmp
[root@lmode tmp]# touch attrtest
[root@lmode tmp]# chattr +i attrtest
[root@lmode tmp]# rm -rf attrtest
rm: cannot remove `attrtest': Operation not permitted
从上面的实例可以看到,当一个文件添加了i属性后,连root这个超级管理员都没办法删除这个文件。这时,如果想删除文件,只能将i属性解除后删除。

实例:取消文件i属性

[root@lmode tmp]# chattr -i attrtest
[root@lmode tmp]# rm -rf attrtest
在系统的数据安全上面,chattr这个命令是很重要的。由于这些属性是隐藏属性,所以需要使用lsattr这个特殊命令才能看到。一般来说,i和a这两个属性比较常用,+i可以让一个文件无法被更动,对于需要强烈的系统安全的人来说,是非常重要的。而且,这两个属性需要root才能配置。

lsattr(显示文件隐藏属性)

下面介绍lsattr这个命令的用法和参数:

[root@lmode ~]# lsattr [-adR] 文件或目录
选项与参数:
-a :将隐藏档的属性也显示出来;
 
-d :如果接的是目录,仅列出目录本身的属性而非目录内的文件名;
 
-R :连同子目录的数据也一并列出来。
实例:用lsattr查看属性

[root@iZ94aucqfjcZ tmp]# touch test
[root@iZ94aucqfjcZ tmp]# chattr +aij test
[root@iZ94aucqfjcZ tmp]# lsattr test
----ia---j---e- test
使用chattr配置属性后,可以用lsattr来查阅隐藏的属性。

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

Linux下,文件的特殊权限: SUID, SGID, SBIT详解



在Linux系统中,只要一提到关于权限,那一般就是rwx这三个读、写、运行权限。但是,只要你足够细心,你会发现/tmp和/usr/bin/passwd的权限很特殊,如下:

[root@lmode tmp]# ls -ld /tmp ; ls -l /usr/bin/passwd
drwxrwxrwt. 3 root root 12288 Dec  6 20:19 /tmp
 
-rwsr-xr-x. 1 root root 30768 Feb 22 2012 /usr/bin/passwd
从上面可以看到,除了rwx权限外,/tmp还多了个t权限,而/usr/bin/passwd则多了个s权限。下面详细介绍这些特殊权限。

SET UID

当 s 这个标志出现在文件拥有者的 x 权限上时,例如刚刚提到的 /usr/bin/passwd 这个文件的权限状态:『-rwsr-xr-x』,此时就被称为 Set UID,简称为 SUID 的特殊权限。

基本上SUID有这样的限制与功能:

SUID 权限仅对二进位程序(binary program)有效;
 
运行者对于该程序需要具有 x 的可运行权限;
 
本权限仅在运行该程序的过程中有效 (run-time);
 
运行者将具有该程序拥有者 (owner) 的权限。
上面的总结有点抽象,举个例子说明会更好理解。 我们的 Linux 系统中,所有帐号的密码都记录在 /etc/shadow 这个文件里面,这个文件的权限为:

---------- 1 root root 1169 Jul  1 15:52 /etc/shadow
意思是这个文件仅有root可读且仅有root可以强制写入而已。

既然这个文件仅有 root 可以修改,那么当Liunx下还有 lmode 这个一般帐号时,lmode使用者能否自行修改自己的密码呢? 答案是肯定的,你可以使用passwd这个命令来修改自己的密码。

那么,这和上面叙述的有没有冲突?明明/etc/shadow就不能让lmode这个一般帐户去存取密码的,为什么lmode却还能修改密码,其实这就是SUID的功能了。

可以简单的归纳为:
1.lmode 对于 /usr/bin/passwd 这个程序来说是具有 x 权限的,表示 lmode 能运行 passwd;
2.passwd 的拥有者是 root 这个帐号;
3.lmode 运行 passwd 的过程中,会『暂时』获得 root 的权限;
4./etc/shadow 就可以被 lmode 所运行的 passwd 所修改。

但是,如果lmode想用cat去读取/etc/shadow时,则是被禁止的。因为cat不具有SUID的权限。这里要在强调的是,SUID仅用作二进制(binary program)文件上,而不能用在脚本文件(shell script)上。因为脚本文件只是将很多的二进制命令集中一起来运行。所以SUID权限部分,还是得看脚本文件里面二进制运行文件是否具有相应权限,而不是去看脚本文件本身。

Set GID

当 s 标志在文件拥有者的 x 权限上时为 SUID,那 s 在群组的 x 权限位置时则称为 Set GID, 简写SGID。可以通过命令来查看具有SGID权限的文件:

[root@lmode ~]# ls -l /usr/bin/locate
-rwx--s--x 1 root slocate 23856 Mar 15 2015 /usr/bin/locate
与 SUID 不同的是,SGID 可以针对文件或目录来配置。如果是对文件来说, SGID 有如下的功能:

SGID 对二进制程序文件有用;
 
程序运行者对于该程序来说,需具备 x 的权限;
 
运行者在运行的过程中将会获得该程序文件所属群组的权限。
举例来说,上面的 /usr/bin/locate 这个程序可以去搜寻 /var/lib/mlocate/mlocate.db 这个文件的内容,mlocate.db 的权限如下:

[root@lmode ~]# 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
与 SUID 非常的类似,若我使用 lmode 这个帐号去运行 locate 时,那 lmode 将会暂时取得 slocate 群组的权限, 因此就能够去读取 mlocate.db 这个文件的内容。

除了 二进制文件 之外,事实上 SGID 也能够用在目录上,这也是非常常见的一种用途。 当一个目录配置了 SGID 的权限后,他将具有如下的功能:

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

Sticky Bit

当t标志在文件其它者x权限位上时, 则称为Sticky Bit,简写为SBIT。 SBIT 目前只针对目录有效,对于文件已经没有效果了。 SBIT 对于目录的作用是:

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

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

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

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

Linux下,SUID/SGID/SBIT 的权限配置

之前介绍过SUID与SGID的功能,那么如何配置文件使成为具有SUID与SGID的权限?这就要涉及到Linux下数字更改权限的方法。数字型态更改权限的方式为三个数字的组合,而SUID/SGID/SBIT 权限配置则是在这三个数字之前加上一个数字,最前面的那个数字就代表这几个权限:

4 为 SUID
2 为 SGID
1 为 SBIT
假设要将一个文件权限改为『-rwsr-xr-x』时,由于 s 在使用者权限中,所以是 SUID ,因此, 在原先的 755 之前还要加上 4 ,
也就是:『 chmod 4755 filename 』来配置。

下面这个例子为了方便使用同一个文件来配置,不过要注意的是,SUID是用在文件上而SBIT是用在目录上。

[root@lmode ~]# cd /tmp
[root@lmode tmp]# touch ppsszz
[root@lmode tmp]# chmod 4755 ppsszz ; ls -l ppsszz
-rwsr-xr-x 1 root root 0 Dec  9 23:15 ppsszz
 
[root@lmode tmp]# chmod 6755 ppsszz ; ls -l ppsszz
-rwsr-sr-x 1 root root 0 Dec  9 23:15 ppsszz
 
[root@lmode tmp]# chmod 1755 ppsszz ; ls -l ppsszz
-rwxr-xr-t 1 root root 0 Dec  9 23:15 ppsszz
 
[root@lmode tmp]# chmod 7666 ppsszz ; ls -l ppsszz
-rwSrwSrwT 1 root root 0 Dec  9 23:15 ppsszz
最后一个例子就要特别小心。怎么会出现大写的 S 与 T 呢?不都是小写的吗? 因为 s 与 t 都是取代 x 这个权限的,但是你有没有发现,我们是下达 7666 。也就是说, user, group 以及 others 都没有 x 这个可运行的标志( 因为 666 ),所以,这个 S, T 代表的就是空的。怎么说? SUID 是表示『该文件在运行的时候,具有文件拥有者的权限』,但是文件 拥有者都无法运行了,哪里来的权限给其他人使用?当然就是空的。

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

#配置权限为-rws--x--x
[root@lmode tmp]# chmod u=rwxs,go=x ppsszz ; ls -l ppsszz
-rws--x--x 1 root root 0 Dec  9 23:15 ppsszz
 
[root@lmode tmp]# chmod g+s,o+t ppsszz ; ls -l ppsszz
-rws--s--t 1 root root 0 Dec  9 23:15 ppsszz

No comments:

Post a Comment