代理程序包存储库的最佳实践

我的公司networking中有一系列CentOS服务器。 出于安全原因,除非是服务器的核心function要求,否则大多数服务器不具有通用的出站Internet访问。

当我需要更新软件包时,这会产生一个挑战。 对于yum软件仓库,我目前从互联网镜像所有需要的仓库,并使镜像在内部网中可用。 我在每个五个环境中保留每个回购的副本:开发,质量保证,分期和两个生产数据中心。

我目前没有解决特定于语言的软件包回购问题。 当服务器需要从rubygems,PyPI,PECL,CPAN或npm进行更新时,他们必须获取临时出站Internet访问来获取软件包。 我被要求开始镜像rubygems和PyPI,其余的可能会跟着。

所有这些都是笨重的,并不能很好地工作。 我想用一个环境中的单个caching代理和其他环境中的四个菊花链代理replace它,以消除全镜像的复杂性和磁盘开销。 另外:

  • 它可以是正向或反向代理; 每个软件包pipe理器都支持代理服务器或自定义存储库端点,可以是本地镜像或反向代理。
  • 它需要精细的访问控制,所以我可以限制哪些客户端IP可以连接到哪个回购域。
  • 客户需要能够遵循redirect到未知的领域。 您的原始请求可能仅限于rubygems.org,但是如果该服务器将302返回给随机CDN,则应该可以遵循该请求。
  • 它应该支持HTTPS后端。 我不一定需要模拟其他SSL服务器,但我应该能够通过HTTP重新公开一个HTTPS站点,或者终止并使用不同的证书重新encryption。

我最初是在寻找逆向代理,而Varnish似乎是唯一一个能够让我在内部解决代理中的302redirect的问题。 但是,免费版本的Varnish不支持HTTPS后端。 我现在正在评估Squid作为正向代理选项。

这似乎是企业networking中应该是一个相对普遍的问题,但是我很难find其他人如何解决这个问题的例子。 有没有人执行过类似的事情,或者对如何做到最好?

谢谢!

我们使用Squid来做这件事。 关于鱿鱼的好处是,你可以很容易地设置基于模式匹配的对象的单个过期,这使得yum回购的元数据可以相当快地被清除。 我们有的configuration实现了这个:

refresh_pattern (Release|Packages(.gz)*)$ 0 20% 2880 refresh_pattern (\.xml|xml\.gz)$ 0 20% 2880 refresh_pattern ((sqlite.bz2)*)$ 0 20% 2880 refresh_pattern (\.deb|\.udeb)$ 1296000 100% 1296000 refresh_pattern (\.rpm|\.srpm)$ 1296000 100% 1296000 refresh_pattern . 0 20% 4320 

http://www.squid-cache.org/Doc/config/refresh_pattern/

这不会解决你所有的任务,但也许这还是有帮助的。 尽pipe有这个名字, apt-cacher-ng不仅可以和Debian和衍生产品一起工作,而且可以

一个caching代理。 专门针对Linux发行商的软件包文件,主要针对Debian(和Debian)发行版,但不限于这些。

我在类似的(基于Debian的)环境中使用它,像你的一样。

但是,AFAIK不支持rubygems,PyPI,PECL,CPAN或npm,不提供精细的ACL。

我个人认为,调查鱿鱼是一个好主意。 如果您最终实施了一个设置,请分享您的经验吗? 我很感兴趣。

我们也遇到了类似的挑战,并使用本地回购和基于快照的存储系统解决了这个问题。 我们基本上更新了开发仓库,克隆它进行testing,克隆进行升级,最后进行生产。 所使用的磁盘数量是有限的,再加上它是所有缓慢的SATA存储,没关系。

客户端从我们的configurationpipe理中获取存储库信息,所以如果需要的话,切换很容易

你可以在代理服务器上使用用户代理string或源代码ips / mask组合,并限制他们对特定域的访问来实现你想要的东西,但是如果你这样做的话,我看到的是不同版本的包/库。 因此,如果其中一个主机可以访问cpan并请求模块xxx :: yyy,除非客户指示使用特定版本,否则将从cpan(或pypy或rubygems)取得最新版本,这可能是也可能不是已经caching在代理中。 所以你可能会在同一个环境中得到不同的版本。 如果您使用本地存储库,则不会有这个问题。

这是一个代理的权威用例 。 一个正常的代理,而不是一个反向代理(又名负载平衡器)。

最知名的和免费的开源是鱿鱼 。 幸运的是,它是less数几个很好的开源软件之一,可以通过一个apt-get install squid3轻松安装,并且使用一个文件/etc/squid3/squid.conf

我们将会介绍一下我们所了解的良好实践和经验教训。

