2014-09-28 37 views
0

我目前有一個基於Java的應用程序存儲在我的CentOS服務器上,這可能是值得很多錢,我需要一些如何讓某人訪問重新啓動應用程序,以防萬一它崩潰,而不允許他們實際上可以訪問他們可能受到危害的java類文件。Linux權限運行但不能讀取文件

只是想知道是否有辦法我可以做到這一點? IE瀏覽器,如果有一種方式我可以有一個jailed shell命令只限於運行啓動應用程序的bash腳本,或者如果我需要編寫第三方應用程序來處理所有這些對我來說?

感謝您的閱讀

+2

這是根本不可能的。沒有閱讀它就無法運行文件。 – SLaks 2014-09-28 14:13:06

+0

@SLaks Linux/UNIX有一個權限(「x」)來運行一個文件,但不一定讀它(這將是「r」)。 /我不會驚訝地發現Linux支持執行jar文件,但這似乎有點冒險。我想你可能會有一個粘滯的發射器,但它不一定容易得到正確的。 – 2014-09-28 14:22:35

+1

@ TomHawtin-tackline:但是爲了執行代碼,你仍然需要以某種方式讀取它。 – SLaks 2014-09-28 14:23:16

回答

1

寫一個小包裝,啓動應用程序。最簡單的方法是創建一個shell包裝器:

#!/bin/sh 
java ... 

但是這很可能在服務器安裝上不起作用。見下文。

更改包裝的所有者和組用戶和組具有權限讀取的jar文件:

$ chown user:group wrapper 

更改包裝的權限,使其全球可執行文件,並setuid(所以它將運行作爲包裝的車主,在上一步驟設置):

$ chmod a+rx,og-w,u+s wrapper 

然後包裝將作爲指定的用戶運行,而不需要通過可執行文件或它的支持文件給任何額外的特權。

我強烈建議不是使包裝的所有者root。使用爲此目的創建的某個用戶,該用戶可以控制但不具有root訪問權限。


如果你的系統不接受口譯setuid位(即,具有認領(#!)行腳本),這裏有一個簡單的C包裝應該工作。你必須修改它,如下所示,然後編譯:

cc -Wall -o wrapper wrapper.c 

-o wrapper的意思是「生產二進制文件將被稱爲wrapper)替換任何你喜歡的名字,並把包裝文件的地方它可以被發現,如/usr/local/bin/wrapper。很難給出精確的指令,而不知道你的系統配置。祝你好運

我不知道你如何運行你的應用程序,但你必須插入命令輸入以下代碼,將java替換爲實際使用的命令,將/path/to/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; 
} 

如果不可信用戶不具有任何其他訪問該應用程序正在運行時,上述的包裝也可以用作「受限shell」主機;使其成爲用戶的外殼(或以其他方式配置ssh以便該用戶的登錄將運行包裝器)將導致登錄時自動重啓。然而,這不是一個好主意,除非應用程序知道如果它已經在運行,或者可以被修改來執行這個檢查,就不會自行啓動。或者,可以修改包裝以嘗試在重新啓動應用程序之前檢測應用程序當前是否正在運行。這兩種可能性中的任何一種涉及比可以插入到該答案中更多的細節。

+0

+1但是,'setuid()'編寫的shell腳本(由於很好的理由)被大多數現代操作系統所拒絕。你需要將包裝器編譯成一個程序。 – 5gon12eder 2014-09-28 14:58:40

+0

@ 5gon12eder:另一種解決方案是創建一個到jvm的setuid硬鏈接,但這看起來太複雜了,無法解釋。 – rici 2014-09-28 15:21:59

+1

@ 5gon12eder:好的,插入一個最小的C包裝器,它將完成它,避免使用shell(甚至是'PATH')。 – rici 2014-09-28 15:36:56

1

你可以絕對有一個文件的可執行位設置和可讀性不是,它會做你的期望。考慮下面的程序:

#include <stdio.h> 

int 
main() 
{ 
    printf("hello, world\n"); 
    return 0; 
} 

現在你可以做

$ cc -o main main.c -static 
$ chmod 0100 main 
$ ls -l 
---x------ 1 user user 821801 Sep 28 16:39 main 
-rw-r----- 1 user user  75 Sep 28 16:39 main.c 
$ ./main 
hello, world 
$ cat ./main 
cat: main: Permission denied 

的問題JAR文件是,他們不是可執行文件。它們沒有被操作系統映射到RAM中,但是由JVM打開並且讀取並且讀取,並且在沒有對它們設置讀取權限的情況下不能這樣做。

也就是說,你的擔心可能是沒有根據的。授予*.class文件的世界讀取權限應該是無害的。除非它們是可寫的,否則它們不能被妥協。如果您將密碼等敏感數據存儲在*.class文件中,我認爲您應該重新考慮該決定。

+0

我不明白這是如何回答OP。這是對評論的迴應。 – rici 2014-09-28 14:46:08

+0

@rici我想*解釋*爲什麼它是不可能的(只使用文件系統權限),並認爲它不是必需的。公平地說,你的評論可能指的是我從那時起編輯答案的部分狀態。你認爲它仍然沒用嗎? – 5gon12eder 2014-09-28 14:54:53

+0

我不認爲這是不可能的,我不認爲你捕捉到OP有哪些問題(可能是虛構的),這是他/他不希望(不可信用戶)*竊取*副本jar文件,說安裝在另一臺機器上 - 或者至少,這是對這個問題的一種可能的解釋。 – rici 2014-09-28 15:48:31