文件权限

1.权限对于文件的解析

  • 读(r): 可以通过文件查看工具读取文件内容

  • 写(w): 可以修改文件的内容

  • 执行(x): 可以把此文件提请内核启动为一个进程

2.权限对于目录的解析

  • 读(r): 读取目录列表的权限,可以通过ls查询此目录下的文件名列表

  • 写(w): 可以目录内删除、更新、新建文件或目录

  • 执行(x): 可以使用ls -l查看此目录中文件元数据(须配合r),可以cd进入此目录

  注意:要开发目录给任何人浏览时,应该至少要给予r和x权限,w不可以随便给

新建文件和目录的默认权限

1.umask的详解

  • 在linux操作系统上,文件系统预设的默认权限是666;而目录系统预设的默认权限是777
  • 普通用户的umask值是002,root用户的umask是022
  • 计算普通用户的默认文件权限:664 默认目录权限:775
  • 计算root用户的默认文件权限:644 默认目录权限:755
  • 计算方法是不是简单的直接相减,而是看权限位“补码”
  • 所有权限二进制的1:代表有这个权限
  • umask二进制1:代表要去掉这个权限,不管你原来有没有权限,你最终一定没有这个权限。
  • umask二进制的0:代表我不关心对应位的权限,你原来有权限就有权限,没有就没有, 我不影响你。
  • 对于目录,直接使用777-umask即可,就得到了最终结果。
  • 对于文件,先使用666-umask。如果对应位上为偶数:最终权限就是这个偶数值。如果上面的对应为上有奇数,就对应位+1。
  • 全局设置: /etc/bashrc 用户设置:~/.bashrc

文件和目录特殊权限

  在复杂多变的生产环境中,单纯设置文件的rwx权限无法满足我们对安全和灵活性的需求,因此便有了SUID、SGID与SBIT的特殊权限位。这是一种对文件权限进行设置的特殊功能,可以与一般权限同时使用,以弥补一般权限不能实现的功能。下面具体解释这3个特殊权限位的功能以及用法。

1.SUID

  有一个现象,有些普通用户是可以通过passwd命令进行修改自己密码的,进而间接就修改了/etc/shadow的文件。仔细查看这个文件就会发现它的默认权限是000,也就是说除了root管理员以外,所有用户都没有查看或编辑该文件的权限。在这里,普通用户其实是运用了SUID权限。
  查看passwd命令属性时发现所有者的权限由rwx变成了rws,其中x改变成s就意味着该文件被赋予了SUID权限。

[root@linuxprobe ~]# ls -l /etc/shadow
----------. 1 root root 1004 Jan 3 06:23 /etc/shadow
[root@linuxprobe ~]# ls -l /bin/passwd
-rwsr-xr-x. 1 root root 27832 Jan 29 2017 /bin/passwd

结论:

  • SUID一般都作用于二进制文件上,SUID设置在目录上无意义。
  • 当一个普通用户在执行设置了SUID的可执行程序时,那么它就继承了原有所属者的权限。
  • 用法:chmod u+s FILE... chmod u-s FILE...
  • 特殊权限位八进制位4

2.SGID

可执行文件上的SGID权限

  SGID的第一种功能是参考SUID而设计的,不同点在于执行程序的用户获取的不再是文件所有者的临时权限,而是获取到文件所属组的权限

目录上的SGID权限

  每个文件都有其归属的所有者和所属组,当创建或传送一个文件后,这个文件就会自动归属于执行这个操作的用户(即该用户是文件的所有者)。如果现在需要在一个部门内设置共享目录,让部门内的所有人员都能够读取目录中的内容,那么就可以创建部门共享目录后,在该目录上设置SGID特殊权限位。这样,部门内的任何人员在里面创建的任何文件都会归属于该目录的所属组,而不再是自己的基本用户组。此时,我们用到的就是SGID的第二个功能,即在某个目录中创建的文件自动继承该目录的用户组(只可以对目录进行设置)。

[root@linuxprobe ~]# cd /tmp
[root@linuxprobe tmp]# mkdir testdir
[root@linuxprobe tmp]# ls -ald testdir/
drwxr-xr-x. 2 root root 6 Feb 11 11:50 testdir/
[root@linuxprobe tmp]# chmod -Rf 777 testdir/
[root@linuxprobe tmp]# chmod -Rf g+s testdir/
[root@linuxprobe tmp]# ls -ald testdir/
drwxrwsrwx. 2 root root 6 Feb 11 11:50 testdir/

  在使用上述命令设置好目录的777权限(确保普通用户可以向其中写入文件),并为该目录设置了SGID特殊权限位后,就可以切换至一个普通用户,然后尝试在该目录中创建文件,并查看新创建的文件是否会继承新创建的文件所在的目录的所属组名称:

[root@linuxprobe tmp]# su - linuxprobe
Last login: Wed Feb 11 11:49:16 CST 2017 on pts/0
[linuxprobe@linuxprobe ~]$ cd /tmp/testdir/
[linuxprobe@linuxprobe testdir]$ echo "linuxprobe.com" > test
[linuxprobe@linuxprobe testdir]$ ls -al test
-rw-rw-r--. 1 linuxprobe root 15 Feb 11 11:50 test

结论:

  • 默认情况下,用户创建文件时,其属组为此用户所属的主组。一旦某目录被设定了SGID,则对此目录有写权限的用户在此目录中创建的文件所属的组为此目录的属组
  • 通常用于创建一个协作目录
  • chmod g+s FILE... chmod g-s FILE...
  • chmod g+s DIR... chmod g-s DIR...
  • 特殊权限位8进制数为2

3.Sticky Bit

  大学里的很多老师都要求学生将作业上传到服务器的特定共享目录中,但总是有几个“破坏分子”喜欢删除其他同学的作业,这时就要设置SBIT(Sticky Bit)特殊权限位了(也可以称之为特殊权限位之粘滞位)。SBIT特殊权限位可确保用户只能删除自己的文件,而不能删除其他用户的文件。换句话说,当对某个目录设置了SBIT粘滞位权限后,那么该目录中的文件就只能被其所有者执行删除操作了。

  当目录被设置SBIT特殊权限位后,文件的其他人权限部分的x执行权限就会被替换成t或者T,原本有x执行权限则会写成t,原本没有x执行权限则会被写成T。

  文件能否被删除并不取决于自身的权限,而是看其所在目录是否有写入权限,如果用户对目录有读写执行权限,那么任何人就可以删除目录中的文件了,哪怕文件本身没有写权限和执权限。原理涉及到inode表相关内容,可以打开传送门了解。

结论:

  • Stricky Bit 只作用于目录
  • 在目录设置Sticky 位,只有文件的所有者或root可以删除该文件
  • 用法:chmod -R o+t DIR ; chmod -R o-t DIR
  • 特殊权限位为1

面试题

问:cp /etc/fstab /data/dir 命令需要文件和目录最少哪些权限

  1. cp 命令需要x权限(/usr/bin/cp)
  2. etc目录需要x权限
  3. fstab文件需要r权限
  4. data目录需要x权限
  5. dir目录选用xw权限(新增目录结构列表,需要写权限)

问:查找linux系统内的suid文件,sgid文件,stricky bit文件


suid文件  find / -type f -perm -4000 -ls
sgid文件  find / -type d  -perm  -2000 -ls
          find / -type f  -perm  -2000 -ls
stricky bit目录 find / -type d  -perm  -1000 -ls