Linux 上的访问控制列表和外部驱动器:您需要了解的内容

了解如何在 Linux 上正确使用外部驱动器。
88 位读者喜欢这个。
How Linux got to be Linux: Test driving 1993-2003 distros

Internet Archive Book Images。由 Opensource.com 修改。CC BY-SA 4.0

虽然云存储提供了许多优势,但没有什么比将数据存储在物理硬盘上更让人安心的了。当您将数据保存到驱动器时,您确切地知道数据在哪里,并且在您需要时始终可用。当您将数据保存到外部便携式驱动器(如 USB 闪存驱动器)时,情况会更好——您不仅知道数据在哪里,还可以随身携带数据。如果您是 Linux 新手,或者您尝试在外部驱动器上使用 Linux 文件系统,您可能会发现外部驱动器令人困惑,容易出现权限错误或冲突,甚至丢失元数据。

对于这个问题,有两个“正确”的答案

ExFAT

以前,ExFAT 文件系统因微软拥有代码而面临法律威胁。他们以前曾起诉公司和组织以捍卫他们对 FAT 的所有权,因此人们普遍担心他们可能会对 ExFAT 做同样的事情。然而,最近,微软已将 ExFAT 的规范开源。遗憾的是,他们没有提供驱动程序,但已经有一个驱动程序使其在 Linux 上运行,并且,既然开发人员可以访问完整的规范,改进是不可避免的。

ExFAT 的优势在于它是跨平台的(Windows、Mac 和许多便携式设备都使用它),并且它的设计没有文件权限的开销。您可以将格式化为 ExFAT 的驱动器连接到任何计算机,并且所有人都可以访问所有文件。这到底是好是坏取决于您的用例,但对于便携式媒体,这通常正是意图。

访问控制列表 (ACL)

如果您更喜欢在便携式驱动器上使用 Linux 文件系统,那么您可以这样做,但是为了使文件共享无缝衔接,您应该使用访问控制列表 (ACL)。

当您在驱动器上创建文件或目录时,您的系统上有一些默认设置来确定它获得的文件权限。在大多数情况下,这些默认设置是有意义的——当您在您的主目录中创建文件时,您可能不希望其他用户访问该文件。但是,当您在外部驱动器上创建文件时,很可能是因为您需要与其他人共享该文件(即使那个人是您在另一台计算机上)。

您可以使用 ACL 覆盖文件查看的默认权限,并且可以通过设置粘滞位来控制默认文件创建模式。ACL 是目录和文件的扩展属性中的一层安全策略。它允许您指定文件系统权限指示内容的例外情况。最值得注意的是,这允许您超越传统 UNIX 权限的单所有者和单组模型。

例如,虽然 seth(ID 1000)帐户可能拥有在我桌面上创建的目录,但我的笔记本电脑上的 seth(ID 500)却不拥有,因为用户 ID 不同。

对于组来说,情况可能也是如此。如果组 ID 为 1000 的目录分配给一台计算机上的目录,那么 ID 为 500 或 10922 的组则无法在另一台计算机上访问它。但是 ACL 可以将辅助所有者和组添加到目录和文件。

查看当前的 ACL

任何常见 Linux 文件系统上的任何目录和文件都默认具有 ACL 规则。它们存储在扩展属性中,这是一种您通常看不到的元数据。

您可以在终端中查看它们

$ getfacl ./example
# file: /run/media/drive/example
# owner: seth
# group: users
user::rwx
group::rwx
other::r--

注释行仅供您参考;它们告诉您您正在查看信息的文件或目录的路径以及所有者和组。接下来的行显示应用于文件或目录的规则。在此示例中,用户权限设置为 rwx,组设置为 r-x,其他设置为 r-x。这些权限通过普通文件系统列表反映出来

$ ls -lA /run/media/drive
drwxrwxr-- 26 seth users 4096 Jan 16 21:04 example
$ id
uid=1000(seth) gid=100(users) groups=100(users)...

只要用户 seth(UID 1000)或 group(GID 100)的成员与 example 目录交互,就会授予完全访问权限。但是,任何其他帐户都只有读取 (r) 权限。

设置 ACL

要修改 ACL,您可以使用 setfacl 命令或使用支持 ACL 的文件管理器。在设置 ACL 时,您可以非常具体或非常通用。

要仅修改文件系统权限设置,您可以使用 chmodsetfacl。这是一种非常通用的 ACL 设置,因为您没有向文件系统规范中 UNIX 已经可用的权限添加任何内容。

$ setfacl --modify g::r example
$ getfacl ./example | grep "group::"
group::r--
$ ls -l . | grep example
drwxr--r-- 26 seth users 4096 Jan 16 21:04 example

可以通过 chmod 获得相同的效果

$ chmod g+x example
$ getfacl ./example | grep "group::"
group::r-x
$ ls -l . | grep example
drwxr-xr-- 26 seth users 4096 Jan 16 21:04 example

添加用户和组

真正从 ACL 中受益是将其用于本机 UNIX 权限范围之外的权限。如果我以用户 ID 为 1000 的 seth 身份登录到我的桌面,并且我知道我的便携式驱动器上的一个目录需要可供我的笔记本电脑上 ID 为 500 的 seth 使用,那么仅声明 seth 为所有者是不够的,因为用户 ID 不同。

您可以将用户或用户 ID 添加到访问控制列表

