Question Est-il possible d'envoyer un email via le service amazon ses smtp avec un compte de rôle iam?


J'ai un rôle IAM associé à la stratégie suivante:

{
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "*",
      "Resource": "*"
    }
  ]
}

Comme vous pouvez le constater, l'accès complet est accordé.

J'utilise le python suivant pour obtenir la conversion des informations d'identification IAM en informations d'identification SMTP:

#!/usr/bin/env python

from __future__ import print_function

import base64
import hashlib
import hmac
import json
import struct
import urllib2

METADATA_BASE = 'http://169.254.169.254/2012-01-12/meta-data'


def main():
    access_key_id, secret_access_key = get_access_creds()
    username, password = get_smtp_creds(access_key_id, secret_access_key)

    print('SMTP Username: %s' % username)
    print('SMTP Password: %s' % password)


def get_access_creds():
    url_handle = urllib2.urlopen('%s/iam/security-credentials' %
                                 (METADATA_BASE,))
    role_name = url_handle.read()
    url_handle.close()

    url_handle = urllib2.urlopen('%s/iam/security-credentials/%s' %
                                 (METADATA_BASE, role_name))
    sec_cred_doc = url_handle.read()
    url_handle.close()

    sec_cred_data = json.loads(sec_cred_doc)
    access_key_id =  buffer(sec_cred_data['AccessKeyId'])
    secret_access_key = buffer(sec_cred_data['SecretAccessKey'])

    return access_key_id, secret_access_key


def get_smtp_creds(access_key_id, secret_access_key):
    message = 'SendRawEmail'
    version = 0x02

    sig= hmac.new(
        secret_access_key,
        msg=message,
        digestmod=hashlib.sha256)
    sig_bytes = sig.digest()
    sig_and_version_bytes = (struct.pack('B', version) + sig_bytes)
    smtp_password = base64.b64encode(sig_and_version_bytes)

    return access_key_id, smtp_password

if __name__ == '__main__':
    main()

Lorsque j'exécute ce code, certains nom d'utilisateur et mot de passe SMTP sont générés. Lorsque j'essaie d'envoyer un message à ceux qui ont un mot à dire, par exemple, cela échoue. Voici un exemple de ligne de commande:

swaks -s email-smtp.us-east-1.amazonaws.com --from wt@example.com --to wt@example.com --auth-user <smtp username from script above> --auth-password <smtp password from script above> --tls

Example.com est, bien sûr, un espace réservé. Le domaine réel a été vérifié sur mon compte AWS SES.

En fait, si j'exécute le même code pour convertir un utilisateur IAM au lieu de découvrir les informations d'identification du rôle à partir des méta-données, je peux utiliser le nom d'utilisateur et le mot de passe pour envoyer un courrier électronique sans problème.

AFAICT, cela n'est tout simplement pas autorisé avec les informations d'identification du rôle IAM, ce qui est nul si c'est vrai. Je prévoyais de générer une configuration Postfix pour permettre aux processus de la boîte d'envoyer des messages à localhost et de les acheminer vers le service SES. J'essayais d'éviter de mettre des informations d'identification d'utilisateur IAM sur les serveurs. Cependant, il semble qu'il ne soit pas possible d'éviter cela maintenant.

Des pensées?


10
2018-03-26 23:05


origine


J'ai essayé la même chose et suis arrivé à la même conclusion. Il semble qu'il ne soit actuellement pas possible d'utiliser les informations d'identification de rôle IAM pour SES SMTP. - Christian


Réponses:


Vous pouvez utiliser ce projet pour envoyer SMTP sans informations d'identification à l'aide du rôle IAM. https://github.com/loopingz/aws-smtp-relay


2
2018-03-09 22:47





Vous pouvez essayer de donner à votre utilisateur l'autorisation suivante. Cela semble redondant puisque vous avez déjà utilisé des caractères génériques, mais la stratégie suivante fonctionne ici (également avec postfix) et est générée par AWS.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "ses:SendRawEmail",
      "Resource": "*"
    }
  ]
}

1
2017-08-11 13:22





Pourquoi ne commencez-vous pas par le plus simple?

{
    "Version": "2012-10-17",
    "Statement":[{
       "Effect": "Allow",
       "Action": ["ses:*"],
       "Resource":"*"
       }
    ]
 }

-1
2017-12-30 13:27