官方configuration文件略有修改(5000无用的注释行被删除)。

 # WELCOME TO SQUID 3.4.8 # ---------------------------- # # This is the documentation for the Squid configuration file. # This documentation can also be found online at: # http://www.squid-cache.org/Doc/config/ # # You may wish to look at the Squid home page and wiki for the # FAQ and other documentation: # http://www.squid-cache.org/ # http://wiki.squid-cache.org/SquidFaq # http://wiki.squid-cache.org/ConfigExamples # ########################################################### # ACL ########################################################### acl SSL_ports port 443 acl Safe_ports port 80 # http acl Safe_ports port 21 # ftp acl Safe_ports port 443 # https acl Safe_ports port 1025-65535 # unregistered ports acl CONNECT method CONNECT ##################################################### # Recommended minimum Access Permission configuration ##################################################### # Deny requests to certain unsafe ports http_access deny !Safe_ports # Deny CONNECT to other than secure SSL ports http_access deny CONNECT !SSL_ports # Only allow cachemgr access from localhost http_access allow localhost manager http_access deny manager ##################################################### # ACL ##################################################### # access is limited to our subnets acl mycompany_net src 10.0.0.0/8 # access is limited to whitelisted domains # ".example.com" includes all subdomains of example.com acl repo_domain dstdomain .keyserver.ubuntu.com acl repo_domain dstdomain .debian.org acl repo_domain dstdomain .python.org # clients come from a known subnet AND go to a known domain http_access allow repo_domain mycompany_net # And finally deny all other access to this proxy http_access deny all ##################################################### # Other ##################################################### # default proxy port is 3128 http_port 0.0.0.0:3128 # don't forward internal private IP addresses forwarded_for off # disable ALL caching # bandwidth is cheap. debugging cache related bugs is expensive. cache deny all # logs # Note: not sure if squid configures logrotate or not access_log daemon:/var/log/squid3/access.log squid access_log syslog:squid.INFO squid # leave coredumps in the first cache dir coredump_dir /var/spool/squid3 # force immediaty expiry of items in the cache. # caching is disabled. This setting is set as an additional precaution. refresh_pattern . 0 0% 0 

客户端configuration – 环境variables

在所有系统上configuration这两个环境variables。

 http_proxy=squid.internal.mycompany.com:3128 https_proxy=squid.internal.mycompany.com:3128 

大多数http客户端库(libcurl,httpclient,…)都是使用环境variables进行自我configuration的。 大多数应用程序正在使用其中一个通用库,因此支持代理开箱即用(没有开发人员必须知道他们这样做)。

请注意,语法是严格的:

  1. 在大多数Linux上,variables名http_proxy必须是小写的。
  2. variables值不能以http(s)://开头http(s):// (代理协议不是http(s))。

客户端configuration – 特定

一些应用程序忽略了环境variables和/或在variables可以设置之前作为服务运行(例如debian apt )。

这些应用程序将需要特殊的configuration(例如/etc/apt.conf )。

HTTPS代理 – 连接

HTTPS代理完全由devise支持。 它使用特殊的“CONNECT”方法,在浏览器和代理之间build立某种隧道。

不知道这件事多less,但我从来没有多年的问题。 它只是工作。

HTTPS特例 – 透明代理

关于透明代理的说明。 (即代理是隐藏的,它拦截客户端请求ala。中间人)。

透明代理正在破坏HTTPS。 客户端不知道有一个代理,并没有理由使用特殊的连接方法。

客户端尝试一个直接的HTTPS连接…被拦截。 拦截被发现并且错误在所有地方被投掷。 (HTTPS旨在检测中间人攻击)。

域和CDN白名单

域和子域白名单完全由鱿鱼支持。 然而,它必然会不时地以意想不到的方式失败。

现代网站可以有各种域名redirect和CDN。 当人们没有多加努力把所有东西整齐地放在一个单一的领域时,这将会破坏ACL。

有时会有一个安装程序或一个包想要调用homeship或运行之前检索外部依赖项。 它每一次都会失败,对此你无能为力。

高速caching

提供的configuration文件禁用所有forms的caching。 比对不起更安全。

就我个人而言,我现在正在云中运行,所有的实例至less有100 Mbps的连接,并且提供者运行自己的stream行东西(例如Debian)的回购站。 这使得带宽成为我不太在乎的一种商品。

我宁愿完全禁用caching,而不是经历一个caching错误,这将在解决问题时融化我的大脑。 互联网上的每一个人都无法获得正确的caching标题。

不是所有的环境都有相同的要求。 你可以多走一步,configurationcaching。

永远不要求代理上的身份validation

有一个选项可以要求客户端进行密码validation,通常是使用LDAP帐户。 它将打破宇宙中的每一个浏览器和命令行工具。

如果您想对代理进行身份validation,请不要。

如果pipe理层想要authentication,请解释说这是不可能的。

如果您是开发人员,而您刚刚join了阻止直接互联网和强制代理身份validation的公司,请尽快运行。

结论

我们经历了共同的configuration,常见的错误和代理人必须知道的事情。

学习到教训了:

  • 有一个很好的开源软件代理(鱿鱼)
  • 这是简单和容易configuration(一个简短的文件)
  • 所有(可选的)安全措施都有权衡
  • 最先进的选项将打破东西,回来困扰你
  • 透明代理正在破坏HTTPS
  • 代理authentication是邪恶的

像编程和系统devise一样,pipe理需求和期望是至关重要的。

我build议在设置代理时坚持基本操作。 一般来说,没有任何特殊过滤的简单代理将很好地工作,不会有任何麻烦。 只是要记住(自动)configuration客户端。