一、UNIX下关于文件权限的表示方法和解析

UNIX下关于文件权限的表示方法和解析

  SUID 是 Set User ID, SGID 是 Set Group ID的意思。

  UNIX下可以用ls -l 命令来看到文件的权限。用ls命令所得到的表示法的格式是类似这样的:-rwxr-xr-x 。下面解析一下格式所表示的意思。这种表示方法一共有十位:

  9 8 7 6 5 4 3 2 1 0

  - r w x r - x r - x

  第9位表示文件类型,可以为p、d、l、s、c、b和-:

  p表示命名管道文件

  d表示目录文件

  l表示符号连接文件

  -表示普通文件

  s表示socket文件

  c表示字符设备文件

  b表示块设备文件

  第8-6位、5-3位、2-0位分别表示文件所有者的权限,同组用户的权限,其他用户的权限,其形式为rwx:

  r表示可读,可以读出文件的内容

  w表示可写,可以修改文件的内容

  x表示可执行,可运行这个程序

  没有权限的位置用-表示

  其实在UNIX的实现中,文件权限用12个二进制位表示,如果该位置上的值是

  1,表示有相应的权限:

  11 10 9 8 7 6 5 4 3 2 1 0

  S G T r w x r w x r w x

  第11位为SUID位,第10位为SGID位,第9位为sticky位,第8-0位对应于上面的三组rwx位。

  11 10 9 8 7 6 5 4 3 2 1 0

  上面的-rwsr-xr-x的值为: 1 0 0 1 1 1 1 0 1 1 0 1

  -rw-r-Sr--的值为: 0 1 0 1 1 0 1 0 0 1 0 0

  给文件加SUID和SUID的命令如下:

  chmod u+s filename 设置SUID位

  chmod u-s filename 去掉SUID设置

  chmod g+s filename 设置SGID位

  chmod g-s filename 去掉SGID设置

  另外一种方法是chmod命令用八进制表示方法的设置。如果明白了前面的12位权限表示法也很简单。

二、SUID和SGID的详细解析

Set UID

会创建s与t权限,是为了让一般用户在执行某些程序的时候,能够暂时具有该程序拥有者的权限。举例来说,我们知道,账号与密码的存放文件其实是 /etc/passwd与 /etc/shadow。而 /etc/shadow文件的权限是“-r--------”。它的拥有者是root。在这个权限中,仅有root可以“强制”存储,其他人是连看都不行的。

但是,偏偏笔者使用dmtsai这个一般身份用户去更新自己的密码时,使用的就是 /usr/bin/passwd程序,却可以更新自己的密码。也就是说,dmtsai这个一般身份用户可以存取 /etc/shadow密码文件。这怎么可能?明明 /etc/shadow就是没有dmtsai可存取的权限。这就是因为有s权限的帮助。当s权限在user的x时,也就是类似 -r-s--x--x,称为Set UID,简称为SUID,这个UID表示User的ID,而User表示这个程序(/usr/bin/passwd)的拥有者(root)。那么,我们就可以知道,当dmtsai用户执行 /usr/bin/passwd时,它就会“暂时”得到文件拥有者root的权限。

SUID仅可用在“二进制文件(binary file)”,SUID因为是程序在执行过程中拥有文件拥有者的权限,因此,它仅可用于二进制文件,不能用在批处理文件(shell脚本)上。这是因为shell脚本只是将很多二进制执行文件调进来执行而已。所以SUID的权限部分,还是要看shell脚本调用进来的程序设置,而不是shell脚本本身。当然,SUID对目录是无效的。这点要特别注意。

Set GID

进一步而言,如果s的权限是在用户组,那么就是Set GID,简称为SGID。SGID可以用在两个方面。

文件:如果SGID设置在二进制文件上,则不论用户是谁,在执行该程序的时候,它的有效用户组(effective group)将会变成该程序的用户组所有者(group id)。

目录:如果SGID是设置在A目录上,则在该A目录内所建立的文件或目录的用户组,将会是此A目录的用户组。

一般来说,SGID多用在特定的多人团队的项目开发上,在系统中用得较少。

Sticky Bit

