关于Linux中文件的权限,依旧没有结束,不过这篇学习笔记应该是关于Linux的文件权限总结的最后一篇,从Linux文件的基本权限,到Linux文件的ACL权限,我们基本上能完成Linux中文件的访问权限的设置,但是除此之外,Linux中的文件,还存在一个隐藏权限,针对默认权限,这里也会总结,同时最后还会总结一下文件的搜寻命令,这篇笔记对应《鸟哥Linux私房菜》中的第六章6.4节的内容。
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。这个就涉及文件的特殊权限。
当s标志出现在文件拥有者的x权限上时,被称为Set UID,也就是SUID的特殊权限。基本上一个SUID权限对应的功能如下
1、只有可执行的二进制程序文件才能设定SUID权限
2、命令执行者要对该文件具有可执行权限(x权限)
3、命令执行者在执行该程序的时候获得该程序文件的属主身份(在执行文件的一瞬间,仿佛该文件属主附体,拥有了该文件的属主权限)
4、SUID权限只有在执行该文件过程中有效,文件执行结束,SUID失效。
上面几条条条框框下来,估计很难理解SUID的内容,在之前的Linux账号与群组管理学习笔记中,预留了一个问题。
为什么普通用户能更改自己的密码,并且顺利将密码数据写入到/etc/passwd文件中,就是因为/user/bin/passwd的可执行文件具有SUID权限,能让用户在执行passwd命令的时候,瞬间具有root权限,执行完这个命令之后,身份失效。
给指定文件设定SUID权限的命令如下:
##以下命令均需要root权限
chmod 4755 文件名
chmod u+s 文件名
和SUID类似,SGID,这里的G代表group ,表示用户在执行该文件的时候,会临时具有该文件所属组群的权限。基本的SGID权限功能对应如下:
1、只有可执行的二进制程序或者目录才能设置SGID权限
2、命令执行者要对该程序拥有X权限
3、命令执行者在执行程序的时候,组身份临时升级为该程序文件的属组
4、SGID和SUID一样,同时只在执行该程序过程中有效,执行完成之后失效。
给文件或文件夹设定SGID权限的命令
chmod 2755 文件名
chmod g+s 文件名
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进程管理,共享文件服务器的构建,都有所帮助。