代理包存储库的最佳实践

Dav*_*ith 17 package-management proxy squid varnish repository

我的公司网络中有一组 CentOS 服务器。出于安全原因,大多数服务器没有通用的出站互联网访问权限,除非这是服务器的核心功能要求。

当我需要更新软件包时,这会带来挑战。对于 yum 存储库,我目前从 Internet 镜像所有需要的存储库,并使镜像在 Intranet 内可用。我在我们的五个环境中保存每个 repo 的副本:dev、QA、staging 和两个生产数据中心。

我目前不解决特定于语言的包存储库。当服务器需要从 ruby​​gems、PyPI、PECL、CPAN 或 npm 进行更新时,它们必须获得临时出站互联网访问权限以获取包。我被要求开始镜像 ruby​​gems 和 PyPI,其余的可能会跟进。

所有这些都很笨拙,而且效果不佳。我想用一个环境中的单个缓存代理和其他环境中的四个菊花链代理替换它,以消除完整镜像的复杂性和磁盘开销。此外:

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

我最初正在研究反向代理,而 Varnish 似乎是唯一一种允许我在代理中内部解析 302 重定向的代理。但是,免费版 Varnish 不支持 HTTPS 后端。我现在正在评估 Squid 作为转发代理选项。

这似乎应该是企业网络中一个相对普遍的问题,但我很难找到其他人如何解决这个问题的例子。有没有人实施过类似的东西,或者对如何最好地这样做有想法?

谢谢!

小智 6

我们为此使用 Squid;squid 的好处是你可以很容易地根据模式匹配设置对象的个别到期时间,这允许相当快地清除 yum 存储库中的元数据。我们拥有的配置实现了这一点:

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
Run Code Online (Sandbox Code Playgroud)

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


use*_*461 5

这是 proxy 的明确用例。普通代理,而不是反向代理(又名负载均衡器)。

最著名、免费和开源的是 squid。幸运的是,它是少数几个可以轻松安装apt-get install squid3单个文件并配置单个文件的优秀开源软件之一/etc/squid3/squid.conf

我们将回顾良好做法和要了解的经验教训。

官方配置文件略有修改(去掉了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
Run Code Online (Sandbox Code Playgroud)

客户端配置 - 环境变量

在所有系统上配置这两个环境变量。

http_proxy=squid.internal.mycompany.com:3128
https_proxy=squid.internal.mycompany.com:3128
Run Code Online (Sandbox Code Playgroud)

大多数 http 客户端库(libcurl、httpclient 等)都是使用环境变量进行自我配置的。大多数应用程序都使用公共库之一,因此支持开箱即用的代理(开发人员不一定知道它们这样做)。

请注意,语法是严格的:

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

客户端配置 - 特定

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

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

HTTPS 代理 - 连接

设计上完全支持 HTTPS 代理。它使用一种特殊的“CONNECT”方法在浏览器和代理之间建立某种隧道。

对那件事一无所知,但多年来我从未遇到过问题。它只是有效。

HTTPS 特例 - 透明代理

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

透明代理正在破坏 HTTPS。客户端不知道有代理,也没有理由使用特殊的 Connect 方法。

客户端尝试直接 HTTPS 连接...被拦截。拦截被检测到并且错误被抛出到处。(HTTPS 旨在检测中间人攻击)。

域和 CDN 白名单

squid 完全支持域和子域白名单。尽管如此,它肯定会不时以意想不到的方式失败。

现代网站可以有各种域重定向和 CDN。当人们没有加倍努力将所有内容整齐地放在一个域中时,这将破坏 ACL。

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

缓存

提供的配置文件禁用所有形式的缓存。安全总比后悔好。

就我个人而言,我目前正在云中运行,所有实例都至少有 100 Mbps 的连接速度,并且提供商为自动发现的流行内容(例如 Debian)运行自己的存储库。这使得带宽成为我非常关心的商品。

我宁愿完全禁用缓存,也不愿遇到一个会在故障排除中使我的大脑崩溃的缓存错误。互联网上的每个人都无法正确获取缓存标头。

但是,并非所有环境都有相同的要求。您可以加倍努力并配置缓存。

永远不需要对代理进行身份验证

有一个选项要求客户进行密码验证,通常使用他们的 LDAP 帐户。它将破坏宇宙中的每个浏览器和每个命令行工具。

如果您想在代理上进行身份验证,请不要。

如果管理层需要身份验证,请说明这是不可能的。

如果您是一名开发人员,并且您刚刚加入一家阻止直接互联网并强制进行代理身份验证的公司,请趁可能逃走。

结论

我们了解了常见的配置、常见的错误以及关于代理必须知道的事情。

学习到教训了:

  • 有一个很好的代理开源软件(squid)
  • 配置简单容易(单个短文件)
  • 所有(可选)安全措施都有权衡
  • 大多数高级选项会破坏东西并再次困扰您
  • 透明代理正在破坏 HTTPS
  • 代理身份验证是邪恶的

在编程和系统设计中,像往常一样,管理需求和期望是至关重要的。

我建议在设置代理时坚持基础知识。一般来说,没有任何特殊过滤的普通代理会运行良好,不会产生任何问题。只需要记住(自动)配置客户端。


gf_*_*gf_ 4

这并不能解决您的所有任务,但也许这仍然有帮助。尽管有这个名字,apt-cacher-ng不仅适用于 Debian 及其衍生版本,而且

缓存代理。专门用于来自 Linux 发行商的软件包文件,主要用于 Debian(以及基于 Debian 的)发行版,但不限于这些发行版。

我在类似于您的环境(基于 Debian)的生产环境中使用它。

但是,据我所知,这不支持 ruby​​gems、PyPI、PECL、CPAN 或 npm,并且不提供细粒度的 ACL。

就我个人而言,我认为研究 Squid 是一个好主意。如果您最终实现了设置,您能分享一下您的经验吗?我对事情进展很感兴趣。