varnish 4.0 官方文档翻译7-用户手册-安全第一

Security first 安全第一

如果你仅仅抓专注于运行varnish,或者所有人都是这个观点,那么就可以跳过该节了.我们保护你的方方面面当http请求来的时候.

如果你的web基础设施是外包的,管理是分开的,那么你就需要考虑安全了. Varnish在4个权威的等级提供安全,大致关系到怎样让命令生效和在哪儿生效.

  • the command line arguments,
  • the CLI interface,
  • VCL programs, and
  • HTTP requests.

Command line arguments 命令行参数

最高安全定理是决定和定义varnish的启动参数在一个表单里面,我们使用这个策略是为了新的操作也是安全的. 最重要的的决定是确保这些:

  • Who should have access to the Command Line Interface? 谁有命令行的权限?
  • Which parameters can they change? 他们可以修改哪些参数?
  • Will inline-C code be allowed? 哪些内建C代码是被允许的?
  • If/how VMODs will be restricted? 是否VMODs是被限制,怎样被限制?

CLI interface access CLI接口权限

命令行接口可以通过三个方式进入. Varnish监听状态时,提供给CLI链接一个TCP套接字。你可以绑定这个套接字在内核接受的任意地方。

-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命令讲作为非加密的ASCII文本进行网络传输,但是-S/PSK需要远程终端知道共享密钥。

你可以绑定CLI端口在localhost,使用ssh/vpn或者类似的协议,给远程用户一个安全连接到本机的权限。

如果使用ssh每个用户可以执行那些命令,就像varnishadm,或者封装一个仅仅允许执行特定CLI命令的varnishadm.

你也可以配置varnishd反向监听模式,使用‘-M‘参数。varnishd尝试给指定的地址打开一个TCP连接,然后给vanish管理设备发起一个CLI连接。

这个连接也是非加密的,但是远程终端必须满足-S/PSK认证。

最后,如果你使用‘-d‘模式运行varnish,你可以获得一个CLI命令在标准输入和标准输出,但是一旦你开始进程,还有什么能阻止你活取CLI权限,不是么?

CLI interface authentication CLI接口认证

默认的CLI接口被一个简单却强壮的"Pre Shared Key"认证模式,但是不提供加密(例如,CLI命令和响应是非加密的).

-S/PSK工作原理真的很简单:当varnish安装,使用随机内容创建了一个文件,这个文件仅仅只有启动varnish的用户(或者超级用户)才有权限。

为了认证和使用CLI连接,你需要知道这个文件的内容,为了了解挑战加密的问题。

(XXX: xref to algo in refman) .. XXX:Dunno what this is? benc

varnishadm 使用这些策略来限制权限,仅仅在varnishadm起作用和需要它的时候才读取密钥文件。

如果你打算允许其他用户,本地的和远程的,为了获得CLI的权限你可以创建自己的密钥文件,同时只可能被这些用户读取。

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

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

当你启动varnishd,你通过‘-S‘指定密钥文件名,同时没有说明varnishd主进程也需要读取文件。
当varnishd运行的时候你也可以修改密钥文件的内容,因为每次CLI连接认证时都读取密钥文件。

在本地系统你可以通过共享内存来恢复密钥文件名,但是在远程系统,你需要使用‘-S‘参数给varnishadm复制一个密钥文件。

如果你要禁用 -S/PSK认证,指定‘-S‘一个空的参数给varnishd:

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

Parameters 参数

varnish可以是通过命令行设置参数,同时添加‘-r‘参数作为只读模式,这样的话就不能在CLI接口修改参数了。

相当多的参数可能搞砸你的http服务,但是有些是更严重的:

user and group 用户和组
Access to local system via VCL 通过VCL认证本地系统.
listen_address 监听地址
Trojan other TCP sockets, like ssh 入侵其他tcp套接字,不如ssh
cc_command
Execute arbitrary programs 执行随意程序.
vcc_allow_inline_c
Allow inline C in VCL, which would any C code from VCL to be executed by Varnish. 允许C代码在VCL中,哪些代码C代码可以在varnish里呗执行.

Furthermore you may want to look at and lock down: 此外你可能想看:

syslog_cli_traffic 
Log all CLI commands to syslog(8), so you know what goes on.CLI命令的所有日志你可以查看syslog(8)
vcc_unsafe_path
Restrict VCL/VMODS to vcl_dir and vmod_dir 限制VCL/VMODS的vcl_dir和vmod_dir.
vmod_dir
The directory where Varnish will will look for modules. This could potentially be used to load rouge modules into Varnish.

这个目录里可以看到很多模块,罗列了可以载入到varnish的潜在模块.

The CLI interface CLI接口

CLI接口功能强大,只要你有权限连接到CLI接口,你可以对varnish进程做几乎所有的事情.

正如之前的描述,一些有危害的参数可以被限制,但是这些都只能保护本地文件系统和操作系统,并不能保护你的http服务.

当前我们还没有办法对特定的CLI连接限制特定的CLI命令.有个办法就是封装可能有影响的连接在一个预认证的脚本里,

使用varnishadm(1)提交CLI审核命令,同时限定远程用户只能通过这些脚本来连接,例如使用sshd(8)的配置.

VCL programs VCL程序

在VCL模式中有两个危险的机制:VMODs和inline-C.

这两个机制允许执行任意代码,因此允许用户获得机器的权限和说有child进程的权限.

如果varnish使用root/supper启动,我们在沙箱里运行的child进程可以使用任何可以在操作系统上使用的工具,但是如果不是,就不需要考虑这些了.不要问我为什么你会用超级用户来启动一个只需要低权限的child进程.

