跳转到内容

Ict-innovation/LPI/104.5

来自维基教科书,开放世界中的开放书籍

104.5 管理文件权限和所有权

[编辑 | 编辑源代码]

考生应该能够通过正确使用权限和所有权来控制文件访问。

关键知识领域

  • 管理普通文件、特殊文件以及目录的访问权限。
  • 使用 suid、sgid 和粘滞位等访问模式来维护安全性。
  • 了解如何更改文件创建掩码。
  • 使用组字段向组成员授予文件访问权限。



文件和目录权限

对 Linux 上的目录和文件的访问由一个简单的文件权限系统控制。每个文件/目录都具有文件所有者、文件所属的组以及其他用户的权限,即既不是所有者也不属于文件所属组的用户。权限被称为文件/目录的访问模式,可以通过运行ls -l 命令来查看。

文件访问模式以 3 个字母的组的形式符号表示,或以一组 3 个八进制数字的形式数字表示,但表示一个 9 位数字,每一位代表一个访问权限。

drwxr-xr-x 3 root root 4.0K 2009-10-27 20:03 hal

-rw-r--r-- 1 root root 4.7K 2009-10-06 22:45 hdparm.conf

-rw-r--r-- 1 root root 92 2009-04-27 11:56 host.conf

-rw-r--r-- 1 root root 4 2010-02-13 01:03 hostname

-rw-r--r-- 1 root root 292 2010-06-24 11:57 hosts

-rw-r--r-- 1 root root 579 2009-10-27 20:12 hosts.allow

上面的摘录来自在

/etc 目录上运行 ls -l 命令的结果。创建文件时,它由创建文件的用户拥有并分配给所有者的默认组。

符号和八进制表示法

权限可以是 read=r、write=w 和 execute=x。这些权限的八进制值在下一张表中列出。

八进制和符号权限.

符号
八进制
二进制
4 ' 100'
2 ' 010'
执行
1
' 001'

权限适用于用户、组和其他人。一个项目对这三类中的每一类都有一个由 3 个权限组成的集合。

如何阅读一个 755 或 -rwxr-xr-x 权限

用户
其他
rwx
4+2+1=7
r-x
4+1=5
r-x
4+1=5

r-x

标准权限和 UMASK

UNIX 系统以以下标准权限创建文件和目录

标准权限适用于

文件 666 -rw-rw-rw-

目录 777 -rwxrwxrwx

每个用户都定义了一个 umask,它会更改标准权限。umask 只在创建文件时应用。umask 具有八进制值,并从八进制标准权限中减去(*),从而得到文件的权限(此权限没有名称,可以称为文件的有效权限)。

(*) 虽然减法在大多数情况下有效,但需要注意的是,从技术上讲,标准权限和 umask 的组合方式如下

最终权限 = 标准权限 (逻辑 AND) (NOT) umask

在用户属于不同组的系统中,umask 的值可以为 002。


对于将所有用户都放在users 组中的系统,umask 可能是 022,这样默认情况下文件就不会具有组写访问权限。

更改权限和所有者

[编辑 | 编辑源代码]

从前面的图中我们可以看到,可以使用 chmod 对权限进行操作。每个文件和目录都有 3 类所有权

u: 用户

g: 组

o: 其他

示例

-rw-rw-r-- 1 jade sales 24880 Oct 25 17:28 libcgic.a

使用chmod 更改权限

#chmod g=r,o-r libcgic.a

#chmod g+w libcgic.a

使用 chown 和 chgrp 更改用户和组 

#chown root libcgic.a


#chgrp apache libcgic.a:

注意

chmodchownchgrp 的一个有用选项是–R,它会递归地更改所有指示的文件和目录的所有权和权限。


特殊权限

SUID 权限

可执行文件可以分配一个特殊权限,它将始终使其以该文件的拥有者的身份运行。此权限称为 SUID,表示“设置用户 ID”。它的符号值为s,八进制值为4000

管理工具可能设置了 SUID 位,以允许非 root 用户更改系统文件。

例如,passwd 命令可以由任何用户运行,它会交互式地更改其当前密码。此密码将保存到/etc/shadow 中。但是,此文件属于 root 用户,其典型权限为 600。

此问题通过在passwd 上设置 SUID 位来解决,从而强制它以 root 用户身份运行,并具有修改/etc/shadow 的正确权限。

passwd 上的 SUID

# ls -l $(which passwd)

#chgrp apache libcgic.a

-r-s--x--x 1 root root 18992 Jun 6 2003 /usr/bin/passwd

SUID 位在上面的命令中以符号形式显示。也可以使用stat 获取有关文件的更多信息,以及查看权限的八进制表示,如下所示

# stat /usr/bin/passwd

File: '/usr/bin/passwd'

Size: 18992 Blocks: 40 IO Block: 4096 regular file

Device: 305h/773d Inode: 356680 Links: 1

Access: (4511/-r-s--x--x) Uid: ( 0/ root) Gid: ( 0/ root)
警告!警告!警告!
SUID 权限通常与安全问题相关联。以下是一个说明这一点的示例。

1. 用户想阅读 root 用户的邮件。为此,他将 MAIL 环境变量更改为如下所示

# export MAIL=/var/spool/mail/root

2. 然后,用户使用mail 命令,希望看到一些内容!


# mail

/var/spool/mail/root: Permission denied
到目前为止,它还没有起作用。这太容易了!

但是,如果 root 用户能够被说服在mail 上设置 SUID 位,那么之前的命令将允许任何用户阅读任何人的邮件(包括 root 用户)。

以下示例很危险。为什么?

#chmod 4755 /bin/cat


#chmod u+s /bin/grep

SGID 权限

[编辑 | 编辑源代码]

SGID 是一种类似于 SUID 的权限,它为组成员设置。符号值为s,八进制值为2000

在目录上设置 SGID 会将随后在该目录中创建的文件的组所有权更改为该目录的组所有权。无需在创建文件之前使用 newgrp 更改进程的有效组。

示例

#chmod 2755 /home/data

#chmod g+s /bin/wc

粘滞位

  1. 粘滞位权限 的值为1000,具有以下效果
  2. 应用于目录,它会阻止用户删除文件,除非他们是所有者(非常适合由组共享的目录,或用于/tmp

在目录上设置 SGID 会将随后在该目录中创建的文件的组所有权更改为该目录的组所有权。无需在创建文件之前使用 newgrp 更改进程的有效组。

应用于文件,它以前会使文件或可执行文件加载到内存中,并使以后的访问或执行更快。可执行文件的文件的符号值为t。它在一些版本的 Unix 中受支持,但在 Linux 中没有使用。

#chmod 1666 /data/store.txt



#chmod o+t /home/students

  • 使用的文件、术语和工具
  • chmod
  • umask
  • chown


chgrp

华夏公益教科书