AWS S3 禁用 SSLv3 支持

Posted

技术标签:

【中文标题】AWS S3 禁用 SSLv3 支持【英文标题】:AWS S3 Disabling SSLv3 Support 【发布时间】:2015-06-21 18:45:13 【问题描述】:

我们收到了一封来自 AWS 的电子邮件,基本上说“S3 正在禁用 SSLv3 支持,访问将在 15 天后被切断”。然后,他们列出了我们拥有的一些存储桶(一个正在生产中),它们“当前正在接受来自指定 SSLv3 的客户端的请求”。完整的电子邮件在这里,其他 AWS 用户似乎也收到了一封:

https://gist.github.com/anonymous/4240c8af5208782c144c

我的问题是我们如何测试这种情况,我们需要做些什么来为这个截止日期做准备?

我们使用 Rails 4.1 和 Fog (~> 1.28.0) 和 right_aws (~> 3.1.0) gem 来访问 AWS,我们在 Heroku 上。我们的应用程序在我们的 UI 中向我们的浏览器用户提供 S3 资源的签名 HTTPS 链接。

这只是客户端(浏览器)问题还是我们需要更好地理解和测试/修复的问题?

【问题讨论】:

我的理解是这完全是一个浏览器问题,这基本上切断了对低于 IE7 的浏览器的支持。不过,我希望能够在他们将其切入生产数据之前运行一些测试,希望我们能尽快找到更多信息。 感谢您的回复。是的,我们怀疑这只是折旧的浏览器,这是有道理的。我们和你一样担心的是我们错过了一些东西,我们真的想在任何终止日期之前测试这种情况。到目前为止,AWS 支持没有说什么,所以如果很快没有任何结果,我们将不得不尝试高级支持:forums.aws.amazon.com/thread.jspa?threadID=176062 【参考方案1】:

fog 使用 excon 进行 http(s) 传输。 excon 是一个低级的纯 ruby​​ http 客户端,它依赖于 ruby​​ openssl 绑定来工作。虽然可以明确设置要使用的 ssl 版本,但 excon 没有,据我所知,这应该意味着它与服务器协商以选择使用什么(所以如果服务器要求不是 SSLv3,它应该合作)。

我相信这应该意味着这里不需要采取任何行动,但是所有这些的细节在 Ruby 和 OpenSSL 版本之间会有所不同(更不用说,反省/理解这些绑定的细节有点困难) ,所以很难确定。 excon 确实支持一个 ssl_version 参数,如果它最终成为一个问题,它可以用来强制一个特定的版本(这不是一个好的通用选择,因为它不允许协商并且具体情况在 ruby​​ 版本之间有所不同)。

希望对您有所帮助。

【讨论】:

谢谢,这确实有帮助,让我们有更多的工作要做。我们在 ruby​​ 2.2.1p85 上,所以我几乎可以肯定 excon 会从 SSLv3 就雾和 right_aws 进行协商。我将把它打开一段时间以添加更多信息,但我认为我们将追求(a)使用wireshark等检查我们的服务器到S3调用的路径是TLS和(b)right_aws(我们只是使用对于 S3 标头)比雾更旧且维护更少,因此为了减少移动部件的数量,我们将考虑移除它并使用其他东西。再次感谢。 我们已经与 AWS 支持人员联系,他们正在设置一个 S3 存储桶,用于在禁用 SSLv3 访问的情况下进行测试。这样,我们很快就能确定 excon/fog 中的所有内容都可以正常工作。当我们有这个答案时,我会回来更新这个,因为它可能会帮助其他人。 太好了,感谢您的更新。有这样的澄清肯定会很好。 我们从 AWS 获得了一个带有 S3 并禁用 SSLv3 的测试 IP。我们在 /etc/hosts 中使用了 xyz.s3.amazonaws.com 来映射到该测试端点。看起来 excon/fog 存在问题,因为我们在尝试读取目录时收到此错误:“excon::Errors::SocketError: hostname "dev-test-xyz1.s3.amazonaws.com" 不匹配服务器证书(OpenSSL::SSL::SSLError)”。最好通过 excon 或雾宝石问题与您联系吗?任何帮助将不胜感激,因为这可能很严重。 好的,更多信息和一些好消息。通过 AWS 的支持(顺便说一句,这非常好),我们发现一旦使用 :path_style => true 设置,我们就可以得到雾连接。存储桶名称有“-”(不是点),因此可能导致“与服务器证书不匹配”OpenSSL 问题。无论如何,在雾中,通过 excon 工作正常。我还会提出一个关于雾/雾的信息问题,这样其他雾用户就不会在 4 月 30 日 AWS 启用 SSLv3 开关时感到震惊。【参考方案2】:

截止日期已移动:

根据收到的反馈,我们将停止支持 SSLv3 以保护与 S3 存储桶的连接的截止日期延长至太平洋夏令时间 2015 年 5 月 20 日凌晨 12:00。

【讨论】:

【参考方案3】:

更新 2015 年 5 月 7 日上午 11:26 IST