这个Sticky Bit当前只针对目录有效,对文件没有效果。SBit对目录的作用是:“在具有SBit的目录下,用户若在该目录下具有w及x权限,则当用户在该目录下建立文件或目录时,只有文件拥有者与root才有权力删除”。换句话说:当甲用户在A目录下拥有group或other的项目,且拥有w权限,这表示甲用户对该目录内任何人建立的目录或文件均可进行“删除/重命名/移动”等操作。不过,如果将A目录加上了Sticky bit的权限,则甲只能够针对自己建立的文件或目录进行删除/重命名/移动等操作。

举例来说,/tmp本身的权限是“drwxrwxrwt”,在这样的权限内容下,任何人都可以在 /tmp内新增、修改文件,但仅有该文件/目录的建立者与root能够删除自己的目录或文件。这个特性也很重要。可以这样做个简单测试:

1. 以root登入系统,并且进入 /tmp中。

2. touch test,并且更改test权限成为777。

3. 以一般用户登入,并进入 /tmp。

4. 尝试删除test文件。

更多关于SUID/SGID/Sticky Bit的介绍,我们会在第11章中再次提及,当前,先有简单的概念即可。

SUID/SGID/SBIT权限设置

前面介绍过SUID与SGID的功能,那么,如何打开文件使其成为具有SUID与SGID的权限呢?这就需要使用数字更改权限了。现在应该知道,使用数字更改权限的方式为“3个数字”的组合,那么,如果在这3个数字之前再加上一个数字,最前面的数字就表示这几个属性了(注:通常我们使用chmod xyz filename的方式来设置filename的属性时,则是假设没有SUID、SGID及Sticky bit)。

4为SUID

2为SGID

1为Sticky bit

假设要将一个文件属性改为“-rwsr-xr-x”,由于s在用户权限中,所以是SUID,因此,在原先的755之前还要加上4,也就是使用“chmod 4755 filename”来设置。此外,还有大S与大T的产生。参考下面的范例(注意:下面的范例只是练习而已,所以笔者使用同一个文件来设置,必须知道,SUID不是用在目录上,SBIT不是用在文件上)。

[root@linux ~]# cd /tmp
[root@linux tmp]# touch test
[root@linux tmp]# chmod 4755 test; ls -l test
-rwsr-xr-x 1 root root 0 Jul 20 11:27 test
[root@linux tmp]# chmod 6755 test; ls -l test
-rwsr-sr-x 1 root root 0 Jul 20 11:27 test
[root@linux tmp]# chmod 1755 test; ls -l test
-rwxr-xr-t 1 root root 0 Jul 20 11:27 test
[root@linux tmp]# chmod 7666 test; ls -l test
-rwSrwSrwT 1 root root 0 Jul 20 11:27 test

# 这个例子要特别小心。怎么会出现大写的S与T呢?不都是小写的吗?

# 因为s与t都是取代x参数的,但是,我们是使用

# 7666。也就是说,user、group以及others都没有x这个可执行的标志

# (因为666)。所以,S、T表示“空的”。

# SUID是表示“该文件在执行时,具有文件拥有者的权限”,但文件

# 拥有者都无法执行了,哪里来的权限给其他人使用呢?当然就是空的

三、文件隐藏属性

文件有隐藏属性,隐藏属性对系统有很大的帮助。尤其是在系统安全(Security)方面,非常重要。下面我们就来谈一谈如何设置与检查这些隐藏的属性。

chattr(设置文件隐藏属性)

[root@linux ~]# chattr [+-=][ASacdistu] 文件或目录名

参数:

+ : 增加某个特殊参数,其他原本存在的参数不动。

- : 删除某个特殊参数,其他原本存在的参数不动。

= : 设置一定,且仅有后面接的参数

A : 当设置了A属性时,这个文件(或目录)的存取时间atime(access)将不可被修改,可避免例如手提电脑有磁盘I/O错误的情况发生。

S : 这个功能有点类似sync。就是将数据同步写入磁盘中。可以有效地避免数据流失。

a : 设置a之后,这个文件将只能增加数据,而不能删除,只有root才能设置这个属性。

c : 这个属性设置之后,将会自动将此文件“压缩”,在读取的时候将会自动解压缩,但在存储的时候,将会先进行压缩后再存储(对于大文件有用)。

d : 当执行dump(备份)程序的时候,设置d属性将可使该文件(或目录)具有转储功效。

i : i的作用很大。它可以让一个文件“不能被删除、改名、设置连接,也无法写入或新增数据”。对于系统安全性有相当大的帮助。

