当应用程序需要访问特定文件时,正确的方法是什么?

当应用程序需要访问特定文件时,正确的方法是什么?

今天我遇到了一个有趣的场景(至少对我来说 - Linux 新手)。我将无人机连接到了 Linux PC。无人机配置软件(Betaflight)无法连接到无人机。快速谷歌搜索解决了这个问题。基本上,当我用 USB 电缆连接无人机时,就会创建一个文件:/dev/ttyUSB0并且它具有660权限。文件的所有者是root,文件的组是uucp。所以简单的解决方案是将这个文件 chmod 为666.然而,这在我的脑海中提出了一些问题。

我刚刚添加了此文件的r权限w大家,这似乎太过分了。或者,我认为我可以将 Betaflight 添加到uucp组中,这看起来很愚蠢,因为它是一个重要的组,或者使用 sudo 运行它,这看起来更糟糕。

处理这个问题的正确方法是什么?从逻辑上讲,专门为 Betaflight 添加一条规则来rw访问此特定文件是有意义的。我只是好奇什么是“Linux方式”。我不想让随机应用程序过度访问我的操作系统,我也不想让任何应用程序/用户访问特定文件。

答案1

欢迎 Andrzej 来到 Unix&Linux,

如果您想尽量减少授予的权限,我建议您:

  1. 创建一个专门的组(让我们命名它drone):addgroup drone
  2. 将您的更改/dev/ttyUSB0为组dronechgrp drone /dev/ttyUSB0
  3. 将您的无人机配置软件(我们称之为/usr/bin/foo)更改为该组drone并启用该setgid位:chgrp drone /usr/bin/foo; chmod g+s /usr/bin/foo
  4. 可以选择禁止other执行配置软件,并授予专用用户(我们称之为user1)使用文件 ACL 执行它的权限:chmod o-x /usr/bin/foo; setfacl -m u:user1:r-x /usr/bin/foo

您可以将 3 和 4 替换为 using ,sudo以允许专用用户作为组运行配置软件drone。您可以添加/etc/sudoers

user1 ALL=(:drone) /usr/bin/foo

然后将其用作user1sudo -g drone foo

答案2

不同 Linux 发行版的答案可能有所不同。

在 Unix 时代早期,串行线路和调制解调器是计算机之间最常见的网络模式,电子邮件和文件传输由称为 Unix-to-Unix-Copy(或uucp.为了确保普通用户不会弄乱系统之间预定的电子邮件传输之类的事情,对用于传出连接的串行端口的访问权限通常被分配给一个通常名为 的特殊组uucp。 uucp 套件的程序被分配了一个setgid uucp权限,该权限将允许这些程序 - 并且仅有的这些程序无需root权限即可访问传出串行端口。

普通用户将被允许运行 uucp 套件的一些工具,但这些工具本身将包含必要的检查以避免恶作剧。

显然,您的 Linux 发行版仍然遵循这种旧的命名约定。在现代系统上,实际的uucp软件套件不太可能被使用,因此该uucp组可用于以系统所有者认为合理的任何方式控制对串行端口的访问。一些发行版使用不同名称的组,例如管理串行端口,因为对于不了解 Unix 历史的任何人来说,dialout该名称是不透明且不直观的。uucp

我认为一些 Unix 规范过去要求(或至少建议)该uucp组应始终作为预定义的系统组存在于任何兼容的类 Unix 系统上。

一些发行版实际上预定义了许多组,可用于允许特定用户访问特定类型的设备,例如Debian和相关发行版中的cdrom、 、audio、或。videoplugdevscanner

/dev/ttyUSB0不仅仅是一个普通文件:它是一个设备节点。在现代 Linux 发行版中,设备节点由基于 RAM 的文件系统管理udev并存储在其中,因此,如果您使用chmodchownchgrp来更改其所有权或权限,这些更改在重新启动后将不会保留。

因此,您有多种选择:

  • 如果你想任何用户能够使用串行端口仅适用于特定程序,您可以setuid uucp为这些程序添加权限:
sudo chgrp uucp /some/where/Betaflight
sudo chmod g+s /some/where/Betaflight
  • 如果你想只有部分用户为了能够使用串行端口,您可以将这些用户添加到uucp组中:
sudo usermod -a -G uucp username

注意:组成员身份在登录时分配给用户会话,因此如果进行此更改时用户已经登录,则用户需要注销并再次登录才能使更改生效。

  • 如果你想仅用户实际在计算机上(而不是通过 SSH 远程登录的用户)访问串行端口systemd-logind(如果使用)或 PAM 模块可用于为实际登录到控制台的用户提供对设备节点的额外访问权限。

在较旧的发行版中,可以通过在会话期间将指定设备的所有权转移给用户并在会话结束后返回到 root,或者在登录时向登录的用户授予额外的组成员身份来实现此目的在本地。现代实现倾向于在设备上使用访问控制列表 (ACL) 来实现此目的,因为devtmpfs文件系统对 ACL 的支持已经成熟并变得普遍。

使用,您可以通过为设备systemd-logind添加带有 的 udev 规则来将设备分配给本地登录用户的控制。TAG+="seat"

相关内容