¿Es posible enviar correos electrónicos a través del servicio amazon ses smtp con una cuenta de rol iam?

10

Tengo un rol de IAM con la siguiente política adjunta:

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

Como puede ver, se otorga acceso completo.

Utilizo el siguiente python para convertir las credenciales de IAM a 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()

Cuando ejecuto este código, se muestran algunos nombres de usuario y contraseñas SMTP. Cuando trato de enviar un mensaje con aquellos que dicen swaks, por ejemplo, falla. Aquí hay una línea de comando de ejemplo:

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 es, por supuesto, un marcador de posición. El dominio real se ha verificado en mi cuenta de AWS SES.

De hecho, si ejecuto el mismo código para convertir de un usuario de IAM en lugar de descubrir las credenciales de rol de los metadatos, puedo usar el nombre de usuario y la contraseña para enviar un correo electrónico perfectamente.

AFAICT, esto simplemente no está permitido con las credenciales de rol de IAM, lo cual es lamentable si es cierto. Estaba planeando generar una configuración de Postfix para permitir que los procesos en la caja envíen correo a localhost y lo envíen al servicio SES. Estaba tratando de evitar poner credenciales de usuario de IAM en los servidores. Sin embargo, parece que no puede haber una manera de evitar eso ahora.

¿Alguna idea?

Wren T.
fuente
1
He intentado lo mismo y llego a la misma conclusión. Parece que actualmente no es posible usar las credenciales de rol de IAM para SES SMTP.
Christian

Respuestas:

1

Puede intentar darle a su usuario el siguiente permiso. Parece redundante ya que ya ha utilizado comodines, pero la siguiente política funciona aquí (también con postfix) y es generada por AWS.

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

¿Por qué no comienzas con el más simple?

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