Linux基础学习笔记(六)——文件的默认和特殊权限

文章目录

  • 前言
  • 文件的默认权限(umask)
  • 文件的特殊权限
    • SUID
    • SGID
    • SBIT
  • 特殊权限的补充说明
  • 文件类型查看命令
  • 小结

前言

关于Linux中文件的权限,依旧没有结束,不过这篇学习笔记应该是关于Linux的文件权限总结的最后一篇,从Linux文件的基本权限,到Linux文件的ACL权限,我们基本上能完成Linux中文件的访问权限的设置,但是除此之外,Linux中的文件,还存在一个隐藏权限,针对默认权限,这里也会总结,同时最后还会总结一下文件的搜寻命令,这篇笔记对应《鸟哥Linux私房菜》中的第六章6.4节的内容。

文件的默认权限(umask)

Linux中,每次我们新建一个文件,这个文件就存在了默认权限,这个默认权限是如何设置的?

Linux系统在为使用者建立文件的时候,预设的权限为-rw-rw-rw-,换算为分值,即为666分。

Linux系统在为使用者建立文件夹的时候,预设的权限为drwxrwxrwx,因为文件夹的x权限,表示能进入到该文件夹,系统默认全部放开,换算为分值即为777。

但是,文件或文件夹被创建的时候,初始化的权限,除了与上述的设定有关之外,还与umask有关。

[root@localhost file-permissions]# touch testfile
[root@localhost file-permissions]# ll -al
total 0
drwxr-xr-x.  2 root root  22 Jun  3 15:25 .
drwxr-xr-x. 17 root root 215 Jun  3 15:24 ..
-rw-r--r--.  1 root root   0 Jun  3 15:25 testfile

新建的文件,都有默认的权限。这个默认权限的设置,与umask有关,umask就是指定目前用户在建立文件或目录时候的权限默认值

[root@localhost file-permissions]# umask
0022
[root@localhost file-permissions]# umask -S
u=rwx,g=rx,o=rx

利用umask命令,查询得到4组数字——0022,第一位数值对应的是特殊权限,这个后面会介绍。后面三位就是针对文件所有者,文件所有组,其他人的umask值。

umask的分数指的是该默认值需要减掉的权限。

因此我们创建文件的时候,在-rw-rw-rw-的基础上扣除umask分值的权限-----w--w-即为-rw-r--r--

在创建文件夹的时候,在drwxrwxrwx的基础上,扣除umask分值的权限d----w--w-即为drwxr-xr-x

如果想要修改默认的文件权限,我们可以修改umask的值。umask 后面加上我们想要设定的设置即可。

[root@localhost file-permissions]# umask 002
[root@localhost file-permissions]# touch test2
[root@localhost file-permissions]# ll
total 0
-rw-rw-r--. 1 root root 0 Jun  3 15:44 test2
-rw-r--r--. 1 root root 0 Jun  3 15:25 testfile

上述命令设定umask之后,新建的test2文件的权限发生了变化。

文件的特殊权限

文件的特殊权限:SUID,SGID,SBIT

系统中,我们看一下如下文件的权限

[root@localhost /]# ls -l /usr/bin/passwd 
-rwsr-xr-x. 1 root root 27856 Apr  1  2020 /usr/bin/passwd
[root@localhost /]# ls -ld /tmp
drwxrwxrwt. 15 root root 4096 Jun  3 15:52 /tmp

可以看到passwd文件的所有者权限为rws,不是rwx,/tmp文件夹的其他人权限为rwt而不是rwx。这个就涉及文件的特殊权限。

SUID

当s标志出现在文件拥有者的x权限上时,被称为Set UID,也就是SUID的特殊权限。基本上一个SUID权限对应的功能如下

1、只有可执行的二进制程序文件才能设定SUID权限

2、命令执行者要对该文件具有可执行权限(x权限)

3、命令执行者在执行该程序的时候获得该程序文件的属主身份(在执行文件的一瞬间,仿佛该文件属主附体,拥有了该文件的属主权限)

4、SUID权限只有在执行该文件过程中有效,文件执行结束,SUID失效。

