目录
1 文件默认权限:umask
1.1 umask介绍
在linux系统中,我们创建一个新的文件或者目录的时候,这些新的文件或目录都会有默认的访问权限,umask命令与文件和目录的默认访问权限有关。umask即使指定“目前用户在新建文件或目录时候的权限默认值”。
若用户创建一个文件,则文件的默认访问权限为 -rw-rw-rw- (最大为666),
创建目录的默认权限 drwxrwxrwx (777),
而umask值则表明了需要从默认权限中去掉哪些权限来成为最终的默认权限值。
1.2 umask值的含义
可以使用命令 umask 来查看umask值
可以看到umask值为0002,其中第一个0与特殊权限有关,可以暂时不用理会,后三位002则与普通权限(rwx)有关。其中002中第一个0与用户(user)权限有关,表示从用户权限减0,也就是权限不变,所以文件的创建者的权限是默认权限(rw);第二个0与组权限(group)有关,表示从组的权限减0,所以群组的权限也保持默认权限(rw);最后一位2则与系统中其他用户(others)的权限有关。
由于w=2,所以需要从其他用户默认权限(rw)减去2,也就是去掉写(w)权限,则其他人的权限为rw - w = r,则创建文件的最终默认权限为 -rw-rw-r-- 。同理,目录的默认权限为 drwxrwxrwx ,则d rwx rwx rwx - 002 = (d rwx rwx rwx) - (- --- --- -w-) = d rwx rwx r-x,所以用户创建目录的默认访问权限为 drwxrwxr-x 。我们通过下面的例子验证一下:
其中test1是文件,test2是目录。
1.3 更改umask值
可以通过命令 umask 值 的方式来更改umask值,比如我要把umask值改为027,则使用命令 umask 027 即可。改成027后,用户权限不变,群组权限减掉2,也就是去掉写(w)权限,其他用户减7,也就是去掉读写执行权限(rwx),所以其他用户没有访问权限。
这种方式并不能永久改变umask值,只是改变了当前会话的umask值,打开一个新的terminal输入umask命令,可以看到umask值仍是默认的002。要想永久改变umask值,则可以修改文件/etc/bashrc,在文件中添加一行 umask 027 。不过,不建议修改。
2 文件隐藏属性
2.1 chattr设置文件的隐藏属性
Linux chattr命令用于改变文件属性。
这项指令可改变存放在Ext2/Ext3文件系统上的文件或目录属性。
2.1.1 语法
chattr [-RV] [-v<版本编号>] [+/-/=<属性>] [文件或目录...]
2.1.2 参数
- -R 递归处理,将指定目录下的所有文件及子目录一并处理。
- -v<版本编号> 设置文件或目录版本。
- -V 显示指令执行过程。
- +<属性> 开启文件或目录的该项属性。
- -<属性> 关闭文件或目录的该项属性。
- =<属性> 指定文件或目录的该项属性。
这些属性共有以下8种模式:
- a:让文件或目录仅供附加用途。
- b:不更新文件或目录的最后存取时间。
- c:将文件或目录压缩后存放。
- d:将文件或目录排除在倾倒操作之外。
- i:不得任意更动文件或目录。
- s:保密性删除文件或目录。
- S:即时更新文件或目录。
- u:预防意外删除。
2.1.3 实例
① 用chattr命令防止系统中某个关键文件被修改:
chattr +i /etc/resolv.conf
lsattr /etc/resolv.conf
会显示如下属性
----i-------- /etc/resolv.conf
② 让某个文件只能往里面追加数据,但不能删除,适用于各种日志文件:
chattr +a /var/log/messages
2.2 lsattr显示文件隐藏属性
Linux lsattr命令用于显示文件属性。
用chattr执行改变文件或目录的属性,可执行lsattr指令查询其属性。
2.2.1 语法
lsattr [-adlRvV] [文件或目录...]
2.2.2 参数
- -a 显示所有文件和目录,包括以"."为名称开头字符的额外内建,现行目录"."与上层目录".."。
- -d 显示,目录名称,而非其内容。
- -l 此参数目前没有任何作用。
- -R 递归处理,将指定目录下的所有文件及子目录一并处理。
- -v 显示文件或目录版本。
- -V 显示版本信息。
3 文件特殊权限
/tmp 有 t 权限;/usr/bin/passwd 有 s 权限。
3.1 SUID
3.1.1 SUID说明
试想一个场景:
Linux普通用户可以修改自己的密码,这个是一个合情合理的设置;修改密码其实修改的是
/etc/shadow
这个文件;然而不知道你有没看过这个文件的属性:[niesh@niesh ~]$ ll /etc/shadow ----------. 1 root root 1476 7月 30 16:15 /etc/shadow
很明显普通用户对
/etc/shadow
文件没有任何权限啊,那怎么可能修改该文件呢?
一方面我们需要修改自己的密码(就是修改/etc/shadow
),另一方面这个文件对普通用户没任何权限,自相矛盾啊?
其实,这里就牵扯到了 SUID 权限:修改密码的流程其实就是通过 /usr/bin/passwd
命令对 /etc/passwd
进行修改,那么先让我们看一下这个可执行文件的属性:
[niesh@niesh ~]$ ll /usr/bin/passwd
-rwsr-xr-x. 1 root root 27832 6月 10 2014 /usr/bin/passwd
发现/usr/bin/passwd的权限为:-rwsr-xr-x. 在此“文件所有者”的第三位是s权限,也就是咱们即将要详细讲解的的SUID权限。
验证一下(和cat
命令对比):
[niesh@niesh ~]$ passwd
更改用户 niesh 的密码 。
为 niesh 更改 STRESS 密码。
(当前)UNIX 密码:
新的 密码:
[niesh@niesh ~]$ ll /usr/bin/cat
-rwxr-xr-x. 1 root root 54048 11月 20 2015 /usr/bin/cat
[niesh@niesh ~]$ cat /etc/shadow
cat: /etc/shadow: 权限不够
SUID(或者 s 权限):当一个具有执行权限的文件设置SUID权限后,用户执行这个文件时将以文件所有者的身份执行。passwd命令具有SUID权限,所有者为root(Linux中的命令默认所有者都是root),也就是说当普通用户使用passwd更改自己密码的时候,那一瞬间实际在以passwd命令所有者root的身份在执行,root当然可以将密码写入/etc/shadow文件(root是一个bug的存在,在Linux中就没有它不能干的事),命令执行完成后该身份也随之消失。
必须具备以下几个条件(前提):
- 只有可执行的二进制程序才可以设置SUID
- 所有者必须对欲设置SUID的文件具备 可执行(x) 权限
- 命令执行过程中,其它用户获取所有者的身份
- SetUID具有时间限制,即完成该程序执行后就消失
3.1.2 设置和取消SUID
设置SetUID:
chmod 4xxx < file-name >
chmod u+s < file-name >
取消SetUID:
chmod xxx < file-name >
chmod u-s < file-name >
3.1.3 示例
首先,查看一下touch命令的属性:
[niesh@niesh tmp]$ ll /usr/bin/touch
-rwxr-xr-x. 1 root root 62432 11月 20 2015 /usr/bin/touch
然后,用普通用户创建一个文件:
[niesh@niesh tmp]$ touch test1
[niesh@niesh tmp]$ ll test1
-rw-rw-r--. 1 niesh niesh 0 7月 30 17:40 test1
接着,更改touch的属性,增加SUID属性:
[niesh@niesh tmp]$ sudo chmod u+s /usr/bin/touch
[sudo] password for niesh:
[niesh@niesh tmp]$ ll /usr/bin/touch
-rwsr-xr-x. 1 root root 62432 11月 20 2015 /usr/bin/touch
而后,用普通用户再新建一个文件:
[niesh@niesh tmp]$ touch test2
最后,查看两个新建文件的属性:
[niesh@niesh tmp]$ ll test1 test2
-rw-rw-r--. 1 niesh niesh 0 7月 30 17:40 test1
-rw-rw-r--. 1 root niesh 0 7月 30 17:42 test2
[niesh@niesh tmp]$
可以看到,在设置了SUID之后,新建文件的所有者为root了,说明在执行touch的时候,用户自动升级为了所有者。
SUID仅可用在二进制程序上,不能够用在 shell script 上面。SUID对于目录也是无效的。
3.2 SGID
其实,SGID基本与SUID相同,无非也就是一个设置所有者的权限,GID为设置所属组的特殊权限!
区别点在于:SGID也可以设置目录的相关SGID权限!
3.2.1 SGID条件
针对文件:
- 可执行的二进制文件
- 命令执行者(即所属组)对该文件具备 x 权限
- 执行者在执行的过程中将会获得该程序用户组的支持
- 权限只在执行过程中有效
针对目录:
- 普通用户对目录具备
r
和x
权限,才可以进入到该目录- 普通用户在此目录中的有效用户组(effective group)会变成此目录的所属组
- 如普通用户对该目录具备
w
权限(可以新建文件),新建文件的所属组为该目录的所属组
3.2.2 设置和取消SGID
设置SGID:
chmod 2xxx
取消SGID:
chmod xxx
3.2.3 示例
我们此处以locate
命令进行讨论:locate
查询命令,比find
要快很多,为什么?因为其实搜索的是数据库而非整个硬盘:
[root@niesh ~]# ll /usr/bin/locate
-rwx--s--x. 1 root slocate 40496 6月 10 2014 /usr/bin/locate
[root@niesh ~]# ll /var/lib/mlocate/mlocate.db
-rw-r-----. 1 root slocate 6306909 7月 30 19:15 /var/lib/mlocate/mlocate.db
我用普通用户进行locate查看:
[niesh@niesh root]$ locate mlocate.db
/usr/share/man/man5/mlocate.db.5.gz
去掉locate的s权限:
[root@niesh ~]# chmod g-s /usr/bin/locate
[root@niesh ~]# ll /usr/bin/locate
-rwx--x--x. 1 root slocate 40496 6月 10 2014 /usr/bin/locate
[niesh@niesh root]$ locate mlocate.db
locate: 无法执行 stat () `/var/lib/mlocate/mlocate.db': 权限不够
也就是:当执行locate命令时,普通用户niesh
自动升级为slocate
的组成员。
3.3 SBIT
SBIT:Stick Bit,粘滞位。
3.3.1 作用
- 只对目录有效
- 普通用户对该目录有
w
和x
权限- 若没有粘滞位,则普通用户可以对目录下的文件/子目录进行删除操作(因为普通用户对目录具有
w
权限),包括其它用户建立的目录/文件;但若赋了SBIT,则普通用户只能删除自己创建的文件/目录,而不能删除不属于自己的文件/目录!
Sticky相关说明:
- 对于一个多人可写的目录,如果设置了sticky,则每个用户仅能删除和改名自己的文件或目录;
- 只能作用在目录上.普通文件设置无意义,且会被linux内核忽略
- 用户在设置Sticky权限的目录下新建的目录不会自动继承Sticky权限
3.3.2 设置和取消SBIT
设置SBIT
chmod 1xxx < dir-name >
chmod o+t < dir-name >
取消SBIT
chmod xxx < dir-name >
chmod o-t < dir-name >
3.3.3 例程
以/tmp为例:
查看/tmp的权限:
会看到,/tmp 目录的权限 other 部分为rwt,这个 t 就是我们设置的粘滞位。
接下来,我们用其它用户创建两个文件:
[Jimmy@niesh tmp]$ touch test-file
[Jimmy@niesh tmp]$ mkdir test-dir
[Jimmy@niesh tmp]$ ll
总用量 0
drwxrwxr-x. 2 Jimmy Jimmy 6 7月 30 19:44 test-dir
-rw-rw-r--. 1 root Jimmy 0 7月 30 19:44 test-file
切换到另外一个用户 niesh:
[niesh@niesh tmp]$ ll
总用量 0
drwxrwxr-x. 2 Jimmy Jimmy 6 7月 30 19:44 test-dir
-rw-rw-r--. 1 root Jimmy 0 7月 30 19:44 test-file
在 niesh
用户下,删除 /tmp 目录下的文件:
[niesh@niesh tmp]$ rm -rf test-dir/ test-file
rm: 无法删除"test-dir/": 不允许的操作
然后,我们切换到 root,去掉 /tmp 的粘滞位:
[niesh@niesh tmp]$ su -
密码:
上一次登录:日 7月 30 19:43:21 CST 2017pts/0 上
[root@niesh ~]# chmod o-t /tmp/
[root@niesh ~]# ll -d /tmp/
drwxrwxrwx. 9 root root 4096 7月 30 19:48 /tmp/
最后,切换到普通用户niesh
,再次删除/tmp下的文件:
[niesh@niesh root]$ rm -rf /tmp/test-dir/ /tmp/test-file
[niesh@niesh root]$ ll /tmp/
总用量 0
3.4 SUID、SGID、SBIT权限设置
3.4.1 数字法
数字形态更改权限的方式为“三个数字”的组合,那么如果在这三个数字之前再加上一个数字的话,最前面的那个数字就代表SUID、SGID、SBIT的权限。
- SUID 4
- SGID 2
- SBIT 1
此时结果中出现大写的S和T,因为s和t都是替代x这个权限的,但是执行的是“7666”,也就是说,user,group,及others 都没有x这个可执行的标志(因为666),所以,这个S,T代表的就是“空的”。
3.4.2 符号法
SUID为 u+s,SGID为 g+s,SBIT 为 o+t。
3.5 总结
3.5.1 作用范围及功能
- SUID:作用于文件(二进制程序),此用户将继承此程序的所有者权限
- SGID:作用于文件(二进制程序)和目录
- 对于文件:此用户将继承此程序的所属组权限;
- 对于目录:此文件夹下所有用户新建文件都自动继承此目录的用户组。
- SBIT:作用于目录,设定后,目录中的用户只能删除、移动或改名自己的文件或目录
| 二进制文件 | 目录 |
SUID | 此用户将继承此程序的所有者权限 | 无意义 |
SGID | 此用户将继承此程序的所属组权限 | 此目录下所有用户新建文件都自动继承此目录的用户组 |
SBIT | 无意义 | 目录中每个用户仅能删除、移动或改名自己的文件或目录 |
3.5.2 添加权限方法及注意事项:
(1)字母权限法很灵活,无论目录还是文件都可以随意添加删除超级权限
- chmod u+s ... 添加SUID
- chmod g+s ... 添加SGID
- chmod +s ...同时添加SUID和SGID
- chmod -s ...同时删除SUID和SGID
- chmod o+t ...添加Sticky
- chmod +t ...同上
(2)数字权限表示法添加/删除时:
- 数字权限法可以同时删除文件的所有三种超级权限
chmod 0755 FILE
chmod 755 FILE
- 数字权限法只能删除目录的SBIT,不能删除目录的SUID和SGID
- 数字权限法每次只能设置一种超级权限。添加权限时,对于文件,会删除掉原有的其他超级权限;对于目录,添加SUID或SGID时,SBIT会被删除.
(3)所有表示为大写字母的权限均为无效(故障)权限,因为缺少了相应的x权限.
(4)几个权限位映射参考:
SUID: user, 占据属主的执行权限位;
s:属主拥有x权限
S:属主没有x权限
SGID:group, 占据group的执行权限位;
s:group拥有x权限
S:group没有x权限
SBIT:other, 占据ohter的执行权限位;
t:other拥有x权限
T:other没有x权限
4 file
Linux file命令用于辨识文件类型。
通过file指令,我们得以辨识该文件的类型。
4.1 语法
file [-bcLvz][-f <名称文件>][-m <魔法数字文件>...][文件或目录...]
4.2 参数
- -b 列出辨识结果时,不显示文件名称。
- -c 详细显示指令执行过程,便于排错或分析程序执行的情形。
- -f<名称文件> 指定名称文件,其内容有一个或多个文件名称时,让file依序辨识这些文件,格式为每列一个文件名称。
- -L 直接显示符号连接所指向的文件的类别。
- -m<魔法数字文件> 指定魔法数字文件。
- -v 显示版本信息。
- -z 尝试去解读压缩文件的内容。
- [文件或目录...] 要确定类型的文件列表,多个文件之间使用空格分开,可以使用shell通配符匹配多个文件。
不显示文件名称:
显示MIME类别:
显示符号链接的文件类型: