Как я могу защитить свой идентификатор доступа AWS и секретный ключ в моем приложении python - PullRequest
10 голосов
/ 29 марта 2012

Я делаю приложение на Python и использую Amazon Web Services в некоторых модулях.

Сейчас я жестко программирую свой идентификатор доступа AWS и секретный ключ в * .py файле.Или может в будущем переместить их в файл конфигурации.

Но есть проблема, как я могу защитить информацию AWS от других людей?Как я знаю, Python - это язык, который легко декомпилировать.

Есть ли способ сделать это?


Хорошо, что я делаю, это приложение, которое помогает пользователям загружать / скачивать вещи из облака.Я использую Amazon S3 в качестве облачного хранилища.Как я знаю, Dropbox также использует S3, поэтому мне интересно, как они защищают ключ.


После дневного исследования я кое-что нашел.Сейчас я использую boto (библиотека AWS для python).Я могу использовать функцию 'generate_url (X)', чтобы получить URL-адрес для доступа приложения к объекту в S3.Срок действия URL истечет через X секунд.Поэтому я могу создать веб-сервис для своих приложений, чтобы предоставить им URL.Ключи AWS будут установлены не в приложении, а в веб-сервисе.

Звучит великолепно, но пока я могу загружать только объекты с помощью этой функции, загрузка не работает.Кто-нибудь знает, как использовать его для загрузки?


Кто-нибудь здесь знает, как использовать key.generate_url () из boto, чтобы получить временный URL для загрузки материалов в S3?

Ответы [ 4 ]

9 голосов
/ 29 марта 2012

Нет способа защитить ваши ключи, если вы собираетесь распространять свой код.Они будут доступны всем, у кого есть доступ к вашему серверу или исходному коду.

Есть две вещи, которые вы можете сделать, чтобы защитить себя от злонамеренного использования ваших ключей.

  1. Используйте сервис Amazon IAM для создания набора ключей, который имеет разрешение только на выполнение задач, которые требуются для вашего сценария.http://aws.amazon.com/iam/

  2. Если у вас есть мобильное приложение или другое приложение, для которого требуются учетные записи пользователей, вы можете создать службу для создания временных токенов для каждого пользователя.Пользователь должен иметь действительный токен и ваши ключи для выполнения каких-либо действий.Если вы хотите запретить пользователю использовать ваши ключи, вы можете прекратить генерировать для них новые токены.http://awsdocs.s3.amazonaws.com/STS/latest/sts-api.pdf


Специально для S3, если вы создаете приложение, позволяющее людям загружать контент.Единственный способ защитить вашу учетную запись и информацию других пользователей - это заставить их зарегистрировать учетную запись у вас.

  1. Первым шагом приложения будет аутентификация на вашем сервере.
  2. Как только ваш сервер аутентифицируется, вы отправляете запрос на сервер токенов amazons и возвращаете токен
  3. Затем ваше приложение отправляет запрос, используя ключи, встроенные в exe и токен.
  4. На основании разрешений, примененных к этому пользователю, он может загружать только в назначенное ему хранилище.

Если это кажется довольно сложным, то, вероятно, вы не готовы к разработкеприложение, которое поможет пользователям загружать данные в S3.У вас будут серьезные проблемы с безопасностью, если вы распространите только 1 ключ, даже если вы сможете скрыть этот ключ от пользователя, он сможет редактировать любые данные, добавленные любым пользователем.

Единственный способ обойти это - заставить каждого пользователя создать свою учетную запись AWS, а ваше приложение поможет им загрузить файлы в свою учетную запись S3.В этом случае вам не нужно беспокоиться о защите ключей, потому что пользователь будет нести ответственность за добавление своих ключей после установки приложения.

1 голос
/ 02 апреля 2014

Вы правы, вы не можете загружать, используя предварительно подписанные URL-адреса.

Существует другая, более сложная возможность, которую вы можете использовать, которая называется GetFederationToken .Это вернет вам некоторые временные учетные данные, к которым вы можете применить любую политику (разрешения), которая вам нравится.

Так, например, вы можете написать веб-сервис POST /upload, который создает новую папку в S3, затемсоздает временные учетные данные с разрешениями для PutObject для только этой папки и возвращает путь к папке и учетные данные вызывающей стороне.Предположительно, этим методом также будет выполняться некоторая проверка авторизации.

Вы не можете встраивать облачные учетные данные или любые другие учетные данные в код приложения.Это не означает, что никто никогда не делает это случайно, даже специалисты по безопасности .

Чтобы безопасно распространять учетные данные в своей инфраструктуре, вам нужна поддержка инструментов.Если вы используете сервис AWS, такой как CloudFormation, вы можете (несколько больше) безопасно предоставить ему свои учетные данные.CloudFormation также может создавать новые учетные данные на лету.Если вы используете PaaS, такой как Heroku, вы можете загрузить в него свои учетные данные, и Heroku, вероятно, будет относиться к ним осторожно.Другим вариантом для AWS является роль IAM.Вы можете создать роль IAM с разрешением делать то, что вам нужно, а затем «передать» эту роль вашему экземпляру EC2.Он сможет выполнять действия, разрешенные ролью.

Последний вариант - это специальная служба управления секретами, например, Conjur .(Отказ от ответственности: я основатель компании).Вы загружаете свои учетные данные и другие секреты в выделенное виртуальное устройство и определяете права доступа, которые управляют изменением и распространением учетных данных.Эти разрешения могут быть предоставлены людям или «роботам», таким как ваш ящик EC2.Учетные данные могут быть получены с помощью REST или клиентских API, и каждое взаимодействие с учетными данными записывается в постоянную запись.

1 голос
/ 30 марта 2012

Я пытался ответить на тот же вопрос ... generate_url (x) выглядит довольно многообещающе.

Эта ссылка содержала предложение о создании идентификатора доступа к источнику облака.я полагаю, что это касается аутентификации IAM ... это означает, что вы можете создать ключ для каждого приложения, не раскрывая данные своей основной учетной записи.С IAM вы можете устанавливать разрешения на основе ключей относительно того, что они могут делать, поэтому они могут иметь ограниченный доступ.

Примечание: Я не знаю, действительно ли это работает, я еще не пробовал, но это может быть другой путь для изучения.

2 - Создайте Cloudfront "Origin Access Identity"

Эта идентификация может бытьповторно используется для многих различных дистрибутивов и пар ключей.Он используется только для того, чтобы разрешить облачному фронту доступ к вашим личным объектам S3, не позволяя никому.На данный момент этот шаг может быть выполнен только с использованием API.Бото код здесь:

# Create a new Origin Access Identity
oai = cf.create_origin_access_identity(comment='New identity for secure videos')

print("Origin Access Identity ID: %s" % oai.id)
print("Origin Access Identity S3CanonicalUserId: %s" % oai.s3_user_id)
0 голосов
/ 29 марта 2012

Не помещайте это в приложения, которые вы планируете распространять.Он будет виден, и они могут запускать экземпляры, которые являются непосредственно платными для вас или наихудшими. Они могут снимать экземпляры, если вы используете их в работе.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...