2017-09-27 4 views
1

Je cours Nginx sous la construction d'Openresty ainsi le script de Lua est permis. Je veux créer un emplacement URI (qui sera sécurisé avec l'authentification SSL + en plus de la liste blanche IP) qui permet aux appels webhooks provenant de sources autorisées d'exécuter des scripts bash sur le serveur en utilisant l'autorisation root. par exemple.Est-il possible d'exécuter un script bash avec l'autorisation root de NGINX et obtenir la sortie?

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

NGINX utiliserait le 'scénario' et '# param' GET arguments de requête pour exécuter "script.sh uno dos" dans une coquille. Il capture la sortie du script et le code de retour bash (si c'est possible). Je comprends les implications en termes de sécurité de l'exécution de NGINX en tant que commandes arbitraires exécutant la racine, mais comme mentionné, l'accès à l'URI serait sécurisé. Est-ce possible via des modules natifs NGINX ou peut-être des scripts Lua? Tout exemple de code pour me lancer?

Merci.

+0

Utilisez https://github.com/jprjr/lua-resty-exec ou https://github.com/juce/ lua-resty-shell. Démarrez Sockproc en tant que root. –

+0

Merci. Je me demande s'il y a ' d'une façon qui n'exige pas l'exécution d'un démon. Semble lua os.execute peut exécuter une commande shell mais ne peut pas renvoyer son code de sortie ou d'état. J'ai pensé à créer un script bash qui prend le nom du script et ses arguments (comme c'est son propre args) et l'exécute. Ensuite, la sortie et le code de sortie sont stockés dans des fichiers texte afin qu'ils puissent être lus par Lua. Prob devrait transmettre un identifiant unique au script wrapper pour être utilisé comme nom de fichier afin de garantir que deux appels n'écrivent pas sur le même fichier. Je me demande si quelqu'un peut penser à une solution plus propre. – bobbybay

+0

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

Répondre

0

Il existe une autre solution possible qui ne nécessitera pas de plugins nginx lua supplémentaires. Ceci utilise socat. Vous commencez un socat sur le port 8080 qui, à chaque connexion exécute un script 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 

Et test sur boucle est comme ci-dessous

$ 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 

Vous peut facilement utiliser ceci pour un proxy_pass dans nginx.

Si vous avez besoin voir serveur complet dans bash en utilisant socat, un coup d'oeil à https://github.com/avleen/bashttpd/blob/master/bashttpd