Java 和 Python 之间的 Windows 上的 IPC 保护给当前用户

Posted

技术标签:

【中文标题】Java 和 Python 之间的 Windows 上的 IPC 保护给当前用户【英文标题】:IPC on Windows between Java and Python secured to the current user 【发布时间】:2010-11-23 14:33:54 【问题描述】:

我们有一个需要客户端证书身份验证的 Rest API。该 API 由用户可以运行的 Python 脚本集合使用。为了使用户不必在每次运行其中一个脚本时输入其客户端证书的密码,我们在 java 中创建了这个代理进程,用户可以在后台启动并运行该进程,其中包含内存中的用户证书密码(我们只是在 JVM 中设置了 javax.net.ssl.keyStorePassword 属性)。脚本与该进程通信,该进程只是将 Rest API 调用转发到服务器(添加证书凭据)。

要在脚本和代理进程之间进行 IPC,我们只使用了一个套接字。问题是套接字会带来安全风险,因为有人可以通过其他人机器上的代理进程端口进行通信,从而使用其他人的证书来使用 Rest API。我们通过使用 java 安全性仅允许从 localhost 连接到端口,在一定程度上降低了风险。我认为尽管理论上有人仍然可以通过远程连接到机器然后使用端口来做到这一点。有没有办法进一步限制当前 Windows 用户使用端口?或者我可以使用另一种形式的 IPC 来使用当前的 windows 用户进行授权?

我们将 Java 用于代理流程,只是因为我们团队中的每个人都比 Python 更熟悉 Java,但如果有帮助的话,可以用 Python 重写它。

编辑:刚刚记得使用 java 进行代理进程的另一个原因是我们坚持使用 python v2.6,并且在这个版本中,似乎不支持带有客户端证书的 https (至少在不使用 3rd 方库的情况下并非如此)。

【问题讨论】:

【参考方案1】:

最简单的方法是使用基于 cookie 的访问控制。在用户的配置文件/主目录中有一个包含 cookie 的文件。让 Java 服务器生成并保存 cookie,并让 Python 客户端脚本将 cookie 作为任何 TCP 连接上的第一条数据发送。

只要攻击者无法获取 cookie,这是安全的,然后应该由文件系统 ACL 保护。

【讨论】:

谢谢,我认为这行得通。我仍然必须使用单独的 java 进程作为 http 客户端,因为我们必须使用 python v2.6,而且它似乎无法使用客户端证书处理 https,但是,使用 cookie 我想我可以生成一个新的 java 进程每次运行 python 脚本,然后使用标准输入/输出与它通信 Python 实际上可以很好地处理客户端证书,并且已经这样做了很长一段时间了。 好吧,在文档中挖掘更多内容,看起来确实可以完成,但是我们的证书是 PKCS#12 格式,似乎不受支持。【参考方案2】:

我想我已经想出了一个受 Martin 上述帖子启发的解决方案。当代理进程启动时,我将创建一个监听 IPC 端口的小型 http 服务器。同样在启动期间,我会将一个包含随机生成的密码(每次启动都不同)的文件写入用户的主目录,这样只有用户才能读取该文件(或管理员,但我认为我不需要担心) )。然后我将通过要求发送到那里的所有 http 请求使用密码来锁定 IPC 端口。这有点像 Rube Goldberg 式的,但我认为它会起作用。

【讨论】:

以上是关于Java 和 Python 之间的 Windows 上的 IPC 保护给当前用户的主要内容,如果未能解决你的问题,请参考以下文章

Windows 中的 python 2 和 python 3 之间的命名管道的工作方式有啥不同吗?

java实现FTP文件传输,linux之间,windows之间,以及windows和linux之间传输,实现代码是不是相同?

Python实现Windows和Linux之间互相传输文件(文件夹)的方法

Windows 中 Java 和 C 之间的任何 IPC 机制 - 不想要套接字

在 Windows 上的两个 java 版本之间切换

Windows中Java应用程序和C++应用程序之间的同步