MPI实现(OpenMPI,MPICH)如何处理安全/身份验证?

7
OpenMPI和MPICH在通过TCP/IP套接字之间发送MPI消息时如何处理安全性?
特别是,它们如何防止同一网络上的其他用户连接到监听套接字并发送假MPI消息?
具体场景如下:
- 管理员是可信的。不受信任的用户没有物理访问任何硬件或网络。不受信任的用户没有根访问权限。 - 但是,不受信任的用户可以在集群中运行自己的程序;集群节点是典型的Linux框。特别是,不受信任的用户可以从任何机器向集群中的任何其他机器打开TCP连接并发送任意消息。
3个回答

7
J Teller是正确的;MPI实际上并不这样做,也不应该这样做。这是基于MPI使用情况的设计决策。
MPI用户通常为了具有亚微秒延迟的互连而支付大量费用。对于这个社区来说,某种形式的消息加密签名的开销是完全不可接受的。
而且这并没有什么帮助。MPI的使用方式是在受控环境中作为消息传输接口——在有限访问集群中的节点或者计算实验室中的机器。如果恶意用户获得足够控制一个这些节点的权限来干扰MPI通信,那么有比嗅探数据包、找出正在进行的计算阶段并进行中间人攻击更容易的方法来破坏通信。可以直接更改正在运行的作业的内存,或者更容易地,只需覆盖共享文件系统上的结果。(注意:简单地发送伪造的MPI消息可能会被注意到,因为“真实”的消息会堆积,占用资源并可能导致作业崩溃;同样,拦截消息而不转发它们几乎肯定会导致死锁)。
当然,这些论点并不适用于分布式计算,比如BOINC风格:但MPI并不适合那种使用方式。
当然,没有什么可以阻止一个有这种安全要求的MPI用户只需在每个消息中发送类似pgp的签名并将其纳入他们的代码中;但是用于执行此操作的机制并不是MPI本身的一部分,这肯定是正确的决定。

谢谢您的回答,但您是否阅读了我在问题中提到的具体情况?“一个人只需修改正在运行的作业的内存,或更容易地,简单地覆盖共享文件系统上的结果”:如果不同的用户有不同的用户帐户,我不认为这是可能的。数据包嗅探也不可能(它需要 root 帐户或物理访问权限)。而且我猜在所有消息中都不需要使用加密签名;如果通信是通过 TCP 进行的,那么我猜鉴别新 TCP 连接的创建就足够了? - Jukka Suomela
我想说的是,这些集群通常是受控环境,在某种程度上信任用户,因此它们对内部攻击的防御不像其他环境那样强化。此外,TCP只是发送消息的一种方式;大多数MPI都支持多种传输方式。 - Jonathan Dursi

3
我不是这方面的专家,但基本答案是 MPI 通常不处理安全问题。它依赖于底层操作系统提供所需的安全级别。
对于我的 MPI 分发,使用 mpd 守护进程来构建,并通过 mpdboot 在集群上设置一个 mpd 守护进程环(每个节点一个),以合理的方式进行配置。一旦该环被设置好,且您信任 mpd 守护进程,则一切都已准备就绪。mpd 将确保只有您拥有的进程连接到您的 mpi 进程。
然而,我并不太理解 mpd 环是如何“合理地”设置的。在我的分发中,mpdboot 是一个 Python 脚本,因此可以查看它是否足够安全。如果您运行的集群受到访问控制,则它可能足够安全。

2
Mpd通常具有启动守护程序的“共享密钥”,但这是一种非常薄弱的安全形式,旨在防止意外干扰而不是其他任何事情。 - Jonathan Dursi

0

我完全同意@Jonathan Dursi的看法:保护MPI通信对于一个配置良好的集群的安全几乎没有贡献,但是(a)管理层可能会坚持要求,(b)由于某些原因,您想在不受信任的网络上运行MPI,以及(c)解决这个问题很有趣。

至于不受信任的网络情况,我之前曾经使用IPSec来保护集群上的MPI通信网络。我没有使用IPSec的自动配置脚本,而是通过一个由Python脚本自动生成的shell脚本加载对称加密密钥。

为了隔离集群中各个作业的MPI通信,可以将此方法扩展到在每个作业的prolog中加载新生成的IPSec密钥,而不仅仅是在系统启动时加载一次。在这种设置中,作业不能共享节点。此外,如果使用专用的MPI网络,则更容易进行设置,因为需要保留连接(ssh、作业管理器等)。而且,您可能不想将通常需要连接到作业管理系统的头节点(s)包括在作业的IPSec网络中,因为攻击者可能会坐在那里。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接