2015-12-26 5 views
1

Я пишу веб-приложение в go, и я использую amazon s3 для хранения всех пользовательских файлов, включая профили и текстовые и аудиофайлы.Обслуживающий контент с S3 надежно

Однако я изо всех сил пытаюсь понять, каким будет правильный способ сделать это надежно. Я думал, что после того, как запрос пришел от пользователя, прошедшего проверку подлинности, с доступом к запрашиваемому файлу, просто используйте библиотеку aws go, чтобы извлечь файл и записать его в http-запрос.

Что-то вроде этого:

import (
    "github.com/aws/aws-sdk-go/aws" 
    "github.com/aws/aws-sdk-go/aws/session" 
    "github.com/aws/aws-sdk-go/service/s3" 
    "io" 
) 

func serveFile(file string, w http.ResponseWriter) { 
    svc := s3.New(session.New(), aws.NewConfig().WithRegion(config.AWS.Region)) 

    params := &s3.GetObjectInput{ 
    Bucket: aws.String("Bucket name"), 
    Key: aws.String(file), 
    } 

    resp, err := svc.GetObject(params) 
    n, err := io.Copy(w, resp.Body) 

} 

У меня нет большого опыта работы с АМС, так что я не уверен, что это даже хороший подход, но это работает. Это хороший способ сделать это для производственного сервера? Есть ли лучший, более надежный способ?

ответ

6

Этот метод может работать. Но он зависит от проксирования запросов через вашего клиента.

Рекомендованный способ - использовать подписанные URL-адреса. Это создает URL-адрес, который действителен в течение указанного периода времени, который позволяет конечному пользователю загружать файл непосредственно с S3.

Ваш ключ не отображается, поскольку URL содержит только подпись.

+0

Но не разрешало бы, чтобы контент был загружен не прошедшими проверку пользователями, если URL-адрес был скомпрометирован, даже если он предназначен только для небольшой период времени? – Topo

+0

Да, это возможно. Если вы придерживаетесь SSL, вы значительно ограничите риск. В любом случае, человек в середине атаки. – datasage

+0

И каковы недостатки проксирования запросов через мой веб-сервис? Помимо очевидного использования большего количества ресурсов на сервере. – Topo

0

Это хорошее решение для следующих причин:

  • Тот факт, что вы используете S3 является прозрачным для клиента. Другими словами, клиенту не нужно или должно знать, что вы используете S3 в бэкэнд, если нет веских оснований для этого.

  • Завтра, если вы хотите переместить данные из S3 в другое хранилище данных, вам нужно только изменить код сервера. Клиенту не нужно обновлять.

  • Учетные данные AWS не подвергаются действию клиента, следовательно, большей безопасности.

+0

1) Есть несколько вариантов хранения, таких как доступный, масштабируемый и производительный, как S3 2) Достаточно легко переключить серверы, все подписанные коды URL-адресов говорят клиенту, откуда взять ресурс. Не имеет значения, если его на S3 или на каком-либо другом сервере хранения 3) Учетные данные AWS никогда не подвергаются воздействию клиента. Сервер захватывает подписанный URL-адрес, действительный только на определенное время (по умолчанию 15 минут). Если вы используете роли IAM для своего сервера, вам даже не нужно помещать свои учетные данные на ваш сервер, что еще больше снижает риск утечки учетных данных. – bernays

Смежные вопросы