AWS S3 禁用 SSLv3 支持

AWS S3 Disabling SSLv3 Support

我们收到了一封来自 AWS 的电子邮件,内容基本是 'S3 is disabling SSLv3 Support, access will be cut-off in 15 days'。然后他们列出了我们拥有的一些存储桶(一个正在生产中)'currently accepting request from clients that specify 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 链接。

这只是一个客户端(浏览器)问题还是我们需要更好地理解的问题 test/fix?

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

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

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

我认为这应该意味着这里不需要任何操作,但所有细节在 Ruby 和 OpenSSL 版本之间略有不同(更不用说 introspect/understand 这些绑定的细节),所以很难确定。 excon 确实支持一个 ssl_version 参数,如果它最终成为一个问题,它可以用来强制一个特定的版本(这不是一个好的一般选择,因为它不允许协商并且细节在 ruby 版本)。

希望对您有所帮助。

截止日期已更改:

Based on the feedback received we are extending the deadline for discontinuing support of SSLv3 for securing connections to S3 buckets to 12:00 AM PDT May 20, 2015.

2015 年 5 月 7 日更新,11:26 AM IST[​​=55=]

在carrierwave initializer中,如下所示,

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

IST 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 点更新

更新主机文件后,以下是 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 请求捕获。如图所示,在初始握手时,Amazon 服务器使用 SSLv3,因此我的 rails 服务器使用 SSLv3 发送所有未来请求。

现在的问题是,如何更改存储桶设置,以便 accept/initiate 进程仅使用 TLS?我已经检查了亚马逊设置,没有类似的东西。

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

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

任何帮助都会很棒。

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

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 中配置上述内容,将 <bucket name> 替换为您的存储桶名称。

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

创建一个 "standard US bucket" 并用它来测试。请记住将您的应用配置为使用 s3 区域 external-1

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

我能够在我的 fog 配置中使用以下设置强制 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,您将收到错误消息。祝你好运!