文件的权限(9位+3位)

1. 文件权限概述

Linux中的文件或目录的权限用户及用户组关联很大。

 

Linux中每个文件或目录都有一组(共9个)基础权限位,没三个字符被分为一组,它们分别是属主权限位,用户组权限位,其他用户权限位

比如:rwxr-xr-x,在Linux中正是这9个权限来控制文件属主、用户组以及其他用户的权限。

2. 权限位说明

Linux 文件或目录的权限位是由 9 个权限位来控制,每三位为一组,它们分别是文件属主(Owner)的读、写、执行,用户组(Group)的读、写、执行以及(Other)其他用户的读、写、执行:

  • r read 可读权限 对应数字4
  • w write 可写权限 对应数字2
  • x excute 执行权限 对应数字1
  • - 没有任何权限 对应数字0
 

特殊权限位:s S s S t T

3. 一般文件演示

用户测试准备:

创建组:groupadd incahome

创建用户oldboy并且添加到incahome组:

[root@oldboy test]# groupadd incahome

[root@oldboy test]# useradd oldboy -g incahome
useradd: user 'oldboy' already exists
[root@oldboy test]# id oldboy
uid=500(oldboy) gid=500(oldboy) groups=500(oldboy)

如果用户已经存在,则直接使用usermod更改用户的组即可:

[root@oldboy test]# usermod -g incahome oldboy
[root@oldboy test]# id oldboy
uid=500(oldboy) gid=503(incahome) groups=503(incahome)

创建用户oldgirl,并添加到incahome

[root@oldboy test]# useradd oldgirl -g incahome
[root@oldboy test]# id oldgirl
uid=503(oldgirl) gid=503(incahome) groups=503(incahome)

创建用户test:

[root@oldboy test]# useradd test
[root@oldboy test]# id test
uid=504(test) gid=504(test) groups=504(test)

文件准备:

[root@oldboy oldboy]# mkdir /oldboy 
[root@oldboy oldboy]# echo "echo oldboylinux">/oldboy/test.sh
[root@oldboy oldboy]# chmod +x /oldboy/test.sh
[root@oldboy oldboy]# cat /oldboy/test.sh
echo oldboylinux

 

范例:实操体会文件权限 

打开四个窗口,分别用root, oldboy, oldgirl, test 用户登录。
分别测试 oldboy, oldgirl, test 用户对/oldboy/test.sh文件的权限。

[root@oldboy oldboy]# ls -l /oldboy/test.sh
-rwxr-xr-x 1 root root 17 Sep 10 10:57 /oldboy/test.sh

结论1:
oldboy,oldgirl,test三个用户拥有同样的其他用户的权限,即读和执行,没有写的权限。(r-x)

更改属组和属组,改成文件属于oldboy,属组是incahome:

[root@oldboy ~]# chown oldboy.incahome /oldboy/test.sh
[root@oldboy ~]# ls -l /oldboy/test.sh
-rwxr-xr-x 1 oldboy incahome 17 Sep 10 11:23 /oldboy/test.sh

查看文件属性,发现/oldboy/test.sh的属主是oldboy,属组是incahome。 

用户oldboy拥有rwx权限;属组incahome,即oldgirl拥有r-x权限;其他用户拥有r-x权限。

更改属组的权限,添加w写权限,删除其他组用户的执行权限

[root@oldboy ~]# chmod g+w,o-x /oldboy/test.sh
[root@oldboy ~]# ls -l /oldboy/test.sh
-rwxrwxr-- 1 oldboy incahome 35 Sep 10 11:32 /oldboy/test.sh

总结测试结论:Linux普通文件的读、写、执行权限说明:

  1. 可读 r: 表示具有读取、阅读文件内容的权限
  2. 可写 w:表示具有新增、修改文件内容的权限
    • 如果没有r,只有读和执行(-wx),那么vi会提示无法编辑(可强制编辑),echo可以重定向或追加。
    • 特别提示:删除文件(修改文件名等)的权限是受父目录的权限控制,和文件本身权限无关。哪怕文件没有写的权限,用户对父目录有写w的权限,就能够删除文件。
  3. 可执行 x:表示具有执行文件的权限
    • 文件本身要能够执行
    • 普通用户同时还需要具备 r 的权限才能
    • root 只要有 x 的权限就能执行
      • win32下可执行的文件:.exe, .bat, .com
      • linux下可执行文件:.sh, .py, .perl等
 