j : 当使用ext3文件系统格式时,设置j属性将会使文件在写入时先记录在journal中。但是,当文件系统设置参数为data=journalled时,由于已经设置日志了,所以这个属性无效。

s : 当文件设置了s参数时,它将会从这个硬盘空间完全删除。

u : 与s相反,当使用u来设置文件时,则数据内容其实还存在磁盘中,可以用来还原删除.

注意:这个属性设置上,比较常见的是a与i的设置值,而且很多设置值必须要root才能设置。

范例:

[root@linux ~]# cd /tmp
[root@linux tmp]# touch attrtest
[root@linux tmp]# chattr +i attrtest
[root@linux tmp]# rm attrtest
rm: remove write-protected regular empty file `attrtest'? y
rm: cannot remove `attrtest': Operation not permitted

# 看到了吗?连root也没有办法删除这个文件。赶紧解除设置。

[root@linux tmp]# chattr -i attrtest

这个命令很重要,尤其是在系统的安全性方面。由于这些属性是隐藏的,所以需要用lsattr才能看到。笔者认为,最重要的是 +i属性,因为它可以让一个文件无法被更改,对于需要很高系统安全性的人来说,相当重要。还有相当多的属性是需要root才能设置的。此外,如果是登录文件,就更需要 +a参数,使之可以增加但不能修改与删除原有的数据。将来提到登录文件时,我们再来介绍如何设置它。

lsattr(显示文件的隐藏属性)

[root@linux ~]# lsattr [-aR] 文件或目录

参数:

-a : 将隐藏文件的属性也显示出来。

-R : 连同子目录的数据也一并列出来。

范例:

[root@linux tmp]# chattr +aij attrtest

[root@linux tmp]# lsattr

----ia---j--- ./attrtest

使用chattr设置后,可以利用lsattr来查看隐藏属性。不过,这两个命令在使用上必须要特别小心,否则会造成很大的困扰。例如,某天你心情好,突然将 /etc/shadow这个重要的密码记录文件设置为具有i属性,那么,过了若干天之后,突然要新增用户,却一直无法新增。怎么办?将i的属性去掉即可

二、t标识位的用法

root@localhost ~]# ls -ld /usr/bin/passwd  /tmp
drwxrwxrwt 4 root root  4096 Jun  2 17:33 /tmp
-rwsr-xr-x 1 root root 22984 Jan  7  2007 /usr/bin/passwd

这里的s和t是针对执行权限来讲的。
这个s权限,是为了让一般使用者临时具有该文件所属主/组的执行权限。就比如/usr/bin/passwd在执行它的时候需要去修改/etc/passwd和/etc/shadow等文件,这些文件除了root外,其他用户都没有写权限,但是又为了能让普通用户修改自己的密码,只能时临时让他们具有root的权限。所以这个s权限就是用来完成这个特殊任务的。s权限只能应用在二进制的可执行文件上。
如果你不想让普通用户修改自己的密码,只需要
[root@localhost ~]# chmod u-s /usr/bin/passwd  或者
[root@localhost ~]# chmod 0755 /usr/bin/passwd
0755最前面的0表示不使用任何特殊权限,该位上的数字可以是0,1(--t),2(-s-),3(-st),4(s--),5(s-t),6(ss-),7(sst)
那个t权限只针对目录生效,它表示只能让所属主以及root可以删除(重命名/移动)该目录下的文件。比如/tmp目录本来就是任何用户都可以读写,如果别人可以任意删除(重命名/移动)自己的文件,那岂不是很危险。所以这个t权限就是为了解决这个麻烦的

