Укажите AWS учетные данные в Docker изображении - PullRequest
0 голосов
/ 21 февраля 2020

Я использую Amazon S3 в приложении Flask Python, однако я не хочу жестко кодировать ключи доступа, поскольку у Amazon возникают проблемы с публичным доступом к ключам. Есть ли способ получить ключи в приложении, не выставляя их. Я видел предложение об использовании переменных среды и другое о ролях пользователей IAM, но документация не помогает.

Редактировать: я забыл упомянуть, что развертываю это приложение на Docker и хочу разрешить его так что если другой пользователь извлечет изображение из docker, мои ключи доступа не будут скомпрометированы. Я не использую AWS EC2

Ответы [ 2 ]

0 голосов
/ 21 февраля 2020

SDK Python AWS просматривает несколько возможных местоположений для учетных данных. Наиболее подходящими здесь были бы переменные среды :

Boto3 проверит эти переменные среды на наличие учетных данных:

AWS_ACCESS_KEY_ID
Ключ доступа для вашего AWS account.

AWS_SECRET_ACCESS_KEY
Секретный ключ для вашей AWS учетной записи.

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

0 голосов
/ 21 февраля 2020

Может помочь следующее:

  • Роли IAM (Если ваше приложение уже работает в AWS, роли экземпляра могут помочь вам получить временные токены для доступа к ресурсам, таким как S3. AWS CLI ИЛИ официальные SDK уже созданы с этими возможностями, и вам не нужно реализовывать какой-либо пользовательский код. Чтобы это работало, вы назначаете Роль 'X' для экземпляра EC2, а Роль 'X' должна иметь отображение политики, в котором вы определяете права доступа)

Пример политики может выглядеть примерно так:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowAccessToObjects",
            "Action": [
                "s3:PutObject",
                "s3:PutObjectAcl",
                "s3:GetObject",
                "s3:GetObjectAcl",
                "s3:GetObjectVersion",
                "s3:GetObjectVersionAcl",
                "s3:ListMultipartUploadParts"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::<Bucket_Name>/*"
            ],
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": [
                        "w.x.y.z/32"
                    ]
                }
            }
        },
        {
            "Sid": "AllowAccessToBucket",
            "Action": [
                "s3:PutObject",
                "s3:ListBucket",
                "s3:GetBucketVersioning",
                "s3:ListBucketVersions"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::<Bucket_Name>"
            ],
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": [
                        "a.b.c.d/32"
                    ]
                }
            }
        }
    ]
}

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

  • Другими вариантами может быть сохранение секретов во внешнем хранилище секретных данных, таких как Vault et c., И когда контейнер запускается, секреты могут быть извлечены и введены перед загрузкой приложения. Затем они доступны как ENVs
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...