林老师之系统安全系列三

这次我们主要来学一下linux中ls -l的信息、chmod和real userId;effective userId;saved set-userId

参考博客

Linux的用户和组之详解用户和组的分类
linux ls -l 详解
为什么硬链接不能指向目录
Linux一切皆文件(包含好处和弊端)
Linux一切皆文件
深入Linux文件权限 SUID/SGID/SBIT
用户ID

ls -l

1
total:当前目录下所有文件所占空间总和
例如:drwxr-xr-x 12 root root 4096 Mar 4 21:06 var
第1个字段的首字母:文件属性字段

  • -:代表是一个普通文件
  • d:代表是一个目录
  • l:代表是一个链接文件,如快捷方式类似的
  • b:块设备文件,一般在/dev文件夹下,是普通文件和程序访问硬件设备的入口,没有大小,与硬盘、光盘等相关,只有一个主设备号和一个辅设备号,一次传输数据为一整块的成为块设备
  • c:字符设备文件,置于/dev下,没有大小,与键盘等相关,依次传输一个字节的设备成为字符设备
  • p:命令管道文件,与shell编程有关
  • s:socket文件,与shell编程有关

软链接和硬链接

在linux文件系统中,磁盘在分区时被分为inode区和datablock区,保存在磁盘中的文件都对应着一个索引节点inode,inode是文件在文件系统中的唯一标识,在读取文件时,会先读取这个文件所对应的inode,inode中包含的信息有:唯一标识、创建时间(ctime)、修改时间(mtime)、文件大小、属主、归属的用户组、读写权限、数据所在block号等信息

软链接

软链接是新建一个文件,会有与其相对应的一个新的inode,该文件是用来专门指向别的文件的,和Windows下的快捷方式类似,删了这个软链接文件,没啥影响,但是删了它所指向的文件后,该软链接也不可用了

硬链接

不会新建一个inode,即它所指向的文件的inode也会指向它,inode的链接文件数+1,硬链接实际上是为所指向的文件建立了一个别名,本质是同一文件,它们俩的inode是相同的,而在删除硬链接或指向文件时,只要inode所对应的文件数>0,该inode就不会消失,文件内容也不会丢失,相当于删除了一个inode所指向文件的索引
文件系统中的每一个文件默认具有一个硬链接

适用场景

  1. 软链接可以跨文件系统,硬链接不可以,因为inode是在当前分区中的索引值,当linux挂载多个文件系统后,可能会出现inode号重复的现象;
  2. 软链接可以对一个不存在的文件建立链接(自动新建),硬链接不可;
  3. 软链接可以对目录进行链接,硬链接不可以,如果硬链接可以指向目录,会打破文件系统间有向无环的结构,目录可以看作是包含很多指向inode节点的文件,目录中的文件就像是一个指向inode的链接,硬链接如果指向其父目录,那么该硬链接就是该父目录,产生环,导致一些列举文件的命令不可用,还有删除该目录时又会发生什么呢?;而软链接本身就是个新文件,只不过通过它可以访问父目录,但是它和父目录还是父子关系
  4. 文件属性上,软链接为”l”
  5. 指向文件移动,软链接找不到,硬链接相对inode来说无影响

rwxr-xr-x:文件或目录的权限位
前三个为文件拥有者的权限,中间三个为文件所属组的其他成员拥有的权限,后三个为其他用户所拥有的权限

用户组

linux下的用户有三种,用uid标识,分别为root(权限无法无天)、系统用户(不具有登录linux系统的能力,如bin、daemon,当应用需要访问/操作/拥有系统的资源时,Linux就通过系统用户来控制)、普通用户
linux系统以组方式来管理用户,用户和组的关系为多对多,分为主组和附属组,主组为用户的默认组,以gid标识,用户必须有且只能有一个主组,若useradd时没有用-g指定一个已存在的组时,系统会默认创建一个和用户名相同的组
usermod -g(永久改变主组)
newgrp(短暂更改)
usermod -G(设置普通用户的附属组)

r:读 w:写 x:可执行 t:临时文件 特殊的一类位为”s”

s位

SUID

“s”位出现在文件所有者的权限上,称为Set UID
执行命令ls -l /bin/su会出现-rwsr-xr-x
该权限仅对二进制程序有用,不能用在脚本上,让本来没有相应权限的用户运行这个程序时,可以访问他没有权限访问的资源,将具有该程序拥有者的权限,不过仅在执行该程序过程中有效
比如su,/bin/su的拥有者为root,但是三个组用户具有执行该程序的权限,所以当不是root执行该程序时,都将具有root权限

SGID

