2017-09-27 2 views
1

ich Nginx unter Openresty renne bauen so Lua Scripting aktiviert ist. Ich mag einen URI Ort erstellen (die mit SSL + Authentifizierung zusätzlich zur IP-Whitelist gesichert werden), die webhooks Anrufe von autorisierten Quellen ermöglicht Bash-Skripte auf dem Server mit Root-Berechtigung ausführen. z.B.Ist es möglich, einen Bash-Skript mit root-Berechtigung von NGINX und erhält die Ausgabe auszuführen?

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

NGINX würde die 'script' verwenden und 'param #' GET Anfrage Argumente "script.sh uno dos" in einer Shell auszuführen. Es erfasst die Skript-Ausgabe und den Bash-Return-Code (wenn das möglich ist).

Ich verstehe die Auswirkungen auf die Sicherheit von NGINX als root läuft und beliebige Befehle ausgeführt, sondern als Zugang zum URI erwähnt würde gesichert werden.

Ist dies möglich über native NGINX Module oder vielleicht Lua Scripting? Irgendein Beispielcode, um mich zu beginnen?

Vielen Dank.

+0

Verwenden https://github.com/jprjr/lua-resty-exec oder https://github.com/juce/ Lua-Resty-Schale. Starten Sie Sockproc als root. –

+0

Danke. Ich frage mich, ob es ' s eine Möglichkeit gibt, die nicht erfordert, einen Daemon auszuführen. Scheint, dass lua os.execute einen Shell-Befehl ausführen kann, aber seinen Ausgabe- oder Statuscode nicht zurückgeben kann. Ich dachte daran, ein Bash-Wrapper-Skript zu erstellen, das den Skriptnamen und seine Argumente (wie es eigene Argumente sind) übernimmt und ausführt. Dann wird der Ausgabe- und Exit-Code in Textdateien ausgegeben, damit sie von Lua gelesen werden können. Prob sollte eine eindeutige ID an das Wrapper-Skript übergeben, das als Dateiname verwendet wird, um sicherzustellen, dass keine zwei Aufrufe über dieselbe Datei geschrieben werden. Ich frage mich, ob jemand an eine sauberere Lösung denken kann. – bobbybay

+0

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

Antwort

0

Es ist eine weitere mögliche Lösung, die zusätzlich nginx lua Plugins nicht benötigen. Dies verwendet socat. Sie starten einen socat auf Port 8080, die auf jeder Verbindung ein Bash-Skript

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 

und Test auf curl führt wie unten

$ 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 

So Sie kann dies leicht für eine proxy_pass in Nginx verwenden.

Wenn Sie komplette Server in bash müssen sehen socat verwenden, haben einen Blick auf https://github.com/avleen/bashttpd/blob/master/bashttpd

Verwandte Themen