2012-02-29 50 views
1

因此,我有一个安全困境。如何安全地执行shell命令作为web服务

基本上我正在做的是提供一个基于Web的翻译服务,为“定理证明者的数千问题”应用程序。我用PSOA RuleML语言编写文档,并将其翻译为TPTP-FOF

为了演示此翻译,我想提供两个RESTful Web服务。一个翻译PSOA RuleML和另一个提供推理(initial report)。

第一个服务使用Java/ANTLR3/RestEasy,第二个服务使用Java/ApacheCommonsExec来测试从第一个服务返回的生成的TPTP字符串与定理证明程序。

Apache Commons Exec是否提供足够的安全性来执行此操作?我意识到还有其他明显的解决方案编写服务,确保只测试TPTP FOF语句。但是,如果可能的话,我想将这个定理证明器本身作为一个Web服务公开。提前致谢!

+2

不要接受互联网上任何人的安全建议,包括我自己在内。 – dasblinkenlight 2012-02-29 15:47:35

+0

谢谢@dasblinkenlight,我会牢记这一点。然而,我仍然很好奇人们必须在这里贡献什么样的解决方案。 – 2012-02-29 15:49:56

+0

请把这个问题缩小一点,它太笼统了,不适合SO的Q&A格式。 – 2012-03-01 22:02:46

回答

3

我已经使用ApacheCommonsExec,但不适用于Web应用程序。这对我的需求来说“足够安全”。

最安全的选择是不要直接从Web传递任何字符串参数到exec进程。如果你可以使用最终的常量或枚举,你的安全性会大大增加。

酒吧,你需要仔细消毒和逃生传递的任何命令字面值。不知道你正在使用的确切系统(Windows/Linux /等),这将改变每个平台。我的建议是找出一个为你做到这一点的图书馆。

最后,打开java安全管理器运行。这很可能会破坏ApacheCommonsExec,但您应该能够解决这些问题。

3

不是完整的答案,而是一些想法。大多数情况下,这归结为验证用户输入的每一项。我建议你只接受一个简单的输入,例如一个整数(可以很容易地验证和限制检查或映射到一个枚举),标识一些你想要执行的函数(有点像存储过程)。另一个要考虑的问题是如何在事情出错时停止或终止shell脚本(请考虑超时)。您还想考虑用户帐户拥有和运行您的shell脚本。大多数情况下,你只需要验证用户输入的地狱,不要相信任何东西。

2

确保Web应用程序容器(Tomcat)未以超级用户身份运行。如果可能的话,你也可以在chroot环境中运行它。

如果您必须将文本传递给正在执行的命令,请尝试将文本写入文件,并使该程序从文件中读取文本,而不是尝试将其作为参数传递。

安全就是关于图层。没有任何东西可以做到“安全”,但如果添加了足够多的图层,那么它就足够安全了。

另请尝试在security.stackexchange.com上询问您的问题以获取更多专门的输入。