有关文件删除的说明: 

Linux中的文件名是存在于父目录的block里面,并指向这个文件的inode节点,这个文件的inode节点再标记指向存放这个文件的block的数据块。 

我们删除一个文件,实际上并不清除inode节点和block的数据块。
只是在这个文件的父目录里面的block中,删除这个文件的名字和这个文件inode的对应关系,使这个文件消失,并且无法指向这个文件的inode节点,当没有文件名指向这个inode节点的时候,系统会同时释放inode节点和存放这个文件的数据块,并更新inode MAP和block MAP,让这些位置可以用于防止其他新的文件数据。

因此,修改和删除文件名都是在操作文件的上级目录的block,修改或删除的是文件名和inode的关联数据。

因此,和上级目录权限关联。


企业面试题:请从linux文件系统的角度详细描述读取/tmp/oldboyfile文件的过程

 

答案:
从/根目录的inode,获取存储数据的block,找到存储的对应的/tmp/的目录名,以及指向tmp目录存储block的inode,顺着inode找到对应的/tmp/目录的block,继续找到其中/tmp/oldboyfile的文件名与对应的inode的数值,顺着inode找到oldboyfile的block,加载读取数据。


4. 目录权限演示

范例:实操体会目录权限

 

开启两个窗口通过两个用户演示上面的权限(rwx)。

一个是root,一个是oldboy用户,一个是oldgirl用户,一个是test用户。 

 

测试数据准备:

[root@oldboy /]# mkdir /oldboy/test -p
[root@oldboy /]# ls -ld /oldboy/test
drwxr-xr-x 2 root root 4096 Sep 10 12:25 /oldboy/test

4.1 分别测试目录的rwx 

特别是文件的删除!

 

总结测试结论:Linux 目录的读、写、执行权限说明

  1. 可读r:表示具有浏览目录下面文件及子目录的权限,即ls dir
    • 如果没有 x 权限,不能进入到目录里,即无法 cd dir
    • 如果没有 x 权限,ls 列表时可以看到所有文件名,但是会提示无权访问目录下的文件
    • 如果ls -l 列表,所有的属性会带有问号,也会提示无权访问目录下文件。
  2. 可写w:表示具有增加、删除或修改目录内文件名(一般指文件名)的权限(需要 x 权限配合)
  3. 执行x:具有进入目录的权限,例如:cd dir
    • 但是没有 r 无法列表文件及目录,没有w 无法新建和删除

Linux文件与目录权限对比说明:

  • r(Read,读取权限):
    • 对文件而言,表示具有读取阅读文件内容的权限
    • 对目录而言,表示具有浏览目录下面文件及子目录的权限,即ls dir
  • w(Write,写入权限):
    • 对文件而言,表示具有新增、修改文件内容的权限(注意:删除和移动文件和文件本身属性无关);
    • 对目录而言,表示具有删除、一定目录内的权限
  • x(excute,执行权限):
    • 对文件而言,表示具有执行文件的权限;
    • 对目录而言,表示具有进入目录的权限,即cd dir
  • - (无任何权限): 若对应位置权限为字符”-”,表示对应用户没有读、写、执行的任何权限。

特别注意:
当删除或移动一个文件或目录,仅与该文件与目录所在的上一层权限有关,与该文件本身属性无任何关系。 对于文件来说,写文件是修改文件,而不是删除文件,因此写文件是与该文件的本身属性有关系的。


4. 改变权限属性命令chmod

chmod:change mod,change file access permissions

chmod是用来改变文件或目录权限的命令,但只有文件的属主和超级用户root才有这种权限。

 

chmod来改变文件或目录的权限有两种方法:

  1. 通过权限字母和操作符表达式设置权限
  2. 使用数字方法来设置权限。(常用)

chmod数字权限方法(推荐) 

使用数字权限方法设置权限的命令格式如下:

      chmod [数字组合] 文件名

chmod 的数字语法简单直观,下表中列出了数字表示权限的8种组合,该组合由3位八进制数来表示文件的3类用户的权限组合。

 

chmod的数字方法的说明:

  • r 4
  • w 2
  • r 1
  • - 0

