是否可以使用NGINX的root权限执行bash脚本并获取输出?

时间:2017-09-27 22:19:30

标签: nginx lua luajit openresty

我在Openresty版本下运行Nginx,因此启用了Lua脚本。我想创建一个URI位置(除了IP白名单外,还将使用SSL +身份验证进行保护),允许来自授权来源的webhooks调用使用root权限在服务器上执行bash脚本。 e.g。

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

NGINX将使用'script'和'param#'GET请求参数在shell中执行“script.sh uno dos”。它捕获脚本输出和bash返回代码(如果可能的话)。

我理解以root身份运行NGINX并运行任意命令的安全隐患,但如上所述,对URI的访问将是安全的。

这可以通过原生NGINX模块或Lua脚本来实现吗?是什么样的代码让我入手?

谢谢。

1 个答案:

答案 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&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在bash中查看完整的服务器,请查看https://github.com/avleen/bashttpd/blob/master/bashttpd