安全第一

如果只有你一个人参与Varnish的运维,或者所有人都有相同的信任度,您可以跳过本节。不管HTTP传过来任何内容,我们都应该能够很好的保护Varnish。

如果您的网络设备是托管或者是按部门划分,那么你应该考虑安全性问题。

Varnish提供了4个级别的权限,大致是怎样操控和什么地方来操控Varnish的:

  • 命令行参数
  • CLI接口
  • VCL程序
  • HTTP请求

命令行参数

最高级别的安全策略是在启动Varnish的时候定义命令行的参数。我们使用这种策略是为了让操作更安全。

但更重要的是,我们需要确保这些:

  • 谁应该有命令行权限?
  • 你可以修改哪些参数?
  • 哪些内联C代码是被允许的?
  • VMODs是否要被限制,如何被限制?
  • 如何禁用子进程?

CLI接口权限

命令行接口可以通过三种方式来访问。

varnishd 监听状态时会提供一个CLI链接在TCP socket上。你可以在socket上面绑定几乎任何东西,内核都是接受的:

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

默认的是-T localhost:0, 它会挑选一个随机端口,可以使用varnishadm(8) 来从共享内存中获取信息。

通过使用localhost,你可以限制CLI访问到本地计算机。

您也可以绑定端口到一个网络可以连通的IP地址,以让其他机器可以直接访问。

这个是非加密的,cli命令会以非加密的ASCII文本的形式在网络上传输,但是-S/PSK认证则需要服务端知道共享密钥。

另外,您也可以绑定CLI端口到localhost,并使用ssh/VPN或者其他工具从本地计算机来进行连接。

如果您是使用ssh,你可以限制每个用户可以执行哪些命令,就像varnishadm。或者封装一个仅仅允许执行部分特定命令的varnishadm。

您也可以配置varnishd反向监听模式,使用-M参数。这种情况下 varnishd 将试图打开一个TCP连接到指定地址,并启动一个CLI连接到你varnish管理设备。

在这种情况下,连接也是没有加密的,但是服务器端必须使用 -S/PSK 认证。

最后,如果您是使用-d模式运行varnish,你可以获得cli命令的标准输入输出,但是一旦您启动进程,就很难阻止您获取cli权限,不是吗?

CLI接口认证

默认情况下,CLI接口认证是使用简单强大的“Pre Shared Key”方法,但是它并不对数据进行加密(命令行和响应内容都未进行加密)。

-S/PSK的工作原理很简单:当varnish启动时,会创建一个随机内容的文件,这个文件只对启动varnish的用户(或者root)才有权限。

要验证并使用CLI连接,你就必须知道该文件的内容。查看-S/PSK工作原理

varnishadm也是使用这种方式来控制权限,只要能够成功读到密钥文件,就可以进行操作。

如果你想要允许其他人、本地或者远程能够有权限连接CLI,您就必须创建自己的密钥文件,并且只能被这些用户读取。

一个比较好的创建密钥文件的方法是:

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

当你启动varnishd,你通过-S来指定密钥文件,也没有说主进程需要去读这个文件。所以当varnishd在运行的时候,您可以修改这个文件的内容,它会在每次一个CLI连接进行认证的时候读取这个文件。

在本地系统中,varnishadm 可以从共享内存中恢复文件名,但是在远程系统上,您就需要给varnishadm 一个-S参数来拷贝密钥文件。

如果您想禁用-S/PSK认证,那么只需要给varnishd-S参数指定为空即可。

varnishd [...] -S "" [...]

参数

varnish可以通过命令行设置参数,并且可以添加-r参数,使其为只读模式,这样就不能通过CLI接口进行修改了。

几乎所有的参数都可以用在你的HTTP请求上,但是有一个参数使用比较危险:

  • cc_command 执行任意程序
  • vcc_allow_inline_c 允许在VCL中嵌入C语言,任何在VCL里面的C语言代码都是可以被执行的。

此外,你可能还需要了解:

  • syslog_cli_traffic 所有的CLI命令日志你都可以使用syslog(8) 查看。
  • vcc_unsafe_path 限制VCL/VMODS的vcl_dir和vmod_dir。
  • vmod_dir 这个目录是用来存放varnish 模块的。各种模块会被加载进varnish。

命令行接口

在varnish中CLI接口是非常强大的,如果你有前线使用CLI接口,那么您几乎可以对varnish进程做任何事情。

如上所述,通过限制一些参数是可以限制一些危险发生的,但是哪些只会保护本地文件系统和操作系统,而不会保护你的HTTP服务。

我们目前还没有办法去对一个特殊的CLI连接限制使用特殊的CLI命令。有一种实现方式是封装CLI权限到一个预先被认可的脚本里面。使用 varnishadm(1) 来提交审查过的命令,限制远程用户使用这些脚本来进行连接,例如使用sshd(8)的配置。

VCL参数

在VCL中有两个危险的东西是被允许的:VMODs和内联C语言代码。

这两种机制都允许执行任意代码,并且允许一个人获得及其权限和子进程权限。

如果varnish是以root/超级用户身份启动的,我们在沙箱中运行子进程,那么在这个操作系统上我们可以使用任何工具。但是如果你不是使用root/超级用户身份运行的,那么这是不可能的。不要问我为什么你可以使用超级用户来的确on个一个只需要低权限的子进程。

如果使用varnish 4版本,那么内联C语言代码默认是禁用的,所以您不用太过担心,除非你开启它了。

上面提到的参数可以限制只能在特定目录加载VMODs。

如果您这样做了,那么我们有信心你本地的系统一定不会受VCL代码影响。

HTTP请求

我们竭尽所能的是Varnish抵抗那些通过套接字来接受http请求,一般来说,你不需要做进一步的保护。

需要说明的是,因为VCL也是一种编程语言,它可以让你决定到底该对HTTP请求做什么操作,你也可以做一些愚蠢和危险的事情,包括各种攻击和破坏性动作。

如果您需要管理HTTP请求,例如清除缓存,我们强烈建议你要限制只允许信任的IP来进行这些操作,这个需要用到VCL的权限控制列表(ACLs)

results matching ""

    No results matching ""