在carrierwave初始化器中,如下所示,

CarrierWave.configure do |config|
  config.fog_credentials = 
      :provider               => 'AWS',       # required
      :aws_access_key_id      => Settings.carrier_wave.amazon_s3.access_key,       # required
      :aws_secret_access_key  => Settings.carrier_wave.amazon_s3.secret_key,       # required
      :region                 => 'external-1'  # optional, defaults to 'us-east-1'
  
  config.fog_directory  = Settings.carrier_wave.amazon_s3.bucket                    # required
  #config.fog_host       = 'http://aws.amazon.com/s3/'            # optional, defaults to nil
  config.fog_public     = false                                   # optional, defaults to true
  config.fog_authenticated_url_expiration = 600
  config.fog_attributes = ssl_version: :TLSv1_2 #'Cache-Control'=>'max-age=315576000'  # optional, defaults to 
end

这对我有用,请查看 wireshark 跟踪日志。

1577    22.611358000    192.168.0.113   8.8.8.8 DNS 87  Standard query 0xffd8  A s3-external-1.amazonaws.com
1578    22.611398000    192.168.0.113   8.8.8.8 DNS 87  Standard query 0xbf2f  AAAA s3-external-1.amazonaws.com
1580    22.731084000    8.8.8.8 192.168.0.113   DNS 103 Standard query response 0xffd8  A 54.231.1.234
1586    22.849595000    54.231.10.34    192.168.0.113   TLSv1.2 107 Encrypted Alert

1594    23.012866000    192.168.0.113   54.231.1.234    TLSv1.2 347 Client Hello
1607    23.310950000    192.168.0.113   54.231.1.234    TLSv1.2 204 Client Key Exchange, Change Cipher Spec, Encrypted Handshake Message
1608    23.578966000    54.231.1.234    192.168.0.113   TLSv1.2 129 Change Cipher Spec, Encrypted Handshake Message
1609    23.579480000    192.168.0.113   54.231.1.234    TLSv1.2 427 Application Data
1610    23.868725000    54.231.1.234    192.168.0.113   TLSv1.2 299 Application Data

2015 年 5 月 6 日更新,美国东部标准时间下午 6 点至 53 点

好的,更新 Excon gem 后,我们可以看到我们的服务器和 S3 服务器之间的TLSv1.2 协议。

bundle update excon

Wireshark 跟踪日志语句,

29  1.989230000 192.168.0.115   54.231.32.0 SSL 336 Client Hello
34  2.215461000 54.231.32.0 192.168.0.115   TLSv1.2 1494    Server Hello
40  2.219301000 54.231.32.0 192.168.0.115   TLSv1.2 471 Certificate
42  2.222127000 192.168.0.115   54.231.32.0 TLSv1.2 204 Client Key Exchange, Change Cipher Spec, Encrypted Handshake Message

更新时间:2015 年 5 月 6 日,美国东部标准时间下午 4 点至 29 点

更新hosts文件后,wireshark跟踪日志如下。

14  2.012094000 192.168.0.115   54.231.32.0 SSLv3   192 Client Hello 
17  2.242423000 54.231.32.0 192.168.0.115   SSLv3   61  Alert (Level:  Fatal, Description: Handshake Failure)

当我从 S3 上的本地开发 Rails 上传文件时,请参阅上面的 wireshark 请求捕获。如图所示,亚马逊服务器在初始握手时使用 SSLv3,因此我的 Rails 服务器使用 SSLv3 发送所有未来的请求。

现在,问题是,如何更改存储桶设置,使其仅使用 TLS 接受/启动进程?我已经检查了亚马逊的设置,没有类似的。

我已经将我的 nginx 更改为使用 TLS,但我认为这不是必需的,因为 Rails 将使用上面评论中提到的 Excon 在后台与 S3 对话。

所以,请建议在 5 月 20 日之前进行测试的最佳方法是什么,以确保它不会在那一天中断。

任何帮助都会很棒。

仅供参考 - 我的存储桶名称类似于 xyz.abc.com,所以名称中没有 -。

【讨论】:

感谢您记录您的调查。我想使用 wireshark/tshark 验证我的更新,但我只有命令行访问权限。 tshark -f 'tcp port 80 and http' 没有显示 TSL 握手。你对此有什么见解吗? 我在 Ubuntu 上安装了wireshare,并使用sudo wireshark 运行它,因为它在从根模式运行之前不允许跟踪请求。而且我不想花更多时间研究它,所以使用sudo 模式。请在 root 模式下使用 wireshark,请您的管理员至少为您执行几天。【参考方案4】:

AWS官方FAQhttps://forums.aws.amazon.com/thread.jspa?threadID=179904&tstart=0

54.231.32.0 s3.amazonaws.com
54.231.32.1 <bucket name>.s3.amazonaws.com
54.231.32.3 <bucket name>.s3-external-1.amazonaws.com

在您的/etc/hosts 中配置上述内容,将&lt;bucket name&gt; 替换为您的存储桶名称。

