概述
我们已经学习过 r(读)、w(写)、 x(执行)这三种普通权限,但是我们在査询系统文件权限时会发现出现了一些其他权限字母和我们之前学过的不一样了。
比如我们/usr/bin/目录下的passwd文件
[root@localhost ~]# ll /usr/bin/passwd
-rwsr-xr-x. 1 root root 27832 Jun 10 2014 /usr/bin/passwd
我们可以看到属主权限rw后面是个 s ,而不是我们之前学习到的 x 了。
这种权限是 SetUID 权限,也叫作 SUID 的特殊权限。
SUID
SUID的作用
- 让普通用户对可执行的二进制文件,临时拥有二进制文件的所属主权限。
- 如果设置的二进制文件没有执行权限,那么suid的权限显示就是大S。
- 特殊权限suid仅对二进制可执行程序有效,其他文件或目录则无效。
案例演示:
普通用户执行passwd命令时,由于passwd命令拥有suid特殊权限(在命令属主权限位有一个s),那在整个命令执行过程中会以命令的属主身份去运行命令。
示例:
#普通用户oldQ使用passwd命令
[oldQ@localhost ~]$ passwd
Changing password for user oldQ.
Changing password for oldQ.
(current) UNIX password:
#查看进程运行时的身份
[root@localhost ~]# ps aux | grep passwd
root 7520 0.0 0.1 170712 2036 pts/1 S+ 15:10 0:00 passwd
root 7525 0.0 0.0 112708 976 pts/0 S+ 15:11 0:00 grep --color=auto passwd
/etc/shadow这个文本本身时谁都无法修改的,但是超级用户root除外。我们用普通用户执行passwd时通过特殊权限借助root身份运行的命令。最终是由root去更新了/etc/shadow文件,完成密码的修改。
权限设定方法:
-
字母表示法:
chmod u+s 文件 #给文件添加suidchmod u-s 文件 #给文件取消suid
-
数字表示法:
在普通三位数字权限位之前,用4代表添加的SUID位chmod 4755 文件 #添加SUID权限到二进制程序文件(添加到DIR无意义)
chmod 0xxx 文件 #删除文件的SUID(无法删除目录的SUID)
我们可以看一下普通用户执行有suid权限的命令以及没有suid权限命令的两种结果,如图:
passwd 是系统命令,可以执行,所以可以赋予 SetUID 权限。
普通用户对 passwd 命令拥有 x(执行)权限。普通用户在执行 passwd 命令的过程中,会暂时切换为 root 身份,所以可以修改 /etc/shadow 文件。命令结束,lamp 用户切换回自己的身份。
cat命令没有 SetUID权限,所以使用 lamp 用户身份去访问 /etc/shadow 文件,没有相应权限,所以被拒绝访问。
suid 借助 ” 属主 “ 身份运行该命令程序
SGID
将目录设置为sgid后,如果在该目录下创建文件,都将与该目录的所属组保持一致
表现形式: 在文件的 属组权限上有显示一个s(执行权限) S(没有执行权限)
示例:
#建立测试目录
[root@localhost ~]# cd /tmp/ && mkdir dtest
#赋予测试目录sgid权限,检查是否生效(属组权限位是否有s)
[root@localhost tmp]# chmod g+s dtest/ && ll -d dtest/
drwxr-sr-x. 2 root root 6 Mar 17 15:59 dtest/
#给测试目录加上777权限,让普通用户可以写
[root@localhost tmp]# chmod 777 dtest/
#切换至普通用户测试文件,检查文件信息
[root@localhost tmp]# su oldQ
[oldQ@localhost tmp]$ cd /tmp/dtest
[oldQ@localhost dtest]$ touch lamp_test
[oldQ@localhost dtest]$ ll
total 0
-rw-r--r--. 1 oldQ root 0 Mar 17 16:00 lamp_test
权限设定方法:
-
字母表示法:
chmod g+s 文件或目录 #给文件添加sgidchmod g-s 文件或目录 #给文件取消sgid
-
数字表示法:
chmod 2755 文件或目录 #添加sgidchmod 0xxx 文件或目录 #取消sgid
SGID作用
- 针对用户组权限位修改,用户创建的目录或文件所属组和该目录的所属组一致。
- 当某个目录设置了sgid后,在该目录中新建的文件不在是创建该文件的默认所属组
- 使用sgid可以使得多个用户之间共享一个目录的所有文件变得简单。
sgid 借助 “ 属组 ” 身份运行该命令程序
SBIT
Sticky(SI TI KI)粘滞位
目前只对目录有效,作用:
普通用户对该目录拥有 w 和 x 权限,即普通用户可以在此目录中拥有写入权限。如果没有粘滞位,那么普通用户拥有 w 权限,就可以删除此目录下的所有文件,包括其他用户建立的文件。但是一旦被赋予了粘滞位,除了 root 可以删除所有文件,普通用户就算拥有 w 权限,也只能删除自己建立的文件,而不能删除其他用户建立的文件。
权限设定方法
1000 权限字符t(T),其他用户位的x位上设置。
例:
-
字母表示法:
chmod o+t 目录 #添加沾滞位
chmod o-t 目录 #取消沾滞位 -
数字表示法:
chmod 1xxx 目录 #添加沾滞位
chmod 0xxx 目录 #取消沾滞位
SBIT作用
- 让多个用户都具有写权限的目录,并让每个用户只能删自己的文件。
- 特殊sticky目录表现在others的x位,用小t表示,如果没有执行权限是T
- 一个目录即使它的权限为"777"如果是设置了粘滞位,除了目录的属主和"root"用户有权限删除,除此之外其他用户都不允许删除该目录。
权限属性chattr
chattr命令用来改变文件属性。这项指令可改变存放在ext2文件系统上的文件或目录属性,这些属性共有以下8种模式
a:让文件或目录仅供附加用途;
b:不更新文件或目录的最后存取时间;
c:将文件或目录压缩后存放;
d:将文件或目录排除在倾倒操作之外;
i:不得任意更动文件或目录;
s:保密性删除文件或目录;
S:即时更新文件或目录;
u:预防意外删除。
语法格式:
chattr 选项
可用选项:
-R:递归处理,将指令目录下的所有文件及子目录一并处理;
-v<版本编号>:设置文件或目录版本;
-V:显示指令执行过程;
+<属性>:开启文件或目录的该项属性;
-<属性>:关闭文件或目录的该项属性;
=<属性>:指定文件或目录的该项属性。
示例:
#创建文件并设置属性
[root@localhost dtest]# touch file_a file_i
[root@localhost dtest]# lsattr file_a file_i
---------------- file_a
---------------- file_i
#使用chattr设置属性,lsattr查看权限限制
[root@localhost dtest]# chattr +a file_a
[root@localhost dtest]# chattr +i file_i
[root@localhost dtest]# lsattr file_a file_i
-----a---------- file_a
----i----------- file_i
#a权限,无法写入删除,但是可以追加数据,一般作用于日志类文件
[root@localhost dtest]# echo "abc" > file_a
bash: file_a: Operation not permitted
[root@localhost dtest]# rm -rf file_a
rm: cannot remove ‘file_a’: Operation not permitted
[root@localhost dtest]# echo "123" >> file_a
[root@localhost dtest]# cat file_a
123
#i权限,无法写入,无法删除,也不可追加数据
[root@localhost dtest]# echo "i" > file_i
bash: file_i: Permission denied
[root@localhost dtest]# echo "iii" >> file_i
bash: file_i: Permission denied
[root@localhost dtest]# rm -rf file_i
rm: cannot remove ‘file_i’: Operation not permitted
#解除方法
[root@localhost dtest]# chattr -a file_a
[root@localhost dtest]# chattr -i file_i
进程掩码umask
umask命令用来设置限制新建文件权限的掩码。当新文件被创建时,其最初的权限由文件创建掩码决定。用户每次注册进入系统时,umask命令都被执行, 并自动设置掩码mode来限制新文件的权限。用户可以通过再次执行umask命令来改变默认值,新的权限将会把旧的覆盖掉。
语法格式:
umask 选项 参数
可用选项:
-p:输出的权限掩码可直接作为指令来执行;
-S:以符号方式输出权限掩码。
参数:权限掩码:指定权限掩码。
问题
1.为什么系统中默认创建的文件权限是 644 目录是 755
2.为什么默认创建一个普通用户,他的家目录权限是 700
原因:
其实默认系统本身规定的权限, 目录 777 文件 666 那么为什么创建出来的文件和目录都不是777 也不是 666呢?
由于UMASK控制了, 比如UMASK默认设置为 0022,UMASK表示要减掉的权限
那么最终创建出来的文件和目录分别就是
目录: 777 - 022 = 755
文件: 666 - 022 = 644
系统默认umask为022,那么当我们创建一个目录时,正常情况下目录的权限应该是777,但umask表示要减去的值,所以新目录文件的权限应该是777 - 022 =755。至于文件的权限也依次类推666 - 022 =644。
umask涉及的配置文件
umask涉及到的相关文件/etc/bashrc /etc/profile ~/.bashrc ~/.bash_profile
shell (vim,touch) --umask--> 会影响创建的新文件或目录权限
vsftpd服务如果修改--umask--> 会影响ftp服务中新创建文件或创建目录权限
useradd如果修改umask--> 会影响用户HOME家目录权限
修改umask配置示例:
#设置umask所有位为偶数
[root@localhost ~]# umask 044
#目录权限为733
[root@localhost ~]# mkdir d044
[root@localhost ~]# ll -d ./d044
drwx-wx-wx. 2 root root 6 Mar 17 18:08 d044
#文件权限为622
[root@localhost ~]# touch f044
[root@localhost ~]# ll ./f044
-rw--w--w-. 1 root root 0 Mar 17 18:10 ./f044
#设置umask部分为为奇数时
[root@localhost ~]# umask 023
#目录权限为754
[root@localhost ~]# mkdir d023
[root@localhost ~]# ll -d ./d023
drwxr-xr--. 2 root root 6 Mar 17 18:14 ./d012
#文件权限为644
[root@localhost ~]# touch f023
[root@localhost ~]# ll ./f023
-rw-r--r--. 1 root root 0 Mar 17 18:15 ./f012
#设置umask所有位为奇数时
[root@localhost ~]# umask 035
#目录权限为742
[root@localhost ~]# mkdir d035
[root@localhost ~]# ll -d ./d035
drwxr---w-. 2 root root 6 Mar 17 18:19 ./d035
#文件权限为342
[root@localhost ~]# touch f035
[root@localhost ~]# ll ./f035
-rw-r---w-. 1 root root 0 Mar 17 18:20 ./f035