Linux--文件权限

1 、文件类型
Linux 广泛的被很多用户所接受,它强大的功能受到很多人喜欢, Linux 文件一般是用一些相关的应
用程序创建,比如图像工具、文档工具、归档工具 ... .... cp 工具等。 Linux 文件的删除方式是用 rm
令。
Linux 文件类型和 Linux 文件的文件名所代表的意义是两个不同的概念。我们通过一般应用程序而创建的
比如 file.txt file.tar.gz ,这些文件虽然要用不同的程序来打开,但放在 Linux 文件类型中衡量的话,大
多是常规文件(也被称为普通文件)。
Linux 文件类型常见的有:普通文件、目录、字符设备文件、块设备文件、符号链接文件等;现在我们
进行一个简要的说明;
1 普通文件
1. [root@localhost ~]# ls -lh install.log
2. -rw-r--r-- 1 root root 53K 03-16 08:54 install.log
我 们用 ls -lh 来查看某个文件的属性,可以看到有类似 -rw-r--r-- ,值得注意的是第一个符号是 -
这样的文件在 Linux 中就是普通文件。这些文件一般是用一些相关的应用程序创建,比如图像工具、文
档工具、归档工具 ... .... cp 工具等。这类文件的删除方式是用 rm 命令;
2 目录
1. [root@localhost ~]# ls -lh
2. 总计 14M
3. -rw-r--r-- 1 root root 2 03-27 02:00 fonts.scale
4. -rw-r--r-- 1 root root 53K 03-16 08:54 install.log
5. -rw-r--r-- 1 root root 14M 03-16 07:53 kernel-6.15-1.2025_FC5.i686.rpm
6. drwxr-xr-x 2 1000 users 4.0K 04-04 23:30 mkuml-2004.07.17
7. drwxr-xr-x 2 root root 4.0K 04-19 10:53 mydir
8. drwxr-xr-x 2 root root 4.0K 03-17 04:25 Public
当 我们在某个目录下执行,看到有类似 drwxr-xr-x ,这样的文件就是目录,目录在 Linux 是一个比较
特殊的文件。注意它的第一个字符是 d 。创建目录的命令可以用 mkdir 命令,或 cp 命令, cp 可以把一
个目录复制为另一个目录。删除用 rm rmdir 命令。
3 字符设备或块设备文件 如时您进入 /dev 目录,列一下文件,会看到类似如下的;
1. [root@localhost ~]# ls -la /dev/tty
2. crw-rw-rw- 1 root tty 5, 0 04-19 08:29 /dev/tty
3. [root@localhost ~]# ls -la /dev/hda1
4. brw-r----- 1 root disk 3, 1 2006-04-19 /dev/hda1
我们看到 /dev/tty 的属性是 crw-rw-rw- ,注意前面第一个字符是 c ,这表示字符设备文件。比如猫等
串口设备
我们看到 /dev/hda1 的属性是 brw-r----- ,注意前面的第一个字符是 b ,这表示块设备,比如硬盘,光
驱等设备;
这个种类的文件,是用 mknode 来创建,用 rm 来删除。目前在最新的 Linux 发行版本中,我们一般不
用自己来创建设备文件。因为这些文件是和内核相关联的。
4 套接口文件
当我们启动 MySQL 服务器时,会产生一个 mysql.sock 的文件。
1. [root@localhost ~]# ls -lh /var/lib/mysql/mysql.sock
2. srwxrwxrwx 1 mysql mysql 0 04-19 11:12 /var/lib/mysql/mysql.sock
注意这个文件的属性的第一个字符是 s 。我们了解一下就行了。
5 符号链接文件
1. [root@localhost ~]# ls -lh setup.log
2. lrwxrwxrwx 1 root root 11 04-19 11:18 setup.log - > install.log
当我们查看文件属性时,会看到有类似 lrwxrwxrwx, 注意第一个字符是 l ,这类文件是链接文件。是通过
ln -s 源文件名 新文件名。上面是一个例子,表示 setup.log install.log 的软链接文件。怎么理解呢?
这和 Windows 操作系统中的快捷方式有点相似。
符号链接文件的创建方法举例;
1. [root@localhost ~]# ls -lh kernel-6.15-1.2025_FC5.i686.rpm
2. -rw-r--r-- 1 root root 14M 03-16 07:53 kernel-6.15-1.2025_FC5.i686.rpm
3. [root@localhost ~]# ln -s kernel-6.15-1.2025_FC5.i686.rpm kernel.rpm
4. [root@localhost ~]# ls -lh kernel*
5. -rw-r--r-- 1 root root 14M 03-16 07:53 kernel-6.15-1.2025_FC5.i686.rpm
6. lrwxrwxrwx 1 root root 33 04-19 11:27 kernel.rpm - > kernel-6.15-1.2025_FC5
2 、文件权限
Linux 系统是一个典型的多用户系统,不同的用户处于不同的地位。为了保护系统的安全性, Linux
系统对不同用户访问同一文件的权限做了不同的规定。
对于一个 Linux 系统中的文件来说,它的权限可以分为三种:读的权限、写的权限和执行的权限,
分别用 r w x 表示。不同的用户具有不同的读、写和执行的权限。
对于一个文件来说,它都有一个特定的所有者,也就是对文件具有所有权的用户。同时,由于在
Linux 系统中,用户是按组分类的,一个用户属于一个或多个组。文件所有者以外的用户又可以分为文
件所有者的同组用户和其它用户。因此, Linux 系统按文件所有者、文件所有者同组用户和其它用户三
类规定不同的文件访问权限。
权限的概念
Linux 文件系统安全模型是通过给系统中的文件赋予两个属性来起作用的,这两个赋予每个文件的
属性称为所有者 (ownership) 和访问权限 (access rights) Linux 下的每一个文件必须严格地属于一个用户和
一个组。
下图是在我机器上的 /root 目录下运行 ls -l 命令的情况。 -rw-r--r--
这些符号用来描述文件的访问权限类别,也就是常说的文件权限。这些访问权限指导 Linux 根据文
件的用户和组所有权来处理所有访问文件的用户请求。总共有 10 种权限属性,因此一个权限列表总是
10 个字符的长度。它的格式遵循下列规则:
◆ 第 1 个字符表示一种特殊的文件类型。其中字符可为 d( 表示该文件是一个目录 ) b( 表示该文件
是一个系统设备,使用块输入 / 输出与外界交互,通常为一个磁盘 ) c( 表示该文件是一个系统设备,使
用连续的字符输入 / 输出与外界交互,如串口和声音设备 ) ,“ . ”表示该文件是一个普通文件,没有特殊
属性。
2 4 个字符用来确定文件的用户 (user) 权限, 5 7 个字符用来确定文件的组 (group) 权限, 8 10
个字符用来确定文件的其它用户 (other user ,既不是文件所有者,也不是组成员的用户 ) 的权限。其中,
2 5 8 个字符是用来控制文件的读权限的,该位字符为 r 表示允许用户、组成员或其它人可从该文件
中读取数据。短线“ - ”则表示不允许该成员读取数据。与此类似, 3 6 9 位的字符控制文件的写权
限,该位若为 w 表示允许写,若为“ - ”表示不允许写。 4 7 10 位的字符用来控制文件的制造权限,
该位若为 x 表示允许执行,若为“ - ”表示不允许执行。
任何列在 /etc/passwd 文件中的用户都可以是一个文件的所有者,也称为该文件的用户。同样任何
列在 /etc/group 文件中的组都可以是文件组的所有者,也简称为文件的组。
drwxrwxr-- 2 root root 4096 2 11 10:36 guo
因为 guo 的第 1 个位置的字符是 d ,所以由此知道 guo 是一个目录。第 2 4 位置上的属性是 rwx
表示用户 root 拥有权限列表显示 guo 中所有的文件、创建新文件或者删除 guo 中现有的文件,或者将
guo 作为当前工作目录。第 5 7 个位置上的权限是 rwx ,表示 root 组的成员拥有和 root 一样的权限。
8 10 位上的权限仅是 r-- ,表示不是 root 的用户及不属于 root 组的成员只有对 guo 目录列表的权
限。这些用户不能创建或者删除 guo 中的文件、执行 junk 中的可执行文件,或者将 junk 作为他们的当
前工作目录。
-rwxr-xr-- 1 user admin 20480 11 11 09:23 Readme.txt
在该项中,第 1 个位置是短线“ - ”,表示该文件是一个普通文件,没有特殊属性。该文件对任何人
都可读,只对 user 可写, user admin 的组成员可以执行该文件。
另外需要注意的是,当用户访问一个文件时,权限检查是从左到右的。假设上述的 readme.txt 文件
具有以下权限:
-r--rw-r--
那么即使 user 是属于 admin 组的一个成员,也不能对该文件进行写操作,因为已经被左边的写权
限设置拒绝了。
一般文件权限读( R ),写 (W) ,执行( X )权限比较简单。一般材料上面都
有介绍。这里介绍一下一些特殊的文件权限 ——SUID SGID Stick bit
如果你检查一下 /usr/bin/passwd /tmp/ 的文件权限你就会发现和普 通的文件权限有少许不同,如下图所示:
这里就涉及到 SUID Stick bit
SUID SGID
我们首先来谈一下 passwd 程序特殊的地方。大家都知道, Linux 把用户的密码信息存放
/etc/shadow 里面,该文件属性如下:
可以看到 Shadow
的只有所有者可读写,所有者是 root ,所以该文件对普通用户是不可读写的。但是普通用户调
passwd 程序是可以修改自己的密码的,这又是为什么呢?难道普通用户可以读写 shadow
文件?难道 Linux 有漏洞?当然不是啦。 password 可以修改 shadow 文件的原因是他设置了
SUID 文件权限。
SUID 文件权限作用于可执行文件。一般的可执行文件在执行期的所有者是当前用户,比
如当前系统用户是 simon simon 运行程序 a.out a.out 执行期的所有者应该是 simon 。但是
如果我们给可执行文件设置了 SUID 权限,则该程序的执行期所有者,就是该文件所有者。还
以 前面的 a.out 为例,假如 a.out 设置了 SUID ,并且其所有者是 root ,系统当前用户是 simon
simon 运行 a.out 的时 候, a.out 在运行期的所有者就是 root ,这时 a.out 可以存取只有 root
权限才能存取的资源,比如读写 shadow 文件。当 a.out 执行结束 的时候当前用户的权限又回
到了 simon 的权限了。
passwd 就是设置了 SUID 权限,并且 passwd 的所有者是 root ,所以所有的用户都可以
执行他,在 passwd 运行期,程序获得临时的 root 权限,这时其可以存取 shadow 文件。当 passwd
运行完成,当前用户又回到普通权限。
同理,设置程序的 SGID ,可以使程序运行期可以临时获得所有者组的权限。在团队开发
的时候,这个文件权限比较有用,一般系统用 SUID 比较多。
SGID 可以用于目录,当目录设置了 SGID 之后,在该目录下面建立的所有文件和目录都
具有和该目录相同的用户组。
Stick bit( 粘贴位 )
对程序,该权限告诉系统在程序完成后在内存中保存一份运行程序的备份,如该程序常
用,可为系统节省点时间,不用每次从磁盘加载到内存。 Linux 当前对文件没有实现这个功能,
一些其他的 UNIX 系统实现了这个功能。
Stick bit 可以作用于目录,在设置了粘贴位的目录下面的文件和目录,只有所有者和 root
可以删除他。现在我们可以回头去看看 /tmp/ 目录的情况,这个目录 设置了粘贴位。所以说,
并且所有人都可以对该目录读写执行( 777 ),这样意味着所有人都可以在 /tmp/ 下面创建临时 目录。因为设置 Stick bit 只有所有者和 root 才能删除目录。这样普通用户只能删除属于自己
的文件,而不能删除其他人的文件。如下图所示:
设置 SUID SGID Stick bit
前面介绍过 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 ”来设置。
SUID 也可以用 “chmod u+s filename ”来设置, “chmod u-s filename ”来取消 SUID
置;同样, SGID 可以用 “chmod g+s filename ”, “chmod g-s filename ”来取消 SGID 设置。
一般来说,使用过 Linux 的同学都知道,Linux 文件的权限有 rwx,所有者、所有组、其它用户的 rwx 权限
是彼此独立的。为此,经常会听到如果某个 web 文件需要被修改的话,需要加上 777 的权限,这就是让所有
用户可写。
但仔细一想,这样的权限未免有些想得比较天真,没有考滤特殊情况。例如/tmp 目录默认权限是 777,
而且有些文件也是允许所有用户访问修改的,那么是不 是任何一个用户都可以将这些删除呢?再如
/etc/shadow 保存的是用户密码文件,默认情况下它的权限是 640,那么只有 shadow 的 owner(root)才能修
改它,按照常规理解,这是不可理解的,因为每个用户都可能修改密码,也就是会修改这个文件。
为了把这些情况解释清楚,需要引入 Linux 特殊文件权限的概念。Linux 特殊文件权限有三个玩意:
sticky bit、SGID、SUID,以下一一道来。
sticky bit
sticky bit 只对目录有效,使目录下的文件,只有文件拥有者才能删除(如果他不属于 owner,仅属于
group 或者 other,就算他有 w 权限,也不能删除文件)。
加 sticky bit 的方法:
chmod o+t /tmp 或者 chmod 1777 /tmp
查看是否加了 sticky bit,用 ls -l,可以看到有类似这样的权限:“-rwxrwxrwt”,t 就代表已经加
上了 sticky bit,而且生效了,如果显示的是“-rwxrwxrwT”,说明也已经加上了 sticky bit,但没有生
效(因为本来 other 就没有写的权限)。
看看/tmp 目录的权限,就是 drwxrwxrwt 吧
SGID(The Set GroupID )
加上 SGID 的文件,表示运行这个程序时,是临时以这个文件的拥有组的身份运行的;加上 SGID 的文件
夹,表示在这个目录下创建的文件属于目录所有的组,而不是创建人所在的组,在这个目录下创建的目录继
承本目录的 SGID。
加 SGID 的方法:
chmod g+s /tmp 或
chmod 2777 /tmp
查看是否加了 SGID,用 ls -l,可以看到类似这样的权限“drwxrwsrwx”,s 就代表已经加上了 SGID,
而且生效,如果显示“drwxrwSrwx”,说明已经加上了 SGID,但没有生效(因为本来 group 就没有执行的
权限)。
SUID(The Set UserID)
SUID 与 SGID 是一样的,惟一不同的是,运行时是以这个文件的拥有者身份来运行。
加 SUID 的方法:
chmod o+s /tmp 或
chmod 4777 /tmp
同样的,加了 SUID 的文件权限有这类似这两种:“drwsrwxrwx”、“drwSrwxrwx”。
看看 passwd 命令的权限:ll /usr/bin/passwd,是"-rwsr-x-rx",终于知道为什么执行 passwd 时,可
以修改/etc/shadow 文件了吧
SUID:置于 u 的 x 位,原位置有执行权限,就置为 s,没有了为 S .
SGID:置于 g 的 x 位,原位置有执行权限,就置为 s,没有了为 S .
STICKY:粘滞位,置于 o 的 x 位,原位置有执行权限,就置为 t ,否则为 T .
  • 13
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值