Java 运行但不读取文件的Linux权限

Java 运行但不读取文件的Linux权限,java,linux,bash,security,Java,Linux,Bash,Security,我目前有一个基于Java的应用程序存储在我的CentOS服务器上,它可能值很多钱,我需要知道如何在应用程序崩溃的情况下让某人重新启动应用程序,而不允许他们实际访问Java类文件,因为这些文件可能会被破坏 我只是想知道有没有办法?也就是说,如果有一种方法,我可以让一个被囚禁的shell命令只限于运行启动应用程序的bash脚本,或者如果我需要编写一个第三方应用程序来为我处理所有这些 感谢阅读编写一个启动应用程序的小包装。最简单的方法是创建外壳包装器: #!/bin/sh java ... 但这很可

我目前有一个基于Java的应用程序存储在我的CentOS服务器上,它可能值很多钱,我需要知道如何在应用程序崩溃的情况下让某人重新启动应用程序,而不允许他们实际访问Java类文件,因为这些文件可能会被破坏

我只是想知道有没有办法?也就是说,如果有一种方法,我可以让一个被囚禁的shell命令只限于运行启动应用程序的bash脚本,或者如果我需要编写一个第三方应用程序来为我处理所有这些


感谢阅读

编写一个启动应用程序的小包装。最简单的方法是创建外壳包装器:

#!/bin/sh
java ...
但这很可能在服务器安装上不起作用。见下文

将包装的所有者和组更改为具有读取jar文件权限的用户和组:

$ chown user:group wrapper
更改包装的权限,使其成为全局可执行文件,以及
setuid
(以便它将作为包装的所有者运行,在上一步中设置):

然后包装器将作为指定的用户运行,而不给任何人对可执行文件或其支持文件的额外权限

我强烈建议不要将包装的所有者设置为root。使用为此目的创建的一些用户,这些用户由您控制,但没有根访问权限


如果您的系统不支持解释器的setuid位(即带有shebang(
#!
)行的脚本),这里有一个简单的C包装器,它应该可以工作。您必须按如下所示对其进行修改,然后对其进行编译:

cc -Wall -o wrapper wrapper.c
-o wrapper
的意思是“要生成的二进制文件将被称为
wrapper
)替换您喜欢的任何名称,并将包装文件放在可以找到它的地方,例如
/usr/local/bin/wrapper
。在不了解任何系统配置的情况下,很难给出精确的说明。祝您好运

我不知道如何运行应用程序,但您必须将命令行插入以下代码中,用实际使用的命令替换
java
,并用
/path/to/java
输出
哪个java
(如果不是“java”,请再次使用实际的命令名)。将插入命令行中的参数,而不是插入
arg1
arg2
等。不使用额外的引号;只插入构成命令行的字符

#include <stdio.h>
#include <unistd.h>
int main() {
   execl("/path/to/java",
         "java",
         "arg1",
         "arg2",
         /* ... */
         (char*)0);
  /* If we get here, the exec didn't work */
  perror("Failed to execute /path/to/java");
  return 1;
}
#包括
#包括
int main(){
execl(“/path/to/java”,
“爪哇”,
“arg1”,
“arg2”,
/* ... */
(char*)0);
/*如果我们到了这里,执行官就不工作了*/
perror(“未能执行/path/to/java”);
返回1;
}


如果不受信任的用户对运行应用程序的主机没有任何其他访问权限,则上述包装器也可以用作“受限外壳”;使其成为用户的外壳(或者配置
ssh
,以便该用户的登录将运行包装器)将导致登录时自动重新启动。但是,这并不是一个好主意,除非应用程序知道如果它已经在运行,就不启动自己,或者可以修改它来执行此检查。或者,可以修改包装器,在重新启动应用程序之前尝试检测应用程序当前是否正在运行。这些WO的可能性涉及到比插入到这个答案中更多的细节。

< P>绝对可以有一个文件,其中有可执行的位集和可读的位,并且它将按照您的预期去做。
#包括
int
main()
{
printf(“你好,世界”\n);
返回0;
}
现在你可以做了

$cc-o main.c-static
$chmod 0100干管
$ls-l
---x-----1用户821801 9月28日16:39主
-rw-r-----1用户75 Sep 28 16:39 main.c
美元/主要
你好,世界
$cat./main
cat:main:权限被拒绝
JAR文件的问题在于它们不是可执行文件。它们不是由操作系统映射到RAM中的,而是由JVM打开和读取的,如果没有对它们设置读取权限,JVM将无法执行此操作


也就是说,您的担心可能是没有根据的。授予
*.class
文件的world read权限应该是无害的。除非它们是不需要的可写的,否则它们不能被破坏。如果您在
*.class
文件中存储敏感数据,如密码,我认为您应该重新考虑该决定。

根本不可能。如果不读取文件,就不能运行它。@SLaks Linux/UNIX有运行文件的权限(“x”),但不一定要读取它(即“r”)/如果发现Linux支持执行jar文件,我不会感到惊讶,但这似乎有点冒险。我想你可以有一个粘性位集启动器,但这不一定很容易正确。@TomHawtin tackline:但是为了执行代码,你仍然需要以某种方式读取它。你需要使用一些过滤器或mmands,或setuid包装器,然后以不同的用户ID运行程序,允许读取和执行该程序。您允许重新启动应用程序的人获得了很多信任,如果它确实“值很多钱的话”“,无论如何可能有一些合同……我看不出这是如何回答OP的。这是对一条评论的回应。@rici我想解释为什么不可能(仅使用文件系统权限),并认为也不需要它。公平地说,你的评论可能指的是我自那以后编辑的答案的一部分。你认为它仍然是无用的吗?我不认为这是不可能的,我也不认为你抓住了OP的问题(可能是虚构的),那就是他/她不想(不受信任的用户)窃取jar文件的副本,比如说安装在另一台机器上——或者,至少,这是对con的一种可能的解释
#include <stdio.h>
#include <unistd.h>
int main() {
   execl("/path/to/java",
         "java",
         "arg1",
         "arg2",
         /* ... */
         (char*)0);
  /* If we get here, the exec didn't work */
  perror("Failed to execute /path/to/java");
  return 1;
}