如何安全地执行shell命令作为Web服务

时间:2012-02-29 15:44:35

标签: java security shell rest

所以我有一个安全困境。

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

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

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

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

3 个答案:

答案 0 :(得分:3)

我使用过ApacheCommonsExec,但不是用于Web应用程序。对我的需求来说,它“足够安全”。

最安全的选择是永远不要将任何String参数直接从Web传递给exec进程。如果你可以使用最终常量或枚举,你的安全性会大大提高。

请注意,您需要仔细清理并转义任何传递的命令文字。如果不知道您所使用的确切系统(Windows / Linux /等),这将在每个平台上发生变化。我的建议是找一个为你做这件事的图书馆。

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

答案 1 :(得分:3)

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

答案 2 :(得分:2)

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

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

安全就是层次。没有任何一件事可以让你做出安全的事情。但如果你添加足够的层,那么它就足够安全了。

还可以尝试在security.stackexchange.com上提问,以获得更专业的输入。