2014-09-28 4 views
0

현재 CentOS 서버에 저장되어있는 Java 기반 응용 프로그램은 많은 돈이들 것입니다. 허용하지 않고 충돌이 발생하면 응용 프로그램을 다시 시작하는 방법을 누군가에게 제공해야합니다. 실제로 손상되었을 수있는 Java 클래스 파일에 실제로 액세스 할 수 있습니다.리눅스 권한을 실행하지만 읽을 수는 없습니다.

내가 할 수있는 방법이 있는지 궁금한가요? IE는 명령을 jailed 쉘을 가질 수있는 방법이있는 경우에만 응용 프로그램을 시작하는 bash 스크립트를 실행하도록 제한되었거나 제 3 자 응용 프로그램을 작성해야이 모든 것을 처리 할 수 ​​있습니까?

감사합니다.

+2

근본적으로 불가능합니다. 파일을 읽지 않고 실행할 수는 없습니다. – SLaks

+0

@SLaks Linux/UNIX는 파일을 실행할 권한 ("x")을 가지고 있지만 읽을 필요는 없습니다 ("r")./실행중인 jar 파일을 지원하는 Linux를 찾지는 못하지만 조금 까다 롭습니다. 나는 당신이 끈적 끈적한 비트 설정 런처를 가질 수 있다고 생각하지만, 반드시 옳은 것은 반드시 쉬운 것은 아닙니다. –

+1

@ TomHawtin-tackline : 그러나 코드를 실행하려면 여전히 어떻게 든 읽어야합니다. – SLaks

답변

1

응용 프로그램을 시작하는 작은 포장지를 작성하십시오. 가장 간단한 방법은 쉘 래퍼를 만드는 것입니다.

#!/bin/sh 
java ... 

하지만 서버 설치에서는 작동하지 않을 가능성이 있습니다. 아래를 참조하십시오.

변경 jar 파일을 읽을 수있는 권한이 사용자와 그룹에 래퍼의 소유자와 그룹 : 그래서 (

$ chown user:group wrapper 

래퍼의 권한이 세계적으로 실행하게 변경하고, setuid을 그것은 이전 단계에서 설정 한 래퍼의 소유자)로 실행됩니다 :

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

그런 다음 래퍼는 실행 파일 또는 지원 파일을 통해 누구 추가 권한을 부여하지 않고, 지정된 사용자로 실행됩니다.

이 아닌은 포장 자의 소유자가되도록하는 것이 좋습니다. root. 당신이 통제하지만 루트 액세스 권한이없는이 목적을 위해 생성 된 사용자를 사용하십시오.


경우 시스템이 여기에 작동해야하는 간단한 C 래퍼입니다 (즉, 오두막 (#!) 라인 스크립트) 통역 setuid 비트를 준수하지 않습니다. 아래 표시된대로 수정해야하고 컴파일합니다 :

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; 
} 

신뢰할 수없는 사용자가 응용 프로그램이 위의 래퍼는 또한 "제한된 쉘 '로 사용할 수있는 실행중인 호스트에 다른 액세스 권한이없는 경우; 사용자의 쉘로 만들거나 (그렇지 않으면 ssh을 구성하여 해당 사용자가 로그인 할 때 래퍼를 실행하게 됨) 로그인시 자동으로 다시 시작됩니다. 그러나 응용 프로그램이 이미 실행 중이거나 시작되었는지 확인하지 않는 한 실제로는 좋은 생각이 아닙니다. 또는이 검사를 수행하도록 수정할 수 있습니다. 또는 래퍼를 수정하여 응용 프로그램을 다시 시작하기 전에 현재 실행 중인지 여부를 감지 할 수 있습니다. 이 두 가지 가능성 중 하나는이 대답에 삽입 될 수있는 것보다 자세한 내용을 포함합니다.

+0

+1 그러나,'setuid()'쉘 스크립트는 대부분의 최신 운영 체제에서 거부되었습니다. 래퍼를 컴파일 된 프로그램으로 만들어야합니다. – 5gon12eder

+0

@ 5gon12eder : 또 다른 해결책은 jvm에 setuid 하드 링크를 만드는 것이지만 설명하기에는 너무 복잡해 보입니다. – rici

+1

@ 5gon12eder : Ok, 쉘을 사용하지 않고 (심지어'PATH') 피할 수있는 최소한의 C 래퍼를 삽입했습니다. – rici

1

실행 가능 비트 세트와 읽을 수있는 비트가있는 파일을 절대 가질 수 있으며 예상 한대로 작동합니다. 다음 프로그램을 고려 :

#include <stdio.h> 

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

는 이제 JAR 파일을

$ 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 

문제를 할 수있는 것은 그들이 실행하지 않은 것입니다. 그것들은 운영 체제에 의해 RAM에 매핑되지 않지만 은 열었으며 JVM에 의해을 읽었으며 읽기 권한이 설정되어 있지 않으면이를 수행 할 수 없습니다.

귀하의 우려는 부당하다고 생각됩니다. *.class 파일에 대한 읽기 권한을 부여하는 것은 무해합니다. 필요없는 쓰기 가능하지 않으면 손상 될 수 없습니다. 비밀번호와 같은 중요한 데이터를 *.class 파일에 저장하는 경우 해당 결정을 재고해야한다고 생각합니다.

+0

이것이 OP에 어떻게 대답하는지 모르겠습니다. 의견에 대한 답변입니다. – rici

+0

@rici 왜 (파일 시스템 권한만을 사용하여) 불가능한지를 설명하고 싶었고 필요하지도 않다고 주장했다. 공평하게 말하자면, 귀하의 코멘트는 아마도 이후 편집 된 답변의 부분적인 상태를 나타낼 것입니다. 아직도 쓸모가 없다고 생각합니까? – 5gon12eder

+0

나는 그것이 불가능하다고 생각하지 않는다. 나는 OP가 가지고있는 문제 (아마도 상상의 것)를 포착했다고 생각하지 않는다. 그것은 (신뢰할 수없는 사용자가) jar 파일을 설치하거나, ​​다른 컴퓨터에 설치한다고 말하면 - 또는, 적어도 그것이 우려의 해석 일 수 있습니다. – rici

관련 문제