使用者与群组

  • 使用者的意义:由于王家三人各自拥有自己的房间,所以,王二毛虽然可以进入王三毛的房间,但是二毛不能翻三毛的抽屉喔!那样会被三毛K的!因为抽屉里面可能有三毛自己私人的东西,例如情书啦,日记啦等等的,这是『私人的空间』,所以当然不能让二毛拿啰!
  • 群组的概念:由于共同拥有客厅,所以王家三兄弟可以在客厅打开电视机啦、翻阅报纸啦、坐在沙发上面发呆啦等等的!反正,只要是在客厅的玩意儿,三兄弟都可以使用喔!因为大家都是一家人嘛!

    那个『王大毛家』就是所谓的『群组』啰; 至于三兄弟就是分别为三个『使用者』,而这三个使用者是在同一个群组里面的喔!


  • 其他人的概念:

在Linux里面,任何一个文件都具有『User, Group及Others』三种身份的个别权限,我们可以将上面的说明以底下的图示来解释:
Linux文件的权限 - 图1
我们以王三毛为例,王三毛这个『文件』的拥有者为王三毛,他属于王大毛这个群组,而张小猪相对于王三毛,则只是一个『其他人(others) 』而已。
不过,这里有个特殊的人物要来介绍的,那就是『万能的天神』!这个天神具有无限的神力,所以他可以到达任何他想要去的地方,呵呵!那个人在Linux系统中的身份代号是『 root 』啦!所以要小心喔!那个root可是『万能的天神』喔!

Linux 文件权限概念

Linux文件属性

su - :切换位root身份;

Linux文件的权限 - 图2
文件属性的示意图

图5.2.1、文件属性的示意图

  • 第一栏代表这个文件的类型与权限(permission):

你应该可以发现这一栏其实共有十个字元:
Linux文件的权限 - 图3
图5.2.2、文件的类型与权限之内容

  • 第一个字元代表这个文件是『目录、文件或连结档等等』:
    • 当为[ d ]则是目录,例如上表档名为『.config』的那一行;
    • 当为[ - ]则是文件,例如上表档名为『initial-setup-ks.cfg』那一行;
    • 若是[ l ]则表示为连结档(link file);
    • 若是[ b ]则表示为装置档里面的可供储存的周边设备(可随机存取装置);
    • 若是[ c ]则表示为装置档里面的序列埠设备,例如键盘、滑鼠(一次性读取装置)。
  • 接下来的字元中,以三个为一组,且均为『rwx』的三个参数的组合。其中,[ r ]代表可读(read)、[ w ]代表可写(write)、[ x ]代表可执行(execute)。要注意的是,这三个权限的位置不会改变,如果没有权限,就会出现减号[ - ]而已。
    • 第一组为『文件拥有者可具备的权限』,以『initial-setup-ks.cfg』那个文件为例,该文件的拥有者可以读写,但不可执行;
    • 第二组为『加入此群组之帐号的权限』;
    • 第三组为『非本人且没有加入本群组之其他帐号的权限』。
  • 第二栏:表示有多少档名连结到此节点(i-node):

每个文件都会将他的权限与属性记录到文件系统的i-node中,不过,我们使用的目录树却是使用文件名来记录,因此每个文件名就会连结到一个i-node啰!这个属性记录的,就是有多少不同的文件名连结到相同的一个i-node号码去就是了。关于i-node的相关资料我们会在第七章谈到文件系统时再加强介绍的。

  • 第三栏:表示这个文件(或目录)的『拥有者帐号』

**

  • 第四栏:表示这个文件的所属群组

**

  • 第五栏:为这个文件的容量大小,**预设单位为bytes**;

**

  • 第六栏:为这个文件的创建日期或者是最近的修改日期;

**

  • 第七栏:为这个文件的文件名

**

改变文件属性/权限

  • chgrp :改变文件所属群组
  • chown :改变文件拥有者
  • chmod :改变文件的权限, SUID, SGID, SBIT等等的特性

