目录

Linux 文件权限系统探究

摘要

Linux 是一个是一个基于 POSIX 和 UNIX 的多用户、多任务、支持多线程和多 CPU 的操作系统。 多用户的设计让系统变得高效而安全,而在各种领域的应用也越来越广泛。 Linux 的核心思想之一便是认为一切皆为文件,本文从 Linux 文件的概念出发,探讨了 Linux 文件权限设计以及其在系统安全上的重要意义。

1. Linux 下文件的概念

Linux 的基本思想之一就是一切皆为文件,通过不同的文件种类和属性来描述数据,程序或者设备。

1.1 Linux 文件种类与扩展名

Linux 中有六种文件类型,注意文件类型并不是 Windows 中文件格式的概念。

  1. 正规文件 (regular file): 就是一般我们在进行存取的类型的文件,依照文件的内容,又大略可以分为:
    • 纯文本文件 (ASCII):Linux 系统中最多的一种文件类型,其内容为我们人类可以直接读到的数据,例如数字、字母等等。
    • 二进制文件 (binary):包含在 ASCII 及扩展 ASCII 字符中编写的数据或程序指令的文件。
    • 数据格式文件 (data):有些程序在运作的过程当中会读取某些特定格式的文件,那些特定格式的文件可以被称为数据文件 (data file)。
  2. 目录 (directory)
  3. 连结文件 (link):类似 Windows 系统中的快捷方式,用于指向某个文件。
  4. 设备与装置文件 (device):与系统周边及储存等相关的一些文件,通常都集中在 /dev 这个目录之下。通常又分为两种:
    • 区块 (block) 设备文件:数据储存,以提供系统随机存取的接口设备,例如硬盘与软 盘。
    • 字符 (character) 设备文件:一些串行端口的接口设备,例如键盘、鼠标等。
  5. 数据接口文件 (sockets):用于网络上的数据承接。
  6. 数据输送文件 (FIFO,pipe):FIFO 是 first-in-first-out 的缩写。主要的目的在解决多个程序同时存取一个文件所造成的错误问题。

文件对应的类型通过以下符号来进行表示:

文件类型类型符号
正规文件 (regular file)-
目录 (directory)d
连结文件 (link)l
区块 (block) 设备文件b
字符 (character) 设备文件c
数据接口文件 (sockets)s
数据输送文件 (FIFO,pipe)p

2. Linux 文件权限概念

Linux 文件权限设计简洁而又实用,对于每个授权对象,基本的权限属性有 r , w , x ,还有一些不常见的隐藏属性或权限。

2.1 使用者与群组

Linux 文件针对的授权对象有三种类型,分为文件拥有者(Owner),群组(Group)与其他(Other)。

2.2 权限对文件的重要性

文件是实际含有数据的地方,包括一般文本文件、数据库内容文件、二进制可执行文件(binary program) 等等。 因此,权限对于文件来说,他的意义是这样的:

  • r (read):可读取此一文件的实际内容,如读取文本文件的文字内容等;
  • w (write):可以编辑、新增或者是修改该文件的内容 (但不含删除该文件);
  • x (execute):该文件具有可以被系统执行的权限。

需要注意的是,在 Windows 中一个文件是否具有执行的能力是由 “文件扩展名” 来判断的,例如:.exe, .bat, .com 等等, 但是在 Linux 中,文件能否被执行,则是由是否具有 x 这个权限来决定的,与文件名没有绝对的关系。

而对于 w 权限,当拥有 w 权限时,权限拥有者可以对文件的内容进行写入/编辑/新增/修改操作,但并不具备有删除该文件本身的权限。 也就是说文件权限,主要都是针对 “文件的内容” 而言的,与文件档名的存在与否没有关系。

2.3 权限对目录的重要性

目录主要的内容在记录文件名列表,文件名与目录有强烈的关联。

  • r (read contents in directory):表示具有读取目录结构列表的权限
  • w (modify contents of directory):表示具有修改目录结构列表的权限,例如:
    • 建立新的文件与目录;
    • 删除已经存在的文件与目录 (不论该文件的权限为何!)
    • 将已存在的文件或目录进行更名;
    • 搬移该目录内的文件、目录位置。
  • x (access directory):代表的是用户能否进入该目录成为工作目录。