每个三位的权限代码(分别是属主、属组,其他用户)组合,有8种可能:

八进制数字权限
0 ---
1 --x
2 -w-
3 -wx
4 r--
5 r-x
6 rw-
7 rwx

如果我们想改变的仅仅是打开目录的权限,使用chmod命令时不用加任何参数。

如果想把目录以下的所有文件或子目录也同时改变,需要使用-R参数:

 

所以当想改变一个目录下的所有.file权限,并且向保留该目录的原有权限时,请不要使用.*通配符。 

可以用下面的匹配:

chmod -R 644 oldboy/test/[a-z]*

这样可以避免隐藏文件.和..被修改,导致出错。


chmod的字符式权限表示法

使用权限字符设置权限的命令格式如下:

      chmod [用户类型] [+|-|=] [权限符号] 文件名

 

用户类型:

  • u user代表属主用户(owner,user)
  • g group代表数组
  • o others代表其他用户other
  • a all代表属主,属组和其他用户
 

操作:

  • + 增加某个权限
  • - 减少某个权限
  • = 取消其他所有权,赋予给定的权限
 

权限符号:

  • r 读
  • w 写
  • x 执行
  • - 无任何权限
 

例如:

  • chmod u+r file
  • chmod g=w file
  • chmod o-r file
  • chmod a=rwx file
 

chmod的字符式语法相对简单,对文件或目录权限的改变时,是通过比较直观的字符的形式来完成。

 

目录权限设置

对于目录权限的设置,要用到-R参数:
和数字权限方法一样,如果我们为一个目录及其下的子目录和文件具有相同的属性,就可以用-R参数:

chmod -R a+rwx ett_dir/

站点目录的文件和目录给什么权限?
默认权限是安全权限的临界点,工作中尽量给这个临界点,或者小于这个临界点权限。


5.默认权限分配的命令 umask 

超级用户创建目录默认是755,文件是644:

[root@oldboy oldboy]# mkdir dir
[root@oldboy oldboy]# touch  file 
[root@oldboy oldboy]# ls -lrtd dir file
drwxr-xr-x 2 root root 4096 Sep 10 13:59 dir  <=== 755
-rw-r--r-- 1 root root    0 Sep 10 13:59 file   <=== 644

问题1:为什么默认权限目录是755,文件是644,而不是其他值呢? 

操作系统还是网站站点目录安全权限临界点:

  1. 目录是755,文件是644,是相对安全的权限
  2. 并且用户为root以及用户组root
 

以上权限兼顾了安全和使用,生产工作中一定要尽量要我们的文件和目录达到以上默认的权限,包括用户和属组都是root

 

Linux系统默认权限的方针:允许浏览,查看,但是禁止创建和修改文件及文件内容以及执行。

 

问题2:我们希望默认创建的文件为000,目录为111,怎么能实现呢? 

linux下文件的默认权限是由 umask值  决定的。

  • umask 是通过八进制的数值来定义用户创建文件或目录的默认权限的
  • umask 对应数值表示的是禁止的权限。 具体的细节,文件和目录略有不同。
 

系统默认的umask值:

# 管理员用户默认值
[root@oldboy ~]# umask
0022

# 普通用户默认值
[zoe@oldboy ~]$ umask
0002

如果UID>199并且uid和gid相同,则umask默认值为002:

[root@oldboy ~]# sed -n '65,69p' /etc/bashrc
    if [ $UID -gt 199 ] && [ "`id -gn`" = "`id -un`" ]; then
       umask 002
    else
       umask 022
    fi
    
[zoe@oldboy ~]$ id zoe
uid=501(zoe) gid=501(zoe) groups=501(zoe)
[zoe@oldboy ~]$ umask
0002

系统是如何根据umask值确定的文件和目录的权限呢?

根据umask值计算文件权限3种方法:

 

1. 简单好用的加减法计算 

文件权限计算小结论: 

创建文件默认最大权限为666 (-rw-rw-rw-),默认创建的文件没有可执行权限x位。

对于文件来说,umask的设置是在假定文件拥有八进制666的权限上进行的,文件的权限就是666减去umask(umask的各个位数字也不能大于6,如,077就不符合条件)的掩码数值;重点在接下来的内容,如果umask的部分位或全部位为奇数,那么,在对应为奇数的文件权限位计算结果分别再加1就是最终文件权限值。