**

改变文件权限

image.png

文件属性

元件 内容 叠代物件 r w x
文件 详细资料data 文件数据夹 读到文件内容 修改文件内容 执行文件内容
目录 文件名 可分类抽屉 读到档名 修改档名 进入该目录的权限(key)

image.png

那个r, w, x对目录是什么意义呢?

  • r (read contents in directory)
    表示具有读取目录结构清单的权限,所以当你具有读取(r)一个目录的权限时,表示你可以查询该目录下的档名资料。所以你就可以利用ls这个指令将该目录的内容列表显示出来!

  • w (modify contents of directory):这个可写入的权限对目录来说,是很了不起的! 因为他表示你具有异动该目录结构清单的权限,也就是底下这些权限:
    • 建立新的文件与目录;
    • 删除已经存在的文件与目录(不论该文件的权限为何!)
    • 将已存在的文件或目录进行更名;
    • 搬移该目录内的文件、目录位置。

总之,目录的w权限就与该目录底下的文件名异动有关就对了啦!

  • x (access directory)
    咦!目录的执行权限有啥用途啊?目录只是记录文件名而已,总不能拿来执行吧?没错!目录不可以被执行,目录的x代表的是使用者能否进入该目录成为工作目录的用途!所谓的工作目录(work directory)就是你目前所在的目录啦!举例来说,当你登入Linux时,你所在的家目录就是你当下的工作目录。而变换目录的指令是『cd』(change directory)啰!

文件与目录的默认权限与隐藏权限

除了基本r, w, x权限外,在Linux传统的Ext2/Ext3/Ext4文件系统下,我们还可以设定其他的系统隐藏属性,这部份可使用chattr来设定,而以lsattr 来查看,最重要的属性就是可以设定其不可修改的特性

让连文件的拥有者都不能进行修改!这个属性可是相当重要的,尤其是在安全机制上面(security)!

比较可惜的是,在CentOS 7.x当中利用xfs作为预设文件系统,但是xfs就没有支援所有的chattr的参数了!仅有部份参数还有支援而已!

文件默认权限:umask

umask就是指定『目前使用者在建立文件或目录时候的权限预设值』
image.png

[root@study ~]# umask #查阅方式一:直接输入umask , 就可以看到数字型态的权限设定分数
0022 <==与一般权限有关的是后面三个数字!
[root@study ~]# umask -S #查阅方式二:umask -S,就会以符号类型的方式来显示出权限了
u=rwx,g=rx,o=rx

默认情况下:

  • 若使用者建立为『文件』则预设『没有可执行( x )权限』,亦即只有rw这两个项目,也就是最大为666分,预设权限如下:
    -rw-rw-rw-
  • 若使用者建立为『目录』,则由于x与是否可以进入此目录有关,因此预设为所有权限均开放,亦即为777分,预设权限如下:
    drwxrwxrwx

**

文件隐藏属性

chattr指令只能在Ext2/Ext3/Ext4的Linux传统档案系统上面完整生效,其他的档案系统可能就无法完整的支援这个指令了,例如xfs仅支援部份参数而已。

