问题标题很宽泛,但我的问题不是。我只想澄清我的做法。我有一个s3桶,它有被封锁的公共访问权限。桶策略被设置为http-referer。这就是它的样子。
{
"Version": "2008-10-17",
"Id": "http referer policy example",
"Statement": [
{
"Sid": "Allow get requests referred by www.mysite.com and mysite.com",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::storage/*",
"Condition": {
"StringLike": {
"aws:Referer": [
"https://www.example.com/*",
"https://example.com/*",
]
}
}
}
]
}如果我的前端(在我的tld上)试图通过s3访问s3资源,我仍然会收到一个错误。(URL示例- https://storage.s3.amazonaws.com/path/to/my/file.png)。
我放弃了直接访问s3 URL的方法,并决定在我的TLD上构建一个后端实用程序,该工具将获取有关的s3资源并将其发送回前端。所以URL看起来是这样的,https://<tld>/fetch-s3-resource/path/to/file.png。
我想知道这种方法是正确的还是有更好的方法。在我看来,即使是设置http-referer策略也没有意义,因为任何人都可以在手动设置为我的TLD的情况下调用我的桶。
UPDATE -我发现有签名的应该允许用户通过URL公开访问资源。这应该解决了我的问题,但我仍然将公共访问设置为"off“,我不知道切换哪个开关,以便允许具有签名urls的用户能够访问资源。
以下是s3签名URL的示例。这是指向医生的链接
import logging
import boto3
from botocore.exceptions import ClientError
def create_presigned_url(bucket_name, object_name, expiration=3600):
"""Generate a presigned URL to share an S3 object
:param bucket_name: string
:param object_name: string
:param expiration: Time in seconds for the presigned URL to remain valid
:return: Presigned URL as string. If error, returns None.
"""
# Generate a presigned URL for the S3 object
s3_client = boto3.client('s3')
try:
response = s3_client.generate_presigned_url('get_object',
Params={'Bucket': bucket_name,
'Key': object_name},
ExpiresIn=expiration)
except ClientError as e:
logging.error(e)
return None
# The response contains the presigned URL
return response更新更新--由于这个问题还不够清楚,而且我似乎对我的“松散”语言采取了一些轻率的态度,让我澄清一些事情。
我到底想做什么?我希望保持我的s3桶的安全的方式,只有用户与预先签名的URL生成的“我”可以访问任何资源在那里。当我问“我的方法”是否更好或者有没有其他方法时,我的意思是什么?我想知道是否有“本机”/ aws提供的访问桶的方式,而不必编写后端端点来获取资源并将其抛回前端。3-如何衡量一种方法与另一种方法?我认为这个很明显,如果您的框架*提供了身份验证流,那么您不需要从头开始编写身份验证流。这个逻辑也适用于这里,如果有一种方法可以访问AWS列出的对象,那么我可能不应该编写自己的"hack“
发布于 2021-10-07 20:26:29
预先签名的URL进来了。您可以阻止所有的公共访问,并且仍然能够生成签名的URL并将其服务于前端。我已经将正式文档链接到我的问题中,这是我最后得到的最后一段代码。
def create_presigned_url(bucket_name, bucket_key, expiration=3600, signature_version='s3v4'):
"""Generate a presigned URL for the S3 object
:param bucket_name: string
:param bucket_key: string
:param expiration: Time in seconds for the presigned URL to remain valid
:param signature_version: string
:return: Presigned URL as string. If error, returns None.
"""
s3_client = boto3.client('s3',
aws_access_key_id=settings.AWS_ACCESS_KEY_ID,
aws_secret_access_key=settings.AWS_SECRET_ACCESS_KEY,
config=Config(signature_version=signature_version),
region_name='us-east-1'
)
try:
response = s3_client.generate_presigned_url('get_object',
Params={'Bucket': bucket_name,
'Key': bucket_key},
ExpiresIn=expiration)
except ClientError as e:
logging.error(e)
return None
# The response contains the pre-signed URL
return responsehttps://stackoverflow.com/questions/69485140
复制相似问题