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

Я делаю приложение на 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() для получения временного URL-адреса для загрузки материала на S3?

Ответ 1

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

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

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

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


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

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

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

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

Ответ 2

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

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

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

2 - Создайте облачный "Идентификатор доступа к исходному окну"

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

# 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)

Ответ 3

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

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

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

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

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

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

Ответ 4

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

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