上面几条条条框框下来,估计很难理解SUID的内容,在之前的Linux账号与群组管理学习笔记中,预留了一个问题。

在这里插入图片描述

在上述问题的场景下,SUID权限就是这个问题的解。
Linux基础学习笔记(六)——文件的默认和特殊权限_第1张图片

为什么普通用户能更改自己的密码,并且顺利将密码数据写入到/etc/passwd文件中,就是因为/user/bin/passwd的可执行文件具有SUID权限,能让用户在执行passwd命令的时候,瞬间具有root权限,执行完这个命令之后,身份失效。

给指定文件设定SUID权限的命令如下:

##以下命令均需要root权限
chmod 4755 文件名
chmod u+s 文件名

SGID

和SUID类似,SGID,这里的G代表group ,表示用户在执行该文件的时候,会临时具有该文件所属组群的权限。基本的SGID权限功能对应如下:

1、只有可执行的二进制程序或者目录才能设置SGID权限

2、命令执行者要对该程序拥有X权限

3、命令执行者在执行程序的时候,组身份临时升级为该程序文件的属组

4、SGID和SUID一样,同时只在执行该程序过程中有效,执行完成之后失效。

给文件或文件夹设定SGID权限的命令

chmod 2755 文件名
chmod g+s 文件名

SBIT

SBIT也是一种特殊权限,但是这种特殊权限只针对目录有效。该权限对应的功能如下

1、当用户对于此目录具有w,x权限的时候,(对文件夹具有写入权限的时候)

2、在1情况下,如果没有SBIT权限,则任何一个普通用户都可以删除这个文件夹中的任意文件(可能是别人创建的文件,也具有删除权限)如果这个目录被设置了SBIT权限,则普通用户就算拥有W权限,也只能删除自己创建的文件,不能删除其他用户建立的文件。

一段文字描述,可能有点晕,这里补充一个实例

##以root用户身份进入到用户thomas的home目录,然后创建一个test-for-sbit的文件夹
[root@localhost /]# cd /home/thomas/
[root@localhost thomas]# ls
[root@localhost thomas]# mkdir test-for-sbit
##默认情况下others对test-for-sbit的权限是rx
[root@localhost thomas]# ll
total 0
drwxrwxr-x. 2 root root 6 Jun  3 18:11 test-for-sbit
##为了测试SBIT权限,这里赋予test-for-sbit文件夹最大权限。
[root@localhost thomas]# chmod 777 test-for-sbit/
[root@localhost thomas]# ll
total 0
drwxrwxrwx. 2 root root 6 Jun  3 18:11 test-for-sbit
## root用户进入到test-for-sbit目录,创建一个root-user-file文件
[root@localhost thomas]# cd test-for-sbit/
[root@localhost test-for-sbit]# touch root-user-file
##others用户没有写root-user-file的权限
[root@localhost test-for-sbit]# ll
total 0
-rw-rw-r--. 1 root root 0 Jun  3 18:13 root-user-file

重点来了,我们切换到thomas用户,进入到home目录

##切换到thomas用户
[root@localhost ~]# su thomas
[thomas@localhost root]$ cd
[thomas@localhost ~]$ pwd
/home/thomas
[thomas@localhost ~]$ ls
test-for-sbit
##进入到test-for-sbit文件夹
[thomas@localhost ~]$ cd test-for-sbit/
##可以看到root用户创建的root-user-file文件,
[thomas@localhost test-for-sbit]$ ll
total 0
-rw-rw-r--. 1 root root 0 Jun  3 18:13 root-user-file
##这个时候thomas用户虽然不能编辑root-user-file文件。但是,可以直接删除root用户创建的文件
[thomas@localhost test-for-sbit]$ rm -f root-user-file
[thomas@localhost test-for-sbit]$ ll
total 0
##切换到root之后,发现自己的文件没有了
[root@localhost test-for-sbit]# ll
total 0

以上,就是一个文件夹被赋予了777权限之后,但是没有SBIT权限带来的问题。我们可以给指定文件夹赋予SBIT权限,来避免这个问题