“s”位出现在文件拥有者所属用户组权限位上,和SUID类似,获得的是该程序所属用户组权限,对二进制程序和目录有用;当用户对某一目录有写和执行权限时,该用户就可以在该目录下建立文件,如果该目录用SGID修饰,则该用户在这个目录下建立的文件都是属于这个目录所属的组。

SBIT

“t”位出现在其他用户权限位上,只针对目录有用,当用户在该目录下建立文件或目录时,仅有自己与root才有权力删除,比如/tmp目录,任何人都可以在/tmp内增加、修改文件(因为权限全是rwx),但仅有该文件/目录建立者与 root能够删除自己的目录或文件 ls -ld /tmp出现drwxrwxrwt最后一位为t
这三位的设置方法,到chmod里讲

第2个字段:对于目录来说,指第一级子目录的个数,新目录下默认为2,有两个隐藏子目录,一个是指向它本身的子目录,一个是指向它上级的子目录;对于文件来说,是指该文件的硬链接数
第3个字段:文件拥有者
第4个字段:文件拥有者所在的主组
第5个字段:文件大小(以字节为单位),如果是文件夹,则只表示该文件夹的大小,不包括它所包含的文件的大小,文件夹是一个特殊的文件,因为linux下一切皆文件

Linux一切皆文件

  • -:代表是一个普通文件
  • d:代表是一个目录,目录文件包含了此目录中各个文件的文件名以及指向这些文件的指针
  • l:代表是一个链接文件,如快捷方式类似的
  • b:块设备文件,一般在/dev文件夹下,是普通文件和程序访问硬件设备的入口,没有大小,与硬盘、光盘等相关,只有一个主设备号和一个辅设备号,一次传输数据为一整块的成为块设备
  • c:字符设备文件,置于/dev下,没有大小,与键盘等相关,依次传输一个字节的设备成为字符设备
  • p:命令管道文件,与shell编程有关,用于进程间通信
  • s:socket文件,与shell编程有关,用于进程间的网络通信

2
VFS向上,对应用层提供一个标准的文件操作接口;对下,对文件系统提供一个标准的接口,以便其他操作系统的文件系统可以方便的移植到Linux上;
General Block Device Layer隐藏不同硬件设备细节,为内核提供统一的IO操作接口

第6个字段:文件/目录最近访问/修改的时间
第7个字段:文件名,若为链接文件(即软链接)则追加显示其链接的原文件的路径,用->追加

chmod

ls -l我们看到一个文件的权限是针对三类群体的:文件拥有者;文件所在组的其他用户;其他用户
而chmod是用来修改文件权限的,使用权限为文件拥有者和root
在这里上述三类群体被表示为ugo
u - 文件拥有者
g - 文件所在组的其他成员
o - 其他成员
a - 所有人
使用+ -来增加和撤销权利(r w x)
比如chmod ugo+r file.txt或者chmod ug+w,o-w file1.txt file2.txt
还有其他参数:
-R:对目前目录下的所有文件与子目录进行相同的权限变更
还可以用数字表示
r=4 w=2 x=1
对于某一类用户,就将他所拥有的权限的值加起来,按文件拥有者;文件所在组的其他用户;其他用户顺序连在一起
比如:chmod 777 file.txt
那如何设置SUID、SGID、SBIT呢?SUID:4;SGID:2;SBIT:1
在之前的例如777前面增加一位即可
chmod 4777 testSUID
chmod u+s testSUID
chmod g+srw testSGID
chmod o+t testSBIT

real userId;effective userId;saved set-userId

linux在创建进程时会给其分配三个用户Id:分别是real userId;effective userId;saved set-userId
real userId:该进程是哪个用户调用的,就是那个用户的user Id
effective userId:判定该进程是否对于某个文件有权限,就得参考该Id,我们之前所说的SUID和SGID的作用就在这,当某一个程序被设置了SUID或者SGID后,该程序的effective userId就是该程序拥有者的id,比如su、/usr/bin/passwd的effective userId就是root;如果没有设置SUID或SGID,那就是调用程序的用户Id
那还有一个saved set-userId这个是干啥的呢?
暂存用户ID(Saved UID,即SUID)用以提升权限运行的进程暂时需要做一些不需特权的操作时使用,这种情况下进程会暂时将自己的effective userId从特权用户(常为root)对应的UID变为某个非特权用户对应的UID,而后将原有的特权用户UID复制为SUID暂存;之后当进程完成不需特权的操作后,进程使用SUID的值重置EUID以重新获得特权。在这里需要说明的是,无特权进程的EUID值只能设为与RUID、SUID与EUID(也即不改变)之一相同的值。
这个作用给人的感觉就是给effective userId增加更多的设置选项。