创建目录默认最大权限777(-rwx-rwx-rwx),默认创建的目录属主是有x权限,允许用户进入。 对于目录来说,umask的设置是在假定文件拥有八进制777权限上进行,目录八进制权限777减去umask的掩码数值。

 

文件权限的一般计算方法

默认文件权限计算方法

1)假设umask值为:022(所有位为偶数)

6 6 6 ==>文件的起始权限值

0 2 2 - ==>umask的值


6 4 4

 

2)假设umask值为:045(其他用户组位为奇数)

6 6 6 ==>文件的起始权限值

0 4 5 - ==>umask的值


6 2 1 ==>计算出来的权限。由于umask的最后一位数字是5,所以,在其他用户组位再加1。

0 0 1 +


622 ==>真实文件权限

 

3)假设umask值为:035(其他用户组位为奇数)
6 6 6 ==>文件的起始权限值
0 3 5 - ==>umask的值 


6 3 1 ==>计算出来的权限。由于umask的最后一位数字是5,所以,在其他用户组位再加1。
0 1 1 + 


642 ==>真实文件权限 

 

4)默认目录权限计算方法

7 7 7 ==>目录的起始权限值

0 2 2 - ==>umask的值


7 5 5

 

示例:

# 偶数位,文件666-044=0622
[root@oldboy test]# umask 044
[root@oldboy test]# touch file1
[root@oldboy test]# ll file1
-rw--w--w- 1 root root 0 Sep 10 14:33 file1
[root@oldboy test]# stat file1|grep Uid|egrep '[0-9]{4}' --color=auto -o
0622

# 0666-045= 0621+001=0622 奇数位加1
[root@oldboy test]# umask 045
[root@oldboy test]# touch file_2
[root@oldboy test]# stat file_2|grep Uid|egrep '[0-9]{4}' --color=auto -o 
0622

# 0666-035=0631+011=0642  奇数位加1
[root@oldboy test]# umask 035
[root@oldboy test]# touch file3
[root@oldboy test]# stat file3|grep Uid|egrep '[0-9]{4}' --color=auto -o
0642

特别提示:

在一般的生产场景,umask的使用不多见,在此,了解一下即可。

 

企业面试题:什么是umask,作用是什么,怎么计算文件和目录的默认权限



 

6.setuid和setgid位

setuid

特殊权限为基本说明: Linux系统基本权限位有9位,但还有额外3位权限位,共12位权限位:

  • suid s(有x) S 4 用户对应的权限位(用户对应的3位上)
  • sgid s(有x) S 2 用户组对应的权限位(用户组对应的3位上)
  • sticky t(有x) T 1 其他用户对应的权限位
 

当s这个标志出现在文件所有者的x权限上时,此时就被称为Set UID,简程SUID。

 

执行ls -l /bin/su或/usr/bin/passwd可以看到:

 
[root@oldboy test]# ls -l `which passwd`
-rwsr-xr-x. 1 root root 30768 Feb 22  2012 /usr/bin/passwd

[root@oldboy ~]# ls -l /bin/su
-rwsr-xr-x. 1 root root 34904 Oct 15  2014 /bin/su

在文件所有者的x权限位上都出现了 s 权限,那么这个特殊权限的特殊性的作用是什么呢?

  1. SUID权限仅对二进制程序有效。 
  2. 执行者对于该程序需要具有x的可执行权限。 
  3. 本权限仅在执行该程序的过程中有效。 
  4. 执行者将具有该程序拥有者的权限。
 

SUID的关键作用体现在第四句,SUID的目的就是:让本来没有相应权限的用户运行这个程序时,可以访问他没有权限访问的资源。

 

例如:
1、大家都知道su这个命令,无论任何人,执行了它都将具有root权限,因为他的拥有者是root,而且这个权限仅在执行的su命令中有效,从上面的截图可以看到,不管是文件拥有者,文件拥有者所属组,还是其他人,都是具有x权限的,所以都可以执行该程序,执行之后就将具有该程序拥有者的权限,即root的权限,这也就是su命令能够切换用户权限的实现原理。

2、系统中的用户密码是保存在/etc/shadow中的,而这个文件的权限是———

