1.Linux的文件类型
在 Linux 系统中,每个文件都有所属的所有者和所有组,并且规定了文件的所有者、所有组以及其他人对文件所拥有的可读(r)、可写(w)、可执行(x)等权限。
对于普通文件:“可读”表示能够读取文件的实际内容;“可写”表示能够编辑、新增、修改、删除文件的实际内容;“可执行”则表示能够运行一个脚本程序。
对于目录文件:“可读”表示能够读取目录内的文件列表;“可写”表示能够在目录内新增、删除、重命名文件;而“可执行”则表示能够进入该目录。
文件的读、写、执行权限可以简写为rwx,亦可分别用数字4、2、1 来表示。文件所有者,所属组及其他用户权限之间无关联
如,若某个文件的权限为7 则代表可读、可写、可执行(4+2+1);若权限为6 则代表可读、可写(4+2)
包含了文件的类型、访问权限、所有者(属主)、所属组(属组)、占用的磁盘大小、修改时间和文件名称等信息。
2.文件的特殊权限
1)SUID
SUID 是一种对二进制程序进行设置的特殊权限,可以让二进制程序的执行者临时拥有属主的权限(仅对拥有执行权限的二进制程序有效)。
例如,所有用户都可以执行passwd 命令来修改自己的用户密码,而用户密码保存在/etc/shadow 文件中。仔细查看这个文件就会发现它的默认权限是000,也就是说除了root 管理员以外,所有用户都没有查看或编辑该文件的权限。但是,在使用passwd 命令时如果加上SUID 特殊权限位,就可让普通用户临时获得程序所有者的身份,把变更的密码信息写入到shadow 文件中。
查看 passwd 命令属性时发现所有者的权限由rwx 变成了rws,其中x 改变成s 就意味着该文件被赋予了SUID 权限。如果原先权限位上没有x 执行权限,那么被赋予特殊权限后将变成大写的S。
2)SGID
SGID 主要实现如下两种功能:
1)让执行者临时拥有属组的权限(对拥有执行权限的二进制程序进行设置);
2)在某个目录中创建的文件自动继承该目录的用户组(只可以对目录进行设置)。
举例:
1)在早期的Linux 系统中,/dev/kmem 是一个字符设备文件,用于存储内核程序要访问的数据,权限为:
cr--r----- 1 root system 2, 1 Feb 11 2017 kmem
除了root 管理员或属于system 组成员外,所有用户都没有读取该文件的权限。由于在平时我们需要查看系统的进程状态,为了能够获取到进程的状态信息,可在用于查看系统进程状态的ps 命令文件上增加SGID 特殊权限位。
查看ps 命令文件的属性信息:
-r-xr-sr-x 1 bin system 59346 Feb 11 2017 ps
由于ps 命令被增加了SGID 特殊权限位,所以当用户执行该命令时,也就临时获取到了system 用户组的权限,从而可以顺利地读取设备文件了。
2)每个文件都有其归属的所有者和所属组,当创建或传送一个文件后,这个文件就会自动归属于执行这个操作的用户(即该用户是文件的所有者)。如果现在需要在一个部门内设置共享目录,让部门内的所有人员都能够读取目录中的内容,那么就可以创建部门共享目录后,在该目录上设置SGID 特殊权限位。这样,部门内的任何人员在里面创建的任何文件都会归属于该目录的所属组,而不再是自己的基本用户组。此时,我们用到的就是SGID的第二个功能,即在某个目录中创建的文件自动继承该目录的用户组(只可以对目录进行设置)。
[root@Centos /]# cd tmp/ [root@Centos tmp]# mkdir testdir [root@Centos tmp]# ls -ald testdir/ drwxr-xr-x. 2 root root 6 Aug 13 18:01 testdir/ [root@Centos tmp]# chmod -Rf 777 testdir/ [root@Centos tmp]# chmod -Rf g+s testdir/ [root@Centos tmp]# ls -ald testdir/ drwxrwsrwx. 2 root root 6 Aug 13 18:01 testdir/
在使用上述命令设置好目录的777 权限(确保普通用户可以向其中写入文件),并为该目录设置了SGID 特殊权限位后,就可以切换至一个普通用户,然后尝试在该目录中创建文件,并查看新创建的文件是否会继承新创建的文件所在的目录的所属组名称:
[root@Centos tmp]# su - centos Last login: Thu Aug 13 17:58:46 CST 2020 on pts/2 [centos@Centos ~]$ cd /tmp/testdir/ [centos@Centos testdir]$ echo "centos" > test [centos@Centos testdir]$ ls -al test -rw-rw-r--. 1 centos root 7 Aug 13 18:06 test
3)SBIT 特殊权限位可确保用户只能删除自己的文件,而不能删除其他用户的文件。换句话说,当对某个目录设置了SBIT 粘滞位权限后,那么该目录中的文件就只能被其所有者执行删除操作了。
Centos 7 系统中的/tmp 作为一个共享文件的目录,默认已经设置了SBIT 特殊权限位。
当目录被设置SBIT 特殊权限位后,文件的其他人权限部分的x 执行权限就会被替换成t 或者T,原本有x 执行权限则会写成t,原本没有x 执行权限则会被写成T。
[root@Centos tmp]# su - centos Last login: Thu Aug 13 18:29:15 CST 2020 on pts/2 [centos@Centos ~]$ ls -ald /tmp drwxrwxrwt. 28 root root 4096 Aug 13 18:29 /tmp [centos@Centos ~]$ cd /tmp [centos@Centos tmp]$ ls -ald drwxrwxrwt. 28 root root 4096 Aug 13 18:29 . [centos@Centos tmp]$ echo "Hello world" > test [centos@Centos tmp]$ chmod 777 test [centos@Centos tmp]$ ll test -rwxrwxrwx. 1 centos centos 12 Aug 13 18:30 test
其实,文件能否被删除并不取决于自身的权限,而是看其所在目录是否有写入权限。
假如切换到另外一个普通用户,然后尝试删除这个其他人创建的文件就会发现,即便读、写、执行权限全开,但是由于SBIT 特殊权限位的缘故,依然无法删除该文件:
[root@Centos home]# su - xinghen1216 [xinghen1216@Centos ~]$ cd /tmp [xinghen1216@Centos tmp]$ rm -rf test rm: cannot remove ‘test’: Operation not permitted
对其他目录来设置SBIT 特殊权限位,用chmod 命令就可以了。对应的参数o+t 代表设置SBIT 粘滞位权限:
[root@Centos ~]# mkdir centos [root@Centos ~]# chmod -R o+t centos/ [root@Centos ~]# ls -ld centos drwxr-xr-t. 2 root root 6 Aug 13 18:50 centos
3.chmod :设置文件或目录的权限,格式为“chmod [参数] 权限文件或目录名称”
举例
[root@Centos ~]# touch test01.txt
[root@Centos ~]# ll test01.txt
-rw-r--r--. 1 root root 0 Aug 13 18:19 test01.txt
[root@Centos ~]# chmod 760 test01.txt
[root@Centos ~]# ll test01.txt
-rwxrw----. 1 root root 0 Aug 13 18:19 test01.txt
chown:设置文件或目录的所有者和所属组,格式为“chown [参数] 所有者:所属组文件或目录名称
[root@Centos ~]# ll test01.txt
-rwxrw----. 1 root root 0 Aug 13 18:19 test01.txt
[root@Centos ~]# chown root:bin test01.txt
[root@Centos ~]# ll test01.txt
-rwxrw----. 1 root bin 0 Aug 13 18:19 test01.txt
chmod 和chown 命令是用于修改文件属性和权限的最常用命令,它们还有一个特别的共性,就是针对目录进行操作时需要加上大写参数-R 来表示递归操作,即对目录内所有的文件进行整体操作。
4.文件的隐藏属性
Linux系统中的文件除了具备一般权限和特殊权限之外,还有一种隐藏权限,即被隐藏起来的权限,默认情况下不能直接被用户发觉。我们经常遇到的明明权限充足但却无法删除某个文件的情况,或者仅能在日志文件中追加内容而不能修改或删除内容,这在一定程度上阻止了黑客篡改系统日志的图谋,因此这种“奇怪”的文件也保障了Linux 系统的安全性。
1)chattr:设置文件的隐藏权限,格式为“chattr [参数] 文件”。
如果想要把某个隐藏功能添加到文件上,则需要在命令后面追加“+参数”,如果想要把某个隐藏功能移出文件,则需要追加“-参数”。
举例:
[root@Centos test]# echo "hello, world" > user.txt [root@Centos test]# vim user.txt [root@Centos test]# chattr +a user.txt [root@Centos test]# rm -rf user.txt rm: cannot remove ‘user.txt’: Operation not permitted
2)lsattr :显示文件的隐藏权限,格式为“lsattr [参数] 文件”。
用于显示使用ls或ll命令查看不到的隐藏权限。
[root@Centos test]# ll user.txt -rw-r--r--. 1 root root 13 Aug 14 14:54 user.txt [root@Centos test]# rm -rf user.txt rm: cannot remove ‘user.txt’: Operation not permitted [root@Centos test]# lsattr user.txt -----a---------- user.txt [root@Centos test]# chattr -a user.txt [root@Centos test]# ll user.txt -rw-r--r--. 1 root root 13 Aug 14 14:54 user.txt [root@Centos test]# lsattr user.txt ---------------- user.txt [root@Centos test]# rm -rf user.txt