注意:使用非 us-east-1 存储桶时,您可能会收到重定向和失败响应。这与他们用于测试的临时基础设施有关,而不是其他任何事情。所以忽略它。

创建一个“标准美国存储桶”并使用它进行测试。请记住将您的应用配置为使用 s3 区域external-1

FWIW,我在 ruby 2.1.4 上使用 paperclip (4.2.0) 的应用工作正常。

【讨论】:

是的,我找到了这些主机配置,但是当我使用现有存储桶执行此操作时,它会抛出 Excon::Errors::SocketError (SSL_connect returned=1 errno=0 state=SSLv3 read server hello A: sslv3 alert handshake failure (OpenSSL::SSL::SSLError)) 我使用 Carrierwave 0.6.2 和雾 1.6.2 好的,当我将external-1 添加为carrierwave 配置中的一个区域时,它就可以工作了。但是当我通过wireshark跟踪请求时,它首先尝试查找s3-external-1.amazonaws.com的DNS并获取以54.231.xx.xx开头的新IP地址。从这个 IP,server hello 握手显示 SSLv3。文件上传和删除工作正常,但我怀疑它是否仍在使用 SSLv3。我们能做些什么来阻止它? 所以,根据您的评论。 - 如果我使用默认区域us-east-1,它不起作用。 - 如果我使用exernal-1,它可以工作,但它正在解决差异。比指定的IP。请提出建议。 请看上面更新的答案,Rails 服务器似乎使用 SSLv3 进行握手。 只要您与他们提供的 IP 地址通话,就可以了。 fwiw,我的数据包显示带有54.231.32.3 的通讯在TLSv1.2【参考方案5】:

这完全是客户端问题,如果客户端(例如浏览器)用于通过 https 发出请求的协议是 SSLv3 ,那么 ssl 握手将不会成功并且这些请求将失败。所以需要禁用 SSLv3 的是客户端。

AWS 的行动是对去年发现的 POODLE 漏洞的后续行动,从那时起,所有使用 *.cloudfront.net 域名的 AWS CloudFront 发行版都已更新,不再支持 SSLv3。现在 AWS 继续前进到 S3 做同样的事情。

【讨论】:

感谢您的回复,这很有帮助。除了浏览器客户端,我们的服务器确实与 S3 通信(通过雾和 right_aws 宝石)然后我想我们想要了解和测试的正是这些“客户端”。这导致需要更多关于如何在截止日期之前进行设置的信息。 我知道这有点过时了,因为问题是关于 Fog gem,但这是否意味着如果我们使用 FactoryGirl,只要用户的浏览器使用 TLS? 今天,aws 支持向我发送了一份包含所涉及 IP 地址的列表(基于 4 月的 3 天期间只有 7 个),实际上这完全是浏览器端的问题!我认为,如果 Aws 在我们收到的第一封电子邮件通知中不那么引人注目且更准确,我们所有人都可以节省大量时间! 那么访问 S3 数据的移动应用程序呢?我如何测试它们是否能在 androidios 应用程序中正常运行?【参考方案6】:

我能够在我的雾配置中使用以下设置强制 TLS:

connection_options: ssl_version: :TLSv1_2

要测试,请更新您的主机文件(来自 AWS 的说明):

54.231.32.0 s3.amazonaws.com
54.231.32.1 bucket.s3.amazonaws.com   #replace bucket with your bucket name
54.231.32.3 bucket.s3-external-1.amazonaws.com   #replace bucket with your bucket name

我能够成功连接。此外,如果您将设置更改为 :SSLv3,您将收到错误消息。祝你好运!

【讨论】:

如果您使用 Carrierwave,您会怎么做?部分fog_credentials 散列? 是的,问题与上述相同。在carrierwave中如何定义,是否需要? 好的,我想我明白了。有关carrier_wave 初始化程序配置详细信息,请参阅我的更新答案。 您也可以在载波初始化程序 config.fog_credentials = provider: "AWS", aws_access_key_id: 'blah' aws_secret_access_key: 'blah', path_style: true, connection_options: ssl_version: :TLSv1_2 @Chris @Paarth @user1690146 有人可以帮我解决这个问题:我正在使用 Amazon s3 和雾纸夹。我已经在我的初始化程序中指定了connection_options,但在 Amazon s3 中创建数据时仍然出现 excon:: 错误。我正在使用 Heroku 服务器来运行我的 rails 应用程序。请帮助我,这对我来说非常需要。

以上是关于AWS S3 禁用 SSLv3 支持的主要内容,如果未能解决你的问题,请参考以下文章

Spring Cloud AWS 是不是支持使用 Amazon S3 Buckets 大于 256 的 Amazon SNS 消息负载?

如何为 NSURLconnection 或 NSURLSession 禁用 sslv3

ceph储存的S3接口实现(支持断点续传)

AWS S3 使用啥端口?

S3 Transfer Manager 示例显示错误:不支持未经身份验证的访问

如何在 Xampp 安装的 Windows 上禁用 Apache 中的 SSLv3