2017-09-27 8 views
1

Openresty에서 Nginx를 실행 중이므로 Lua 스크립팅이 사용됩니다. 인증 된 출처의 webhooks 호출이 루트 권한을 사용하여 서버에서 bash 스크립트를 실행할 수있게 해주는 URI 위치 (IP 허용 목록 이외에 SSL + 인증으로 보안 됨)를 만들고 싶습니다. 예 :NGINX의 루트 권한을 가진 bash 스크립트를 실행하고 결과를 얻을 수 있습니까?

https://someserver.com/secured/exec?script=script.sh&param1=uno&param2=dos

의 nginx는 '스크립트'와 'PARAM 번호'를 사용하는 것이 요청 인수는 쉘에서 "script.sh 우노 도스"를 실행하세요. 스크립트 출력 및 bash 리턴 코드를 캡처합니다 (가능한 경우).

나는 루트로서 NGINX를 실행하고 임의의 명령을 실행하는 보안 관련 사항을 이해하고 있지만 언급 된 바와 같이 URI에 대한 액세스는 안전하게 보호됩니다.

기본 NGINX 모듈 또는 Lua 스크립팅을 통해 가능합니까? 시작하기위한 샘플 코드는 무엇입니까?

감사합니다.

+0

사용에서 봐 가지고 https://github.com/jprjr/lua-resty-exec 또는 https://github.com/juce/ 루아 - 레시 쉘. Sockproc을 루트로 시작하십시오. –

+0

고맙습니다. ' 데몬을 실행하지 않아도되는 방법이 있는지 궁금합니다. lua os.execute는 쉘 명령을 실행할 수는 있지만 출력이나 상태 코드를 반환 할 수없는 것 같습니다. 나는 bash wrapper 스크립트를 만들 생각을했다.이 스크립트는 스크립트 이름을 취하고 args (자신의 args처럼)를 실행하고 실행한다. 그런 다음 Lua가 읽을 수 있도록 출력을 종료하고 텍스트 파일로 종료 코드를 덤프합니다. Prob는 랩퍼 스크립트에 고유 ID를 전달하여 두 파일 호출이 동일한 파일에 기록되지 않도록 파일 이름으로 사용되어야합니다. 누구나 깨끗한 해결책을 생각할 수 있을지 궁금합니다. – bobbybay

+0

https://stackoverflow.com/questions/132397/get-back-the-output-of-os-execute-in-lua –

답변

0

추가적인 nginx lua 플러그인이 필요없는 또 다른 해결책이 있습니다. 이것은 socat을 사용하고 있습니다. 당신은 모든 연결에 bash는 스크립트를

socat TCP4-LISTEN:8080,reuseaddr,fork EXEC:./test.sh 

test.sh

#!/bin/bash 

recv() { echo "< [email protected]" >&2; } 

    read r line 
    line=${line%%$'\r'} 
    recv "$line" 

    read -r REQUEST_METHOD REQUEST_URI REQUEST_HTTP_VERSION <<<"$line" 

declare -a REQUEST_HEADERS 

while read -r line; do 
    line=${line%%$'\r'} 
    recv "$line" 

    # If we've reached the end of the headers, break. 
    [ -z "$line" ] && break 

    REQUEST_HEADERS+=("$line") 
done 
eval $(echo $REQUEST_METHOD | awk -F? '{print $2}' | awk -F'&' '{for (i=1;i<=NF;i++) print $i}') 


cat <<END1 
HTTP/1.1 200 OK 
Content-Type: plain/text 

REQUEST_METHOD=$REQUEST_METHOD 
REQUEST_URI=$REQUEST_URI 
REQUEST_HTTP_VERSION=$REQUEST_HTTP_VERSION 
REQUEST_HEADERS=$REQUEST_HEADERS 
script=$script 
param1=$param1 
param2=$param2 
END1 

그리고 컬에 대한 테스트를 실행 포트 8080에 socat을 시작 그래서 당신은

$ curl "localhost:8080/exec?script=test2.sh&param1=abc&param2=def" 
REQUEST_METHOD=/exec?script=test2.sh&param1=abc&param2=def 
REQUEST_URI=HTTP/1.1 
REQUEST_HTTP_VERSION= 
REQUEST_HEADERS=Host: localhost:8080 
script=test2.sh 
param1=abc 
param2=def 

다음과 같다 nginx에서 proxy_pass으로 쉽게 사용할 수 있습니다.

당신이 떠들썩한 파티에서 전체 서버 socat를 사용하여 참조해야하는 경우

https://github.com/avleen/bashttpd/blob/master/bashttpd

관련 문제