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 wt@example.com --to wt@example.com --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?