[root@localhost ~]# cd /tmp/
[root@localhost tmp]# mkdir test
[root@localhost tmp]# chmod 1777 test
[root@localhost tmp]# ls -ld test
drwxrwxrwt 2 root root 4096 Jun  2 18:10 test
[root@localhost tmp]# su test1
[test1@localhost tmp]$ touch test/1.txt
[test1@localhost tmp]$ ls -l test
total 4
-rw-r--r-- 1 test1 test 0 Jun  2 18:12 1.txt
[test1@localhost tmp]$ exit
[root@localhost tmp]# su www
[www@localhost tmp]$ ls -l test/1.txt
-rwxrwxrwx 1 test1 test 6 Jun  2 18:12 test/1.txt
[www@localhost tmp]$ rm test/1.txt
rm: cannot remove `test/1.txt': Operation not permitted
提示不能删除1.txt
[www@localhost tmp]$ exit
[root@localhost tmp]# chmod -t test
去掉t权限。
[root@localhost tmp]# ls -ld test
drwxrwxrwx 2 root root 4096 Jun  2 18:13 test
[root@localhost tmp]# su www
[www@localhost tmp]$ rm -f test/1.txt
再次删除,则删除成功。
[www@localhost tmp]$ ls test/1.txt
ls: test/1.txt: No such file or directory

三、解释了 setuid setgid sticky三者的应用场景

如果是一个可执行文件, 那么在执行时, 一般该文件只拥有调用该文件的用户具有的权限. 而setuid, setgid 可以来改变这种设置.

setuid:该位是让普通用户可以以root用户的角色运行只有root帐号才能运行的程序或命令。比如我们用普通用户运行passwd命令来更改自己的口令,实际上最终更改的是/etc/passwd文件我们知道/etc/passwd文件是用户管理的配置文件,只有root权限的用户才能更改

  [root@localhost ~]# ls -l /etc/passwd

  -rw-r--r-- 1 root root 2379 04-21 13:18 /etc/passwd

  作为普通用户如果修改自己的口令通过修改/etc/passwd肯定是不可完成的任务,但是不是可以通过一个命令来修改呢答案是肯定的,作为普通用户可以通过passwd 来修改自己的口令这归功于passwd命令的权限我们来看一下;

  [root@localhost ~]# ls -l /usr/bin/passwd

  -r-s--x--x 1 root root 21944 02-12 16:15 /usr/bin/passwd

  因为/usr/bin/passwd 文件已经设置了setuid 权限位(也就是r-s--x--x中的s),所以普通用户能临时变成root,间接的修改/etc/passwd,以达到修改自己口令的权限

setgid: 该权限只对目录有效.目录被设置该位后, 任何用户在此目录下创建的文件都具有和该目录所属的组相同的组.

sticky bit: 该位可以理解为防删除位. 一个文件是否可以被某用户删除, 主要取决于该文件所属的组是否对该用户具有写权限. 如果没有写权限, 则这个目录下的所有文件都不能被删除, 同时也不能添加新的文件.如果希望用户能够添加文件但同时不能删除文件, 则可以对文件使用sticky bit位. 设置该位后, 就算用户对目录具有写权限, 也不能删除该文件.

下面说一下如何操作这些标志:

操作这些标志与操作文件权限的命令是一样的, 都是 chmod. 有两种方法来操作,

1) chmod u+s temp -- 为temp文件加上setuid标志. (setuid 只对文件有效)

chmod g+s tempdir -- 为tempdir目录加上setgid标志 (setgid 只对目录有效)

chmod o+t temp -- 为temp文件加上sticky标志 (sticky只对文件有效)

2) 采用八进制方式. 对一般文件通过三组八进制数字来置标志, 如 666, 777, 644等. 如果设置这些特殊标志, 则在这组数字之外外加一组八进制数字. 如 4666, 2777等. 这一组八进制数字三位的意义如下,

abc

a - setuid位, 如果该位为1, 则表示设置setuid 4---

b - setgid位, 如果该位为1, 则表示设置setgid 2---

c - sticky位, 如果该位为1, 则表示设置sticky 1---

设置完这些标志后, 可以用 ls -l 来查看. 如果有这些标志, 则会在原来的执行标志位置上显示. 如

rwsrw-r-- 表示有setuid标志

rwxrwsrw- 表示有setgid标志

rwxrw-rwt 表示有sticky标志

那么原来的执行标志x到哪里去了呢? 系统是这样规定的, 如果本来在该位上有x, 则这些特殊标志显示为小写字母 (s, s, t). 否则, 显示为大写字母 (S, S, T)

注意:setuid和setgid会面临风险,所以尽可能的少用,偶在这里也是了解了解,O(∩_∩)O哈!

linux文件的文件类型(d,-,s,b,c,....)和文件权限(r,w,x, s,t,S,T)与文件特殊权限(s,t,S,T)相关推荐

  1. Linux 权限r w s,Linux下s、t、i、a特殊权限

    文件权限除了r.w.x外还有s.t.i.a权限: 1. s:文件属主和组设置SUID和GUID,文件在被设置了s权限后将以root身份执行.在设置s权限时文件属主.属组必须先设置相应的x权限,否则s权 ...

  2. html file验证文件是否上传,JavaScript判断文件上传类型的方法

    本文实例展示了JavaScript判断文件上传类型的方法,是一个非常常用的技巧.具体实现方法如下: 文件上传时用到一个功能,使用html元素的input标签实现: 选中图片后立即触发onchange事 ...

  3. R语言使用download.file函数下载网络文件到本地(Download File from the Internet)

    R语言使用download.file函数下载网络文件到本地(Download File from the Internet) 目录 R语言使用download.file函数下载网络文件到本地(Down ...

  4. python文件操作,r w a系列

    文件操作 创建文件"asdf.txt" open( ) # 打开 file # 文件的位置(路径) mode # 操作文件的模式 encoding # 文件编码方式 f # 文件句 ...

  5. linux怎么找指定类型文件,Linux中查找指定类型文件以及删除例子

    在Linux服务器上运行Weblogic服务器,每次需要关闭Weblogic服务器后,都会在domain下留下一些*.lok的文件,导致下次启动的时候因为这些文件无法启动,因此,需要删除产生的所有.l ...

  6. Linux文件系统(文件系统类型、设备文件、常用命令、U盘与光盘挂载)

    Linux文件系统(文件系统类型.设备文件.常用命令.U盘与光盘挂载)   本篇文章是Linux文件系统整块集合,包含了Linux文件系统介绍.设备文件介绍.常用文件系统命令(查看.修复与配置).挂载 ...

  7. linux sec是什么类型,SEC 文件扩展名: 它是什么以及如何打开它?

    SEC 疑难解答 常见的 SEC 打开问题 Pretty Good Privacy (PGP) 消失 双击你的 SEC 文件会提示消息 "%%os%% 无法打开 SEC 文件". ...

  8. win10启动引导linux系统安装教程,【教程】在UEFI启动方式下,经过GRUB2引导,直接从硬盘ISO文件安装Windows10和Ubuntu双系统...

    动机 最近在自学MIT6.828 Operating System Engineering, 这门课程的代码是针对Linux系统(Ubuntu)的.linux 我有一台WIN10平板电脑,基本信息以下 ...

  9. linux 权限控制(用户管理、用户组管理、文件权限)

    文章目录 1. 用户管理 1.1 useradd 添加新用户并在home目录下创建对应用户的目录 1.2 passwd 设置用户密码 1.3 id 查看用户是否存在 1.4 cat /etc/pass ...

最新文章

  1. git init 与 git init --bare 区别
  2. BCH将在新支付协议下不断奋进
  3. (传送门)2/dev/null和/dev/null 21和21/dev/null
  4. c语言程序设计指针进阶,C语言及程序设计进阶例程-15 指向结构体的指针
  5. SQLite3单例模式(C++)
  6. HTML实现跳转到页面指定位置
  7. alter id order by_声卡id查找表
  8. 驱动开发中常用的操作和小知识
  9. 自考专科计算机信息管理专业好,计算机信息管理(专科)专业介绍
  10. mysql返回值_mysql_query的返回值
  11. linux下建立无线wifi------简单实用!
  12. WindowsEclipseQt2010.02编译错误的处理
  13. 算法系列之算法学习书籍以及资料推荐
  14. 能源数字化,未来四十年看什么?
  15. ORA-12569: TNS: 包校验和失败解决方法一例
  16. 面试:Zookeeper常见11个连环炮
  17. How to use Hibernate - XML Configuration
  18. 算法的数值稳定性实验报告用c语言,数值计算实验教案.doc
  19. 【复杂网络】自学笔记整理
  20. 工欲善其事 必先利其器-——Idea使用(1)-初次识别

热门文章

  1. np.empty()函数、np.random.uniform()函数、np.random.normal()函数的详细介绍和代码说明
  2. 加载界面(伪加载),进度条制作,让人物图片动起来
  3. src下创建java文件_Eclipse下maven项目创建src/main/java 源文件夹报错文件文件已存在问题...
  4. 腾讯视频web端如何去水印?学会这招你想去啥就去啥
  5. spring调用切面失效分析(类内调用自身切面方法或其他切面方法失效)
  6. 数据可视化-豆瓣影评数据分析(FineBI)
  7. 怎么科学开奶,堵奶怎么办?
  8. Unity3D在Project中添加Favorites快速搜索标签
  9. 某校2019专硕编程题-简易计算器
  10. ffmpeg命令分析【详细分析合集】