[zoe@oldboy ~]$ ls -l /etc/passwd /etc/shadow
-rw-r--r-- 1 root root 1296 Sep 10 10:49 /etc/passwd
---------- 1 root root 1245 Sep 10 14:58 /etc/shadow

[root@oldboy test]# ls -l `which passwd`
-rwsr-xr-x. 1 root root 30768 Feb 22  2012 /usr/bin/passwd

关键是要把密码写入到/etc/shadow中。我们知道,除了root用户能修改密码外,用户自己同样也能修改密码,为什么没有写入权限,还能修改密码,就是因为这个SUID功能。从ls -l /usr/bin/passwd可以看到,passwd的文件拥有者,文件拥有者所属组,还是其他人,都是具有x权限的,所以都可以执行passwd,当执行了之后获得root的权限也就能进行密码的修改。

 

常规用户执行passwd命令,可以修改自身的密码;只有根用户才能执行passwd name 指定用户名称。

 

注:
这个SUID只能运行在二进制的程序上(系统中的一些命令),不能用在脚本上,同样也不能放到目录上,放上也是无效的。

 

删除文件的演示

# 将/oldboy目录的权限设置为755,除了属主外,属组和其他用户都只有对该目录的读和执行的权限
[root@oldboy /]# chmod 755 /oldboy
[root@oldboy /]# ll /oldboy -d    
drwxr-xr-x 4 root root 4096 Sep 10 15:01 /oldboy

# 切换用户到oldboy,尝试删除/oldboy下的文件,Permission denied 无删除权限
[root@oldboy ~]# su - oldboy
[oldboy@oldboy ~]$ ll /oldboy
total 12
drwxr-xr-x 2 root root 4096 Sep 10 13:59 dir
-rw-r--r-- 1 root root    0 Sep 10 13:59 file
drw-rw-rw- 2 root root 4096 Sep 10 14:40 test
-rw-rw-rw- 1 root root   51 Sep 10 12:10 test.sh.ori
[oldboy@oldboy ~]$ rm /oldboy/file
rm: remove write-protected regular empty file `/oldboy/file'? y
rm: cannot remove `/oldboy/file': Permission denied

# 给rm命令(/bin/rm)的属主位添加suid权限
[root@oldboy /]# ll /bin/rm
-rwxr-xr-x. 1 root root 57440 Oct 15  2014 /bin/rm
[root@oldboy /]# chmod 4755 /bin/rm   # 同chmod u+s /bin/rm等价
[root@oldboy /]# ll /bin/rm
-rwsr-xr-x. 1 root root 57440 Oct 15  2014 /bin/rm

# 在oldboy用户下,尝试删除/oldboy下的文件
# 删除成功
[oldboy@oldboy ~]$ rm /oldboy/file
[oldboy@oldboy ~]$ ll /oldboy/
total 12
drwxr-xr-x 2 root root 4096 Sep 10 13:59 dir
drw-rw-rw- 2 root root 4096 Sep 10 14:40 test
-rw-rw-rw- 1 root root   51 Sep 10 12:10 test.sh.ori

删除文件受父目录的对应的w的权限影响。 oldboy用户在/oldboy/目录上,仅拥有其他用户的权限,即 "r-x",没有"w"的权限,即无法删除/oldboy下的子目录或文件。 

通过对rm命令(二进制程序)添加suid权限,赋予了所有拥有执行rm权限的用户,在执行时,拥有属主的权限(即,rwx),故而,oldboy在执行 rm 命令时,拥有了删除/oldboy目录下文件的权限。——通过rm命令的suid位,在执行时获取了属主位的权限从而获得了删除的权限。


