安全第一

如果您是唯一参与运行Varnish的人,或者如果所有相关人员都受到同等程度的信任,您可以跳过本章。我们已经尽我们所能地保护Varnish免受任何可以通过HTTP套接字进入的东西的攻击。

如果您的部分Web基础设施被外包或以其他方式按照管理线进行划分,您需要考虑安全性。

Varnish提供了四个级别的权限,大致与Varnish的控制方式和位置相关:

  • 命令行参数、

  • CLI界面,

  • VCL程序,以及

  • HTTP请求。

命令行参数

顶级安全决策是在以命令行参数的形式启动Varnish时决定和定义的,我们使用此策略是为了使它们不受后续操作的影响。

需要做出的重要决定包括:

  1. 谁应该有权访问命令行界面?

  2. 他们可以改变哪些参数?

  3. 是否允许内联C代码?

  4. VMOD是否/如何受到限制?

  5. 子进程将如何被监禁?

CLI接口访问

可以通过三种方式访问命令行界面。

华而不实 可以被告知在TCP套接字上侦听和提供CLI连接。您可以将套接字绑定到内核可以接受的几乎任何内容::

-T 127.0.0.1:631
-T localhost:9999
-T 192.168.1.1:34
-T '[fe80::1]:8082'

缺省值为 -T localhost:0 它将选择一个随机端口号, 瓦尼沙德姆 可以从共享的内存中学习。

通过使用 localhost 地址,则限制对本地计算机的CLI访问。

您还可以将CLI端口绑定到可通过网络访问的IP地址,并让其他计算机直接连接。

这不会给您带来保密性,即CLI命令将以未加密的ASCII文本形式在网络上传输,但 -S /预共享密钥 (PSK) 身份验证要求远程终端知道共享密钥。

或者,您可以将CLI端口绑定到 localhost 地址,并允许远程用户通过使用ssh/VPN或类似的安全连接访问本地计算机。

如果您使用 ssh(1) 您可以将每个用户可以执行的命令限制为 瓦尼沙德姆 ,甚至在周围使用包装器脚本 瓦尼沙德姆 以允许特定的CLI命令。

还可以配置 华而不实 对于“反转模式”,请使用 -M 争论。如果是那样的话 华而不实 将尝试打开到指定地址的TCP连接,并启动到中央Varnish管理设施的CLI连接。

这种情况下的连接也是未加密的,但远程终端仍必须使用 -S /PSK.

最后,如果将varnishd与 -d 选项,您将在stdin/stdout上获得CLI命令,但由于您启动了该进程,因此很难阻止您获得CLI访问权限,不是吗?

CLI接口身份验证

默认情况下,CLI接口使用简单但功能强大的“预共享密钥”身份验证方法进行保护,该方法不提供保密性(即:CLI命令和响应未加密)。

这条路 -S /PSK的工作原理非常简单:在启动过程中,会创建一个包含随机内容的文件,并且只有启动的用户才能访问该文件 华而不实 (或超级用户)。

要验证和使用CLI连接,您需要知道该文件的内容,以便回答加密质询 华而不实 问题,请参阅 身份验证CLI连接

瓦尼沙德姆 使用所有这些来限制访问,它将只起作用,前提是它可以读取机密文件。

如果您希望允许其他用户(本地或远程)能够访问CLI连接,则必须创建您自己的机密文件,并使其能够(仅限!)这些用户来阅读它。

创建机密文件的一个好方法是::

dd if=/dev/random of=/etc/varnish_secret count=1

当您开始 华而不实 ,你用‘-S’指定文件名,不用说 华而不实 主进程也需要能够读取该文件。

您可以更改机密文件的内容,同时 华而不实 运行时,每次对CLI连接进行身份验证时都会读取它。

在本地系统上, 瓦尼沙德姆 可以从共享内存中检索文件名,但在远程系统上,您需要提供 瓦尼沙德姆 一份秘密文件的副本,带有-S的论点。

如果要禁用 -S /PSK身份验证,请使用 -S none Varnishd::的参数

varnishd [...] -S none [...]

参数

可以从命令行设置参数,并将其设置为“只读”(使用‘-r’),这样以后就不能从CLI界面修改它们。

几乎任何参数都可以用来完全扰乱您的HTTP服务,但几个参数造成的破坏比其他参数更大:

cc_command

执行任意程序

vcc_allow_inline_c

允许VCL中的内联C,这将允许VCL中的任何C代码由Varnish执行。

此外,您可能希望查看并锁定:

syslog_cli_traffic

将所有CLI命令记录到 syslog(8) ,所以你知道发生了什么。

vcc_unsafe_path

将VCL/VMOD限制为 vcl_pathvmod_path

vmod_path

Varnish将在其中查找模块的目录(或冒号分隔的目录列表)。这可能被用来将恶意模块加载到Varnish中。

CLI界面

Varnish中的CLI界面非常强大,如果您有权访问CLI界面,您几乎可以对Varnish进程执行任何操作。

如上所述,可以通过限制某些参数来限制某些损害,但这只会保护本地文件系统和操作系统,而不会保护您的HTTP服务。

我们目前无法将特定的CLI命令限制为特定的CLI连接。获得这种效果的一种方法是将所有CLI访问“包装”在预先批准的脚本中,这些脚本使用 瓦尼沙德姆 提交经过清理的CLI命令,并限制远程用户只能访问这些脚本,例如使用sshd(8)的S配置。

VCL程序

VCL代码中有两种“危险”机制:VMODS和内联C。

这两种机制都允许执行任意代码,从而允许用户使用子进程的权限访问机器。

如果 华而不实 是以根用户/超级用户身份启动的,我们使用操作系统上可用的任何工具对子进程进行沙箱保护,但如果 华而不实 未以超级用户/超级用户身份启动,这是不可能的。不,不要问我为什么您必须是超级用户才能降低子进程的权限...

从Varnish版本4开始,默认情况下禁用inline-C,所以除非您启用它,否则您不必担心它。

上述参数可以将VMOD的加载限制为仅从指定目录加载,从而将VCL争论者限制为预先批准的VMOD子集。

如果您这样做,我们相信您的本地系统不会受到VCL代码的危害。

Http请求

我们已经竭尽全力使Varnish抵抗通过接收HTTP请求的套接字进入的任何内容,一般来说,您应该不需要进一步保护它。

需要注意的是,由于VCL是一种编程语言,可以让您准确地决定如何处理HTTP请求,因此您还可以决定使用它们做一些愚蠢和潜在危险的事情,包括让自己面临各种攻击和颠覆性活动。

如果您有“管理”的HTTP请求,例如清除请求,我们强烈建议您将其限制为使用VCL的可信IP号/网络 访问控制列表(ACL)