我在Openresty版本下运行Nginx,因此启用了Lua脚本。我想创建一个URI位置(除了IP白名单外,还将使用SSL +身份验证进行保护),允许来自授权来源的webhooks调用使用root权限在服务器上执行bash脚本。 e.g。
https://someserver.com/secured/exec?script=script.sh¶m1=uno¶m2=dos
NGINX将使用'script'和'param#'GET请求参数在shell中执行“script.sh uno dos”。它捕获脚本输出和bash返回代码(如果可能的话)。
我理解以root身份运行NGINX并运行任意命令的安全隐患,但如上所述,对URI的访问将是安全的。
这可以通过原生NGINX模块或Lua脚本来实现吗?是什么样的代码让我入手?
谢谢。
答案 0 :(得分:2)
还有另一种可能的解决方案,它不需要额外的nginx lua插件。这是使用socat
。您在端口8080
上启动一个socat,它在每个连接上执行一个bash脚本
socat TCP4-LISTEN:8080,reuseaddr,fork EXEC:./test.sh
<强> test.sh 强>
#!/bin/bash
recv() { echo "< $@" >&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
测试卷曲如下
$ curl "localhost:8080/exec?script=test2.sh¶m1=abc¶m2=def"
REQUEST_METHOD=/exec?script=test2.sh¶m1=abc¶m2=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在bash中查看完整的服务器,请查看https://github.com/avleen/bashttpd/blob/master/bashttpd