内容


学习 Linux,302(混合环境)

Linux 文件系统和共享/服务权限

了解 Linux 文件系统中的文件权限

Comments

系列内容:

此内容是该系列 # 部分中的第 # 部分: 学习 Linux,302(混合环境)

敬请期待该系列的后续内容。

此内容是该系列的一部分:学习 Linux,302(混合环境)

敬请期待该系列的后续内容。

在本文中,将了解这些概念:

  • 有效地使用文件和目录的权限控制
  • Samba 与 Linux 文件系统权限交互

本文帮助您准备 Linux Professional Institute (LPI) 的混合环境专业考试(302)的主题 315 下的目标 315.1。该目标的权值为 3。

先决条件

为了最有效地利用本系列中的文章,您应该具备高级 Linux 知识,并需要准备一个 Linux 系统,用它来练习本文介绍的命令。

回顾 Linux 文件权限

Samba 与 Linux 文件系统的集成在很大程度上依赖于 Linux 文件权限的概念。

基本操作

Linux 有一种比较简单的方式来控制对文件的访问。文件有两个所有者:首先是用户,其次是组。权限会分配给用户、组和其他(其他所有人)。

文件权限控制三项基本操作:读、写和执行。读访问控制查看一个文件或目录的内容。写访问允许所有者删除或修改文件,或者在目录中创建新文件。执行访问是运行一个二进制文件或 shell 脚本,或在目录环境下进入一个目录所必需的。

Shell 脚本是文件权限中的一个有趣例子。普通的二进制文件有执行权限但没有读权限,因此用户能运行程序但无法查看其内容。shell 脚本不是这样的:用户必须有对 shell 脚本的读访问,才能读取脚本并执行。有了执行权限后,用户可以使用 ./myscript.sh 等命令运行脚本。

Linux 文件权限以一组八进制数字(以 8 为基数)表示,这称为文件的模式。每个数字都是加密某一组用户的读/写/执行权限。第一个数字对应拥有该文件的用户;第二个数字对应拥有该文件的组;最后一个数字是其他组的权限。有时会看到四位数字的权限。在这种情况下,第一个数字是对文件某些特殊的属性加密,最后三位数字表示用户、组和其他组,和前面一样。

要了解加密的权限,必须借助于二进制。一个八进制数字可以由三个二进制位来表示:

  • 001. 执行位
  • 010. 写位
  • 100. 读位

将这些位加在一起,就得到一个组合的权限。可以读取和执行的文件的二进制位数是 101,八进制是 5。三个二进制位是 111,则八进制是 7。反过来,八进制 6 就是二进制 110,它可以读写但不可执行。

适用于所有三个组,文件模式 644 是拥有此文件的用户有读/写权限,而组和其他所有人有只读权限。组权限优先于其他权限,因此文件模式 604 可以在其他用户读取文件时阻止所有组读取文件。模式 640 能让所有者读写,所有组读取,但其他用户无法进行任何操作。

在命令行中操作文件权限

chmod 命令可以更改文件的模式。因此,chmod 700 foo 命令会将 foo 的权限更改为 700,无论之前是什么。

