首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >访问s3资源最安全的方法是什么?

访问s3资源最安全的方法是什么?
EN

Stack Overflow用户
提问于 2021-10-07 17:01:09
回答 1查看 81关注 0票数 0

问题标题很宽泛,但我的问题不是。我只想澄清我的做法。我有一个s3桶,它有被封锁的公共访问权限。桶策略被设置为http-referer。这就是它的样子。

代码语言:javascript
复制
{
    "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的示例。这是指向医生的链接

代码语言:javascript
复制
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“

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-10-07 20:26:29

预先签名的URL进来了。您可以阻止所有的公共访问,并且仍然能够生成签名的URL并将其服务于前端。我已经将正式文档链接到我的问题中,这是我最后得到的最后一段代码。

代码语言:javascript
复制
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 response
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69485140

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档