suid知识小结:针对命令和二进制程序的

  1. 用户或属主对应的前三位权限的x位上如果有s就表示suid权限
    当x位上没有小写x执行权限的时候,suid的权限显示的就是大S。
    • s 表示 s和x
    • S 表示只有s,没有x
  2. suid 作用是让普通用户可以以root(或其他)的用户角色运行只有root(或其他)账号才能运行的程序或命令,或程序命令对应本来没有权限操作的文件等。
    • 注意:su和sudo的区别,suid为某一命令设置特殊权限(使用者为所有人)
    • 通过给rm命令设置suid加深对suid的理解
  3. 问题:希望oldboy用户能够删除本来无权删除的文件。
    • sudo给oldboy授权rm。
    • 给rm命令设置suid
    • 设置上级目录w权限
  4. suid修改的是执行的命令passwd,而不是处理的目标文件/etc/shadow
  5. 仅对二进制命令程序有效,不能用在shell等类似脚本文件上
    • 因为shell脚本仅仅是调用二进制命令程序而已,因此,具体权限还需要看二进制命令本身
  6. 二进制命令程序需要可执行权限x 的配合
  7. suid权限仅在程序命令执行过程中有效
  8. 执行suid命令的任意系统用户都可以获得该命令程序在执行期间对应的拥有者的所有权限
  9. suid双刃剑,是一个比较危险的功能,对系统安全有一定的威胁。
    • 系统suid的无用的功能取消suid权利(安全优化)。
 

下面是系统内常见的拥有suid的命令:

[root@oldboy ~]# find /usr/bin -type f -perm 4755 -exec ls -l {} ;
-rwsr-xr-x. 1 root root 30768 Feb 22  2012 /usr/bin/passwd
-rwsr-xr-x. 1 root root 51784 Mar 30  2015 /usr/bin/crontab
-rwsr-xr-x. 1 root root 54496 Feb 20  2015 /usr/bin/at
-rwsr-xr-x. 1 root root 22544 Mar 17  2015 /usr/bin/pkexec
-rwsr-xr-x. 1 root root 66352 Apr  7  2015 /usr/bin/chage
-rwsr-xr-x. 1 root root 36144 Apr  7  2015 /usr/bin/newgrp
-rwsr-xr-x. 1 root root 71480 Apr  7  2015 /usr/bin/gpasswd
[root@oldboy ~]# find / -type f -perm 4755 -exec ls -l {} ;       
-rwsr-xr-x. 1 root root 34840 Oct 15  2014 /sbin/unix_chkpwd
-rwsr-xr-x. 1 root root 10272 Oct 15  2014 /sbin/pam_timestamp_check
-rwsr-xr-x. 1 root root 9000 Jul 24  2015 /usr/sbin/usernetctl
-rwsr-xr-x. 1 root root 257824 Jul 24  2015 /usr/libexec/openssh/ssh-keysign
-rwsr-xr-x. 1 abrt abrt 10296 Jul 25  2015 /usr/libexec/abrt-action-install-debuginfo-to-abrt-cache
-rwsr-xr-x. 1 root root 14368 Mar 17  2015 /usr/libexec/polkit-1/polkit-agent-helper-1
-rwsr-xr-x. 1 root root 30768 Feb 22  2012 /usr/bin/passwd
-rwsr-xr-x. 1 root root 51784 Mar 30  2015 /usr/bin/crontab
-rwsr-xr-x. 1 root root 54496 Feb 20  2015 /usr/bin/at
-rwsr-xr-x. 1 root root 22544 Mar 17  2015 /usr/bin/pkexec
-rwsr-xr-x. 1 root root 66352 Apr  7  2015 /usr/bin/chage
-rwsr-xr-x. 1 root root 36144 Apr  7  2015 /usr/bin/newgrp
-rwsr-xr-x. 1 root root 71480 Apr  7  2015 /usr/bin/gpasswd
-rwsr-xr-x. 1 root root 38200 Jul 24  2015 /bin/ping
-rwsr-xr-x. 1 root root 36488 Jul 24  2015 /bin/ping6
-rwsr-xr-x. 1 root root 53472 Oct 15  2014 /bin/umount
-rwsr-xr-x. 1 root root 34904 Oct 15  2014 /bin/su
-rwsr-xr-x. 1 root root 77336 Oct 15  2014 /bin/mount
find: `/proc/1321/task/1321/fd/5': No such file or directory
find: `/proc/1321/task/1321/fdinfo/5': No such file or directory
find: `/proc/1321/fd/5': No such file or directory
find: `/proc/1321/fdinfo/5': No such file or directory

setgid位

当s出现在文件的所属用户组x权限位置上时,就是SGID,相对与SUID来说,SGID还是比较少见的。

那么SGID的功能是什么呢?

和SUID一样,只是SGID是获得该程序所属用户组的权限。 这相SGID有几点需要我们注意:

  1. SGID对二进制程序有用;
  2. 程序执行者对于该程序来说需具备x的权限;
  3. SGID主要用在目录上;
 