Inline-C在varnish4.x启动时是不起作用的,除非启用了Inline-C,所以你不用担心它.

之前提到的参数可以限制加载VMODS只能在指定的目录,限制VCL争议者在一个VMODs的预认证子集.

如果你这样做,我们确信你的本地系统在使用VCL模式不可能缺乏攻击抵抗能力.

HTTP requests http请求

我们竭尽所能的使vanish抵抗那些通过套接字接收的http请求,同时你可能,通俗来说,不需要你进一步的保护.

这个警告自从VCL变成可编程语言,让你决定完全对HTTP请求做些什么的语言,你也可以使用VCL决定做些愚蠢和潜在危险的事情,包括开启你自己的各种攻击和破坏性的活动.

如果你需要管理(包括,修改,删除,产生新动作等等)‘HTTP‘请求,例如PURGE请求,我们强烈建议你限制这些操作,使用VCL的权限控制列表来允许信任的ip或着网络才能管理HTTP请求.

时间: 2024-10-11 00:43:17

varnish 4.0 官方文档翻译7-用户手册-安全第一的相关文章

varnish 4.0 官方文档翻译-简要教程

varnish 4.0简要教程 这部分教程包含了varnish基本原理.囊括了什么是varnish.它怎样工作,同时也包含了开始使用和运行varnish.这部分过后你可能想继续了解用户向导(varnish用户引导). 如果你正在web上读这些呢 注意每页左边的Next topic和Previous topic The fundamentals of web proxy caching with Varnish使用varnish作为web代理缓存的原理 Supported platforms 支持

varnish 4.0 官方文档翻译21-Reporting and statistics

Reporting and statistics 本部分包括如何查看Varnish正在做什么,从每个http请求流的详细记录到汇总统计计数器. Logging in Varnish Statistics varnishtop varnishhist varnishstat Logging in Varnish Varnish中一个很棒的特点是工作日志的记录方式.varnish不记录日志到日志文件,而是调用VSL记录到共享内存片段,VSL-varnish共享日志.当这个片段被写完后,varnish

varnish 4.0 官方文档翻译20-Device detection

Device detection 设备检测基于请求中的User-agent找出哪种内容返回给客户端. 使用Device detection情况的一个例子,发送给小屏幕的手机客户端或者复杂的网络环境,减少发送文件的数量,或者提供给不能解码的客户端一个video解码器. 有些使用这种方案的典型场景: 重写url 使用不同的后端给客户端 改变后端请求为了让后端发送裁剪的内容 可能为了便于理解,下文中假定req.http.X-UA-Device头表示当前前客户端,同时每种客户端是唯一的. 简单的像这样设

varnish 4.0 官方文档翻译19-VCL Examples

VCL Examples Manipulating request headers in VCL 在VCL中操作请求的header. 当我们想移除发送到web服务器/images目录的所有对象的cookie可以这样: sub vcl_recv {     if (req.url ~ "^/images") {     unset req.http.cookie;     } } 这样当请求被后端处理时在http的header中将不再有cookie信息.有用的是使用if语句.在匹配的UR

varnish 4.0 官方文档翻译22-Varnish Website Performan

Varnish and Website Performance 本节集中解决如何调优varnish server,同时如何使用varnish优化你的web站点. 一共有三小节.第一小节你应该想到varnish的各种工具和功能,下一小节如何从cache中清除已经缓存的内容.清除内容是一项基本功能,因为它允许给缓存的对象增加 TTL.TTL越大varnish保持在缓存中的时间越久,这意味着varnish处理更多的请求,只将少部分的请求传递到相对较慢的后端. 最后一小节,处理web内容的压缩.当从后端

varnish 4.0 官方文档翻译7-用户手册-重要命令行参数

重要的命令行参数 当启动varnish时有两个重要的参数你必须设置: 一个是处理http请求的tcp监听端口,另一个是处理真实请求的后端server 如果你使用操作系统自带的包管理工具安装的varnish,你将在下面的文件找到启动参数: Debian, Ubuntu: /etc/default/varnish Red Hat, Centos: /etc/sysconfig/varnish FreeBSD: /etc/rc.conf (See also: /usr/local/etc/rc.d/v

varnish 4.0 官方文档翻译9-用户手册- 向Vanish下发指令

CLI-bossing Varnish around CLI 向Vanish下发指令 一旦vanish启动,你可以使用命令行接口来控制它. 最轻松的使用CLI的方法是在运行varnishd的机器上运行,varnishadm varnishadm help 如果你想远程使用varnishadm,有两种方法. 你可以使用ssh登录到运行varnishd的机器上然后varnishadm ssh $http_front_end varnishadm help 同时你也可以配置vanishd接受远程的CL

varnish 4.0 官方文档翻译16-Backend servers/M/B/D/H

Backend servers varnish有"后端"或者"源"服务器的概念.backend server提供给varnish加速的内容. 第一步设置是告诉varnish从哪儿找到backend server.使用你喜欢的编辑器打开varnishd引入的VCL文件. VCL文件的开头有一小段有点像这样: # backend default { #     .host = "127.0.0.1"; #     .port = "8080

varnish 4.0 官方文档翻译14-Built in subroutines

Built in subroutines vcl_recv 在接收到完整的客户端请求后调用这个子程序.它决定是否处理请求,怎样处理请求,使用哪一个后端. 它也可运用于修改请求,一些经常自己做的事情. vcl_recv子程序可以通过调用return()来结束,通过以下关键字: synth(status code, reason)     Return a synthetic object with the specified status code to the client and abando