使使用Boto2的旧系统与AWS S3签名版本4兼容


TL; DR

1
2
3
4
5
6
7
$ . your-venv/bin/activate
$ pip install -U boto
$ sudo cat > /etc/boto.cfg <<'^Z'
[s3]
use-sigv4 = True
host = s3.ap-northeast-1.amazonaws.com
^Z

介绍

很快,AWS S3签名版本2将于2019年6月24日弃用,影响当前使用签名版本2访问S3的系统。

[添加]来自AWS的公告,时间表和目标已更改,因此仅对于2020/6/24之后新创建的存储桶才需要签名版本4。仍建议使用签名版本4进行访问。

我从前任继承的系统也使用了旧的Boto2库(Python 2.7),并且未更新,因此,我当然使用的是签名版本2。

我不知道如何重新部署该系统(或者,有证据表明,该系统在部署后已在服务器上被篡改),因此我希望在仍能正常工作的情况下支持签名的版本4。

由于某种原因,即使我用Google搜索,使Boto2与签名版本4兼容的信息也不会显示太多,所以我在这里写下了。

Boto2和Boto3

本文介绍的方法适用于Boto2。请注意,这不适用于Boto3。

确保您使用的是签名版本2

为确保该系统实际使用签名版本2," [对于使用Amazon S3的每个人都可以安心到达2019/06/24]使用CloudTrail和Athena如何检查那里的S3签名版本| " DevelopersIO"用于使用签名版本2检测S3访问。

您可以通过查询以上文章结尾的Athena下载CSV。您可以使用此CSV(巨大)作为data.csv轻松标识实例,如下所示。

1
2
$ tail -n +2 data.csv | sort -t, -k1r,1 | sort -sut, -k6,6 -k5,5 > data.uniq.csv
$ tail -n +2 data.csv | sort -t, -k1r,1 | sort -st, -k6,6 -k5,5 > data.sorted.csv

data.uniq.csv仅提取相同访问权限的最新访问(S3存储桶名称,实例的IP地址)。 data.sorted.csv按时间顺序排序相同。 data.uniq.csv很小且易于阅读。如果要查看更多详细信息,请参阅data.sorted.csv(例如,如果您除了存储桶名称之外还想查看密钥)。

通过这种方法,可以确定使用签名版本2确实访问了要修改的系统实例的IP,并且用户代理为[Boto/2.25.0 Python/2.7.4 Linux/3.4.73-64.112.amzn1.x86_64]。您可以看到使用了Boto2 2.25.0。

了解如何解决

"从签名版本2迁移到签名版本4"中描述了如何修复每种类型的AWS开发工具包。根据此:

<表格>

SDK

升级

需要更改代码


<身体>

Boto2

升级到Boto2 v2.49.0




嗯,"需要更改代码"是一个问题...

此外,如果您查看"在请求身份验证中指定签名版本":

boto在默认配置文件中指定以下内容。

1
[s3] use-sigv4 = True

。似乎更改代码仅需要更改配置文件,但是此boto默认配置文件在哪里?而且,这种奇怪的格式是

1
2
[s3]
use-sigv4 = True

吗?

Boto2配置文件

Boto2配置文件在" Boto Config — boto v2.49.0"中进行了描述。看来您可以在/etc/boto.cfg或?/ .boto中编写它。

另外,格式为ini格式,并且似乎在[s3]之后需要换行。

矫正工作

现在我们已经掌握了所有材料,让我们对其进行修复。这次要修复的系统正在cron上运行,因此请先将其停止。它可以使用virtualenv正常工作(很好...),因此请在virtualenv中升级boto。

1
2
3
4
5
6
7
8
9
$ cp -a your-venv your-venv-backup  # ← 非常時ロールバック用
$ . your-venv/bin/activate
$ pip install -U boto
$ pip show boto
---
Name: boto
Version: 2.49.0
Location: /home/user/your-venv/lib/python2.7/site-packages
Requires:

Boto2对旧系统友好,因为它没有依赖性,可以在不涉及其他软件包的情况下进行升级。

接下来,更改Boto2配置文件。这次似乎没有现有的配置文件,因此我将创建一个新的配置文件。

1
2
3
4
$ sudo cat > /etc/boto.cfg <<'^Z'
[s3]
use-sigv4 = True
^Z

好吧,当我运行测试时...我根本无法访问S3! !! !! ...我有麻烦了。

进一步修复

我无法轻易找到原因,但是我发现了这些东西:python-使用boto来签名V4的AWS S3存储桶-堆栈溢出

本文指出,API终结点必须是s3.eu-central-1.amazonaws.com的逐区域终结点,而不是s3.amazonaws.com。嗯,这可以写在boto.cfg吗?

首先查看东京区域中的S3 API端点:根据Amazon Web Services的AWS区域和端点-s3.ap-northeast-1.amazonaws.com。所以...

1
2
3
4
5
$ sudo cat > /etc/boto.cfg <<'^Z'
[s3]
use-sigv4 = True
host = s3.ap-northeast-1.amazonaws.com
^Z

测试运行...工作正常。恢复cron并退出。

[s3]部分中有关设置的正式文档在哪里?找不到。