如何在Linux上正确使用沙盒与木偶操纵者并停止变得不安全?

时间:2018-03-29 11:15:40

标签: node.js puppeteer

我阅读了文档:

https://github.com/GoogleChrome/puppeteer/blob/master/docs/troubleshooting.md

https://chromium.googlesource.com/chromium/src/+/master/docs/linux_suid_sandbox_development.md

https://chromium.googlesource.com/chromium/src/+/master/docs/linux_suid_sandbox.md

https://chromium.googlesource.com/chromium/src/+/master/docs/linux_sandboxing.md

https://chromium.googlesource.com/chromium/src/+/master/docs/linux_sandbox_ipc.md

但无法弄清楚如何正确配置沙箱,也无法在我的系统上找到脚本update-linux-sandbox.sh

我发现它here

但我明白了:

$ ./update-linux-sandbox.sh
/tmp/../out/Debug does not exist. Use "BUILDTYPE=Release ./update-linux-sandbox.sh" If you are building in Release mode
$ BUILDTYPE=Release ./update-linux-sandbox.sh
/tmp/../out/Release does not exist. Use "BUILDTYPE=Release ./update-linux-sandbox.sh" If you are building in Release mode

我唯一不安全的解决方法是使用:

const browser = await puppeteer.launch(
    {headless: true, args: ['--no-sandbox', '--disable-setuid-sandbox']}
);

有什么想法做正确的事情吗?

4 个答案:

答案 0 :(得分:3)

如果您正在寻找一种在没有--no-sandbox arg的情况下在Centos7中运行Puppeteer的方法,那么@MevatlaveKraspek答案将无效

通过设置Linux内核参数来启用命名空间(在CentOS Linux版本7.4.1708上),我设法让Puppeteer在没有--no-sandbox标志arg的情况下截取屏幕截图。

以root用户身份运行: echo "user.max_user_namespaces=15000" >> /etc/sysctl.conf
检查它是否适用于: sudo sysctl -a | grep user.max_user_namespaces

现在重启系统并运行脚本而不使用--no-sandbox例如const browser = await puppeteer.launch();

如果它仍然不起作用,您可能正在使用较旧的Linux内核,并且需要在内核中设置一些额外的args。

以root用户身份运行:
grubby --args="user_namespace.enable=1 namespace.unpriv_enable=1" --update-kernel="$(grubby --default-kernel)"

现在重新启动系统并检查刚刚添加的2个参数的内核命令行 cat /proc/cmdline

如果他们在命令行中运行脚本而不再使用--no-sandbox,例如const browser = await puppeteer.launch();

现在应该可以了。如果不是,您可能正在使用不支持命名空间的旧内核。

您可以使用以下方法检查内核版本: uname -a 这是我的内核版本,我让Puppeteer在没有--no-sandbox arg的情况下运行。 Linux centos7 3.10.0-693.21.1.el7.x86_64

希望这会有所帮助:)

答案 1 :(得分:3)

对于Debian,在我的案例版本9 Stretch中,问题似乎与沙盒未打开有关。 Chromium将吐出致命的消息:

  • 没有可用的沙箱!

直到重新启动之前的解决方案(以root身份从命令行运行):

  • echo 1>的/ proc / SYS /内核/ unprivileged_userns_clone

对于更永久的解决方案(以root身份从命令行运行):

  • echo'kernel.unprivileged_userns_clone = 1'> /etc/sysctl.d/00-local-userns.conf
  • service procps restart

更多Debian相关信息可以在这里找到:

答案 2 :(得分:2)

从内核中得出:enable user namespace cloning

sudo sysctl -w kernel.unprivileged_userns_clone=1

答案 3 :(得分:0)

您可以尝试:

以root用户身份运行:echo "user.max_user_namespaces=15000" >> /etc/sysctl.conf

重新加载系统:sysctl -p