理解了SUID,我想SGID也很容易理解。如果用户在此目录下具有w权限的话,若使用者在此目录下建立新文件,则新文件的群组与此目录的群组相同。

 

例如:

[root@oldboy ~]# ls -l `which locate`
-rwx--s--x. 1 root slocate 38464 Mar 12  2015 /usr/bin/locate

/usr/bin/locate二进制程序就是在sgid。

# 属组slocate拥有对mlocate.db有读的权限
# 同时/usr/bin/locate 属组位上有sgid的权限位,所以执行locate的用户拥有了slocate属组的权限,即执行locate命令,读取/var/lib/mlocate/mlocate.db的权限

[root@oldboy mlocate]# ls -l /var/lib/mlocate/mlocate.db 
-rw-r----- 1 root slocate 1368160 Sep 10 03:09 /var/lib/mlocate/mlocate.db

sgid知识总结介绍:

  1. 与suid不同的是,sgid既可以针对文件,也可以针对目录设置
  2. sgid是针对用户组权限位的

    • 对于文件来说:
      • sgid 仅对二进制命令程序有效
      • 二进制命令或程序需要有可执行权限x
      • 执行命令的任意用户可以获得该命令程序执行期间所属组的权限
    • 对于目录来说:
      • linux里默认情况所有用户创建文件,默认用户和组都是自身
        • 特殊情况:通过suid获取属主用户权限创建的文件或目录,属主都是该命令的属主,数组是创建的用户的属组
        • 如:oldboy通过touch和mkdir设置suid创建的目录和文件的文件属主是root,属组是incahome(oldboy的属组)
          • drwxr-xr-x 2 root incahome 4096 Sep 10 16:24 oldboydir
          • -rw-r--r-- 1 root incahome 0 Sep 10 16:22 oldboyfile
      • sgid可以让用户在此目录下创建的文件和目录,具有和此目录相同的用户组设置
      • sgid位主要用在目录中,当为某个目录设置了sgid位以后,在该目录中新创建的文件具有该目录的所属组权限,而不是创建该文件的用户的默认所有者。这样,使得在多个用户之间共享一个目录中的文件变得简单。

提示:用八进制数2000表示setgid权限位。


linux里默认情况所有用户创建文件,默认用户和组都是自身。

 

RHCE认证考试题:

创建共享目录/home/admins:
属组为adminuser:
adminuser组成员对目录有读写和执行的权限,其他所有用户没有任何权限(root除外):
在/home/admins 目录中创建的文件,会自动继承adminuser组。 

文件只有属主可以删除。

# 创建/home/admins目录
[root@oldboy /]# mkdir /home/admins

# 添加组 adminuser
[root@oldboy /]# groupadd adminuser
[root@oldboy /]# ls -ld /home/admins
drwxr-xr-x 2 root root 4096 Sep 10 16:50 /home/admins

# 更改/home/admins的属组
[root@oldboy /]# chown .adminuser /home/admins/
[root@oldboy /]# ls -ld /home/admins           
drwxr-xr-x 2 root adminuser 4096 Sep 10 16:50 /home/admins

# 更改/home/admins/的权限 770
[root@oldboy /]# chmod g+w,o= /home/admins/
[root@oldboy /]# ls -ld /home/admins       
drwxrwx--- 2 root adminuser 4096 Sep 10 16:50 /home/admins
[root@oldboy /]# chmod 770 /home/admins
[root@oldboy /]# ls -ld /home/admins   
drwxrwx--- 2 root adminuser 4096 Sep 10 16:50 /home/admins

# 创建oldboy.txt文件,默认权限为644,创建的文件默认的属主和属组还是root,root
[root@oldboy /]# touch /home/admins/oldboy.txt
[root@oldboy /]# ls -l /home/admins/oldboy.txt 
-rw-r--r-- 1 root root 0 Sep 10 16:54 /home/admins/oldboy.txt

# 为/home/admins/目录添加sgid
[root@oldboy /]# chmod g+s /home/admins/
[root@oldboy /]# ls -ld /home/admins/          
drwxrws--- 2 root adminuser 4096 Sep 10 16:54 /home/admins/

