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

10

J'ai un rôle IAM avec la stratégie suivante attachée:

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

Comme vous pouvez le voir, un 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. Par exemple, lorsque j'essaie d'envoyer un message à ceux qui ont des swaks, cela échoue. Voici un exemple de ligne de commande:

swaks -s email-smtp.us-east-1.amazonaws.com --from [email protected] --to [email protected] --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 vrai domaine a été vérifié sur mon compte AWS SES.

En fait, si j'exécute le même code pour convertir à partir d'un utilisateur IAM au lieu de découvrir les informations d'identification de rôle à partir des métadonnées, je peux très bien utiliser le nom d'utilisateur et le mot de passe pour envoyer des e-mails.

AFAICT, cela n'est tout simplement pas autorisé avec les informations d'identification de rôle IAM, ce qui est boiteux si c'est vrai. J'avais l'intention de générer une configuration Postfix pour autoriser les processus de la boîte à envoyer des messages à localhost et à les acheminer vers le service SES. J'essayais d'éviter de mettre les informations d'identification utilisateur IAM sur les serveurs. Cependant, il semble qu'il n'y ait peut-être pas de moyen d'éviter cela maintenant.

Des pensées?

Wren T.
la source
1
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:

1

Vous pouvez essayer d'accorder à 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": "*"
    }
  ]
}
Skiaddict
la source
-1

Pourquoi ne commencez-vous pas par le plus simple?

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