我想使用私有S3存储桶在heroku上为我的烧瓶应用程序提供静态文件(特别是图像)。
我使用boto3创建了一个预签名的url,其中包含具有权限的IAM用户的访问密钥ID和秘密密钥。我使用该网址作为html文件中img的src。
我查看了它生成的url,它显示了该IAM用户的存储桶名称和访问密钥ID。这是安全问题吗?
在AWS上显示为“与用户名和密码一样安全地管理访问密钥”。有没有更好的方法来保护访问密钥ID? (如果需要保护),我已经看到一些公开显示这些网站的网站,并且我主要关注的是AWS的示例,但我只是想确定一下。
数据存储在环境变量中。
import os
import boto3
from flask import Flask, render_template
SECRET_KEY = os.environ["AWS_SECRET_ACCESS_KEY"]
ACCESS_ID = os.environ["AWS_ACCESS_KEY_ID"]
bucket = os.environ["AWS_STORAGE_BUCKET_NAME"]
key = "default_banner"
s3 = boto3.client("s3", aws_secret_access_key=SECRET_KEY, aws_access_key_id=ACCESS_ID)
app = Flask(__name__)
@app.route("/")
def index():
context = {"s3": s3, "bucket": bucket, "key": key}
return render_template("index.html", **context)
if __name__ == "__main__":
app.run()
这是渲染模板的导入部分:templates/index.html
...
<img src="{{ s3.generate_presigned_url('get_object', Params={'Bucket': bucket, 'Key': key}) }}" alt="...">
...
当我检查页面上的图像以查看jinja2将其转换为什么图像时,我会看到类似的图像
...
<img src="https://bucket-name.s3.amazonaws.com/default_banner?AWSAccessKeyId=AKIAIDEXAMPLE4AWSID&Signature=h67g7v6aC65aca7YPHcQVbXgt8M%3D&Expires=1566073856" alt="...">
...
答案 0 :(得分:3)
“与使用用户名和密码一样安全地管理访问密钥。”
您的用户名通常不是秘密,AWS Access Key ID也是如此。
敏感值是访问密钥机密。这两个值在没有其他值的情况下是没有用的,但是该模型旨在将ID(以AKIA
开头的值)视为两者的非敏感值。可以在签名的URL中公开这些内容。
签名也不敏感,因为从嵌入在签名的URL中的信息中重建秘密密钥在计算上是不可行的...但是签名也没有包含足够的信息以使服务能够确定谁试图授权请求...这就是为什么访问密钥ID包含在已签名的URL中的原因。
实际上,准确地说,签名根本不包含任何信息。该服务在内部从提供的访问密钥ID中查找您的秘密密钥,并使用您的凭据重新生成相同的签名URL。如果得到的答案与URL签名中提供的答案相同,则该请求有效,否则,该请求将被拒绝。