# 在sgid的情况下,创建新文件,发现属组为/home/admins的属组:
[root@oldboy /]# touch /home/admins/newfile
[root@oldboy /]# ls -l /home/admins/
total 0
-rw-r--r-- 1 root adminuser 0 Sep 10 16:57 newfile
-rw-r--r-- 1 root root      0 Sep 10 16:56 oldboy.txt

setuid和setgid设置说明

特殊权限位数字权限(八进制)方法: 

  • setuid位的设置用八进制的4000,setgid的设置是用八进制的2000;比如我们前面所说的chmod 4755 /bin/rm 就是设置的setuid位。
 

setuid设置方法:

  • 通过chmod设置文件或目录权限位的数字权限方法的前面多加一个数字4
    • chmod 4755 /bin/rm
    • chmod u+s /bin/rm

setgid的设置方法:

  • setgid位占用的是八进制的2000位,其实就是在我们通过chmod设置文件或目录权限位的数字权限前面多加一个数字2。 
    • chmod 2755 /bin/locate
    • chmod g+s /bin/rm

SBIT的设置方法:

  • SBIT位占用的是八进制的1000位,其实就是在我们通过chmod设置文件或目录权限位的数字权限前面多加一个数字1。 
    • chmod 17777 /tmp
    • chmod o+t /tmp

粘滞位 sticky bit

这个就是针对others来设置的了,和上面两个一样,只是功能不同而已。

SBIT(Sticky Bit)目前只针对目录有效,对于目录的作用是:当用户在该目录下建立文件或目录时,仅有自己与 root才有权力删除。

最具有代表的就是/tmp目录,任何人都可以在/tmp内增加、修改文件(因为权限全是rwx),但仅有该文件/目录建立者与 root能够删除自己的目录或文件。

 

粘滞位的功能现在也很少用了,不过对于像/tmp目录这样的,是整个系统临时文件存放地,还是有点意义。 

一个目录既使它的使用权限都开放rwxrwxrwx,如果是设置了粘滞位,除非目录的属主和root用户有权限删除它,除此之外,其他用户不能删除这个目录。 

用途一般是把一个文件夹的权限都打开,然后来共享文件,像/tmp目录一样。方便带来的安全隐患,生产环境我们一般不这样使用!

[root@oldboy /]# ls -ld /tmp
drwxrwxrwt. 17 root root 4096 Sep 10 16:28 /tmp

sticky:比SGID的更安全措施,让多个用户都具有写权限的目录,每个用户只能删自己的文件。

表现在other位,如果有执行权限,用 t 表示; 如果没有执行权限,用 T 表示。

 

问题:

tmp经典的粘滞位目录案例,特点:谁都有写的权限,因此安全成问题。常常是木马第一手跳板地点。


7. 改变文件所属关系命令 chown 

chown(change owner):

当我们要改变一个文件的属主,我们所使用的用户必须是该文件的属主而且同时是目标属组成员,或超级用户

只有超级用户才能改变文件的属主

 

chown 语法:
    chown [选项] ... [所有者] [:[组]] 文件...

 

举例:将example.txt文件的属主改为baixuan用户:

 

方法:

  • chown 用户 文件或目录 <=== 仅仅授权用户
  • chown :组 文件或目录 <=== 仅仅授权组,等同于 chgrp 组文件或目录
  • chown 用户:组 文件或目录 <=== 表示授权用户和组

强调:

  1. 其中的冒号":" 可以用'.'点号替代
  2. 要授权的用户和组名,必须是linux系统里实际存在的
[root@oldboy /]# cd /oldboy
[root@oldboy oldboy]# ls -l test.sh
-rw-r--r-- 1 oldboy incahome 51 Sep 10 17:41 test.sh

# 更改test.sh的属主
[root@oldboy oldboy]# chown zoe test.sh
[root@oldboy oldboy]# ls -l test.sh    
-rw-r--r-- 1 zoe incahome 51 Sep 10 17:41 test.sh

# 更改test.sh的属组
[root@oldboy oldboy]# chown .zoe test.sh
[root@oldboy oldboy]# ls -l test.sh     
-rw-r--r-- 1 zoe zoe 51 Sep 10 17:41 test.sh
原文地址:https://www.cnblogs.com/zoe233/p/11922198.html