瓦尼什的安全障碍

在Varnish中,安全性是一个非常重要的设计驱动因素,如果您发现自己在想“他为什么要这么做”,很可能不是这样 _that_ ?答案与安全有关。

Varnish安全模型基于各种组件之间的一些非常粗糙但易于理解的障碍:

              .-->- provides ->---------------------------------------.
              |                                          |            |
     (ADMIN)--+-->- runs ----->---.                      |            |
              |                   |                      |            |
              |-->- cli_req -->---|                      v            v
              '--<- cli_resp -<---|                     VCL        MODULE
                                  |                      |            |
     (OPER)                       |                      |reads       |
       |                          |                      |            |
       |runs                      |                      |            |
       |      .-<- create -<-.    |    .->- fork ->-.    v            |
       v      |->- check -->-|-- MGT --|            |-- VCC <- loads -|
      VSM     |-<- write --<-'    |    '-<- wait -<-'    |            |
     TOOLS    |                   |                      |            |
       ^      |     .-------------'                      |            |
       |      |     |                                    |writes      |
       |reads |     |->- fork ----->-.                   |            |
       |      |     |->- cli_req -->-|                   |            |
      VSM ----'     |-<- cli_resp -<-|                   v            |
       |            '-<- wait -----<-|                VCL.SO          |
       |                             |                   |            |
       |                             |                   |            |
       |---->----- inherit --->------|--<-- loads -------'            |
       |---->-----  reads ---->------|                                |
       '----<----- writes ----<------|--<-- loads --------------------'
                                     |
                                     |
                                     |
         .--->-- http_req --->--.    |    .-->-- http_req --->--.
(ANON) --|                      |-- CLD --|                     |-- (BACKEND)
         '---<-- http_resp --<--'         '--<-- http_resp --<--'

(ASCII-艺术规则!)

真正重要的障碍

Varnish中的中心角色是管理器进程“mgt”,这是管理员“(Admin)”开始获取Web缓存服务的进程。

我自己也去过那里,我并不赞同“当我凌晨3点醒来重新启动一个死进程时,我觉得自己很酷、很重要”的学派,事实上,我认为这是愚蠢的一个明显迹象:如果我们不能让电脑重启一个死进程,我们为什么还要有它们?

因此,管理器进程的任务不是缓存Web内容,而是确保始终存在这样一个进程,即子“CLD”进程。

这是Varnish中的主要障碍:所有管理都发生在一个进程中,所有实际的流量移动都发生在另一个进程中,而管理器进程根本不信任子进程。

子进程处于完全不受保护的域中:Internet上的任何计算机(Anon)都可以连接到子进程并请求一些Web对象。

如果说约翰·D·罪犯成功地利用了瓦尼什的安全漏洞,那么他所颠覆的就是儿童进程。如果他实施DoS攻击,那么他试图攻击的是子进程。

因此,管理器实际上以尽可能低的特权启动该子进程,并关闭它不应该访问的所有文件脚本,依此类推。

返回管理器进程的通信通道只有三个:退出代码、CLI响应或将内容写入用于统计和日志记录的共享内存文件“VSM”,所有这些都由管理器进程很好地保护。

管理/操作障碍

如果您查看该图的左上角,您将看到Varnish使用单独的管理员“(Admin)”和操作员“(Opper)”角色进行操作。

管理员做事情,改变事情等等。操作员密切关注事情,以确保它们是应该的。

现在操作员通常是脚本和数据收集工具,没有理由认为它们是无错误的,所以Varnish不信任操作员角色,这是纯粹的单向关系。

(诀窍:如果子进程在用户“noboble”下运行,您可以允许受信任程度较低的操作人员访问“noboble”帐户(例如,使用.ssh/AUTHORIZED_KEYS2),他们将能够终止子进程,并提示管理器进程使用相同的参数和设置再次重新启动它。)

管理员拥有最终决定权,当然,管理员可以决定在哪些情况下共享该权限。

不用说,如果运行Varnish的系统没有得到适当的保护,管理员对控制的垄断将受到损害。

所有其他障碍

有更多的障碍,您可以通过图中的箭头发现它们,但它们更多的是一种“技术”而不是“政治”,通常试图防止编程缺陷以及安全危害。

例如,VCC编译器在一个单独的子进程中运行,以确保编译器中的内存泄漏或其他缺陷不会为管理器进程积累麻烦。

希望这一解释有助于理解为什么Varnish不像所有其他服务器程序那样只是一个进程。

保尔-亨宁,2010-06-28