您还可以从命令行设置或清空权限。除了提供八进制权限,还可以用 [ugoa][[+-=][rwx] 格式设置相对权限。第一个字符是 ugoa 中的一个,它们分别表示用户、组、其他所有。还可以选择添加(+)、删除(-)或设置(=)读/写/执行位。

例如,chmod u+x foo 可设置 foo 的执行位,并保持其他位不变。chmod g-rw something 可以移除组的读和写权限。

另一种使用 chmod 的方法是使用 --reference 参数。输入 chmod --reference file1 file2 可以让 file2 的权限与 file1 一样。

要更改文件的所有权,使用 chown 命令。例如,chown sean foo 命令可将 foo 的所有权更改为 sean。只有根用户可以修改文件的所有者。

chgrp 命令可以更改文件的组。普通用户必须属于新的组。

屏蔽

由于文件权限本来就是二进制的,因此可以运用一些二进位算术计算来设置或清除位数。这里可用到的二进制操作有 ORAND。二进制操作可以用真值表来表示,比如 图 1 所示。

图 1. OR 和 AND 的真值表
OR 和 AND 运算符的真值表

如果有一个操作数是 1,OR 操作结果是真(1)。只有两个输入都为假时,结果才为假(0)。AND 运算符相反:两个数都为真,则结果为真;否则结果为假。需要注意的是,这与操作数的顺序无关:A OR BB OR A 一样。

当包含多个二进制数时,会分别计算每个数。即,01 AND 1101。第一个数是 0,因为 0 AND 1 是 0。第二个数是 1,因为 1 AND 1 是 1。为了进一步简化文件权限中的二进制屏蔽,使用 OR 运算符强制设置位数,使用 AND 运算符清除位数。

回到八进制,如果想在任何文件模式为 600 中使用 OR,那么就会对所有用户设置读写位数,无论当前权限是什么。使用 775 进行 AND 操作将会清除其他用户的写权限,因为 5 的二进制是 101,而写权限位是 010。

Samba 如何与文件权限进行交互

与 Samba 服务器的每一个连接都作为单独的进程运行,由连接用户所有。因此,Samba 进程的文件权限与用户直接登录到服务器的权限一样。然后,如果用户通过 Samba 创建文件或目录,该目录将会归此用户所有。如果用户通过 Windows® Explorer 更改文件权限,那么这些权限将会转换为文件模式,就和用户使用 chmod 命令一样。

Samba 有一系列参数来控制在各种情况下如何设置权限。对于处理文件权限的参数,您会看到有一个参数用来设置位数,一个参数清空位数。所有这些参数都可以在共享层使用或全局层使用,从而能影响所有共享对象。与其他全局参数一样,全局行为会在共享层被覆盖。

创建文件和目录

新创建的文件肯定有一组权限。同样,在 Windows Explorer 中通过 New Folder 命令创建的目录必须赋予一个初始模式。这两种情况由不同的 Samba 参数进行处理。

Samba 首先将创建文件的请求转换为文件模式。然后它使用清空位数的 create mask 参数值进行 AND 操作。默认的屏蔽值是 0744,它能有效地移除组和其他用户的写和执行权限。接着,对 force create mode 命令和结果模式进行 OR 操作,设置所需的位数。force create mode 默认值是 000,它不会改变权限。

创建目录的流程与此相同,除了将初始权限与 directory mask 进行 AND 操作,然后与 force directory mode 参数进行 OR 操作。清单 1 提供了一些更改文件和目录创建方式的示例配置。

清单 1. 使用参数更改新文件和目录的权限
[global]
create mask = 770
force create mode = 600
directory mask = 777
force directory mode = 711

[public]
create mask = 777
force create mode = 666

清单 1 中的参数分为两个部分。[global] 部分中有文件和目录的参数。由于 create mask 中最后一位是 0 ,因此文件的其中一些位数会被清空,而其他位数由于对应位是 7 将会得以通过。其结果将会与 600 进行 OR 操作, 以确保用户获取自己文件的读和写权限。

目录的模式会与 777 进行 AND 操作,这会通过所有的权限位,然后与 711 进行 OR 操作,这会赋予所有者读、写和执行权限,其他所有人至少是执行权限。而共享的 public 的限制较为宽松。每个用户至少会获得共享文件的读和写权限。

修改文件和目录权限

如果在 Windows Explorer 中查看文件的安全属性,那么您能看到能够修改可访问您文件的用户。默认情况下,您可以看到表示 Linux 权限的权限,但已映射到 Microsoft® Windows NT® 组中。如果更改了这些权限,那么它们会重新映射到 Linux 文件权限中。另一组参数负责在更改文件权限时而非创建文件时设置和清空位数。

更改文件权限时用到的参数有:

  • security mask 与文件权限进行 AND 操作
  • force security mode 与文件权限进行 OR 操作
  • directory security mask 与目录权限进行 AND 操作
  • force directory security mode 与目录权限进行 OR 操作

模式相关参数总结

表 1 总结了与设置或屏蔽模式位相关的参数,以方便查阅。记住,这些位数要先清空,然后再设置。

表 1. 操作文件模式的 Samba 参数
情景设置位数(OR)清空位数(AND)
文件已创建force create modecreate mask
目录已创建force directory modedirectory mask
客户更改文件的权限force security modesecurity mask
客户更改目录的权限force directory security modedirectory security mask

设置用户和组所有权

之前讨论的所有参数都能修改文件模式,从而改变所有者用户、所有组和其他所有人的读、写和执行权限。默认情况下,文件归创建用户和用户组所有。有时可能还想让其他用户或组拥有文件,比如项目组或一般用户。这在让用户组使用的共享文件中会很有用。

Samba 提供了两个参数 —force userforce group—可将文件的所有者和所有组设置为任何人。可以在全局环境下使用这些参数,但在共享层更加实用。例如,可以用 force group = projecta 配置共享,让所有的文件属于 projecta 组。

force group 参数的另一种形式是在组名前添一个加号(+),比如 force group = +admins。加号不是字面上理解的意思:它是告诉 Samba 只有当用户已经属于一个组,比如次要组时,才把组设置为管理员。不在管理员的用户将继续使用主要组访问新创建的文件。

Samba 文件和目录权限总结

Samba 提供了几个影响文件权限计算方式的参数。这些参数采用八进制屏蔽的形式,与目标权限进行 AND 操作,清空不需要的位数,然后进行 OR 操作设置需要的位。要分别为文件和目录设置位,然后为新的文件和权限修改进行操作,总共有八个不同的参数。最后,您可以设置文件的用户和组获得共享。

虽然 Samba 灵活性非常强,但使用这些特性仍要小心,因为它们很可能与用户的期望相反。


相关主题


评论

添加或订阅评论,请先登录注册

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Linux
ArticleID=791362
ArticleTitle=学习 Linux,302(混合环境): Linux 文件系统和共享/服务权限
publish-date=02032012