给文件夹赋予SBIT权限的命令

chmod 1755 目录名
chmod o+t 目录名

回到上述实例

[root@localhost thomas]# ll
total 0
drwxrwxrwx. 2 root root 6 Jun  3 18:14 test-for-sbit
##给test-for-sbit文件夹赋予SBIT权限
[root@localhost thomas]# chmod o+t test-for-sbit/
##ll查看到最后一位变成t
[root@localhost thomas]# ll
total 0
drwxrwxrwt. 2 root root 28 Jun  3 18:21 test-for-sbit
##进入test-for-sbit文件夹
[root@localhost thomas]# cd test-for-sbit/
[root@localhost test-for-sbit]# ls
##创建一个root-test-file文件
[root@localhost test-for-sbit]# touch root-test-file
[root@localhost test-for-sbit]# ll
total 0
-rw-rw-r--. 1 root root 0 Jun  3 18:21 root-test-file
## 切换到thomas用户。
[thomas@localhost test-for-sbit]$ ll
total 0
-rw-rw-r--. 1 root root 0 Jun  3 18:21 root-test-file
## thomas用户自己创建一个文件
[thomas@localhost test-for-sbit]$ touch thomas-test-file
[thomas@localhost test-for-sbit]$ ll
total 0
-rw-rw-r--. 1 root   root   0 Jun  3 18:21 root-test-file
-rw-rw-r--. 1 thomas thomas 0 Jun  3 18:22 thomas-test-file
## thomas想删除root用户的文件,这个时候报权限被拒
[thomas@localhost test-for-sbit]$ rm -f root-test-file 
rm: cannot remove ‘root-test-file’: Operation not permitted
## thomas用户只能删除自己创建的文件
[thomas@localhost test-for-sbit]$ rm -f thomas-test-file 
[thomas@localhost test-for-sbit]$ ll
total 0
-rw-rw-r--. 1 root root 0 Jun  3 18:21 root-test-file

回到开头,我们说了一个/tmp文件夹,这个文件夹是具有SBIT权限的,因为任何用户的临时文件都可以存放在这个文件夹下。但是不能让用户删除不属于自己的文件,因此系统给该文件夹设置了SBIT权限。

特殊权限的补充说明

关于上述设置特殊权限命令中,用到数值设置权限的部分,SUID,SGID,SBIT权限都有各自对应的数值

4 SUID
2 SGID
1 SBIT

如果某些没必要的文件被赋予了SUID等特殊权限,这是十分危险的,用户在修改自己的系统密码的时候,这个时候要写入具有root权限的文件,SUID权限这个时候是必要的。但是如果针对某些非必要的文件,存在SUID权限,则会十分危险,毕竟不该被赋予root权限的用户,有了临时的root权限。因此定时清理没有必要的SUID权限的文件,是十分必要的。

如下脚本实例,可以梳理系统中被设置了SUID的文件。

#!/bin/bash
find / -perm -4000 -o -perm -2000> /tmp/setuid.check
for i in $(cat /tmp/setuid.check)
        do
        grep $i /home/suid.log> /dev/null
                if [ "$?" != "0" ]
                then
                echo "$i isn't in listfile!">>/home/suid_log_$(date +%F)
                fi
        done
rm -rf /tmp/setuid.check

文件类型查看命令

file命令,可以直接查看文件类型

[root@localhost test-for-sbit]# file root-test-file 
root-test-file: ASCII text
[root@localhost test-for-sbit]# file /var/lib/mlocate/mlocate.db 
/var/lib/mlocate/mlocate.db: data
##执行文件的文件类型数据。包含了SUID的权限
[root@localhost test-for-sbit]# file /usr/bin/passwd
/usr/bin/passwd: setuid ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=dee1b9ab6618c6bfb84a14f85ba258c742cf4aec, stripped

小结

梳理了一下文件的特殊权限,文件的特殊权限对后面学习Linux进程管理,共享文件服务器的构建,都有所帮助。

你可能感兴趣的:(Linux,linux,学习,服务器)