【问题标题】:Access control to shared memory共享内存的访问控制
【发布时间】:2011-05-22 15:26:40
【问题描述】:

我猜这个问题是针对 Linux/Unix 系统编程专家的(不幸的是,我还不是那种人;))。

我正在构建一个运行在 Linux/Unix 多核机器上的系统,其中进程通过共享内存相互通信(速度很重要 - 尽可能减少对内核的调用)。 当一个进程请求与另一个进程通信时,动态创建用于通信的共享内存“通道”——每个进程都有一个监听线程,接收和“接受”这些请求,然后创建/初始化共享内存通道。对于进程 ab,创建了两个通道(共享内存区域) - 一个通道用作 a 的“输出”和“输入” " 到 b 反之亦然。

在创建通信通道时,进程 a 必须具有对其相应“输出”通道的 R/W 访问权限,并且只有 R 对其相应“输入”通道的访问权限。其他进程必须无法获得对其他进程对之间共享通道的 W 访问权限(最好它们甚至不应该拥有 R 访问权限)。

您能提出什么解决方案?

我在想:

  1. 定义我自己的系统调用(目前不推荐)
  2. 使用文件系统固有的文件权限来施加此访问权限

对于第二种解决方案,想法是在不同的用户 ID 下运行进程,并为每个进程对使用动态创建组,并相应地为每个共享内存描述符分配文件权限(R 到组,R/W 到写入进程, - 其他人)。

第二种解决方案可行吗?有没有更好的解决方案(例如涉及一些我不知道的系统调用)?

非常感谢您的宝贵时间和帮助。

【问题讨论】:

  • 您是否考虑过 mmap 文件或命名管道?它们比 SysV ipc 容易得多。
  • 是的,实际上使用了共享内存对象的映射

标签: linux unix ipc shared-memory


【解决方案1】:

您不能使用组来执行此操作,因为无法将补充组添加到已运行的进程中。但是,基于用户的机制可以正常工作。

在自己的 uid 下运行每个进程。为了创建共享内存通道,发送端使用shm_open() 创建一个共享内存对象,指定O_RDWR | O_CREAT | O_EXCL 和模式0600。因此它是唯一打开它的进程,并且只有它的 uid 被允许打开它。然后,发送端为同一个共享内存段打开第二个文件描述符,这次使用O_RDONLY。它通过 unix 域套接字使用SCM_RIGHTS 消息将第二个只读文件描述符发送到接收进程。然后它可以关闭只读文件描述符。

发送进程和接收进程然后mmap()共享内存。接收进程具有只读权限,无权将其升级为读写。根本没有其他进程可以打开它。

【讨论】:

  • 这对每个配对连接初始化只添加了几个系统调用,这非常好。感谢您的回答!
  • @kaptoxic:确实,我建议也将 UNIX 域套接字用于“请求通信”消息通道,这样您就可以通过它发送共享内存文件描述符。
猜你喜欢
  • 1970-01-01
  • 2019-03-04
  • 2013-06-09
  • 1970-01-01
  • 1970-01-01
  • 2021-11-26
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
相关资源
最近更新 更多