image.png

  • chattr (设定档案隐藏属性) | [root@study ~]# chattr [+-=][ASacdistu]档案或目录名称
    选项与参数:
    + :增加某一个特殊参数,其他原本存在参数则不动。
    - :移除某一个特殊参数,其他原本存在参数则不动。
    = :设定一定,且仅有后面接的参数

    A :当设定了A 这个属性时,若你有存取此档案(或目录)时,他的存取时间atime 将不会被修改,
    可避免I/O 较慢的机器过度的存取磁碟。(目前建议使用档案系统挂载参数处理这个项目)
    S :一般档案是非同步写入磁碟的(原理请参考前一章sync的说明),如果加上S这个属性时,
    当你进行任何档案的修改,该更动会『同步』写入磁碟中。
    a :当设定a 之后,这个档案将只能增加资料,而不能删除也不能修改资料,只有root 才能设定这属性
    c :这个属性设定之后,将会自动的将此档案『压缩』,在读取的时候将会自动解压缩,
    但是在储存的时候,将会先进行压缩后再储存(看来对于大档案似乎蛮有用的!)
    d :当dump 程序被执行的时候,设定d 属性将可使该档案(或目录)不会被dump 备份
    i :这个i 可就很厉害了!他可以让一个档案『不能被删除、改名、设定连结也无法写入或新增资料!』
    对于系统安全性有相当大的助益!只有root 能设定此属性
    s :当档案设定了s 属性时,如果这个档案被删除,他将会被完全的移除出这个硬碟空间,
    所以如果误删了,完全无法救回来了喔!
    u :与s 相反的,当使用u 来设定档案时,如果该档案被删除了,则资料内容其实还存在磁碟中,
    可以使用来救援该档案喔!
    注意1:属性设定常见的是a 与i 的设定值,而且很多设定值必须要身为root 才能设定
    注意2:xfs 档案系统仅支援AadiS 而已 | | —- |

**

  • lsattr (显示文件隐藏属性) | [root@study ~]# lsattr [-adR]档案或目录
    选项与参数:
    -a :将隐藏档的属性也秀出来;
    -d :如果接的是目录,仅列出目录本身的属性而非目录内的档名;
    -R :连同子目录的资料也一并列出来! | | —- |

**

文件的特殊权限

SUID

image.png
SUID的权限对于一个文件的特殊功能是什么呢?基本上SUID有这样的限制与功能:

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

**

SGID

image.png
与SUID 不同的是,SGID 可以针对档案或目录来设定!如果是对档案来说, SGID 有如下的功能:

  • SGID 对二进制程序有用;
  • 程序执行者对于该程式来说,需具备x 的权限;
  • 执行者在执行的过程中将会获得该程序群组的支援!

**

SBIT

image.png
SBIT 目前只针对目录有效,对于档案已经没有效果了。SBIT 对于目录的作用是:

  • 当使用者对于此目录具有w, x 权限,亦即具有写入的权限时;
  • 当使用者在该目录下建立档案或目录时,仅能由自己与root 才有权力删除该档案

换句话说:当甲这个使用者于A目录是具有群组或其他人的身份,并且拥有该目录w的权限,这表示『甲使用者对该目录内任何人建立的目录或档案均可进行”删除/更名/搬移”等动作。』不过,如果将A目录加上了SBIT的权限项目时,则甲只能够针对自己建立的档案或目录进行删除/更名/移动等动作,而无法删除他人的档案。


SUID/SGID/SBIT 权限设置

image.png
前面介绍过SUID与SGID的功能,那么如何设定档案使成为具有SUID与SGID的权限呢?这就需要第五章的数字更改权限的方法了!现在你应该已经知道数字型态更改权限的方式为『三个数字』的组合,那么如果在这三个数字**之前**再加上一个数字的话,最前面的那个数字就代表这几个权限了!

  • 4 为SUID
  • 2 为SGID
  • 1 为SBIT


例子:**

[root@study ~]# cd /tmp
[root@study tmp]# touch test <==建立一个测试用空档
[root@study tmp]# chmod 4755 test; ls -l test <==加入具有SUID的权限 #中间分号表示两个指令的分隔符
-rw s r-xr-x 1 root root 0 Jun 16 02:53 test
[root@study tmp]# chmod 6755 test; ls -l test <==加入具有SUID/SGID的权限
-rw s r- s r-x 1 root root 0 Jun 16 02:53 test
[root@study tmp]# chmod 1755 test; ls -l test <==加入SBIT的功能!
-rwxr-xr- t 1 root root 0 Jun 16 02:53 test
[root@study tmp]# chmod 7666 test; ls -l test <==具有空的SUID/SGID权限
-rw S rw S rw T 1 root root 0 Jun 16 02:53 test

Linux文件种类&扩展名