3. 文件与目录的默认权限

在 Linux 中,root 用户登录系统建立文件和目录的访问权限分别为 644755; 普通用户登陆,建立文件和目录的访问权限分别为 664775, 两类两类用户建立的文件和目录访问权限不同,与 Linux 的权限掩码有关。

为了提高文件系统的安全性, 方便用户权限设置, Linux 设置了权限掩码(umask), root 用户和普通用户登录系统,权限掩码默认分别为 022002。 在不考虑权限掩码的情况下,Linux 约定新建文件和目录的权限为 666777,称为 “约定权限”。

在系统给定权限掩码的情况下, 新建文件和目录的访问权限为文件和目录的约定权限与权限掩码值取反后作逻辑与运算, 得到文件和 目录的访问权限。

4. 文件隐藏属性

Linux 文件的隐藏属性更多的是提供一些功能上的支持,但是合适地配置这些属性能极大地提高系统的安全性。

  • A :当配置了 A 这个属性时,若你有存取此文件 (或目录) 时,他的存取时间 atime 将不会被修改,可避免 I/O 较慢的机器过度的存取磁碟。这对速度较慢的计算机有帮助。
  • S :一般文件是非同步写入磁碟的,如果加上 S 这个属性时,当你进行任何文件的修改,该更动会『同步』写入磁碟中。
  • a :当配置 a 之后,这个文件将只能添加数据,而不能删除也不能修改数据,只有 root 才能配置这个属性。
  • c :这个属性配置之后,将会自动的将此文件『压缩』,在读取的时候将会自动解压缩,但是在储存的时候,将会先进行压缩后再储存。
  • d :当 dump 程序被运行的时候,配置 d 属性将可使该文件 (或目录) 不会被 dump 备份。
  • i :让一个文件不能被删除、改名、配置连结也无法写入或新增数据,只有 root 能配置此属性。
  • s :当文件配置了 s 属性时,如果这个文件被删除,将会被完全的移除出这个硬盘空间。
  • u :与 s 相反,当使用 u 来配置文件时,如果该文件被删除,则数据内容其实还存在磁碟中。

5. 文件特殊权限: SUID, SGID, SBIT

Linux 文件的特殊权限能够解决一些特殊的文件操作场景中遇到的问题,例如使用 passwd 程序修改用户密码时的权限问题。 一般情况下并不需要对文件设置这些特殊权限。

Set UID

s 这个标志出现在文件拥有者的 x 权限上时,此时就被称为 Set UID ,简称为 SUID 的特殊权限。 SUID 有这样的限制与功能:

  • SUID 权限仅对二进位程序 (binary program) 有效;
  • 运行者对於该程序需要具有 x 的可运行权限;
  • 本权限仅在运行该程序的过程中有效 (run-time);
  • 运行者将具有该程序拥有者 (owner) 的权限。

Set GID

s 标志在群组的 x 时则称为 Set GID , 简称为 SGID 。与 SUID 不同的是, SGID 可以针对文件或目录来配置。 如果是对文件来说, SGID 有如下的功能:

  • SGID 对二进位程序有用;
  • 程序运行者对於该程序来说,需具备 x 的权限;
  • 运行者在运行的过程中将会获得该程序群组的支持。

当一个目录配置了 SGID 的权限后,他将具有如下的功能:

  • 使用者若对于此目录具有 rx 的权限时,该使用者能够进入此目录;
  • 使用者在此目录下的有效群组 (effective group) 将会变成该目录的群组;

用途:若使用者在此目录下具有 w 的权限 (可以新建文件),则使用者所创建的新文件,该新文件的群组与此目录的群组相同。

Sticky Bit

Sticky Bit 简称 SBIT ,目前只针对目录有效其作用是:

  • 当使用者对于此目录具有 w , x 权限,也就是具有写入的权限时;
  • 当使用者在该目录下创建文件或目录时,仅有自己与 root 才有权力删除该文件。

6. 总结

Linux 将一切视为文件的思想与其简洁实用的权限设计,搭配上用户角色与群组系统,使整个系统的安全性大大的提升,同时也让它成为了优秀的多用户多任务系统,通过对 Linux 文件权限的设计,能够加深我们对系统安全的理解。