安全第一¶
如果您是唯一参与运行Varnish的人,或者如果所有相关人员都受到同等程度的信任,您可以跳过本章。我们已经尽我们所能地保护Varnish免受任何可以通过HTTP套接字进入的东西的攻击。
如果您的部分Web基础设施被外包或以其他方式按照管理线进行划分,您需要考虑安全性。
Varnish提供了四个级别的权限,大致与Varnish的控制方式和位置相关:
命令行参数、
CLI界面,
VCL程序,以及
HTTP请求。
命令行参数¶
顶级安全决策是在以命令行参数的形式启动Varnish时决定和定义的,我们使用此策略是为了使它们不受后续操作的影响。
需要做出的重要决定包括:
谁应该有权访问命令行界面?
他们可以改变哪些参数?
是否允许内联C代码?
VMOD是否/如何受到限制?
子进程将如何被监禁?
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
- 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) 。