文件种类

  • 正规文件(regular file ):就是一般我们在进行存取的类型的文件,在由ls -al所显示出来的属性方面,第一个字元为[ - ],例如[-rwxrwxrwx ]。另外,依照文件的内容,又大略可以分为:

    • 纯文字档(ASCII):这是Linux系统中最多的一种文件类型啰,称为纯文字档是因为内容为我们人类可以直接读到的资料,例如数字、字母等等。几乎只要我们可以用来做为设定的文件都属于这一种文件类型。举例来说,你可以下达『 cat ~/.bashrc 』就可以看到该文件的内容。(cat是将一个文件内容读出来的指令)
    • 二进制文件(binary):还记得我们在『 第零章、计算机概论』里面的软体程式的运作中提过,我们的系统其实仅认识且可以执行二进制文件(binary file)吧?你的Linux当中的可执行文件(scripts,文字体批处理文件)就是这种格式的啦~举例来说,刚刚下达的指令cat就是一个binary file。
    • 数据格式文件(data):有些程序在运作的过程当中会读取某些特定格式的文件,那些特定格式的文件可以被称为数据文件(data file)。举例来说,我们的Linux在使用者登入时,都会将登录的资料记录在/var/log/wtmp那个文件内,该文件是一个data file,他能够透过last这个指令读出来!但是使用cat时,会读出乱码~因为他是属于一种特殊格式的文件。了乎?
  • 目录(directory)
    就是目录啰~第一个属性为[ d ],例如[drwxrwxrwx]。

  • 连结档(link)
    就是类似Windows系统底下的快捷方式啦!第一个属性为 l ,例如[lrwxrwxrwx] ;

  • 设备与设备文件(device):与系统周边及储存等相关的一些文件,通常都集中在/dev这个目录之下!通常又分为两种:

    • 区块(block)设备档:就是一些储存资料,以提供系统随机存取的周边设备,举例来说,硬盘与软盘等就是啦!你可以随机的在硬碟的不同区块读写,这种装置就是区块装置啰!你可以自行查一下/dev/sda看看,会发现第一个属性为[ b ]喔!
    • 字元(character)设备档:亦即是一些序列埠的周边设备,例如键盘、滑鼠等等!这些设备的特色就是『一次性读取』的,不能够截断输出。举例来说,你不可能让滑鼠『跳到』另一个画面,而是『连续性滑动』到另一个地方啊!第一个属性为[ c ]。
  • 数据接口文件(sockets)
    既然被称为资料接口档,想当然尔,这种类型的文件通常被用在网路上的资料承接了。我们可以启动一个程式来监听用户端的要求,而用户端就可以透过这个socket来进行资料的沟通了。第一个属性为[ s ],最常在/run或/tmp这些个目录中看到这种文件类型了。

  • 数据输送档(FIFO, pipe)
    FIFO也是一种特殊的文件类型,他主要的目的在解决多个程序同时存取一个文件所造成的错误问题。FIFO是first-in-first-out的缩写。第一个属性为[p]

文件扩展名

Linux的文件是没有所谓的『扩展名』的,我们刚刚就谈过,一个Linux文件能不能被执行,与他的第一栏的十个属性有关,与文件名根本一点关系也没有。

这个观念跟Windows的情况不相同喔! 在Windows底下,能被执行的文件副档名通常是.com .exe .bat等等,而在Linux底下,只要你的权限当中具有x的话,例如[ -rwxr-xr-x ]即代表这个文件具有可以被执行的能力喔!


🚨注意:
具有“可执行的权限”以及“具有可执行的程序码”是两回事!在 Linux 下面,你可以让一个文本文件,例如我们之前写的 text.txt 具 有“可执行的权限” (加入 x 权限即可), 但是这个文件明显的无法执行,因为他不具备可执行的程序码!而如果你将上面提到的 cat 这个可以执行的指令,将他的 x 拿掉,那么 cat 将无法被你执行!

:你可以对文件修改其权限,让它变为可执行的但是真正能否执行,还要看这个文件本身是不是属于执行类的。