$ setfacl --modify u:500:rwx example
$ getfacl example
# file: /run/media/drive/example
# owner: seth
# group: users
user::rwx 
user:500:rwx
[...]

已将特定于用户 ID 500 的新条目添加到列表中。现在将驱动器连接到另一台 Linux 或 UNIX 计算机允许 ID 为 500 的用户访问 example 文件夹。

您还可以按帐户名称添加用户,或按组名称或组 ID 添加组。但是,ID 才是权限真正重要的因素,因此如果您处于混合环境(例如 RHEL 服务器和 Elementary 客户端),您应该验证表面上看起来相同的帐户背后的用户 ID 和组 ID。

设置默认 ACL 规则

如果您将访问控制视为一次性设置,那么一旦您的不同用户帐户开始创建文件和目录,您很快就会遇到问题。每个用户创建的任何新文件或目录都会继承系统的默认权限(和 ACL)。这意味着一旦笔记本电脑用户 ID 为 500 的 seth 在目录中创建文件,则桌面用户 ID 为 1000 的 seth 可能会无法访问它,因为文件的所有者设置为 UID 500。

默认 ACL 可以应用于目录,以便在其中创建的文件和子目录继承父 ACL。您可以使用 –default 选项设置目录的默认 ACL

$ setfacl --default --modify u:500:rwx example
$ setfacl --default --modify u:1000:rwx example
$ getfacl --omit-header example
user::rwx
user:500:rwx
group::rw-
mask::rwx
other::r-x
default:user::rwx
default:group::rw-
default:group:500:rwx
default:group:1000:rwx
default:mask::rwx
default:other::r-x

当用户在 example 目录中创建新目录时,继承的 ACL 与其父目录相同

$ cd example
$ mkdir penguins
$ getfacl --omit-header penguins
user::rwx
group::rw-
group:500:rwx
group:1000:rwx
mask::rwx
other::r-x
default:user::rwx
default:group::rw-
default:group:500:rwx
default:group:1000:rwx
default:mask::rwx
default:other::r-x

这意味着创建的任何目录或文件都继承相同的 ACL,因此用户 500 或 1000 都不会被排除在访问之外。

外部驱动器的实用 ACL

当对外部驱动器使用 Linux 文件系统时,确保它适用于所有期望使用便携式驱动器的用户的简单方法是在单个顶级目录上设置 ACL。

例如,假设您已将名为 mydrive 的 USB 驱动器格式化为 ext4 文件系统。您希望您的笔记本电脑和桌面电脑上的帐户以及您的同事 Alice 能够访问这些文件。

首先,在驱动器的顶层创建一个目录

$ mkdir /mnt/mydrive/umbrella

然后将 ACL 应用于顶级目录,以授予所有重要用户访问权限

$ setfacl --modify \
  u:500:rwx,u:1000:rwx,u:alice:rwx \
  /mnt/mydrive/umbrella

最后,应用默认 ACL,以便在顶级目录 umbrella 中创建的所有目录和文件都继承相同的默认 ACL(请注意,此命令使用 –modify 的简短版本)

$ setfacl --default -m u:500:rwx,u:1000:rwx,u:alice:rwx \
  /mnt/mydrive/umbrella

将默认值应用于现有系统

如果您需要将 ACL 设置应用于许多已存在的文件,您可以使用 find 命令来完成。

首先,查找所有目录并应用 ACL 规则

$ find /mnt/mydrive/umbrella -type d | \
  parallel --max-args=6 setfacl \
  --default -m u:500:rwx,u:1000:rwx,u:alice:rwx

不加选择地将所有文件权限设置为可执行文件是不明智的,因此接下来,查找所有文件并将权限设置为 re。需要可执行位的文件可以手动或按文件扩展名设置

$ find /mnt/mydrive/umbrella -type f | \
  parallel --max-args=6 setfacl \
  --default -m u:500:rw,u:1000:rw,u:alice:rw

调整这些命令的逻辑以适应您的个人需求(例如,不要运行删除 /usr 上的可执行位或包含除可执行程序之外的任何内容的目录的命令)。

外部驱动器

不要让围绕 Linux 上外部驱动器的困惑困扰您,也不要将自己限制在传统的 UNIX 权限中。让访问控制列表为您工作,并随意在您的便携式驱动器上使用原生的日志式 Linux 文件系统。

接下来阅读什么
标签
Seth Kenlon
Seth Kenlon 是一位 UNIX 极客、自由文化倡导者、独立多媒体艺术家和 D&D 爱好者。他曾在电影和计算机行业工作,而且经常同时在两个行业工作。

2 条评论

TL;DR 如果您希望您的 EXT4 闪存驱动器像您的 exFAT 拇指驱动器一样工作,请 CHMOD 777 挂载点,这实际上是驱动器的根目录。非常简单。

Tara,感谢您的评论。但是,我不同意您的总结。挂载点的 chmod *不是*持久的,并且 777 具有潜在的副作用(例如,使所有内容都可执行,更改可能触发 Git 记录的更改的文件模式等等)。

学习和使用 ACL 是一种理智而精确的方式,使尊重权限的文件系统可供您想要授予数据访问权限的用户使用。我建议您熟悉它,这样您就不必每次连接驱动器时都只是 chmod 777 一切。

回复 作者 Tara Reade (未验证)

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 获得许可。
© . All rights reserved.