Pet*_*ich 6 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();
Run Code Online (Sandbox Code Playgroud)
<myimage>并且<mymountpoint>是绝对路径,所以也没有问题.
id和pwd正在工作!/bin/bash -c "<command>",但是没用.所以我挖得更深,现在我怀疑一些Tomcat安全策略(Sandbox?),这阻止我执行命令.由于安全性对我来说没有问题(它是一个内部系统,与外部世界完全隔离),我尝试了一个黑客,它最近变得非常流行:
System.setSecurityManager(null);
Run Code Online (Sandbox Code Playgroud)
这也不起作用.我在RHEL6上使用Java7和Tomcat7.Tomcat7刚刚被提取出来!我在/ etc/..或/ opt/tomcat /之外的任何其他文件夹中没有任何文件,我从Tomcat主页中提取了zip.我在/ opt/tomcat/conf文件夹中搜索了安全设置,但我找到的只是文件catalina.policy,它似乎不能为shell命令设置一些安全级别.
有任何想法吗?
一些东西:
System.setSecurityManager(null);
Run Code Online (Sandbox Code Playgroud)
你刚刚杀死了应用程序的安全性.
是的,Tomcat以root身份运行.如果我执行id我也是root.
立即修复此问题!
现在回答这个问题.你不应该让Tomcat执行任何操作,你需要将它推迟到一个单独的进程,无论是shell脚本还是其他Java程序.这也应该删除(我希望)对运行Tomcat的root的依赖.应该可以作为无法正常登录系统的非特权用户执行此命令.您可以通过配置/etc/fstab并向同一用户提供执行此操作的权限来执行此操作.从纯安全POV中,安装的进程不应由tomcat用户拥有.tomcat用户也不应该是root用户.所以回顾一下:
1)停止以root身份运行Tomcat
2)在Tomcat上下文之外创建一个单独的进程来运行这个mount
3)创建一个tomcat用户,这个用户不应该能够登录到系统,也不应该是特权用户(管理员,超级用户等)
4)创建进程用户,该用户应完全配置为tomcat用户
5)编辑/etc/fstab为进程用户提供正确安装所需的权限.
使用单字符串形式通常是个坏主意Runtime.exec.一个更好的选择是自己使用ProcessBuilder和分割参数,而不是依靠Java来为你分割它们(它做得非常天真).
ProcessBuilder pb = new ProcessBuilder("/bin/mount", "-o", "loop", /*...*/);
pb.redirectErrorStream(true); // equivalent of 2>&1
Process p = pb.start();
Run Code Online (Sandbox Code Playgroud)
你说你在RHEL上,所以你有selinux活跃吗?检查你的日志,看看这是否阻止了你(我认为这是你正在寻找的audit.log,自从我使用selinux已经有几年了).如果这确实是问题所以你应该问超级用户或serverfault而不是SO ...
| 归档时间: |
|
| 查看次数: |
18415 次 |
| 最近记录: |