首先来看一下下面的截图,通过ll命令以长格式的形式来当前目录下问价的相关信息,其中红圈部分就是文件对应的权限。不同的权限有对文件执行不同的权利,比如可读、可写或可执行。每个文件的权限分别对应着u、g、o。接下来解释一下这三个英文字母的含义。
(1)ugo解释
在Linux系统中,不同用户创建的文件都会对应有不同的权限,而且不同用户创建的文件或目录都有各自的属主、属组、其他人及相应的权限等。也就是以什么用户登录,那么创建的文件或目录就会成为该文件或目录的属主和属组,如下图所示。
而属主、属组、其他人对应的就是我们的u、g、o,接下来看一下他们对应的关系:
权限的对象 | 说明 |
---|---|
u | 文件(目录)的所属主 |
g | 文件(目录)的所属组 |
o | 其他人 |
(2)案例解释
了解ugo后,那么他们具体的对应位置在哪呢?在继续看一下他们的具体位置:
-rw-r--r--. 1 root root 838 Aug 13 18:48 passwd
- rw- r-- r-- root root passwd
文件类型 属主(u)权限 属组(g)权限 其他人(o)权限 属主 属组 文件名
说明:
权限共有三种类型,分别是读(r)、写(w)、执行(x),每种权限对应有相应的数字表示:
权限类型 | 数字表示 | 针对文件 | 针对目录 |
---|---|---|---|
r(read) | 4 | 可读取文件内容 | 可列出目录内容 |
w(write) | 2 | 可更改文件内容 | 可创建或删除目录中任一文件 |
x(execute) | 1 | 可作为命令执行文件 | 可访问目录中内容 |
对文件或目录赋予权限使用了两个命令,分别是:chown、chmod。
命令 | 功能 |
---|---|
chown | 改变文件或目录的所属主及所属组 |
chmod | 给文件或目录设置访问权限 |
(1)语法:
chown 属主.属组 文件(目录)
chmod 权限对象(ugo) 赋值符 权限类型 文件(目录)
(2)实例1:使用符号表示
chown zrs.it 123.txt --给123这个文件修改属主和属组(前提用户和组得存在)
chmod u+x 123.txt --给123这个文件属主增加执行权限
(3)实例2:使用数字表示
chmod 644 123.txt
chmod 755 123.txt
说明:这三个数字分别表示属主权限、属组权限、其他人权限。
其中644中的6表示由读写权限组成,因为:r(4)+w(2)=6,表示属主有读写权限,另两个数一次类推。
首先我们得知道,目录默认的权限是777,文件默认的权限是666。对于目录来说执行权限是很重要的,比如进入目录是需要具有执行权限见得,而对于文件来说,一般都是用于数据的记录操作,所以不需要执行权。因此在默认情况下,用户创建的目录默认开放所有权限,而如果用户创建的是文件,则默认没有执行权限(x),故其权限默认为666。我们先来看一umask值。
从上图上课看到root用户的umask为022,也就是说,对于当前用户没有拿掉权限,group用户和other用户都被拿走了w权限,所以用户在进行创建目录和文件的时候,默认权限会进行减法操作:
666-022=644 --root用户新建文件时默认权限
777-022=755 --root用户新建目录时默认权限
因此umask此时显得是非常重要,它是用来控制文件和目录的默认权限。**要注意的是:**我们在计算文件或目录的默认值时不是以十进制方式去计算的,而是使用对应的二进制做的减法运算。umask的值是可以被设置的,其配置文件一般在/etc/profile(对于root)或/home/.bash_profile或home/.profile(对于普通用户)。有两种修改配置方法。
(1)通过修改配置文件使umask永久生效
vim /etc/profile
umask 权限补码
umask 044
比较简单,这里不再演示。
suid权限仅对二进制命令文件生效,执行者对该二进制文件有执行权,当对二进制命令文件进行suid提权时,执行者将拥有该二进制命令文件所有者的权限。接下来看个列子。
语法:chmod u+s 可执行二进制命令文件
chmod u+s /usr/bin/cat
执行suid权限后,通过ll命令可观察到该二进制命令文件的所属主权限(u)部分的执行权限(x)变成了s,说明对该二进制命令文件提权成功,从上图可看到,提权后普通用户拥有该命令所有的权限。
在这里还有一个叫做sudo的权限,所起的作用和suid一样,只不过权限赋予方式和执行方式不一样而已。而且该权限较suid来说具有针对性,它可以针对某个或某些用户进行sudo授权,同时也是对普通用户提权的手段之一,接下来看一下相关测试实例。
(1)未对其他用户sudo提权时
在这种情况下,如果切换到xiaojie这个普通用户来执行touch命令,在根下(/)新建文件时是没有权限的。如下图所示:
(2)当通过visudo给xiaojie用户提权时
其操作方法为:直接使用visudo进入文件,并对xiaojie用户添加权限,该权限为:xiaojie用户可以root身份使用touch命令。
语法:用户 ALL=(ALL) NOPASSWD=二进制命令的绝对路径
添加完后保存并退出(:wq),再次切换到xiaojie用户,使用touch命令在根下创建123.txt文件。
sudo touch /123.txt --在根下创建123.txt文件
ls /123.txt --查看是否创建成功
最终看到的效果是执行成功的,说明对xiaojie普通用户提权成功。
sgid权限仅对目录生效,当给目录执行sgid提权时,若执行者在该目录下新建文件或目录(前提是被提权的目录对其他用户要具备w权限),则本地用户或其他用户创建的文件或目录将会继承被sgid提权目录的属组。接下来看一下下面的测试。
(1)添加测试目录并sgid提权
mkdir /home/test --创建测试目录
chown .IT /home/test/ --修改属组
chmod g+s /home/test/ --添加sgid权限
su - xiaojie
mkdir /home/test/hello
该权限目前只对目录生效,而且是针对其他人(other)来设置的,其操作方法和suid、sgid类似,只是功能不同而已。其作用是:当对某一个目录提权时,当其他用户在被提权的目录下新建目录或文件时,仅有自己和root用户才能删除创建的文件,各普通用户之间是没有权利删除的。接下来看一下下面的测试。
(1)创建测试目录
mkdir /home/sticky
chmod o+t /home/sticky/
(2)切换其他用户,并在/home/sticky目录下新建测试文件
结论在图中已经标红。
有一种隐藏权限,添加该权限后连root用户都无法执行相应操作,包括删除、恶意添加内容等。尽管我们上面的sticky权限给目录提权后,可以防止其他用户对我文件的恶意删除,但并能防止别人对我的文件进行编辑、篡改等。显然这样的提权并非安全,因此给大家引出了chattr权限,实际上这是文件的一种属性权限,我们可以通过lsattr命令来查看某个文件的的属性,看某个文件是否添加chattr隐藏权限,该权限属性有三种,分别是a、i和A,接下来看看它们的用法及测试案例。
属性类型 | 说明 |
---|---|
a | 系统只允许在该文件中追加数据,不允许任何覆盖或截断这个文件 |
i | 系统不允许对这个文件做任何的修改 |
A | 告诉系统不要修改这个文件的最后访问时间 |
语法:chattr [+-=] [选项] 文件名
说明:
+ --添加权限
- --解除权限
= --等于某权限
(1)对a权限做测试
mkdir test_a --创建测试文件
chattr +a test_a --添加a权限
rm -rf test_a --删除该文件(肯定是无法删除的)
echo "123" > test_a --覆盖文件内容(肯定是无法覆盖的)
echo "123" >> test_a --向文件追加内容(这步可以实现)
上图测试结果表明,添加a权限后的文件只能对其进行新内容的追加,无法对其做其他修改。
(2)对i权限做测试
mkdir test_i --创建测试文件
chattr +i test_i --添加i权限
rm -rf test_i --删除该文件(肯定是无法删除的)
echo "123" > test_i --覆盖文件内容(肯定是无法覆盖的)
echo "123" >> test_i --向文件追加内容(肯定是无法追加)
通过该例子可看出,无法对具有i权限的文件做任何修改,但可查看文件里的内容。
(3)对A权限做测试
mkdir test_A --创建测试文件
chattr +A test_A --添加A权限
rm -rf test_A --删除该文件(可删除)
echo "123" > test_A --覆盖文件内容(可覆盖)
echo "123" >> test_A --向文件追加内容(可追加)
stat /root/chattr/test --访问但不会改变文件访问时间