java - 在Tomcat中执行shell命令

标签 java security shell tomcat command

所以我遇到了以下问题:我有一个在 Linux 上的 Tomcat7 服务器中运行的 Web 服务。然而,Web 服务必须执行一些命令(主要是文件操作,例如复制和装载)。复制 我已经用 java.nio 替换了,但我认为 mount 没有替代品.

所以我正在尝试从我的 Tomcat Java 进程中执行 shell 命令。不幸的是,它不执行我的命令。我以前用Java实现过shell命令的执行。所以我的代码应该是正确的:

Process pr = Runtime.getRuntime().exec("mount -o loop -t iso9660 <myimage> <mymountpoint>");
pr.waitFor();

<myimage><mymountpoint>是绝对路径,所以也没有问题。

  • 我调试了我的命令,它们在控制台上执行时正常工作。
  • 我试过发送其他命令。简单的命令,例如 idpwd正在工作!
  • 我试过使用 /bin/bash -c "<command>" ,但没有用。
  • 我已经尝试执行一个 shell 脚本,该脚本执行命令,但没有用。
  • 我试过在我的命令中转义空格,但没有用。

所以我已经深入挖掘,现在我怀疑某些 Tomcat 安全策略(沙盒?)阻止我执行命令。由于安全对我来说不是问题(它是一个内部系统,与外界完全隔离),我尝试了一种 hack,最近变得非常流行:

System.setSecurityManager(null);

这也没有用。我在 RHEL6 上使用 Java7 和 Tomcat7。 Tomcat7刚刚解压!我在/etc/.. 或除/opt/tomcat/之外的任何其他文件夹中没有任何文件,我从 Tomcat 主页中提取了 zip。我在/opt/tomcat/conf 文件夹中搜索了安全设置,但我只能找到文件 catalina.policy,我似乎无法在其中为 shell 命令设置一些安全级别。

有什么想法吗?

最佳答案

一些事情:

System.setSecurityManager(null);

您刚刚破坏了应用程序的安全性。

Yes, Tomcat is running as root. If I execute id I'm root as well.

立即解决这个问题!

现在进入正题。你不应该让 Tomcat 执行任何事情,你需要将它推迟到一个单独的进程,无论是 shell 脚本还是另一个 Java 程序。这也应该消除(我希望)对运行 Tomcat 的根的依赖。应该可以以无法正常登录系统的非特权用户身份执行此命令。您可以通过配置 /etc/fstab 并为同一用户提供执行此操作的权限来执行此操作。从纯安全 POV 来看,挂载的进程不应由 tomcat 用户拥有。 tomcat 用户也不应该是 root。总结一下:
1) 停止以 root 身份运行 Tomcat
2) 在 Tomcat 上下文之外创建一个单独的进程来运行此挂载
3)创建一个tomcat用户,这个用户不能登录系统,也不能是特权用户(管理员, super 用户等)
4)创建一个进程用户,这个用户要和tomcat用户一样配置
5) 编辑 /etc/fstab 为进程用户提供正确挂载所需的权限。

关于java - 在Tomcat中执行shell命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12533799/

相关文章:

java - struts2如何在JSP页面中包含css文件?

python - 在子进程命令中传递用双引号引起来的参数

java - Swagger OpenAPI 模型与 JPA 实体之间的映射

java - 为什么 java.util.ArrayList.remove(int index) 对于以下代码无法正常工作?

java - Android Keystore getEntry() 和 generateKeyPair() 有时会抛出异常

c - Damn Vulnerable Linux 中缓冲区溢出的有效示例

security - 如何预先确定加密操作中生成的密文的长度?

javascript - 想要 javascript 中 $bhai 的值

linux - 在 Solaris 和 Linux 上确定进程位数的最简单方法

java - Git 多樱桃选择与 Bash 抛出错误